torikatsu923.dev

サイト内検索

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

    前回の記事 ↓ポータビリティをと作業効率のバランスがいい感じになるようにターミナルの環境構築を進めていきます。まずはzshの設定をいい感じにできるようにしていきます。

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

    前回の記事 ↓

    M1 mac の環境構築 その1 - torikatsu.dev

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

    prezto

    インストール編

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

    sorin-ionescu/prezto

    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

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

    pure theme

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

    設定編

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

    シンタックスハイライト

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

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

    syntax off

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

    syntax on

    コマンドが緑色でハイライトされているのがわかります。 また、タイポした時は赤色にハイライトしてくれたりします。

    syntax on with illegal command

    シンタックスハイライトがあると、視覚的にコマンドの構造を理解することができて、ターミナルの作業効率が上がります。

    オートサジェスチョン

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

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

    autosuggestion off

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

    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は入力をリストで表示し、選択されたアイテムを返却するという、非常にシンプルコマンドです。 花御さんも、シンプルなものほど応用が効いて強いことを認めています。

    インストール

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

    brew install peco

    設定

    pecoの導入に当たって以下の記事を参考にしました。

    pecoを使って端末操作を爆速にする - Qiita

    記事にしたがって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

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

    do not exist tac

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

    historyをgrepしてる時のイメージ

    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の部分ですがこのままだと数字が入力されてうまく機能しません。

    select directory in peco

    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-EはEmacsの行の最後にカーソルを移動するキーバインドと重なってしまうため、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

    いい感じになりました。

    work well in peco

    work well

    終わりに

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

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

    -––