在我的.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')
来获取当前文件的完整路径,但我无法将此字符串作为输入传递给嵌入式终端窗口。我曾尝试编写一个函数来实现这一目标,但没有成功。
关键是使用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版本中,我们必须在将输入传递到终端之前从终端正常模式切换到终端作业模式,然后返回终端正常模式。