Skip to content
Published:

skim で移動/コマンド履歴検索をインタラクティブに行う

モチベーション

新しく M3 Macbook Air を購入したので、これを機に色々とツールを乗り換えています。

Fuzzy Finder にはこれまで peco を使っていたのですが、全部 Rust 製に統一したいという思いがあり、skim に乗り換えました。

乗り換えたはいいのですが、キーバインドやコマンドの設定を怠っており活用できていなかったので、調べて設定してみた、というのがこの記事の内容です。

zoxide の絞り込みに skim を使う

GitHub - ajeetdsouza/zoxide: A smarter cd command. Supports all major shells.
A smarter cd command. Supports all major shells. Contribute to ajeetdsouza/zoxide development by creating an account on GitHub.
GitHub - ajeetdsouza/zoxide: A smarter cd command. Supports all major shells. favicon github.com
GitHub - ajeetdsouza/zoxide: A smarter cd command. Supports all major shells.

zoxide には標準で zi というエイリアスが設定されており、これを使うことでインタラクティブにディレクトリを選択できます。 しかし内部的には fzf が使われており、そのままだと fzf もインストールしなければなりません。

これを skim で使うための設定が以下の Issue で提案されていました。

Add support for skim · Issue #228 · ajeetdsouza/zoxide
I am saw that there were issues in the past #3, #31 and #78. Although skim is slower but you can't notice the difference unless you have lots of files. But I only have skim installed locally, I did...
Add support for skim · Issue #228 · ajeetdsouza/zoxide favicon github.com
Add support for skim · Issue #228 · ajeetdsouza/zoxide
function __zoxide_zi() {
    \builtin local result
    result="$( \
        zoxide query -ls -- "$@" \
        | sk \
            --delimiter='[^\t\n ][\t\n ]+' \
            -n2.. \
            --no-sort \
            --keep-right \
            --height='40%' \
            --layout='reverse' \
            --exit-0 \
            --select-1 \
            --bind='ctrl-z:ignore' \
            --preview='\command -p ls -F --color=always {2..}' \
        ;
    )" \
        && __zoxide_cd "${result:7}"
}
zle -N __zoxide_zi
setopt noflowcontrol
bindkey '^z' __zoxide_zi

通常のシェルインテグレーションと同様に、__zoxide_zi 関数を定義し、zoxide query でディレクトリを取得し、sk で選択するようにしています。

github.com
github.com favicon github.com

履歴検索を skim で行う

最適かは分かりませんが、履歴検索を skim で行う設定を以下のようにしました。

function hist() {
    BUFFER=$(history -n -r 1 | sk --query "$LBUFFER" --reverse)
    CURSOR=$#BUFFER
    zle reset-prompt
}
zle -N hist
bindkey '^r' hist

zle、bindkey is 何?

Zsh Line Editor の略で、Zsh のコマンドライン編集機能を提供します。 ターミナル上の文字列やカーソル位置をシェルスクリプト上で操作するための機能のようです。

今回出てくる -N オプションは、新しく関数をバインドするためのオプションです。

-N new-keymap [ old-keymap ] Create a new keymap, named new-keymap. If a keymap already has that name, it is deleted. If an old-keymap name is given, the new keymap is initialized to be a duplicate of it, otherwise the new keymap will be empty.

bindkey は、キーバインドを設定するためのコマンドです。指定したキーに対して、指定した関数をバインドします。

zsh: 18 Zsh Line Editor
zsh: 18 Zsh Line Editor
zsh: 18 Zsh Line Editor favicon zsh.sourceforge.io

参考

シェルの履歴とイクンリメンタル検索を使う
社内のテックトークで LT したスライドです
シェルの履歴とイクンリメンタル検索を使う favicon speakerdeck.com
シェルの履歴とイクンリメンタル検索を使う
zsh に変えて VSCode のターミナルで ctrl + p や n、r が効かなくなった - Just do IT
状況 MacOSをCatalinaに変更してから、VSCode のターミナルでctrl + pやctrl + r、ctrl + nを打っても以下のような表示が出ていた。 ^P ^N おそらく bash から zsh に変更したのが原因だと考えられる やりたいこと ctrl + pで一つ前のコマンド履歴を表示したい ctrl + rで過去のコマンド履歴を検索したい ctrl + nで一つ後のコマンド履歴を表示したい 解決 .zshrc に以下を記述し、zshとVSCodeを再起動すると解決した。 bindkey -e #再読み込み $ source ~/.zshrc bindkey -eで em…
zsh に変えて VSCode のターミナルで ctrl + p や n、r が効かなくなった - Just do IT favicon k-koh.hatenablog.com
zsh に変えて VSCode のターミナルで ctrl + p や n、r が効かなくなった - Just do IT
Terminal上でSnippetを実現する ~ zle(Zsh Line Editor) × fzf ~ - ハイパーマッスルエンジニア
ワンライナー打つのしんどい CSV落として該当の列だけ抜き出すときにcat hoge.csv | awk ...とか、fzfでプレビューして〇〇するみたいなときにcat hoge.txt | fzf --preview...など、 大体打つコマンドって決まってくると思う。 .zshrcや.shファイルなどに直接Shellを書いていくときは、エディタのコード補完が効くので特に面倒ではないが、 Terminal上でサクッとワンライナーで実行したいときに、いちいち定型文を書いていくのがとても面倒である。 「Terminalに打っている段階でもSnippetみたいな補完ができたらいいな...」と思って…
Terminal上でSnippetを実現する ~ zle(Zsh Line Editor) × fzf ~ - ハイパーマッスルエンジニア favicon www.rasukarusan.com
Terminal上でSnippetを実現する ~ zle(Zsh Line Editor) × fzf ~ - ハイパーマッスルエンジニア