(重新设计)中英文混打:OS输入法管理包 smart-input-source

其实主要是方便修改

我还是没搞明白command的normal prefix sequence stage 是怎么判断的

:+1:

如果有什么现在smart-input-source没有的特性
但你又想实现进imbot里面的,
还请提出来。
我看看是否需要也做进smart-input-source里。

代码里面有嘛。

  • C-x 被截取了,就从normal stage的pre里面直接短路,进入了pre prefix stage
  • pre prefix stage里面,禁止截取prefix key,并且保存相关状态
  • -prefix-override-handler 里面把prefix key放回event loop里
  • post prefix stage 里面转换状态到 sequence stage
  • 用户继续输入b(现在是C-x b)
  • 这个时候是pre sequence stage, 啥也不干
  • 在post sequence stage里面,分成多种情况:
    • C-x x y z 这种多层一系列的key sequence,每次都还是在sequence stage里面
    • 中途 C-g 退出的key sequence,这时候要回到normal
    • key sequence 完成了,映射到命令,这时候也要回到normal。

你也可以不这么实现。
只不过用状态装换的方式,逻辑比较清晰。

1 个赞

(smart-input-source-global-follow-context-mode t)

请问下这个功能是用在什么地方,怎么用?我关闭的时候出现错误

let: Wrong number of arguments: (2 . 3), 4

  1. 这个bug刚才fix了。

  2. 关于这个mode:

    默认值是起这个作用:当你从evil normal state进入到evil insert state时,会自动根据上下文切换输入法。比如你光标在汉字中间进入插入状态,输入法会自动切换到中文。 非evil用户的话,你可以定制这个变量,把别的触发条件也加进去。比如emacs原生用户,可能把光标移动加进去,自动触发切换。但我不是emacs原生用户,不清楚操作习惯,这块就留白了,让用户自己决定。

你好 我有这样一个诉求,请问应该怎么配置

情况

下面图1中,快捷插入同级header后,变为图2后我想直接输入中文。但是输入法切换被接管了,系统默认(Linux ibus)切换按键无效,只能通过内置的‘smart-input-source-switch’切换

  • 图1 image
  • 图2 QQ截图20200720120935

问题

请问可以通过配置调整为,在进入‘编辑’模式后不接管输入法的切换吗? 发现输入状态不符合使用情况,第一反应就是使用默认的输入法切换方法。github文档看了下,也没整明白。

现在的配置: QQ截图20200720121724

  1. 不会的。设计上来讲,smart-input-source (记为sis)不会接管OS的快捷键。
    你可以详细描述一下这一步么?
    OS切换的快捷键,有或者无sis的情况下的差别。
    我来分析一下是什么原因
  2. 前面有个用户提过相同的问题。sis这种情况下,并不会切换输入法,
    别人汇报过同样的问题,后来发现应该用M-enter,详情请见:
    请见 org-mode模式下,item换行切换输入法的问题 · Issue #10 · laishulu/emacs-smart-input-source · GitHub
  3. 根据上下文自动切换输入法是follow-context-mode,
    但是默认只对进入evil insert state有效
    (重新设计)中英文混打:OS输入法管理包 smart-input-source - #775,来自 goumao
    如果你不想开这个功能,可以那一行配置删掉,或者设置为-1
    注意 不能设置成 nil。在emacs中,mode设置成nil和设置成t效果是一样的。

你好,我使用fcitx5,最新版本的懒人配置函数smart-input-source-ism-lazyman-config却不能控制输入法。

smart-input-source-ism-lazyman-config的配置是

(smart-input-source-ism-lazyman-config nil nil 'fcitx5)

按照之前版本的配置却是可以控制输入法的,配置是

  (require 'subr-x)
  (setq-default smart-input-source-english "1")
  (setq-default smart-input-source-other "2")
  (setq-default smart-input-source-do-get
                (lambda() (string-trim (shell-command-to-string "fcitx5-remote"))))
  (setq-default smart-input-source-do-set
                (lambda(source)
                  (pcase source
                    ("1" (string-trim (shell-command-to-string "fcitx5-remote -c")))
                    ("2" (string-trim (shell-command-to-string "fcitx5-remote -o"))))))

@shrubbroom

是个小bug,已fix
请帮助验证一下。

如果用的是melpa版,请等两个小时,
melpa更新有延迟。

多谢解释,感觉我不太会用上,不会定制这个变量哈哈

还有一个小问题,就是通过melpa升级的时候,会先删除旧的包,再安装新的包,这个过程中一直会弹出 Error running timer auto-refresh 未定义的警告信息 我只能关闭emacs,再重新打开一次,不算什么大问题,就是感觉升级的时候有点烦心,如果能不关闭Emacs无痛升级就太好了

好像仍然不行

这是我的配置

(use-package smart-input-source
  :quelpa (smart-input-source :fetcher github :repo "laishulu/emacs-smart-input-source")
  ;; :hook
  ;; enable the /follow context/ and /inline region/ mode for specific buffers
  ;; (((text-mode prog-mode) . smart-input-source-follow-context-mode)
  ;;  ((text-mode prog-mode) . smart-input-source-inline-mode))

  :config
  (smart-input-source-ism-lazyman-config nil nil 'fcitx5)

  ;; enable the /cursor color/ mode
  (smart-input-source-global-cursor-color-mode t)
  ;; enable the /respect/ mode
  (smart-input-source-global-respect-mode t)
  ;; enable the /follow context/ mode for all buffers
  (smart-input-source-global-follow-context-mode t)
  ;; enable the /inline english/ mode for all buffers
  (smart-input-source-global-inline-mode t)
  )

谢谢反馈

愚蠢的bug,已修复。
请继续反馈。

可以正常控制了 感谢

除此之外 我这里还无法实现记录输入法状态的功能 即

#1 从 evil-normal 进入 evil-insert 手动切换为中文输入法 但不输入中文

#2 esc

#3 再次进入evil-insert

此时的输入法却不是中文输入法

这是我的配置

(use-package smart-input-source
  :quelpa (smart-input-source :fetcher github :repo "laishulu/emacs-smart-input-source")
  ;; :hook
  ;; enable the /follow context/ and /inline region/ mode for specific buffers
  ;; (((text-mode prog-mode) . smart-input-source-follow-context-mode)
  ;;  ((text-mode prog-mode) . smart-input-source-inline-mode))

  :config
  (smart-input-source-ism-lazyman-config nil nil 'fcitx5)

  ;; enable the /cursor color/ mode
  (smart-input-source-global-cursor-color-mode t)
  ;; enable the /respect/ mode
  (smart-input-source-global-respect-mode t)
  ;; enable the /inline english/ mode for all buffers
  (smart-input-source-global-inline-mode t)
  )

这个功能是没有的。
原因是normal模式下,
正常情况下你可能做各种操作,
比如光标从中文区移动到英文区。

聪明的做法,
不是恢复离开evil insert之前的输入法
而是根据上下文自适应切换输入法。
evil用户,我是强烈建议开follow context模式的。
我自己就是开着的。

我看你之前的配置中,这个mode是开着的,
但你刚才的配置中,把这个删掉了。。。。。

一些比较特殊的场景还是需要一直开着中文输入的 比如telega每次进入想要输入中文都需要C-SPC调出

在follow context模式被关闭的情况下记忆输入法状态可能会更好一点 而且不会损失其余特性 :sweat_smile:

这个有啊 。

最好:

  1. 通过make-local-variable设成telega这个buffer local的变量。
  2. 把telega buffer这个变量设置成:'other

这样,别的buffer仍然是follow-context自适应的,
而telega buffer中的context是固定成中文的。

1 个赞

你好,我在 Linux 下使用 spacemacs,与 smart-input-source 相关的配置是

dotspacemacs-additional-package '(smart-input-source)

(defun dotspacemacs/user-config ()
  (smart-input-source-ism-lazyman-config nil nil 'fcitx)
  )

这样设置的话 emacs 在启动时会有如下报错。我根据报错原因用 C-h 查了下 smart-input-source-ism-lazyman-config 这个函数并不能查到。

目前我这里安装的 smart-input-source 版本是 20200720.610。

这个版本虽然有bug,但是这个函数应该还是有的。
所以,还是挺奇怪的。
现在最新的版本是20200720.911.
你先更新一下试试吧~~~

describe function的话,一直补到 ism试试呢?

smart-input-source-ism-

找不到 smart-input-source-ism-lazyman-config 函数这个问题可以通过添加 (require 'smart-input-source) 这项配置解决。但是现在的问题,即使更新到 20200720.911,在我的 Linux 上并不能正常运作(不论是 GUI or Terminal)。

我的 Linux 环境是 Archlinux+i3wm,之前是通过给 emacs 的启动命令传递 LC_CTYPE=zh_CN.UTF-8 的方式使得 fcitx 能够被使用。

希望您能在 Linux 环境下进行更多的测试。