vim tabular only on the first match on the line?

2020-02-28 02:45发布

问题:

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.