シェルを水平に分割してls -alとpwdを表示する

シェルを水平に分割してls -alとpwdを表示する

OSXでは、zshをデフォルトのシェルとして使用します。私は私のシェルが常に私がいる現在のディレクトリに対してpwdとlsを表示する水平分割を持つことを望みます。どうすればいいですか?

ベストアンサー1

あなたのユースケースはあまり説得力がありません。ほとんどの人は、プロンプトの一部として現在のディレクトリを使用します。 zshには、さまざまなプロンプト設定可能性(複数行プロンプト、左右プロンプトなどを含む)があります。完了(zshでも非常に構成可能)で、必要なコンテキストにファイルのリストを表示できます。つまり、あなたが説明することを達成する方法はいくつかありますが、それらのどれも簡単で良いことはありません。

ケースのみを含む

シェルは独自の入力と出力のみを制御します。シェルは、コマンドの実行時に何も制御できません。ls出力などのために端末の一部を予約するには、端末の協力が必要です。「ターミナル」、「シェル」、「tty」、「コンソール」の正確な違いは何ですか?便利な背景になることができます。

一部の端末ではスクロール可能領域を定義できます。スクロール可能領域の外側の内容は変更されません。私はxtermがこの機能をサポートしていることを知っていますが、他の人気のある端末エミュレータがサポートしているかどうかはわかりません。これは、端末の下の3分の1に出力dateを表示するためのbashの概念証明です。pwdls

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つは実行コマンド用です。概念証明を実行しても、コードはこの回答に書くことができるよりも多くなります。

おすすめ記事