Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Minor mode for caret browsing #349

Closed

Conversation

HollowMan6
Copy link
Contributor

Add minor mode for caret browsing.

Signed-off-by: Hollow Man hollowman186@vip.qq.com

Signed-off-by: Hollow Man <hollowman186@vip.qq.com>
@HollowMan6
Copy link
Contributor Author

现在似乎在minor mode中无法覆盖eaf-browser-keybinding中定义的按键,理论上minor mode的优先级比较高应该可以,但是不知道为什么不能,还望赐教 @manateelazycat @MatthewZMD

@manateelazycat
Copy link
Member

你定义了minor mode,但是没有在当前buffer切换mode导致的

Comment on lines +812 to +813
(eaf-browser-caret-mode 1)
(eaf-browser-caret-mode 0)))
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

你定义了minor mode,但是没有在当前buffer切换mode导致的

@manateelazycat Hmm,我这两行代码是用来判断切换mode的,我觉得应该不是因为没有在当前buffer切换mode导致的。我现在PR按照当前minor mode的Key配置运行完全没有问题,因为它们在eaf-browser-keybinding都没有定义。但是要是将其中一个换成eaf-browser-keybinding中已经有定义的按键,进入minor mode之后就会发现这个按键没有被覆盖

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

请先查看我写的 multi-term.el https://github.com/manateelazycat/multi-term/blob/master/multi-term.el#L752

把 caret-mode 改成类似 term-bind-key-alist 的按键列表

  • 激活 caret mode 的时候,遍历 caret key list,用 define-key 强制重新设置按键
  • 退出 caret mode 的时候,遍历 eaf-browser-keybinding ,强制重新设置浏览器默认的按键

通过这样的方法应该可以强制让冲突的按键生效。

@manateelazycat
Copy link
Member

@MatthewZMD 有什么想法吗?

@MatthewZMD
Copy link
Member

周末在外面,不急就等我回去看看

@manateelazycat
Copy link
Member

周末在外面,不急就等我回去看看

不急,我最近在用平板,没设备测试 :(

Comment on lines +812 to +813
(eaf-browser-caret-mode 1)
(eaf-browser-caret-mode 0)))
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

请先查看我写的 multi-term.el https://github.com/manateelazycat/multi-term/blob/master/multi-term.el#L752

把 caret-mode 改成类似 term-bind-key-alist 的按键列表

  • 激活 caret mode 的时候,遍历 caret key list,用 define-key 强制重新设置按键
  • 退出 caret mode 的时候,遍历 eaf-browser-keybinding ,强制重新设置浏览器默认的按键

通过这样的方法应该可以强制让冲突的按键生效。

@manateelazycat
Copy link
Member

@HollowMan6 试一下我说的方法,具体细节看上一条评论。

@MatthewZMD
Copy link
Member

MatthewZMD commented Jul 28, 2020

我更新了系统后qtwebengine又出问题了,这次降到5.14也不行,哎。短时间可能测不了了。

@HollowMan6
Copy link
Contributor Author

@HollowMan6 试一下我说的方法,具体细节看上一条评论。

我刚刚试了一下,请问define-key应该指定修改哪一个Map呢?我指定为eaf-mode-map*结果整个Emacs卡死,不知道是什么情况,而且eaf-mode-map*似乎是EAF全局的map。

因而,随后我按照注释转而使用eaf-bind-key修改eaf-browser-keybinding,但是发现这只有在新打开的buffer中才会生效,而且这样会有很大的问题,因为这样修改生效的是所有eaf-browser buffers,我可能同时开两个buffer,其中一个使用caret mode,另外一个不使用,这样修改会使得另一个不使用caret mode的buffer也使用caret mode的按键配置了。

我觉得导致在minor mode中无法覆盖eaf-browser-keybinding中定义的按键可能和EAF按键动态绑定机制有关,具体原因还在研究中。

@MatthewZMD
Copy link
Member

我刚刚试了一下,请问define-key应该指定修改哪一个Map呢?我指定为eaf-mode-map*结果整个Emacs卡死,不知道是什么情况,而且eaf-mode-map*似乎是EAF全局的map。

因而,随后我按照注释转而使用eaf-bind-key修改eaf-browser-keybinding,但是发现这只有在新打开的buffer中才会生效,而且这样会有很大的问题,因为这样修改生效的是所有eaf-browser buffers,我可能同时开两个buffer,其中一个使用caret mode,另外一个不使用,这样修改会使得另一个不使用caret mode的buffer也使用caret mode的按键配置了。

我觉得导致在minor mode中无法覆盖eaf-browser-keybinding中定义的按键可能和EAF按键动态绑定机制有关,具体原因还在研究中。

可以参考一下EAF的动态绑定是怎么实现的,试着调整并利用一下eaf--gen-keybinding-map

@HollowMan6
Copy link
Contributor Author

可以参考一下EAF的动态绑定是怎么实现的,试着调整并利用一下eaf--gen-keybinding-map

OK

@manateelazycat
Copy link
Member

@HollowMan6 试一下我说的方法,具体细节看上一条评论。

我刚刚试了一下,请问define-key应该指定修改哪一个Map呢?我指定为eaf-mode-map*结果整个Emacs卡死,不知道是什么情况,而且eaf-mode-map*似乎是EAF全局的map。

因而,随后我按照注释转而使用eaf-bind-key修改eaf-browser-keybinding,但是发现这只有在新打开的buffer中才会生效,而且这样会有很大的问题,因为这样修改生效的是所有eaf-browser buffers,我可能同时开两个buffer,其中一个使用caret mode,另外一个不使用,这样修改会使得另一个不使用caret mode的buffer也使用caret mode的按键配置了。

我觉得导致在minor mode中无法覆盖eaf-browser-keybinding中定义的按键可能和EAF按键动态绑定机制有关,具体原因还在研究中。

试一下 (current-local-map) 这个函数在运行时动态获取当前 buffer 的 keymap.

@HollowMan6
Copy link
Contributor Author

HollowMan6 commented Jul 28, 2020

试一下 (current-local-map) 这个函数在运行时动态获取当前 buffer 的 keymap.

和指定为eaf-mode-map*的一样都会发生Emacs假死,具体表现为,当按下M-c进入caret模式后,按下eaf-browser-caret-mode-keybinding中没有定义的按键没任何问题,按下定义的按键后,输入框中输入了一个字符e(尽管我按的按键不是e),然后整个Emacs图形界面没有任何反应,必须手动kill进程。

image

我改动的代码如下:

(defcustom eaf-browser-caret-mode-keybinding
  '(("w" . "eaf-caret-previous-line")
    ("s" . "eaf-caret-next-line")
    ("d" . "eaf-caret-next-character")
    ("a" . "eaf-caret-previous-character")
    ("W" . "eaf-caret-to-top")
    ("S" . "eaf-caret-to-bottom")
    ("A" . "eaf-caret-previous-word")
    ("D" . "eaf-caret-next-word")
    ("/" . "eaf-caret-search-forward")
    ("?" . "eaf-caret-search-backward")
    ("C-o" . "eaf-caret-toggle-mark")
    ("C-." . "eaf-caret-clear-search"))
  "The keybinding of EAF Browser Caret Mode."
  :type 'cons)

(defun eaf--toggle-caret-browsing (caret-status)
  (if caret-status
      (eaf-caret-keystroke-setup)
      (eaf--gen-keybinding-map eaf-browser-keybinding)))

(defun eaf-caret-keystroke-setup ()
  (let (bind-key bind-command)
    (cl-dolist (element eaf-browser-caret-mode-keybinding)
      (setq bind-key (car element))
      (setq bind-command (cdr element))
      (cond
       ((stringp bind-key) (setq bind-key (read-kbd-macro bind-key)))
       ((vectorp bind-key) nil)
       (t (signal 'wrong-type-argument (list 'array bind-key))))
      (define-key (current-local-map) bind-key bind-command))))

不清楚为何会发生这种情况。。。

@manateelazycat
Copy link
Member

试一下 (current-local-map) 这个函数在运行时动态获取当前 buffer 的 keymap.

和指定为eaf-mode-map*的一样都会发生Emacs假死,具体表现为,当按下M-c进入caret模式后,按下eaf-browser-caret-mode-keybinding中没有定义的按键没任何问题,按下定义的按键后,输入框中输入了一个字符e(尽管我按的按键不是e),然后整个Emacs图形界面没有任何反应,必须手动kill进程。

image

我改动的代码如下:

(defcustom eaf-browser-caret-mode-keybinding
  '(("w" . "eaf-caret-previous-line")
    ("s" . "eaf-caret-next-line")
    ("d" . "eaf-caret-next-character")
    ("a" . "eaf-caret-previous-character")
    ("W" . "eaf-caret-to-top")
    ("S" . "eaf-caret-to-bottom")
    ("A" . "eaf-caret-previous-word")
    ("D" . "eaf-caret-next-word")
    ("/" . "eaf-caret-search-forward")
    ("?" . "eaf-caret-search-backward")
    ("C-o" . "eaf-caret-toggle-mark")
    ("C-." . "eaf-caret-clear-search"))
  "The keybinding of EAF Browser Caret Mode."
  :type 'cons)

(defun eaf--toggle-caret-browsing (caret-status)
  (if caret-status
      (eaf-caret-keystroke-setup)
      (eaf--gen-keybinding-map eaf-browser-keybinding)))

(defun eaf-caret-keystroke-setup ()
  (let (bind-key bind-command)
    (cl-dolist (element eaf-browser-caret-mode-keybinding)
      (setq bind-key (car element))
      (setq bind-command (cdr element))
      (cond
       ((stringp bind-key) (setq bind-key (read-kbd-macro bind-key)))
       ((vectorp bind-key) nil)
       (t (signal 'wrong-type-argument (list 'array bind-key))))
      (define-key (current-local-map) bind-key bind-command))))

不清楚为何会发生这种情况。。。

去掉 (define-key map (vector 'remap #'self-insert-command) #'eaf-send-key) 这句试一下,在 eaf.el 中

@HollowMan6
Copy link
Contributor Author

去掉 (define-key map (vector 'remap #'self-insert-command) #'eaf-send-key) 这句试一下,在 eaf.el 中

还是一样的问题继续,而且这样之后即使不在caret模式中eaf-browser-caret-mode-keybinding这几个定义的按键也无法输入了。

@manateelazycat
Copy link
Member

去掉 (define-key map (vector 'remap #'self-insert-command) #'eaf-send-key) 这句试一下,在 eaf.el 中

还是一样的问题继续,而且这样之后即使不在caret模式中eaf-browser-caret-mode-keybinding这几个定义的按键也无法输入了。

假死一般是陷入无限循环导致的,暂时没油头绪

@HollowMan6
Copy link
Contributor Author

假死一般是陷入无限循环导致的,暂时没油头绪

这个BUG很奇怪,当按下eaf-browser-caret-mode-keybinding中定义按键,都会输入一个字符e然后假死

@loyalpartner
Copy link
Contributor

loyalpartner commented Jul 30, 2020

我有一个想法,结合 marker 使用 caret, 可以用 marker 快速选中 <p> <span> 这些标签对的文本,这时候激活caret mode, 然后再调整,对于选取句子这种情形,可以省去前面查找的步骤

@manateelazycat
Copy link
Member

我有一个想法,结合 marker 使用 caret, 可以用 marker 快速选中

这些标签对的文本,这时候激活caret mode, 然后再调整,对于选取句子这种情形,可以省去前面查找的步骤

好主意,要不是每次充顶部开始,或者鼠标点一下,不方便

@HollowMan6
Copy link
Contributor Author

我有一个想法,结合 marker 使用 caret, 可以用 marker 快速选中

这些标签对的文本,这时候激活caret mode, 然后再调整,对于选取句子这种情形,可以省去前面查找的步骤

Nice,好主意!用 marker 选中文本这块可以独立出来,我后面可以看看,把这块做出来

@HollowMan6
Copy link
Contributor Author

用 marker 快速选中

这些标签对的文本

已在#357 中为marker提交了patch

@loyalpartner
Copy link
Contributor

loyalpartner commented Jul 31, 2020

兄弟,你试试

(defun eaf-caret-keystroke-setup ()
  (setq eaf-mode-map
        (let ((map (make-sparse-keymap))
              bind-key bind-command)
          (set-keymap-parent map eaf-mode-map*)
          (cl-dolist (element eaf-browser-caret-mode-keybinding)
            (setq bind-key (car element))
            (setq bind-command (cdr element))
            (cond
             ((stringp bind-key) (setq bind-key (kbd bind-key)))
             ((vectorp bind-key) nil)
             (t (signal 'wrong-type-argument (list 'array bind-key))))
            (define-key map bind-key bind-command))
          map)))

@HollowMan6
Copy link
Contributor Author

兄弟,你试试

(defun eaf-caret-keystroke-setup ()
  (setq eaf-mode-map
        (let ((map (make-sparse-keymap))
              bind-key bind-command)
          (set-keymap-parent map eaf-mode-map*)
          (cl-dolist (element eaf-browser-caret-mode-keybinding)
            (setq bind-key (car element))
            (setq bind-command (cdr element))
            (cond
             ((stringp bind-key) (setq bind-key (kbd bind-key)))
             ((vectorp bind-key) nil)
             (t (signal 'wrong-type-argument (list 'array bind-key))))
            (define-key map bind-key bind-command))
          map)))

使用这个代码之后,eaf-browser-caret-mode-keybinding中新定义的按键完全没有起作用,无论此按键在eaf-browser-keybinding定没有定义。另外eaf.el注释里说明了不要直接修改eaf-mode-map,我认为这是Minor Mode无法覆盖或者出现假死的原因,与EAF动态绑定按键有关,具体还没有头绪。不过还是谢谢你!:)

Signed-off-by: Hollow Man <hollowman186@vip.qq.com>
@HollowMan6 HollowMan6 force-pushed the eaf-browser-caret-minor-mode branch from 2a60589 to cfb3bb9 Compare August 1, 2020 03:31
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants