LoginSignup
19
3

More than 1 year has passed since last update.

【Zsh】続・大改造ターミナル環境 〜zeno.zshでCLI操作を快適にする〜【Zinit】

Last updated at Posted at 2022-12-02

上記記事にまとめたようにZshとZinitを使用してターミナル環境整えていたのですが、
さらなる環境向上のために便利なライブラリなどないかなーと調べてみたところ、
zeno.zshという大変使いやすく便利なライブラリを見つけました。

本記事はzeno.zshのインストール方法と使い方の紹介記事になります。

※zeno.zsh作者様の記事
Deno + TypeScriptでzshプラグインを実装して最高になった

インストール手順

zeno.zshの利用には、Denofzfのインストールが必須となります。
MacであればHomebewからインストールできます。

$ brew install deno
$ brew install fzf

次にzeno.zshの設定をします。
Zsh用プラグインマネージャであるZinitを使用していれば、.zshrcなどのファイルに以下設定記述を書くだけで大丈夫です。

~/.zshrc
## zeno設定
zinit ice lucid depth"1" blockf
zinit light yuki-yano/zeno.zsh

if [[ -n $ZENO_LOADED ]]; then
  # ここに任意のZLEの記述を行う
  bindkey ' '  zeno-auto-snippet
  bindkey '^m' zeno-auto-snippet-and-accept-line
  bindkey '^i' zeno-completion
  bindkey '^g' zeno-ghq-cd
  bindkey '^r' zeno-history-selection
  bindkey '^x' zeno-insert-snippet
fi

これでzeno.zshの基本的な設定は完了です。
あとは次に.zshrcを読み込むタイミングでzeno.zshが自動でインストールされます。

zeno.zshのload後にZLE(Zsh Line Editor)のキーバインドを行うことで、任意のコマンドでzeno.zshの機能を実行することができます。

使い方

ここからはzeno.zshの便利な機能とその使い方について見ていきましょう。

Abbrev snippet

簡単にいうと略語展開です。
別ファイル(config.yml)に設定しているkeyword入力後にスペースキーを押すと、そのkeywordに設定しているsnippetが展開されます。

config.yml
# configファイル内で事前に設定しておく
snippets:
  - name: git status
    keyword: gs
    snippet: git status --short --branch
コマンド実行
$ gs<Space>  # gsと入力後にスペースキーを押す

# ↓ 事前に設定しているコマンドが展開される

$ git status --short --branch

※gif
ezgif.com-gif-maker.gif
keyword入力後にスペースキーを押すとコマンドが展開され、Enterキーを押すと展開と同時に実行されます。

一見シェルのalias機能に似ていますが、略形ではなくsnippet全体がコマンド履歴に残ることなどのメリットがあり、後述する様々な展開方法を使用することでさらに優れた機能を実現できます。

config.ymlは~/.config/zeno/config.ymlのように配置したり、
任意で環境変数ZENO_HOMEを設定して$ZENO_HOME/config.ymlなどに配置することができます。

※詳しくはREADMEを参照してください。

行頭以外での展開

global: trueのオプションを設定することで、コマンドの途中からでもkeywordを展開することができます

config.yml
snippets:
  - name: "null"
    keyword: "null"
    snippet: ">/dev/null 2>&1"
    global: true
$ ls null<Space>

# ↓ 行頭以外でもsnippetが展開される

$ ls >/dev/null 2>&1

正規表現による展開

context内のlbufferオプションを使用することで、展開を行う条件を正規表現で指定することができます。

config.yml
snippets:
  - name: git switch
    keyword: s
    snippet: switch
    context:
      lbuffer: ^git\s  # gitを入力している時のみ展開する
$ git s<Space>

# ↓ snippetが展開される

$ git switch
$ echo s

# ↓ snippetが展開されない

s

placeholderを用いた展開

snippet内に{{任意のテキスト}}を入れ込むことで、略語展開後に指定したplaceholderの位置にカーソルを移動することができます。

config.yml
snippets:
  - name: git commit message
    keyword: gcm
    snippet: git commit -m '{{commit_message}}'
$ gcm<Space>

# ↓ snippetが展開され、カーソルがplaceholderの位置まで移動した状態になる

$ git commit -m '(ここにカーソルが移動する)'   # カーソル移動をすることなくコミットメッセージを入力できる

シェルスクリプトを実行した展開

evaluate: trueのオプションを設定することで、snippetをシェルスクリプトとして実行した結果を展開することができます。

config.yml
snippets:
  - name: branch
    keyword: B
    snippet: git symbolic-ref --short HEAD  # カレントブランチ名を取得するコマンド
    context:
      lbuffer: '^git\s+checkout\s+'
    evaluate: true
$ git checkout B<space>

# ↓ シェルスクリプト実行の結果が展開される

$ git checkout main

Insert snippet

登録したsnippetをインタラクティブに検索しながら挿入することができます。
これを利用すればkeywordやsnippetを完全に覚えていなくても、検索から見つけて実行できるので大変便利です。

~/.zshrc
# 「Ctr + x」にキーを設定
bindkey '^x' zeno-insert-snippet

※snippetを検索して選択するgif
ezgif.com-gif-maker (2).gif

Search history

historyファイルに保存されているコマンド履歴を検索できる機能です。

~/.zshrc
# 「Ctr + r」にキーを設定
bindkey '^r' zeno-history-selection

※コマンド履歴から検索して選択するgif
ezgif.com-gif-maker (3).gif

Change ghq managed repository

リポジトリ管理ツールであるghqの機能を使って、Gitリポジトリ間の移動を簡単にする機能です。

~/.zshrc
# 「Ctr + g」にキーを設定
bindkey '^g' zeno-ghq-cd

※リポジトリ一覧から検索してカレントディレクトリを切り替えるgif
ezgif.com-gif-maker (4).gif

Fuzzy completion

zeno.zshでは任意のコマンド(正規表現)に対して、fzfを用いたインタラクティブな補完を設定できます。
デフォルトでいくつかのGitコマンドの補完が設定されています。

# 設定したコマンド入力後にTabキーを押下
$ git switch <Tab> 

※git switchコマンドの補完でブランチ一覧から任意のブランチを選択するgif
ezgif.com-gif-maker (5).gif

その他設定

シンタックスハイライト

zeno.zshはzshのシンタックスハイライトプラグインであるzsh-syntax-highlightingと相性が良くないらしく、代わりにfast-syntax-highlightingをインストールしました。

~/.zshrc
zinit light zdharma-continuum/fast-syntax-highlighting

fzfの表示設定

デフォルトでは検索画面の表示が画面下部に表示されていたため、画面上部に表示するよう見た目の変更をしました。

~/.zshenv
export FZF_DEFAULT_OPTS='--reverse'

まとめ

デフォルトの機能だけでも便利ですが、スクリプトを作ることで個人の使い方に合わせたカスタマイズもできそうなので、これからどんどんアレンジしていきたいです。
また、コマンドのインタラクティブ検索などはpecoを利用して同様のことができていたのですが、レイアウトや使い勝手がfzfの方が好みでこちらも満足しています。

興味を持った方は是非使ってみてください。

参考

19
3
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
19
3