我想要在Vim中找到我正在编辑的文件名,以便可以将 F5 键映射到编译此文件。当然,如果能够识别文件格式并选择相应的编译器,则会更好,但真的不是必需的。如果我找到文件名,我可以自己完成这个任务。但我真的找不到获取正在编辑文件名的方法。
我知道 :make
命令,并已经进行了映射,但对于小脚本/测试程序,我真的不想先写一个简单的 makefile。
我想要在Vim中找到我正在编辑的文件名,以便可以将 F5 键映射到编译此文件。当然,如果能够识别文件格式并选择相应的编译器,则会更好,但真的不是必需的。如果我找到文件名,我可以自己完成这个任务。但我真的找不到获取正在编辑文件名的方法。
我知道 :make
命令,并已经进行了映射,但对于小脚本/测试程序,我真的不想先写一个简单的 makefile。
可以在当前文件上运行javac。
:!javac %
:help filename-modifiers
我正在尝试在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,在那里你可以找到各种文章来覆盖这个主题(包括一些编译器的技巧)。
是的,那看起来有些过度了。就我个人而言(在Windows上),我发现除了大型项目外,用一个简单的批处理文件编译大多数东西要容易得多。如果程序只有一两个文件,我只需使用一些单行映射来编译它。我知道
:make
命令,已经映射好了,但对于小脚本/测试程序,我真的不想先编写一个简单的Makefile。
其他点也非常有用。我想要补充的是,你可能需要使用: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>
如其他人已经提到的那样,%
会扩展为当前文件路径。如果你想在vim脚本中获取该字符串,请使用expand("%")
。
但是你可能只想将makeprg设置为类似"compiler-command\ %"
这样的内容,并运行:make
- 这样可以获得快速修复支持。(使用:copen
打开错误/警告窗口)
使用%
作为文件名的替代。但就个人而言,我认为你可以使用: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
嗯,它是用作替代代码的百分号 % ,在像 :w 这样的东西中使用。因此,:w blah% 将带有“blah”前缀的副本写入您的文件中。或者!!echo %将当前行替换为它。不知道这是否符合您的需求。