Zsh

zshで何も打ってない状態でのEnterを無効にする

More than 1 year has passed since last update.

なぜ?

fish使ってみたものの、慣れなかった。
やはりzshに比較的慣れてしまったので、もうzshを使う。
しかし、fishを使って「面白い、便利かも」と思った機能はいくつかあった。
その一つが「何も入力してない状態でEnterを無視」だった。

だから、ちょうどzleに興味もあったし、初めて扱うのでちょうどいいので作った。

作った

超短い、ほんとにzle扱うの初めてなのでよくわかってないかもだけど、許してほしい。
とにかく$BUFFERに現在のコマンドラインの内容が入ってることぐらいはわかったけども。

# ignore empty command
function accept-or-ignore-line() {
  if [[ ! $#BUFFER == 0 ]]; then
    zle accept-line
  fi
}
zle -N accept-or-ignore-line
bindkey '^M' accept-or-ignore-line

単純にバッファに何もなかったらaccept-lineをやらないってだけですね、
空白だけの場合とか全く考えてないです。

# ignore empty command
function accept-or-ignore-line() {
buf=${BUFFER// /}
  if [[ ! $#buf == 0 ]]; then
    zle accept-line
  fi
}
zle -N accept-or-ignore-line
bindkey '^M' accept-or-ignore-line

こうすれば、空白が入ってもちゃんと無視してくれます。

追記!!

(2017/07/09) バグの訂正

# fish like return
function accept-line() {
  buf=${BUFFER// /}
  if [[ $#buf == 0 ]]; then
    BUFFER=''
    zle reset-prompt
  else
    zle .accept-line
  fi
}
zle -N accept-line
bindkey -M crazy '^M' accept-line

正しくはこうですね!
zsh-syntax-hilightingなどを使ってる場合は互換性の問題が起こるので
accept-lineを上書きしないといけません。

なるほど〜.accept-lineのようにドットをつければ本来の挙動を呼び出せるんですね。
shell自体で言うcommand grepみたいな感じでしょうか。
本当に初心者なので、このあたりの詳細は自分で身につけないとね…(サバイバル脳)