텍스트 영역을 가져 와서 입력 문자열을 요청한 다음 입력 문자열을 인수로 사용하여 영역을 테이블 형식으로 정렬하는 연산자 매핑을 정의했습니다 . 잘 작동합니다.
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
그것은 작동 해야 하지만 입력을 누르기 전에, 즉 입력 입력을 마친 후에 정렬이 수행되지 않습니다. 비 대화식 기능과 동일한 방식으로 작동한다는 것을 의미합니다. 문제가 운영자 실행 중에 업데이트되지 않은 화면 / 내용과 같은 것일 수 있는지 궁금합니다.
문제가 무엇인지에 대한 아이디어는 높이 평가됩니다!