LoginSignup
13
6

zshをfishのように使いやすくカスタマイズ

Last updated at Posted at 2023-01-10

fishからzshに移行する過程を、備忘録的に残したいと思います。

はじめに

僕はfishが大好きです。
今までのbashとは違った、使いやすくて離れづらいシェルです。
bashが使いづらいとは言ってません。

しかし、fishはPOSIX非互換なんですよね。すると、いままでbashで構築してきた知識が半分くらい使えないんです。なんか困ったことがあってググっても、基本的にbash前提の記事ばかりなので、微妙に読み替えなきゃいけないところがあるの。
そこで、zshに乗り換えてフレンドリーでインタラクティブにして、fishのような使い勝手に仕立て上げようと思います。(元々インタラクティブではある件は気にせんといて)

(よく考えると、POSIX非互換でそれなりにユーザーがいて有名なシェルって、fishとpwsh(PowerShell)くらいしかないよね。fishすごい。ash含めるかは意見が分かれると思うけど。)

zshをfishに仕立て上げる(?)に当たって、再現するポイントを以下のように挙げました。今回は以下の項目を再現し終えることをゴールとします。

  • fisherのようなシンプルで範囲の広いプラグインマネージャー
  • bobthefishのようなPowerline風プロンプト
  • コマンド入力中に灰色で出てくる入力サジェスト
  • コマンドのシンタックスハイライト
  • コマンド入力中に展開されるエイリアス、abbr
  • jethrokuan/zのように、zコマンドでぴょんぴょんディレクトリ移動(語彙死亡)

ではれっつごー

対象者

  • シェルに関しての基礎知識がある方
  • bashやfishなどからzshに移行する方

※基本的なことについては書いていないので、初めて触るシェルのセットアップをする方向けではありません。

まずはzshのインストール

普段使ってるパッケージマネージャでインストールします。

sudo apt install zsh

ログインシェルにする(任意)

chsh -s /usr/bin/zsh ユーザ名

なんかセットアップ画面が出てきました。

こんな画面(クリックで開く)
This is the Z Shell configuration function for new users,
zsh-newuser-install.
You are seeing this message because you have no zsh startup files
(the files .zshenv, .zprofile, .zshrc, .zlogin in the directory
~).  This function can help you with a few settings that should
make your use of the shell easier.

You can:

(q)  Quit and do nothing.  The function will be run again next time.

(0)  Exit, creating the file ~/.zshrc containing just a comment.
     That will prevent this function being run again.

(1)  Continue to the main menu.

(2)  Populate your ~/.zshrc with the configuration recommended
     by the system administrator and exit (you will need to edit
     the file by hand, if so desired).

--- Type one of the keys in parentheses --- 

適当なキーを押すと画面が変わります。
初回起動だからホームディレクトリにzsh関連ファイルがなくて出てきたっぽいですね。
めんどくさいので、適当におすすめ設定つけといてもらいましょう。
2と打ちます。

zshのプロンプトが出てきました。
Screenshot 2023-01-10 17.12.39.png
だっさ。なにこれ。(ホスト名の消し方雑なのは許して)(あと、メイン端末ではないし、ってユーザー名の付け方も雑なの許して)
試しにlsでも打っときましょう。エイリアスも何も設定してないので、真っ白。結構見づらい。
image.png
どれがファイルでどれがしれクトリなのかさえわからんね。bashなら多くの場合デフォルトで色がつくのに。

一つだけ便利なところといえば、入力中に[Tab]で補完ができます。

これを使いやすくしていきましょう!

Zplugの導入

僕は現在、zplugからantigenに乗り換えました。主に、zplugの読み込みがめっちゃ遅かったからです。詳しくはこの章の最後に書きます。

プラグインマネージャーであるZplug を導入します。
プラグインマネージャー(の機能を持つものも含む)には、他にも、Oh My ZshやZinit(旧Zplugin)などがあります。

なぜZplugを選んだかというと、シンプルだからです。
Oh My Zshは、フレームワークというだけあって、機能が多すぎて複雑。一方のZinitは、比較的シンプルなのはいいのですが、2021年頃に作者がリモートリポジトリを削除してしまったという事件がありました。直後に有志がローカルのリポジトリから復元したらしいのですが、他のものを使ったほうが良さそうかなと思いました。

日本語版公式ドキュメントがあるので、それに従いましょう。
(なんで日本語版があるのかな、と思ったら、GitHubのOrganizationメンバー3人中2人は日本人ですね。残りの一人は、個人じゃないっぽい?)

  1. インストールする
    curl -sL --proto-redir -all,https https://raw.githubusercontent.com/zplug/installer/master/installer.zsh| zsh
    
    インストール画面かっこいいね
    image.png
  2. ~/.zshrcに追記する(公式ドキュメントの解説部分は削ったもの+αを貼っときます)
    .zshrc
    #zplugの読み込み
    source ~/.zplug/init.zsh
    
    #zplugをzplug自身で管理
    zplug 'zplug/zplug', hook-build:'zplug --self-manage'
    
    #ここに他のプラグインについて設定する
    
    # 未インストール項目をインストールする
    if ! zplug check --verbose; then
        printf "インストールしますか? [y/N]: "
        if read -q; then
            echo; zplug install
        fi
    fi
    
    # コマンドをリンクして、PATH に追加し、プラグインは読み込む
    zplug load --verbose
    

これで、source ~/.zshrcで読み込めます。

なお、ここに管理するプラグインを記述する際は以下のようにします。(READMEより)
image.png
tagに関しては、README#3-タグを参照。

Oh-my-zshのプラグインも読み込めるし、gistのプラグインも読み込めるし、すごい便利です。
これも、READMEを参考にしてみてください。

antigenに乗り換えました

zplugの読み込みが遅かったので、antigenに乗り換えました。

zinitは気になっていたのですが、上述の理由からちょいとやめようかと思い、他に気になったのがsheldonantigenでした。

antigenは以下に書いている入力サジェストとシンタックスハイライトと同じ提供元であるzsh-usersが公開していたので選びました。

以下はREADMEWikiに従います。

  1. インストール

    curl -sL git.io/antigen ~/antigen.zsh
    
  2. .zshrcに追記

    .zshrc
    source ~/antigen.zsh
    
    #各種プラグインのインストール設定
    
    antigen apply
    

プラグインのインストール設定は以下のような書式です。

antigen bundle [<url>[@tag|branch] [<loc>]]

例えば以下のようにします。

antigen bundle alpaca-honke/prowpt@main prowpt.plugin.zsh

なお、ブランチ名とファイル名は省略可です。

Powerline-shellのインストール

僕は現在、自作のプロンプトProwptを使っています。詳しくはこの章の下に書いています。

カスタムプロンプトのPowerline-shell をインストールします。

公式ガイドに従いましょう。
今回はpipでのインストールを試します。

まずはPythonをインストールします。

  1. Pythonが入ってるか確認python --version pip -v
  2. もしも未インストールならsudo apt install pythonでPython2が入ります。
  3. 念の為sudo apt install python3でPython3も入れときます。
  4. もしも未インストールならsudo apt install pipでpython3-pipが入りました。

次にPowerline-shellをインストールします。zplugでの管理方法がわからないので、普通にインストールします。

  1. pip install powerline-shell
  2. 画像のように、PATH通ってないよーって言われたら、PATHを通しておきます。
    image.png
    ~/.zshrcのPATH指定部分を編集します。もしなければ、適当に作っといてください。
    .zshrc
    export PATH="$HOME/.local/bin:$PATH"
    
  3. ~/.zshrcに以下を追記。
    .zshrc
    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
    
  4. ターミナルを再起動で適用されます。
    Screenshot 2023-01-10 20.55.38.png
    かっこいい。

もし、文字化けが酷いようであれば、Powerline FontsNerd Fontsを使いましょう。
個人的には後者の方がグリフが多くてオススメです。

※なぜかsource ~/.zshrcするごとにプロンプトがダサいやつに戻ってしまうので、ターミナルを再起動してます。原因わかる方いたら教えて下さい。

カスタマイズは、PowerlineのREADME#customization参考。

Prowptに乗り換えました。

これは自作です。自分の好みにピッタリ合うものを作ったんです。
日本語READMEに従います。
とは言っても.zshrcに追記するだけです。

  • zplugの場合
    zplug "alpaca-honke/prowpt", as:plugin, at:main
    
  • antigenの場合
    antigen bundle alpaca-honke/prowpt@main
    

その他のカスタマイズは日本語READMEに詳しく書いたので、見てみてください。

zsh-autosuggestionの導入

入力サジェストのプラグイン、zsh-autosuggestion を導入します。

  1. ~/.zshrcに追記する
    • zplug
      .zshrc
      zplug "zsh-users/zsh-autosuggestions", as:plugin
      
    • antigen
      .zshrc
      antigen bundle zsh-users/zsh-autosuggestions
      
  2. ターミナルを再起動

これだけ!
こんな感じでサジェストされました!
image.png
右矢印キーで候補を入力 できます!

zsh-syntax-highlightingを導入する

シンタックスハイライトプラグイン、zsh-syntax-highlighting を導入します。

上記autosuggestionsと同じ要領です。

  1. ~/.zshrcに追記する
    • zplug
      .zshrc
      zplug "zsh-users/zsh-syntax-highlighting"
      
    • antigen
      .zshrc
      antigen bundle zsh-users/zsh-syntax-highlighting
      
  2. ターミナルを再起動

image.png
ちょっと見づらいですがこんな感じでハイライトされました!
image.png
間違ってると赤くなります

zsh-abbrを導入

展開されるaliasであるzsh-abbr を導入します。

  1. ~/.zshrcに追記する
    • zplug
      .zshrc
      zplug "olets/zsh-abbr"
      
    • antigen
      .zshrc
      antigen bundle olets/zsh-abbr@main
      
  2. ターミナルを再起動

これで、.zshrcaliasの代わりにabbrを使用することで、コマンド入力中にエイリアスが[Space]or[Enter]で展開される ようになります。このとき、.zshrcの末尾にabbrを追加しないと、コマンドがねえぞって怒られました。

-Sオプションは、セッション限定のabbrになります。これを使うことで、aliasと同じような感覚で設定できます。
あと、標準出力を捨てないと、起動時にメッセージがエグい ことになります。
image.png
例えば、以下は僕の設定です。(git系のabbrが一部、一般的に使われてるaliasとは違うのは僕の好みです)

.zshrc
abbr -S ll='ls -l' >>/dev/null
abbr -S la='ls -A' >>/dev/null
abbr -S lla='ls -l -A' >>/dev/null
abbr -S gst='git status' >>/dev/null
abbr -S gsw='git switch' >>/dev/null
abbr -S gbr='git branch' >>/dev/null
abbr -S gfe='git fetch' >>/dev/null
abbr -S gpl='git pull' >>/dev/null
abbr -S gad='git add' >>/dev/null
abbr -S gcm='git commit' >>/dev/null
abbr -S gmg='git merge' >>/dev/null
abbr -S gpsh='git push' >>/dev/null

プロンプトに入力時に、こんなコマンドねえよって赤くハイライトされることはちょっと不満ですが、まあ大して困らないんで良しとします。

ついでに、普通のエイリアスとして以下も登録しとこう。
ls打った時に、アイテムの種類(通常ファイルか、実行権限つきか、ディレクトリか、シンボリックリンクか、パイプか、ソケットか)がひと目でわかるようになります。

.zshrc
alias ls='ls -F --color=auto'

zの導入

ディレクトリを簡単に飛び回れるコマンド、rupa/z を導入します。

  1. ~/.zshrcに追記する
    • zplug
      .zshrc
      zplug "rupa/z", use:"*.sh" #useタグを忘れないように
      
    • antigen
      .zshrc
      antigen bundle rupa/z z.sh
      
  2. ターミナル再起動

これで、 一度アクセスしたディレクトリなら、ディレクトリ名の一部を入力するだけで移動 できます!

例えば、こんな感じ
image.png
これ、めちゃくちゃ便利で、階層が深くてカレントディレクトリから遠いとこに移動したいときにすっごいありがたいんです。

おわり

zshがかっこよくなって、つかいやすくなった!
あるかっぱのレベルが、1あがった!
(終わり方雑)

なお、僕のdotfiles的なリポジトリに置いてある.zshrcを使うとこの辺の設定が手間いらずで行われます。ミソは、antigenがインストールされてなければ勝手にインストールするコマンドを書くことです。

なおこのリポジトリを使用したことによる損害等に関して一切の責任は負いません。

13
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
13
6