有在非指定map运行命令的方法吗,比如helm

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    |
         |<-----------------/
         |
         |

我觉得有两个思路:

  1. 实现一个 helm-XXX-minor-mode,当 helm 窗口关闭之后,启动这个 mode 继续控制按键。
  2. 把 helm 窗口尽可能最小化(我不知道能小到什么程度,最好是完全隐藏),视觉上关闭 helm,实际它仍然在工作。

无论如何,最后都需要一个额外的消息,告诉 helm:这回真的退出了,把控制权交还给编辑区 buffer


EDIT:

  • helm-ag-find-{next,prev} 配合 hydra 应该就可以实现本回复第二部分所描述效果:回到编辑状态之后的便捷跳转。参考:大家有没试过按 ctrl 按到手指痛?#18

  • 楼主需要一个更清晰的标题,例如:

    《如何在 helm-ag 窗口关闭之后继续跳转?》

2 个赞