質問

まず、これは私がシェルプログラミングを話しているので、の質問(したがって、スーパーユーザのの他属していません。アル。の)プログラミングのであることを私の状態をみましょう。これはほとんどのゴルフの質問かもしれないが、私はそもそも答えを持っていないので、任意の助けをいただければ幸いです: - )

だから、ストーリーがある:それは非常に快適ですので、私はlessオプション付き--quit-if-one-screenにパイプのものに好き:不要な場合lessdoesが私の方法で取得していません。それともそれはありませんか?私のプロンプトが私のターミナルウィンドウの一番下にすでにある場合は、このオプションは(すなわちless振る舞うcatのように)私が欲しいまさにありません。しかし、私の現在のプロンプトがウィンドウの上部にある、lessは、最初のの明確なの画面に空白行をたくさん印刷したときに、それからだけで画面の一番下に私の(短い)ファイルを出力し、それが終了し、私は私のプロンプトを取り戻すように、それは、一つの画面よりも小さいテキストがあることを実現します。

しかし、この現象は、これらすべての無用の空白行の、素晴らしいではありません。私は、さまざまなオプションを試してみました、またはスクリプトやエイリアスを書き、私が思い付くことができる最高のは、この(私はzshのを使用していますので、シェルが既にパイプを複製することが可能であり、その上)になります:

function catless() {
 cat   \
  >>( bucket -$LINES | cat  ) \
  >>( bucket +$LINES | less )
}
bucketはそれが少ない(-N付き)Nラインより以上N以下(+とであれば、私はちょうどそのコピー STDIN から STDOUT の、書いた別のスクリプトです。

N)。 私はそれをここに投稿:ます。http:// snipt .NET / Gyom /コピーSTDINツーSTDOUT-OR-依存しないオン長

そしてls | catlessほとんど-作品。しかし、同期の理由のために、異なるプロセスがここに関与(特に、私はここに正しいlessを取得することはありません、そしてプロンプトがあまりにも早く戻ってくる)、バックグラウンドで正しく端末にアクセスし、すべての実行を得ることはありません。しかし、多分私は間違ったパスを取っています。

だから、私が欲しいもの、要約することは、私はls | catlessを入力することができ、そのような機能/スクリプト/何でもそれで、ls | catの出力が1つの画面よりも短くなっている、などが挙げられるとき、それはの正確lsのように振る舞いますls | lessとき長います。

任意のアイデア?

役に立ちましたか?

解決

以下のバージョン406 ののニュースでは、私は「」ドンを参照してください最初のページの画面の下にT移動。」。あなたはどのバージョンがありますか?私のシステムのバージョン382であり、それは(唯一画面分と-Fが使用されているがある場合、空白行を引き起こす)を印刷する前に、画面の下部に移動します。

私だけのインストールバージョン436は、と-FX(何がちょうどLESSを実行することにより、これらの環境設定を使用できるように、あなたの他のprefsとlessのENV varにそれを置く)。

与えられたとき、あなたがやりたいように見えます 新しいバージョンを取得できない場合は、

、あなたの代わりにこれを試してみてください。

function catless() {
    local line buffer='' num=0 limit=$LINES
    while IFS='' read -r line; do
        buffer="$buffer$line"$'\n'
        line=''
        num=$(( num+1 ))
        [[ $num -ge $limit ]] && break
    done
    if [[ $num -ge $limit ]]; then 
        { printf %s "$buffer$line"; cat } | less
    else
        printf %s "$buffer$line"
    fi
}

キーは、シェルがそれ(潜在的に)起動のless前画面よりもファイル内の多くの行が(あなたが最初に使用マルチIO技術が背景だけで物事を実行することができます)があるかどうかを知る必要があることです。イン・シェルreadがあなたのために堅牢で十分でない場合は、コードを少し再加工することによってそれを置き換えることができます:

function cat_up_to_N_lines_and_exit_success_if_more() {
    # replace this with some other implmentation
    # if read -r is not robust enough
    local line buffer='' num=0 limit="$1"
    while IFS='' read -r line; do
        buffer="$buffer$line"$'\n'
        line=''
        num=$(( num+1 ))
        [[ $num -ge $limit ]] && break
    done
    printf %s "$buffer$line"
    [[ $num -ge $limit ]]
}
function catless() {
    local limit=$LINES buffer=''
    # capture first $limit lines
    # the \0 business is to guard the trailing newline
    buffer=${"$(
    cat_up_to_N_lines_and_exit_success_if_more $limit
    ec=$?
    printf '\0'
    exit $ec)"%$'\0'}
    use_pager=$?
    if [[ $use_pager -eq 0 ]]; then
        { printf '%s' "$buffer"; cat } | less
    else
        printf '%s' "$buffer"
    fi
}

他のヒント

-Xフラグが(以下(1)から)あなたを助けるかもしれません

  -X or --no-init
         Disables sending the termcap initialization and deinitialization
         strings to the terminal.   This  is  sometimes desirable if the
         deinitialization string does something unnecessary, like
         clearing the screen.

だから、以下はあなたが欲しいものを行う必要があります:

export LESS="-E -X"

または、あなた以来--quit-IF-1-画面、あなたが代わりに可能性のような:

export LESS="-F -X"
less--clear-screenとしても利用可能-cオプションを(持っている。あなたが確認するために$ LESS環境変数をチェックしたい場合がありますことないのありませんのそのオプションが含まれています。鉱山にはありません、それはあなたのように正確に動作しますたい(あなたが克服しようとしているではないとして)。

あなたは無効なオプションが+を使用して、のアドホックの基準で$ LESS変数で設定することができます。たとえばます:

less -+c shortfile
また$TERMが正しく設定されていることを確認する必要があります。

他のすべてが失敗した場合は、$LESSOPENプリプロセッサと$LESSCLOSEポストプロセッサを見ては、別のアプローチにそれがリードあなたのかどうかを確認するためにman lessの「INPUTプリプロセッサ」セクションに備えています。

scroll top