获取Vim中当前文件的名称

时间:2009-04-12 00:08:56

标签: vim

我正在尝试在Vim中找到我正在编辑的文件的名称。所以我可以用它来映射 F5 来编译这个文件。如果我能识别文件格式并选择相应的编译器,那当然会很棒,但实际上并不是必需的。如果我找到文件的名称,我可以自己做。但我真的找不到任何方法来获取我正在编辑的文件的名称。

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

6 个答案:

答案 0 :(得分:25)

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

  

:!javac %

在当前文件上运行javac。

您可以使用

了解更多信息
  

:help filename-modifiers

答案 1 :(得分:22)

  

我正在尝试在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中的扩展集autocmd命令进行尝试,以便根据文件的扩展名识别文件类型。这是vim的所有标准用法,没有什么不常见的。现在,我不确定你是怎么想这样做的,所以我只想指出Vim Wiki你可以在哪里找到涵盖这一点的各种文章(以及一些编译器的一些提示) )。

  

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

是的,这似乎有点矫枉过正。就个人而言(当我在Windows上时),我发现简单的批处理文件比大项目更容易编写。如果程序在一个或两个文件中,我只是使用一些oneliner映射编译它。

答案 2 :(得分:5)

其他要点非常有用。我想补充一点,您可能希望使用: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>

答案 3 :(得分:3)

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

但您可能只想将makeprg设置为"compiler-command\ %"并运行:make - 您可以通过这种方式获得快速修复支持。 (使用:copen打开错误/警告窗口)

答案 4 :(得分:2)

嗯,它是作为替换代码,例如:w。所以:w blah%会写一个文件的副本,其中'blah'被添加到前面。或者 !! echo%用它替换当前行。 Dunno,如果它满足您的需求。

答案 5 :(得分:2)

使用%代替您的文件名。但就个人而言,我真的认为你可以推动:make做你想做的事。

我曾经做过你想要避免的事情:只为我所在的每个文件夹中的两行Makefile。我非常喜欢:make的quickfix支持,以至于甩掉了两行Makefile在整体情况下似乎只是一个很小的开销。

......自那以后我学得更好了。您可以使用autocmd或ftplugin设置makeprg选项,配置:make以根据当前文件类型使用您选择的命令。就其本身而言,这可以为您节省一些工作。

当我们使用一个错误消息看起来不像GCC的工具时,问题就开始了。为了解决这个问题,vim还提供了errorformat选项。 errorformat非常复杂。如果您真的想了解它,请从:h error-format开始。从长远来看,复杂程度非常高。这意味着,一旦您学会了如何使用它,您就可以解析任何编译器输出并对其进行格式化,以便使用quickfix(:cope:cl)进行查看。

在短期内,它可能有点不好,因为这意味着你自己一起破解错误格式的前几次,你将花费相当多的时间困惑vimdocs并重新加载和构建将触发编译器可以生成的各种错误消息的文件。如果你只是在你的舒适区域外短暂工作,或者你的老板在你的肩膀上敦促你修复这个错误现在,那绝对不是你想要的。

希望(也可能),有人已经为您解决了这个问题,并为您的默认errorformat正确配置了ftplugin,或者将其作为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设置。我发现如果quickfix被激活并跳转到错误的文件,在构建后按ctrl-O有点烦人。我用:

set switchbuf=useopen,usetab,newtab