vim-jp / issues

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

vim -g で setcellwidths() を使うと描画おかしくなる #1431

Closed iranoan closed 5 months ago

iranoan commented 5 months ago

不具合の内容

vim -g で setcellwidths() を使うと描画おかしくなる場合が有るようです

再現手順

vim -g -u NONE +'call setcellwidths([[0x2502, 0x2502, 2]])

で起動すると、同一行の罫線 (0x2502) の後で描画がおかしくなります

システムは問題の起きないバージョンに戻したので、次の手順で

~/src/vim/src/vim -g ~/downloads/{c.c,sample.txt} +'tab ba | redraw' &

下記のサンプル/設定ファイルの元、実行した動画を添付します

\~/downloads/sample.txt

abc│def

\~/.vim/vimrc

vim9script set viminfo+=n~/.vim/viminfo filetype plugin on syntax enable set hidden set background=dark setcellwidths([[0x2502, 0x2502, 2]]) colorscheme habamax highlight Comment guifg=#ff0000 gui=bold

\~/.vim/gvimrc

set columns=72 lines=19 set guifont=Noto\ Mono\ 13,Monospace\ 12 set guioptions+=M set guioptions-=T set guioptions-=m augroup GVIMRC autocmd! autocmd GUIEnter * winpos 0 0 augroup END

vim-setcellwidths

動画のとおり

また条件が特定できず、動画に含めていませんが、キャレットが罫線 (0x2502) の有る行に移動しないと、文字が表示されない ケースがありました 私が確認できたのは、罫線の直後ではない空白が消えるケースです

期待動作

罫線 (0x2502) の後ろでも、描画が乱れないでほしい

Vimのバージョン

ピンポイントでどの時点かまでは特定できていませんが

$ vim --version
VIM - Vi IMproved 9.1 (2024 Jan 02, compiled Apr 17 2024 21:29:53)
適用済パッチ: 1-342
Compiled by xxx@xxx
Huge 版 with GTK3 GUI.  機能の一覧 有効(+)/無効(-)
+acl               +comments          +find_in_path      +lispindent        +multi_byte        +rightleft         +terminal          +wildignore
+arabic            +conceal           +float             +listcmds          +multi_lang        +ruby              +terminfo          +wildmenu
+autocmd           +cryptv            +folding           +localmap          -mzscheme          +scrollbind        +termresponse      +windows
+autochdir         +cscope            -footer            +lua               +netbeans_intg     +signs             +textobjects       +writebackup
-autoservername    +cursorbind        +fork()            +menu              +num64             +smartindent       +textprop          +X11
+balloon_eval      +cursorshape       +gettext           +mksession         +packages          -sodium            +timers            +xattr
+balloon_eval_term +dialog_con_gui    -hangul_input      +modify_fname      +path_extra        -sound             +title             -xfontset
+browse            +diff              +iconv             +mouse             +perl              +spell             +toolbar           +xim
++builtin_terms    +digraphs          +insert_expand     +mouseshape        +persistent_undo   +startuptime       +user_commands     +xpm
+byte_offset       +dnd               +ipv6              +mouse_dec         +popupwin          +statusline        +vartabs           +xsmp_interact
+channel           -ebcdic            +job               +mouse_gpm         +postscript        -sun_workshop      +vertsplit         +xterm_clipboard
+cindent           +emacs_tags        +jumplist          -mouse_jsbterm     +printer           +syntax            +vim9script        -xterm_save
+clientserver      +eval              +keymap            +mouse_netterm     +profile           +tag_binary        +viminfo
+clipboard         +ex_extra          +lambda            +mouse_sgr         -python            -tag_old_static    +virtualedit
+cmdline_compl     +extra_search      +langmap           -mouse_sysmouse    +python3           -tag_any_white     +visual
+cmdline_hist      -farsi             +libcall           +mouse_urxvt       +quickfix          -tcl               +visualextra
+cmdline_info      +file_in_path      +linebreak         +mouse_xterm       +reltime           +termguicolors     +vreplace
      システム vimrc: "$VIM/vimrc"
      ユーザー vimrc: "$HOME/.vimrc"
   第2ユーザー vimrc: "~/.vim/vimrc"
   第3ユーザー vimrc: "~/.config/vim/vimrc"
       ユーザー exrc: "$HOME/.exrc"
     システム gvimrc: "$VIM/gvimrc"
     ユーザー gvimrc: "$HOME/.gvimrc"
  第2ユーザー gvimrc: "~/.vim/gvimrc"
  デフォルトファイル: "$VIMRUNTIME/defaults.vim"
    システムメニュー: "$VIMRUNTIME/menu.vim"
       省略時の $VIM: "/usr/local/share/vim"
コンパイル: /usr/bin/clang -c -I. -Iproto -DHAVE_CONFIG_H -DFEAT_GUI_GTK -I/usr/include/gtk-3.0 -I/usr/include/pango-1.0 -I/usr/include/glib-2.0 -I/usr/lib/x86_64-linux-gnu/glib-2.0/include -I/usr/include/harfbuzz -I/usr/include/freetype2 -I/usr/include/libpng16 -I/usr/include/libmount -I/usr/include/blkid -I/usr/include/fribidi -I/usr/include/cairo -I/usr/include/pixman-1 -I/usr/include/gdk-pixbuf-2.0 -I/usr/include/x86_64-linux-gnu -I/usr/include/gio-unix-2.0 -I/usr/include/atk-1.0 -I/usr/include/at-spi2-atk/2.0 -I/usr/include/at-spi-2.0 -I/usr/include/dbus-1.0 -I/usr/lib/x86_64-linux-gnu/dbus-1.0/include -pthread -O2 -D_REENTRANT -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=1
リンク: /usr/bin/clang -Wl,-E -L/usr/local/lib -Wl,--as-needed -o vim -lgtk-3 -lgdk-3 -lz -lpangocairo-1.0 -lpango-1.0 -lharfbuzz -latk-1.0 -lcairo-gobject -lcairo -lgdk_pixbuf-2.0 -lgio-2.0 -lgobject-2.0 -lglib-2.0 -lSM -lICE -lXpm -lXt -lX11 -lXdmcp -lSM -lICE -lm -ltinfo -lselinux -lacl -lattr -lgpm -L/usr/lib -llua5.4 -Wl,-E -fstack-protector-strong -L/usr/local/lib -L/usr/lib/x86_64-linux-gnu/perl/5.36/CORE -lperl -ldl -lm -lpthread -lcrypt -L/usr/lib/python3.11/config-3.11-x86_64-linux-gnu -lpython3.11 -ldl -lm -lruby-3.1 -lm -L/usr/lib

では問題なく、

$ ~/src/vim/src/vim --version | head -2
VIM - Vi IMproved 9.1 (2024 Jan 02, compiled Apr 19 2024 11:18:46)
適用済パッチ: 1-354

で問題が起きます

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

$ cat /etc/os-release
PRETTY_NAME="Ubuntu 23.10"
NAME="Ubuntu"
VERSION_ID="23.10"
VERSION="23.10 (Mantic Minotaur)"
VERSION_CODENAME=mantic
ID=ubuntu
ID_LIKE=debian
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
UBUNTU_CODENAME=mantic
LOGO=ubuntu-logo
$ uname -a
Linux xxx 6.5.0-28-generic #29-Ubuntu SMP PREEMPT_DYNAMIC Thu Mar 28 23:46:48 UTC 2024 x86_64 x86_64 x86_64 GNU/Linux

その他

setcellwidths() を使ったら、どんな文字でも起きるわけで無いことはわかっているのですが、どの文字で起きるのか? も特定できていません

h-east commented 5 months ago

9.1.0344 からおかしくなっているようです。 関連issue #1430

h-east commented 5 months ago

これで直ると思います。

@mikoto2000 GUI時は今まで通り次またはその次の else if のブロック内で処理させてあげないと挙動変わっちゃいますね。

diff --git a/src/screen.c b/src/screen.c
index a8b4559b1..63be2a171 100644
--- a/src/screen.c
+++ b/src/screen.c
@@ -1981,22 +1981,20 @@ screen_char(unsigned off, int row, int col)
     {
    char_u      buf[MB_MAXBYTES + 1];

-   if (get_cellwidth(ScreenLinesUC[off]) > 1)
+   if (1
+#ifdef FEAT_GUI
+       && !gui.in_use
+#endif
+       && get_cellwidth(ScreenLinesUC[off]) > 1
+       )
    {
        // If the width is set to 2 with `setcellwidths`

-#ifdef FEAT_GUI
-       if (!gui.in_use)
-       {
-#endif
-       // Clear the two screen cells. If the character is actually
-       // single width it won't change the second cell.
-       out_str((char_u *)"  ");
-       term_windgoto(row, col);
-       screen_cur_col = 9999;
-#ifdef FEAT_GUI
-       }
-#endif
+       // Clear the two screen cells. If the character is actually
+       // single width it won't change the second cell.
+       out_str((char_u *)"  ");
+       term_windgoto(row, col);
+       screen_cur_col = 9999;
    }
    else if (utf_ambiguous_width(ScreenLinesUC[off]))
    {
mikoto2000 commented 5 months ago

@h-east

@mikoto2000 GUI時は今まで通り次またはその次の else if のブロック内で処理させてあげないと挙動変わっちゃいますね。

あー、パフォーマンスイシューの対応をする際にそのパスを壊してしまっていますね... 指摘ありがとうございます。

今見直すと、 ambiwidth=double かつ setcellwidths=1 とした場合も問題で、幅 2 で描画されてしまいますね...。 以下表のようになるよう条件分岐を見直してみます。

+-----------------+--------------------+
| cellwidth       | ambiwidth          |
| \\              +-----------+--------+
| ambiwidth       | single    | double |
+============+====+===========+========+
| cellwidth  | 1  | 1         | 1      |
+            +----+-----------+--------+
|            | 2  | 2         | 2      |
+            +----+-----------+--------+
|            | 0  | 1         | 2      |
+------------+----+-----------+--------+
※ `0` は未設定
mikoto2000 commented 5 months ago

今見直すと、 ambiwidth=double かつ setcellwidths=1 とした場合も問題で、幅 2 で描画されてしまいますね...。

あれ、そんなことないですね?どうしてだろう...?

h-east commented 5 months ago

PRed. https://github.com/vim/vim/pull/14600

iranoan commented 5 months ago

現象の確認、検証と本家への報告ありがとうございます

h-east commented 5 months ago

9.1.0358 で取り込まれました。

iranoan commented 5 months ago

確認できました ありがとうございます