簡體   English   中英

復制vim中的行以在ter命令打開的上面窗口中執行?

[英]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)

現在用vim中的ter命令打開一個新窗口。 在此輸入圖像描述

執行處於編輯狀態的embed.py的常規方法。

:! python3 %    

在此輸入圖像描述

打開新窗口並執行embed.py
在此輸入圖像描述

我有一個新的想法,如何將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>

\\p將把^W"+放在python3的交互式窗口上。 在此輸入圖像描述

狀態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"+yGnormal gg"*yGctrl+v+shiftctrl+w+ctrl+vctrl+v幾乎相同的結果都不能在寄存器中粘貼內容*如果它是normal gg"*yGCopyPasteBuffer() (在我的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+VCTRL+SHIFT+VCMD+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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM