vim-jp / issues

有志で既知のバグや要望を検討・管理し、オフィシャルへの還元をしていきます。
https://vim-jp.org/
341 stars 11 forks source link

getcellwidths()がほしい #1405

Closed kat0h closed 1 year ago

kat0h commented 1 year ago

内容

setcellwidths()に対応する関数として、getcellwidths()がほしい 背景: setcellwidths()は項目の追加ができないため、一度に設定を記述する必要がある。 追加するとすると、データ構造的に追加での計算量が多くなってしまう。 ↓実装 https://github.com/vim/vim/blob/0e364c9fca7a666de0775007d2f0687ecdd73c8d/src/mbyte.c#L5611 setcellwidths()で追加したデータを取得する関数を用意すると良いのではないか

Pros 良くなる点

関数の対称性 (擬似的に)追加ができるようになる 曖昧幅の表示がうまく動作しない場合、デバッグしやすくなる

Cons 悪くなる点

(懸念点) setcellwidths()に値を追加できない問題の直接的な対応策ではない テーブルに大量の値が登録されていた場合、大きなデータのコピーが走る

実現方法

内部のデータをVim scriptのオブジェクトに落とし込む

Vimのバージョン

9.0.1046

OSの種類/ディストリ/バージョン

Manjaro Linux (OS関係なし)

その他

自分でパッチを書いてみようかなと考えています(2023-01-10)

kat0h commented 1 year ago

setcellwidths()

setcellwidths({list})

[[low, high, width]] 関数が呼ばれるたびに全ての要素について範囲のチェックが走る

kat0h commented 1 year ago

https://github.com/kat0h/vim/commit/030a5fc5402c730bfb5a67a93bfdb618d8af0bfc パッチを作成しました

kat0h commented 1 year ago

https://github.com/kat0h/vim/commits/getcellwidths

kat0h commented 1 year ago

[提案] getcellwidths()を追加

getcellwidths()を追加します。 これはsetcellwidths()で設定したcell widths of character rangesを取得できるようにするものです。 関数は設定した値をソートして返します。

[理由]

・対称性 これまでは、setcellwidths()で設定した値を取得することができませんでした。他の関数には設定を取得する関数があるため、現在の状況は少々不自然です。

・テーブルに値を追加できるようになる setcellwidths()cw_tableの値を初期化するため、複数の箇所でセル幅を設定することはできません。 getcellwidths()により次のような形でエントリを追加できるようになります。

call setcellwidths([[0x2729, 0x272f, 2], [0x2730, 0x273f, 2], [0x2740, 0x274d, 2]])
echo getcellwidths()
call setcellwidths(getcellwidths() + [[0x274f, 0x274f, 2]])
echo getcellwidths()

・デバッグがしやすくなる setcellwidths()cw_tableの値を初期化するため、誤って複数の箇所で関数を呼び出した場合、最後の設定しか反映されません。現在の設定を把握することはデバッグに役立ちます。

[補足] ・ヘルプファイルは書き換える必要があるかもしれません ・runtime/syntax/vim.vimに関数を追加する必要があります

ありがとうございます

kat0h commented 1 year ago

[Proposal] Add getcellwidths()

Add getcellwidths() function. This allows the user to retrieve the cell widths of character ranges set by setcellwidths(). The function sort and return the values.

Reason

Symmetry of the function

Previously, it was not possible to retrieve the value set by setcellwidths(). The current situation is a bit unnatural since other functions have functions to retrieve settings.

Add values to the table

Since setcellwidths() initializes the value of cw_table, it is not possible to set cell widths in multiple places. getcellwidths() allows you to add entries in the following way...

call setcellwidths([[0x2729, 0x272f, 2], [0x2730, 0x273f, 2], [0x2740, 0x274d, 2]])
echo getcellwidths() " [[10025, 10031, 2], [10032, 10047, 2], [10048, 10061, 2]]

call setcellwidths(getcellwidths() + [[0x274f, 0x274f, 2]])
echo getcellwidths() " [[10025, 10031, 2], [10032, 10047, 2], [10048, 10061, 2], [10063, 10063, 2]]

Easier debugging

Because setcellwidths() initializes the value of cw_table, if the function is called in multiple places by mistake, only the last setting will be reflected. Knowing the current settings is helpful for debugging.

Supplement

Thank you.

kat0h commented 1 year ago

https://github.com/vim/vim/pull/11837

kat0h commented 1 year ago

https://github.com/vim/vim/commit/66bb9ae70f7371456ed76518076d2a344f8ab417 取り込まれました