Saya telah menetapkan pemetaan operator yang mengambil wilayah teks, lalu meminta string input dan kemudian menyelaraskan wilayah dengan Tabular menggunakan string input sebagai argumen. Ini bekerja dengan baik.
Saya telah mengimplementasikannya seperti ini, menggunakan vim-operator-pengguna untuk membantu mendefinisikan operator baru:
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
Lalu saya bertanya-tanya apakah saya bisa memperbaruinya dengan cepat sambil memasukkan ekspresi reguler untuk disejajarkan. Masalah dengan pendekatan saat ini adalah Anda harus membatalkan dan kemudian mengulang jika Anda tidak menggunakan ekspresi yang benar.
Untuk upaya interaktif, saya membuat ini:
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
Ini seharusnya bekerja tetapi pelurusan tidak dilakukan sebelum saya menekan enter, yaitu setelah saya selesai memasukkan input, secara efektif berarti bahwa ia bekerja dengan cara yang sama seperti fungsi non-interaktif. Saya bertanya-tanya apakah masalahnya bisa seperti layar / konten tidak diperbarui selama eksekusi operator, hanya setelahnya.
Setiap ide tentang apa masalahnya bisa dihargai!
if c == "\<Esc>" && undo silent! undo endif
Saya tidak yakin bagaimana cara mendeteksi <CC>.