🖖
Vim scriptで現在の選択範囲を取得する
n番煎じかもですが、備忘録として。
function! s:get_current_selection() abort
if mode() !~# '^[vV\x16]'
" not in visual mode
return ''
endif
" save current z register
let save_reg = getreginfo('z')
" get selection through z register
noautocmd normal! "zygv
let result = @z
" restore z register
call setreg('z', save_reg)
return result
endfunction
- zレジスタ[1]に一度コピーすることで、現在の選択範囲を取得する
-
getreginfo
で情報を保存しておき、setreg
で戻すことで、レジスタの状態を汚さない -
autocmd TextYankPost
の発火を防ぐため、yank時にnoautocmd
が必要
vim/neovimともに、APIの追加が検討されているようなので、将来的にはビルトインの機能で取得できるようになるかもしれません。
追記:冒頭コメントの通り、ビルトインでgetregion()
関数が追加されました。
-
仲介レジスタはzじゃなくても良い ↩︎
Discussion