当我已经可以粘贴文件名时,如何告诉Ido摆脱困境?


14

我正在尝试使自己使用Ido模式。有时候很好,但有时却非常愚蠢。这是我最大的失望。

我阅读了一些带有完整文件名的日志,然后复制了一个名称,然后尝试打开该文件。

没有Ido的方法是: C-aC-yC-kRET

对于Ido,存在两个主要问题:

  1. 如果我拥有完整的文件名,则无法输入(我必须删除第一个斜杠,否则即使按//也无济于事。

  2. 我无法编辑文件名的中间部分,其余部分保持不变。

可以吗


2
您可以放回库存find-fileC-x C-f然后正常粘贴。但是,那是更多的击键。或者,如果您想要功能丰富find-file并且仍然满足您的用例,则可以使用Helm 。
Tu Do

1
啊,谢谢,不,我不经常这样做,所以我会抱怨两次额外的击键。这实际上可以满足我的需求。谢谢!
wvxvw 2014年

@Tu Do您应该在下面给出答案。我发现C-x C-f后备广告非常有用!
Kaushal Modi 2014年

Answers:


17

ido命令处于活动状态(ido-find-file在这种情况下)时,您可以使用ido-default绑定回退到同一命令的非ido版本(find-file在这种情况下)C-x C-f进行ido-fallback-command

为了回答您的问题,

  • 首先 C-x C-f会打电话给ido-find-file
  • 第二 C-x C-f将回落到find-file
  • 那你可以做 C-a C-y C-k RET像平常一样将复制的文件路径插入到迷你缓冲区中。

注意:在中idoC-x C-f C-x C-f将执行与相同的操作C-x C-f C-f,即回退到find-file

关于C-fidoido-modeC-f势必会ido-magic-forward-char。来自ido.el

(defun ido-magic-forward-char(arg)
  “向前移动用户输入或执行魔术操作。
如果没有用户输入或输入结束,请执行魔术操作:
Cx Cb ... Cf切换到“ ido-find-file”。
Cx Cf ... Cf退回到非Ido`find-file'。
Cx Cd ... Cf退回到非Ido简短的“脏”了。
Cx d ... Cf退回至非Ido'dirted'。”

2
对我来说,只是C-f回到find-file,而不是C-x C-f。我看不到我已经对它进行了自定义(我和这里的其他人一样,很大程度上依赖于后备。ido在使用了一段时间后,这几乎是值得的麻烦)。
harpo 2014年

1
@harpo我刚刚更新了上面的答案,解释了为什么仍然C-x C-f C-f有效。
Kaushal Modi 2014年

感谢@kaushalmodi的大部分工作。我的回答起初很简单,就像评论一样。它应该是他的答案:)只是为了保证信誉。
Tu Do

这节省了我的理智,因为在使用绝对路径时,ido不能很好地与流浪汉一起玩。谢谢。
热雷米

6

假设您要处理完整路径名,则其他方法可能会起作用:

  • 使用M-x ffapfind-file-at-point):它将自动读取路径名并打开文件
  • 激活M-x compilation-shell-minor-mode会更改路径的字体,并使它们“可点击”(使用或RET)。单击它会将您带到该文件和特定行,并且您可以使用next-errorprevious-error进行导航。我经常使用它,就像在shell-mode中一样

5

由于总是有不止一种方法来执行此操作,因此这是@ abo-abo思想的一种变体,该思想使ido完成保持活动状态,而不是退回到常规的find命令。

(defun ido-yank ()
  (interactive)
  (let ((path (current-kill 0)))
    (if (file-exists-p path)
        (progn
          (let ((dir (file-name-directory path)))
            (if dir (ido-set-current-directory dir)))
          (setq ido-exit 'refresh)
          (setq ido-text-init (if (file-directory-p path) nil (file-name-nondirectory path)))
          (setq ido-rotate-temp t)
          (exit-minibuffer))
      (yank))))

(define-key ido-file-dir-completion-map (kbd "C-y") 'ido-yank)

通过此绑定:

  • 如果当前kill是有效的目录路径,则可以启动ido-find-file,单击C-y跳转到yanked目录,然后继续使用idocomplete选择文件。

  • 如果当前的kill是有效的文件路径,则可以启动ido-find-file,单击hit C-y跳到yanked目录,并提供yanked文件名作为完成,然后单击RET打开该文件。

  • 如果当前有其他原因,通常会被取消。


let绑定各个ido-...变量而不是绑定它们不是更好setq吗?现在看来,您正在永久设置值,而不是在函数的整个生命周期中都这样做。
Dan

@Dan我遵循的是ido命令的模式ido-next-work-directory。我认为已设置变量,以便它们在退出minibuffer调用和随后的刷新期间都可以生存。但是我仍然不完全了解ido的内部原理!
glucas 2014年

是的,我想知道他们是否随后会得到刷新。只是想单挑。
Dan

4

可能是这样的:

(define-key ido-file-dir-completion-map (kbd "C-y") 'ido-yank)
(defun ido-yank ()
  (interactive)
  (if (file-exists-p (current-kill 0))
      (ido-fallback-command)
    (yank)))

如果当前的终止文件是存在的文件,那么执行操作C-y C-y 可能会给您所需的内容。

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.