Подтвердить что ты не робот

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

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

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

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

С VISUAL, установленным в "emacs -nw", я получаю

$ 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

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

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

4b9b3361

Ответ 1

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

M-x server-start

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

export VISUAL=emacsclient

Отредактируйте.

Примечание:

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

Ответ 2

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

Ответ 3

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

Ответ 4

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

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

#!/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

Ответ 5

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

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

  • в hgrc:

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

Ответ 6

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

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()

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

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

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

Ядро Дарвина Версия 10.8.0: Вт 7 июн 16:33:36 PDT 2011;

root: xnu-1504.15.3 ~ 1/RELEASE_I386 i386

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