动态的vim Tabular模式?

3

我看过许多创建特定预定模式的vim Tabular模式的方法。例如,在这个答案中,我看到了以下映射:

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

这允许您执行以下操作:

:Tabularize 1=

上面的正则表达式是硬编码来匹配第一个等号字符的。有没有办法定义任意字符,这样我就可以创建一个匹配任何字符的模式呢?
例如,我想能够执行以下操作,以匹配第一个"|"或第一个"}",而不必为每个字符创建单独的预定义模式。
:Tabularize 1| 
:Tabularize 1} 
2个回答

3

我不相信这可以直接通过表格实现。但是,你可以定义一个包装命令来接受所需的字符串作为参数:

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>, '\^$.[?*~')

我尝试了第一个解决方案,虽然它非常聪明,但不幸的是,在使用 Tabular 的主要方式——范围选择时似乎无法正常工作。 - Javid Jamae

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*\ 

注意,=:|不是正则表达式,而是"分隔符键",您可以将其视为常见对齐任务的1字符快捷方式。
当然,您也可以使用正则表达式,只需用斜杠括起模式即可。
" around 1st <>
:EasyAlign/<>/
" around all <>
:EasyAlign*/<>/

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