2023年のシェル環境構築
tl;dr
- fig
- starship
- zsh
- fzf
- sheldon
なぜ
vscode の .vscode/tasks.json が fishと非常に相性が悪い。とくに fish-nvm を使っていると、fish 経由のパス実行時に node と npm へパスが通らない。
そもそも fish を使っていた理由は autocomplete を快適にするためだったが、1年ぐらい Fig を使っていて、補完はこれを任せていいと気づいた。
Fig はこういうやつ
そもそも fish の拡張コマンドを使わないように生活していた。方言を覚えたくない。というか bash 拡張や zsh 拡張もあんまり覚えたくない。
Starship
Prompt 周りは starship に丸投げした。普通の shell prompt だと巨大リポジトリの時に Git の動作が不安定になるので、 libgit の Rust 実装なのでその辺は比較的高速なはず。
$ brew install starship
カスタマイズ
自分は縦二分割でシェルを使うことが多いので、横幅を取る設定をあまり入れたくない。
git もブランチ名と dirty かどうかぐらいしかいらない。
"$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
こんな感じになった。
ZSH
パッケージマネージャを調べたら zsh は相変わらず乱立している。
とりあえず高速らしい sheldon を入れてみた。zsh と bash に対応している。
ついでに eza と fzf も入れておいた。
brew install sheldon fzf eza
とはいえ autoseggesition ぐらいしか入れていない
[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 でこんな感じにヒストリがでる
ヒストリの移植
https://github.com/jonas-pietzsch/fish-history-to-zsh を参考に fish の history を ~/.zsh_history に流し込んだ
最後に vscode の default settings を zsh に戻して終了
"terminal.integrated.defaultProfile.osx": "zsh",
感想
fish に近い使い心地を実現できた。しばらくこれでやっていこうと思う。
ただ、色々不満はある。
- 存在しないコマンドを入力しているとき、 fish は赤く警告色になるが zsh はそれができない
- 改行をまたいだ autocomplete では、間違ったものが入力されることがある
存在しないコマンドを入力しているとき、 fish は赤く警告色になるが zsh はそれができない
欲しいのはこういうのですかー?
だいぶと前に設定して何も覚えていないのですが、zshの何らかのプラグインで存在するコマンドに色がつけられるようですす。
恐らく、この辺でしょうか
Non-exsistent command
Existent command
Dotfiles
↑の設定
ありがとうございます!
sheldon add --github zdharma/fast-syntax-highlighting fast-syntax-highlighting
で導入したらだいたい期待通りの挙動でした!