Zdefiniowałem mapowanie operatora, które pobiera region tekstu, a następnie prosi o ciąg wejściowy, a następnie wyrównuje region z tabelą, używając argumentu wejściowego jako argumentu. Działa ładnie.
Zaimplementowałem to w ten sposób, używając vim-operator-user, aby pomóc zdefiniować nowego operatora:
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
Potem zastanawiałem się, czy mogę zaktualizować go w locie, wprowadzając wyrażenie regularne w celu dostosowania. Problem z obecnym podejściem polega na tym, że musisz cofnąć, a następnie powtórzyć, jeśli nie używasz poprawnego wyrażenia.
Dla interaktywnej próby zrobiłem to:
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
To powinno działać, ale nie odbywa ustawiające zanim uderzę wejść, czyli po Skończyłem wejście przystawienia, skutecznie co oznacza, że działa w ten sam sposób jak nieinterakcyjnym funkcji. Zastanawiam się, czy problemem może być coś takiego, że ekran / treść nie jest aktualizowana podczas wykonywania operatora, dopiero po.
Doceniamy wszelkie pomysły na problem.
if c == "\<Esc>" && undo silent! undo endif
Nie jestem pewien, jak wykryć dla <CC>.