OSXでは、zshをデフォルトのシェルとして使用します。私は私のシェルが常に私がいる現在のディレクトリに対してpwdとlsを表示する水平分割を持つことを望みます。どうすればいいですか?
答え1
あなたのユースケースはあまり説得力がありません。ほとんどの人は、プロンプトの一部として現在のディレクトリを使用します。 zshには、さまざまなプロンプト設定可能性(複数行プロンプト、左右プロンプトなどを含む)があります。完了(zshでも非常に構成可能)で、必要なコンテキストにファイルのリストを表示できます。つまり、あなたが説明することを達成する方法はいくつかありますが、それらのどれも簡単で良いことはありません。
ケースのみを含む
シェルは独自の入力と出力のみを制御します。シェルは、コマンドの実行時に何も制御できません。ls
出力などのために端末の一部を予約するには、端末の協力が必要です。「ターミナル」、「シェル」、「tty」、「コンソール」の正確な違いは何ですか?便利な背景になることができます。
一部の端末ではスクロール可能領域を定義できます。スクロール可能領域の外側の内容は変更されません。私はxtermがこの機能をサポートしていることを知っていますが、他の人気のある端末エミュレータがサポートしているかどうかはわかりません。これは、端末の下の3分の1に出力date
を表示するためのbashの概念証明です。pwd
ls
reset () {
tput reset
scrollable_lines=$((LINES*2/3))
tput csr 0 $((scrollable_lines-1))
}
update_status () {
tput sc
tput cup $((scrollable_lines+2)) 0
tput ed
date
pwd
ls -x --color=always | head -n $((LINES-scrollable_lines-3))
tput rc
}
PROMPT_COMMAND='update_status'
reset
いくつかの言葉で説明してください:
- これ
tput
コマンドが送信されました制御シーケンスによって得られる用語情報ターミナルに行きます。 - 呼び出しは
tput csr
スクロール領域を上位2/3行として定義します。 reset
ターミナルリセットを実行するとスクロールエリアがターミナル全体にリセットされるため、ターミナルリセット時にこの機能を実行する必要があります。tput sc
カーソル位置を保存して後で復元しますtput rc
。tput cup
スクロールしない領域の一番上にカーソルを移動します。tput ed
既存のコンテンツを削除します。update_status
この関数は、bashが新しいプロンプトを表示しようとするたびに実行されます。
zshでこれを試しましたが、bashよりも多くのターミナルインタラクションが必要なので、概念の証明にはさらに調整が必要です。
端末付きマルチプレクサ
両方画面そしてマルチプレクサ端末を複数のサブウィンドウに分割できます(Screenはこれをゾーンと呼び、tmuxはそれをウィンドウと呼びます)。上部ペインでシェルである muxer を実行し、下部ペインで他のものを実行させることができます。
コンテンツが下部ウィンドウに表示されるように、シェルで何かをトリガーするのは簡単です。出力を正しい端末デバイスにリダイレクトするだけです。ここで迷惑な部分は、デバイス名を取得し、必要に応じて下部ウィンドウを開いたままにすることです。しかしそれ以上ではありません。
これはzshとscreenを使った概念証明です。含まれているscreen -c ~/etc/split.screenrc
場所で実行~/etc/split.screenrc
escape ^\\\
hardstatus off
split
focus
resize 10
screen ~/bin/bottom_tty
focus
screen zsh
これにより、プログラムを実行する10行の下部領域~/bin/bottom_tty
とzshを実行する上部領域が作成されます。では、~/bin/bottom_tty
いくつかのパラメータを取得し、永久にスリープ状態にします。
#!/bin/sh
cat <<EOF >~/.split-screen.$PPID.tmp
bottom_tty=$(tty)
bottom_lines=$(tput lines)
bottom_pid=$$
EOF
mv ~/.split-screen.$PPID.tmp ~/.split-screen.$PPID
while true; do sleep 999999999; done
から.zshrc
情報を読み、いくつかの点を設定します。
- Runは、プロンプトが表示されるたびに下部領域の内容を更新します
refresh_bottom_tty
。 - zshが終了したら、下部領域のプログラムを終了してスクリプトを終了させます。
refresh_bottom_tty () {
printf %s $terminfo[clear]
date
pwd
ls -x --color | head -n $((bottom_lines-2))
}
precmd () {
refresh_bottom_tty <>$bottom_tty 1>&0 2>&0
}
zshexit () {
kill -HUP -$bottom_pid
}
while [[ ! -e ~/.split-screen.$PPID ]]; do
sleep 1
done
. ~/.split-screen.$PPID
rm ~/.split-screen.$PPID
特殊端子包装
やりたいことを理解する専用ラッパーを使用する方がはるかに優れており、強力です。ラッパーは、シェルが実行される仮想端末を定義し、シェルが仮想端末の外側に表示されるコンテンツを更新できるようにするインターフェースを備えています。
Screenとtmuxは、実際にステータスバーを介して必要な機能を提供するのに非常に近いです。ただし、どちらも単一のステータス行に制限されます。複数行のステータス行をサポートするように拡張されている場合は、必要なものをそこに表示できます。
または、次のものを使用できます。ジェプティモジュール作成特殊ラッパー。今、2つのzshインスタンスがあります。 1つはラッパー用、もう1つは実行コマンド用です。概念証明を実行しても、コードはこの回答に書くことができるよりも多くなります。
答え2
showins出力についてはわかりませんが、ls
zshには素晴らしい機能がありますRPROMPT
。これを投げて、.zshrc
あなたの要件を満たしていることを確認してください。
PROMPT=$'%n@%m\n%! %% '
RPROMPT='# %d'
これにより、現在の作業ディレクトリがプロンプトの右側に配置されます。必要に応じて機能しないPROMPT
場合は、値に「%d」と入力して行に表示する方法を表示できるように、改行を含む例を含めました。RPROMPT
PROMPT