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

19

Мне нравится использовать Emacs & apos; режим оболочки, но у него есть несколько недостатков. Одним из них является то, что он недостаточно умен, чтобы открывать новый буфер, когда команда оболочки пытается вызвать редактор. Например, с переменной среды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   ответов
0

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

3

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

19

Вы можете присоединиться к сеансу Emacs черезemacsclient, Во-первых, запустите сервер Emacs с

M-x server-start

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

export VISUAL=emacsclient

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

Замечания:

The versions of emacs and emacsclient must agree. If you have multiple versions of Emacs installed, make sure you invoke the version of emacsclient corresponding to the version of Emacs running the server. If you start the server in multiple Emacs processes/frames (e.g., because (server-start) is in your .emacs), the buffer will be created in the last frame to start the server.
export EDITOR="emacsclient --alternate-editor=emacs --no-wait +%l %f" Стоит упомянуть.
$ svn propedit svn: игнорировать. Ожидание Emacs ... -error Неизвестно & amp; _command: & amp; _ABSPATH / TO / REPO / svn & amp; -prop.tmp Нет изменений в свойстве & lt; svn: ignore & apos; на "." Chris Conway
К сожалению. У меня есть / etc / alternatives, указывающая на разные версии для emacs и emacsclient. Обновление альтернативы для emacsclient исправило вышеуказанное. Chris Conway
0

я использую этот скрипт для вызова 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

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

Darwin Kernel Version 10.8.0: Tue Jun 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

Mercurial. Благодаря постерам здесь я нашел способ. два шага:

add: (start-server) in your .emacs file (remember to load-file after your change)

in your hgrc:

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

Похожие вопросы