ChatGPT解决这个技术问题 Extra ChatGPT

在 Vim 中打开文件的快捷方式

我想在 Eclipse 中使用 Ctrl + Shift + R 或通过自动填充的 Ctrl + N 选项在 Vim 中打开一个文件。调用键盘快捷键,键入文件名/模式,然后从所有匹配的文件名中进行选择。

我知道打开它通常像:

:tabe <filepath>
:new <filepath>
:edit <filepath>

这里的问题是在这些情况下我必须指定整个文件路径。

请注意,建议的命令有不同的效果 :tabe 将在新选项卡中打开文件,:new 将水平拆分窗口,:edit 将在打开新文件之前关闭当前文件。

E
Eliran Malka

我通常做的是 e . (e-space-dot),它给了我一个可浏览的当前目录 - 然后我可以 / - 搜索名称片段,就像在文本文件中查找单词一样。我发现这通常足够好,简单快捷。


您不需要空间,额外节省 25% 的打字时间。 (:e.)。
如果您使用大写字母 e,则不需要点,例如 :E
@drozzy 这发生在 vim 上 :-)
但是,:e.:E 之间的行为有所不同:如果当前文件已被编辑但尚未保存,则前者会因为“自上次更改后没有写入”而报错(如 :edit),而后者将水平拆分窗口(如 :new)以允许打开新文件(如果当前文件尚未修改(如 :edit),则两者都将用新文件替换当前文件)。
如果您打开一个文件,然后将其替换为第二个文件,您可以使用“e #”返回第一个文件
d
dkretz

我最近爱上了 fuzzyfinder.vim ... :-)

:FuzzyFinderFile 将允许您通过键入部分名称或模式来打开文件。


U
UncleZeiv

:find 是另一种选择。

我从项目的根目录打开 vim 并将 path 设置为那里。

然后,我可以使用以下命令打开位于树中任何位置的文件:

:find **/filena< tab >

选项卡将通过各种匹配自动完成。 (** 告诉它递归搜索路径)。


我没有发现有用的 :find 因为获取相对于工作目录的路径。在此处查看问题和@romainl 答案:stackoverflow.com/questions/28224168/…。我发现更有趣的@strager 答案可以更轻松地获取相对于工作目录的路径。
s
strager

您可以使用 ** 在当前路径中搜索文件:

:tabe **/header.h

如果有多个匹配项,请点击选项卡以查看各种完成情况。


我试过用这个,但这太慢了。我的意思是我的应用程序很大,并且编辑器停止工作了一段时间。您知道任何可以提高编辑器性能和速度的设置吗?
不错的答案。如果您不记得文件的全名,请使用类似 :tabe **/*der.h 的内容。
A
Alexey

考虑使用 CtrlP 插件。

它包含在 Janus Distributive 中。

允许您使用“模糊匹配”或正则表达式查找当前目录中的文件、打开的缓冲区或最近使用的文件。


实际上,我将它用作 Janus 发行版的一部分。
原始 CtrlP 存储库处于非活动状态,但有一个 active fork
S
Sagar Jain

除非我遗漏了什么, :e 文件名是我找到的最快的方法。

您也可以使用选项卡自动完成文件名。


@dirkgently,是的。正如这个问题的标题所暗示的那样,它仍然是一条捷径,但我认为这不是提问者正在寻找的。
对我来说,选项卡自动完成功能不适用于:e。此外,您并不总是想搜索以某些东西开头的文件名,而是要搜索文件名中的中间词。
J
Jasper

我喜欢我的设置中的 :FuzzyFinderTextMate(或 Ctrl + F)。请参阅http://weblog.jamisbuck.org/2008/10/10/coming-home-to-vim


J
Jasper

我在我的 .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"


b
bronson

还有 command-t 我发现它是最好的(我已经全部尝试过了)。安装它是一个小麻烦,但是一旦安装它,使用它就是一个梦想。

https://wincent.com/products/command-t/


您可能还想尝试 ctrlp.vim (github.com/kien/ctrlp.vim)。它与 Command-T 基本相同,但用纯 Vimscript 编写。 (恕我直言,使用起来也更简单)
d
dirkgently

使用制表符,它们在 vim 转义模式下输入文件路径时起作用!


P
Paul Tomblin

如果你有标签(你应该),你可以从命令行中打开一个文件,只需通过类或方法或 c 函数的名称,使用 "vim -t DBPlaylist",并在 vim 中使用 ":tag ShowList ”。


r
rampion

如果您正在编辑公共目录中的文件,您可以 :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)。


N
Nathan Fellman

这并不完全是您要寻找的,但在许多情况下(尽管不是全部)都很好。

如果您打开 VIM 并且缓冲区中有一个文件名,您可以将光标放在该文件名上并键入 gf。这将在同一缓冲区中打开其名称位于光标下的文件。这是一样的

:e CTRL+r CTRL+w


我按了 gf,现在我打开了光标下的新文件。现在如何回到原始文件。!
@user430294:它在不同的缓冲区中打开。使用:b oldname
@vrbilgi,使用 Ctrl+o 返回之前编辑的文件。使用 Ctrl+i 再次前进到您返回的文件。
L
Luc Hermitte

我知道三个插件允许打开文件,支持自动完成,并且不需要输入要打开的文件的完整路径名(只要文件位于 &path 的目录之一下vim 选项):

我正在维护的 searchInRuntime(完成不在:e/:find 上,而是在拆分操作上)

正如已经指出的那样,模糊查找器,

查找文件。

最近,我看到另一个具有类似功能的插件,但我不记得名字了。

很快, :find 很可能会支持自动补全——关于这个主题的补丁最近在 vim_dev 邮件列表上流传。


R
Rook

你可以使用(设置wildmenu)

您可以使用选项卡自动完成文件名

您还可以使用匹配,例如 :ep*.dat 或类似的东西(就像在旧的 dos 中一样)

您也可以 :browse confirm e (用于图形窗口)

但你也应该指定你正在使用的 vim 版本,以及 emacs 中的那个东西是如何工作的。也许我们可以为您找到一个确切的 vim 替代方案。


N
Naseer

已经提到了 FuzzyFinder,但是我喜欢 FuzzyFinderTextmate 插件的类似文本的行为,它扩展了行为以包含所有子目录。

确保您使用的是 2.16 版的fuzzyfinder.vim - 更高版本会破坏插件。


W
Wonil

使用 Exuberant ctags,您可以创建带有文件信息的标签文件:

ctags --extra=+f -R *

然后,从 VIM 打开文件

:tag filename

您还可以使用 <tab> 自动完成文件名。


S
Samantha

在 GVIM 中,可以使用打开/读/写对话框浏览文件;

:browse {command}

{command} - 打开/读/写

open - 打开文件 read - 追加文件 write - SaveAs 对话框


E
Ethan

我安装了 FuzzyFinder。但是,限制是它只能在当前目录中查找文件。一种解决方法是添加 FuzzyFinderTextmate。但是,根据文档和评论,这并不可靠。您需要正确版本的 FuzzyFinder,并且您需要使用 Ruby 支持编译您的 Vim 副本。

我现在尝试的另一种解决方法是在编辑会话开始时打开我可能需要的所有文件。例如,打开关键目录中的所有文件...

:args app/**
:args config/**
:args test/**
etc...

(这意味着我可能会打开许多文件,但到目前为止它似乎仍然可以正常工作。)

之后,我可以在缓冲区模式下使用 FuzzyFinder,它的行为有点像 TextMate 的 command-o 快捷方式......

:FuzzyFinderBuffer

你确定?我的 .vimrc 中有一些配置,寻找“g:fuf_abbrevMap”。我一定在文档中找到了一个例子。当我输入快捷方式时,我会输入一个缩写,如“web:”,它会在我选择的文件夹中查找所有文件。我的问题实际上是由于某种原因它不再打开文件,而是在状态栏中看到 [NEW DIRECTORY]。但是我有同样的问题:o,似乎与fuf无关。