torikatsu.dev

Flutterとかプログラミングとかガジェットとか書きます

M1 mac の環境構築 その2 ターミナル編

こんにちは、とりかつです。 前回に引き続き、M1 macのターミナルの環境構築を進めていきます。

前回の記事 ↓ torikatsu923.hatenablog.com

ポータビリティをと作業効率のバランスがいい感じになるようにターミナルの環境構築を進めていきます。

prezto

インストール編

まずはzshの設定をいい感じにできるようにしていきます。 今回はpreztoをチョイスしました。 github.com

readmeにしたがって、導入していきます。 すでにzshの設定ファイルが存在するとlnエラーが出てインストールがうまくできません。 なので、あらかじめzshの設定ファイルはどこかに退避させておきます。 必要なファイルを退避させたら残っているファイルを全て消しておきます。

rm .zlogin.org && rm .zlogout.org && rm .zpreztorc && rm .zprofile &&rm .zshenv && rm .zshrc

preztoをクローンしてきます。

git clone --recursive https://github.com/sorin-ionescu/prezto.git "${ZDOTDIR:-$HOME}/.zprezto"

ターミナルで以下を実行します。

setopt EXTENDED_GLOB
for rcfile in "${ZDOTDIR:-$HOME}"/.zprezto/runcoms/^README.md(.N); do
  ln -s "$rcfile" "${ZDOTDIR:-$HOME}/.${rcfile:t}"
done

あらかじめ退避させておいた設定を、作成された.zshrcとかに移して完了です。

テーマの適用

preztoをインストールしたおかげで簡単にテーマを設定することができます。 今回はpureというテーマを設定します。

.zshrcに以下を追記するとpureが適用されます。

autoload -Uz promptinit
prompt pure

適用すると以下のようになります。

f:id:torikatsu923:20210228210422p:plain
pure theme

マルチライナーのおかげで、コマンドが見やすくなります。 さらにディレクトリ表示まわりもすっきりとしていて、作業に集中できそうですね。

設定編

ここではシンタックスハイライトとオートサジェスチョンを設定していきます。

シンタックスハイライト

シンタックスハイライトは、コマンドをいい感じにハイライトしてくれる機能です。

シンタックスハイライトoffの時

f:id:torikatsu923:20210228193155p:plain
syntax off
シンタックスハイライトonの時
f:id:torikatsu923:20210228193245p:plain
syntax on
コマンドが緑色でハイライトされているのがわかります。 また、タイポした時は赤色にハイライトしてくれたりします。
f:id:torikatsu923:20210228193418p:plain
syntax on with illegal command
シンタックスハイライトがあると、視覚的にコマンドの構造を理解することができて、ターミナルの作業効率が上がります。

オートサジェスチョン

オートサジェスチョンはコマンド入力中に、historyから入力候補をうっすら表示してくれる機能です。 コマンド入力中に右キー(arrow_right or C-f)を押すことで、うっすら表示されているコマンドを入力することができます。

オートサジェスチョンがoffのとき

f:id:torikatsu923:20210228193814p:plain
autosuggestion off
オートサジェスチョンがonのとき
f:id:torikatsu923:20210228193912p:plain
autosuggestion on

わざわざgrepする必要がないので思考を邪魔することなくコマンドを入力できて便利ですね。

設定の追記

30行目あたりに以下の2行を追記してシンタックスハイライトとオートサジェスチョンを設定します。

'syntax-highlighting' \
'autosuggestions' \

追加後の.zpreztorc

 32 zstyle ':prezto:load' pmodule \
 33   'environment' \
 34   'terminal' \
 35   'editor' \
 36   'history' \
 37   'directory' \
 38   'spectrum' \
 39   'utility' \
 40   'completion' \
 41   + 'syntax-highlighting' \
 42   + 'autosuggestions' \
 43   'prompt'

'prompt'より前に書かないとうまく動かないみたいな噂を聞いたので、一応'prompt'の前に追加しました。

peco

ターミナルで効率よく作業をしていく上で、強力な履歴検索機能が欲しくなりました。 ツールはいろいろあるのですが、いろいろ調べて行ってpecoを導入することにしました。

pecoってなんぞや

pecoは入力をリストで表示し、選択されたアイテムを返却するという、非常にシンプルコマンドです。 花御さんも、シンプルなものほど応用が効いて強いことを認めています。 https://i0.wp.com/mannga-brothers.com/wp-content/uploads/2019/03/IMG_2696.jpg?resize=634%2C720&ssl=1

インストール

homebrewを使ってインストールします。

brew install peco

設定

pecoの導入に当たって以下の記事を参考にしました。 qiita.com 記事にしたがってpecoの設定を進めていきます。

peco自体の設定

zshrcに以下を追記します。 これはC-Rで履歴をgrepできるようにする設定です。

記事には以下のようにあります。しかし、このままではうまく動いてくれなかったので少しいじります。

function peco-history-selection() {
    BUFFER=`history -n 1 | tac  | awk '!a[$0]++' | peco`
    CURSOR=$#BUFFER
    zle reset-prompt
}

zle -N peco-history-selection
bindkey '^R' peco-history-selection

taccatを逆順にやってくれるコマンドです。 私のPCはOSXなのでtacコマンドは存在しません。

f:id:torikatsu923:20210228204510p:plain
do not exist tac

tacコマンドを実装する方法もあったのですが、少し面倒だったので、今回はtail -rを使ってあげます。

historygrepしてる時のイメージ

f:id:torikatsu923:20210228201003p:plain
grep history with peco

cdrの設定

過去のディレクトリ移動履歴もgrepできたら便利だと感じたのでcdrを設定していきます。

~/.zshrc

if [[ -n $(echo ${^fpath}/chpwd_recent_dirs(N)) && -n $(echo ${^fpath}/cdr(N)) ]]; then
    autoload -Uz chpwd_recent_dirs cdr add-zsh-hook
    add-zsh-hook chpwd chpwd_recent_dirs
    zstyle ':completion:*' recent-dirs-insert both
    zstyle ':chpwd:*' recent-dirs-default true
    zstyle ':chpwd:*' recent-dirs-max 1000
    zstyle ':chpwd:*' recent-dirs-file "$HOME/.cache/chpwd-recent-dirs"
fi

次にpecoの設定を追記します。 記事では以下のようにありますが、これも少しいじります。

function peco-cdr () {
    local selected_dir="$(cdr -l | sed 's/^[0-9]\+ \+//' | peco --prompt="cdr >" --query "$LBUFFER")"
    if [ -n "$selected_dir" ]; then
        BUFFER="cd ${selected_dir}"
        zle accept-line
    fi
}
zle -N peco-cdr
bindkey '^E' peco-cdr

まず、selected_dirの部分ですがこのままだと数字が入力されてうまく機能しません。

f:id:torikatsu923:20210228205157p:plain
select directory in peco
f:id:torikatsu923:20210228205259p:plain
now working peco with cdr

上の画像だとcd ~/desktopとしたいところがcd 1 ~/desktopとなってしまっています。 これを回避するためにawkを使ってディレクトリのパスだけ引っこ抜きます。

- BUFFER="cd ${selected_dir}"
+BUFFER="cd `echo $selected_dir | awk '{print$2}'`"

さらに、returnしたらそのままcdが実行されてしまうのは自分の好みではなかったので、return時にコマンドを入力するよう設定を変更します。

- zle accept-line
+ CURSOR=$#BUFFER
+ zle reset-prompt

また、C-EEmacsの行の最後にカーソルを移動するキーバインドと重なってしまうため、C-Gにリマップします。

最終的に以下のようになりました。

function peco-cdr () {
  local selected_dir="$(cdr -l | sed 's/^[0-9]\+ \+//' | peco --prompt="cdr >" --query "$LBUFFER")"
  if [ -n "$selected_dir" ]; then
    BUFFER="cd `echo $selected_dir | awk '{print$2}'`"
    CURSOR=$#BUFFER
    zle reset-prompt
  fi
}
zle -N peco-cdr
bindkey '^G' peco-cdr

いい感じになりました。

f:id:torikatsu923:20210228205940p:plain
work well in peco
f:id:torikatsu923:20210228205918p:plain
work well

終わりに

ターミナルを快適に使えそうな状態になったので、今回の記事はここまでにします! zshの設定系で``zinitzghq with peco```を考えたのですが、現時点で困ってることがなかったので一旦保留にしました。 どれも便利そうだったので、環境構築が落ち着いてから試してみたいと思います。

次回の記事では、tmuxやvimの設定をしていこうと思います。