Vimのセッション管理プラグイン

こんにちは。 ゴリラ.vimを運営しているゴリラです。

Vimを始めたての頃にこちらの記事セッション管理プラグインを作りましたが、最近Vimにポップアップウィンドウが入ったのでその機能を使ってアップデートしてみました。

セッションとは

Vimの日本語マニュアルより引用

セッションとは、全てのウィンドウのビューとグローバルな設定のことである。セッ ションを保存しておいて、あとからそれを復元することで、各ウィンドウのレイアウト を元に戻すことができる。

つまりセッションを保存すれば開いているファイル、ウィンドウのサイズ、vimrcの設定などがそのまま復元^1できます。かなり強力な機能です。

セッションの基本

  • セッションの保存
    :mksession {filename}

  • セッションの復元
    :s {filename} or vim -S {filename}

これだけです、とても簡単です。

セッション管理プラグイン

vsessionの使い方はREADMEを読んで頂ければと思います。 今回は保存したセッションを読み込むときにポップアップウィンドウで選べるようにしました。

仕組みとしては簡単で、vsessionはデフォルト~/.vim/sessions配下にセッションファイルを保存する様になっています。 ディレクトリ配下のファイル一覧をreaddir 組み込み関数で取得してそれをポップアップウィンドウに渡します。

" ['blog', 'docker.vim']
let l:sessions = readdir(g:session_path)
1
2

ポップアップウィンドウを作成に関しては簡易ではあるがこちらの記事を書いたので軽く読んでおくと理解しやすいかもしれないです。 filterオプションにpopup_filter_menuコールバックを指定するとメニュー選択画面を作成できます。では選択したアイテムをどう特定するかというとcallbackオプションを使います。 こちらはウィンドウが閉じられたときに呼ばれるコールバックを指定します。popup_filter_menuを使用した場合、コールバック関数の第2引数に選択したメニューのインデックス(1番目か2番目か...)が渡ってくるのでそれを利用します。

let s:result = ["banana", "apple", "gorilla"]

" popup_filter_menuではxで画面を閉じ、idxが-1で渡ってくるので
" -1の場合は何もしない
function! s:cb(id, idx) abort
    if a:idx !=# -1
        return
    endif
    echo s:result[a:idx-1]
endfunction

" popup_filter_menuを使用する場合
" enter でウィンドウを閉じ選択したメニューのインデックスとウィンドウIDをcallbackで指定した関数にわたす
call popup_create(s:result, {
            \ "filter": "popup_filter_menu",
            \ "callback": function("s:cb"),
            \ 'borderchars': ['-','|','-','|','+','+','+','+'],
            \ })
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

基本なロジックは上記通りで、選択したファイルを取得しsourceで読み込むことでセッションを復元しています。

最後に

セッションは便利ですね。ぜひプラグイン使ってみてください。 ポップアップウィンドウを駆使すればfiltercallbackでカレントディレクトリのファイルをポップアップウィンドウで表示し選択して開くこともできます。 興味ある方はぜひチャレンジしてみてください。