我倾向于在相同的符号上对齐代码以提高可读性。由此:
$ = jQuery.sub()
Survey = App.Survey
Sidebar = App.Sidebar
Main = App.Main
对此:
$ = jQuery.sub()
Survey = App.Survey
Sidebar = App.Sidebar
Main = App.Main
在vim中有一种简单的方法吗?
答案 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/=/ =/
在每个等号前插入一堆空格。<<
至&#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插件也可以。以下是给出的众多例子中的一个:
答案 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*/= /'
警告:不支持多重=,因此以下将失败:
x = 32
yyy = (z == 64)
zzzz = f(x = 32)
答案 9 :(得分:0)
(来自this answer中的Vi & Vim Stack Exchange:)
如果您在紧要关头而无需安装和学习任何插件的情况下对齐表达式,这是一种快速的方法。
ggVG
,但是如果这些行位于文件的中间,则只需进行适当选择即可。也许V4j
?=
之前插入足够的空格,您可以使用:normal f=9i
进行此操作。 (请注意末尾的“空格”。)这将在视觉选择的各行中的每个=
之前添加9个空格。如果9还不够,则添加更多(如您想添加的更多,例如99或999。)请注意,在通过可视选择键入:
时,Vim会自动插入范围,因此实际命令为{{ 1}},但您无需键入这些字符。:'<,'>normal f=9i
的列。在这种情况下,第2行的变量名最长,因此请移至该变量名的末尾两个空格,即=
的末尾。如果这是整个缓冲区,则可以使用=
到达那里。2G2e2l
就足够了。k
开始可视块选择。Ctrl-V
,如果这是文件的中间位置,则可以使用G
向下四行,等等。4j
命令将线向左移动,但是直到它们撞到可视块的左侧为止。每个<
只会将它们移动一个<
,因此您可能需要多个。因此,可以肯定的是,如果在步骤2中添加了大量的空格,请使用'shiftwidth'
(或9<
或99<
。)Voilà!
这是一个非常酷的技术,当您需要的灵活性超出插件所能提供的灵活性时,它可能会很有用。这是学习和保留Vim工具箱的好方法。
如果要根据999<
以外的其他条件进行对齐,也可以非常灵活,例如,要对齐每行的第三列(第三个单词),请使用=
第2步。