読者です 読者をやめる 読者になる 読者になる

Vim - ファイルを二重で開かない設定を使ってvimrcを開く

vim

===追記===

普通に標準機能で出来ました

コメント欄より

捕捉ですが。
:tab drop $MYVIMRC
で、同様の機能を使用する事が出来ますね。
(id:osyo-manga)

helpに書いてますが、dropはguiが有効じゃないと使えません。ご参考まで
(id:deris)

うっ...。

===追記終わり===

はじめに

Vimmerたるもの.vimrcは頻繁に編集するものです。
私もVimmerの端くれですのでよく編集しています。

毎回:e:tabeで.vimrcを開くのは面倒ですので、
以下のようなショートカットをマッピングしていました。

" .vimrcへ記述
nnoremap <Space>. :<C-u>tabedit $MYVIMRC<CR>

なお、$MYVIMRCが存在しない場合は.vimrcへのフルパスへと置き換えてください。

重複してファイルが開かれてしまう

この設定ですと、毎回常に新規タブで開きます。
すでにどこかのバッファ(ウィンドウ)で.vimrcを開いていても、です。

ずっとそれでやってきましたが、今日ふと気が向いたので、
「すでに.vimrcを開いていたらそのバッファ(ウィンドウ)を選択する」という設定を書いてみました。

.vimrcに以下を記述

function! s:find_tabnr(bufnr)
  for tabnr in range(1, tabpagenr("$"))
    if index(tabpagebuflist(tabnr), a:bufnr) !=# -1
      return tabnr
    endif
  endfor
  return -1 " ブブー
endfunction

function! s:find_winnr(bufnr)
  for winnr in range(1, winnr("$"))
    if a:bufnr ==# winbufnr(winnr)
      return winnr
    endif
  endfor
  return 1 " 見つからなかった場合は最初のウィンドウ
endfunction

function! s:recycle_open(default_open, path)
  let default_action = a:default_open . ' ' . a:path
  if bufexists(a:path)
    let bufnr = bufnr(a:path)
    let tabnr = s:find_tabnr(bufnr)
    if tabnr ==# -1
      execute default_action
      return
    endif
    execute 'tabnext ' . tabnr
    let winnr = s:find_winnr(bufnr)
    execute winnr . 'wincmd w'
  else
    execute default_action
  endif
endfunction
nnoremap <Space>. :call <SID>recycle_open('tabedit', $MYVIMRC)<CR>

これで、以下のように動きます。

  • まだ.vimrcを開いていなければ新規タブで開く
  • すでに.vimrcを開いていればそのウィンドウに移動する

いい感じ。