👨‍🔧

zsh、ghq、pecoを使って快適なターミナルの環境を用意する

2023/06/26に公開

はじめに

この記事ではzsh、ghq、pecoを使って快適なターミナル環境を用意する手順について解説します。
そのため、zshの導入とzinitを使ったカスタマイズ、そしてpecoghqを使ったリポジトリ管理について解説していきます。

将来の自分に向けて書いてある所があるので説明が雑な部分があるかもしれないですが、ご了承ください。

https://github.com/zsh-users/zsh
https://github.com/zdharma-continuum/zinit
https://github.com/peco/peco
https://github.com/x-motemen/ghq

この記事では以下のステップでzshの導入、pecoghqを使ったリポジトリ管理について解説していきます。

(1)zshのインストール
(2)zinitを使ったzshのカスタマイズ
(3)pecoのインストール
(4)ghqのインストール
(5)peco、ghqを使ってリポジトリ管理を楽にする

zshとはなにか?

zshの前にシェルについて説明します。

シェルはユーザからの入力をコンピュータに伝えるプログラムになります。
zshもシェルの一種ですが、zsh以外にもbashfishがあります。
Macを使っている方は bashが馴染みやすいと思います。

因みにzshの正式名称は Z Shellになります。

zshの正式名称はZ Shell。発音はズィーシェルと言います。起源自体は古く、1990年代に、当時 プリンストン大学の学生であった Paul Falstad によって作成されました。 zshの名前は、当時プリンストン大学のティーチングアシスタントであったイェール大学教授Zhong Shaoのログイン名 ”zsh" に由来して名付けられたと言われています。
ref:https://kanasys.com/tech/803

(1)zshのインストール

筆者はMacの環境のため、Macでのインストール方法を載せます。
執筆時点での筆者のMacOSは Venturaになります。

ターミナルからsw_versを実行して確認した環境を載せます。

# sw_vers                                            [~]
ProductName:		macOS 
ProductVersion:		13.4
BuildVersion:		22F66

macOSではmacOS 10.15 Catalinaからデフォルトのシェルとして設定されているとので既に入っている方は以下のinstallのステップはスキップしても大丈夫です。

brewコマンドが事前に入っている前提です。

brew install zsh

ログインシェルをzshに変更する

現在のログインシェルを確認してください。

echo $SHELL

/bin/bash

もし、bashになっていたら、これをzshに変更します。

chsh -s /bin/zsh

chshコマンドはログイン時のシェルを変更するコマンドです。
再度、echo $SHELLを実行して以下のようにzsh に変わった事を確認してください。

echo $SHELL
/bin/zsh

これでインストールは終わりです。
次にzshをカスタマイズして自分オリジナルのターミナルに仕上げていきます。

(2)zinitを使ったzshのカスタマイズ

zshはプラグインを使う事でカスタマイズが可能です。
2023年現在のzshのプラグインマネージャですと zinitが有名です。
この記事でもzinitを使った方法を解説します。

https://github.com/zdharma-continuum/zinit

zinitのインストール

以下のコマンドを実行してください。

bash -c "$(curl --fail --show-error --silent --location https://raw.githubusercontent.com/zdharma-continuum/zinit/HEAD/scripts/install.sh)"
実行後のログ
% bash -c "$(curl --fail --show-error --silent --location https://raw.githubusercontent.com/zdharma-continuum/zinit/HEAD/scripts/install.sh)"
🔵INFO: About to setup zinit from zdharma-continuum/zinit (branch: main - commit: N/A) to /Users/endofutoshi/.local/share/zinit/zinit.git
🔵INFO: Fetching git-process-output.zsh from https://raw.githubusercontent.com/zdharma-continuum/zinit/main/share/git-process-output.zsh
✅SUCCESS: Download finished!
🔵INFO: Updating zinit in in /Users/endofutoshi/.local/share/zinit/zinit.git
From https://github.com/zdharma-continuum/zinit
 * branch              main       -> FETCH_HEAD
✅SUCCESS: Checked out branch main
From https://github.com/zdharma-continuum/zinit
 * branch              main       -> FETCH_HEAD
Already up to date.
✅SUCCESS: Updated zinit to v3.11.0-10-g1cb1df63
🔵INFO: Updating /Users/endofutoshi/.zshrc (10 lines of code, at the bottom)

🌻 Welcome!	

実行後は以下のコマンドを実行して更新します。

$ zinit self-update

[self-update] fetching latest changes from main branch
From https://github.com/zdharma-continuum/zinit
 * branch              main       -> FETCH_HEAD
Already up to date.
[self-update] compiling zinit via zcompile
[self-update] reloading zinit for the current session

これでzinitのインストールは完了です。
プラグインを導入する前に初期設定として以下のSnipitを追記します。

ZINIT_HOME="${XDG_DATA_HOME:-${HOME}/.local/share}/zinit/zinit.git"
[ ! -d $ZINIT_HOME ] && mkdir -p "$(dirname $ZINIT_HOME)"
[ ! -d $ZINIT_HOME/.git ] && git clone https://github.com/zdharma-continuum/zinit.git "$ZINIT_HOME"
source "${ZINIT_HOME}/zinit.zsh"

autoload -Uz _zinit
(( ${+_comps} )) && _comps[zinit]=_zinit

ziniを使ってプラグインを設定する

.zshrczsh+ run commandという意味で、zshの設定ファイルです。
zshを起動する際に.zshrc`が読み込まれ、シェルの動作や環境をカスタマイズするためのコマンドや設定を含んでいます。

今回追加する以下のプラグインをziniを使って、.zshrcに追記する事でプラグインをロードができます。ここでは代表的な以下の2つのプラグインを .zshrcに記述してインストールしていきます。

.zshrcに以下の行を追加します。

# zinitのプラグインの読み込み
zinit load zsh-users/zsh-autosuggestions
zinit load zsh-users/zsh-completions

zinit load以外にもzinit lightがあります。
zinit loadを指定する事でzinit reportで一覧表示したり、zinit unloadでプラグインを無効化することができます。逆にzinit lightはreporでは表示されないです。

指定方法
zinit load  <repo/plugin> # Load with reporting/investigating.
zinit light <repo/plugin> # Load without reporting/investigating.

記述したら以下のコマンドを実行して再度読み込んでください。

exec zsh 

source ~/.zshrcでも大丈夫です。

これで設定は完了です。
各プラグインを細かく設定をする方法についてはこの記事では紹介しきれないので、興味があれば探してみください。

(3)pecoのインストール

peco (pronounced peh-koh) is based on a python tool, percol. percol was darn useful, but I wanted a tool that was a single binary, and forget about python. peco is written in Go, and therefore you can just grab the binary releases and drop it in your $PATH.
peco can be a great tool to filter stuff like logs, process stats, find files, because unlike grep, you can type as you think and look through the current results.

pecoは(発音は peh-koh)、pythonのツール、percolをベースにしています。
percolはとても便利ですが、私はバイナリ1つで、pythonのことは忘れてしまうようなツールが欲しかったのです。pecoはGoで書かれているので、バイナリのリリースを取得して$PATHにドロップするだけでいいです。

pecoを導入する事で後ほどのディレクトリ移動や、過去のコマンドを検索する時に便利です。
ghqとpecoはGo製ツールなのでまずgoをインストールします。

brew install go

インストール後は.zshrcに以下の行を追加してPATHを通してください。

export GOPATH=$HOME
export PATH=$PATH:$GOPATH/bin

追加後は以下のコマンドを追加して更新してください。

exec zsh

問題なければbrewでpecoをインストールします。

brew install peco

これでpecoが導入できました。次にghqをインストールます。

(4)ghqのインストール

'ghq' provides a way to organize remote repository clones, like go get does. When you clone a remote repository by ghq get, ghq makes a directory under a specific root directory (by default ~/ghq) using the remote repository URL’s host and path.
'ghq' は、go get のようにリモートリポジトリのクローンを整理する方法を提供します。ghq getでリモートリポジトリをクローンすると、ghqは特定のルートディレクトリ(デフォルトでは~/ghq)の下に、リモートリポジトリのURLのホストとパスを使ったディレクトリを作ります。

これまで特定のリポジトリをインストールする時は以下のようにcdコマンドを使ってからgit cloneを実行してました。

cd hoge/fug
git clone ***

それがghqを使うとディレクトリ構成を気にせず、ghq getを実行すれば自動的に適切なディレクトリにインストールする事ができます。

ghq get https://github.com/x-motemen/ghq
ghq get github.com/x-motemen/ghq
ghq get x-motemen/ghq

SSHの場合は ghq get -pで取得できます。

こちらもbrewを使ってインストールします。

brew install ghq

事前にルートディレクトリを設定しておきます。

mkdir ~/src
git config --global ghq.root '~/src'

これでghqのインストールは完了です。

(5)peco、ghqを使ってリポジトリ管理を楽にする

最後の章ではこれまでインストールをした、peco、ghqを使ってリポジトリ管理を楽にする方法についてご紹介します。具体的にはpeco-cd-srcというメソッドを定義してctrl + xで呼び出すようにしてディレクトリ移動を行います。

このメソッドはghqで管理しているリポジトリ一覧を取得し、その後pecoでフィルタリングして選択後にそのディレクトリへ移動します。

function peco-cd-src () {
  local selected_dir=$(ghq list -p | peco --query "$LBUFFER")
  if [ -n "$selected_dir" ]; then
    BUFFER="cd ${selected_dir}"
    zle accept-line
  fi
  zle clear-screen
}
zle -N peco-cd-src
bindkey '^x' peco-cd-src
実行後のログ
QUERY>                                                                                                                          
/Users/hoge/src/github/Fendo181/                                             /Users/hoge/src/github/Fendo181/leetcode_practice

pecoを使って過去に実行したコマンドを検索して実行する

おまけで、リポジトリ管理とは別ですが、pecoの機能を使って過去に実行したコマンドを検索して実行する関数も紹介します

## ctrl + r で過去に実行したコマンドを選択できるようにする。
function peco-select-history() {
  BUFFER=$(\history -n -r 1 | peco --query "$LBUFFER")
  CURSOR=$#BUFFER
  zle clear-screen
}
zle -N peco-select-history
bindkey '^r' peco-select-history

まとめ

ここまで説明した設定をまとめると.zshrcの設定は以下のようになります。

# zinitの設定
## https://github.com/zdharma-continuum/zinit
ZINIT_HOME="${XDG_DATA_HOME:-${HOME}/.local/share}/zinit/zinit.git"
[ ! -d $ZINIT_HOME ] && mkdir -p "$(dirname $ZINIT_HOME)"
[ ! -d $ZINIT_HOME/.git ] && git clone https://github.com/zdharma-continuum/zinit.git "$ZINIT_HOME"

source "${ZINIT_HOME}/zinit.zsh"
## zintコマンドを補完する設定
source "$HOME/.local/share/zinit/zinit.git/zinit.zsh"
autoload -Uz _zinit
(( ${+_comps} )) && _comps[zinit]=_zinit

# zinitのプラグインの読み込み
zinit load zsh-users/zsh-autosuggestions
zinit load zsh-users/zsh-completions

# peco
## ctrl + x でディレクトリ移動を行う
function peco-cd-src () {
  local selected_dir=$(ghq list -p | peco --query "$LBUFFER")
  if [ -n "$selected_dir" ]; then
    BUFFER="cd ${selected_dir}"
    zle accept-line
  fi
  zle clear-screen
}
zle -N peco-cd-src
bindkey '^x' peco-cd-src

## ctrl + r で過去に実行したコマンドを選択できるようにする。
function peco-select-history() {
  BUFFER=$(\history -n -r 1 | peco --query "$LBUFFER")
  CURSOR=$#BUFFER
  zle clear-screen
}
zle -N peco-select-history
bindkey '^r' peco-select-history


# PATH setting
## brew
eval "$(/opt/homebrew/bin/brew shellenv)"
eval "$(/opt/homebrew/bin/brew shellenv)"
## go
export GOPATH=$HOME/go
export PATH=$PATH:$GOPATH/bin

これ以外の独自のailiasやzshのカスタマイズについてはdotfileリポジトリで管理していので良ければご覧ください。

https://github.com/Fendo181/dotfile/blob/master/zsh/.zshrc

以上でzsh導入からpecoとghqを使ったリポジトリ管理を楽にする手順について解説しました。
zshを使うだけではなく、他のライブラリと組み合わせ事でより使い勝手が良いターミナル環境ができるので、ぜひ皆さんもカスタマイズしてみてください!

おわり

参考資料

Discussion