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

meow自己做了个类似evil的模式编辑么?

我研究一下,应该是用户可以通过配置解决的。

退出 insert 状态时把输入法换到英文下面几行就够了。但是回到 insert 状态时恢复先前的输入法状态就不会弄了。

(defun xx|sis-respect-meow ()
       "Respect meow."
       (when (featurep 'meow)
         (add-hook 'meow-insert-mode-hook
                   (lambda ()
                     (unless meow-insert-mode
                       (sis-set-english))))))

其实也不是恢复先前的输入法,而是触发根据上下文自动设置输入法
可以通过设置这个变量实现:

可以这么设置:

(add-to-list 'sis-context-hooks 'meow-exit-insert-mode-hook)

其中:
meow-exit-insert-mode-hook,
因为meow没有自带,
你需要自己写一下,
挂到meow-insert-mode-hook

(defvar meow-exit-insert-mode-hook nil
  "Hook to run when exit meow insert mode.")

(add-hook 'meow-insert-mode-hook 
          (lambda ()
               (unless meow-insert-mode 
                  (run-hooks 'meow-exit-insert-mode-hook))))

@gyren 看我更新的解决办法,请测试反馈。
@DogLooksGood 可以参照evil,内置这一类的hook
这样用户配置起来要方便很多。

谢谢,基本可以实现。

  (defvar meow-leaving-insert-mode-hook nil
    "Hook to run when leaving meow insert mode.")
  (defvar meow-entering-insert-mode-hook nil
    "Hook to run when entering meow insert mode.")
  (add-hook 'meow-insert-mode-hook
            (lambda ()
              (unless meow-insert-mode 
                (run-hooks 'meow-leaving-insert-mode-hook))))
  (add-hook 'meow-insert-mode-hook
            (lambda ()
              (if meow-insert-mode 
                  (run-hooks 'meow-entering-insert-mode-hook))))
  (with-eval-after-load 'sis
    (add-hook 'meow-leaving-insert-mode-hook #'sis-set-english)
    (add-to-list 'sis-context-hooks 'meow-entering-insert-mode-hook))
1 个赞
  1. 你这里的if meow-insert-mode, 一般写成when meow-insert-mode
  2. 这两个lambda函数可以合并到一个if
(if meow-insert-mode 
    (run-hooks 'meow-entering-insert-mode-hook)
  (run-hooks 'meow-leaving-insert-mode-hook))
1 个赞

已经切换到 sis+emscs-rime 了, 很不错. 比用 Enter 键英文上屏舒服多了. 唯一有点遗憾的是我不知道如何实现 “点石成金” 的功能. 简单来说就是比如我在某个状态下想输入中文的 “我是”, 等输入了 “woshi” 拼音以后发现是英文状态, 这时候输入一个按键 “M-i”, 把已经输入的 “woshi” 传给输入法, 转换成中文的 “我是”, buffer 的输入法转换成英文状态. 同样, 如果是在某个状态下想输入英文的 “we are”, 发现是在中文状态, 这时用 “M-i” 直接把输入的英文上屏, 并且输入法状态切换成英文. 这就要求至少有两个 mode 来表示当前的输入状态, 我看了下文档, 好像没有.

(defun +translate-symbol-to-rime ()
  (interactive)
  (let* ((input (thing-at-point 'symbol))
         (beg (car (bounds-of-thing-at-point 'symbol)))
         (end (point)))
    (delete-region beg end)
    (toggle-input-method)
    (dolist (c (string-to-list input))
      (rime-lib-process-key c 0))
    (rime--redisplay)))

试下这个,这个是转当前的 symbol 的内容到 emacs-rime

多谢大神, pinyin 到 中文好了, 有没有输入法输入的拼音字母串直接上屏的函数? 不懂 ELISP, 只能无耻得当伸手党了.

这个比较简单吧,大多数输入法直接回车就行了。 我用的搜狗拼音,经常这么干。

就是不想用回车, 统一用空格.

换输入法,学个顶功输入法,空格都不用敲。

@goumao 请教个问题, 在Macos Emacs Mac Port 使用smart-input-source, 切换到中文之后, 光标闪烁一下之后就切换回英文, 想请问下怎么解决. Emacs version: GNU Emacs 27.2 配置

(use-package sis
  :ensure t
  ;; :hook
  ;; enable the /follow context/ and /inline region/ mode for specific buffers
  ;; (((text-mode prog-mode) . sis-context-mode)
  ;;  ((text-mode prog-mode) . sis-inline-mode))

  :config
  ;; For Linux
  (when  (ramsay/linux-p)
    (sis-ism-lazyman-config "1" "2" 'fcitx5))
  ;; For MacOS
  (when (ramsay/mac-os-p)
    (sis-ism-lazyman-config
     
     ;; English input source may be: "ABC", "US" or another one.
     ;; "com.apple.keylayout.ABC"
     "com.apple.keylayout.US"

     ;; Other language input source: "rime", "sogou" or another one.
     ;; "im.rime.inputmethod.Squirrel.Rime"
     "com.sogou.inputmethod.sogou.wubi"))

  ;; enable the /cursor color/ mode
  (sis-global-cursor-color-mode t)
  ;; enable the /respect/ mode
  (sis-global-respect-mode t)
  ;; enable the /context/ mode for all buffers
  (sis-global-context-mode t)
  ;; enable the /inline english/ mode for all buffers
  (sis-global-inline-mode t)
  )

截图: 2021-05-19 18.41.04

PS: 我的INPUT_SOURCE_ID不对导致的, 使用正确的INPUT_SOURCE_ID即可

大佬们可不可以让我白嫖一个fcitx5-rime的设置瞅瞅(

要直接用 fcitx5 的话,fcitx5 只设置有一个 Rime 是不行的,还需要再添加一个默认键盘放上面……(从 tg 群看到,楼层有点高了,便在这里回复

@goumao 大哥,我现在有一个问题: 在Lean和Agda这些语言里需要输入unicode,所以这些语言的mode有自己的输入法用来输入unicode,比如agda-mode下我可以设置输入法为Agda,就可以用“\”加上一些记号输入unicode符号

现在有个问题是,配合sis使用evil后,在agda-mode下,切换evil的normal模式和edit模式后,原本输入法是Agda被sis设置成原生的英语,就无法输入unicode了,只好手动重新设置输入法为Agda 这样就很麻烦。请问怎么能解决这个问题呢?

把 agda-mode 下 sis-english-source 设置成 agda-mode?

sis-english-source不该是一个input method switcher返回的值吗?我先试试

打错了抱歉 设置成你想要的输入法

在配置里加了这么一句:

(add-hook 'lean-mode-hook
   (lambda () (setq-default sis-english-source "Lean")))

但是没有效果,在lean-mode里sis-english-source被设置成了Lean,但切换evil的模式时输入法不会切到Lean,而且有时会奇怪地切到fcitx5中文输入法(我的外界输入法是fcitx5)。 sis的全部配置是:

(use-package sis
  ;;:hook
  ;; enable the /follow context/ and /inline region/ mode for specific buffers
  ;;(((text-mode prog-mode) . sis-context-mode)
  ;; ((text-mode prog-mode) . sis-inline-mode))


  :config
  (sis-ism-lazyman-config "1" "2" 'fcitx5)
  ;; enable the /cursor color/ mode
  (sis-global-cursor-color-mode t)
  ;; enable the /respect/ mode
  (sis-global-respect-mode t)
  ;; enable the /follow context/ mode for all buffers
  (sis-global-context-mode t)
  ;; enable the /inline english/ mode for all buffers
  (sis-global-inline-mode t)
  )

如何解决呢…