複数行コマンドを編集するときにエスケープされた改行を使用すると、行を上に移動できません。
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
答え1
Enter(コマンド)を押すと、accept-line
現在の行が解析され実行されるようにスケジュールされます。行の構文が不完全な場合(たとえば、echo \
またはfor x in foo
)、実行されないが既に保存されます。PS2
通常のプロンプトではなくプロンプトが表示されるため、この状態でzshを表示できますPS1
。
私が知る限り、保存された行を編集するための組み込み方法はありません。現在の行を実行せずに保存し、編集のために以前の履歴行を呼び出すことで可能でなければなりません。
前の行をインポートする最も簡単な方法は、現在の行が完了していないことを確認し(例:\
最後に入力)、それを受け入れ(押してEnter)からキャンセル(Ctrl+を押すC)です。次に、を押して、保存されたコマンド全体を単一の履歴ラインとして単一の複数のラインバッファに呼び出すことができますUp。
答え2
デフォルトのemacsキーバインディングがあるとし、通常の代わりにAlt+を使用して行の実行をスケジュールします。私はこのように線を追加するときに簡単に線を上下に移動できます。たとえば、zsh 端末プロンプトが表示された場合は、次のようになります。EnterEnter
% cat << EOF<ALT-ENTER>
first line<ALT-ENTER>
second line<ALT-ENTER>
thi
^
pressing <UP> moves up a line like you would expect
答え3
の一つZshユーザーガイド改行を作成したい場合は、以前のEscape行を編集できなくなったマルチプロンプト(PS2)に入らないように、フォローを押すことができると述べました。Enter
これはデフォルトのemacsキーバインディングでのみ機能します。
しかし、私はthe_velour_fogの答えがよりエレガントなので、許可された答えとしてマークする必要があることに気づきました!
答え4
ZSH:ctrl-gを使用して、カーソルをプロンプトの0行/位置0に移動します(viモード/挿入モードでテスト済み)。
zsh-move-to-first-line() {
local line_count=$(echo "$BUFFER" | wc -l)
local current_line=1
while [ "$current_line" -lt "$line_count" ]; do
zle up-line-or-history
current_line=$((current_line+1))
done
zle beginning-of-line
}
zle -N zsh-move-to-first-line
bindkey '^G' zsh-move-to-first-line
駅:行0の位置0から最後の行の最後の位置までです。 Ctrl-hを使用
zsh-move-to-last-line() {
local line_count=$(echo "$BUFFER" | wc -l)
local current_line=1
while [ "$current_line" -lt "$line_count" ]; do
zle down-line-or-history
current_line=$((current_line+1))
done
zle end-of-line
}
zle -N zsh-move-to-last-line
bindkey '^H' zsh-move-to-last-line
ソース: ChatGpt4