在vim上的等号上对齐文本

时间:2012-01-22 21:41:57

标签: vim plugins editor

我倾向于在相同的符号上对齐代码以提高可读性。由此:

$ = jQuery.sub()
Survey = App.Survey
Sidebar = App.Sidebar
Main = App.Main

对此:

$       = jQuery.sub()
Survey  = App.Survey
Sidebar = App.Sidebar
Main    = App.Main

在vim中有一种简单的方法吗?

10 个答案:

答案 0 :(得分:38)

我到目前为止找到的最好的插件是Tabular.vim

最简单的安装方法是使用Pathogen插件,然后将Tabular git存储库克隆到~/.vim/bundle/tabular。 Pathogen README中的完整说明。

安装完成后,使用它只需将光标放在要对齐并运行的段落中的某个位置:

:Tab /=

答案 1 :(得分:13)

我相信使用Tabular插件可以轻松完成此操作。 Here it is in action.

在可视模式下选择范围(实际上不是必需的),然后执行:

:Tabularize /=

插件实际上可以经常找到正确的范围,无需直观地选择它或指定ex命令的范围。

答案 2 :(得分:12)

这不是最简单的做事方式,但可以在没有任何插件的情况下完成。

  • 使用V:s/=/ =/在每个等号前插入一堆空格。
  • 使用Ctrl-V选择要将等号移入的列。
  • <<至&#34; unindent&#34;每个等式的右侧朝向您选择的列,然后反复按.,直到该列中排列了等号。

答案 3 :(得分:5)

Tabular的另一个插件:

https://github.com/tommcdo/vim-lion

来自文档:

  

例如,glip=将转为

$i = 5;
$username = 'tommcdo';
$stuff = array(1, 2, 3);
     

$i        = 5;
$username = 'tommcdo';
$stuff    = array(1, 2, 3);

答案 4 :(得分:4)

对于不涉及安装插件的简单解决方案,只需通过Unix column命令进行过滤即可。

请注意,有两种方法可以执行此操作,具体取决于您的column命令是否支持-o

GNU列命令(Linux等)

:% ! column -t -s= -o=

就是这样。

BSD列命令(Mac OS X等)

第一步,过滤column -t

:% ! column -t

第二步,删除定界符周围的填充物:

:%s/ = /=/

初始文本为

$ = jQuery.sub()
Survey = App.Survey
Sidebar = App.Sidebar
Main = App.Main

第一步之后变成

$        =  jQuery.sub()
Survey   =  App.Survey
Sidebar  =  App.Sidebar
Main     =  App.Main

第二步之后

$       = jQuery.sub()
Survey  = App.Survey
Sidebar = App.Sidebar
Main    = App.Main

或者,如果您要一步一步做,则:

:% ! column -t | sed 's/ = /=/'

有关更多信息,请man column

答案 5 :(得分:1)

您可以使用Align Vim plugin对齐此类块,例如通过打字

vip:Align =

在命令模式下,当光标放在要对齐的块内时。

vip进入虚拟模式并选择当前段落。 Align命令非常强大,例如您还可以指定多个模式,模式被解释为正则表达式等。

答案 6 :(得分:1)

安装tabularize插件并按tpope修改gist,如下所示:

inoremap <silent> :   :<Esc>:call <SID>align(':')<CR>a
inoremap <silent> =   =<Esc>:call <SID>align('=')<CR>a

function! s:align(aa)
  let p = '^.*\s'.a:aa.'\s.*$'
  if exists(':Tabularize') && (getline(line('.')-1) =~# p || getline(line('.')+1) =~# p)
    let column = strlen(substitute(getline('.')[0:col('.')],'[^'.a:aa.']','','g'))
    let position = strlen(matchstr(getline('.')[0:col('.')],'.*'.a:aa.':\s*\zs.*'))
    exec 'Tabularize/'.a:aa.'/l1'
    normal! 0
    call search(repeat('[^'.a:aa.']*'.a:aa,column).'\s\{-\}'.repeat('.',position),'ce',line('.'))
  endif
endfunction

答案 7 :(得分:1)

vim-easy-align插件也可以。以下是给出的众多例子中的一个:

Example of vim easy align command

答案 8 :(得分:1)

通过在 vimrc 中添加一行,您只需要选择文本并键入

:Aleq

把它放在你的 vimrc 中:

command! -range Aleq execute <line1>.",".<line2> . "! sed 's/=/=TMPXX/'| column -t -s=| sed 's/TMPXX\s*/= /'"

说明:

上面相当于打字

'<,'>! sed 's/=/=TMPXX/'| column -t -s=| sed 's/TMPXX\s*/= /'
  1. -range 给出当前选择的内容
  2. 将 TMPXX 附加到 = 作为占位符
  3. 根据 -s= 生成列,删除 =
  4. 通过替换占位符放回 =。删除不需要的空格

警告:不支持多重=,因此以下将失败:

x = 32
yyy = (z == 64)
zzzz = f(x = 32)

答案 9 :(得分:0)

(来自this answer中的Vi & Vim Stack Exchange:)

如果您在紧要关头而无需安装和学习任何插件的情况下对齐表达式,这是一种快速的方法。

  1. 在视觉选择中选择线条。例如,如果这是您的整个缓冲区,则可以使用ggVG,但是如果这些行位于文件的中间,则只需进行适当选择即可。也许V4j
  2. =之前插入足够的空格,您可以使用:normal f=9i 进行此操作。 (请注意末尾的“空格”。)这将在视觉选择的各行中的每个=之前添加9个空格。如果9还不够,则添加更多(如您想添加的更多,例如99或999。)请注意,在通过可视选择键入:时,Vim会自动插入范围,因此实际命令为{{ 1}},但您无需键入这些字符。
  3. 移动到要刷新:'<,'>normal f=9i 的列。在这种情况下,第2行的变量名最长,因此请移至该变量名的末尾两个空格,即=的末尾。如果这是整个缓冲区,则可以使用=到达那里。
  4. 停留在同一列上,移至块的第一行。在这种情况下,您将从第2行移至第1行,因此2G2e2l就足够了。
  5. k开始可视块选择。
  6. 移动到块的最后一行。如果这是整个缓冲区,则可以使用Ctrl-V,如果这是文件的中间位置,则可以使用G向下四行,等等。
  7. 现在,您可以使用4j命令将线向左移动,但是直到它们撞到可视块的左侧为止。每个<只会将它们移动一个<,因此您可能需要多个。因此,可以肯定的是,如果在步骤2中添加了大量的空格,请使用'shiftwidth'(或9<99<。)

Voilà!

这是一个非常酷的技术,当您需要的灵活性超出插件所能提供的灵活性时,它可能会很有用。这是学习和保留Vim工具箱的好方法。

如果要根据999<以外的其他条件进行对齐,也可以非常灵活,例如,要对齐每行的第三列(第三个单词),请使用=第2步。