如何在helm-find-files中按<RET>打开目录?


25

当我运行#'helm-find-files,然后将<ret>指针移到目录时,按会导致以Dired模式打开该目录。必须按下C-j才能在Helm中输入该目录。

我想像这里一样<RET>行事C-j,但不一定要在其他地方行事。我检查了,并C-j绑定到#'helm-maybe-exit-minibuffer,而<RET>绑定到#'helm-execute-persistent-action。绑定<RET>#'helm-maybe-exit-minibuffer适用于这种情况,但会破坏其他情况:例如,中的舵自动完成describe-function

因此,当使用Helm查找文件时,如何<RET>在Helm中按打开该目录?


1
@TuDo我习惯了ido-mode,在其中按<RET>选择文件夹以在其中查找文件。我认为这是尝试查找文件时最一致的行为-发现文件打开后要执行的操作;找到文件夹后要做的是将其放入其中,以便可以找到文件。
zck 2014年

2
Helm具有相反的行为-在文件上时,<RET>自动完成选择。您无需点击<tab>即可完成文件名的填写。但是我们正在争论首选项-我只希望“输入”的意思是“选择要点”。而对我来说,这并不意味着“敞开的方向”。如果我在外壳中,则期望有不同的行为。
zck

4
我在这里使用zck,在使用ido多年后(那里最期望的动作正在逐渐深入),那里的肌肉记忆就在那里,这是习惯掌舵时的主要痛点。此后,我改用向右箭头键进行向下钻取(花了大约一周时间习惯)
ustun 2014年

1
我也和zck在一起。与舵手标准行为相比,在ido中导航要直观得多。特别是退格键。如果未插入任何内容,它将从搜索中删除一个字符或跳回到文件夹中。有没有一种方法可以重新连接按键以获得此功能?
2015年

1
Helm 2.6.1开始,所需的行为是默认行为。
amitp

Answers:


19

我也用ido-mode很多时间并训练了我的肌肉记忆力:)我认为这种ido风格比这种helm方法更直观。我搜索东西(输入一些字符)并提交给find(命中RET),就像Web浏览器的搜索/地址栏一样。如果选择的是目录,则输入该目录,然后再次在该目录中搜索。这对我来说似乎很自然,所以我写了一个小建议helm-execute-persistent-action来强迫这个机制。

(require 'helm)
(defun fu/helm-find-files-navigate-forward (orig-fun &rest args)
  (if (and (equal "Find Files" (assoc-default 'name (helm-get-current-source)))
           (equal args nil)
           (stringp (helm-get-selection))
           (not (file-directory-p (helm-get-selection))))
      (helm-maybe-exit-minibuffer)
    (apply orig-fun args)))
(advice-add 'helm-execute-persistent-action :around #'fu/helm-find-files-navigate-forward)
(define-key helm-find-files-map (kbd "<return>") 'helm-execute-persistent-action)

我也backspace略微优化了密钥。如果我键入某些内容并想进行更正,则按退格键。这将删除一个字符。如果我位于目录的开头并再次按退格键,则向上导航一级。这样可以大大加快导航速度!

(defun fu/helm-find-files-navigate-back (orig-fun &rest args)
  (if (= (length helm-pattern) (length (helm-find-files-initial-input)))
      (helm-find-files-up-one-level 1)
    (apply orig-fun args)))
(advice-add 'helm-ff-delete-char-backward :around #'fu/helm-find-files-navigate-back)

要删除无用.,并..在开始的时候,你可以把它添加到helm-boring-file-regexp-list配置变量。


1
不过,Helm方法与库存一致find-file。当突然想在当前目录或父目录中打开Dired时,.and ..并不是真正没有用。而且我发现这C-l比按更快backspace
Tu Do

我回过头来进一步自定义此行为-您在这里使用建议是有原因的,而不是直接将fu / helm-find-files-navigate-forward绑定到(kbd "<return>")吗?直接在新函数内部调用helm-execute-persistent-action似乎更干净一些。
zck 2015年

不幸的是,这对我不起作用。首先,我得到了Symbol's value as variable is void: helm-find-files-map。当我把(helm-mode 1)(require 'helm),我没有得到任何这样的错误,但它也不管用。知道我可能会缺少什么吗?这是我完整的init.el:pastebin.com/drFZsDxW Emacs版本是24.4.1(i686-pc-mingw32)
Geier 2015年

没为我工作。即使使用define-key,如果我尝试C-h k RET使用find-file minibuffer,它仍然显示helm-confirm-and-exit-minibuffer为已绑定。
拉斐尔·易卜拉欣

@RafaelIbraim尝试使用(kbd“ RET”)
netawater

0

由于rep我无法评论Fu86的答案,但我很后盾(如果这不是正常协议,我很抱歉)。由于“ helm-find-files-map”,使用他的回答我得到了一个无效函数。对我来说,使用“ helm-map”键映射代替了。到目前为止,没有冲突,这是我一直在寻找的行为。

... (define-key helm-map (kbd "<return>") 'helm-execute-persistent-action) ...


-1

我无法获得@ Fu86的答案,但以下内容对我有用:

(defun jkf/helm-find-files-navigate-forward (orig-fun &rest args)
  (if (file-directory-p (helm-get-selection)) 
      (helm-execute-persistent-action)
    (apply orig-fun args)))
(advice-add 'helm-confirm-and-exit-minibuffer 
   :around #'jkf/helm-find-files-navigate-forward)

另请参阅:https : //stackoverflow.com/questions/27652371/how-can-i-change-emacs-helm-find-file-default-action-on-directory-to-be-go-insid

编辑

我的解决方案在helm-20141112.946中有效,但在helm-20160211.934中却不起作用,并且@ Fu86答案是解决方案

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.