LoginSignup
12
13

More than 5 years have passed since last update.

vagrantの各種コマンドを、anything風に操作できるようにする.(zsh+peco+anyframe)

Last updated at Posted at 2015-08-16

vagrantの操作系が面倒臭く、zsh+peco+anyframeを利用してAnything風に操作できるようにしたのでそのメモです.

tty.gif

背景

本当はPecrantと呼ばれるPeco+VagrantなAnything風ツールがあるのですが、くそ遅いvagrant global-statusに依存しているコマンドなのでもっさり感が半端ない.(その時間があればコマンド打った方がはy

Peco & Pecrant が素晴らしい

なのでvagrant global-statusより早いvagrant-global-statusがあるので、今回はそれを使ってよりカジュアルに利用できるようにしたいと思った次第.

使ったツール

pecoを利用して独自に作ろうかと思ったら、anyframeという便利なプラグインがあったのでそれを利用して実現しました.
最初はpecoのコマンドを集めた、cool-pecoを使ってぷるりしようかと思ったのですが、anyframeは簡単に拡張できて便利だったので…

インストール

MacOSX上でやっているので、Linux等の方は適宜公式を見て置き換えて下さい.
zsh及びantigenについてはインストールしているものとして割愛します.

pecoインストール

homebrewな方はコマンド一発

$ brew install peco
# 以下のコマンドをやってみると、pecoのイメージが掴めるかと思います
$ ls | peco # emacsキーバインドなので、↓Ctrl+n ↑Ctrl+pです

anyframeインストール

antigenを利用してanyframeをインストールする場合は、zshrcに1行追加するだけで済みます.

if [[ -f ~/.zsh/antigen/antigen.zsh ]]; then
  source ~/.zsh/antigen/antigen.zsh
  antigen bundle mollifier/anyframe # <= これを追加
  antigen apply
fi

追加したらexec $SHELL -l等でreload.

anyframeのカスタムコマンドを作成する

anyframe自体に各種便利コマンドが入っているのですが、vagrant類は存在しないので追加していきます

anyframeのcustomコマンドを置くディレクトリを作成

anyframeのcustomコマンドを置くディレクトリを作成.

# $HOME/.zsh/anyframe-customは任意ですが、それ以下のdirnameは変更不可.
# sources配下には、選択画面となる出力メッセージを生成するスクリプトを配置
$ mkdir -p $HOME/.zsh/anyframe-custom/anyframe-functions/sources
# widgets配下には、作ったスクリプト等を組み合わせて、最終的にユーザーが利用するスクリプトを配置する
$ mkdir -p $HOME/.zsh/anyframe-custom/anyframe-functions/widgets

上記で作成したフォルダ配下のスクリプトをanyframeで呼び出しできるよう、zshrcに以下の1行を加えます.

if [[ -f ~/.zsh/antigen/antigen.zsh ]]; then
  source ~/.zsh/antigen/antigen.zsh

  fpath=($HOME/.zsh/anyframe-custom(N-/) $fpath) # <- 追加

  antigen bundle mollifier/anyframe
  antigen apply
fi

参考: https://github.com/kegamin/prezto/blob/master/runcoms/zshrc#L94

sourcesに、選択画面用スクリプトを配置する

$ cd $HOME/.zsh/anyframe-custom/anyframe-functions/sources
$ vi anyframe-source-vagrant-global-status
$ vi anyframe-source-vagrant-list-commands

anyframe-source-vagrant-global-status

現在設定されているvagrantのhost情報を出力するスクリプト.
vagrant-global-statusがあれば利用するが、無ければ通常のvagrant global-statusを利用するようにしました.

if type vagrant-global-status > /dev/null 2>&1; then
  # faster than ` vagrant global-status`
  # see -> https://github.com/monochromegane/vagrant-global-status
  vagrant-global-status
else
  vagrant global-status | awk '/^[[:alnum:]]{7} /'
fi

anyframe-source-vagrant-list-commands

vagrantのどのコマンドを利用するか、anyframeで選択するために作ったスクリプト.
vagrant list-commandsの結果を利用しようか迷ったけど、「やっぱり遅い」「対象がhostであるコマンド」に限定したかったので、これでいいのか?と思いながら以下のようなソースにした.

cat << EOL
ssh             connects to machine via SSH
ssh-config      outputs OpenSSH valid configuration to connect to the machine
status          outputs status of the vagrant machine
up              starts and provisions the vagrant environment
halt            stops the vagrant machine
suspend         suspends the machine
resume          resume a suspended vagrant machine
reload          restarts vagrant machine, loads new Vagrantfile configuration
destroy         stops and deletes all traces of the vagrant machine
EOL

widgetsに、選択画面用スクリプトを配置する

sourcesに置いたものを利用して、vagrantコマンドを実行するようなスクリプトをwidgetsに配置していきます.

anyframe-widget-vagrant

コマンド(ssh/halt/up等)を選択、ホストを選択してvagrant <command> <host>を実行するスクリプト.

local command
command=$(anyframe-source-vagrant-list-commands \
             | anyframe-selector-auto \
             | awk '{print $1}')

anyframe-source-vagrant-global-status \
  | anyframe-selector-auto \
  | awk '{print $1}' \
  | anyframe-action-execute vagrant ${command}

anyframe-widget-vagrant-cdr

選択したホストの、vagrantファイルがある場所に移動するスクリプト.

anyframe-source-vagrant-global-status \
  | anyframe-selector-auto \
  | awk '{print $5}' \
  | anyframe-action-execute cd

bindkey設定

コマンドを毎回実行してると勿体無いので、zshrcでbindkey設定します.
以下を参考に、各自のzshrcに合わせて修正して下さい.

if [[ -f $HOME/.zsh/antigen/antigen.zsh ]]; then
  source $HOME/.zsh/antigen/antigen.zsh

  # 独自追加したanyframeの関数を呼ぶための設定
  fpath=($HOME/.zsh/anyframe-custom(N-/) $fpath)

  antigen bundle mollifier/anyframe
  bindkey '^j^j' anyframe-widget-cdr
  bindkey '^j^r' anyframe-widget-execute-history
  bindkey '^j^g' anyframe-widget-cd-ghq-repository
  bindkey '^j^t' anyframe-widget-tmux-attach
  bindkey '^v^v' anyframe-widget-vagrant # ctrl+v ctrl+vで呼び出し
  bindkey '^v^j' anyframe-widget-vagrant-cdr # ctrl+v ctrl+jで呼び出し

  antigen-apply
fi

感想

anyframeはコマンド追加が楽で便利ですね.色々なツールで補ってた部分が、anyframeの標準機能で補完できたので入れ替えてさっぱり.

しかし、無理やり感のあるanyframe-widget-vagrantは微妙なので直したい…

12
13
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12
13