Open9

2023年のシェル環境構築

mizchimizchi

tl;dr

  • fig
  • starship
  • zsh
  • fzf
  • sheldon

なぜ

vscode の .vscode/tasks.json が fishと非常に相性が悪い。とくに fish-nvm を使っていると、fish 経由のパス実行時に node と npm へパスが通らない。

そもそも fish を使っていた理由は autocomplete を快適にするためだったが、1年ぐらい Fig を使っていて、補完はこれを任せていいと気づいた。

https://github.com/withfig/autocomplete

Fig はこういうやつ

そもそも fish の拡張コマンドを使わないように生活していた。方言を覚えたくない。というか bash 拡張や zsh 拡張もあんまり覚えたくない。

mizchimizchi

Starship

Prompt 周りは starship に丸投げした。普通の shell prompt だと巨大リポジトリの時に Git の動作が不安定になるので、 libgit の Rust 実装なのでその辺は比較的高速なはず。

$ brew install starship

カスタマイズ

自分は縦二分割でシェルを使うことが多いので、横幅を取る設定をあまり入れたくない。
git もブランチ名と dirty かどうかぐらいしかいらない。

~/.config/starship.toml
"$schema" = 'https://starship.rs/config-schema.json'
add_newline = true
[character]
format = "[\\$](green bold) "

[directory]
truncation_length = 3

[git_branch]
symbol = ''
format = '\([$symbol$branch(:$remote_branch)]($style)\)'

[git_status]
format = '([$all_status$ahead_behind]($style) )'
conflicted = ''
ahead = ''
behind = ''
diverged = ''
up_to_date = '✓'
untracked = ''
stashed = ''
modified = '🔥'
staged = ''
renamed = ''
deleted = ''

[package]
disabled = true

[nodejs]
disabled = true

[gcloud]
disabled = true

こんな感じになった。

mizchimizchi

ZSH

パッケージマネージャを調べたら zsh は相変わらず乱立している。

とりあえず高速らしい sheldon を入れてみた。zsh と bash に対応している。

https://zenn.dev/ganta/articles/e1e0746136ce67

ついでに eza と fzf も入れておいた。

brew install sheldon fzf eza

https://github.com/rossmacarthur/sheldon

とはいえ autoseggesition ぐらいしか入れていない

~/.config/sheldon/plugins.toml
[plugins]

[plugins.zsh-autosuggestions]
github = "zsh-users/zsh-autosuggestions"

[plugins.ni]
github = 'azu/ni.zsh'

sheldon update --lock で更新できるが、eval "$(sheldon source)" を書いておけば zsh 起動時に勝手にやってくれる。

インストールがやたら時間かかったので、 devcontainer とかで使いたい場合は採用しづらいかも。

(気づいたらみんな設定ファイルが toml になってる...)

~/.zshrc

設定ファイル。自分は homebrew を ~/brew に入れる派。
fzf で history を fuzzy search できるようにする。

# Fig pre block. Keep at the top of this file.
[[ -f "$HOME/.fig/shell/zshrc.pre.zsh" ]] && builtin source "$HOME/.fig/shell/zshrc.pre.zsh"

## Config
PATH="$HOME/brew/bin:$HOME/.cargo/bin:$HOME/bin:$PATH"

alias la="eza -a --git -g -h --oneline"
alias ls="eza"
ISTFILE=$HOME/.zsh_history
HISTSIZE=100000
SAVEHIST=100000
setopt share_history
setopt hist_ignore_dups
setopt hist_ignore_all_dups
setopt auto_pushd
setopt auto_cd
autoload -Uz compinit
compinit

## eval
eval "$(sheldon source)"
eval "$(starship init zsh)"
source $HOME/.nvm/nvm.sh

## fzf
function fzf-select-history() {
    BUFFER=$(history -n -r 1 | fzf --query "$LBUFFER")
    CURSOR=$#BUFFER
    zle reset-prompt
}
zle -N fzf-select-history
bindkey '^r' fzf-select-history

# ======== Fig post block. Keep at the bottom of this file.
[[ -f "$HOME/.fig/shell/zshrc.post.zsh" ]] && builtin source "$HOME/.fig/shell/zshrc.post.zsh"

Ctrl-R でこんな感じにヒストリがでる

mizchimizchi

最後に vscode の default settings を zsh に戻して終了

~/Library/Application\ Support/Code/User/settings.json
  "terminal.integrated.defaultProfile.osx": "zsh",
mizchimizchi

感想

fish に近い使い心地を実現できた。しばらくこれでやっていこうと思う。
ただ、色々不満はある。

  • 存在しないコマンドを入力しているとき、 fish は赤く警告色になるが zsh はそれができない
  • 改行をまたいだ autocomplete では、間違ったものが入力されることがある
mizchimizchi

ありがとうございます!
sheldon add --github zdharma/fast-syntax-highlighting fast-syntax-highlighting で導入したらだいたい期待通りの挙動でした!