让Emacs ansi-term和Zsh友好地协作

17

我一直在尝试在emacs会话中使用Zsh,而不是让emacs重新映射所有的Zsh键。我发现ansi-term对此非常有效,但是我仍然遇到了一些问题。我发现输出了很多垃圾字符,但是我能够用以下方法解决:

## Setup proper term information for emacs ansi-term mode
[[ $TERM == eterm-color ]] && export TERM=xterm

但仍然存在一些问题。现在我遇到了输出超出屏幕的问题,尤其是使用类似于 C-r 进行搜索时。

我发现,如果不调整窗口大小,它就能正常工作。我可以按照以下步骤重现:

  1. 启动一个干净的 emacs -q
  2. 启动 ansi-term 并使用 zsh
  3. 将窗口设置为全屏
  4. 输出填充整个屏幕的内容
  5. 键入 C-r
  6. 提示符会超出屏幕范围

也许有一些方法可以增加输出和最小缓冲区之间的空间以弥补过量?

还有其他人能够正常使用 Zsh + Ansi-term 吗?


3
+1 -- 你不是唯一一个遇到这个问题的人。不过,我只在Mac的tty模式下遇到这个问题。 - Setjmp
在emacs中使用M-r进行命令历史搜索,而不是C-r。 - jshou
4个回答

16

尝试使用MultiTerm

这是唯一一个似乎与zsh兼容良好的Emacs终端模式。它允许您轻松设置您想要由emacs捕获的命令以及您想要路由到终端的命令。到目前为止,缺省设置已经对我足够好了。

此外,请将以下内容添加到您的 .zshrc 文件中,以便让emacs跟踪您在不同目录之间切换时的当前目录。

if [ -n "$INSIDE_EMACS" ]; then
  chpwd() { print -P "\033AnSiTc %d" }
  print -P "\033AnSiTu %n"
  print -P "\033AnSiTc %d"
fi

2
这很棒。你知道如何扩展到ssh连接吗?(例如,假设我的shell已经连接到了特定路径上的远程机器)。 - Amelio Vazquez-Reina
@AmelioVazquez-Reina - 我希望我有这个能力。那将非常有用。 - bengineerd

3

嗯,我从来没有在ansi-term中看到过任何花哨的编辑工作,虽然我可能已经有20年没尝试过了。顺便问一下,您是否尝试过shell-mode(M-x shell),因为它在EMACS中更加自然。

话虽如此,通过阅读term.el文件,它看起来像是ansi-term正在做很多自己的管理。您可能需要查看term原始模式代码,至少在EMACS 22.3中从1230行开始。


1

我也寻找了相当长的时间。对于我来说,将以下内容添加到

;; ansi-term

(global-set-key "\C-x\C-a" '(lambda ()(interactive)(ansi-term "/bin/zsh")))
(global-set-key "\C-x\ a" '(lambda ()(interactive)(ansi-term "/bin/zsh")))

这个很好用。我从http://svn.assembla.com/svn/id774/scripts/dot_files/dot_emacs.d/elisp/global-set-key.el中选取了它。

我相信在那个脚本中还有其他好东西。作为额外的奖励,对我来说,屏幕似乎与emacs很搭配。


0
我找到了问题所在。这是一个emacs配置问题。我的.emacs文件中的这段elisp代码引起了问题:
(custom-set-variables
 '(fringe-mode nil nil (fringe))
 '(fringes-outside-margins t t))

感谢您的帮助。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接