在VIM中映射命令时文件完成



我经常创建一个临时映射来对特定文件执行某些操作。

典型的例子是:

:map <leader>f :w<cr>:! bundle exec cucumber features/account/sign_in.feature:41<cr>

我希望从当前目录自动完成文件features/account/sign_in.feature

这只需保存当前文件并在<leader>f上执行shell即可运行该命令。

它允许我轻松地处理一段代码,而不必考虑跳到特定文件并运行它。

问题是,创建这样的绑定很麻烦,而且容易出错

VIM不允许在映射时完成文件名。使用%也是完全不同的(我想静态地映射到文件)。

什么是更好的方法?

谢谢。

尽管我认为你的问题应该更清楚,但这里有一些提示:

:nnoremap <leader>f :w<bar>!exec "bundle exec cucumber " . expand('%') . ":" . line('.')<CR>

将正确保存并在命令中插入当前文件名/行号

此外,您还想了解autowrite选项:

:se autowrite

最后,我通常使用makeprg来实现这种目的:

:let &makeprg="bundle exec cucumber %"

这具有使用快速修复命令(:copen:colder:cnewer)的额外好处,并且(给定正确的makef)还跳到错误行

我不知道答案,但如果我是你,我会使用cabbr:

:cabbr fas features/account/sign_in.features:

或者类似的东西。它不是自动完成的,但它确实减少了你需要的击键次数。

另一种选择是创建一个从用户命令映射的函数,该命令接受创建映射的参数。如果我没记错的话,你可以自定义用户命令完成,这样就可以工作了。

更新:是的,您可以自定义用户命令。参见:help user-command

这样的东西应该让你开始:

command -complete=file_in_path -nargs=1 Map call CreateMap(expand('<args>'))
function CreateMap(filename)
    exec 'map <leader>f :w<cr>:! bundle exec cucumber ' . a:filename . ':41<cr>'
endfun

一旦你做到了,请确保你的"路径"设置包括当前目录".",或者如果你想让它递归搜索"./**"。然后你可以使用Map用户命令,如下所示:

:Map fea<tab>ac<tab>

最新更新