Native & OS 输入法管理包『sis』使用交流

org-mode 下C-ret新建项目直接中文的问题,
我这几天来解决一下。

用了 evil-escape 设定 “kj” 来切换 insert 模式到 normal 模式。

想问下有什么办法可以在 insert 模式且是中文输入法的状态下,实现 “kj” 进入到 normal 模式么?

这个问题困扰了很久。之前用 vscode 的 vim 插件也是,输入法会捕获kj输入,从而没法进入到 normal 模式。(而且vscode映射kj到escape后还会有bug)

这个没办法,因为你输入k的时候,k会被输入法截走,emacs根本看不见。

直接输入 “jk” 然后上屏不就可以吗?如rec

1 个赞

原来,要按一下回车。比vscode的方案要好一些。 要是能省掉回车就更好了。

!!! 不兼容更新


所有符号中的`-follow`都需要删掉。
比如 `global-folllow-context-mode` 改名为 `global-context-mode`

功能更新


支持org mode中C-RET新建item时,自动切换输入法。
底层代码写好了,但是默认的配置只支持doom。

此处需要原生emacs用户的帮助:

  1. 安装 https://melpa.org/#/command-log-mode
  2. 开启 command-log-mode,并 toggle command log mode buffer
  3. 在org mode buffer中,通过C-RET新建item,
  4. 在log mode buffer里面,看触发了什么命令。
  5. 将此命令报给我。
  • macOS Catalina 10.15.7 | Doom Emacs | Emacs Mac Port 27.1
  1. org buffer 内容(中文输入是用 M-x sis-switch切换的)
* impossible
* 不可能
* bukexr
* mpgm
  1. command-log-mode buffer 内容:
<C-return> +org/insert-item-below
i          org-self-insert-command [10 times] 
<C-return> +org/insert-item-below
M-x        counsel-M-x [2 times]
b          org-self-insert-command [8 times] 
DEL        evil-delete-backward-char-and-join [8 times] 
不         org-self-insert-command [3 times] 
<C-return> +org/insert-item-below
b          org-self-insert-command [6 times] 
<C-return> +org/insert-item-below
m          org-self-insert-command [4 times] 

谢谢,不过不需要你这个信息。
我也用的doom,所以内置了对doom下org的支持。

有别的原生emacs键位的用户,
我需要他们提供信息,以内置支持
否则,用户需要自己配置sis-context-triggers变量。

现在你在org下用没问题吧。

在中文标题上 C-RET,会在新标题上切到中文输入法
在英文标题上 C-RET,会在新标题上切到英文输入法

我在Mac 10.15.7 上测试,没有楼上提到的问题,C-RET 一切正常。 Emacs 版本是自己编译的master 28.0.50。 Emacs 原生键位。

哦哦,evil下,因为在normal模式中,是英文输入法,C-RET会存在这个问题。

原生键位不存在这个问题。

那就不用管了。

有别的自动切换需求的,也可提出来。我把它放到默认配置中。

现在底层已经做好了,只是配置的事,比较方便。

spacemacs evil normal 下 C-RET 触发的是evil-org-org-insert-heading-respect-content-below

你在配置中, 对照 sis-context-triggers 现有的值,把 +org/insert-item-below 换掉,试试看呢?

请把测试结果反馈给我一下。

我的关于sis-context-triggers的配置

(setq sis-context-triggers '(('org-insert-heading-respect-content 'sis--context-line nil)
                                 ('evil-org-org-insert-heading-respect-content-below 'sis--context-line nil)))

evil insert模式C-RET会调用org-insert-heading-respect-content, 可以正确切换

evil normal模式C-RET会调用evil-org-org-insert-heading-respect-content-below, 不能正确切换

insert模式下,因为输入法一直是中文,是不需要trigger的,这一行去掉。

我下次自用用spacemacs测一下。我现在没有这个环境。得专门装一个。

1 个赞

我有这样一个需求:使用某些命令打开 minibuffer 之后,不是切换为英文,而是切换为中文。

应用场景:

  • 使用 org-roam 搜索笔记的时候,因为一般笔记都是中文名。
  • 使用 counsel-rg 搜索文本的时候
  • 其他一些搜索场景

在文档中没有找到可以改的变量什么的,我就在配置里把代码中的 sis--minibuffer-setup-handler 重定义了。原本是:

(defun sis--minibuffer-setup-handler ()
  "Handler for `minibuffer-setup-hook'."
  (when sis-log-mode
    (message "enter minibuffer: [%s]@current [%s]@last [%s]@command"
             (current-buffer)
             sis--buffer-before-command
             this-command))
  (sis--set-english))

重定义为:

(defun sis--minibuffer-setup-handler ()
  "Handler for `minibuffer-setup-hook'."
  (when sis-log-mode
    (message "enter minibuffer: [%s]@current [%s]@last [%s]@command"
             (current-buffer)
             sis--buffer-before-command
             this-command))
  (if (or (string-equal "org-roam-find-file" (symbol-name this-command))
          (string-equal "org-roam-insert" (symbol-name this-command))
          (string-equal "org-roam-capture" (symbol-name this-command))
          (string-equal "counsel-rg" (symbol-name this-command)))
      (sis--set-other)
    (sis--set-english))
  )

我现在使用这个代码解决了需求。不知道还有没有更好的方法?想和大家交流一下

1 个赞

很棒啊,这是最佳做法,

如果需要改这一块的用户很多,
我可以把这块提出来,弄成可配置的predicate,

加了一个变量:sis-respect-minibuffer-triggers
你直接升级到github版,或等melpa几个小时候自动更新版本。

然后,你这么配置就行了:

(add-to-list sis-respect-minibuffer-triggers
                      (cons 'org-roam-find-file (lambda () 'other))))
(add-to-list sis-respect-minibuffer-triggers
                      (cons 'org-roam-insert (lambda () 'other))))
(add-to-list sis-respect-minibuffer-triggers
                      (cons 'org-roam-capture (lambda () 'other))))
(add-to-list sis-respect-minibuffer-triggers
                      (cons 'counsel-rg (lambda () 'other))))
2 个赞

macos系统总是莫名其妙的更改emacs的输入法,经常出现在切换程序的时候,切换到emacs时会出现nomal模式改成中文模式的情况,用各种切换输入法的小软件都会出现例外。烦不胜烦。

再次恳请开放一个硬切换的功能,即:

if emacs获得焦点 and evil处在nomal模式

then 输入法切换为英文

请大佬们帮忙和指点,谢谢!