hbsnow.dev

快適なターミナル環境を整備する

shell

shellはMacで現在ではデフォルトのzshを使っています。

以前fishを使っていたこともあるのですが、Web上で公開されているスクリプトや設定がそのままでは動かないことが多く、メリットを上回るデメリットに感じたため今は使っていません。

ターミナルエミュレータ

Hyper を使っています。

iTerm2 はクロスプラットフォームではないこと、alacritty は日本語入力の対応がなさそうなので採用を見送っています。

anyenv

nodenv-package-json-engine を入れておくと、プロジェクトによって使用するNode.jsのバージョンを変更してくれます。

"engines": {
  "node": "^8.0.0"
}

package.jsonに上記のようにバージョンが記述するか、あるいは .node-versionを置いてくことが条件になります。

Prezto

インストール方法についてはリンク先を参照してください。

頑張れるのであれば zplug を使うことになるのですが、設定に強いこだわりがなく面倒なのでPreztoを使っています。

Preztoの設定は ~/.zpreztorc にあり、デフォルトだと syntax-highlighting が有効化されていないので、有効にしておくと便利です。

私は上記のモジュールも有効にしていて、最終的には次のモジュールを読み込ませています。

zstyle ':prezto:load' pmodule \
  'environment' \
  'terminal' \
  'editor' \
  'history' \
  'directory' \
  'spectrum' \
  'utility' \
  'completion' \
  'prompt' \
  'autosuggestions' \
  'history-substring-search' \
  'syntax-highlighting'

prompt

以前は powerline を使っていたのですが、別途フォントのインストールが必要になります。環境によってはそれが許されないこともあるので、pureに乗り換えました。

こちらの設定も ~/.zpreztorc を編集することで反映されます。

-zstyle ':prezto:module:prompt' theme 'sorin'
+zstyle ':prezto:module:prompt' theme 'pure'

ghq

コードを統一的に管理するツール。ghq get でリポジトリを取得して、fzfを使って検索ができるようになるととりあえず手元にもってくることが苦痛でなくなるので本当に便利。

sshでcloneするとき ghq get -p とすればいいんだけど、毎回オプションを忘れてます。

fzf

以前は peco を使っていたのですが、左右に表示されるのがいいなと思ってfzfを使い始めました。いまのところghqやcdrと組み合わせて使うくらいしかしていません。

Icdiff

VS Codeが優秀なのであまりターミナル上で差分の確認をすることはありませんが、するときにあると便利なので入れています。

AWS-CLI

もともとインストールはせず aws にエイリアスを指定していたのですが、インストールをしないと補完がきかなかったため、結局インストールして以下を追加しました。

autoload bashcompinit && bashcompinit
complete -C '/usr/local/bin/aws_completer' aws

最終的な .zshrc

export LANG=ja_JP.UTF-8

export VISUAL='code -w'
export EDITOR=$VISUAL

autoload -Uz is-at-least
autoload bashcompinit && bashcompinit

# prezto
if [ -s "${ZDOTDIR:-$HOME}/.zprezto/init.zsh" ]; then
  source "${ZDOTDIR:-$HOME}/.zprezto/init.zsh"
fi

# aws
complete -C '/usr/local/bin/aws_completer' aws

# anyenv
if [ -d $HOME/.anyenv ]; then
  export PATH="$HOME/.anyenv/bin:$PATH"
  eval "$(anyenv init -)"
fi

# goenv
export GO111MODULE=on
export GOPATH=$HOME/go
export PATH=$GOPATH/bin:$PATH

# fzf
export FZF_DEFAULT_OPTS="--layout=reverse"

# ghq
function _ghq-fzf() {
  local src=$(ghq list | fzf --preview "ls -laTp $(ghq root)/{} | tail -n+4 | awk '{print \$9\"/\"\$6\"/\"\$7 \" \" \$10}'")
  if [ -n "$src" ]; then
    BUFFER="cd $(ghq root)/$src"
    zle accept-line
  fi
  zle -R -c
}
zle -N ghq-fzf _ghq-fzf
bindkey '^]' ghq-fzf

# cdr
if is-at-least 4.3.11; then
  autoload -Uz chpwd_recent_dirs cdr add-zsh-hook
  add-zsh-hook chpwd chpwd_recent_dirs
  chpwd_functions+=chpwd_recent_dirs
  zstyle ':chpwd:*' recent-dirs-max 1000
  zstyle ':chpwd:*' recent-dirs-default true
  zstyle ':completion:*' recent-dirs-insert always

  # 既に存在しないディレクトリをcdrのリストから削除する
  # https://blog.n-z.jp/blog/2014-07-25-compact-chpwd-recent-dirs.html
  function _my-compact-chpwd-recent-dirs() {
    emulate -L zsh
    setopt extendedglob
    local -aU reply
    integer history_size
    autoload -Uz chpwd_recent_filehandler
    chpwd_recent_filehandler
    history_size=$#reply
    reply=(${^reply}(N))
    (( $history_size == $#reply )) || chpwd_recent_filehandler $reply
  }
  _my-compact-chpwd-recent-dirs

  alias cdd='_fzf-cdr'
  function _fzf-cdr() {
    target_dir=`cdr -l | sed 's/^[^ ][^ ]*  *//' | fzf`
    target_dir=`echo ${target_dir/\~/$HOME}`
    if [ -n "$target_dir" ]; then
      cd $target_dir
    fi
  }
fi