刚开始在OS X上使用Emacs中的Paredit - 为什么 C-) 没有起作用?

8

我最近在 Mac OS X Leopard 上搭建了一个 Common Lisp 编程环境。其中一个我认为必不可少的 Emacs 模块是 paredit。paredit 有助于更轻松地处理我的 Lisp 代码,但我遇到了一些困难。

C-) 绑定了 paredit-forward-slurp-sexp,但并没有将其前向 slurp sexps,而是回显数字 0。我在 Mac 上交替使用 iTerm 和 Terminal,两个应用程序都存在相同的问题。

我在 GNU Emacs 的 GUI 版本中尝试了相同的键组合,结果哦,它有效了。不幸的是,图形化版本的 Emacs 无法满足我的需求;我想继续使用基于 iTerm 的设置。

因此我问你,stackoverflow:我该怎么做才能让 C-) 组合键在 iTerm 中注册?


为什么?为什么你想继续使用基于iTerm的装备? - klang
@klang (1) 在 SSH 会话中更好的一致性,(2) 我可以在 screen 中使用标准的 emacs,(3) 我发现 GUI emacs 中的混合窗口/缓冲区令人困惑,(4) 我更喜欢 bash 而不是 eshell,最后,(5) 使用黑色主题,特别是全屏时,在 iTerm 中使用 emacs 感觉比图形应用程序更加精细,因为后者有笨重的滚动条和菜单。如果我要使用 GUI,我更喜欢 TextMate 的界面而不是 GNU Emacs。 - Joe Taylor
你可以输入 C-c C-) 来确保,但由于你得到了一个 0,显然你的终端仿真器(iTerm 和 Terminal)在你按下 Ctrl+) 时正在传输一个 0。你需要做两件事:说服 iTerm 和 Terminal 在你按下 Ctrl+) 时发送一个转义序列,并在 function-key-maplocal-function-key-map 中声明这个转义序列对应于 Ctrl+) - Gilles 'SO- stop being evil'
你可以使用任何你喜欢的shell,在Windows上我使用emacs内置的cygwin。你可以更改主题,也可以使用luddite-mode https://gist.github.com/539783来移除菜单和滚动条。但是我无法解决SSH会话之间的一致性问题。通常我会让emacs运行数周,并且偶尔会因为VPN而断开ssh会话。当可以重新连接时,Emacs会自动重新连接,我可以继续处理文件。在shell模式下,我必须重新开始。嗯,不同的人有不同的喜好吧。 - klang
5个回答

8

就我所知,在我的Mac上,C-<right>C-<left>被绑定到任务控制,并且向右和向左移动工作区。

话虽如此,C-Shift-<right>C-Shift-<left>似乎能够完成任务,我可以在Emacs中使用paredit轻松地进行代码操作。


5
据我所知,在终端中无法向Emacs发送Control和Shift的修改组合。因此,C-) 需要shift键,所以超出了范围。我不认为任何终端调整都能改变这一点。
我相信 paredit-forward-slurp-sexp 默认也绑定到C-<right>,在终端中应该可以正常工作,因此也许你可以训练你的手指使用那个键。

1
终端调整肯定可以改变这一点(如果终端允许这样的调整)。Emacs不是阻碍点。如果可以说服终端发送一个独特的转义序列,那就没问题了。 - Gilles 'SO- stop being evil'
@Gilles:知道这点很好。尽管如此,我认为让普通终端处理ctrl+shift的困难在历史上一直是Emacs选择键绑定的因素之一。 - sanityinc
1
它确实存在,但这主要是在硬件终端(通常无法配置以发送这些转义序列)普遍的时代。这个历史事实的另一个后果是,没有像功能键和光标键那样的标准化转义序列。 - Gilles 'SO- stop being evil'
4
我之前写过一篇关于如何修复常见的OS X终端(Terminal.app、iTerm和iTerm 2)问题的文章。链接在这里:http://offbytwo.com/2012/01/15/emacs-plus-paredit-under-terminal.html - Cosmin Stejerean

4

根据Cosmin的博客,我在iTerm2中使这个工作起来了。

  1. 打开Preferences > Profiles > Keys。(您可能需要复制默认配置文件并更改副本。)
  2. 单击Profile Shortcut Keys:下的+
  3. 键入Ctrl+)(ctrl+shift+leftparen)。
  4. 对于Action,选择Send Escape Character
  5. 在文本框中输入[1;5C

2
我猜测你的iTerm / Terminal程序实际上无法发送C-),因为在ASCII中没有这样的字符,并且我相信在VT100上也没有它的序列。
你可以自己验证。在终端仿真器中运行emacs。键入C-)。然后键入C-h l(“view-lossage”)。这将显示Emacs看到您键入的最后几百个键。尝试在键入非控制)后再次尝试,以查看它们是否不同。如果不是,则除非您可以配置iTerm / Terminal以不同的方式将它们发送到Emacs,否则您将无法使用它们。
话虽如此,您始终可以将其他键绑定到 paredit-forward-slurp-sexp

2
我遇到了与paredit的备用C-<right>绑定相同的问题,发现tmux是原因——基本上tmux会吞并C-并传递一个<right>
我在https://unix.stackexchange.com/a/34484找到了解决方案,它包括添加。
set-window-option -g xterm-keys on

to my ~/.tmux.conf.


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