zsh、ghq、pecoを使って快適なターミナルの環境を用意する
はじめに
この記事ではzsh、ghq、pecoを使って快適なターミナル環境を用意する手順について解説します。
そのため、zsh
の導入とzinit
を使ったカスタマイズ、そしてpeco
とghq
を使ったリポジトリ管理について解説していきます。
将来の自分に向けて書いてある所があるので説明が雑な部分があるかもしれないですが、ご了承ください。
この記事では以下のステップでzsh
の導入、peco
とghq
を使ったリポジトリ管理について解説していきます。
(1)zshのインストール
(2)zinitを使ったzshのカスタマイズ
(3)pecoのインストール
(4)ghqのインストール
(5)peco、ghqを使ってリポジトリ管理を楽にする
zshとはなにか?
zshの前にシェルについて説明します。
シェルはユーザからの入力をコンピュータに伝えるプログラムになります。
zsh
もシェルの一種ですが、zsh
以外にもbash
、fish
があります。
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を使った方法を解説します。
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を使ってプラグインを設定する
.zshrc
はzsh+ run command
という意味で、zsh
の設定ファイルです。
zshを起動する際に.zshrc`が読み込まれ、シェルの動作や環境をカスタマイズするためのコマンドや設定を含んでいます。
今回追加する以下のプラグインをziniを使って、.zshrc
に追記する事でプラグインをロードができます。ここでは代表的な以下の2つのプラグインを .zshrc
に記述してインストールしていきます。
-
zsh-users/zsh-syntax-highlighting: Fish shell like syntax highlighting for Zsh.
- 実行できるコマンドに関してはシンタックスハイライトで見える化してくれます。
-
zsh-users/zsh-autosuggestions: Fish-like autosuggestions for zsh
- 入力すると、履歴と入力候補に基づいてコマンドが提案されます。
.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リポジトリで管理していので良ければご覧ください。
以上でzsh導入からpecoとghqを使ったリポジトリ管理を楽にする手順について解説しました。
zshを使うだけではなく、他のライブラリと組み合わせ事でより使い勝手が良いターミナル環境ができるので、ぜひ皆さんもカスタマイズしてみてください!
おわり
参考資料
- Zinitでターミナルをカスタマイズする
- ghqとpecoでリポジトリの管理を便利にする
- ghqでリポジトリ管理とpeco連携で快適git生活 - Qiita
- https://nonakayasuo.com/zshrc
- zsh-users/zsh: Mirror of the Z shell source code repository.
- zshとは|「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典
- 初心者向け:Zshの導入 - Qiita
- bashとzshの違い。bashからの乗り換えで気をつけるべき16の事柄
- zsh : 設定ファイル — 苦労する遊び人の玩具箱 1 ドキュメント
- Mac | zshとpecoでコマンド入力作業を快適に - わくわくBank
Discussion