我想在 Eclipse 中使用 Ctrl + Shift + R 或通过自动填充的 Ctrl + N 选项在 Vim 中打开一个文件。调用键盘快捷键,键入文件名/模式,然后从所有匹配的文件名中进行选择。
我知道打开它通常像:
:tabe <filepath>
:new <filepath>
:edit <filepath>
这里的问题是在这些情况下我必须指定整个文件路径。
:tabe
将在新选项卡中打开文件,:new
将水平拆分窗口,:edit
将在打开新文件之前关闭当前文件。
我通常做的是 e .
(e-space-dot),它给了我一个可浏览的当前目录 - 然后我可以 /
- 搜索名称片段,就像在文本文件中查找单词一样。我发现这通常足够好,简单快捷。
:find
是另一种选择。
我从项目的根目录打开 vim 并将 path
设置为那里。
然后,我可以使用以下命令打开位于树中任何位置的文件:
:find **/filena< tab >
选项卡将通过各种匹配自动完成。 (**
告诉它递归搜索路径)。
:find
因为获取相对于工作目录的路径。在此处查看问题和@romainl 答案:stackoverflow.com/questions/28224168/…。我发现更有趣的@strager 答案可以更轻松地获取相对于工作目录的路径。
您可以使用 **
在当前路径中搜索文件:
:tabe **/header.h
如果有多个匹配项,请点击选项卡以查看各种完成情况。
:tabe **/*der.h
的内容。
考虑使用 CtrlP 插件。
它包含在 Janus Distributive 中。
允许您使用“模糊匹配”或正则表达式查找当前目录中的文件、打开的缓冲区或最近使用的文件。
除非我遗漏了什么, :e 文件名是我找到的最快的方法。
您也可以使用选项卡自动完成文件名。
我喜欢我的设置中的 :FuzzyFinderTextMate(或 Ctrl + F)。请参阅http://weblog.jamisbuck.org/2008/10/10/coming-home-to-vim
我在我的 .vimrc 文件中使用了几个快捷方式(下面的确切语法)。
它们基于这样一个事实,即在 90% 的情况下,我想在与我当前正在编辑的文件相同的目录中打开另一个文件,或者在层次结构中与该已编辑文件非常接近的目录中打开另一个文件。
以下是命令的作用:
,cd
:将当前工作目录更改为您正在编辑的当前文件所在的目录。
,e
:打开一个已填写当前工作目录的文件,因此您必须仅指定文件名。
把这些放到你的 .vimrc 中:
map ,e :e <C-R>=expand("%:p:h") . "/" <CR>
map ,cd :cd %:p:h <CR>
以下是一系列事件:
您正在 "/home/prog" 中编辑一个名为 test.java 的文件,cd -> 当前工作目录现在变为 "/home/prog" ,e -> 扩展为 ":e /home/prog",这样您就可以填写文件名,比如 test.h。
,e -> 展开到 ":e /home" 选项卡 -> 循环浏览 /home 的子目录 enter -> cd 到你想要说的目录 /home/prog ,e -> 展开到 ":e /home/prog"
还有 command-t 我发现它是最好的(我已经全部尝试过了)。安装它是一个小麻烦,但是一旦安装它,使用它就是一个梦想。
https://wincent.com/products/command-t/
使用制表符,它们在 vim 转义模式下输入文件路径时起作用!
如果你有标签(你应该),你可以从命令行中打开一个文件,只需通过类或方法或 c 函数的名称,使用 "vim -t DBPlaylist",并在 vim 中使用 ":tag ShowList ”。
如果您正在编辑公共目录中的文件,您可以 :cd
到该目录,然后仅对文件名使用 :e
。
例如,而不是:
:e /big/long/path/that/takes/a/while/to/type/or/tab/complete/thingy.rb
:sp /big/long/path/that/takes/a/while/to/type/or/tab/complete/other_thingy.c
:vs /big/long/path/that/takes/a/while/to/type/or/tab/complete/one_more_thingy.java
你可以做:
:cd /big/long/path/that/takes/a/while/to/type/or/tab/complete/
:e thingy.rb
:sp other_thingy.c
:vs one_more_thingy.java
或者,如果您已经在所需目录中打开了一个文件,则可以使用 %
简写当前文件名,并使用 :h
修饰符 (:help :_%:
) 将其修剪到当前目录:
:e /big/long/path/that/takes/a/while/to/type/or/tab/complete/thingy.rb
:cd %:h
:sp other_thingy.c
:vs one_more_thingy.java
而且,就像其他人所说的那样,您可以在前行中使用制表符完成文件名(有关更多信息,请参见 :help cmdline-completion
)。
这并不完全是您要寻找的,但在许多情况下(尽管不是全部)都很好。
如果您打开 VIM 并且缓冲区中有一个文件名,您可以将光标放在该文件名上并键入 gf。这将在同一缓冲区中打开其名称位于光标下的文件。这是一样的
:e CTRL+r CTRL+w
:b oldname
我知道三个插件允许打开文件,支持自动完成,并且不需要输入要打开的文件的完整路径名(只要文件位于 &path
的目录之一下vim 选项):
我正在维护的 searchInRuntime(完成不在:e/:find 上,而是在拆分操作上)
正如已经指出的那样,模糊查找器,
查找文件。
最近,我看到另一个具有类似功能的插件,但我不记得名字了。
很快, :find 很可能会支持自动补全——关于这个主题的补丁最近在 vim_dev 邮件列表上流传。
你可以使用(设置wildmenu)
您可以使用选项卡自动完成文件名
您还可以使用匹配,例如 :ep*.dat 或类似的东西(就像在旧的 dos 中一样)
您也可以 :browse confirm e (用于图形窗口)
但你也应该指定你正在使用的 vim 版本,以及 emacs 中的那个东西是如何工作的。也许我们可以为您找到一个确切的 vim 替代方案。
已经提到了 FuzzyFinder,但是我喜欢 FuzzyFinderTextmate 插件的类似文本的行为,它扩展了行为以包含所有子目录。
确保您使用的是 2.16 版的fuzzyfinder.vim - 更高版本会破坏插件。
使用 Exuberant ctags,您可以创建带有文件信息的标签文件:
ctags --extra=+f -R *
然后,从 VIM 打开文件
:tag filename
您还可以使用 <tab>
自动完成文件名。
在 GVIM 中,可以使用打开/读/写对话框浏览文件;
:browse {command}
{command} - 打开/读/写
open - 打开文件 read - 追加文件 write - SaveAs 对话框
我安装了 FuzzyFinder。但是,限制是它只能在当前目录中查找文件。一种解决方法是添加 FuzzyFinderTextmate。但是,根据文档和评论,这并不可靠。您需要正确版本的 FuzzyFinder,并且您需要使用 Ruby 支持编译您的 Vim 副本。
我现在尝试的另一种解决方法是在编辑会话开始时打开我可能需要的所有文件。例如,打开关键目录中的所有文件...
:args app/**
:args config/**
:args test/**
etc...
(这意味着我可能会打开许多文件,但到目前为止它似乎仍然可以正常工作。)
之后,我可以在缓冲区模式下使用 FuzzyFinder,它的行为有点像 TextMate 的 command-o
快捷方式......
:FuzzyFinderBuffer
:e.
)。:e.
和:E
之间的行为有所不同:如果当前文件已被编辑但尚未保存,则前者会因为“自上次更改后没有写入”而报错(如:edit
),而后者将水平拆分窗口(如:new
)以允许打开新文件(如果当前文件尚未修改(如:edit
),则两者都将用新文件替换当前文件)。