vim 在IPython Vi模式下将所选文本拖动/复制到剪贴板

kx7yvsdv  于 2022-11-11  发布在  Python
关注(0)|答案(2)|浏览(142)

我不知道如何在Vim模式下将我在IPython中选择/高亮显示的行复制到普通剪贴板(粘贴到IPython shell之外)。通常,在Vim中,我可以使用"+y拖动文本并将其粘贴到其他地方,但在IPython Vim模式下按这些键似乎不起作用。因此,我最终不得不使用鼠标高亮显示所需的文本,并使用Command-C复制它。
这是一个烦恼,因为如果我在IPython中有多行,将会有许多垃圾字符,我必须过滤掉,如下所示:

In [8]: import numpy as np 
   ...: import math 
   ...:  
   ...: print("hi") 
   ...: while(True): 
   ...:     break 
   ...:  
   ...: x = 3 
   ...: y = 4 
   ...:  
   ...:

在这里,我必须过滤掉每行中的In [8]...:,但选择使用vV会适当地忽略这些垃圾字符。
This answer没有说明 * 如何 * 在Vi模式下执行此操作,也没有提到任何关于拖动到系统剪贴板的内容。

btqmn9zl

btqmn9zl1#

如果您在Vim终端内运行ipython,则可以在ipython中键入以下内容:%history -l 10
这将打印最后10个命令,不带前导点。这可以很容易地复制。
你需要在vim终端中打开ipython.然后,在键入%history命令后(如上),您需要使用组合键Ctrl-W Shift_N进入正常模式。然后,使用V复制多行(块可视模型)复制到+寄存器中。然后,您可以使用"+p或其他应用程序(如gedit)使用“右键单击,然后粘贴'

dxxyhpgq

dxxyhpgq2#

下面是我在深入研究了IPython和prompt-toolkit的文档之后为此目的编写的一个小插件脚本:y拖到系统剪贴板,p在光标 * 后 * 粘贴(这与正常的vi(m)行为不同)。此脚本将添加到IPython配置文件配置目录的startup子目录中(请参阅IPython文档或example config


# !/usr/bin/env python3

from IPython import get_ipython
from prompt_toolkit.enums import DEFAULT_BUFFER
from prompt_toolkit.keys import Keys
from prompt_toolkit.filters import HasFocus, ViNavigationMode, ViSelectionMode, ViInsertMode, EmacsInsertMode, HasSelection
from prompt_toolkit.key_binding.vi_state import InputMode

import pyperclip

ip = get_ipython()

def copy_selection_to_clipboard(event):
    buffer = event.current_buffer
    data = buffer.copy_selection()
    pyperclip.copy(data.text)

def paste_from_clipboard(event):
    buffer = event.current_buffer
    data = pyperclip.paste()
    event.cli.vi_state.input_mode = InputMode.INSERT
    buffer.insert_text(data)
    event.cli.vi_state.input_mode = InputMode.NAVIGATION

# Register the shortcut if IPython is using prompt_toolkit

if getattr(ip, 'pt_app', None):

    filter_ = HasFocus(DEFAULT_BUFFER) & ViSelectionMode()
    ip.pt_app.key_bindings.add_binding('y', filter=filter_)(copy_selection_to_clipboard)

    filter_ = HasFocus(DEFAULT_BUFFER) & ViNavigationMode()
    ip.pt_app.key_bindings.add_binding('p', filter=filter_)(paste_from_clipboard)

相关问题