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

Мне нравится использовать режим оболочки 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, а не внутри терминальной сессии.)

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

Ответы [ 6 ]

20 голосов
/ 22 сентября 2008

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

M-x server-start

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

export VISUAL=emacsclient

Редактировать прочь.

Примечание:

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

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

0 голосов
/ 13 апреля 2012

Когда у меня (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 commit внутри его оболочки. Однако эта оболочка не позволяет мне прокручивать буфер, например, c-p или c-n, поэтому я бы предпочел нам m-x shell.

0 голосов
/ 20 апреля 2010

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

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

  2. в вашей hgrc:

    [merge-tools]
    emacs.executable = emacsclient
    emacs.premerge = False
    emacs.args = --eval "(ediff-merge-with-ancestor \"$local\" \"$other\" \"$base\" nil \"$output\")"
    
0 голосов
/ 13 мая 2009

Наряду с использованием клиента / сервера emacs, я использую этот скрипт для вызова 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

0 голосов
/ 13 января 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...