OS X 终端:同时使用 Meta 键和 Alt 键的功能

39

有没有办法将alt / option键用作元键,同时仍然可以用它来制作一些需要它的字符?

例如,在我的本地键盘布局中:

  • @alt + 2
  • \alt + shift + 7
  • |alt + 7
  • 等等。

因此,如果我将alt键设置为元键,则无法再制作这些字符。另一方面,使用“按下esc键,松开esc键,再按下一个键”来制作元键序列会使我的手疼。

任何使用国际键盘并解决了此问题的Emacs用户,请提供您可能拥有的任何提示!:)

编辑:

看起来我可以将alt键设置为元键,然后在inputrc中添加这种设置:"\e2": "@"。在bash shell中可以工作,但在Emacs中仍然无法正常工作,所以不好。


这个问题似乎已经被这个答案巧妙地解决了,通过使用正确的<kbd>alt</kbd>键来输入特殊字符:http://apple.stackexchange.com/questions/12087/emacs-on-mac-os-x-to-alt-or-command - trmdttr
16个回答

26

我在Mac OS X上使用瑞典键盘,并在Emacs.app中使用以下设置:

首先,我安装了KeyRemap4MacBook并将其设置为将左边的Option键更改为Command键。

然后,在我的.emacs文件中添加了以下内容:

(setq mac-option-modifier 'none)
(setq mac-command-modifier 'meta)

这会使Emacs将命令视为Meta并忽略Option。由于左Alt / Option键被重新映射为命令,因此这使其像Meta一样工作,而右Alt / Option键仍可用于输入特殊字符,如@ []和{}。
特定于应用程序的Mac快捷键,例如Cmd + C和Cmd + V不再起作用,但全局快捷键如Cmd +空格用于Spotlight和Cmd + Tab用于应用程序切换则可用。
更新: 如果您使用iTerm2作为终端,则支持仅将左Alt / Option键映射为meta,这意味着您仍然可以使用右AltGr / Option键输入特殊字符。这也意味着您可以在运行于iTerm2终端中的Emacs中正常使用meta。

3
记录一下,如果您不想使用KeyRemap4MacBook重新映射键位,您可以使用以下代码:(setq mac-option-key-is-meta t)(setq mac-right-option-modifier nil),这将把左侧的Alt键重新映射为META键,右侧的Alt键重新映射为ALT键。请参见http://emacswiki.org/emacs/EmacsApp。 - kliron
感谢 iTerm2 的提示,它真的很有用。 - AlessMascherpa

14

我在Mac上使用瑞典键盘,并且正在使用Aquamacs。 添加这两行代码(归功于Joakim Hårsman):

(setq mac-option-modifier 'none)
(setq mac-command-modifier 'meta)

在我的情况下,在.emacs中(然后重新启动Aquamacs)解决了我的问题。


1
非常有帮助的答案,我不敢相信为什么这个回答没有更多的赞。我已经搜索了一个小时了,非常感谢你。 - futlib

12
使用 iTerm2 ,您可以将左侧的 Option 键映射为 ESC/meta,而将右侧的 Option 键映射为“正常”。这样,您就可以使用右侧的 Option 键来输入重音符号等内容。

iTerm2 preferences


10

考虑在Mac OS X上使用功能丰富的Emacs。我使用Carbon Emacs,但我相信其他一些版本(比如Aqua Emacs或者X11 Emacs)也可以胜任。

如果您坚持要在终端中使用Emacs,可以使用C-x 8前缀作为组合键。尝试使用C-x 8 C-h来获取可能性列表。

请参见http://www.emacswiki.org/emacs/EmacsForMacOS


1
不幸的是,Carbon Emacs并没有解决我的问题。我仍然无法在具有功能元键的情况下输入字符“@ \ |”。似乎emacs与Mac上的国际键盘不兼容,除非我完全重新映射键盘。我已经考虑学习vim ;)。 - John Smith
1
嗯,这很奇怪。在Carbon Emacs中,不使用Alt键而是使用Cmd键作为元键。您有没有特别的原因不适合使用Cmd作为元键? - kmkaplan
1
啊,我不知道它使用Cmd作为元键。我现在尝试了一下,它可以工作。 :) - John Smith
2
顺便说一句,不妨试试Cocoa Emacs。 - ocodo
@Slomojo:我现在使用Cocoa Emacs,它确实非常棒。 - kmkaplan

5

这是一篇旧帖子,但为了让机器人能够找到更好的替代方案而添加。 我从Aquamacs(emulate-mac-keyboard-mode.el, aquamacs-tools.el)借用了几个文件来解决问题(我使用的是意大利Pro键盘):

(defun aq-binding (any)
 nil)
(load  "~/.emacs.d/emulate-mac-keyboard-mode.el") ;;  'noerror

这提供了:

  • 一些较小的模式(模拟Mac意大利键盘模式,模拟Mac法语键盘模式,模拟Mac瑞士德语键盘模式等)
  • 一个菜单,可使用Aquamacs提供的所有选项进行操作

已测试Emacs-23.3-universal-10.6.6,并且对我来说似乎运行正常。

感谢Aquamacs,如果尚未完成,请考虑将此上游推送。


5

看看cmd-key-happy。这个小应用程序对我非常有帮助。它允许您将命令用作元键,并配置一些例外情况。

作者信息如下:

此程序允许您在任何应用程序中交换命令和alt(或选项)键,特别是在Terminal.app中。

http://github.com/aim-stuff/cmd-key-happy


5

我使用的两个解决方法:

  • 我使用在X11.app下运行的xterm。X11.app将命令键用作元键。
  • 在Terminal.app中运行emacs时,我只需使用rfc1345输入法即可输入各种疯狂的非ASCII字符,无需使用选项键。

4

带选项死键的特殊键盘布局

我解决这个问题的方法是,我编写了一个名为U.S. custom的特殊键盘布局。它提供了一个选项死键,可以产生选项组合,而无需使用物理⌥ Option修饰键。例如,在正常的美国键盘布局上,字符⟨ç⟩的产生方式如下:

  • 按下⌥ Option+c

美国自定义键盘布局添加了第二种生成⟨ç⟩的方式:

  • 按下⇧ Shift+§(选项死键),然后释放它,然后按下c

即使在已经勾选了“将选项键用作元键”的Terminal.app中也可以使用此功能。

请注意,美国自定义键盘布局还有两个额外的功能:

  1. 它将普通的§转换为⎄ Compose键(所以你也可以通过按下§,然后,,然后c来生成⟨ç⟩)。
  2. 它用一个(显著扩展的)美国扩展键盘布局替换了CapsLock映射。

将选项死键重新映射到右侧选项修饰键

如果你有一个物理ANSI键盘,则缺少§键。在这种情况下,我建议将§键分配给其他键,例如右侧⌥ Option修饰键。安装KeyRemap4MacBook,打开~/Library/Application\ Support/KeyRemap4MacBook/private.xml并粘贴以下代码:

<?xml version="1.0"?>
<root>
<item>
  <name>Send ISO Section for right Option</name>
  <identifier>private.send_iso_section_for_right_option</identifier>
  <autogen>--KeyToKey-- KeyCode::OPTION_R, KeyCode::UK_SECTION</autogen>
</item>
<item>
  <name>Send Shift+ISO Section for Shift+right Option (keep normal right Option without Shift)</name>
  <identifier>private.send_shift_iso_section_for_shift_right_option</identifier>
  <autogen>--KeyToKey-- KeyCode::OPTION_R, ModifierFlag::SHIFT_R, KeyCode::UK_SECTION, ModifierFlag::SHIFT_L</autogen>
  <autogen>--KeyToKey-- KeyCode::OPTION_R, ModifierFlag::SHIFT_L, KeyCode::UK_SECTION, ModifierFlag::SHIFT_L</autogen>
</item>
</root>

然后,打开KeyRemap4MacBook首选项面板,点击ReloadXML,然后选择“Send ISO Section for right option”。现在,你的⌥ Right Option键被重新映射为§,所以当U.S. custom键盘布局处于活动状态时,按下⇧ Shift+⌥ Right Option将会给你选项死键状态(只按下⌥ Right Option不加其他修饰符将会给你一个等价于选项修饰符的死键状态)。
如果想要在没有按下⇧ Shift时保留⌥ Right Option(而不是⎄ Compose键),则在KeyRemap4MacBook首选项面板中选择“Send Shift+ISO Section for Shift+right Option (keep normal right Option without Shift)”(而不是“Send ISO Section for right Option”)。这样,只有⇧ Shift+⌥ Right Option才会产生选项死键,而普通的⌥ Right Option将继续作为选项修饰符工作。你甚至可以继续使用⌥ Right Option+⇧ Shift修饰符组合(例如⌥ Right Option+⇧ Shift+c→⟨Ç⟩),只要你不先按下⇧ Shift即可。

4
值得思考问题背后的假设。我的意思是说,真正的问题在于制作当前似乎需要选项键的字符。这个问题可以通过不同时实现“meta键+alt功能”来解决。
让我解释一下:我有一个类似的问题。在我的英国键盘上,shift-3映射到英镑符号£,这意味着我通常需要按option-3来获得非常有用的#——这在终端中是一个真正的问题,因为我使用option作为meta。然而,我发现以上大多数解决方案都有点过头了。我不想为了一个符号就改变到另一个版本的Emacs(例如Aquamacs),切换到其他终端应用程序(例如iTerm或xterm),或者安装一个按键重新映射应用程序(例如KeyRemap4MacBook)!也许那适合一些人,但我认为值得指出的是,如果问题只是一个字符,它可以用一个包含九个字符的文本文件来解决。
关于我个人遇到的这个问题,我发现最简单的解决方案是在我的主目录中创建一个名为.inputrc的文件,其中包含以下单行:
"§": "#"

这会将当前Mac键盘左侧的§(对我来说几乎无用)重新映射为(几乎必不可少的)#。这比默认设置更适合我,因为现在我可以通过单个按键获取#。如果还有其他字符需要重新映射,只需为每个字符添加一行即可。
总之,这就解决了如何在shell中获取缺失字符的问题,但如果您还想在Emacs中使用它(虽然您没有提到,但可能是情况),则可以将类似于以下内容添加到您的.emacs文件中(其中35是我想要的字符的ASCII码,即#):
(global-set-key (kbd "§") 'insert-hash)
(defun insert-hash ()
  (interactive)
  (insert 35))

如果经常需要通过选项键访问几十个字符,那么这种方法可能不是那么完美,但实际上并没有。

我希望这能对某些人有所帮助。作为一个普通的周末黑客,我通常不敢在Stack Overflow上回答问题...


3
以下解决方案有效,且不会干扰其他操作,您无需使用iTerm2或Aquamacs等工具。
第一步 在Terminal.app设置中保持“使用Option作为Meta键”开启状态。
第二步 编辑~/.inputrc(如果不存在,请新建),添加以下行:
"\e3": '#'
这将重新映射⌥ alt + 3,以便您可以像在终端中一样正常产生#字符,而不是烦人的提示(arg: 3)。
第三步 编辑~/.emacs,添加以下行:
(global-set-key (kbd "M-3") "#")
这将重新映射⌥ alt + 3,以便您可以像在emacs中一样正常产生#字符,而不是什么都不做。
注意事项1:这只是一个重新映射。因此,⌥ alt + ?(其他键)不会被重新映射,例如,您可能希望重新映射⌥ alt + n以产生波浪线键~。只需按照上述相同的步骤进行操作,显然将3更换为您需要的任何键即可。
注意事项2:当您ssh到另一个框时,您将面临相同的困难,但您所要做的就是在该框上编辑~/.inputrc和~/.emacs文件。
注意事项3:我是英国人,在英国的MacBook上。因此,我不能保证外国MacBook的效果。

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