打开一个Emacs缓冲器时的命令试图打开在壳模的编辑(Open an Emacs buffer wh

2019-07-30 15:00发布

我喜欢用Emacs的shell模式,但它有一些不足之处。 其中之一是,当一个shell命令试图调用编辑器不是足够聪明,打开一个新的缓冲区。 例如与环境变量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窗口内,而不是一个终端会话中。)

有没有办法让shell模式在这里做正确的事,开辟一个新的缓冲区代表命令行的过程?

Answer 1:

您可以通过附加到一个Emacs会话emacsclient 。 首先,先从emacs的服务器

M-x server-start

或加入(server-start)到你.emacs 。 然后,

export VISUAL=emacsclient

编辑程。

注意:

  • 的版本emacsemacsclient必须一致。 如果你已经安装了Emacs的多个版本,请确保您调用的版本emacsclient对应运行的服务器版本的Emacs。
  • 如果你开始在多个Emacs的过程中的服务器/帧(例如,因为(server-start)在你.emacs ),缓冲区将在最后一帧创建启动服务器。


Answer 2:

有emacsclient,gnuserv,并在Emacs 23,多TTY这都对这项有益的。 其实我觉得在Emacs 23,emacsclient拥有所有的gnuserv有趣的功能。



Answer 3:

并非完全如此。 ansi-term可以运行emacs的罚款(虽然我通常运行毫克提交日志,在极少数情况下,我不从emacs的直接提交)。 eshell如果你开始还可以运行一个Emacs screen首先,从内部运行它。



Answer 4:

随着使用emacs客户端/服务器,我使用这个脚本调用emacs的。

这将如果尚未运行启动emacs或只是打开一个新的Emacs在运行的Emacs缓冲区(使用gnuclient)。 它运行在默认的背景,但可以在前台为期待一些输入过程中运行。 例如,输入更改列表说明,当我用这个作为我的源代码控制的编辑。 我有“SVN_EDITOR = emacs的同步”,所以我可以做“SVN提交”在Emacs的外壳,它会打开相同的Emacs在一个新的Emacs缓冲区中的SVN编辑器。 当我关闭了缓冲区,“SVN提交”继续。 非常有用的。

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



Answer 5:

我想做为通过水银在Emacs的外壳合并类似的东西。 由于海报在这里,我找到了办法。 两个步骤:

  1. 地址:(启动服务器)在你的.emacs文件(记得你改变后加载文件)

  2. 在你的hgrc:

      [合并工具]  emacs.executable = emacsclient  emacs.premerge =假  emacs.args = --eval “(ediff合并与 - 祖先\” $本地\ “\ ”$其他\“ \ ”$基地\“ 无\ ”$输出\“)” 



Answer 6:

当我在我的.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达尔文Facilitys-的MacBook,Pro.local 10.8.0

Darwin内核版本10.8.0:星期二06月07日16点33分36秒PDT 2011;

根:XNU-1504.15.3〜1 / RELEASE_I386 I386

需要注意的是MX ANSI长期出现,让我成功汞提交它的外壳内。 然而,外壳不会让我翻阅与如CP或CN缓冲,所以我宁愿我们MX外壳。



文章来源: Open an Emacs buffer when a command tries to open an editor in shell-mode
标签: unix shell emacs