我倾向于在等号对齐代码以提高可读性。从这个例子:
$ = jQuery.sub()
Survey = App.Survey
Sidebar = App.Sidebar
Main = App.Main
变成这样:
$ = jQuery.sub()
Survey = App.Survey
Sidebar = App.Sidebar
Main = App.Main
在vim中有简单的方法可以做到这一点吗?
~/.vim/bundle/tabular
中。 Pathogen的完整说明在README中。:Tab /=
对于不需要安装插件的简单解决方案,只需通过Unix列命令进行过滤即可。
请注意,有两种方法可以做到这一点,具体取决于您的column
命令是否支持-o
。
GNU column命令(Linux等)
:% ! column -t -s= -o=
就是这样。
BSD column 命令(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
。
%
替换为范围(例如 :<range>! column -t -s= -o=
),或者只需选择所需部分,按 :
然后输入 ! column -t -s= -o=
(这样您就应该得到 :'<,'>! column -t -s= -o=
)。 - Cybolic这不是最简单的方法,但可以在没有任何插件的情况下完成。
V
和:s/=/ =/
在等号前插入一堆空格。<<
将每个等式的右侧“取消缩进”向你选择的列移动,然后重复按.
直到等号符号排成该列。一个替代 Tabular 的插件:
https://github.com/tommcdo/vim-lion
根据文档介绍:
For example,
glip=
will turn$i = 5; $username = 'tommcdo'; $stuff = array(1, 2, 3);
into
$i = 5; $username = 'tommcdo'; $stuff = array(1, 2, 3);
如果您想根据不同的标准进行对齐,而不仅仅是=
,那么这个方法也非常灵活。例如,如果您想要根据每行的第三列(第三个单词)进行对齐,则在步骤2中使用:normal 2W9i
。
vip:Align =
vip
进入虚拟模式并选择当前段落。 Align
命令非常强大,例如您还可以指定多个模式,模式会被解释为正则表达式等。:Aleq
将以下内容添加到你的vimrc文件中:
command! -range Aleq execute <line1>.",".<line2> . "! sed 's/=/PXXXQYYY/'| column -t -s 'PXXX'| sed 's/QYYY\s*/= /'"
说明:
上述代码等同于输入
'<,'>! ! sed 's/=/PXXXQYYY/'| column -t -s 'PXXX'| sed 's/QYYY\s*/= /'
更新:现在支持多个 =。
安装tabularize插件并修改由tpope创建的代码片段,使其类似于以下内容:
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