在Vim中获取当前文件的名称

28

我想要在Vim中找到我正在编辑的文件名,以便可以将 F5 键映射到编译此文件。当然,如果能够识别文件格式并选择相应的编译器,则会更好,但真的不是必需的。如果我找到文件名,我可以自己完成这个任务。但我真的找不到获取正在编辑文件名的方法。

我知道 :make 命令,并已经进行了映射,但对于小脚本/测试程序,我真的不想先写一个简单的 makefile。


2
类似于https://dev59.com/0XNA5IYBdhLWcg3wjOlS和https://dev59.com/inE95IYBdhLWcg3wm_Mu。 - Nathan Hartley
4
比它类似的那些物品更年长。 - martiert
毫无疑问。我本来想把它添加到“链接”列表中,但我还没有权限。 - Nathan Hartley
2
+1 给 Nathan,因为他提供了我最终找到自己类似问题答案的链接。+1 给 martiert,因为他的正义愤怒和机智让人印象深刻。 - WhyGeeEx
6个回答

27
您可以在Vim命令中使用%字符来获取带有扩展名的当前文件名。例如,

:!javac %

可以在当前文件上运行javac。
您可以使用以下命令了解更多信息:

:help filename-modifiers


25

我正在尝试在vim中找到我正在编辑的文件名。

对于当前的缓冲区,这将给出文件的名称:

echo "You're editing " bufname("%")

只需将其放入某个file.vim文件中,然后运行":so %"。但我认为这并不是你所需要的。

因此,我可以使用它将F5映射到编译此文件的操作,以进行测试。当然,如果我能够识别文件格式并选择相应的编译器,那就更好了,但真的没有必要。如果我找到文件名,我可以自己完成这个任务。但我真的找不到任何获得正在编辑的文件名的方法。

你可以做几件事情。如果vim可以识别你正在编辑的文件类型,你可以将F5映射到你的编译器命令,并将该命令放入其特定的ftplugin目录中,这样它只会针对该文件类型有效。例如,你可以将以下内容放入相关目录:

nmap <f5> :!compilername %<cr>
在cpp.vim,fortran.vim,python.vim等编辑器中,%会给出当前正在编辑的文件名。这将像在命令提示符下调用compilername file.cpp一样执行编译器。
当然,对于每种文件类型,compilername都是不同的。你不会使用cpp编译器来编译fortran代码,而是在那种情况下输入fortrancompiler %
这是其中一种选择。你也可以尝试按照文件扩展名设置自动命令,并在你的.vimrc中,这样它就可以根据文件扩展名识别文件类型了。这是vim的标准用法,非常普遍。现在,我不确定你想如何处理这个问题,所以我会指向Vim Wiki,在那里你可以找到各种文章来覆盖这个主题(包括一些编译器的技巧)。

我知道:make命令,已经映射好了,但对于小脚本/测试程序,我真的不想先编写一个简单的Makefile。

是的,那看起来有些过度了。就我个人而言(在Windows上),我发现除了大型项目外,用一个简单的批处理文件编译大多数东西要容易得多。如果程序只有一两个文件,我只需使用一些单行映射来编译它。

6

其他点也非常有用。我想要补充的是,你可能需要使用:p,以确保文件名作为完全限定路径传递。没有它,Vim 可能会将其作为相对于 Vim 当前路径的路径传递,这可能与编译器使用的路径相同,也可能不同。因此,一种解决方案是:

nnoremap <silent> <f5> :!javac %:p<cr>

如果你想自动检测文件类型,可以使用AutoCommand

autocmd FileType java       nnoremap <buffer> <silent> <f5> :!javac %:p<cr>
autocmd FileType cpp        nnoremap <buffer> <silent> <f5> :!gcc %:p<cr>

对于 autocmd FileType,加上 +1。但是对于 cpp 文件,你应该使用 g++ 而不是 gcc,否则会出现错误。 - duleshi

4

如其他人已经提到的那样,%会扩展为当前文件路径。如果你想在vim脚本中获取该字符串,请使用expand("%")

但是你可能只想将makeprg设置为类似"compiler-command\ %"这样的内容,并运行:make - 这样可以获得快速修复支持。(使用:copen打开错误/警告窗口)


3

使用%作为文件名的替代。但就个人而言,我认为你可以使用:make来完全实现你想要的。

我曾经做过你想要避免的事情:对于每个单独的文件夹,我都会编写一个两行的Makefile文件。我非常喜欢:make的快速修复支持,所以编写一个两行的Makefile文件似乎在大局中只是一个小开销。

...但我后来学到了更好的方法。你可以使用 autocmd 或 ftplugin 来设置 makeprg 选项,根据当前的文件类型配置 :make 使用你选择的命令。这本身就节省了一些工作。

问题出现在我们使用的工具的错误消息看起来不像 GCC 那样。为了解决这个问题,vim 还提供了 errorformat 选项。errorformat 非常复杂。如果你真的想了解它,可以从 :h error-format 开始。从长远来看,这种复杂性确实很棒。这意味着,一旦你学会了如何使用它,你几乎可以解析任何编译器输出并将其格式化为可以使用快速修复(:cope:cl)查看的格式。

短期内,它可能会有点不好,因为这意味着你第一次自己编写错误格式时,你将花费相当多的时间来解决 vim 文档,并重新加载和构建文件以触发编译器可以产生的各种错误消息。如果你只是暂时离开你的舒适区,或者你的老板在你肩膀上催促你立即修复这个 bug,那绝对不是你想要的。

希望(并且很可能),已经有人为你经历了这种痛苦,或者已经根据你的默认 ftplugin 适当地配置了errorformat,或者将其作为一个 vim 脚本发布,他们只是在等待社区安装和喜爱。

作为一个快速演示,这里是我为我的 .vim/ftplugin/haskell.vim 文件编写的几行:

setl makeprg=ghc\ --make\ %
setl errorformat=%E%f:%l:%c:,%C\ %.%m,%Z,%f:%l:%c:%m

我在这里使用setl,以便这些选项仅针对Haskell源文件进行配置;如果我同时编辑不同类型的源文件,则可以使用不同的配置。

如果您最终使用:make,我还建议配置您的switchbuf设置。我发现在构建后如果快速修复激动地将您跳转到错误的文件时,必须按下ctrl-O有点烦人。我使用:

set switchbuf=useopen,usetab,newtab

2

嗯,它是用作替代代码的百分号 % ,在像 :w 这样的东西中使用。因此,:w blah% 将带有“blah”前缀的副本写入您的文件中。或者!!echo %将当前行替换为它。不知道这是否符合您的需求。


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