如何把所有中文输入法下的快捷键都重定位到英文?

我用的是Mac 自带中文输入法。

有时候中文写到一半,想输入一个命令。在中文输入法激活的情况下, 敲 C-a 等一次性的命令正常,但是敲 C-x a 就会跳出中文输入了。 (也就是说这个命令不成功,然后要取消掉中文输入法,然后Emacs的环境也被破坏了,还要多按一次undo)

本来我一直忍着的,但是今天发现,似乎找到了一个部分解决方法。

比如说,输入 C-x ‘ (中文的‘)提示找不到,所以把这个键绑定到 C-x ',那么在中文输入法下也能按了。

如果手动改的话,只需要改 map 后面的就行了,比如把 C-x 后的所有中文标点对应的函数改成英文。直接输入 M-‘(中文) 和 M-’ 效果一样。但是工作量还是很大。

所以有没有一次性的解决方法,让这些map后的 :“”}{[]、`=等等全部视作英文标点?

我用的也是它(拼音),刚刚发现这个输入法如果刚刚打出的字符是数字的话,后面的标点就变成英文的了,因此 C-x 4 。 会自动被当作 C-x 4 . (xref-find-definitions-other-window)。所以要是你的输入法扩展性比较好,能够定制这种特性的话,也是一个解决方法。

主要工作就是把中文标点和英文标点对上,然后可以像这样绑定

(global-set-key
 (kbd "M-。")
 (lambda ()
   (interactive)
   (call-interactively (key-binding (kbd "M-.")))))

我用了个 Minor mode 封装下放在自己的配置中,先看看效果如何

(defvar chinese-punctuation-mode-map
  (let ((map (make-sparse-keymap)))
    (dolist (prefix '("C-x " "C-c " "C-" "M-"))
      (loop for i in '("," "。" "/")
            for j in '(","  "."  "/")
            for k1 = (concat prefix i)
            for k2 = (concat prefix j)
            do
            (message "Mapping %s to %s" k1 k2)
            (define-key map (kbd k1)
              `(lambda ()
                 (interactive)
                 (call-interactively (key-binding ,(kbd k2)))))))
    map))

(define-minor-mode chinese-punctuation-mode
  "映射一些含中文全角标点的按键组合至英文,如 \[C-x 。] 至 \[C-x .].

\\{chinese-punctuation-mode-map}"
  :global t
  :lighter " Chinese")
1 个赞

刚刚发现 Emacs “Mac Port” 自带了一个 mac-auto-ascii-mode,感觉基本上就是你需要的,它的 doc-string:(粗体是我加的)

mac-auto-ascii-mode is an interactive compiled Lisp function in ‘term/mac-win.el’.

(mac-auto-ascii-mode &optional ARG)

Toggle Mac Auto ASCII mode. With a prefix argument ARG, enable Mac Auto ASCII mode if ARG is positive, and disable it otherwise. If called from Lisp, enable the mode if ARG is omitted or nil.

Mac Auto ASCII mode automatically selects the most-recently-used ASCII-capable keyboard input source on some occasions: after prefix key (bound in the global keymap) press such as C-x and M-g, and at the start of minibuffer input.

Strictly speaking, its implementation has a timing issue: the Lisp event queue may already have some input events that have been processed by some previous keyboard input source but yet to be processed by the Lisp interpreter.

搜了下windows 平台 貌似没有没有对应的方案? 不知道怎么解决

同问windows下的方案

以前试过,vim下rime能自动识别编辑模式和控制模式来切换中英文。emacs没发现

我用的是 autohotkey, 来解决的, esc 与 cops lock交换也是 用 autohotkey, 用的是极点五笔. 这个贴子是用 Deepin 写的, 这几天正在转换 Deepin 中, 具体我也是乱弄的, 有需要的话, 留 个言, 待我用 win7来回