Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Visual Block 挿入でマルチバイト文字が壊れる #600

Closed
ynkdir opened this issue Jul 27, 2014 · 12 comments
Closed

Visual Block 挿入でマルチバイト文字が壊れる #600

ynkdir opened this issue Jul 27, 2014 · 12 comments

Comments

@ynkdir
Copy link
Member

ynkdir commented Jul 27, 2014

とりあえず登録だけ…

aaa
あああ
bbb

gg0l<C-V>jjIx<Esc>

axaa
 x <81><82>ああ
bxbb
@mattn
Copy link
Member

mattn commented Jul 28, 2014

ここだと思うんですが

https://github.com/vim-jp/vim/blob/master/src/ops.c#L617

どっちにしましょうかね。

axaa
 xあああ
bxaa
axaa
あxああ
bxaa

@mattn
Copy link
Member

mattn commented Jul 28, 2014

とりあえず

axaa
xあああ
bxaa

で修正してみました。
※ビジュアルがそう見えたので

diff -r 7b2d05a51e76 src/ops.c
--- a/src/ops.c Wed Jul 23 21:10:44 2014 +0200
+++ b/src/ops.c Mon Jul 28 11:41:18 2014 +0900
@@ -609,6 +609,14 @@
        }
    }

+#ifdef FEAT_MBYTE
+   if (has_mbyte && spaces > 0 && (*mb_ptr2cells)(oldp) > 1)
+   {
+       spaces--;
+       count--;
+   }
+#endif
+
    newp = alloc_check((unsigned)(STRLEN(oldp)) + s_len + count + 1);
    if (newp == NULL)
        continue;

@ichizok
Copy link
Member

ichizok commented Jul 28, 2014

A だと壊れます

aaa
あああ
bbb

gg0<C-V>jjAx<Esc>

axaa
<e3><81>x<82>ああ
bxbb

@mattn
Copy link
Member

mattn commented Jul 28, 2014

@ichizok パッチ済みででしょうか?

@ichizok
Copy link
Member

ichizok commented Jul 28, 2014

パッチ済みででしょうか?

そうです。I だとOKでした。
7.4.383 / CentOS 6.5

@mattn
Copy link
Member

mattn commented Jul 28, 2014

あーなるほど。了解です。

@mattn
Copy link
Member

mattn commented Jul 28, 2014

diff -r 7b2d05a51e76 src/ops.c
--- a/src/ops.c Wed Jul 23 21:10:44 2014 +0200
+++ b/src/ops.c Mon Jul 28 16:20:20 2014 +0900
@@ -609,6 +609,25 @@
        }
    }

+#ifdef FEAT_MBYTE
+   if (has_mbyte && spaces > 0)
+   {
+       if (b_insert)
+       {
+       int off = (*mb_head_off)(oldp, oldp + offset + spaces);
+       spaces -= off;
+       count -= off;
+       }
+       else
+       {
+       int off = (*mb_off_next)(oldp, oldp + offset);
+       offset += off;
+       spaces = 0;
+       count = 0;
+       }
+   }
+#endif
+
    newp = alloc_check((unsigned)(STRLEN(oldp)) + s_len + count + 1);
    if (newp == NULL)
        continue;

こんなのでどうでしょうか?

@ichizok
Copy link
Member

ichizok commented Jul 28, 2014

よさげです。

@mattn
Copy link
Member

mattn commented Jul 28, 2014

なんかありそうな気もするのでしばらくランニングします。

@ynkdir
Copy link
Member Author

ynkdir commented Jul 28, 2014

ありがとうございます。

axaa
xあああ
bxaa

私もこれがいいと思います。

もしかしたら #590 と同じ問題だったかもしれず
そのばあいあとで #590 が直ると二重な感じになるのであれかなと思いました。

@mattn mattn self-assigned this Jul 29, 2014
@mattn
Copy link
Member

mattn commented Aug 7, 2014

@k-takata
Copy link
Member

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

No branches or pull requests

5 participants