19

我喜欢使用 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:终端类型“dumb”不足以运行 Emacs。
它缺乏定位光标的能力。
如果这不是您拥有的实际终端类型,
使用 Bourne shell 命令 `TERM=... export TERM' (C-shell:
`setenv TERM ...') 来指定正确的类型。可能有必要
做 `unset TERMINFO' (C-shell: `unsetenv TERMINFO') as well.svn: system('emacs -nw svn-prop.tmp') 返回 256

(它适用于VISUALset to just emacs,但只能从 Emacs X 窗口内部,而不是在终端会话内部。)

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

4

6 回答 6

21

您可以通过emacsclient. 首先,启动emacs服务器

M-x server-start

或添加(server-start)到您的.emacs. 然后,

export VISUAL=emacsclient

编辑离开。

笔记:

  • emacs和的版本emacsclient必须一致。如果您安装了多个版本的 Emacs,请确保调用与emacsclient运行服务器的 Emacs 版本相对应的版本。
  • 如果您在多个 Emacs 进程/帧中启动服务器(例如,因为(server-start)在您的 中.emacs),缓冲区将在最后一帧中创建以启动服务器。
于 2008-09-22T18:21:23.573 回答
3

有 emacsclient、gnuserv 和 Emacs 23 中的 multi-tty,它们都对此很有用。实际上,我认为在 Emacs 23 中,emacsclient 具有 gnuserv 的所有有趣功能。

于 2008-09-23T17:37:12.877 回答
0

不完全正确。 ansi-term可以很好地运行 emacs(尽管我通常为提交日志运行 mg,但在极少数情况下我不会直接从 emacs 提交)。 eshell如果您首先启动screen并从那里运行它,也可以运行 emacs。

于 2009-01-13T02:06:17.913 回答
0

除了使用 emacs 客户端/服务器,我还使用这个脚本来调用 emacs。

如果它还没有运行,这将启动 emacs,或者只是在正在运行的 emacs 中打开一个新的 emacs 缓冲区(使用 gnuclient)。默认情况下它在后台运行,但对于需要一些输入的进程,它可以在前台运行。例如,在输入更改列表描述时,我将其用作源代码控制编辑器。我有“SVN_EDITOR=emacs sync”,所以我可以在 emacs shell 中执行“svn commit”,它会在同一个 emacs 中的新 emacs 缓冲区中打开 svn 编辑器。当我关闭缓冲区时,“svn commit”继续。挺有用的。

#!/bin/sh

如果 [ -z $EMACS_CMD ]; 然后
  EMACS_CMD="/usr/bin/emacs"
菲

如果 [ -z $GNUCLIENT_CMD ]; 然后
  GNUCLIENT_CMD="/usr/bin/gnuclient"
菲

如果 [ "$1" = "同步" ]; 然后
    班次 1
    同步=真
别的
    同步=假
菲

cmd="${EMACS_CMD} $*"
lsof $EMACS_CMD | grep $USER >/dev/null 2>&1
如果[“$?” -ne "1" ]; 然后
    cmd="${GNUCLIENT_CMD} $*"
菲

如果 [ $sync = "true" ]; 然后
    $cmd
别的
    $cmd &
菲

于 2009-05-12T22:22:40.960 回答
0

我想做一些类似的事情来通过 mercurial 合并到 emacs shell 中。感谢这里的海报,我找到了方法。两个步骤:

  1. 在您的 .emacs 文件中添加:(start-server)(请记住在更改后加载文件)

  2. 在你的 hgrc 中:

    [合并工具]
    emacs.executable = emacsclient
    emacs.premerge = 假
    emacs.args = --eval "(ediff-merge-with-ancestor \"$local\" \"$other\" \"$base\" nil \"$output\")"
    

于 2010-04-20T16:50:07.330 回答
0

当我的 .emacs 中有 (start-server) 时,我收到此错误....

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 达尔文设施-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

Note that m-x ansi-term appears to allow me to successfully hg commit inside of its shell. However, that shell does not let me scroll through the buffer with e.g. c-p or c-n so I would prefer to us m-x shell.

于 2012-04-13T00:11:04.480 回答