Unix 当命令试图在shell模式下打开编辑器时,打开Emacs缓冲区
我喜欢使用Emacs的shell模式,但它有一些不足之处。其中之一是,当shell命令试图调用编辑器时,打开新缓冲区不够聪明。例如,当环境变量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
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
的版本必须一致。如果安装了多个版本的Emacs,请确保调用与运行服务器的Emacs版本对应的emacsclient
EmacClient
- 如果在多个Emacs进程/帧中启动服务器(例如,因为
在(服务器启动)
中),将在最后一帧中创建缓冲区以启动服务器.Emacs
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中进行类似的合并。多亏了这里的海报,我找到了路。两个步骤:
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()