请教:elisp如何对按键绑定"——" | 如何更精确无误快速的输入_符号

有时候输入英文符号,忘记按shift切换中英文输入状态,这时发现错了要按退格键然后在切到英文输入状态后在输入标点符号, 我想简化这个操作, 又发现某些符号我日常也很少用到, 于是简单粗暴的写了以下代码:

(global-set-key (kbd "【") (lambda()(interactive) (insert "[" ) ) )
(global-set-key (kbd "】") (lambda()(interactive) (insert "]" ) ) )
(global-set-key (kbd "(") (lambda()(interactive) (insert "(" ) ) )
(global-set-key (kbd ")") (lambda()(interactive) (insert ")" ) ) )

从此以后我在emacs里不用在关心输入法是什么状态, 在也没有把这几个符号输错过了(想错都错不了),导致的后果是【】()没法在emacs里输入, 但也不要仅,我又不是只用emacs, 需要这几个符号的时候,随便找个emacs窗口外的地方打上去就可。

有一个使用频率极高的符号 _,在emacs里用得不多,emacs里用的是-, 而其它编程语言通常不能用-来命名, 只能用_来代替,,按 shift- 输入, 每次输入这个符号时我都要先确定一下中英文输入状态, 不然就输入成了 ——,这时按一次退格还不行,要按两次才能消掉, 影响效率。

这个符号的使用频率应该也是很低的,没有 _ 这样常用, 没必要让其占着 shift-, 我想统一让 shift-都输入_,于是又按老办法写了 (global-set-key (kbd "——") (lambda()(interactive) (insert "_" ) ) ), 报错"Key sequence — — starts with non-prefix key —"。不知道有没有坛友解决过这个问题。

使用下面的办法解决了这一问题

(define-prefix-command '—)(global-set-key (kbd "—") '—)
(define-key —(kbd "—")  (lambda()(interactive)(insert "_" )))

随带研究了下这个我基本没用过的符号,原来这个符号叫做一字线,通常用于年份,如: 鲁迅(1881—1936), 但我发现介绍这个符号的文章在使用这个符号时用得是一个—,而我在键盘上按 shift- 出现的是两个——,看来这个符号的用法还没有实现统一

1 个赞

如果用 Rime 做输入法的话这个问题很好解决,直接改个 yaml 配置就可以了。

你这……方向不太对,应该解决的是,在emacs中需要用系统的中文输入法吗?不需要。可以保证emacs中总是英文输入法吗?应该可以。后一个看系统,用hammerspoon之类的系统api包装软件搞成“切到emacs就是英文输入法”就行。

第一个问题,pyim试过了吗?在空白buffer里面输入wo,就是两个字母,再按下“我要中文”按键,会把wo当作拼音,给出和所有输入法一样的候选列表。然后wo会变成了,再按下字母键,会直接出现候选词列表。回车到下一行,按字母,又出现普通字母。
就根本不需要担心“【】”的问题,因为永远不需要按输入法切换键,代价是偶尔按一下“我要中文”键


呃另一方面,就算用系统输入法,要输英文的时候不是把整个输入法切成en-US吗,一直无法理解用shift来切中英文,shift太常用了,英文输着输着一手抖就又切走了,组合键切走整个输入法干净安全不好吗 :smiling_face_with_tear:

确实方向有点不太对, 主要是我基本没有用过英文输入法, 多数都是中文输入状态下, 你说 shift太常用了 ,在我这里恰好相反, 在中文里大写字母输入需求少,感觉shift使用频繁远低于ctrl, 我甚至把 shift+字母 改了 当作快捷键用(时间一长习惯成自然,回不去了) 至今也没见过我以外还有其它人这么做的。

pyim有用过, 在emacs里面单独用一个输入法, 这样感觉会有一种把emacs和电脑里其它软件割裂开的感觉, 我并非只用emacs, 如果我电脑里所有软件都用同一个中文输入法, 这样切到其它软件时就可以保持同样的输入状态.而不会有中断感.

在emacs始终保持 英文输入法状态 ,不需要系统中文输入法。应该是正解,希望我什么时候也可以达成这个成就。

shift常用是在写代码的时候,你不是在emacs里面用中文输入法的英文输入嘛。

用rime可以在系统和pyim里一致吧,不过我系统用rime,pyim还没折腾,用的默认词典,emacs里有时用rime有时用系统输入法 :smiling_face_with_tear:

其实rime我也有安装,但这输入法怎么个用法(自定义)一直没弄明白,环境win11,可以详解一下怎么改yaml实现这个功能吗?

首先你要知道你惯用的是什么 rime 输入法, 我以地球拼音为例. 你要在 rime-user-data-dir 中找到 terra_pinyin.custom.yaml 文件 (如果没有, 自己创建个空文件), 然后加入

patch:
  punctuator/full_shape:
    "_" : "_"
  punctuator/half_shape:
    "_" : "_"

感谢,我建了 cangjie5.custom.yaml 复制上面代码进去后有效