複数行の 'statusline' を扱いたい #225

Closed
thinca opened this Issue Jul 20, 2012 · 52 comments

Comments

Projects
None yet
5 participants
Owner

thinca commented Jul 20, 2012

※画像はイメージです。

Owner

mattn commented Jul 20, 2012

速いw

Owner

thinca commented Jul 20, 2012

難しいのはわかってますが欲しいものは欲しいのでとりあえず要望だけだしておく作戦。

合わせて読みたい: #76

Owner

koron commented Jul 20, 2012

便利なのかねぇ?w

Owner

thinca commented Jul 20, 2012

ファイル名長い時とか分割しすぎた時とか横幅省略されることがあるので可能ならできると嬉しいですね。
あ、'tabline' も複数行したいです!複数行タブ。

Owner

h-east commented Jul 20, 2012

人は制限があった方が工夫してエクスタシー。

複数行==2行ですか?それとも指定データが全て収まるまでビローンですか?

Owner

thinca commented Jul 20, 2012

任意行の方が自由度高くて嬉しいですね。

Owner

h-east commented Jul 22, 2012

ネタとしてやってみました。
https://gist.github.com/3158492

  • 3行固定です。(vim.hのSTATUS_HEIGHTの値を変更して再コンパイルすれば変更可能。。)
  • オプション 'statusline' に @ アイテムを追加しました。(%@ を指定すると表示対象が次行になります)
  • オプション 'statuslineheight' を追加していますが使っていません。

サンプル

.vimrc に以下のように書いて

set statusline=%<%f\ %m%r%h%w[%{&ff}][%{(&fenc!=''?&fenc:&enc).(&bomb?':bom'
:'')}]%@\ 0x%B%@%=%l,%c\ %P

このpatchの当たったVimを起動するとステータスラインが以下のようになります。

PS
ネタとしてやっただけなので改良予定はありません(`ェ´)ピャー

Owner

thinca commented Jul 22, 2012

カッコイイ!

Owner

koron commented Jul 22, 2012

Owner

h-east commented Jul 23, 2012

リアクションいただいた皆さんありがとうございます。
ちゃんと仕上げてみマッスル!
当面は週末しか時間割けないのでまったりになりますけどやりマッスル。

仕様的に要望、提案あったらここにコメント下さい。

Owner

thinca commented Jul 23, 2012

個人的な理想としては、

  • 高さはウィンドウ毎に動的に変更可能
  • 単純に \n が入っていたらそこで改行される
  • %= は行毎に使えると嬉しい

とかでしょうか。2番目は難しければ %@ とかでも良いかとは思います。

Owner

h-east commented Jul 23, 2012

高さはウィンドウ毎に動的に変更可能

オプション 'statuslineheight' でウィンドウ毎に設定可能にする予定です。
'statusline’ の中身で行数を決定しない理由は↓。
https://gist.github.com/3158492#gistcomment-378007

単純に \n が入っていたらそこで改行される

現patchは既存の形式に沿って %ほにゃ のitem形式で改行を表そうとしています。今は%@です。
itemとして登録すべきと思います。

%= は行毎に使えると嬉しい

現patchでも可能ですよ。


そういえば 'tabline' も 'statusline' と同じ関数で内容表示処理してますから画面描画のtablineの高さ情報を上手く変更してあげれば、比較的簡単にtabline複数行対応出来そうですよ。
Owner

thinca commented Jul 23, 2012

'tabline' も欲しいですね!
無理に一度に出す必要はないかと思いますが。
タブの複数行は他のタブUIを採用しているアプリ(ブラウザとか)でも普通に見られるので、需要は結構ありそうです。

h-east was assigned Jul 25, 2012

Owner

h-east commented Jul 29, 2012

進行状況報告(7/30)。
基本機能はこの前のpatchで対応できているので、残りの2つの対応中。

  1. 'statuslineheight'オプション(省略形 stlh)のglobal/window-local化対応と各処理でこの値を参照するようにする。
    → ほぼ完了。
  2. 'statuslineheight'オプションによるwindowの高さ制御処理。
    → いろんなケースを考慮しないといけなくて結構たいへんT_T。
    'laststatusオプションやwinminheight'オプションとの関係性とかとか。。少し時間掛かります。

今んとこ起動してset stlh=3とかして<W-S>はOKだけど次に<W-=>すると上のwindowが狭くなるというww

Owner

h-east commented Aug 27, 2012

毎週末ちびちびやってます。完成度は95%くらい(ドキュメントを除く)。
PC爆発したりしないと思うので安心して人柱れます。
https://gist.github.com/3158492

変更内容

  • 'statuslineheight'オプションの追加および 'statusline'オプションに '@'アイテム追加。
'statuslineheight' 'stlh'       数値 (規定値は1)
                    グローバルまたはウィンドウについてローカル |global-local|
                    {Vi にはない}
                    {Vimが |+multi_statusline| 機能付きでコンパイルされたときの
                    み有効}

                    ステータス行の行数を設定する。|status-line| も参照。
                    ウィンドウとステータス行の合計行数は変化させない。
                    つまり、ステータス行の行数が増えるとウィンドウの行数が減る。
                    このオプションに現在のウィンドウとステータス行の合計行数よ
                    りも大きな値を指定した場合は現実的に設定可能なステータス行
                    の行数を設定する。(ベストエフォート方式)
                    他の要因でウィンドウの行数が変化した場合は再試行をおこなう。

                    ステータス行の2行目以降に情報を表示させたい場合はオプション
                    'statusline''%@' を使用する。

'statusline' 'stl'  文字列   (既定では空)
    (省略)
    item  意味
    (省略)
    @ -   表示位置を次の行に設定する。
          {Vimが |+multi_statusline| 機能付きでコンパイルされたときのみ有効}
    (省略)
  • has('multi_statusline') 追加。+multi_statusline でビルドした場合に1を返す。
    --with-features=normal 以上でデフォルトでオン
Owner

mattn commented Aug 27, 2012

パッチをあてたらPCが爆発しました。どう責任とってくれますか?

Owner

h-east commented Aug 27, 2012

※本patchをあててビルドしたVimでPCが爆発した場合の責任は負いかねます。自己責任でお願いします。
また、初回起動時は安全確認の為、PuTTY等でリモート接続した状態でお楽しみ下さい。

Owner

h-east commented Oct 7, 2012

大分落ち着いてきたので、誰か試してもらえると助かります。 |д゚)チラッ
仕様や動作に関する質問や不具合報告はこのissueにお願いします。
仕様は3つ上のコメントを参照下さい。
https://gist.github.com/3158492

Owner

ynkdir commented Oct 8, 2012

test37 がコケます。
ubuntu です。

Owner

h-east commented Oct 8, 2012

@ynkdir ありがとうございます。(make test するのをすっかり忘れてた 汗)
こちら(fedora15)でも再現しました。
scrollbind テストでNGとは。。しかもtest37はカオス過ぎて何が悪いのかピンポイントでは分からなさ過ぎるw。

Owner

h-east commented Nov 3, 2012

:set splitbelow 設定での :split の挙動がpatch有無で異なっている。(testdir/test37.in 9~11行目)
PuTTY(80x24)でpatch無しだと上windowの高さが10行、下が11行。patchありでは上11行、下10行。
:set nosplitbelow(デフォ)の場合はどっちも上11行、下10行。

この後にwindow内カーソル相対移動コマンド(H, M, L)を絡めた編集操作がおこなわれているのでtest結果がNGとなってるようだ。

Owner

h-east commented Nov 3, 2012

上の説明、4行目以外間違ってた。
:split:new で奇数行の高さのwindowを分割する場合、patch無しだと新規作成分(デフォルトでは上側)のwindow高さが1つ大きいが、patchありでは下側が大きくなっていた。
(equalalways , splitbelow 関係なかった。)

patch修正済み(for 7.3.712 or later)。make testも ALL DONEになりました。
https://gist.github.com/3158492

Owner

ynkdir commented Nov 4, 2012

ALL DONE!

Owner

mattn commented Nov 4, 2012

!! @h-east ++

Owner

h-east commented Nov 19, 2012

...がっつり人柱してる人いない? ( ;∀;)

上の方のコメントに'statuslineheight'オプションの説明でステータス行の行数はベストエフォート方式だと説明しています。

                    ステータス行の行数を設定する。|status-line| も参照。
                    ウィンドウとステータス行の合計行数は変化させない。
                    つまり、ステータス行の行数が増えるとウィンドウの行数が減る。
                    このオプションに現在のウィンドウとステータス行の合計行数よ
                    りも大きな値を指定した場合は現実的に設定可能なステータス行
                    の行数を設定する。(ベストエフォート方式)
                    他の要因でウィンドウの行数が変化した場合は再試行をおこなう。

今のpatchでは説明通りの動作をするんですが、これをやめようと思います。

理由

  • 現状では実際のステータス行の行数を確認出来ない。
:set statuslineheight=99      " 実際には99よりも小さい値(例えば)21でステータス行の行数が設定される
:set statuslineheight?
  statuslineheight=99         " 指定値99が表示される。実行数を確認する術がない><
  • 指定値でステータス行の行数を設定出来ない場合はエラー(E36: Not enough room)にした方が親切な気がする。

    また、その方が内部実装もシンプルになる。(特にウィンドウの行数が変化した場合の再試行処理)

備忘録 例えばwindow数1の時... `set laststatus=2` のときは`set statuslineheight=99` 時にエラー出す。 `set laststatus=0` のときは`set statuslineheight=99` 時ではノーエラー。その後の`set laststatus=2` でエラー出す??。
Owner

ynkdir commented Nov 20, 2012

私は正直使わないと思うので人柱として役に立つかわかりませんが…

少し試したところ

$ vim -u NONE
:new
:new

でステータスラインが表示されないです。

Owner

ynkdir commented Nov 20, 2012

あと

$ vim -u NONE
:e foo
:e bar
:new
Owner

thinca commented Nov 21, 2012

Vim 更新する度にパッチ当て直すの面倒で最近サボってました…この機能欲しいので今からまた人柱します。
(こういうパッチを手軽に管理するようなの欲しい…)

Owner

koron commented Nov 21, 2012

hg mq便利。超便利

Owner

thinca commented Nov 21, 2012

なるほどこういう時のためのmq...ゆるふわな感じでしか把握してないのでちゃんと調べてみます…。

Owner

thinca commented Nov 21, 2012

とりあえず @ynkdir さんと同じ現象を確認しました。
また、vimrc ありで使ったところ、:new 2回で SEGV しました。原因は未調査です。

Owner

h-east commented Nov 21, 2012

みなさん確認ありがとうございます。
報告の件は 'laststatus=2' 以外だと起きるようです。調査中です。

人柱は「ベストエフォート方式」をやめる修正が入ってから本腰入れた方が良いかもしれません。
('statusline'の制御は現状でfixなので人柱歓迎です)
あとドキュメント(:help)もちゃんと書かないとあかんですね。英語助っ人募集中です。

Owner

h-east commented Nov 21, 2012

patch更新しました。
https://gist.github.com/3158492

ynkdirさん報告の2件はfixしました。
thincaさん報告のSEGVの件も同原因だと思うのでfixされてると思います。こちらでは再現できなかったのでお手数ですがfix確認お願いします。

これ↓、誤情報でした。因果関係無かった。スマソ(`ェ´)

報告の件は 'laststatus=2' 以外だと起きるようです。

Owner

thinca commented Nov 22, 2012

set showtabline=2 tabline=hogehoge%=%#TabLine#hugahuga laststatus=2
vnew
setlocal statuslineheight=2

ここから <C-w>w<C-w>w などして statuslineheight=2 のウィンドウに入ると tabline の右上がおかしい感じになります。

%#TabLine# がないと右端だけでなくて2行目全体がこうなります。
はみ出す行は、 statuslineheight の値によって変わります。3 にしたら、2行はみ出して本来の tabline と合わせて3行になる感じです。

Owner

thinca commented Nov 22, 2012

バグ抜きで使ってみた感想。
とりあえず私は、ファイル名が長い場合にだけ2行にして、1行目はファイル名のみ、2行目にもろもろの情報を表示するようにしてみたんですが、こういうことがやりたい場合はファイル名に応じて 'statuslineheight''statusline'(%@を入れる必要がある) の値を変える必要があるので、autocmd でいちいちチェックしなくてはならず、使えなくはないけど若干面倒かなーと感じました。
動的に変えるのはパフォーマンスとか %= の評価タイミングとの兼ね合いとかがあって難しかったのかと思いますが、なにかいい方法ないでしょうかねぇ。

Owner

h-east commented Nov 30, 2012

@thinca
画面が崩れる件、報告ありがとうございます。調べます。

仕様要望の件、
statusline%@の数で動的にステータス行の高さを変える対応は考えてません。

以下の中から選択して下さい。

  1. 1行で我慢する。
  2. 常に2行とする。(3行でも4行でも)
  3. autocmd でいちいちチェックして変更する。

後はpatch公開しているので自分で対応するか、誰かを説得するかですねー。

@mattn
おぉー!。patch作っといてなんですが、この機能欲しい人ってそんなに居ないと思ってます。(オィ
私は使わないです。(オィ

Owner

mattn commented Nov 30, 2012

「ぼく、これめっちゃ興味ありまんねん。英語はなせる?」

https://gist.github.com/3158492#gistcomment-610265

Owner

h-east commented Dec 8, 2012

set showtabline=2 tabline=hogehoge%=%#TabLine#hugahuga laststatus=2
vnew
setlocal statuslineheight=2
ここから ww などして statuslineheight=2 のウィンドウに入ると tabline の右上がおかしい感じになります。

修正しました。
win_redr_custom()はtabline再描画時および各window再描画時に呼ばれるのですが、常にwindow再描画時と思い込んで処理させいたのでそこを改善しました。
https://gist.github.com/3158492

Owner

h-east commented Dec 16, 2012

'statuslineheight'オプションのステータス行の行数に関して以下のような仕様にすることに決めました。

                    ステータス行の行数を設定する。|status-line| も参照。
                    設定可能な上限を超える値が指定された場合は上限値を設定値とする。
                    ウィンドウとステータス行の合計行数は変化しない。
                    つまり、ステータス行の行数が増えるとウィンドウの行数が減ることになる。

旧仕様と何が違うか纏めるとこんな感じ。

  • 旧仕様はstatuslineheight の指定値をそのまま保持して内部でなんとかしていたけど、現設定値が参照出来なかった。

    新仕様では初回のステータス行の行数更新時に値が変化しえるし変化値を設定値とする。なお、一度設定した値から大きくなることはない。

    (window1個でls=0か1からls=2変更時、またはwindow複数個でls=0からls=1か2に変更時も例外的にステータス行の行数更新処理をおこなう。(現状維持 or 縮小))
  • 旧仕様はlaststatusが0や1の時の最下windowでのset statuslineheight?を考慮してなかった。

    新仕様ではwindow1個でls=0か1の場合にset stlh? されたら 0 を表示するようにする。

    window 1個でカレントが最下windowかつls=0か1に対してsetlocal stlh=5 されてもset stlh? されたら 0 を表示する。

    window n個でカレントが最下windowかつls=0に対してsetlocal stlh=5 されてもset stlh? されたら 0 を表示する。

    上記以外は設定値を表示する。

`laststatus`オプションの存在が事をややこしくしている。ほんとヒョエーです。
Owner

h-east commented Dec 30, 2012

patch updated. (for vim 7.3.762)
とりあえず実装完了!(tablineは保留)
あとは、バグがあったら修正する感じ。
https://gist.github.com/3158492
次はtestコードの作成とhelpドキュメントの作成。

実装上の都合により仕様をさらに変更しました。

  • :set stlh=~ や :setlocal stlh=~ 時に現在の設定可能な値に調整(fitting)する処理を追加。一度設定した値から大きくなることはない。

    タブページを複数使用している場合は全タブページの全windowを走査して設定値のfitting処理をおこなう。

    (laststatusの値に関わらず set タイミングでのみ調整処理をおこなう)
  • :set stlh? や :setlocal stlh? で現在の設定値が表示されるようにした。

    laststatusの値に関わらず常に設定値を表示する。

人柱される方は不具合の報告お願いします。仕様的に微妙な場合もどうぞどうぞ。
また、結構イヤラシイことしても不具合が出なかった場合はそのやった事をOK報告して貰えると助かります。

最初の簡易patch作成から5ヶ月経ってる...

Owner

ynkdir commented Dec 31, 2012

./configure --with-features=tiny && make でコンパイルエラー出ます

Owner

h-east commented Dec 31, 2012

@Vimmer あげましておめでとうございます。今年もよろしくお願い致します。

@ynkdir reportありがとうございます。
patch 更新しました。 https://gist.github.com/3158492

  • ./configure --with-features=tiny && make でコンパイルエラーになる件を修正。
Owner

h-east commented Feb 26, 2013

ちょっと意見を聞かせて下さい。

    ウィンドウとステータス行の合計行数は変化しない。
    つまり、ステータス行の行数が増えるとウィンドウの行数が減ることになる。

↑の仕様は一端忘れて。

80x24の端末で
./vim -N -u NONE -c "set ls=2 ch=2" -c "split" -c "setlocal stlh=7" -c "wincmd w"
の状態で = したらどっちを期待しますか?

(1) (window height + statuslineheight) をセットで equal
24(lines) - 2(cmdheight) = 22 を window height + stlh で平均化する。
upper window height(4) + stlh(7) == lower window height(10) + stlh(1)

(2) window heightのみで equal
24(lines) - 2(cmdheight) - 7(upper stlh) - 1(lower stlh) = 14 を window height で平均化する。
upper window height(7) == lower window height(7)

Owner

koron commented Feb 26, 2013

いやらしいけど後者ですかねぇ。

Owner

thinca commented Feb 26, 2013

前者でもそこまで不自然ではないかなーと思います。どちらの挙動でも納得はできます。

Owner

h-east commented Feb 27, 2013

@koron @thinca ご意見ありがとうございます。
もともと全体としては上記(1)の「各window height とstatuslineheight をセットで処理する」というポリシーで作業を進めていたのですが、
= に関してはソースコード(win_equal_rec())を解析した感じだと (2) の対応の方が簡単そうだし、「(1)の挙動って受け入れられるんやろか?」と思ったので聞いてみました。

いやー、でも = を (2) にしたら他の部分も全部(2)に変更しないといけないし面倒だなぁ。。。
なので、引き続きwin_equal_rec() の(1)対応頑張ってみます。(ぉ
無理だったらまた相談させてもらいます。

Owner

h-east commented May 10, 2013

まだ完成してないけどどんな反応があるか知りたかったので投稿してみた。😄
https://groups.google.com/d/msg/vim_dev/ZWWgK9aXQ2Y/GC82mWbXJdcJ

Owner

mattn commented May 10, 2013

Owner

koron commented May 10, 2013

👍

Owner

thinca commented May 10, 2013

👍

Owner

h-east commented May 23, 2013

以下の理由によりクローズします。

  • 私のこの項目に対するモチベーションが上がらない。
  • = のロジックを書くのがtoo hard
  • vim_devで特に反響がなかった

Gistはそのままにしておきます。
https://gist.github.com/h-east/3158492
引き継いで作業したい方がいたらコメント下さい。

h-east closed this May 23, 2013

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment