python-3.x - 复制 vim 中的行以在 ter 命令打开的上述窗口中执行?

标签 python-3.x vim

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

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

用 vim 编辑一个 python 文件。
vim  embed.py
x = 3 
print(x)
y =4 
print(x+y)

现在用 ter 打开一个新窗口vim 中的命令。
enter image description here

正常的执行方式embed.py处于编辑状态。
:! python3 %    

enter image description here

新窗口打开并执行embed.py .
enter image description here

我有一个新想法,如何复制embed.py中的所有行进入由 ter 打开的上述窗口vim 中的命令?显示预期的方式如下。

enter image description hereggyG不能工作。
在vim窗口中移动光标,按ggyG .
enter image description here
在 python3 窗口中移动光标。ctrl + v不能工作,<C-\><C-N>也不能工作。
是时候尝试使用 gui 方式了,也不要粘贴任何东西。

enter image description here
enter image description here

像 Tarun Lalwani 说的那样做:
step1:将行复制到系统剪贴板
:%y+

或与其他命令。

step2:将光标移动到运行python3的上部窗口。
第三步:ctrl+v+shift

如何用热键绑定(bind)所有步骤?
状态一:

在我的 .vimrc 中写入以下内容。
function! CopyPasteBuffer()
     normal gg"+yG
     wincmd p
     call feedkeys('^W"+')
endfunction

nnoremap <leader>p :call CopyPasteBuffer()<CR>
\p将放^W"+在 python3 的交互式窗口上。
enter image description here

状态二:

在我的 .vimrc 中写入以下内容。
function! CopyPasteBuffer()
     normal gg"+yG
     wincmd p
endfunction

nnoremap <leader>p :call CopyPasteBuffer()<CR>
\p将光标移动到上方窗口,现在按 ctrl+v+sfift可以生效。
enter image description here

几乎完成了!这仍然是一个问题。
最后一步(第 3 步)将所有程序的行粘贴到 python 交互窗口中并没有自动进入 vimscript,rkta 的 CopyPasteBuffer()仅用热键 \p 绑定(bind)两个步骤成功地。
请尝试使用 bash 而不是 zsh。normal gg"+yG 的结果几乎相同和 normal gg"*yG , ctrl+v+shiftctrl+w+ctrl+vctrl+v无法将内容粘贴到寄存器 *如果是 normal gg"*yGCopyPasteBuffer() (在我的 bash 中验证)。

最佳答案

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

这是一个使用 term_sendkeys 将当前缓冲区中的所有行发送到第一个终端窗口的单行器。 :

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

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

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

但是 oneliners 乍一看有点难以理解,所以最好将它定义为一个函数并定义一个映射来调用它:

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>

关于python-3.x - 复制 vim 中的行以在 ter 命令打开的上述窗口中执行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57601801/

相关文章:

python - 为什么我需要创建另一个文件句柄才能再次读取同一文件?

python - 如何从kml文件中获取所有坐标?

Vim Quickfix 前缀双栏 "||"— 解释一下?

macos - 从查找器打开gvim/MacVim中未正确设置$ PATH变量

python - 如果一个任务失败,如何取消收集中的所有剩余任务?

python-3.x - 基于不同列值的条件语句

python - 列表中每个元素的总和

c++ - 如何在 vim 的 SysntasticCheck 中显示所有 "g++ -Wall "错误警告?

vim - 为什么大多数 vim 配色方案在我使用时看起来不像屏幕截图那么漂亮?

VIM突出显示缓冲区中的唯一单词?