テキストの領域を取り、入力文字列を要求し、入力文字列を引数として使用して領域を表形式に揃える演算子マッピングを定義しました。それはうまくいきます。
私は、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を押す前、つまり入力の入力が終了した後では、整列は行われません。つまり、非インタラクティブ機能と同じように機能します。問題は、オペレーターの実行中に画面/コンテンツが更新されない後のようなものなのだろうか。
問題が何であるかについてのアイデアは高く評価されます!