zshやpecoの導入についての走り書き

自前の開発環境である仮想マシン(AlmaLinux8.4)にてzshを導入。

設定に際してハマった事のメモ書き(多分近い将来忘れて同じ様なことを繰り返す自信があるので)。

目次

1.zshインストール

# dnf install zsh
# which zsh
/usr/bin/zsh
# chsh -s /usr/bin/zsh [username]
chsh: Command not found.

開始早々、chshコマンド無いとか言われた……。
lchshコマンドは存在するけど、調べた感じ余り使いたくなかったので、chshをインストール。

# dnf provides chsh
util-linux-user-2.32.1-28.el8.x86_64 : libuser based util-linux utilities
# dnf install util-linux-user
# chsh -s /usr/bin/zsh [username]

2.zinitインストール

zshのプラグインマネージャーとして今回はzinitを採用。
zinitの大元GitHubは削除されてしまったようなので、下記からインストール。

https://github.com/zdharma-continuum/zinit

# sh -c "$(curl -fsSL https://git.io/zinit-install)"
# source .zshrc
# zinit self-update

最新情報は公式のREADME.md参照。

3.よしなに.zshrcを編集

プラグインとかオプションとか……適当に自分好みに。
一応自分の.zshrcを晒すが、使用は自己責任で。

if [[ -r "${XDG_CACHE_HOME:-$HOME/.cache}/p10k-instant-prompt-${(%):-%n}.zsh" ]]; then
  source "${XDG_CACHE_HOME:-$HOME/.cache}/p10k-instant-prompt-${(%):-%n}.zsh"
fi


### Added by Zinit's installer
if [[ ! -f $HOME/.local/share/zinit/zinit.git/zinit.zsh ]]; then
    print -P "%F{33} %F{220}Installing %F{33}ZDHARMA-CONTINUUM%F{220} Initiative Plugin Manager (%F{33}zdharma-continuum/zinit%F{220})…%f"
    command mkdir -p "$HOME/.local/share/zinit" && command chmod g-rwX "$HOME/.local/share/zinit"
    command git clone https://github.com/zdharma-continuum/zinit "$HOME/.local/share/zinit/zinit.git" && \
        print -P "%F{33} %F{34}Installation successful.%f%b" || \
        print -P "%F{160} The clone has failed.%f%b"
fi

source "$HOME/.local/share/zinit/zinit.git/zinit.zsh"
autoload -Uz _zinit
(( ${+_comps} )) && _comps[zinit]=_zinit
# Enable Powerlevel10k instant prompt. Should stay close to the top of ~/.zshrc.
# Initialization code that may require console input (password prompts, [y/n]
# confirmations, etc.) must go above this block; everything else may go below.
if [[ -r "${XDG_CACHE_HOME:-$HOME/.cache}/p10k-instant-prompt-${(%):-%n}.zsh" ]]; then
  source "${XDG_CACHE_HOME:-$HOME/.cache}/p10k-instant-prompt-${(%):-%n}.zsh"
fi


### Added by Zinit's installer
if [[ ! -f $HOME/.local/share/zinit/zinit.git/zinit.zsh ]]; then
    print -P "%F{33} %F{220}Installing %F{33}ZDHARMA-CONTINUUM%F{220} Initiative Plugin Manager (%F{33}zdharma-continuum/zinit%F{220})…%f"
    command mkdir -p "$HOME/.local/share/zinit" && command chmod g-rwX "$HOME/.local/share/zinit"
    command git clone https://github.com/zdharma-continuum/zinit "$HOME/.local/share/zinit/zinit.git" && \
        print -P "%F{33} %F{34}Installation successful.%f%b" || \
        print -P "%F{160} The clone has failed.%f%b"
fi

source "$HOME/.local/share/zinit/zinit.git/zinit.zsh"
autoload -Uz _zinit
(( ${+_comps} )) && _comps[zinit]=_zinit
### End of Zinit's installer chunk

# 実行可能なコマンドに色づけ
zinit load zsh-users/zsh-syntax-highlighting

# 補完
zinit load zsh-users/zsh-completions

# ヒストリー補完
zinit load zsh-users/zsh-autosuggestions

# コマンド履歴
zinit load zsh-users/zsh-history-substring-search

# 256カラー使用
zinit load chrissicool/zsh-256color

### settings ###
export HISTFILE=${HOME}/.zsh_history
export HISTSIZE=100000
export SAVEHIST=100000

setopt inc_append_history
setopt share_history
setopt hist_ignore_all_dups

setopt AUTO_CD

setopt AUTO_PARAM_KEYS

## コマンド履歴検索
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-selections
                                                                                                                      
## コマンド履歴からディレクトリ検索・移動
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
function peco-cdr () {
  local selected_dir="$(cdr -l | sed 's/^[0-9]* *//' | peco)"
  if [ -n "$selected_dir" ]; then
    BUFFER="cd ${selected_dir}"
    zle accept-line
  fi
}
zle -N peco-cdr
bindkey '^E' peco-cdr

下2つの関数は別途インストールしたpecoの設定。
pecoのインストール方法は割愛。※AlmaLinuxはRHEL系なのでパッケージでは無くtar.gz解凍でインストール。

https://github.com/peco/peco

ハマったのは次。

4.pecoでコマンド履歴検索できないんですけど

関数書けなくて書くのが面倒臭くて良く見もせずにググって出て来たコードをコピペして、っと。。。(よい子は真似しないで下さい。

Ctrl+rポチッとな、、、

#
tail: 無効なオプション -- 'r'

なんて???

コピペした関数確認。

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

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

うん。エラーの内容通り。tail -rなんてオプション無くないか……?

調べる事しばし。どうやらちまたに転がってる関数のほとんどがMacでの.zshrc設定。
Linux環境での情報なんてそらマイナーだわな。

どうやらMacではtail -rとは行を逆順にして出力するらしく。

ああ……CentOS系Linuxだとtacか、と。
※どうでも良いけどcatの逆だからtacとか安易すg(ry

図らずもMacのコマンドとの違いが知れて良かったと言う事で。。。

終わりに

今回は面倒くさがった結果の自業自得だったけど、zshの設定はややこしい。

そもそも初心者は自分で.zshrcを設定するのがしんどいのでプラグインマネージャーを導入する事が多いと思うが、その結果予期せぬ挙動になって動かない、なんてことが起こるかと。

oh-my-zsh然り、prezto然り、zinit然り。

内部的にそれぞれプラグインマネージャー側のshなどで、aliasなどなど、もろもろ設定が初期状態で入っているので、今回の様に後から自分でpecoをインストールして関数追加、なんてやった時にエラー出力する、とかある。

今回は関係無いけど、oh-my-zshなんかはaliasでhistoryがfc -l 1に設定されているらしく。historyって叩いたら全件出力するとか嫌すぎる……。

そう言うのを調べながらカスタマイズするのも醍醐味っちゃ醍醐味だけどな!!

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

コメント

コメントする

目次