He definido un mapeo de operador que toma una región de texto, luego pide una cadena de entrada y luego alinea la región con Tabular usando la cadena de entrada como argumento. Funciona muy bien
Lo he implementado así, usando vim-operator-user para ayudar a definir un nuevo 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
Luego me pregunté si podría actualizarlo sobre la marcha mientras ingresaba la expresión regular para alinearme. El problema con el enfoque actual es que debe deshacer y rehacer si no está utilizando la expresión correcta.
Para el intento interactivo, hice esto:
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
Se debe trabajar, pero la alineación no se hace antes de que golpee entrar, es decir después de que tenga entrada que entran acabada, lo que significa que efectivamente funciona del mismo modo que la función no interactivo. Me pregunto si el problema podría ser algo así como la pantalla / contenido que no se actualiza durante la ejecución de un operador, solo después.
¡Se agradece cualquier idea sobre cuál podría ser el problema!
if c == "\<Esc>" && undo silent! undo endif
embargo, no estoy seguro de cómo detectar <CC>.