Python 3.x 复制vim中的行以在ter命令打开的上述窗口中执行?
我正在使用最新的vim版本Python 3.x 复制vim中的行以在ter命令打开的上述窗口中执行?,python-3.x,vim,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) 现在用vim中的ter命令打开一个新窗口。 执行处于编辑状态的embed.py的正常方式 :! python3 % 新窗口打开并执行embed.p
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)
现在用vim中的ter
命令打开一个新窗口。
执行处于编辑状态的embed.py
的正常方式
:! python3 %
新窗口打开并执行embed.py
我有一个新想法,如何将
embed.py
中的所有行复制到vim中的ter
命令打开的上述窗口中?如下所示
ggyG
无法工作。
在vim窗口中移动光标,然后按ggyG
。
在python3窗口中移动光标。ctrl+v
不能工作,
也不能工作。是时候尝试用gui方式了,也不粘贴任何东西 照Tarun Lalwani说的做:
步骤1:将行复制到系统剪贴板
:%y+
或者用其他命令
步骤2:将光标移动到运行python3的上部窗口中。步骤3:ctrl+v+shift 如何使用热键绑定所有步骤?
状态1: 在my.vimrc中编写以下内容
function! CopyPasteBuffer()
normal gg"+yG
wincmd p
call feedkeys('^W"+')
endfunction
nnoremap <leader>p :call CopyPasteBuffer()<CR>
function! CopyPasteBuffer()
normal gg"+yG
wincmd p
endfunction
nnoremap <leader>p :call CopyPasteBuffer()<CR>
\p
将光标移动到上部窗口,现在按ctrl+v+sfift
可以生效。差不多完成了!这仍然是一个问题。
将所有程序行粘贴到python交互窗口的最后一步(步骤3)尚未自动添加到vimscript中,rkta的
CopyPasteBuffer()
仅使用热键\p
成功绑定两个步骤。请尝试一下bash,而不是zsh。 对于
normal gg“+yG
和normal gg”*yG
,ctrl+v+shift
或ctrl+w+ctrl+v
或ctrl+v
不能将内容粘贴到寄存器*
中,如果它是normal gg”*yG
中的复制粘贴缓冲区()
(在我的bash中验证)。如何使用终端窗口
根据and@Amadan的评论,在终端窗口中,命令ctrl wN(大写N)允许退出“插入模式”(以便您可以从终端窗口复制内容);此外,ctrl-w后跟适当的寄存器名(*
用于X主,+
用于X剪贴板)允许粘贴所述寄存器的内容(这是您感兴趣的内容)。您还可以使用ctrl-insert粘贴主注册表,使用屏幕截图上显示的窗口菜单粘贴剪贴板注册表
如何使用寄存器
在寄存器上:长话短说,Vim以不同的命名方式存储被拉出来的文本。如果从X图形环境运行Vim,Vim寄存器*
连接到X剪贴板“主”(通常是鼠标从图形应用程序中选择的最后一个文本),Vim寄存器+
连接到X剪贴板“剪贴板”(通常是用快捷键ctrl-v从图形应用程序中复制的最后一个文本)。默认情况下,Vim将用命令yy拖动的文本放入寄存器*
,但您也可以将其放入+
,您可以将默认值更改为+
(设置剪贴板=unnamedplus
)
使用您喜欢的寄存器。仅确保在复制和粘贴时使用相同的寄存器(即默认情况下,yy通常会复制到X主,而窗口菜单将从X剪贴板粘贴)
官方来源:阅读:help terminal
了解如何使用Vim的终端窗口,以及:help registers
了解Vim的寄存器
(可靠来源:谷歌PageRank。)
然而,在您的例子中,您不是更关注用于将文件导入REPL的Python关键字吗?虽然我对Python不太了解,但它可能看起来像是
import embed
或其他什么东西。您必须理解,当您在vim
中拖动行时,它基本上不会进入系统的剪贴板。上部窗口中显示的终端
只能与系统的剪贴板交互
您可以看到下面关于如何使用系统剪贴板的线程
我使用带有pbcopy
的mac将文件复制到剪贴板。因此,我可以执行类似:silent!pbcopy<%
的操作。这将把文件复制到剪贴板。然后,根据您的操作系统,正常的CTRL+V
或CTRL+SHIFT+V
或CMD+V
将工作
对于unix,您可以使用类似于xclip
要复制当前缓冲区,请切换到仅在拆分中运行的终端,并使用此功能粘贴缓冲区内容:
function! CopyPasteBuffer()
normal ggyG
wincmd p
call feedkeys("\<C-W>\"*")
endfunction
如果没有重新绑定引线
键,则可以使用\p执行该功能
要使用带有
*
寄存器的函数,只需将函数更改为
function! CopyPasteBuffer()
normal gg"*yG
wincmd p
call feedkeys("\<C-W>\"*")
endfunction
函数!CopyPasteBuffer()
正常gg“*yG
wincmd p
调用feedkeys(“\\”*”)
端功能
有一个名为
term\u sendkeys
的内置函数,用于将密钥发送到终端缓冲区
下面是一个使用term\u sendkeys
将当前缓冲区中的所有行发送到第一个终端窗口的单行程序:
:cal term_sendkeys(term_list()[0],join(map(getbufline(bufnr('.',1,'$),'v:val'.\n'.,'')
您可以简单地定义一个映射来执行.vimrc
中的oneliner,如下所示:
nnoremap p:cal term_sendkeys(term_list()[0],join(map(getbufline(bufnr('.),1,'$),'v:val.\n''),'')
但是,OneLiner有点难以一目了然理解,因此最好将其定义为一个函数,并定义一个映射来调用它:
函数!s:SendLinesToTerm()
让term_buf=term_list()[0]
让line=getbufline(bufnr(“.”),1,“$”)
让str=join(映射(行,'v:val.\n''),'')
cal term_sendkeys(term_buf,str)
端功能
nnoremap p:调用SendLinesToTerm()
像往常一样,从一个窗口中猛拉(ggyG
),将(p
)粘贴到另一个窗口。(您需要在termi中处于正常模式。)
function! CopyPasteBuffer()
normal gg"*yG
wincmd p
call feedkeys("\<C-W>\"*")
endfunction