【问题标题】:python vim tmux linux - copy multiple lines from vim to ipythonpython vim tmux linux - 将多行从 vim 复制到 ipython
【发布时间】:2016-07-13 20:46:44
【问题描述】:

我正在尝试将一段文本(Linux debian 中的 im)从 vim 复制到 ipython 我选择文本块“yank”,用 ctrl-Z 退出 vim,输入 ipython 和 shift-insert。

但是它总是只粘贴我原来复制的文本块的第一行..

知道如何粘贴多行吗?

(由@maxymoo 编辑以添加 MCVE)

docker run -t -i ubuntu /bin/bash
apt-get update && apt-get -y upgrade
apt-get install python-pip tmux vim
pip install --upgrade pip
pip install ipython

现在启动一个 tmux 会话,C-b % 拆分窗格,启动 vim 并输入以下行:

print("first line")
print("second line")

使用C-b [ C-space <arrow keys to select all> M-w将其复制到tmux剪贴板

使用C-b o 切换到另一个窗格并启动ipython 会话。 用C-b ]粘贴文本

输出:

In [1]: print("first line")                                                                                                                                    
first line                                                                                                                                                     

In [2]:                                                                                                                                                        

如果我使用%%time 单元魔法强制行延续模式,粘贴将正常工作:

In [3]: %%time
   ...: print("first line")
   ...: print("second line")
   ...:
first line
second line
CPU times: user 0 ns, sys: 0 ns, total: 0 ns
Wall time: 42.2 us

【问题讨论】:

    标签: python linux vim ipython


    【解决方案1】:

    你有几个选择:

    使用您的窗口管理器

    用鼠标突出显示文本,然后单击鼠标中键进行粘贴。某些版本的 Python 已关闭此行为,这很愚蠢。

    使用 tmux

    我有this tmux.conf

    所以对我来说,Ctrl+a[(你可以把它想象成[opy)然后我就用vim -like 键移动键盘,space 开始标记,Enter 复制。然后 Ctrl+] 粘贴。

    使用xclip

    $ cat yourfile.py | xclip
    

    应该将整个文件复制到系统剪贴板中。然后你应该可以正常粘贴了。

    使用系统剪贴板

    "+y 应该从 vim 拉到系统剪贴板。 "+yy 如果您没有在视觉上选择文本。根据您的环境的工作方式,这可能会或可能不会起作用。那么你的 shift+insert 选项应该起作用了。

    使用ipython魔术函数

    %run%ed(it)

    %edit 允许您编辑指定的文件。或者,如果你不给它一个文件名,它会给你一个临时文件。你也可以给它一个你定义的函数的名字,它会让你编辑这个函数。退出时,它将执行您的文件。它使用EDITOR env var 来确定要启动的编辑器。

    %run 使用指定的文件名将执行您的文件。

    这类似于在系统提示下运行 python 文件 args,但其优点是为您提供 IPython 的回溯,并将所有变量加载到您的交互式命名空间中以供进一步使用(除非使用 -p,见下文)。

    您可以在我谈论我的 IPython 工作流程here 时找到另一个答案。

    【讨论】:

    • tmux 解决方案真的适合您吗?当我尝试它时,我得到与 OP 完全相同的行为(在 debian 和 mac 上测试),只执行第一行,其余的被忽略。不知何故,tmux“粘贴”与系统剪贴板粘贴不同,后者会自动进入续行模式。 (如果我在没有系统剪贴板的远程服务器上,这很重要)
    • 你确定你真的用tmux的副本复制了东西吗?你可能想要做一个区域选择(v 在你开始复制之后,至少使用我的 tmux.conf)...
    • 是的,它肯定是在复制,例如,我可以将它粘贴到另一个 vim 中没有问题,我也可以使用 cmd-v 粘贴没有问题,只需使用C-a ] ipython 命令在第一行之后执行
    • @maxymoo 你能做一个 MCVE 吗?
    • 我在问题中添加了 MCVE
    【解决方案2】:

    在 vim 中编辑时键入 ctrl+z 时,请记住您返回到 shell 终端,因此您不能使用任何 vim 命令,而是需要使用CopyPaste 的终端提供的快捷方式,方法是在终端 Edition > Preferences > shortcuts 中检查它们,或者您可以使用鼠标单击。

    注意: 如果您在 vim 中使用鼠标复制文本时遇到问题,您需要通过此命令将其关闭 :set mouse=

    【讨论】:

    • 是的,这就是我使用命令 shift +insert 粘贴的方法;它可以工作,但只能粘贴任何多行块的第一行 - 这是我的问题
    • 测试是什么意思?
    • 是的,同样——同样奇怪的是,当文本已经在剪贴板中时,我根本无法从 vim 中拉出——即从 vim 中拉出并不会覆盖剪贴板中已有的内容
    猜你喜欢
    • 2017-09-10
    • 1970-01-01
    • 2019-01-07
    • 2021-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-27
    • 1970-01-01
    相关资源
    最近更新 更多