Vim tabular только в первом матче на линии?

Я пытаюсь отформатировать код python с помощью плагина tabular.vim. В настоящее время он является декларативным классом sqlalchemy и выглядит примерно так:

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

Я хотел бы иметь возможность выровнять только самый первый знак равенства в списке.

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

Просто обычный

: Tabularize /=

похоже, соответствует всем, и все идет с ума.

Большое спасибо заранее!

Ответ 1

Вы можете использовать эту команду:

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

Образец соответствует только первому =.


Вы можете добавить эти две строки в ~/.vim/after/plugin/TabularMaps.vim

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

В следующий раз просто запустите:

:Tabularize 1=

Если вам не нужны пробелы вокруг =, запустите это:

:Tabularize 1==

Ответ 2

Вышеприведенные предложения хороши, но в этом случае они слишком сложны и требуют слишком большого набора текста. Как насчет:

:Tab /=.*/

Это работает просто отлично - совпадение первого знака равенства и всего после него выравнивание влево (по умолчанию, которое работает отлично!).

Ответ 3

Отличный плагин для этого: vim-easy-align.

Ответ 4

В соответствии с этим ответом вместо создания статического отображения для каждого случая вы можете сделать это динамически, настроив команду vim следующим образом:

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

С помощью этой команды, если вы хотите выровнять по первому =, тогда вы можете сделать:

:TabFirst =

Или, если вы хотите выровнять первый {, вы можете сделать:

:TabFirst {

Это поддерживает выбор диапазона, а также интеллектуальный выбор Tabularize.