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

emacs -q 的时候复现。这是我的配置。

(use-package smart-input-source
  :ensure t
  :config
  (setq smart-input-source-external-ism "fcitx5-remote")
  (setq smart-input-source-english-input-source "2")
  (setq-default smart-input-source-other-input-source "1")
  (setq smart-input-source-do-get-input-source
        (lambda()
          (string-trim
           (shell-command-to-string
            smart-input-source-external-ism))))
  (setq smart-input-source-do-set-input-source
        (lambda(source)
          (pcase source
            ("1" (string-trim (shell-command-to-string
                               (concat smart-input-source-external-ism " -c"))))
            ("2" (string-trim (shell-command-to-string
                               (concat smart-input-source-external-ism " -o")))))))
  (smart-input-source-global-auto-english-mode t)
  (add-hook 'text-mode-hook #'smart-input-source-remember-input-source-mode)
  (add-hook 'prog-mode-hook #'smart-input-source-remember-input-source-mode)
  (add-hook 'text-mode-hook #'smart-input-source-follow-context-mode)
  (add-hook 'prog-mode-hook #'smart-input-source-follow-context-mode)
  (add-hook 'text-mode-hook #'smart-input-source-inline-english-mode)
  (add-hook 'prog-mode-hook #'smart-input-source-inline-english-mode))

(use-package company
  :ensure t
  :init
  (global-company-mode))

Peek 2020-06-17 14-50

(defun ret-check-to-deactivate-inline-overlay ()
  "Deactivate the inline english region overlay."
  (interactive)

  (when (and inline-english-mode (overlayp -inline-overlay))
    ;; company
    (if (and (featurep 'evil)
             (company--active-p))
        (company-complete-selection)
      (deactivate-inline-overlay))))

:no_mouth: 唔…

 (if (and (featurep 'evil)
             (company--active-p))

是的,还有brew,git,等等,仅仅git一个昨天就遇到三种不同的错误。

国内的melpa源好像怎么设置都不能用,我在mac下用的是baacloud,设置成「全局模式」,浏览器访问gogole和yuotube可以,但软件源在国外的仍然是能联通的时间少,断线的时间多。

谢谢支招啊!

@BlindingDark

你不是在evil模式下啊?
活捉一个不用evil的,
请一定多多反馈其它不兼容的情况!

我自己从来没有在原生模式下用过,
所有的兼容的情形,都是脑子中假想的
我是从vim跳过来的,
原生模式我只会 c-x c-cm-x两个快捷键 :joy:

我改下代码~~~~

那些只是帮你设置了全局模式的proxy而已,没用的。

你需要基于tun/tap的vpn。
我给你推荐:
mac上有个叫做surge的软件,
你选他的增强模式就可以了。
命令行git brew等也是有效的。

不过surge只是个客户端,
你还是需要买账号的。

@BlindingDark 已修正。等melpa更新吧~~

:laughing: 我本地已经改了

other

发现一个问题,如下测试文本

english 测试

当光标在空格位置时,按空格出现 -not-other-p 函数为空?

光标位置在 字上时,按空格正常

大佬能否再加一个功能,当按下 M-xC-x C-f 等 进入minibuffer时 自动变成英文输入 因为在minibuffer里一般是用来输入命令,中文输入较少

已修正,等melpa更新

你也是用的原生emacs,不是evil?
evil用户都是escape到英文状态下,再执行命令,所以没这个问题。
这个package对非evil用户的考虑还不够完善
我研究一下minibuffer的问题。

对,我不习惯evil 我加了个 minibuffer-setup-hook 后,进入minibuffer 可以变成英文输入状态 但是C-g 取消后 返回原 buffer 不能恢复原输入法状态

  (add-hook 'minibuffer-setup-hook
	  (lambda()
	    (smart-input-source-set-input-source-english)))
  )

@emacle

一看就不是萌新,给你一点线索,你自己肯定能搞定:

add-to-list 一些hook: minibuffer-setup-hook, minibuffer-exit-hook到这里面去
试验好了请反馈回来,我更新到代码里。

我实在是不会用原生模式,没有办法自己测试。

  (add-to-list 'smart-input-source-save-input-source-hook-triggers 'minibuffer-setup-hook)
  (add-to-list 'smart-input-source-restore-input-source-hook-triggers 'minibuffer-exit-hook)
  (add-hook 'minibuffer-setup-hook
	  (lambda()
	    (smart-input-source-set-input-source-english)))

是这样写吗?退出minibuff时 还是没法恢复原输入状态

我是真菜鸟啊,大佬的世界我真不懂

我加了个全局变量 smart-input-source-before-minibuffer 进入前记录一下输入状态,如果是中文切换,退出minibuff时根据全局变量恢复,但是C-h h弹出 help buffer时 好像不记录了输入状态了

  ;; 进入minibuffer 自动切换英文
  (add-hook 'minibuffer-setup-hook
  	    (lambda()
	      (setq smart-input-source-before-minibuffer (smart-input-source--get-input-source))
	      (if (not (string= smart-input-source-english-input-source smart-input-source-before-minibuffer))
		  (smart-input-source-set-input-source-english)
		)
	      )
	    )

  (add-hook 'minibuffer-exit-hook
  	    (lambda()
	      (if (not (string= smart-input-source-english-input-source smart-input-source-before-minibuffer))
		  (smart-input-source-set-input-source-other)
		)
	      )
	    )

现在可以切换了,问下如何实现无论中英文状态,我希望进入insert都切换为我的Rime输入法,而不是usa

1 个赞

把follow-context-mode 打开,同时

(setq-default smart-input-source-fixed-context smart-input-source-OTHER)

这个是对所有buffer生效。 对单个buffer的话,在buffer里面执行:

(setq smart-input-source-fixed-context smart-input-source-OTHER)

可以麻烦远程知道以下吗?一直无法成功

首先确保已经升级到最新版。
这个功能是今天才加的。
最好:

  • 直接进到目录里面,git pull到最新版
  • 在相关的目录里,删除字节码elc文件。