5

コマンドの出力をパイプして、カスタムbashコマンドのターミナルで水平スクロールを許可したい| less -S

ただし、これを行うと、less を終了すると、コマンドの出力がコマンド ライン履歴に残りません。

less を終了するときにコマンドの出力を履歴に保持するように less を構成する方法はありますか?

例えば。を見るとgit diff、水平スクロールを実行して終了できますが、出力は履歴に残り、新しいコマンドを入力できます...基本的に、カスタムbashコマンドでこれをエミュレートしたいと考えています。またgit diff、その場で水平スクロールを実行し(つまり、新しい画面を使用せずに)、コマンドラインの履歴は引き続き表示lessされますが、独自の画面でそれを行うため、コマンドラインの履歴を表示することはできません「レッシング」。この git diff のようなメカニズムを less でエミュレートすることは可能でしょうか?

使用せずに他の解決策がある場合はless、遠慮なく捨ててください

更新された質問

だから私はこれをするとします:

cat loremipsum | less -FRSX

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nullam sed 

次に、右を 2 回押して、右に 2 回スクロールします。次に、q を押して less を終了します。画面に残る出力は次のようになります。

cat loremipsum | less -FRSX
    
 Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nullam sed 

 ESCOC

dictum diam. Nullam quis urna ullamcorper, accumsan quam vitae, aliquet 

 ESCOD

nisl. Maecenas vitae lorem orci. Ut vel est erat. Cras quis sagittis sapien, ac volutpat metus. 

 username@server:~/httpdocs$

ただし、git diff では、同じことを行ってから q を押すと、最後の部分 (つまり、右にスクロールした画面の最後の部分) のみが表示されます。

 git diff

nisl. Maecenas vitae lorem orci. Ut vel est erat. Cras quis sagittis sapien, ac volutpat metus. 

 username@server:~/httpdocs$

画面に残ります

どうすればこれも実現できますか

4

3 に答える 3

11

現在、実行できるものにはアクセスできませんがgit diff、質問とコメントを正しく読めば、less の -X オプションが役立つと思います。例えば

ls -la | less -SX

これにより、less が出力を表示する前に画面を保存してクリアし、終了時に画面をクリアして復元することを防ぎます。

アップデート

私はgitワークスペースを引っ張って、git diff実際に何をしているのかを理解しました:

$ pstree -p | grep git
        |-xterm(6021)---bash(6023)---sh(6104)---git(17708)---less(17709)
$ cat /proc/17709/cmdline | xargs -0 echo
less
$ cat /proc/17709/environ | xargs -0 --replace echo {} | grep LESS
LESSOPEN=|/usr/bin/lesspipe.sh %s
LESS=FRSX
$ 

したがってgit diff、 にはオプションを渡しませんless。代わりに、LESS環境変数を に設定していますFRSX。これは、-FRSX オプションを less に渡すことと同じです。では、-FRSX で必要なものは得られますか?

ls -la | less -FRSX
于 2013-10-10T16:04:55.633 に答える
2

これはコマンド ライン履歴ではなく、端末エミュレータのスクロールバック バッファです。

curses または ncurses を使用するコマンドは通常、終了時に起動時の端末の状態を保存および復元するエスケープ シーケンスを使用します。起動時に、シーケンスは、コマンドがすべての出力を表示するセカンダリ ディスプレイ バッファに切り替わります。終了時に、別のシーケンスがプライマリ バッファに戻り、カーソル位置を復元します。これにより、ファイルを編集または表示し、完了時にシェル コマンドの履歴を引き続き表示できます。

less回避策の 1 つは、別のウィンドウで(または など)を呼び出すvimことです。このウィンドウは、シェルでコマンドを実行しながら実行したままにすることができます。たとえば、を使用する場合はxterm、次のように入力できます。

command > command.log ; xterm -e less -S command.log

関数またはスクリプトに簡単にラップできます。GUI 環境にいない場合は、screen非常によく似たことができます。

lessもう 1 つのオプションは、終了後も の出力を現在のウィンドウに残しておきたい場合(これにより、シェル コマンドの履歴が画面上部からスクロールされます) terminfo、これらの文字シーケンスを定義しない定義を使用することです。terminfo の機能名はtmcuprmcupです。これらの機能を無効にするようにターミナル エミュレータを構成できる場合があります。たとえば、 のtiteInhibitリソースを参照してください。xterm

(これを行う簡単な方法があるはずですが、見つけられませんでした。)

アップデート :

DigitalTraumaの回答が指摘しているように、termcap/terminfo の初期化および初期化解除文字列 ( termcap の/ 、terminfo の/ ) を禁止する-X(または--no-init) オプション。コマンドライン オプションに追加するか、環境変数に追加すると、うまくいくはずです。lesstitesmcuprmcup-XlessX$LESS

これは にのみ適用されることに注意してくださいless。テキスト エディタなどのその他のフルスクリーン コマンドは、既定で画面を保存および復元します。titeInhibitのリソースを使用するか、またはエントリをxtermハッキングしてこれらのエスケープ シーケンスを削除すると、より一般的な解決策が得られます。termcapterminfo

于 2013-10-10T15:54:00.173 に答える