Vim Tabular:仅在行首匹配时应用?

17

我正在尝试使用tabular.vim插件格式化一些Python代码。目前它是一个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 /=

似乎匹配了一切,一切都变得混乱。

非常感谢您的帮助!

4个回答

26
你可以使用这个命令:
:Tabularize /^[^=]*\zs=

这个模式只匹配第一个=


你可以将这两行代码添加到~/.vim/after/plugin/TabularMaps.vim中。

AddTabularPattern 1=    /^[^=]*\zs=
AddTabularPattern 1==   /^[^=]*\zs=/r0c0l0
下次直接运行:

:Tabularize 1=

如果你不需要在=周围添加空格,请运行以下代码:

:Tabularize 1==


这不是vim内置函数,是吗? - FlogFR
不是的,这是Tabular插件的一部分: https://github.com/godlygeek/tabular, http://vimcasts.org/episodes/aligning-text-with-tabular-vim/ - bshacklett
那么...我该如何处理行的最后一个匹配?我尝试通过/.*,[^,]*\zs来对齐最后一个,,但是不起作用。 - Marslo

22

上面的建议很好,但在这种情况下它们有点太复杂了,需要输入的内容也太多。那么怎么样:

:Tab /=.*/

这个很好用--匹配第一个等号及其后面的所有内容,左对齐(默认值,非常好用!)。


7

一个非常优秀的插件可以帮您解决这个问题:vim-easy-align


2
根据这个答案,不必为每种情况创建静态映射,可以通过设置一个 vim 命令来实现动态操作:
command! -nargs=1 -range TabFirst exec <line1> . ',' . <line2> . 'Tabularize /^[^' . escape(<q-args>, '\^$.[?*~') . ']*\zs' . escape(<q-args>, '\^$.[?*~')

使用此命令,如果您想根据第一个=对齐,则可以执行以下操作:
:TabFirst =

或者,如果您想要在第一个{上对齐,可以这样做:

:TabFirst {

这支持范围选择和Tabularize的智能选择。

这似乎是更好的答案。 - Sudar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接