LoginSignup
10
8

More than 5 years have passed since last update.

zsh で特定の文字列を入力すると自動で return を押したことにさせる

Posted at

概要

例えば ll と入力すると、勝手に ls<Return> してくれるような代物です。

bindkey -s "ll" "ls\n" だと行頭以外でも発動してしまいますが、下記ソースだと行頭で ll と入力した場合のみ発動します。

ソース

.zshrc にコピペしてご利用下さい。

typeset -A aaaliases
aaaliases=(
  "ll"    "ls"
  "gh"    "gh"
)

self-insert-aa() {
  local self_insert_next
  zstyle -s ":self-insert-aa" self-insert-next self_insert_next

  local aamatch
  local aastroke
  local aacommand
  local aacontext
  local aakey

  aamatch=0
  for aastroke in "${(@k)aaaliases}"; do
    aacommand=$aaaliases[$aastroke]
    aacontext=$aastroke[0,-2]
    aakey=$aastroke[-1]

    if [[ $LBUFFER == $aacontext && $KEYS == $aakey ]]; then
      LBUFFER=$aacommand
      zle .accept-line

      aamatch=1
      break
    fi
  done

  if [[ $aamatch == 0 ]]; then
    zle "$self_insert_next"
  fi
}

self-insert-aa.on() {
  # Find self-insert wrapper
  # reference: knu/zsh-git-escape-magic (https://github.com/knu/zsh-git-escape-magic)
  emulate -L zsh
  local self_insert_next="${$(zle -lL | awk '$1=="zle"&&$2=="-N"&&$3=="self-insert"{print $4;exit}'):-.self-insert}"

  zle -la "$self_insert_next" || zle -N "$self_insert_next"
  zstyle ":self-insert-aa" self-insert-next "$self_insert_next"
  zle -A self-insert-aa self-insert
}
zle -N self-insert-aa
self-insert-aa.on

カスタマイズ

aaaliases に「発動のためのキーストローク」「コマンド」の順で入れます。キーストロークとコマンドは必ずしも一致している必要はありませんが、一致している場合でも明示的に並べて書いて下さい。

例えば、上記ソースの aaaliases では以下のように置換されます。

  • ll と入力 → ls コマンドを自動確定
  • gh と入力 → gh コマンドを自動確定 (自分は git history ... のエイリアスにしています)

その他

ll とそのまま打ちたくなった場合

  • 最初にスペースを入れてごまかせば発動を回避できます
  • quoted-insert を呼び出します。多分こっちの方が正しい方法
    • vi mode の場合: l<C-v>l と打つ

url-quote-magic (prezto) と併用する場合

url-quote-magic を先にロードさせて下さい。こちらが後だと url-quote-magic に上書きされてしまいます。

ちなみに、prezto を利用していると自動で url-quote-magic がロードされるようです。こちらも prezto を先にロードさせる必要があるかも知れません。

参考

  • knu/zsh-git-escape-magic
    • self-insert が既に置き換えられていた場合の挙動が大変参考になりました
10
8
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
10
8