动态vim表格模式



我见过很多为特定的预定模式创建vim表格模式的方法。例如,在这个答案中,我看到了的映射

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

这允许你做:

:Tabularize 1=

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

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

:Tabularize 1| 
:Tabularize 1} 

我认为这不可能直接通过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>, '^$.[?*~')

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* 

请注意,=:|不是正则表达式,而是"分隔键",您可以将其视为常见对齐任务的1字符快捷键。

当然,你也可以通过用斜杠包围模式来使用正则表达式

" around 1st <>
:EasyAlign/<>/
" around all <>
:EasyAlign*/<>/

最新更新