helm 激活之后,按键消息是由 helm 创建出来的 session buffer 接收,一旦 session buffer 关闭,按键的控制权又还给编辑区的 buffer。
而 session buffer 并没有立即销毁(即便销毁也无虞,可在退出之前另存副本),可以通过 helm-resume
召回,也可以自行写代码来访问:
(defun helm-ag-find-next (&optional n)
(interactive)
(let* ((helm-current-buffer (get-buffer "*helm-ag*")))
(with-helm-current-buffer
(forward-line (or n 1))
(helm-ag--action-find-file
(buffer-substring-no-properties (point-at-bol) (point-at-eol))))))
(defun helm-ag-find-prev ()
(interactive)
(helm-ag-find-next -1))
以上可在回到编辑状态之后继续跳转。(我没有仔细研究 helm,也许有更简单的方法。)
如果想在回到编辑状态之后,依然使用 helm 激活时的快捷键(假设为 C-n/p
)。那么就必须实现一个临时的模式/状态。既隐藏 helm 窗口,同时仍然掌控按键:
------------ --------------
[ major-mode ] [ helm visible ]
------------ --------------
| |
| |
| start helm |
|--------------------------------------->|
C-n/p | | C-n/p
上/下行 | ------------- | 前/后跳转
| [ helm hidden ] |
| ------------- |
| | |
| | hide helm |
| |<--------------------/
| |
| | C-n/p
| | 前/后跳转
| exit helm |
|<-----------------/
|
|
我觉得有两个思路:
- 实现一个
helm-XXX-minor-mode
,当 helm 窗口关闭之后,启动这个 mode 继续控制按键。 - 把 helm 窗口尽可能最小化(我不知道能小到什么程度,最好是完全隐藏),视觉上关闭 helm,实际它仍然在工作。
无论如何,最后都需要一个额外的消息,告诉 helm:这回真的退出了,把控制权交还给编辑区 buffer。
EDIT:
-
helm-ag-find-{next,prev}
配合 hydra 应该就可以实现本回复第二部分所描述效果:回到编辑状态之后的便捷跳转。参考:大家有没试过按 ctrl 按到手指痛?#18 -
楼主需要一个更清晰的标题,例如:
《如何在 helm-ag 窗口关闭之后继续跳转?》