zsh
をUbuntuやLMDE(Debian)にインストールしてみて、初めてあれこれ設定しないと、まともに使えないことを知る1。という雑魚zsh使い始めのためのメモ。
マルチバイト対応
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
で、とりあえずそれなりに動く状態にはなる。~/.zshrc
4を下手に空ファイルとかで作ると、補完は効かない、履歴は残らない、使いにくい環境となってしまう。
ただ、
Alter Linuxで設定されているのと大分違う。パッと分かるのは、パスワード入力のとき*
と表示されない。プロンプトが、ダサい。
Alter Linuxのzshrcをパクってくる
alterlinux/.zshrc at dev · FascodeNet/alterlinux · GitHubには、Alter Linux i3wm Editionでのzshrc
が見れるので確認する。
これを元に手を入れていく、というか、設定に合うように環境を構築していく。
ArchLinuxでターミナルをかっこよくする | FascodeNetwork Blogなどで読めるとおり、フォントや justjanne/powerline-goの導入有無などなどが必要となる。
プラグイン
そもそも、zsh
はvim
のようにプラグインを導入していくものだ、ということを知る。
などが導入されている。
プラグインインストールの仕方は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は、まともにインストールしようとすると、大量すぎて何がなんだか分からない。
- nerd-fonts/patched-fonts/SourceCodePro/Medium/complete
- nerd-fonts/patched-fonts/SourceCodePro/Regular/complete
なので、それっぽいのを直ダウンロードしてきて~/.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の設定ファイルの読み込み順番のメモ - 目の前に僕らの道がある
などにあるように
- ~/.zshenv
- ~/.zprofile
- ~/.zshrc
- ~/.zlogin
と読み込まれる6のでは…それはCLIの話で、デスクトップ環境での話ではない。なので、ランチャーからnvim
やnvim-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" ]; then
やif [ -n "$ZSH_VERSION" ]; then
で、標準シェルがbash
かzsh
の判定が出来なかったので$SHELL
の値を見ることとした。7
そして、
zshでPATH環境変数の重複エントリを排除 - Qiitaにあるとおりtypeset -U path PATH
と追記しておいて、PATH
を重複させないようにする。どれに書くのが正解なのか分からないが、~/.zshrc
に記述しておいた。
キーバインド
殆ど設定を同じにしたつもりだが、export EDITOR=/usr/bin/nvim
としてもキーバインドがvi
モードとならない8。が、念の為、~/.zshrc
にbindkey -e
を追記する。
以上。
-
Alter Linuxだと、初めから良い感じで使える。 ↩︎
-
背景画像は 【デジタル限定】浅倉唯写真集「かわいいが渋滞中!!」 p.68 ↩︎
-
ファイル検証なんて面倒なら
wget https://sourceforge.net/projects/zsh/files/latest/download -O zsh.tar.xz
でも良いか。 ↩︎ -
~/.zshrc
は、.zshenv, .zprofile, .zshrc, .zlogin
いずれも存在しけば、初期設定ウィザードが始まり、質問に答えれば作れる。しかし、英語で質問だからなぁ。cp /etc/zsh/newuser.zshrc.recommended ~/.zshrc
とすればオススメ設定になるのかな。 ↩︎ -
おい、Antigen もいいけど zplug 使えよ - Qiitaという記事もあり、
zplug
の導入も考えたが、多機能で設定が複雑そうなので止めた。しかも、作者は Current status and next approach of zplug · Issue #579 · zplug/zplug · GitHubにあるとおり b4b4r07/afx: 📦 Package manager for CLIの方に興味が既に行ってしまっているようだ。 ↩︎ -
ユーザー設定でなく、グローバル設定の読み込みについて zshで/etc/zshenvや/etc/zprofileが読まれない問題の記事などもあった。これはこれで、覚えておこう。 ↩︎
-
Sublime TextのIssueの回答だと、意味不明なことに
zsh
のファイル読み込ませるのに、$BASH_VERSION
で判定してるんだよなぁ、単なる誤記か?また、Alter Linuxの alterlinux/.xinitrc at dev · FascodeNet/alterlinux · GitHub見ると思いっきりsource
使っているんだよなぁ。ディストリビューションによって違うのか? ↩︎ -
Alter Linuxの端末(ターミナル)でCtrl+a(先頭移動), Ctrl+e(文末移動)が効かくなったに書いたとおり、環境変数VISUALまたはEDITORにviの文字を含んでいると viモード になってしまうことがある。 ↩︎