[英]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.