动态vim表格模式?

时间:2013-12-07 00:23:50

标签: vim formatting format tabular

我已经看到了许多为特定预定模式创建vim Tabular模式的方法。例如,在this answer中,我看到了一个映射:

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

允许您这样做:

:Tabularize 1=

上面的正则表达式是硬编码的,以匹配第一个等号字符。有没有办法定义任意字符,以便我可以创建一个匹配任何字符的模式?

例如,我希望能够在第一个“|”上进行以下匹配或者第一个“}”,而不必为每个创建单独的预定义模式。

:Tabularize 1| 
:Tabularize 1} 

2 个答案:

答案 0 :(得分:2)

我不相信这可以通过Tabular直接进行。但是,您可以定义一个包装器命令,该命令接受所需的字符串作为参数:

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

然后,您可以使用任何字符执行First,例如:First =:First |,甚至更长的字符串,例如:First ||:First &&

如果这更适合您的用例,您还可以定义使用当前选择的映射(在正常模式下,光标下的字符)作为参数:

vnoremap <F3> y \| :exec 'Tabularize /^[^' . escape(getreg('"'), '\^$.[?*~') . ']*\zs' . escape(getreg('"'), '\^$.[?*~')<CR>
nnoremap <F3> yl \| :exec 'Tabularize /^[^' . escape(getreg('"'), '\^$.[?*~') . ']*\zs' . escape(getreg('"'), '\^$.[?*~')<CR>

编辑:为了允许范围,请将-range属性添加到命令定义并传递<line1>(开头)和<line2>(结束)到Tabularize

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

答案 1 :(得分:1)

easy-align插件允许您在行中选择特定的分隔符。

" around 1st =
:EasyAlign=
" around 2nd =
:EasyAlign2=
" around all =
:EasyAlign*=
" around the last =
:EasyAlign-=

同样地,

" around 1st :
:EasyAlign:
" around 2nd :
:EasyAlign2:
" around the second to last |
:EasyAlign-2|
" around all whitespaces
:EasyAlign*\ 

请注意,=:|不是正则表达式,而是"delimiter keys",您可以将其视为常见对齐任务的单字符快捷方式。< / p>

当然,你也可以使用正斜面包围

的模式
" around 1st <>
:EasyAlign/<>/
" around all <>
:EasyAlign*/<>/