请教如何代替前缀键 C-c

大家好,我最近在尝试使用 emacs,因为 C-c 需要我的左手不太舒服的按压,并且还很常用,所以我很希望可以用另一个键(比如说 C-o)去代替它,同时我还希望可以将 C-c 映射成 copy 功能,但是我不知道如何实现它。

我尝试过 emacs 自带的 cua-mode,但是这样的粘贴则是 cua-copy,似乎和 kill 环结构并不通用;也并不支持在没有区域选择时复制一整行,所以我并不太喜欢这种解决方式。

另外如果能请教如何解放 C-x 就更好了,C-x 对我来说也不是很舒服,我希望用 C-j 代替 C-x,再将 C-x 改成剪切功能。

非常感谢大家的指教。

在emacs内部应该做不到重映射c-x,c-c,只能使用外部改键工具 如ahk

我就是在没有选中文本时复制一整行,忘记在那抄的代码了

(global-set-key "\M-w"
                (lambda ()
                  (interactive)
                  (if mark-active
                      (kill-ring-save (region-beginning)
                                      (region-end))
                    (progn
                      (kill-ring-save (line-beginning-position)
                                      (line-end-position))
                      (message "copied line")))))

ahk 是不是只能建立键映射关系,那我是不是没办法做到取消原来 C-c 的功能

如果你c-c做为了复制键,还想用原来c-c的功能的话,就只能换一个键绑定成c-c了,比如我用的是 shift+c

首先不建议你改C-c, C-x 这是emacs键的入口,是emacs的惯用法,对新人来说会有很长的一段探索适应过程,绝不要在前期就破坏传统。 改键从来就不是一个键两个键的事,而是要考虑按键风格和传统,兼容性等。我的改造方法你可以参考一下。C-q 改造成了复制。这样C-q, C-w, C-y 都是用C打头,敲击的连续性比emacs原生的M-w要强多了。另你可以把大小写键映射成Ctrl用ank.

非常感谢您的观点。其实我想把 C-c 和 C-x 改成更加靠近右手非小指区是思考过一些的,我之前利用

(define-key key-translation-map (kbd "C-j") (kbd "C-x"))

将 C-x 的功能移动到 C-j,感觉十分舒服,因为我平时按 C-x 需要左手的手腕倾斜向身体中轴倾斜一个角度,无论是 Ctrl 是在键盘左下角还是在大写键上都是这样的,并不利于我在按完 C-x 后连续击键(比如说如果再按一个 C-b,需要手腕重新摆正,然后左小指按 caps,右手按 b)。

我是第二次调整键位,主要是希望在键盘上维护两种手的姿势,一种是两食指尽量定位在 f 和 j 键上,一种是左手小指定位在 Ctrl 上,右手在鼠标上(主要是为了配合浏览器)。所以才希望能够解放 C-c, C-x , C-v 这些离左 Ctrl 近且和浏览器统一的键位。

所以我还是希望蹲一个改键位方法。再次感谢您的观点。此外如果您使用 linux,给您安利 改大写键 。这个可以让您的大写键在与其他按键一起按的时候被视为 Ctrl,单独按的时候被视为 esc,同时又因为 emacs 中 esc 被视为 M-,那么按 M- 会方便很多。

我自己个人也比较习惯传统的 C-c 复制, C-x 剪贴, C-v 粘贴, 但 C-c C-x 前缀键很多包都依赖, 最好不要动. 所以作为折中我是将 Control shift c, Control shift x, Control shift v 作为替代. 在我用的终端模拟器中, Control shift c 也是用于复制,习惯就好了.

  (global-set-key (kbd "C-S-v") 'yank)
  (global-set-key (kbd "C-S-x") 'kill)
  (global-set-key (kbd "C-S-c") 'copy-region-as-kill)

非常感谢您的指教,您说的这种方案其实就是现在我的解决方案,我通过 key-translation-map 将 C-j 映射成了 C-x,C-o 映射成了 C-c,然后通过加入 shift 来模拟 CUA 模式。这次提问我也是希望有没有办法将其改得更加本质一些。因为我查阅手册,发现 C-c 对应的是 mode-specific-map ,所以应该可以直接利用某种 emacs 内的键映射方式用 C-o 直接映射这个 mode-specific-map。道友们说的 C-c 很关键,我个人觉得可能是说 mode-specific-map 很关键,所以我猜测是不是我直接映射这个 mode-specific-map,就不会导致插件的快捷键逻辑崩溃了?

完全理解你改键的心情,但是你有没想过C-j在未来会有其它用途。事实上在evil中,C-j是专用于另一功能的。如果你这时候把C-j占用了,未来探索到这一步的时候,你再修改回来就是一连串的修改,很可能会破坏你现在建立的统一风格。所以改键的原则是特定用途的按键绝不要改,至少在你不完全了解它的影响范围的时候不要去改它。比起你未来因为一个键的修改而引发的多米诺骨牌效应,现在的一点难按真的不算什么。

当然,我想表达的是我个人一些经历的思考。仅供参考,不代表绝对的正确。每个人的路子和方法不一定一样的。请继续用你的热情探索emacs吧 :fist:

哇,谢谢您说了这么多,那我还想再问一问,依照您的经验,键绑定应该遵循什么样的原则呀?另外 emacs 的原生键位的设计思路是啥样子的呀?(我也是今天查看文档和听道友评论才意识到 C-c 的重要性的)。我觉得 emacs 键绑定很有趣啊,比如有很多的 C-x 前缀,但是既有 C-x C-b 又有 C-x b ,就感觉有些不太清楚啥时候多加一个 Ctrl

1, 全局意识,不谋全局者不足以谋一域。 2,经济学意识,任何领域的创新开拓最后都绕不过经济学。

差不多就这些了,其它靠你自己摸索了

可以参考 key bindings - Emacs bind key to prefix - Emacs Stack Exchange

如果你要将 C-c 前缀放到 C-o 上可以这样做:

(keymap-global-set "C-o" (keymap-lookup global-map "C-c"))

但是 Emacs 中的按键约定就是 C-x 供 major-mode 使用,C-c 供扩展包或用户使用,这样的修改可以会与 major-mode-map 冲突。

太感谢了,这里附上 emacs 的键绑定约定。同时有一篇博客更加直观一些

1 个赞