Как избежать переназначения в vim - PullRequest
0 голосов
/ 10 января 2019

На моем .vimrc

есть следующее
au FileType ruby nnoremap <expr> <leader>t ':!rspec ' . expand('%') . ':' . line('.')

Выполняет rspec в указанной строке и дает мне возможность редактировать строку перед нажатием Enter. Но я должен быть в тестовом файле, чтобы он правильно получал имя файла и номер строки.

Во время разработки я запускаю nnoremap <leader>t :!rspec some/spec/file.rb:123 вручную, чтобы запустить нужный мне тест из любой точки кода. Так что я могу кодировать и запускать тест без необходимости посещать тестовый файл.

Проблема в том, что, если я захожу в другой файл ruby, отображение в .vimrc запускается снова, и я теряю команду nnoremap, которую я использовал ранее. Есть ли команда для отображения (в обычном режиме), если карта для этой последовательности еще не существует?

С уважением,

Ответы [ 2 ]

0 голосов
/ 10 января 2019

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()), так что вы можете легко вызвать команду из другого файла.

0 голосов
/ 10 января 2019

Это должно быть локальное отображение буфера. Используйте <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:

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

Для получения дополнительной помощи см .:

:h :map-local
:h :augroup
:h after-directory
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...