Откройте буфер Emacs, когда команда пытается открыть редактор в режиме оболочки

Мне нравится использовать режим оболочки Emacs, но у него есть несколько недостатков. Один из них заключается в том, что недостаточно разумно открыть новый буфер, когда команда оболочки пытается вызвать редактор. Например, с переменной среды VISUAL установленной в vim я получаю следующее из svn propedit :

 $ svn propedit svn: внешние. 
 «svn-prop.tmp» 2L, 149C [1; 1Н
 ~ [4; 1H ~ [5; 1H ~ [6; 1H ~ [7; 1H ~            
 ...

(Трудно сказать из представления, но это ужасный, уродливый беспорядок.)

Когда VISUAL настроен на "emacs -nw" , я получаю

 $ svn propedit svn: внешние.
 emacs: Тип терминала «немой» недостаточно эффективен для запуска Emacs.
 У него нет возможности позиционировать курсор.
 Если это не тот тип терминала, который у вас есть,
 используйте команду оболочки Bourne `TERM = ... export TERM '(C-shell:
 `setenv TERM ... '), чтобы указать правильный тип.  Это может быть необходимо
 сделать `unset TERMINFO '(C-shell:` unsetenv TERMINFO'), а также. svn: system ('emacs -nw svn-prop.tmp') возвращено 256

(Он работает с набором VISUAL только для emacs , но только изнутри windows Emacs X, а не внутри сеанса терминала).

Есть ли способ получить режим оболочки для правильной работы здесь и открыть новый буфер от имени процесса командной строки?

Вы можете подключиться к сеансу Emacs через emacsclient . Сначала запустите сервер emacs с помощью

 Mx server-start 

или добавить (server-start) в ваш .emacs . Затем,

 export VISUAL=emacsclient 

Отправляйся.

Заметка:

  • Версии emacs и emacsclient должны совпадать. Если у вас несколько версий Emacs, убедитесь, что вы вызываете версию emacsclient соответствующую версии Emacs, на которой запущен сервер.
  • Если вы запустите сервер в нескольких процессах / кадрах Emacs (например, потому что (server-start) находится в вашем .emacs ), буфер будет создан в последнем кадре, чтобы запустить сервер.

Там emacsclient, gnuserv и в Emacs 23, multi-tty, которые полезны для этого. На самом деле я думаю, что в Emacs 23 emacsclient обладает всеми интересными функциями gnuserv.

Не совсем верно. ansi-term может запускать emacs fine (хотя я обычно запускаю mg для журналов фиксации, в редком случае я не совершаю emacs напрямую). eshell также может запускать emacs, если вы сначала запустите screen и запустите его изнутри.

Наряду с использованием emacs client / server, я использую этот скрипт для вызова emacs.

Это запустит emacs, если он еще не запущен, или просто откройте новый emacs-буфер в запущенных emacs (используя gnuclient). Он работает в фоновом режиме по умолчанию, но может быть запущен на переднем плане для процессов, ожидающих ввода. Например, я использую это как свой редактор управления версиями при вводе описания списка изменений. У меня есть «SVN_EDITOR = emacs sync», поэтому я могу сделать «svn commit» в оболочке emacs, и он откроет редактор svn в новом Emacs-буфере в тех же emacs. Когда я закрываю буфер, «svn commit» продолжается. Довольно полезно.

 #! / Bin / ш

 если [-z $ EMACS_CMD];  тогда
   EMACS_CMD = "/ USR / бен / Emacs"
 фи

 если [-z $ GNUCLIENT_CMD];  тогда
   GNUCLIENT_CMD = "/ USR / бен / gnuclient"
 фи

 если ["$ 1" = "sync"];  тогда
     сдвиг 1
     синхронизация = истина
 еще
     синхронизация = ложь
 фи

 cmd = "$ {EMACS_CMD} $ *"
 lsof $ EMACS_CMD |  grep $ USER> / dev / null 2> & 1
 если ["$?"  -ne "1"];  тогда
     cmd = "$ {GNUCLIENT_CMD} $ *"
 фи

 if [$ sync = "true"];  тогда
     $ CMD
 еще
     $ cmd &
 фи

Я хотел сделать что-то подобное для слияния в оболочке emacs через mercurial. Благодаря плакатам здесь я нашел способ. два этапа:

  1. добавьте: (start-server) в ваш файл .emacs (не забудьте загрузить файл после вашего изменения)

  2. в вашем hgrc:

     [Слияния-инструменты]
     emacs.executable = emacsclient
     emacs.premerge = False
     emacs.args = --eval "(ediff-merge-with-ancestor \" $ local \ "\" $ other \ "\" $ base \ "nil \" $ output \ ")"
    

Когда у меня (start-server) в моем .emacs, я получаю эту ошибку ….

 Debugger entered--Lisp error: (void-function start-server) (start-server) eval-buffer(# nil "/Users/jarrold/.emacs" nil t) ; Reading at buffer position 22768 load-with-code-conversion("/Users/jarrold/.emacs" "/Users/jarrold/.emacs" tt) load("~/.emacs" tt) #[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() 

…. Я использую GNU Emacs 22.1.1

И это версия Mac OS-X, которую я использую:

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

Darwin Kernel Версия 10.8.0: Вт 7 июн 16:33:36 PDT 2011;

root: xnu-1504.15.3 ~ 1 / RELEASE_I386 i386

Обратите внимание, что mx ansi-term, по-видимому, позволяет мне успешно выполнить hg в своей оболочке. Однако эта shell не позволяет мне прокручивать буфер, например, cp или cn, поэтому я бы предпочел нам mx shell.