vim tabular only on the first match on the line?

偶尔善良 提交于 2019-11-29 17:23:14

问题


I'm trying to format some python code with the tabular.vim plugin. It's currently a sqlalchemy declarative class, and looks something like this:

id     =  db.Column(db.Integer, primary_key=True)
status    =  db.Column(db.Integer, nullable=False, default=3)
...etc...

I'd like to be able to align only the very first equals sign in the list.

id     =  db.Column(db.Integer, primary_key=True)
status =  db.Column(db.Integer, nullable=False, default=3)
...etc...

Just a regular

: Tabularize /=

seems to match everything, and everything goes crazy.

Thanks very much in advance!


回答1:


You can use this command:

:Tabularize /^[^=]*\zs=

The pattern only matches the first =.


You can add these two line to ~/.vim/after/plugin/TabularMaps.vim

AddTabularPattern 1=    /^[^=]*\zs=
AddTabularPattern 1==   /^[^=]*\zs=/r0c0l0

Next time, simply run:

:Tabularize 1=

If you don't need spaces around =, run this:

:Tabularize 1==




回答2:


The suggestions above are good, but in this case they are a little too complicated and require too much typing. How about:

:Tab /=.*/

This works just fine -- match the first equal sign and everything after it, aligned left (default, which works just fine!).




回答3:


Excellent plugin to do it: vim-easy-align.




回答4:


As per this answer, instead of creating a static mapping for each case, you can do this dynamically by setting up a vim command like this:

command! -nargs=1 -range TabFirst exec <line1> . ',' . <line2> . 'Tabularize /^[^' . escape(<q-args>, '\^$.[?*~') . ']*\zs' . escape(<q-args>, '\^$.[?*~')

With this command, if you wanted to align based on the first = then you could do:

:TabFirst =

Or, if you wanted to align on the first { you could do:

:TabFirst {

This supports range selections as well as Tabularize's smart selection.



来源:https://stackoverflow.com/questions/11497593/vim-tabular-only-on-the-first-match-on-the-line

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!