在 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 模式。
在我的 .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 模式。