Vim 8如何向运行中的终端窗口发送缓冲区内容?
当然可以!Vim 8自带终端完全支持缓冲区内容发送
你完全不需要依赖外部插件,用Vim 8原生的终端功能就能把缓冲区内容发送到运行中的终端窗口(比如Python REPL)。下面是具体的操作步骤和实用技巧:
一、先启动目标终端会话
首先在Vim里打开运行Python REPL的终端窗口:
:terminal python
执行后会弹出一个新的终端缓冲区,里面就是熟悉的Python交互环境了。
二、几种发送内容的方法
1. 发送当前行到终端
把光标移到要发送的代码行,在普通模式下执行:
:call term_sendkeys(bufnr(''), getline('.') . "\n")
bufnr(''):获取当前终端缓冲区的编号(如果终端窗口是当前活动窗口的话)getline('.'):读取光标所在行的内容- 加上
"\n"是模拟按下回车,让终端执行这条命令
2. 发送选中的文本块(视觉模式)
进入视觉模式选中你要运行的代码块,然后执行:
:'<,'>call term_sendkeys(bufnr('@'), getline("'<", "'>")->join("\n") . "\n")
bufnr('@'):获取最近访问过的终端缓冲区编号,不用手动输入buf号更方便getline("'<", "'>"):读取选中范围内的所有行->join("\n"):把多行内容拼接成带换行的字符串,保证格式正确
3. 发送整个缓冲区内容
如果想把当前编辑的整个文件都发送到终端执行,运行:
:call term_sendkeys(bufnr(''), join(getline(1, '$'), "\n") . "\n")
4. 配置快捷键简化操作
为了不用每次都敲长命令,你可以在~/.vimrc里添加快捷键映射:
" 发送当前行到终端 nnoremap <leader>ts :call term_sendkeys(bufnr(''), getline('.') . "\n")<CR> " 发送选中的文本块到终端 vnoremap <leader>ts :'<,'>call term_sendkeys(bufnr('@'), getline("'<", "'>")->join("\n") . "\n")<CR> " 发送整个缓冲区到终端 nnoremap <leader>tS :call term_sendkeys(bufnr(''), join(getline(1, '$'), "\n") . "\n")<CR>
默认<leader>是反斜杠\,以后按\ts就能快速发送当前行或选中内容,\tS发送整个缓冲区,效率高很多。
小提示
- 用
:ls命令可以查看所有缓冲区,终端缓冲区的名称一般是term://*开头,如果你有多个终端会话,可以用bufnr('term://*python*')这样的方式精准匹配Python REPL的终端,比如::call term_sendkeys(bufnr('term://*python*'), getline('.') . "\n") - 确保终端处于可输入状态(没有被暂停),否则发送的内容可能不会立即执行。
内容的提问来源于stack exchange,提问作者Stagrovin
相关产品推荐
相关产品推荐

