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

我使用helm-ag 搜索文本内容.当键入关键词后,会列出来一堆匹配内容.此时我可以按快捷键进行浏览跳转.但是一旦这个helm-minibuffer关闭之后,之前的快捷键浏览就失效了.像vim那个quickfix,即使quickfix隐藏关闭了,跳转的快捷键还是有效的.因为下面开着一个minibuffer,既占地方,又影响视线.有没有办法,搜索结果出来后,可以选择把minibuffer隐藏掉,然后用快捷键自由的进行向前向后的浏览的方法.

ivy 有 ivy-occur,helm 应该也有 helm-occur。 哦理解错误,你意思是不要显示搜索结果还想跳转。

听起来像isearch的行为,isearch不可以吗

如果是单个文件,evil模式/搜索,然后在normal-state下按n或者N就能跳转,如果是多个文件,不知道有什么好的解决方式,想法是记录搜索结果列表的每一个action,然后自定义按键跳转到下一个action并执行

没看明白你的问题,尤其是标题。

Helm 有 Resume 的功能(Ivy 也有),见 M-x helm-resume,加一个 C-u 会列出所有的 Helm Session。如果常用 Helm 的话,这个应该是必会命令。

他说的应该是 :cn(ext):cp(revious) 命令。

就是这个😂,helm minibuffer必须开着,一旦关了,就不行了

如果用ivy-occur或者occur的话,在window关闭之后可以用M-x next-error或者M-x previous-error来跳转

是啊,不然会很不方便感觉

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 个赞