Я визначив відображення оператора, який займає область тексту, потім запитує рядок введення, а потім вирівнює область з табличною, використовуючи рядок введення. Це чудово працює.
Я реалізував це так, використовуючи vim-operator-user для визначення нового оператора:
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
Тоді я поцікавився, чи можу я зробити його оновленням на льоту, вводячи регулярний вираз, щоб узгодити. Проблема поточного підходу полягає в тому, що вам потрібно скасувати, а потім повторити, якщо ви не використовуєте правильний вираз.
Для інтерактивної спроби я зробив це:
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
Це повинно працювати, але вирівнювання не робиться до того, як я натисніть клавішу Enter, тобто після того, як я закінчую введення вводу, фактично означає, що він працює так само, як і неінтерактивна функція. Цікаво, чи проблема може бути не на зразок того, що екран / вміст не оновлюється під час виконання оператором, лише після.
Будь-яка ідея щодо проблеми, яка може бути оцінена!