Posted at

`setopt auto_param_keys` 〜 「カッコの対応などを自動的に補完」の謎

More than 3 years have passed since last update.

こんにちは.現実逃避に他の人の .zshrc を参考にしながら書き足していたら謎な設定項目に出くわしたのでその解説をしようと思います.

その設定とはタイトルにもある AUTO_PARAM_KEYS のことです.setopt auto_param_keys でググると,以下のようなコメントが付記された皆さんの .zshrc がヒットします.揃いも揃って同じ文言です;何せ皆さんコピペしますからね:)


.zshrc

## カッコの対応などを自動的に補完

setopt auto_param_keys

ほうほう?よく分からんけど便利そうだぞ?試してみよう!

$ ls .zsh{_history,env,rc,

ここでタブを連打してみます.

……閉じカッコの補完を有効化するわけではなさそうですね.どのタイミングでも普通の補完候補しか出てきません.困ったときの man zshoptions です.


AUTO_PARAM_KEYS <D>

If a parameter name was completed and a following character (normally a space) automatically inserted, and the next character typed is one of those that have to come directly after the name (like }, :, etc.), the automatically added character is deleted, so that the character typed comes immediately after the parameter name. Completion in a brace expansion is affected similarly: the added character is a ,, which will be removed if } is typed next.


man zshoptions から引用;一部記号などを読みやすいよう整形)

ふむふむ…… つまり,


  1. パラメータ名が補完されたあと,続けて文字(普通,空白などの区切り文字)が自動的に挿入されたとき,

  2. もし次にタイプされた文字が特定の文字(例えば }: など)であれば,

  3. 1で自動挿入された文字は削除されて代わりにタイプされた文字がその場所に置かれる.

  4. 波カッコによる展開における補完の場合も同様に振る舞う:この場合の区切り文字であるカンマ , は閉じカッコ } がタイプされると自動的に削除される.

なーるほどー カッコの補完じゃなくて,カッコとかを補完したあとの特定の記号の自動削除とタイプされた文字への置き換えですね.

明るく表示されているカンマは未確定状態で,閉じカッコ } を入力すると消えてしまいます.タブやカンマそのものをタイプすることでカンマを確定させることができます.(設定によって表示は異なると思います.)

今回は brace expansion のカンマの例で説明しましたが,他にも parameter expansion でもこの動作をします(引用した man でもこちらを念頭に説明しているようですね).例えば下記のような補完後の編集子を使った記法への移行がスムーズに行えます.

こっちだと未確定の } は明るくなってないですが,: 入力でスムーズに置き換えられていることが分かります(これどこの設定変えれば明るくなるの〜).というか,今回調べて初めてこの手の編集子の記法をいくつか知りました.詳しくは man zshexpn を見てください.

また,他にも似たような挙動を制御するオプション AUTO_PARAM_SLASHAUTO_REMOVE_SLASH があるようですので,気になる方は確認してください.とはいえ,AUTO_PARAM_KEYS も含め,いずれもデフォルトで有効な設定ですので,.zshrc に書かずとも普段から意識せずに活用していると思います.


最後に,せっかくですので,.zshrc にこの設定を書くときはちゃんとこんな感じのコメントを書きましょう!


.zshrc

## 自動補完される余分なカンマなどを適宜削除してスムーズに入力できるようにする

setopt auto_param_keys
## 自動補完したカンマなどが勝手に削除されないようにする(未確定状態にしない)
unsetopt auto_param_keys

ちなみに参考までに,こちらは海外の方が書いていた英語のコメントになります:


.zshrc

setopt auto_param_keys # remove trailing spaces after completion if needed


ではではっ!Have a nice day!