我已经定义了一个运算符映射,该映射使用文本区域,然后要求输入字符串,然后使用输入字符串作为参数将区域与Tabular对齐。效果很好。
我已经这样实现了,使用vim-operator-user来帮助定义一个新的运算符:
map \aa <Plug>(operator-align)
call operator#user#define('align', 'Align')
function! Align(motion_wiseness)
let expr = input("align: ")
if len(expr) != 0
execute "'[,']Tabularize /".expr
endif
endfunction
function! Getchar()
let c = getchar()
if c =~ '^\d\+$'
let c = nr2char(c)
endif
return c
endfunction
然后我想知道是否可以在输入要与之对齐的正则表达式时动态更新它。当前方法的问题是,如果使用的表达式不正确,则必须先撤消然后重做。
对于交互式尝试,我这样做:
map \== <Plug>(operator-align-interactive)
call operator#user#define('align-interactive', 'AlignInteractive')
function! AlignInteractive(motion_wiseness)
let prompt = "Align: "
echon prompt
let expr = ""
let c = Getchar()
" CR has to be checked for separately as it acts as putting the cursor back to zero position
while c != "\<Esc>" && c != "\<CR>"
if c == "\<BS>"
if len(expr) != 0
let expr = expr[0:-2]
echon "\<CR>".substitute(expr, ".", " ", "g")
echon "\<CR>".prompt.expr
endif
else
let expr .= c
echon c
let cmd = "'[,']Tabularize /".expr
execute cmd
endif
let c = Getchar()
endwhile
endfunction
它应该可以工作,但是在我按Enter键之前,即在我完成输入之后才完成对齐,这实际上意味着它的工作方式与非交互式功能相同。我想知道问题是否出在操作员执行之后,仅在之后才更新屏幕/内容。
任何关于什么问题可以解决的想法表示赞赏!