2008-09-22 19 views
18

Mi piace usare la modalità shell di Emacs, ma ha alcune lacune. Uno di questi è che non è abbastanza intelligente da aprire un nuovo buffer quando un comando shell tenta di richiamare un editor. Per esempio con la variabile di ambiente VISUAL insieme a vim ricevo il seguente da svn propedit:Apre un buffer Emacs quando un comando tenta di aprire un editor in modalità shell

 
$ svn propedit svn:externals . 
"svn-prop.tmp" 2L, 149C[1;1H 
~                    [4;1H~                    [5;1H~                    [6;1H~                    [7;1H~    
... 

(Può essere difficile dire dalla rappresentazione, ma è un orribile, orribile pasticcio.)

Con VISUAL impostato "emacs -nw", ottengo

 
$ svn propedit svn:externals . 
emacs: Terminal type "dumb" is not powerful enough to run Emacs. 
It lacks the ability to position the cursor. 
If that is not the actual type of terminal you have, 
use the Bourne shell command `TERM=... export TERM' (C-shell: 
`setenv TERM ...') to specify the correct type. It may be necessary 
to do `unset TERMINFO' (C-shell: `unsetenv TERMINFO') as well.svn: system('emacs -nw svn-prop.tmp') returned 256 

(funziona con VISUAL insieme a poco emacs, ma solo da all'interno di una finestra di Emacs X, non all'interno di una sessione terminale.)

C'è un modo per ottenere la modalità shell per fare la cosa giusta qui e aprire un nuovo buffer per conto del processo della riga di comando?

risposta

19

È possibile allegare a una sessione Emacs tramite emacsclient. In primo luogo, avviare il server emacs con

M-x server-start 

o aggiungere al vostro (server-start).emacs. Quindi,

export VISUAL=emacsclient 

Modificare.

Nota:

  • Le versioni di emacs e emacsclient devono accettare. Se hai installato più versioni di Emacs, assicurati di richiamare la versione di emacsclient corrispondente alla versione di Emacs che esegue il server.
  • Se si avvia il server in più processi/frame di Emacs (ad esempio, poiché (server-start) si trova nel proprio .emacs), il buffer verrà creato nell'ultimo frame per avviare il server.
+0

$ svn propedit svn: ignore. In attesa di Emacs ... -error Sconosciuta & comando: & _ ABSPATH/TO/REPO/svn & -prop.tmp Nessuna modifica alla proprietà 'svn: ignora' on '.' –

+0

Oops. Ho/etc/alternative che puntano a versioni differenti per emacs ed emacsclient. L'aggiornamento dell'alternativa per emacsclient ha corretto quanto sopra. –

+0

'export EDITOR =" emacsclient --alternate-editor = emacs --no-wait +% l% f "' è degno di nota. – jfs

3

C'è emacsclient, gnuserv e in Emacs 23, multi-tty che sono tutti utili per questo. In realtà penso in Emacs 23, emacsclient ha tutte le funzionalità interessanti di gnuserv.

0

Non completamente vero. ansi-term può eseguire una multa emacs (anche se di solito eseguo mg per i registri di commit, nel raro caso non commetto direttamente da emacs). eshell può anche eseguire un emacs se si avvia un screen prima ed eseguito da lì.

0

Insieme all'uso di client/server emacs, sto utilizzando questo script per richiamare emacs.

Questo avvierà emacs se non è ancora in esecuzione, o semplicemente aprirà un nuovo buffer emacs in emacs in esecuzione (usando gnuclient). Viene eseguito in background per impostazione predefinita, ma può essere eseguito in primo piano per i processi che prevedono un input. Ad esempio, sto usando questo come editor di controllo del codice sorgente, quando inserisco una descrizione dell'elenco delle modifiche. Ho "SVN_EDITOR = emacs sync", quindi posso fare "svn commit" in una shell di emacs, e aprirà l'editor svn in un nuovo buffer emacs nello stesso emacs. Quando chiudo il buffer, "svn commit" continua. Abbastanza utile

 
#!/bin/sh 

if [ -z $EMACS_CMD ]; then 
    EMACS_CMD="/usr/bin/emacs" 
fi 

if [ -z $GNUCLIENT_CMD ]; then 
    GNUCLIENT_CMD="/usr/bin/gnuclient" 
fi 

if [ "$1" = "sync" ]; then 
    shift 1 
    sync=true 
else 
    sync=false 
fi 

cmd="${EMACS_CMD} $*" 
lsof $EMACS_CMD | grep $USER >/dev/null 2>&1 
if [ "$?" -ne "1" ]; then 
    cmd="${GNUCLIENT_CMD} $*" 
fi 

if [ $sync = "true" ]; then 
    $cmd 
else 
    $cmd & 
fi 

0

Volevo fare qualcosa di simile per l'unione in una shell di emacs tramite mercurial. Grazie ai poster qui, ho trovato la strada. due fasi:

  1. aggiuntivo: (start-server) in vostro .emacs (ricordarsi di caricare file dopo la modifica)

  2. nel hgrc:

     
    [merge-tools] 
    emacs.executable = emacsclient 
    emacs.premerge = False 
    emacs.args = --eval "(ediff-merge-with-ancestor \"$local\" \"$other\" \"$base\" nil \"$output\")" 
    

0

Quando ho (start-server) nei miei .emacs ottengo questo errore ....

Debugger entered--Lisp error: (void-function start-server) 
    (start-server) 
    eval-buffer(#<buffer *load*> nil "/Users/jarrold/.emacs" nil t) ; Reading at buffer position 22768 
    load-with-code-conversion("/Users/jarrold/.emacs" "/Users/jarrold/.emacs" t t) 
    load("~/.emacs" t t) 
    #[nil "^H\205\276^@ \306=\203^Q^@\307^H\310Q\202A^@ \311=\2033^@\312\307\313\314#\203#^@\315\202A^@\312\307\$ 
    command-line() 
    normal-top-level() 

.... sto usando GNU Emacs 22.1.1

e questa è la versione di Mac OS-X sto usando:

shandemo 511 $ uname -a Darwin facilitys-MacBook-Pro.local 10.8.0

Darwin Kernel Version 10.8. 0: mar 7 giu 16:33:36 PDT 2011;

root: XNU-1504.15.3 ~ 1/RELEASE_I386 i386

noti che m-x-ansi termine appare per permettermi di commettere con successo hg all'interno del suo guscio. Tuttavia, quella shell non mi consente di scorrere il buffer con ad es. c-p o c-n quindi preferirei m-x shell.

Problemi correlati