如何在helm中恢复类似anything的TAB自动完成行为?

5

这里有一个相关问题的链接(点击这里)。但是答案是要适应helm中自动完成的新方式。但我无法适应它,原因如下。

假设我想打开一个文件/home/user/work/f.txt。我按下 C-x C-f,它会带我到当前目录,比如说/current/dir/。我按下Backspace,发现自动完成不允许我删除/。好吧,用C-Backspace关闭自动完成。然后我杀掉行 C-a C-k 并开始输入。注意到自动完成不起作用,再次打开它 C-Backspace。通常我会输入我知道的可能是唯一的部分,例如/hom并按Tab

但在这里,当我键入/ho时,自动完成将其解析为/home/,但由于我打字很快,所以我最终得到了/home/m,然后继续输入毫无意义的字符,直到我注意到。有可能在那个时候,我已经被自动完成带到了我本不想去的目录。

所以我必须不断地观察自动完成在做什么,而不能依赖于我键入的内容,并只在按下Tab时检查建议的补全。

我也发现自己由于偶尔的打字错误而进入错误的目录,然后很难回到上一级——恶意自动完成不允许你用几个Backspace来解决这个问题。

自动完成行为与Tab功能的移除相互作用,完全打乱了我的工作,以至于我决定提出这个问题。我要么:

  1. 恢复旧功能
  2. 学习如何有意义地使用自动完成,或者
  3. 配置helm的C-x C-f以更像一个Linux命令行

请帮帮我。


1
如果我遇到了你描述的那么多问题,我就不会坚持使用Helm了。 我使用ido从来没有出现过任何问题:只需要按下C-m来接受目录,按下C-j来打开即可。 当然,还有C-SPC来缩小范围,但这很少需要。 - abo-abo
@abo-abo:Helm 对于 M-x 命令查找非常宝贵。我也非常喜欢 anything。几乎所有关于它的东西都很棒。 - user443854
2
它在命令方面比 https://github.com/nonsequitur/smex 更好吗? - abo-abo
1
另外,我不明白为什么你不能同时使用ido处理文件和缓冲区,使用smex处理函数,再使用helm处理其他事情。 - abo-abo
我会尝试使用smex。没有理由不使用它。因为“anything”已经可以正常工作,所以我没有机会去发现它。 - user443854
1
关于第一部分:我不知道Helm,但在纯Emacs中,从/current/dir/提示符,您可以直接开始键入/home/user/work/f.txt而无需删除任何内容 - 即/current/dir//home/user/work/f.txt或者/current/dir/~/work/f.txt,Emacs会识别出您已经开始了一个新路径。只要旧路径以/结尾,您就可以开始输入新的绝对路径。至于其余部分,考虑到Helm被推广为Anything的替代品,如果其行为不至少是可选兼容的,那么它似乎非常奇怪。 - phils
2个回答

3
以下是一些关于使用ido的技巧,如果你想开始使用它的话。
如果helm更好,请告诉我,也许我会转换过去。我曾经尝试过一次,但不喜欢它。
基本设置:
这将使你可以在`C-x C-f`上使用`ido-find-file`。
(ido-mode)
(setq ido-enable-flex-matching t)

Smex设置:

https://github.com/nonsequitur/smex安装。

(require 'smex)
(global-set-key "\C-t" 'smex)

使用ido切换缓冲区:

(global-set-key
 "η"
 (lambda()(interactive)
   (when (buffer-file-name)
     (save-buffer))
   (ido-switch-buffer)))

(global-set-key
 (kbd "C-η")
 (lambda()(interactive)
   (let ((ido-default-buffer-method 'other-window))
     (ido-switch-buffer))))

技巧:

;; 1
(add-hook 'dired-mode-hook
          (lambda()
            (define-key dired-mode-map "j" 'ido-find-file)))

(add-hook
 'ido-setup-hook
 (lambda()
   ;; 2
   (define-key ido-file-dir-completion-map "~"
     (lambda ()(interactive)
        (ido-set-current-directory "~/")
        (setq ido-exit 'refresh)
        (exit-minibuffer)))
   ;; 3
   (define-key ido-buffer-completion-map "η" 'ido-next-match)
   ;; 4
   (define-key ido-buffer-completion-map (kbd "C-p")
     'ido-fallback-command)
   ;; 5
   (define-key ido-completion-map (kbd "C-.") 'smex-find-function)
   (define-key ido-completion-map (kbd "C-,") 'smex-describe-function)))
  1. 从dired快速打开文件。
  2. 一键快速返回主目录(例如使用~代替~/)。
  3. 按下相同的键可以循环缓冲区候选项(类似于Firefox中的C-TAB)。
  4. 在想要创建无文件缓冲区时有一个后备选择是很有用的(ido会尝试选择现有的缓冲区,除非你退回到后备)。
  5. 跳转到函数定义/文档非常有用。

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接