Я определил отображение оператора, которое берет область текста, затем запрашивает входную строку и затем выравнивает область с Tabular, используя входную строку в качестве аргумента. Это работает хорошо.
Я реализовал это так, используя 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
Это должно работать, но выравнивание не выполняется до того, как я нажму клавишу ввода, то есть после того, как я закончу ввод ввода, что фактически означает, что оно работает так же, как неинтерактивная функция. Интересно, могла ли проблема быть чем-то вроде экрана / контента, не обновляющегося во время выполнения оператора, только после.
Любые идеи о том, что проблема может быть оценена!
if c == "\<Esc>" && undo silent! undo endif
я не уверен, как определить <CC>.