複数行のコマンドを編集するときに、改行をエスケープすると、行を上に移動できません。
たとえば、echo \
を1行入力するとし、を押します。 Enter、次にコマンドのecho \
部分を編集したいと思います。押す Up 最初のコマンドラインに戻りません。
これは、折り返す長いコマンドでは機能しますが、エスケープされた改行では機能しません。
_physical_up_line() { zle backward-char -n $COLUMNS }
_physical_down_line() { zle forward-char -n $COLUMNS }
zle -N physical-up-line _physical_up_line
zle -N physical-down-line _physical_down_line
bindkey -M vicmd "R" physical-up-line
bindkey -M vicmd "N" physical-down-line
を押すと Enter (accept-line
コマンド)、現在の行が解析され、実行がスケジュールされます。行が構文的に不完全な場合(例:echo \
またはfor x in foo
)、実行されませんが、すでに保存されています。 zshは、通常のPS2
の代わりにPS1
プロンプトを表示するため、この状態にあることがわかります。
私の知る限り、そのような保存された行を編集する組み込みの方法はありません。現在の行を実行せずに保存し、編集のために前の履歴行を呼び出すことで実行できるはずです。
前の行に到達する最も簡単な方法は、現在の行が未完成であることを確認し(たとえば、最後に\
と入力)、それを受け入れることです(を押します)。 Enter)、キャンセルします(を押します Ctrl+C)。次に、を押すと、保存されているコマンド全体を単一の履歴行として単一の複数行バッファとして呼び出すことができます。 Up。
デフォルトのemacsキーバインディングがあると仮定して、使用してみてください Alt+Enter プレーンの代わりに Enter 実行する行をスケジュールします。
このように線を追加すると、それらの線を簡単に上下に移動できます。例えばzshターミナルにいるときプロンプト:
% cat << EOF<ALT-ENTER>
first line<ALT-ENTER>
second line<ALT-ENTER>
thi
^
pressing <UP> moves up a line like you would expect