复制vim中的行以在上述由ter命令打开的窗口中执行?

it_*_*ure 3 vim python-3.x

我正在使用最新的vim版本。

vim --version | head -1
VIM - Vi IMproved 8.1 (2018 May 18, compiled Aug 12 2019 17:28:55)
Run Code Online (Sandbox Code Playgroud)

使用vim编辑python文件。

vim  embed.py
x = 3 
print(x)
y =4 
print(x+y)
Run Code Online (Sandbox Code Playgroud)

现在ter在vim中使用命令打开一个新窗口。 在此处输入图片说明

正常的执行方式embed.py是处于编辑状态。

:! python3 %    
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

新窗口打开并执行embed.py
在此处输入图片说明

我有一个新的主意,如何将所有行复制embed.pytervim中由命令打开的上述窗口中?

在此处输入图片说明 ggyG不能工作。在vim窗口中移动光标,然后按ggyG在此处输入图片说明 在python3窗口中移动光标。
ctrl + v不能工作,<C-\><C-N>也不能工作。
现在是时候尝试使用gui方式,也不要粘贴任何内容。

在此处输入图片说明 在此处输入图片说明

如Tarun Lalwani所说:
步骤1:将行复制到系统剪贴板中

:%y+
Run Code Online (Sandbox Code Playgroud)

或与其他命令。

第2步:将光标移到运行python3的上部窗口中。
第三步:Ctrl + V + Shift

如何用热键绑定所有步骤?
状态1:

在我的.vimrc中编写以下内容。

function! CopyPasteBuffer()
     normal gg"+yG
     wincmd p
     call feedkeys('^W"+')
endfunction

nnoremap <leader>p :call CopyPasteBuffer()<CR>
Run Code Online (Sandbox Code Playgroud)

\p将放在^W"+python3的交互式窗口中。 在此处输入图片说明

状态2:

在我的.vimrc中编写以下内容。

function! CopyPasteBuffer()
     normal gg"+yG
     wincmd p
endfunction

nnoremap <leader>p :call CopyPasteBuffer()<CR>
Run Code Online (Sandbox Code Playgroud)

\p将光标移至上窗口,现在按下ctrl+v+sfift即可生效。
在此处输入图片说明

快完成了!这里仍然是一个问题。
将所有程序行粘贴到python交互式窗口中的最后一步(第3步)尚未自动添加到vimscript中,rkta CopyPasteBuffer()\p成功地用热键绑定了两个步骤。
请尝试使用bash代替zsh。几乎相同的结果,两个normal gg"+yGnormal gg"*yGctrl+v+shiftctrl+w+ctrl+vctrl+v不能粘贴寄存器的内容*,如果它是normal gg"*yGCopyPasteBuffer()(在我的bash验证)。

Tac*_*roy 5

有一个名为term_sendkeys将密钥发送到终端缓冲区的内置函数。

这是一个使用以下命令将当前缓冲区中的所有行发送到第一个终端窗口的oneliner term_sendkeys

:cal term_sendkeys(term_list()[0], join(map(getbufline(bufnr('.'), 1, '$'), 'v:val . "\n"'), ''))
Run Code Online (Sandbox Code Playgroud)

您可以.vimrc像这样简单地定义一个映射来执行oneliner :

nnoremap <leader>p :<c-u>cal term_sendkeys(term_list()[0], join(map(getbufline(bufnr('.'), 1, '$'), 'v:val . "\n"'), ''))<Cr>
Run Code Online (Sandbox Code Playgroud)

但是,单眼一眼很难理解,因此最好将其定义为一个函数并定义一个映射以进行调用:

function! s:SendLinesToTerm()
  let term_buf = term_list()[0]
  let lines = getbufline(bufnr('.'), 1, '$')
  let str = join(map(lines, 'v:val . "\n"'), '')

  cal term_sendkeys(term_buf, str)
endfunction
nnoremap <leader>p :call <SID>SendLinesToTerm()<Cr>
Run Code Online (Sandbox Code Playgroud)