Unix 当命令试图在shell模式下打开编辑器时,打开Emacs缓冲区

Unix 当命令试图在shell模式下打开编辑器时,打开Emacs缓冲区,unix,shell,emacs,Unix,Shell,Emacs,我喜欢使用Emacs的shell模式,但它有一些不足之处。其中之一是,当shell命令试图调用编辑器时,打开新缓冲区不够聪明。例如,当环境变量VISUAL设置为vim时,我从svn propedit获得以下信息: $ svn propedit svn:externals . "svn-prop.tmp" 2L, 149C[1;1H ~ [4

我喜欢使用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
,但只能在emacs X窗口内工作,不能在终端会话内工作。)


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

您可以通过
EmacClient
连接到Emacs会话。首先,使用以下命令启动emacs服务器:

M-x server-start
或者将
(服务器启动)
添加到
.emacs
。那么

export VISUAL=emacsclient
编辑掉

注:

  • emacs
    emacsclient
    的版本必须一致。如果安装了多个版本的Emacs,请确保调用与运行服务器的Emacs版本对应的
    EmacClient
  • 如果在多个Emacs进程/帧中启动服务器(例如,因为
    (服务器启动)
    .Emacs
    中),将在最后一帧中创建缓冲区以启动服务器

在Emacs 23中有EmacClient、gnuserv和multi-tty,它们都非常有用。事实上,我认为在Emacs23中,EmacClient拥有gnuserv所有有趣的功能。

不完全正确
ansi term
可以很好地运行emacs(尽管我通常运行mg来提交日志,但在极少数情况下,我不会直接从emacs提交)<如果您首先启动
屏幕,然后从其中运行它,那么code>eshell
也可以运行emacs。

除了使用emacs客户端/服务器之外,我还使用此脚本调用emacs

如果emacs尚未运行,这将启动emacs,或者只是在运行的emacs中打开一个新的emacs缓冲区(使用gnuclient)。默认情况下,它在后台运行,但对于需要某些输入的进程,它可以在前台运行。例如,在输入更改列表描述时,我将其用作源代码管理编辑器。我有“SVN_EDITOR=emacs sync”,因此我可以在emacs shell中执行“SVN commit”,它将在同一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 #!/垃圾箱/垃圾箱 如果[-z$EMACS_CMD];然后 EMACS_CMD=“/usr/bin/EMACS” fi 如果[-z$GNUCLIENT_CMD];然后 GNUCLIENT_CMD=“/usr/bin/GNUCLIENT” fi 如果[“$1”=“同步”];然后 班次1 sync=true 其他的 sync=false fi cmd=“${EMACS\u cmd}$*” lsof$EMACS_CMD | grep$USER>/dev/null 2>&1 如果[“$?”-ne“1”];然后 cmd=“${GNUCLIENT\u cmd}$*” fi 如果[$sync=“true”];然后 $cmd 其他的 $cmd& fi
我想通过mercurial在emacs shell中进行类似的合并。多亏了这里的海报,我找到了路。两个步骤:

  • 在.emacs文件中添加:(启动服务器)(记住在更改后加载文件)

  • 在您的hgrc中: [merge-tools] emacs.executable = emacsclient emacs.premerge = False emacs.args = --eval "(ediff-merge-with-ancestor \"$local\" \"$other\" \"$base\" nil \"$output\")" [合并工具] emacs.executable=emacsclient emacs.premerge=False emacs.args=--eval“(ediff与祖先\“$local\”\“$other\”\“$base\”nil\“$output\”)合并”

  • 当我的.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()
    
    调试器已输入--Lisp错误:(void函数启动服务器)
    (启动服务器)
    评估缓冲区(#nil)/Users/jarrold/.emacs“nil t);缓冲器位置22768处的读数
    使用代码转换加载(“/Users/jarrold/.emacs”“/Users/jarrold/.emacs”t)
    荷载(“~/.emacs”t)
    #[nil”^H\205\276^\306=\203^Q^\307^H\310Q\202A^\311=\2033^\312\307\313\314^\315\202A^\312\307\$
    命令行()
    正常-顶级()
    
    …我正在使用GNU Emacs 22.1.1

    这是我正在使用的Mac OS-X版本:

    shandemo 511$uname-达尔文设备YS-MacBook-Pro.local 10.8.0

    达尔文内核版本10.8.0:Tue Jun 7 16:33:36 PDT 2011

    根目录:xnu-1504.15.3~1/RELEASE_I386 I386


    请注意,m-x ansi术语似乎允许我在其外壳内成功地进行hg commit。但是,该外壳不允许我使用例如c-p或c-n滚动缓冲区,因此我更喜欢使用m-x外壳。

    $svn propedit svn:ignore.Waiting Emacs…-错误未知&&\u命令:&\u ABSPATH/to/REPO/svn&-prop.tmp属性“svn:忽略“on.”糟糕。我有/etc/alternations指向emacs和EmacClient的不同版本。更新EmacClient的替代版本修复了上述问题。
    export EDITOR=“EmacClient--alternative EDITOR=emacs--no wait+%l%f”
    值得一提。
    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()