別名への他の入力なしでマッピングが返されます。

別名への他の入力なしでマッピングが返されます。

Return他の入力なしでシェルでエイリアスコマンドを実行したいと思います。 BashやZshでこれは可能ですか?

つまり、空のコマンドラインを入力すると、特定のコマンドを実行したいと思います。他のコマンドラインは影響を受けてはいけません。

$ ls <Return>
→ run ls
$ <Return>
→ run my aliased command

答え1

どういう意味なのかわかりませんが、次のようになりますzsh

accept-line() {: "${BUFFER:="my-aliased-command"}"; zle ".$WIDGET"}
zle -N accept-line

Enter空のバッファを押すと実行されますmy-aliased-command

これはaccept-lineウィジェットを関数としてオーバーライドすることです。zle(zsh Line Editor)ウィジェットには、$BUFFERこれまでのコマンドラインの内容が含まれています。そのため、ここではmy-aliased-command組み込みウィジェットaccept-line()を実行する前にそれを空白にするように設定しました.accept-line

my-aliased-commandこれはコマンド履歴に追加されることを意味します。

これを望まない場合、他のアプローチは次のとおりです。

accept-line() {
  if [[ -z $BUFFER ]]; then
    zle -I
    my-aliased-command
  else
    zle ".$WIDGET"
  fi
}
zle -N accept-line

空の場合は$BUFFERプロンプトを無効にし(コマンドに出力がない場合はこれを行う必要はありません)、そうでない場合は組み込み関数を実行しますmy-aliased-commandaccept-line

答え2

これはbash 4で可能ですが、以下より効率的ではありません。zshから。コマンドラインが空であることをテストするには、関数を定義する必要がありますREADLINE_LINE。この機能を使用すると、コマンドが自動的に実行されるようにスケジュールするよりも、空行に必要なコマンドを挿入する方が簡単です。この関数を実行すると、デフォルトのReturnマッピングにバインドされたキーシーケンスが挿入されます。Ctrl+ はJ一般に同義語です。テストされていないコード。

insert_default_command_if_empty () {
  if [[ -z $READLINE_LINE ]]; then READLINE_LINE='ls -l'; fi
}
bind '"\e[z1~": insert_default_command_if_empty'
bind '"\C-m": "\e[z1~\C-j"'

関連情報