首页 > 解决方案 > 如何在vim中为特定文件名设置快捷方式?

问题描述

在我的 .vimrc 我有

" Rspec Shortcuts
nnoremap <leader>t :!clear; bundle exec rspec % --fail-fast<cr>

" Minitest Shortcuts
nnoremap <leader>t :!clear; bundle exec ruby -w -Itest %<cr>

我想让这些快捷方式以文件名为条件。

我试过这样设置条件:

if @% =~ '*_spec.rb'
  nnoremap <leader>t :!clear; bundle exec rspec % --fail-fast<cr>
endif

if @% =~ '*_test.rb'
  nnoremap <leader>t :!clear; bundle exec ruby -w -Itest %<cr>
endif

但它没有用。如果没有条件,快捷方式当然可以工作。

标签: vim

解决方案


你需要做两件事:

  • 通过添加使用缓冲区本地映射<buffer>
  • 仅在特定文件名上设置这些映射,可能通过:autocmd

映射将如下所示:

nnoremap <buffer> <leader>t :!clear; bundle exec rspec % --fail-fast<cr>
nnoremap <buffer> <leader>t :!clear; bundle exec ruby -w -Itest %<cr>

现在您需要为特定FileType的 's 或文件名加载这些映射:

augroup RubyTestMappings
    autocmd!
    autocmd BufNewFile,BufRead *_spec.rb nnoremap <buffer> <leader>t :!clear; bundle exec rspec % --fail-fast<cr>
    autocmd BufNewFile,BufRead *_test.rb nnoremap <buffer> <leader>t :!clear; bundle exec ruby -w -Itest %<cr>
augroup END

另一种选择是将这些映射放入~/.vim/after/ftplugin/ruby.vim如下:

if @% =~ '*_spec.rb'
  nnoremap <buffer> <leader>t :!clear; bundle exec rspec % --fail-fast<cr>
endif

if @% =~ '*_test.rb'
  nnoremap <buffer> <leader>t :!clear; bundle exec ruby -w -Itest %<cr>
endif

如需更多帮助,请参阅:

:h :map-local
:h :autocmd
:h BufNewFile
:h BufRead

推荐阅读