![](/img/trans.png)
[英]I need to find a line of text in python and copy it, and the lines above and below it
[英]Copy lines in vim to execute in above window opened by ter command?
我使用的是最新的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)
執行處於編輯狀態的embed.py
的常規方法。
:! python3 %
我有一個新的想法,如何將embed.py
所有行復制到vim中由ter
命令打開的上面窗口中?顯示預期的方式如下。
ggyG
無法工作。 將光標移動到vim窗口,然后按ggyG
。 在python3窗口中移動光標。
ctrl + v
無法正常工作, <C-\\><CN>
也無法正常工作。
現在是時候嘗試gui方式,也沒有粘貼。
如Tarun Lalwani所說:
step1:將行復制到系統剪貼板中
:%y+
或與其他命令。
step2:將光標移動到運行python3的上層窗口。
step3:ctrl + v + shift
如何使用熱鍵綁定所有步驟?
狀態1:
在我的.vimrc中寫下以下內容。
function! CopyPasteBuffer()
normal gg"+yG
wincmd p
call feedkeys('^W"+')
endfunction
nnoremap <leader>p :call CopyPasteBuffer()<CR>
狀態2:
在我的.vimrc中寫下以下內容。
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
在CopyPasteBuffer()
(在我的bash中驗證)。
有一個名為term_sendkeys
的內置函數可將密鑰發送到終端緩沖區。
這是一個使用term_sendkeys將當前緩沖區中的所有行發送到第一個終端窗口的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>
但是oneliner一眼就難以理解,因此最好將其定義為函數並定義一個映射來調用它:
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>
你必須明白,當你在vim
划線時,它基本上不會進入系統的剪貼板。 上部窗口中顯示的terminal
只能與系統的剪貼板進行交互
您可以在下面的線程中看到如何使用系統剪貼板
https://vi.stackexchange.com/questions/84/how-can-i-copy-text-to-the-system-clipboard-from-vim
我使用具有pbcopy
mac復制到剪貼板。 所以我可以執行類似:silent !pbcopy < %
。 這會將文件復制到剪貼板。 然后正常的CTRL+V
或CTRL+SHIFT+V
或CMD+V
將根據您的操作系統工作
對於unix,你會使用像xclip
這樣的xclip
要復制當前緩沖區,切換到僅在拆分運行的終端並粘貼緩沖區內容使用此功能:
function! CopyPasteBuffer()
normal ggyG
wincmd p
call feedkeys("\<C-W>\"*")
endfunction
(因為我們處於終端模式,我們需要使用Ctrl W“粘貼,請參閱:h terminal-typing
for other other keys。)
這將粘貼所有內容並將您留在終端緩沖區中 - 使用Ctrl W W切換回來。
將其綁定到密鑰用途
nnoremap <leader>p :call CopyPasteBuffer()<CR>
如果您沒有重新綁定leader
密鑰,則可以使用\\ p執行該功能。
要將函數與*
寄存器一起使用,只需將函數更改為
function! CopyPasteBuffer()
normal gg"*yG
wincmd p
call feedkeys("\<C-W>\"*")
endfunction
根據這個SO答案和@Amadan的評論,在終端窗口中,命令ctrl -w N (大寫N)允許退出“插入模式”(這樣你就可以從終端窗口復制東西); 另外, ctrl-w “后跟相應的寄存器名稱( *
表示X primary, +
表示X剪貼板)允許粘貼所述寄存器的內容(這是你感興趣的內容)。你也可以用ctrl粘貼主寄存器-insert ,剪貼板注冊您在其中一個屏幕截圖上顯示的窗口菜單。
關於寄存器:長話短說,Vim存儲了各種命名寄存器中的文本。 如果從X圖形環境運行Vim,則Vim寄存器*
連接到X剪貼板“primary”(通常是使用鼠標從圖形應用程序中選擇的最后一個文本),並且Vim寄存器+
連接到X剪貼板“剪貼板”(通常是在圖形應用程序中使用快捷鍵ctrl-v復制的最后一個文本)。 默認情況下,Vim將文本與命令y y一起放入寄存器*
,但您也可以將其放在+
中,並且可以將默認值更改為+
( set clipboard=unnamedplus
)。
使用您喜歡的寄存器。 只有確保復制和粘貼( 即默認為Y Y通常會復制到X主,而窗口菜單將從X剪貼板粘貼),當您使用相同的。
官方消息來源:閱讀:help terminal
學習如何使用Vim的終端窗口,以及:help registers
Vim的寄存器。
( 可信來源:谷歌PageRank。)
但是在你的情況下,你不是在尋找用於將文件導入REPL的Python關鍵字嗎? 雖然我不太了解Python,但它應該看起來像import embed
或者其他東西。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.