Ich habe eine Operatorzuordnung definiert, die einen Textbereich verwendet, dann nach einer Eingabezeichenfolge fragt und dann den Bereich mit Tabellarisch ausrichtet, wobei die Eingabezeichenfolge als Argument verwendet wird. Es funktioniert gut.
Ich habe es so implementiert und vim-operator-user verwendet , um einen neuen Operator zu definieren:
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
Dann fragte ich mich, ob ich es im laufenden Betrieb aktualisieren könnte, während ich den regulären Ausdruck eingebe, mit dem ich mich ausrichten möchte. Das Problem beim aktuellen Ansatz ist, dass Sie rückgängig machen und dann wiederholen müssen, wenn Sie nicht den richtigen Ausdruck verwenden.
Für den interaktiven Versuch habe ich Folgendes gemacht:
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
Es sollte funktionieren, aber das Ausrichten erfolgt nicht, bevor ich die Eingabetaste drücke, dh nachdem ich die Eingabe eingegeben habe, was effektiv bedeutet, dass es genauso funktioniert wie die nicht interaktive Funktion. Ich frage mich, ob das Problem so etwas wie der Bildschirm / Inhalt sein könnte, der während einer Operatorausführung erst danach aktualisiert wird.
Irgendwelche Ideen, was das Problem sein könnte, werden geschätzt!
if c == "\<Esc>" && undo silent! undo endif
ich hinzugefügt habe: Ich bin mir nicht sicher, wie ich <CC> erkennen soll.