Отправка ввода на встроенный терминал в vim

В моем .vimrc В файл я включил следующую строку:

autocmd vimenter * botright term

Это означает, что всякий раз, когда запускается vim, он открывает терминал внизу справа. Я хотел бы создать сопоставление клавиш, которое заставит vim выполнить заданную динамически генерируемую команду в терминале. Например, я добавил следующее к моему .vimrc файл:

nmap <leader><leader> <C-w><C-w>python my_python_file.py<CR><C-w><C-w>

Так что, если я редактирую файл с именем my_py_file.pyЯ могу нажать <leader><leader> и vim сначала изменит окна (переход на встроенный терминал), затем введите команду

python my_python_file.py

так что файл будет работать в Python, и, наконец, вернуться в другое окно, чтобы я мог продолжить редактирование. Это работает! Но я бы хотел, чтобы он работал для произвольных файлов, а не только для файлов с именами my_python_file.py, Как это можно сделать?

Я думал об использовании expand('%:p') чтобы получить полный путь к текущему файлу, но я не смог передать эту строку во встроенное окно терминала в качестве входных данных. Я пытался написать функцию для достижения этой цели, но безуспешно.

1 ответ

Решение

Ключ должен использовать map <expr> <leader><leader> ... чтобы <leader><leader> может быть сопоставлен с динамически генерируемой привязкой. Ниже приведен фрагмент кода из .vimrc файл работает с Vim 8.0:

" open a terminal directly below current window
nnoremap <leader>t :split<cr><c-w><c-j>:terminal ++curwin<cr><c-w><c-k>
" save current file and run python on it in terminal window directly below
nnoremap <expr> <leader><leader> ':w<cr><c-w><c-j>python ' . expand('%:p') . '<cr><c-w><c-k>'

Это карты <leader>t открыть новый терминал терминала и <leader><leader> запустить Python в этом терминальном буфере. Обратите внимание, что терминал все время находится в режиме работы терминала.

Для работы с NeoVim потребуется небольшая модификация:

" open a terminal directly below current window
nnoremap <leader>t :split<cr><c-w><c-j>:terminal<cr><c-w><c-k>
" save current file and run python on it in terminal window directly below
nnoremap <expr> <leader><leader> ':w<cr><c-w><c-j>ipython ' . expand('%:p') . '<cr><c-\><c-n><c-w><c-k>'

В версии NeoVim мы должны перейти из режима Terminal-Normal в режим Terminal-Job перед передачей ввода в терминал, а затем вернуться в режим Terminal-Normal.

Другие вопросы по тегам