有馬総一郎のブログ

(彼氏の事情)

2022年05月28日 19:12:12 JST - 8 minute read - Linux

Zsh初心者、とりあえず、zshの設定をAlter Linuxと似たようにする

zshをUbuntuやLMDE(Debian)にインストールしてみて、初めてあれこれ設定しないと、まともに使えないことを知る1。という雑魚zsh使い始めのためのメモ。

LMDE, zsh
2

マルチバイト対応

Ubuntu 22.04でzshをインストールしたときは、print '\U1f600'すると😀と表示されたが、 LMDE 5 “Elsie”だと駄目だった。なので、ソースを落してきてコンパイルする。

zsh - Browse /zsh at SourceForge.netからソースをダウンロードする3

gpg --verify zsh-5.8.1.tar.xz.asc
tar Jxfv zsh-5.8.1.tar.xz
cd zsh-5.8.1
./configure --enable-multibyte
sudo make && sudo make install
print '\U1f600'
wget https://raw.githubusercontent.com/zsh-users/zsh/master/StartupFiles/zshrc -O ~/.zshrc

で、とりあえずそれなりに動く状態にはなる。~/.zshrc4を下手に空ファイルとかで作ると、補完は効かない、履歴は残らない、使いにくい環境となってしまう。

ただ、 Alter Linuxで設定されているのと大分違う。パッと分かるのは、パスワード入力のとき*と表示されない。プロンプトが、ダサい。

Alter Linuxのzshrcをパクってくる

alterlinux/.zshrc at dev · FascodeNet/alterlinux · GitHubには、Alter Linux i3wm Editionでのzshrcが見れるので確認する。

これを元に手を入れていく、というか、設定に合うように環境を構築していく。

ArchLinuxでターミナルをかっこよくする | FascodeNetwork Blogなどで読めるとおり、フォントや justjanne/powerline-goの導入有無などなどが必要となる。

プラグイン

そもそも、zshvimのようにプラグインを導入していくものだ、ということを知る。

などが導入されている。

プラグインインストールの仕方はgit cloneしたり、バイナリをパッケージファイルからインストールしたりと、バラバラなので、プラグインマネージャーを使うことにした。

antigen: The plugin manager for zsh.が導入、設定が簡単そう5だった。

Antigen

curl -L git.io/antigen > antigen.zshでインストールできるみたいだけど、sudo apt-get install zsh-antigenとしてapt経由でインストールした。このときインストールされるパスは/usr/share/zsh-antigen/antigen.zsh

~/.antigenrc

source /usr/share/zsh-antigen/antigen.zsh

# Load the oh-my-zsh's library.
antigen use oh-my-zsh

# Bundles from the default repo (robbyrussell's oh-my-zsh).
antigen bundle git
antigen bundle heroku
antigen bundle pip
antigen bundle lein
antigen bundle command-not-found

# Syntax highlighting bundle.
antigen bundle zsh-users/zsh-completions
antigen bundle zsh-users/zsh-autosuggestions
antigen bundle zsh-users/zsh-syntax-highlighting
antigen bundle zsh-users/zsh-history-substring-search

# Load the theme.
antigen theme robbyrussell

# Tell Antigen that you're done.
antigen apply

殆ど Usageのまま。# Syntax highlighting bundle.の所だけ修正。そして、~/.zshrc

# antigen
source ~/.antigenrc

を先頭に追記する。その後、ターミナル(zsh)起動時に、

Installing robbyrussell/oh-my-zsh!...
Installing zsh-users/zsh-completions!...
Installing zsh-users/zsh-autosuggestions!...
Installing zsh-users/zsh-syntax-highlighting!...
Installing zsh-users/zsh-history-substring-search!...
arimasou16@lemur ~ % 

とプラグインがインストールされる。antigenでインストールしたプラグインは~/.antigen/bundles配下にある。なので、~/.zshrcで読みこんでいる箇所のパスを合わせる。

[ -e ~/.antigen/bundles/zsh-users/zsh-completions ] && fpath=(~/.antigen/bundles/zsh-users/zsh-completions $fpath)
・・・中略・・・
source ~/.antigen/bundles/zsh-users/zsh-autosuggestions/zsh-autosuggestions.zsh
source ~/.antigen/bundles/zsh-users/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh
source ~/.antigen/bundles/zsh-users/zsh-history-substring-search/zsh-history-substring-search.zsh

Powerline

初めはantigen theme robbyrussellを変更して、 Themes · ohmyzsh/ohmyzsh Wiki · GitHubから良さげなテーマを選ぼうと思ったけど、どれもしっくりこないので Powerline をインストールする。

go版でなく、何となく powerline-shellをインストールする。pip install powerline-shellして、~/.zshrcのgo版用となっている箇所をshell版に書き換える。

function powerline_precmd() {
    PS1="$(powerline-shell --shell zsh $?)"
}

function install_powerline_precmd() {
  for s in "${precmd_functions[@]}"; do
    if [ "$s" = "powerline_precmd" ]; then
      return
    fi
  done
  precmd_functions+=(powerline_precmd)
}

if [ "$TERM" != "linux" ]; then
    install_powerline_precmd
fi

SauceCodePro Nerd Font

Nerd Fontsは、まともにインストールしようとすると、大量すぎて何がなんだか分からない。

なので、それっぽいのを直ダウンロードしてきて~/.fonts配下にコピーして、フォントキャッシュを更新する。

cp  ~/Downloads/font/Sauce\ Code\ Pro\ Nerd\ Font\ Complete\ Mono.ttf ~/.fonts
cp  ~/Downloads/font/Sauce\ Code\ Pro\ Medium\ Nerd\ Font\ Complete\ Mono.ttf ~/.fonts
fc-cache -fv

これでAlter Linux以外の環境でも同じようなzsh環境が整う。

環境設定

ログイン時に環境設定などをしておきたいのだけど、~/.zshenv~/.zprofileに書いてもどうも読みこまれていない。

zshの設定ファイルの読み込み順番のメモ - 目の前に僕らの道がある

などにあるように

  1. ~/.zshenv
  2. ~/.zprofile
  3. ~/.zshrc
  4. ~/.zlogin

と読み込まれる6のでは…それはCLIの話で、デスクトップ環境での話ではない。なので、ランチャーからnvimnvim-qtを起動すると、denoを必要としていると、[denops] A 'deno' (g:denops#deno) is not executable. Denops requires executable Deno.とパスが通ってないと怒られる。

似たような話は Sublime Textでもあるっぽくて zsh on Ubuntu: .zprofile is not read for environment variables · Issue #3288 · sublimehq/sublime_text · GitHubなんて質問がある。

なんとなく~/.profileに記載しておけば、解決されるってのは感覚的に知ってたけど、 Linux デスクトップの環境変数、どこに設定してますか? - インゲージ開発者ブログ

効果があるのはシェルおよびそこから起動したプロセスのみですね。 デスクトップには効果がありません。 例えば gdm 等からログインすると、デスクトップから Emacs を起動しても、 ここに設定した環境変数は反映されていません。

と書いてあったので、やはりインストールの手順漏れとかではないんだな、と。

他にも、 UbuntuデスクトップでPATHの設定は、~/.bashrc か ~/.bash_profile か ~/.profile のどれに書けばよいのか? - 部屋の中にも一年を見ると

Ubuntuのドキュメントによると、~/.bashrc や /.profile に環境変数の設定を書くよりも、/.pam_environment に書くことが推奨されています。

とある。なるほど EnvironmentVariables - Community Help Wikiにそれらしき記述がある。

別にzshに限った話ではないし、本当、皆どうしているんだろ。 .profile_commonなるファイルを作って、それを読み込ませるか、色々悩んだが、結局、~/.zprofileを作成して、それを読み込ませることにした。

shでの罠に嵌る

~/.profileに以下を追記した。

if [ $SHELL = "/usr/bin/zsh" ]; then
    if [ -f "$HOME/.zprofile" ]; then
        . "$HOME/.zprofile"
    fi
fi

【 source 】コマンド/【 . 】コマンド――シェルの設定を即座に反映させる:Linux基本コマンドTips(169) - @ITにあるとおり

ビルトインコマンド「.」の処理内容は、sourceと全く同じです ※1。

※1 bashでは、「source ファイル」と全く同じ処理を「. ファイル」でも実行できる。しかし、bashの基であるshでは「.」コマンドしか利用できず、sourceコマンドは使用できない。

というshでのsource.の違いを理解していなくて、[ -f "$HOME/.zprofile" ] && source $HOME/.zprofileと記述して嵌る。

shなので、$BASH_VERSION$ZSH_VERSIONも両方、空。なのでif [ -n "$BASH_VERSION" ]; thenif [ -n "$ZSH_VERSION" ]; thenで、標準シェルがbashzshの判定が出来なかったので$SHELLの値を見ることとした。7

そして、 zshでPATH環境変数の重複エントリを排除 - Qiitaにあるとおりtypeset -U path PATHと追記しておいて、PATHを重複させないようにする。どれに書くのが正解なのか分からないが、~/.zshrcに記述しておいた。

キーバインド

殆ど設定を同じにしたつもりだが、export EDITOR=/usr/bin/nvimとしてもキーバインドがviモードとならない8。が、念の為、~/.zshrcbindkey -eを追記する。

以上。


  1. Alter Linuxだと、初めから良い感じで使える。 ↩︎

  2. 背景画像は 【デジタル限定】浅倉唯写真集「かわいいが渋滞中!!」 p.68 ↩︎

  3. ファイル検証なんて面倒ならwget https://sourceforge.net/projects/zsh/files/latest/download -O zsh.tar.xzでも良いか。 ↩︎

  4. ~/.zshrcは、.zshenv, .zprofile, .zshrc, .zloginいずれも存在しけば、初期設定ウィザードが始まり、質問に答えれば作れる。しかし、英語で質問だからなぁ。cp /etc/zsh/newuser.zshrc.recommended ~/.zshrcとすればオススメ設定になるのかな。 ↩︎

  5. おい、Antigen もいいけど zplug 使えよ - Qiitaという記事もあり、zplugの導入も考えたが、多機能で設定が複雑そうなので止めた。しかも、作者は Current status and next approach of zplug · Issue #579 · zplug/zplug · GitHubにあるとおり b4b4r07/afx: 📦 Package manager for CLIの方に興味が既に行ってしまっているようだ。 ↩︎

  6. ユーザー設定でなく、グローバル設定の読み込みについて zshで/etc/zshenvや/etc/zprofileが読まれない問題の記事などもあった。これはこれで、覚えておこう。 ↩︎

  7. Sublime TextのIssueの回答だと、意味不明なことにzshのファイル読み込ませるのに、$BASH_VERSIONで判定してるんだよなぁ、単なる誤記か?また、Alter Linuxの alterlinux/.xinitrc at dev · FascodeNet/alterlinux · GitHub見ると思いっきりsource使っているんだよなぁ。ディストリビューションによって違うのか? ↩︎

  8. Alter Linuxの端末(ターミナル)でCtrl+a(先頭移動), Ctrl+e(文末移動)が効かくなったに書いたとおり、環境変数VISUALまたはEDITORにviの文字を含んでいると viモード になってしまうことがある。 ↩︎