🖖

Vim scriptで現在の選択範囲を取得する

2022/12/28に公開

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の追加が検討されているようなので、将来的にはビルトインの機能で取得できるようになるかもしれません。
https://github.com/vim/vim/pull/11579
https://github.com/neovim/neovim/pull/13896

追記:冒頭コメントの通り、ビルトインでgetregion()関数が追加されました。

脚注
  1. 仲介レジスタはzじゃなくても良い ↩︎

Discussion