pockestrap

Programmer's memo

:terminal を使ってDenite.nvimのシンプルな代替Vimプラグインを作った

Problem

Denite.nvim という便利なVimプラグインがあります。 Deniteの解説は他に譲りますが、私は主にファイル名のインクリメンタルサーチや、git grepに使っていました。

github.com

Uniteの頃からとても便利に使っていたのですが、DeniteはPythonに依存しており、セットアップの度にPythonのライブラリのインストールに消耗していました。 普段からPythonを使っていればセットアップもそう難しくないと思うのですが、普段はPythonを全然使わない生活をしているため、セットアップに毎回苦戦していました。

そのため、セットアップに苦労の要らない依存の少ないプラグインを作りました。

Solution

Tnite.vim というプラグインを作りました。

github.com

:terminalで外部コマンドを呼び出し、その出力結果をファイルとして開くプラグインです。 実装は今の所36行で、:terminalと呼び出す外部コマンドにのみ依存しています。

Usage

Tniteを使うには自分でコマンドやキーマップを設定する必要があります。

まずは「gitで管理されているファイルをpecoで絞り込んで、新規タブで開く」キーマップを<Space>fとして定義してみます。

nnoremap <silent><Space>f :<C-u>call tnite#start(["sh", "-c", "git ls-files \| peco --initial-filter Fuzzy"], "tabedit")<CR>

このように、tnite#start()関数に実行したいコマンドと、その出力を受け取って実行したいアクションを渡します。

これを使うと次のようになります。

f:id:Pocke:20190607184934g:plain
git ls-files animation

また、次のようにしてgit grepなども使えます。 (なお、grepした該当箇所の行に飛ぶようにするには、すこしハックが必要です。)

nnoremap <silent><Space>g :<C-u>call tnite#start(["sh", "-c", "git grep " . shellescape(expand('<cword>')) . " \| peco --initial-filter Fuzzy"], "tabedit")<CR>

Tniteは標準出力にファイル名が出力されることのみを期待しているので、実行するコマンドは任意のものに置き換えることができます。 例えばpeco以外のインタラクティブなfilterに置き換えるのは簡単にできます。


Tnite.vim というプラグインの紹介でした。 機能が限られる分、依存が少なく導入が簡単なプラグインです。 シンプルなインタラクティブフィルタとして使ってみてはいかがでしょうか。