繁体   English   中英

如何避免在vim中重映射

[英]How to avoid remap in vim

我的.vimrc上有以下内容

au FileType ruby nnoremap <expr> <leader>t ':!rspec ' . expand('%') . ':' . line('.')

这会在指定的行上执行rspec ,并在按Enter键之前为我提供编辑行的选项。 但我必须在测试文件上,以便正确获取文件名和行号。

在开发时我nnoremap <leader>t :!rspec some/spec/file.rb:123运行nnoremap <leader>t :!rspec some/spec/file.rb:123以从代码中的任何地方运行我想要的测试。 所以我可以编码并激活测试,而无需访问测试文件。

问题是,如果我访问另一个ruby文件, .vimrc的映射会再次运行,并且我nnoremap之前使用过的nnoremap命令。 是否有一个命令只能映射(在正常模式下),如果还没有该序列的映射?

问候,

这应该是缓冲区本地映射。 使用<buffer>

au FileType ruby nnoremap <buffer> <expr> <leader>t ':!rspec ' . expand('%') . ':' . line('.')

我们可以做得更好!

使用augroup和make是自我清除,以便安全地重新:source

augroup ruby_testing
    autocmd!
    autocmd FileType ruby nnoremap <buffer> <expr> <leader>t ':!rspec ' . expand('%') . ':' . line('.')
augroup END

甚至更好地放弃autocmd并将此映射放在after目录中。 ~/.vim/after/ftplugin/ruby.vim添加到~/.vim/after/ftplugin/ruby.vim

nnoremap <buffer> <expr> <leader>t ':!rspec ' . expand('%') . ':' . line('.')

有关更多帮助请参阅:

:h :map-local
:h :augroup
:h after-directory

Vim具有:help :map-<unique>修饰符,如果此类映射已存在,则会使映射失败。

au FileType ruby nnoremap <unique> <expr> <leader>t ...

您可以使用以下方法抑制错误消息:silent!

au FileType ruby silent! nnoremap <unique> <expr> <leader>t ...

或者(这稍微更好,因为它不会抑制映射定义中的任何其他错误,如语法错误),您可以通过maparg()显式检查映射的存在:

au FileType ruby if empty(maparg('<leader>t', 'n')) | nnoremap <expr> <leader>t ... | endif

请注意,这实际上实现了(我理解)你要求的; 即第一个Ruby文件将定义映射,并忽略任何后续的Ruby文件; 映射将始终使用第一个文件的名称和行号。 如果你想要为同一个映射使用不同的右侧,根据当前编辑的文件,解决方案是根据@ PeterRincker的答案的缓冲区本地映射。 但有了这个,你必须在原始的Ruby缓冲区内才能触发正确的映射。

对此的补救措施可能是从命令行历史记录中调用已执行的命令行 (应该自动为您的不完整映射而发生,否则通过histadd() ),以便您可以轻松地从另一个文件中调用该命令。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM