我正在使用最新的 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 中的命令。正常的执行方式
embed.py
处于编辑状态。:! python3 %
新窗口打开并执行
embed.py
.我有一个新想法,如何复制
embed.py
中的所有行进入由 ter
打开的上述窗口vim 中的命令?显示预期的方式如下。ggyG
不能工作。在vim窗口中移动光标,按
ggyG
.在 python3 窗口中移动光标。
ctrl + v
不能工作,<C-\><C-N>
也不能工作。是时候尝试使用 gui 方式了,也不要粘贴任何东西。
像 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 的交互式窗口上。状态二:
在我的 .vimrc 中写入以下内容。
function! CopyPasteBuffer()
normal gg"+yG
wincmd p
endfunction
nnoremap <leader>p :call CopyPasteBuffer()<CR>
\p
将光标移动到上方窗口,现在按 ctrl+v+sfift
可以生效。几乎完成了!这仍然是一个问题。
最后一步(第 3 步)将所有程序的行粘贴到 python 交互窗口中并没有自动进入 vimscript,rkta 的
CopyPasteBuffer()
仅用热键 \p
绑定(bind)两个步骤成功地。请尝试使用 bash 而不是 zsh。
normal gg"+yG
的结果几乎相同和 normal gg"*yG
, ctrl+v+shift
或 ctrl+w+ctrl+v
或 ctrl+v
无法将内容粘贴到寄存器 *
如果是 normal gg"*yG
在 CopyPasteBuffer()
(在我的 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/