🖇️

vim-operator-join

2022/10/27に公開

選択範囲の行を連結するオペレータがあるだろうと思って調べたら思いのほかヒットしなかったので書きました。

function! s:operator_join(type = '') abort
  if a:type == ''
    set operatorfunc=function('s:operator_join')
    return 'g@'
  endif
  normal! `[v`]J
endfunction
nnoremap <expr> J <sid>operator_join()

例えば、Jipで現在のパラグラフを1行に連結できます。

[追記] Vimファイルで行連結のバックスラッシュを削除する

上記の設定でしばらく使用していたのですが、Vimファイルでこれを使うと、行連結のバックスラッシュ(:h line-continuation)が残ってしまうことが気になったので、Vim用に設定を追加しました。

 function! s:operator_join(type = '') abort
   if a:type == ''
     set operatorfunc=function('s:operator_join')
     return 'g@'
   endif
+  if &filetype ==# 'vim'
+    " remove line-continuation, ignore first line
+    let from = line("'[")
+    let to = line("']")
+    let range = from + 1
+    if from != to
+      let range ..= ',' .. to
+    endif
+    execute printf('silent! %ssubstitute/^\s*\\s*//', range)
+    execute printf('keepjump normal! %sGV%sGJ', from, to)
+    return
+  endif
   normal! `[v`]J
 endfunction
 nnoremap <expr> J <sid>operator_join()

指定した範囲の行頭から\を取り除けば良いのですが、最初の行を除外する必要があるため、すこし複雑な記述になっています。

https://twitter.com/kawarimidoll/status/1625068845118656517

Discussion