2

Мой типичный рабочий процесс в Vim состоит из двух вертикальных панелей; производственный код слева, а тесты справа.

Я часто переключаю языки (и тестовые среды), поэтому мне нравится создавать новое отображение для запуска моего тестового кода в каждом сеансе. Допустим, я делаю какой-то проект на Ruby и выхожу из класса в lib/importer.rb . Прилагаемые спецификации находятся в spec/lib/importer_spec.rb .

Чтобы создать свое отображение для запуска спецификаций, я бы сфокусировался на панели, показывающей спецификации, и ввел следующее:

:nnoremap -g :!rspec %<cr>

Примечание: я использую дефис / минус в качестве ключа лидера.

Это работает, но только если панель спецификаций имеет фокус, когда я нажимаю - g. Если рабочая область имеет фокус, и я нажимаю на отображение, rspec попытается запустить рабочий код, что не имеет смысла.

Чтобы обойти это, я могу написать абсолютный путь к файлу спецификации:

:nnoremap -g :!rspec spec/lib/importer_spec.rb<cr>

Это работает, хотя это немного громоздко писать.

Читая вчера вечером Practical Vim , я понял, что в командном режиме вы можете использовать % раскрытие - вы пишете % а затем нажимаете вкладку , и процент заменяется абсолютным путем к файлу в текущей области.

Если я сделаю это:

:!rspec %

... А затем нажмите Tab, я получаю это:

:!rspec spec/lib/importer_spec.rb

И это здорово! Однако, если я сделаю это:

:nnoremap -g :!rspec %

... А затем нажмите Tab, я получаю это:

:nnoremap -g :!rspec %^I

Я хороший человек, и я плачу свои налоги. Почему это происходит со мной?

1 ответ1

5

Завершение команды по умолчанию не распознается в отображениях (и записывается в макросах). Вы можете определить альтернативный ключ в скрытом параметре 'wildcharm' и использовать его. Тем не менее, вставка текущего имени файла может быть выполнена более простым и простым способом. Вместо завершения % , просто вставьте эквивалентное выражение Vimscript через <C-r>:

:nnoremap -g :!rspec <C-r>=expand('%')<cr><cr>

PS: для правильной работы со всеми видами имен файлов, дополнительно используйте shellescape():

:nnoremap -g :!rspec <C-r>=shellescape(expand('%'), 1)<cr><cr>

PPS: Я надеюсь, что вы на самом деле не вводите вручную каждый раз отображение, а используете плагин filetype или :autocmd чтобы автоматически определять это для тестовых буферов. Я определенно рекомендую автоматизировать это таким образом.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .