Ho definito una mappatura operatore che accetta una regione di testo, quindi chiede una stringa di input e quindi allinea la regione con Tabular usando la stringa di input come argomento. Funziona bene.
L'ho implementato in questo modo, usando vim-operator-user per aiutare a definire un nuovo operatore:
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
Quindi mi chiedevo se potevo farlo aggiornare al volo mentre inserivo l'espressione regolare con cui allinearmi. Il problema con l'approccio attuale è che devi annullare e ripetere se non stai usando l'espressione corretta.
Per il tentativo interattivo, ho fatto questo:
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
Si dovrebbe lavorare, ma l'allineamento non viene fatto prima mi ha colpito entrare, che è dopo ho ingresso ingresso finita, il che significa in modo efficace che funziona allo stesso modo la funzione non interattivo. Mi chiedo se il problema potrebbe essere qualcosa di simile allo schermo / al contenuto che non viene aggiornato durante l'esecuzione di un operatore, solo dopo.
Qualche idea su quale potrebbe essere il problema è apprezzata!