Help us understand the problem. What is going on with this article?

ghq listをfzf vimから選択するコマンドを書いてみた

More than 1 year has passed since last update.

この記事は Vim Advent Calendar 2018 その2 12日目の記事です。
その2と名のつく通りこのアドベントカレンダーの表にはその1があり、そちらでは @deresmosさんが記事を書いていらっしゃると思います。

先日11日目の記事は @yasuo-ozuさんによる [VIM] まだインデントで消耗してるの? 〜スペースインデントでもタブインデントでもない新しいインデント手法〜 - Qiitaです。
Vimその1の記事は@aiya000さんによるfキーをnoremap可能にするfmap.vim - Qiitaです。

概要

最近fzfを使うようになって.vimrcの設定をいじり始めたのですが、fzf.vimからghqのコマンドを叩くスクリプトの参考例を探してみていて意外とありませんでした。
ちょうどいいブログ記事のネタになりそうだと思いましたので、fzfを使ったvimのコマンドを作成する例を紹介します。

fzf.vimについては他にも先行するまとまった記事がありますので、本記事では実際にコマンドを書くところを中心にやってみたいと思います。

fzf

fzfはfuzzy検索が可能なgolang製のコマンドラインツールです。
類似ツールではpeco, percolといったものがあります。
vimとの連携が可能で一旦インストールしておけばvimでもすぐ使えるようになります。
dein.vimでプラグインを管理しているのであれば、

call dein#add('junegunn/fzf', { 'build': './install --all', 'merged': 0 })
call dein#add('junegunn/fzf.vim', { 'depends': 'fzf' })

のように書くと実行することができます。

Image from Gyazo

fzf.vim

fzf.vim はVim scriptにあまり慣れていない人でもすぐ使えるようにfzfを使ったコマンドのプリセットを一揃い提供するプラグインです。
汎用的なCommand名が着くのが嫌う場合は、g:fzf_command_prefix を設定することでprefixを設定できます。
例: let g:fzf_command_prefix = 'Fzf'と設定すると :Files のコマンド名が :FzfFiles になる

Vim scriptのチュートリアル

Examples (vim) · junegunn/fzf Wiki
公式wikiにあるチュートリアルを一部紹介します。

fzfのVim連携は fzf#run関数が中核となります。この関数はディクショナリ型の単一の引数をとります。ここでは少なくとも sink オプションを指示する必要があります。

:call fzf#run({'sink': 'e'})

この引数に source オプションがない場合、カレントディレクトリにあるファイルを一覧するのにfindコマンドを使います。
一覧の中からひとつファイルを選択するとそのファイルをsinkで指定した :e を使って開きます。
findコマンドを使う代わりに、source を指示することで任意のシェルコマンドを実行することができます。
記事の例はgit管理下にあるファイル一覧を表示することです:

call fzf#run({'source': 'git ls-files', 'sink': 'e'})

なお、この操作はfzf.vimでは:GFiles としてプリセットされています。

Image from Gyazo

他にもオプションは多くあって、tmuxと連携してウインドウを分割して右ペインに一覧を表示するだとか、選択をひとつではなく二個以上選択するなど色々できます。
興味があればチュートリアルの方にまとまっていますのでご参照ください。

ghqの一覧をとって任意のリポジトリディレクトリにcdする

さて、上記の内容からコマンドを自作してみます。
* 単純に一覧のタネとなるsourceに ghq list を、sinkにcdを指定します。

call fzf#run(fzf#wrap({'source': 'ghq list --full-path', 'sink': 'cd' }))

今回は :Fq<CR> で実行できるようにしたいため、以下のように書くと完成です。

command! -nargs=0 Fq call fzf#run({
\ 'source': 'ghq list --full-path',
\ 'sink': 'cd'
\ })

これで、動くようになりました。

Image from Gyazo

その他参考記事

この記事には直接関係しませんが、fzf.vimに関する記事を探した際に見かけたサイトをリンクします。

終わり

以上、fzfを利用して ghq list の中から選択するコマンドの書き方を紹介しました。
明日の記事の担当は、 Vimその2 @chesscommandsさん、その1 @daisuzuさんです。

timedia
創業20周年の技術者集団。 確かな技術力・豊富な実績をもとに、多種多様な案件を手掛けるシステム会社のパイオニア
https://www.timedia.co.jp/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした