git

Tue, Apr 30, 2019

tig-explorer.vimの使い方

Vim用のGitクライアントが欲しかった vimのGitプラグインとして何を使っているのが多いだろうか? 自分の観測範囲ではfugitiveを使っている人が多いようだ。 しかし、ターミナルではCUIツールで高速なプレビューの出来るtigをGitクライアントとして利用している人は多いのではないだろうか。 vimでもtigが使いたい。そんな人(自分)のためにvim pluginを作成した。 tig-explorer.vim tig-explorer.vimはtigをvimから扱うプラグイン。 tigの機能でdiff上からeキーを押下すると任意のエディタで該当箇所を開く事が出来るが、このプラグインを使うと、vimからtigを呼び出すことが出来る。 tigを開き、差分をチェックして、そこから再びvimで開くことが出来る。 また、vimからtigを呼び出すには!tigコマンドをvimのコマンドモードから呼び出すことでも同じことが実現でも可能だが、 プロセスがvim-tig-vim-tig-vimのようにどんどんネストしてしまう。 このプラグインを経由してエディタで開く場合は親のvimプロセスで開くため、vim上のbuffer移動やhistory、yankが途切れることがない。 また、vimからtigに行番号やファイル名を渡せるので、↓のコマンドが格段に扱いやすくなる。 tig FILEPATHで閲覧中のファイルの履歴を見る(:TigOpenCurrentFile) tig grep PATTERN PATHでプレビューしてから開く(:TigGrep) tig blame FILEPATHで現在のファイル履歴を行単位で見る(:TigBlame) tig-explorer.vimのカスタマイズ .vimrcの記述例 " tigを開くnnoremap <Leader>t :TigOpenProjectRootDir<CR>" 現在のファイルの履歴を見るnnoremap <Leader>T :TigOpenCurrentFile<CR>" パターンでtig grepするnnoremap <Leader>g :TigGrep<CR>" tig grepした内容を再呼び出しするnnoremap <Leader>r :TigGrepResume<CR>" 選択中のキーワードでtig grepするvnoremap <Leader>g y:TigGrep<Space><C-R>"<CR>" カーソル下のキーワードでtig grepするnnoremap <Leader>cg :<C-u>:TigGrep<Space><C-R><C-W><CR>" 現在のカーソル位置でtig blameするnnoremap <Leader>b :TigBlame<CR>また、このプラグインの特徴的なところでtig上でCtrl-tを押下するとvimのタブで開く機能が追加されている。 同様にCtrl-sで水平分割、 Ctrl-vで垂直分割出来る。 tig上のvimを開くキーバインドの動的に追加していて、下記がデフォルトの設定値。 let g:tig_explorer_keymap_edit = '<C-o>'let g:tig_explorer_keymap_tabedit = '<C-t>'let g:tig_explorer_keymap_split = '<C-s>'let g:tig_explorer_keymap_vsplit = '<C-v>'↑ .
Sun, Sep 2, 2018

ranger-explorer.vimをアップデートした

ranger-explorer.vimというVimプラグインをアップデートした。 このアップデートでranger上の操作でVimのタブで開くか画面分割して開くかを選択できるようにした。 (あとNeovimもサポートした) ranger-explorer.vim https://github.com/iberianpig/ranger-explorer.vim Vimのファイラのrangerに置き換えるVimプラグイン。 Vimからrangerでカレントディレクトリを開いたり、プロジェクトルートのディレクトリを開いたりできる。 また、Vimのプロセスがネストせず、rangerの親プロセスのVimで開くようにしているのでbufferを共有することが出来る。(これが!rangerで開いた時との違い) 今回のアップデートでは rangerから Vimのタブや画面分割で開いたり出来るようにしている。 ranger rangerはCLIベースの高機能ファイラで、コマンドラインから操作できる。 hjklの移動、yyのヤンク、ddのカット、pのペーストなどVimライクな操作や、コマンドラインでの:rename、:touchなどの操作がサポートされている。 特に高速なライブプレビューが気に入っており、これだけでrangerを選択するモチベーションになっている。 rangerからタブ/画面分割で開く ranger-explorerからrangerを開いた時、Vimを開くキーバインドがrangerに自動で定義されるようにした。 <Ctrl-o>: 現在のタブ上で開く <Ctrl-t>: 新しいタブで開く <Ctrl-v>: 画面を垂直に分割して開く <Ctrl-s>: 画面を水平に分割して開く このようにrangerから分割して開くことが出来る。 動的にrangerへキーバインドを注入しているので、CLIからrangerを開いた時はこれらのキーバインドは使えず、ranger-explorerから開いた時のみタブや画面分割が出来るようになる。 また、動的にアサインするキーバインドは ~/.vimrc で下記のように上書きできる。 let g:ranger_explorer_keymap_edit = '<C-o>'let g:ranger_explorer_keymap_tabedit = '<C-t>'let g:ranger_explorer_keymap_split = '<C-s>'let g:ranger_explorer_keymap_vsplit = '<C-v>'得意なツールに任せる 無理に全てVimプラグインで頑張るよりも得意なツールを使えば良いと考えていて、 今回の場合はディレクトリ構造を扱うのが適したツールのrangerに任せている。 特にファイルを開いたり、検索する部分は外部のCLIツールを利用している。 fzf.vim ファイル名をあいまい検索(fuzzy-finder) ranger-explorer.vim ディレクトリ階層からファイルを選択 tig-explorer.vim tigでGitの履歴から、git grepからファイルを開く どれもプレビューが高速なツールなのでVimからファイルを探すワークフローが快適になった。 異なるツールの操作に一貫性を持たせる Vimに外部ツールを利用する場合はパフォーマンスの利点もあるが、普段から使い慣れているツールを扱えるということが利点。 しかし、当然ながらツール毎に細かいキーバインドが異なる。同じ機能は同じキーバインドで扱えるようにしたいと思っていた。 そこで、fzfや以前愛用していたvimfiler/ctrlpと同様の使い勝手が欲しくて、<C-o>、<C-t>、<C-v>、<C-s>のキーバインドでタブや画面分割して開けるようにした。 プラグイン側からキーバインドを動的に設定するアイデアは、tig-explorerにも取り込んでいる。