一個簡單的方法在列對齊文本是用Tabular或Align 插件。如果這些都沒有準備好,可以使用以下 有點棘手(並且看起來有點麻煩),但完美的工作(對於 這種情況)命令。 1,2-
:let m=0|g/\ze -- /let m=max([m,searchpos(@/,'c')[1]])
:%s//\=repeat(' ',m-col('.'))
第一命令的目的是確定列的寬度來 隔板的左側(我假定爲--
這裏)。寬度爲 ,計算爲 所有行中第一列中文本的最大長度。 :global
命令用於枚舉包含分隔符的行 (其他行不需要對齊)。位於模式開始之後的\ze
原子會將 匹配的結尾設置在開始的相同位置(請參閱:help \ze
)。更改匹配的 邊界不會影響:global
命令的工作方式, 模式的寫入方式只是爲了匹配下一個 替換命令的需要:由於這兩個命令可以共享相同的模式,因此可以使用 在第二個中被省略。
在所述匹配線上運行的命令,
:let m=max([m,searchpos(@/,'c')[1]])
調用searchpos()
功能來搜索在父 :global
命令中使用的模式,並獲取匹配的列位置。 模式被稱爲@/
使用最後的搜索模式寄存器(見:help "/
)。這利用了:global
命令開始執行後立即更新寄存器 /
的事實。該c
標誌作爲searchpos()
呼叫 第二個參數允許(:global
位置光標在 行一開始就執行的命令)的比賽在一行的第一 字符,因爲它可能是有在分隔符的左側沒有文本 。 searchpos()
函數返回一個列表,其中第一個元素是匹配位置的行號, 第二個元素是列位置。如果該命令在一行上運行,則行 與包含:global
命令的模式相匹配。由於searchpos()
是 尋找相同的模式,肯定是在該行的匹配。 因此,只有開始匹配的列有興趣,所以它從[1]
下標得到返回列表中的 。這個位置 等於該行第一列文本的寬度,加上1。 因此,m
設置爲其當前值和該列位置的最大值。
第二個命令,則隔膜的上所有包含 它的行的第一次出現
:%s//\=repeat(' ',m-col('.'))
墊,用缺少,使文本的 分離器採取之前的空格數m
個字符,減1。該命令是一個全球性 取代只是分離器之前更換空的間隔(見關於上面的:global
命令 評語)與 評價結果的表達(見:help sub-replace-\=
)
repeat(' ',m-col('.'))
的repeat()
函數重複它的第一個參數(作爲字符串)在第二個參數中給出的 次數。由於在每次替換時光標移動到模式匹配的開始位置時,m-col('.')
正好等於 將分隔符右移到對齊列所需的空格數 (col('.')
返回光標的當前列位置)。
以下是該對命令的一個行版本。
:let m=0|exe'g/\ze -- /let m=max([m,searchpos(@/,"c")[1]])'|%s//\=repeat(' ',m-col('.'))
在答案的以前版本以前那樣 如下的命令。
:let p=[0]|%s/^\ze\(.*\) -- /\=map(p,'max([v:val,len(submatch(1))+1])')[1:0]/
:exe'%s/\ze\%<'.p[0].'c -- /\=repeat(" ",'.p[0].'-col("."))'
這些誰是興趣在這些特定的命令,可以在編輯的歷史詳細 描述。
可能的重複[如何插入空格到列X排列列中的東西?](http://stackoverflow.com/questions/6154306/how-to-insert-spaces-up-to-column- x-to-line-up-columns-columns) – DocMax