【问题标题】:File completion when mapping commands in VIM在 VIM 中映射命令时的文件完成
【发布时间】:2012-02-18 05:02:36
【问题描述】:

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

典型的例子是这样的:

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

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

这应该只是保存当前文件并在&lt;leader&gt;f 上运行命令。

它让我可以轻松地处理一段代码而不考虑跳转到特定文件并运行它。

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

VIM 不允许在映射时补全文件名。同样使用% 是完全不同的(我想映射到一个文件静态)。

有什么更好的方法?

谢谢。

【问题讨论】:

  • 抱歉,根本不清楚您要完成什么文件名。 :41 到底是从哪里来的?
  • 我已经更新了问题。我想自动完成features/account/sign_in.feature。 41 无关紧要(它是文件中的行号)。
  • 哪里你想从哪里'完成'它(completion这个词表明你有一部分,其余的必须是自动附加;文件名完成通常意味着查看可能的文件名并选择现有的、可访问文件的名称)

标签: ruby vim tdd terminal vi


【解决方案1】:

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

: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)也会跳转到错误行的额外好处

【讨论】:

  • 很高兴了解autowrite。谢谢。您能否在此处详细说明如何使用makeprg
  • @DmytriiNagirniak:是的,我已经展示了如何设置它。我建议您通过 :make|copen 尝试它(和 :help quickfix 以获取所有快速修复命令的完整文档)
  • 如果按&lt;leader&gt;f 更快,为什么我需要输入:make|copen?我只想有一个命令的快捷方式(这通常是不同的,它不是编译器或类似的)。该命令的映射很容易出错。
  • @DmytriiNagirniak:您回答了自己的问题。映射:nnoremap &lt;leader&gt;f :make&lt;CR&gt;不易出错。另外,它具有快速修复语义。此外,没有人说你必须,它正是我使用的,我想我会提到它? (第一个映射没有做你想要的吗?我希望它会做
  • 第一个映射确实应该完成这项工作。至于:noremap &lt;leader&gt;f :make&lt;CR&gt;——在那之前我还需要:let &amp;makegrp;这似乎比在一个命令中花费更长的时间。
【解决方案2】:

我不知道答案,但如果我是你,我会使用 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>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-08
    • 2013-04-07
    • 2012-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多