【问题标题】:Sending input to embedded terminal in vim在vim中将输入发送到嵌入式终端
【发布时间】:2018-05-30 07:56:32
【问题描述】:

在我的.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的文件,我可以按&lt;leader&gt;&lt;leader&gt;,vim会先换窗口(换成嵌入式终端),然后输入命令

python my_python_file.py

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

我曾考虑使用expand('%:p') 来获取当前文件的完整路径,但我无法将此字符串作为输入传递给嵌入式终端窗口。我已经尝试编写一个函数来实现这一点,但没有成功。

【问题讨论】:

  • 你查看term_sendkeys()了吗?那也许能够达到你想要的。如果您找到解决方案,请将其作为答案发布,我也对此感兴趣。

标签: python vim terminal-emulator


【解决方案1】:

关键是使用map &lt;expr&gt; &lt;leader&gt;&lt;leader&gt; ... 以便&lt;leader&gt;&lt;leader&gt; 可以映射到动态生成的绑定。以下来自.vimrc 文件的代码 sn-p 适用于 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>'

这会将&lt;leader&gt;t 映射为打开一个新的终端缓冲区,并将&lt;leader&gt;&lt;leader&gt; 映射为在该终端缓冲区中运行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 模式。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-05-01
    • 2021-02-17
    • 2022-11-26
    • 2016-03-19
    • 2011-05-18
    • 2016-06-06
    • 1970-01-01
    • 2018-02-13
    相关资源
    最近更新 更多