2014-10-01 41 views
1

每個內居中文本所以很多時候,我發現自己繪製簡單ASCII圖表中的Vim:Vim的:選擇

 +-----------+ 
... --> | foo  | --> ... 
     +-----------+ 

大部分時間有花費確保文本居中:

 +-----------+ 
... --> | foo | --> ... 
     +-----------+ 

不幸,到目前爲止,我一直無法自動化該過程:我想象在可視模式下選擇框(即「foo」加上前導/尾隨空白),然後輸入一個命令來中心該選擇(Vim的內置:center適用於整條線,這並沒有幫助我。)

這樣的事情是否已經存在?如果沒有,我將如何爲這個特定的操作創建一個簡單的腳本?

+0

我曾經寫了一個腳本,以阻止文本,它支持'C,R,l'對齊。你可以檢查它是否有幫助:https://github.com/sk1418/blockit – Kent 2014-10-01 09:26:26

+0

這看起來與我之後的非常相似,但我努力使其在預測試中按預期工作:我選擇了「foo」 (加上週圍的空格)並使用':'<,'> Block' - 但是重新格式化了整行,而不是僅僅是這一個盒子。 – AnC 2014-10-01 10:14:31

+0

「blockit」不會完全符合你的要求。它也添加了「盒子」。但你可以看看對齊部分是如何完成的。 – Kent 2014-10-01 11:22:11

回答

6

有一個調整功能,你可以測試你的需求。

  • ,這僅適用於單一的選線。
  • 也不應選擇邊框字符(例如,在您的示例中爲|)。
  • 它只適用於視覺選擇
  • 如果你喜歡,可以創建v-mapping。
  • 如果它不能滿足您的需求,請修改該功能。

    function! GetVisual() 
        try 
         let v_save = @v 
         normal! gv"vy 
         return @v 
        finally 
         let @v = v_save 
        endtry 
    endfunction 
    
    fun! CenterMe() 
        let v = GetVisual() 
        "let l = getline('.') 
        let lre = '^\zs\s*\ze\S' 
        let rre = '\s*$' 
        let sp= matchstr(v,lre) 
        let sp .= matchstr(v,rre) 
        let ln=len(sp) 
        let v = substitute(v,lre,sp[:ln/2-1],'') 
        let v = substitute(v,rre,sp[ln/2:],'') 
        let ve_save = &virtualedit 
        let v_save = @v 
        let &virtualedit = 'all' 
        call setreg('v', v,visualmode()) 
        normal! gvx"vP 
        let @v = v_save 
        let &virtualedit = ve_save 
    endf 
    

的工作方式就像:

enter image description here

+0

這正是我所希望的 - 現在我只需要幫助代碼......非常感謝! – AnC 2014-10-01 11:54:55