2012-04-07 86 views
0

我試圖創建一個腳本,允許我選擇幾行並在其周圍創建一個virtualedit塊;最長行後1列。圍繞選擇創建virtualedit塊

這是我的代碼

function! VirtualEdit() 
    let EndLine = line("'>") 

    set virtualedit = all 

    let maxlength = max(map(range(line("'<"), line("'>")), "virtcol([v:val, '$'])"))-1 
    call cursor(1,maxlength+1) 
    normal "^Q".EndLine."jc<space><ESC>" 

    set virtualedit = '' 
endfunction 

它必須做什麼是
1)控制在我的選擇(最大長度)的最長的線。
2)將光標放在最長行+1列的選區中的第一行上。 3)比激活視覺塊選擇(在我的Windows PC上,命令是C-Q)
4)擴展視覺塊直到選擇的最後一行(我的電腦向下移動的命令=「j」)。
5)使用「c」鍵插入「空格」字符並按ESC退出插入模式,以便用空格填充虛擬塊列。

但是我找不到如何在正常的命令中使用變量(Endline)。
我還注意到,在上面的例子中,鍵不起作用。
我錯了什麼?

回答

3

您在這裏有許多錯誤:

  1. :set不會讓你有大約=
  2. :set空間不接受的表達式,從而set ve=''let &ve="''",不let &ve=''這是:set ve=
  3. :normal命令也不接受表達式,它接受剛剛執行的字符串。因此:normal "^正試圖使用​​寄存器^,失敗(沒有這樣的寄存器)並且停止處理該行的其餘部分。使用:execute將表達式傳遞給:normal
  4. :normal命令不接受<Key>語法。 viml表達式也不是,它們有"\<Key>"(注意:只有雙引號和反斜槓)。 ^Q語法不被任何人接受,並且在文本文件中使用原始控制代碼(在vim中顯示爲^Q)並不是最好的主意。
  5. 不要使用:normal沒有爆炸。大多數時候你不需要它(在這種情況下,你需要替換^Q\<C-v>,因爲它是一個映射)。
  6. 請勿硬編碼virtualedit值。取而代之的

    set ve=all 
    <...> 
    set ve= 
    

    使用

    let savedve=&ve 
    set ve=all 
    try 
        <...> 
    finally 
        let &ve=savedve 
    endtry 
    
  7. {N}j意味着「N線下」,而不是「去N行」。 「去第N行」是{N}gg{N}G
  8. 您有let maxlen=<...>-1maxlen被使用,您有maxlen+1。它很奇怪。

如果解決這個問題,你可以繼續,但你並不需要調整virtualedit和使用:normal可言:

function AddSpaces() 
    let [lstart, lend]=[line("'<"), line("'>")] 
    if lstart>lend 
     let [lstart, lend]=[lend, lstart] 
    endif 
    let maxcol=max(map(range(lstart, lend), "virtcol([v:val, '$'])")) 
    let newlines=map(range(lstart, lend), 'printf("%-'.maxcol.'s", getline(v:val))') 
    call setline(lstart, newlines) 
endfunction 
+0

謝謝ZYX!我每天都在學習,但還有很多東西需要學習。我會更多地研究你的信息。目前它給了這個錯誤;未知功能設定。 – Reman 2012-04-07 20:40:54

+0

@Remonn。是的,它應該是'setline'。忘記粘貼文件修改我寫了我的代碼來測試它,對不起。 – ZyX 2012-04-07 20:52:30

+0

是的,它的工作原理!只是一件事:我必須改變什麼才能包含上面函數中的選定空行? – Reman 2012-04-08 06:40:17