我见过很多为特定的预定模式创建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*/<>/