在 vim 中将输入发送到嵌入式终端

Sending input to embedded terminal in 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会先改变windows(改变到嵌入式终端),然后输入命令

python my_python_file.py

这样文件就会运行在python,最后改回另一个window这样我就可以继续编辑了。这行得通!但我希望它适用于任意文件,而不仅仅是名为 my_python_file.py 的文件。如何实现?

我想过用expand('%:p')来获取当前文件的完整路径,但是一直无法将这个字符串作为输入传递给嵌入式终端window。我曾尝试编写一个函数来完成此操作,但没有成功。

关键是使用 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。请注意,终端始终处于终端作业模式。

需要稍作修改才能与 Neo 一起使用Vim:

" 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 模式,然后 return 更改为 Terminal-Normal 模式。