2013-07-10 39 views
2

我想在Vim中使用鍵盤快捷鍵將整個函數從Powershell文件複製到Windows剪貼板。這裏是它的命令:將代碼函數複製到剪貼板的Vim函數

1)va{Vok"*y - 視覺模式,選擇{}塊,可視化線模式,去選擇頂部,包括標題行,插入到Windows剪貼板。

但它只適用於沒有內部{}塊的函數。這是一個有效的解決方法:

2)va{a{a{a{a{a{a{Vok"*y - 與(1)相同,但選擇{}塊多次完成 - 適用於有7個內部大括號的代碼塊。

但事實是 - 從vim的函數調用的時候,(1)命令工作正常,但(2)行爲不端,並選擇從vim的函數調用時錯誤的代碼塊:

function! CopyCodeBlockToClipboard() 
    let cursor_pos = getpos('.') 
    execute "normal" 'va{a{a{a{a{a{a{Vok"*y' 
    call setpos('.', cursor_pos) 
endfunction 

" Copy code block to clipboard 
map <C-q> :call CopyCodeBlockToClipboard()<CR> 

我是什麼在CopyCodeBlockToClipboard中做錯了嗎? (2)命令在vim中直接執行時按預期工作。

UPDATE:

我注意到:

  • ,如果還有更多的是{然後在函數中包含塊
  • 那麼Vim不會執行V

看起來vim在這裏處理錯誤的方式不同。額外{產生一些錯誤和常規命令執行忽略它。但是通過執行函數來執行:normal會失敗,並且不會調用V(或者可能跟隨錯誤的任何命令)。

針對此問題的任何解決方法?

+0

從你想從功能任意位置做它的外觀。它是否正確? – FDinoff

+0

是的。函數中任何使用{}大括號表示代碼塊的位置,並且總是使用一行代替函數頭。 – FallenGameR

回答

1

嘗試該功能

function! CopyCodeBlockToClipboard() 
    let cursor_pos = getpos('.') 
    let i = 1 
    let done = 0 
    while !done 
     call setpos('.', cursor_pos) 
     execute "normal" 'v' . i . 'aBVok"*y' 
     if mode() =~ "^[vV]" 
      let done = 1 
     else 
      let i = i + 1 
     endif 
    endwhile 
    execute "normal \<ESC>" 
    call setpos('.', cursor_pos) 
endfunction 

此預製件執行命令,直到其不能選擇塊更大的塊選擇的塊。 ([count]aB選擇[count]塊)看起來當選擇失敗時,我們以可視模式結束。所以我們可以用mode()來檢查這個。

當此功能退出時,您應該處於正常模式,光標應該恢復到您開始的位置。該功能將在*寄存器中。

+0

謝謝!它的作品=) – FallenGameR

1

這個宏應該來接近你想要達到的目標:

?Function<CR> jump to first Function before the cursor position 
v    enter visual mode 
/{<CR>   extend it to next { 
%    extend it to the closing } 
"*y   yank into the system clipboard 
+0

我知道如何通過q​​記錄這個宏。但我不知道如何把它放在一個函數中。 ':normal?Function <> CR'顯然不起作用。此外,我可以將這種宏保存爲bin格式,但這不會保留當前的光標位置。 – FallenGameR

+0

這是我想出來的。但它不起作用,我的vim知識不足以找出錯誤: '功能!CopyCodeBlockToClipboard()'' 讓cursor_pos = GETPOS( '')'' 讓@q =「功能\ |?濾波器 V/{%「* y'' '執行「正常@ q'' '調用setpos('。',cursor_pos)' 'endfunction' – FallenGameR