laishulu/emacs-smart-input-source

dashboard 中 prefix键不能切换中英文

dian-yu-luo opened this issue · 50 comments

在dashboard 这个buffer 中使用类似C-c 或者C-x的prefix键,没有从中文切换成英文,但是在其他buffer,正常,而且evil 在buffer 中按Esc也能正常切换

试试?

(add-to-list sis-prefix-override-recap-triggers 'dashboard-mode)

甚至不能执行 ,产生这样的报错
progn: Wrong type argument: symbolp, (evil-local-mode yas-minor-mode)

你把无关的配置删掉,
贴个能重现问题的最小配置过来。
我本地跑一下看是什么原因。

(use-package dashboard
  :ensure t
  :bind
  (("C-c d" . 'dashboard-refresh-buffer))
  :config
  (dashboard-setup-startup-hook)  
  (defun read-lines (filePath)
    (with-temp-buffer
      (insert-file-contents filePath)
      (split-string (buffer-string) "\n" t)))
  (setq dashboard-footer-messages (read-lines "~/.emacs.d/learning/emacs/dairy/tipoftheday.org"))
  (add-hook 'dashboard-mode-hook 'sis-set-english) 
  (setq dashboard-banner-logo-title "hello , dianyuluo")
  (define-key dashboard-mode-map (kbd "t") 'org-todo-list)
  (define-key dashboard-mode-map (kbd "q") 'delete-window)
  (define-key dashboard-mode-map (kbd "/") 'evil-search-forward)
  (define-key dashboard-mode-map (kbd "C-x C-s") #'ignore)
  (when window-system
    (setq dashboard-set-navigator t)
    (setq dashboard-set-heading-icons t)
    (setq dashboard-set-file-icons t)
    (setq dashboard-footer-icon (all-the-icons-octicon "dashboard"
                                                       :height 0.9
                                                       :v-adjust -0.05
                                                       :face 'font-lock-keyword-face))
    (setq dashboard-startup-banner "~/.emacs.d/learning/emacs/dianyuluo.png"))
  (setq dashboard-items '((recents . 7)
                          (projects . 5))))


(use-package sis
:bind
(("C-SPC . 'sis-set-other"))
:config
(setq sis-english-source nil)
(setq sis-other-source t)
(setq sis-do-get #'w32-get-ime-open-status)
(setq sis-do-set #'w32-set-ime-open-status)
(sis-global-respect-mode t)
(sis-global-context-mode t)) 




我慢慢研究一下。

我看了下你的配置,
问题不是出在dashboard上,和dashboard没关系。
是你在use-packge的时候,bind了。
use-package里面这行代码,修改了映射表。
https://github.com/jwiegley/use-package/blob/0ad5d9d5d8a61517a207ab04bf69e71c081149eb/bind-key.el#L136

我之前给的解决办法应该是可以的,
#52 (comment)

但是我写的有点小问题,应该是:

(add-to-list 'sis-prefix-override-recap-triggers 'dashboard-mode)

这个问题不只我一个人遇到,这个解决方案是不可以的,另外在尝试把bind删除也不行

啊,你用我最新给的代码也不行么?

(add-to-list 'sis-prefix-override-recap-triggers 'dashboard-mode)

不出错,但是没有效果?

是的

能问一下sis 按下prefix键就能切换英文的思路吗,是给谁加了hook

你手工执行 (sis--prefix-override-recap-do)看看?

sis--prefix-override-recap-do不是命令,需要带括号执行代码。

能问一下sis 按下prefix键就能切换英文的思路吗,是给谁加了hook

(defun sis--prefix-override-recap-do ()

仍旧不可以

#+begin_src elisp
  (add-to-list 'sis-prefix-override-recap-triggers 'dashboard-mode)
  (sis--prefix-override-recap-do)
#+end_src

#+RESULTS:
| sis--prefix-override-map-alist | evil-mode-map-alist | yas--direct-keymaps | ((override-global-mode keymap #^[nil nil keymap nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil])) |


下次我这里弄个干净的环境再看看。

我基本不会用emacs,
如果没有evil的话,😂

不是, (sis--prefix-override-recap-do)我是让你在emacs起来后,自己在emacs手工执行一下。

啥叫手工执行,从 scratch 里C-x C-e?

在emacs屏幕底端的命令栏输入代码。

和 orgmode里的src block 里执行效果是一致 的

dashboard的代码我看过,没有冲突。

你加个after 配置呢?

(use-package sis
:bind
(("C-SPC . 'sis-set-other"))
:after
(dashboard)
:config
(add-to-list 'sis-prefix-override-recap-triggers 'dashboard-mode)
(setq sis-english-source nil)
(setq sis-other-source t)
(setq sis-do-get #'w32-get-ime-open-status)
(setq sis-do-set #'w32-set-ime-open-status)
(sis-global-respect-mode t)
(sis-global-context-mode t)) 

还有,你(add-to-list 'sis-prefix-override-recap-triggers 'dashboard-mode)要放在config里面啊。
你放在code block里面执行当然不行啊。
你照我刚才的配置试试。

您是在win环境下做了实验了吗?
应该和载入顺序没有关系,因为用esc退出到evil里能正常切换英文 , 其实dashboard就算零配置,也会有问题 .
我是放到config里的,我以为你要看效果,和返回值,拿出来执行了一下

sis在init的时候,要做很多工作的。

你进了emacs之后,init都已经过了。

我没有win环境,得用虚拟机。

关系不大吧。

你也用的evil?那你用doom么?
如果是的话,你弄个doom下的最小配置吧,

跟windows应该关系不大。
我在macos下试试。

刚把整个dashboard停掉,进入了emacs的初始面板,就是啥也没配置的情况下,新手用户看的那个,惊讶的发现,也是失效的

因为用esc退出到evil里能正常切换英文

截取C-c这些prefix键,和evil里面切换是不同的部分。

刚把整个dashboard停掉,进入了emacs的初始面板,就是啥也没配置的情况下,新手用户看的那个,惊讶的发现,也是失效的

那我看看我这里doom自己的dashboard是什么情况。

我这里也是这样。。。

我这算不算发现重大bug

好像并不确定。。。。
我这里sis根本就不工作。😄
前几天才把emacs从27升级到28
不知道哪里出岔子了。

我再慢慢确认吧。
如果doom的dashboard可以重现问题,那是最好解决的。

你也用的doom吗?
我这里config部分不自动执行

(use-package! sis
  ;; should after doom-theme, or cursor color will not be retained.
  :after (evil tmux-pane doom-theme)
  :config
  (delete "C-h" sis-prefix-override-keys)
  (sis-global-respect-mode t)
  (sis-global-inline-mode t)
  (sis-global-context-mode t)
  (sis-global-cursor-color-mode t))

不知道是不是doom的use-package!机制变了。 😂😂😂😂

我不用doom,应该是28 的原因,我印象里27.2好像没问题

搞定了,是因为doom新版的不兼容更新。

晚上有空我再看看dashboard的问题。

找到原因了。。。。

你dashboard的buffer name,是不是*开头?

(defvar sis-prefix-override-buffer-disable-predicates

*开头的一般是特殊用途的special buffer,
一般都不可编辑,而多层跳转比较多,
对prefix键做魔改容易出问题,
所以,有意地disable了

(and (sis--string-match-p "^\*" (buffer-name buffer))

图片

并列的位置, 加上下面的设置(如果你的dashboard叫做:*dashboard* )就行了。
              (not (sis--string-match-p "^\*dashboard\*"
                                        (downcase (buffer-name buffer))))

如果问题解决的话,
请在emacschina论坛上你的问题后加入这个issue的链接,
方便别人按图索骥

没问题了,但是您能直接从源码里稍微做些把这些代码加上吗?

当然不会在源码中加啊,
你这个需求太个人化了。

而且,本来也不用在源码中加,
这块的配置是放开的。
自己配置这个变量就行了。
sis-prefix-override-buffer-disable-predicates

我前面说的本意,也是让你在config中配置,
我在这里:#52 (comment)
把变量名都给你了。。。
你是直接去改sis的代码了么?😂

保姆级的代码是,在你的sis package config中,
加入下面的代码:

(setq sis-prefix-override-buffer-disable-predicate
  (list 'minibufferp
        (;; magit
         lambda (buffer)
         (sis--string-match-p "^magit.*:" (buffer-name buffer)))
        (;; special buffer
         lambda (buffer)
         (and (sis--string-match-p "^\*" (buffer-name buffer))
              (not (sis--string-match-p "^\*new\*"
                                        (downcase (buffer-name buffer))))
              (not (sis--string-match-p "^\*dashboard\*"
                                        (downcase (buffer-name buffer))))
              (not (sis--string-match-p "^\*scratch\*"
                                        (downcase (buffer-name buffer))))))))

非常感谢,但是还是说一下,用dashboard做初始面板的人不少. 如果没有太多冲突的话,推荐从源码里加上这部分

在此感谢您的帮助,这两天麻烦了

可以考虑,在加入代码之前,多问一下:
dashboard作为一个启动面板,
1)进去之后难道不是移动几下光标,回车一下打开文件这种么?
为什么会有这个需求?
2)dashboard的精确buffer name是什么?

默认情况下 进入emacs是中文进入的, 虽然可以设置成启动进入英文
但是因为我的emacs配置问题,启动时间有点长,我会把emacs放到后台启动,切换窗口的时候会进入中文状态
然后经常的切换频繁dashboard, 不可避免的用到prefix键

  1. 不大清楚,modeline里显示的是这个
    图片

dashboard不是仅打开后使用一次的?
而是相当于控制中心,干完别的事就切回到dashboard?

我是这么干的,除了recent open buffer list ,还可以查看agenda view ,

那确实值得特别对待一下,
如果只是启动的时候用一下,就没必要了。

刚提交的代码把这块内置了。

我会把emacs放到后台启动,切换窗口的时候会进入中文状态

还是有点不理解啊。
切换窗口的时候为什么会进入中文状态?

sis会记住每个buffer的输入,
你从别的地方切回到dashboard时,
应该输入法也切回来的。

你那里不会么?

窗口指的是windows窗口,例如浏览器,vscode的窗口,因为windows下emacs的启动时间比较长,我会先把emacs 放到后台(alt+tab)切换成去他程序,
此外ime 的接口处理效果应该是切换当前任务管理器 foucs 的窗口,
所以等到emacs启动好了之后,切换窗口回到emacs,仍旧为中文

sis本身在设计上来说,
当emacs重新获取窗口焦点的时候,
会恢复emacs当前buffer的输入法。

所以如果你emacs的buffer之前是英文的话,
不出问题的话,应该是要自动切到英文的。

代码里的这一块:

(defun sis--respect-focus-change-advice ()

(;; read only buffer

dashboard 的buffer是read-only的所以会被判定disable