2016-07-03 2 views
0

J'ai quelques elisp qui exécute une commande 'npm' externe.Dans emacs, quelle est la meilleure façon d'exécuter un programme externe dans une autre fenêtre qui peut être fermée par une seule touche après l'exécution des sorties du programme?

(defun npm-mode-npm-run() 
    "Run the 'npm run' command on a project script." 
    (interactive) 
    (let ((command 
      (completing-read 
      "Run command: " (npm-mode--get-project-scripts)))) 
    (message "Running npm script: %s" command) 
    (switch-to-buffer npm-mode--buffer-name command) 
    (erase-buffer) 
    (ansi-term (getenv "SHELL") "npm-mode-npm-run") 
    (comint-send-string "*npm-mode-npm-run*" (format "npm run-script %s\n" command)))) 

Alors qu'il fait le travail, fin de l'exécution de l'utilisateur est laissé dans un tampon qui doit être tué, et qui nécessite une confirmation supplémentaire pour tuer le processus. Qu'est-ce que je voudrais, c'est une fois le programme se termine, je pourrais appuyer sur la touche «q» pour faire tout cela, laissant l'utilisateur dans leur tampon d'origine.

Est-ce que c'est un bon exemple de la façon de le faire pour les emacs modernes auxquels je pourrais me référer, ou tout autre document spécifique qui pourrait être utile?

Merci beaucoup d'avance! Comme le dit @jpkotta, compiler est une bonne option.

+0

Je ne suis pas familier avec npm, mais en général, j'essaierais 'compile', peut-être une version dérivée de celui-ci. Pour un exemple assez simple d'un mode de compilation dérivé, consultez https://github.com/PyCQA/pylint/blob/master/elisp/pylint.el. Aussi, voir http://stackoverflow.com/a/11059012/245173 pour enterrer automatiquement (ou tuer) un tampon de compilation qui a réussi. – jpkotta

Répondre

0

Vous pouvez enterrer le tampon facilement, envoyer un signal TERM au processus sous-jacent, etc. De plus, vous obtenez gratuitement l'analyse des erreurs (coloration de la syntaxe + la possibilité de passer à la ligne incriminée) pour de nombreuses langues.

Voici un exemple de la façon dont je l'utilise (dans ce cas, faire une course rapide de tout script que je suis l'édition):

(defun juanleon/execute-buffer() 
    (interactive) 
    (let ((compile-command nil)) 
    (compile buffer-file-name))) 

Facile à modifier pour adapter à votre code. Le let est pour éviter d'ajouter des choses à compile histoire (puisque je compile beaucoup pour la compilation régulière, et l'histoire est utile).