J'ai défini un mappage d'opérateur qui prend une région de texte, puis demande une chaîne d'entrée, puis aligne la région avec Tabular en utilisant la chaîne d'entrée comme argument. Ça marche bien.
Je l'ai implémenté comme ceci, en utilisant vim-operator-user pour aider à définir un nouvel opérateur:
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
Ensuite, je me suis demandé si je pouvais le mettre à jour à la volée tout en entrant l'expression régulière pour l'aligner. Le problème avec l'approche actuelle est que vous devez annuler puis refaire si vous n'utilisez pas l'expression correcte.
Pour la tentative interactive, j'ai fait ceci:
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
Cela devrait fonctionner mais l'alignement ne se fait pas avant d'appuyer sur Entrée, c'est-à-dire après que j'aie fini de saisir l'entrée, ce qui signifie en fait que cela fonctionne de la même manière que la fonction non interactive. Je me demande si le problème pourrait être quelque chose comme l'écran / le contenu n'étant pas mis à jour pendant l'exécution d'un opérateur, seulement après.
Toutes les idées sur ce que pourrait être le problème sont appréciées!