Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/vim/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x 复制vim中的行以在ter命令打开的上述窗口中执行?_Python 3.x_Vim - Fatal编程技术网

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

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版本

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