Eu defini um mapeamento de operador que pega uma região de texto, solicita uma string de entrada e alinha a região com Tabular usando a string de entrada como argumento. Funciona bem.
Eu o implementei assim, usando o vim-operator-user para ajudar a definir um novo operador:
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
Então me perguntei se poderia atualizá-lo rapidamente, enquanto inseria a expressão regular para alinhar. O problema com a abordagem atual é que você precisa desfazer e refazer se não estiver usando a expressão correta.
Para a tentativa interativa, fiz o seguinte:
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
Ele deve funcionar, mas o alinhamento não é feito antes de eu pressionar enter, ou seja, depois de terminar de inserir a entrada, o que significa efetivamente que funciona da mesma maneira que a função não interativa. Gostaria de saber se o problema poderia ser algo como a tela / conteúdo não sendo atualizado durante a execução do operador, somente depois.
Todas as idéias sobre o que o problema poderia ser apreciado!
if c == "\<Esc>" && undo silent! undo endif
embora não tenha certeza de como detectar o <CC>.