vim-jp / issues

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

矩形選択モードでWindowsのクリップボードにyank すると、必ず改行コードが含まれる #199

Closed comuttun closed 12 years ago

comuttun commented 12 years ago

Windows 7 64bit にて、 Ctrl-V で矩形選択し、改行コードが含まれない部分を "*y で yank すると、 必ずクリップボードに改行コードが含まれます。

なお、Windows のクリップボードを経由した yank にだけ問題があり、 vim 内部のレジスタを使う分には問題が発生していません。

追記: (権限がなくてコメントが追記できなかったので、こちらに追記します。)

大変申し訳ありません。 懺悔させてください。

ところでちょっと気になったんですが、なんでそのあたりOSの違いが原因で発生したりしなかったりするんでしょうか。もしかして @comutt さんが矩形選択って言っているものが、実はVimのものではなく OSのコンソール のものになっちゃってるんじゃないですかね?

変ですよね、コード上そうなってないのなら、なんでそうなるのかしら? と思っていました。

改めて、Windows XP でやってみたら、改行が含まれました。 あろうことか、私の中の仮想Vimの挙動だったみたいです。

ご迷惑をおかけしました。 チケットに記載した内容の半分ぐらいが嘘です。

comuttun commented 12 years ago

いくつか試してみてわかったことがありますので、追記いたします。

mattn commented 12 years ago
vim -u NONE -N

でテストして貰えますか。もしくは

gvim -u NONE -N
comuttun commented 12 years ago

vim -u NONE -N

でテストして貰えますか。もしくは

gvim -u NONE -N

ためしてみました。

gvim.exe/vim.exe ともに、結果変わらず、でした。 下記 vim 両方で確認しました。

mattn commented 12 years ago

プログラムの作りから見ると仕様ぽいです。(仕様っぽい感じがするというだけですが) まずチャラクタワイズ選択の場合は、意図的に最後の改行を強制で取り除いています。これはコピーする行が複数行の場合、計算を楽にする為に

行数 x (各行の文字列長さ) - 2

としている為です。ブロックワイズ選択の場合、複数行選択した場合には最後の改行が欲しいので

行数 x (各行の文字列長さ)

この計算になります。1行の場合だけ特例...という事はしていないので、現状は「ブロックワイズ選択は最後の改行を含む」という動きになります。 もし気になる様でしたら(他の方と議論した上で)、vim_devに提出しようと思います。

diff -r 3482d151136b src/ops.c
--- a/src/ops.c Wed Apr 25 19:07:41 2012 +0200
+++ b/src/ops.c Fri May 11 16:23:35 2012 +0900
@@ -5833,6 +5833,9 @@
      */
     if (y_ptr->y_type == MCHAR && *len >= eolsize)
    *len -= eolsize;
+    else
+    if (y_ptr->y_type == MBLOCK && y_ptr->y_size == 1 && *len >= eolsize)
+   *len -= eolsize;    /* Treat as MCHAR */

     p = *str = lalloc(*len + 1, TRUE); /* add one to avoid zero */
     if (p == NULL)
comuttun commented 12 years ago

ご丁寧な回答ありがとうございます。

プログラムの作りから見ると仕様ぽいです。(仕様っぽい感じがするというだけですが)

なるほど、Windows XP 上では1行選択時には改行が含まれていないので、 その点だけちょっと謎いのですが、よくわかりました。

もし気になる様でしたら(他の方と議論した上で)、vim_devに提出しようと覆います。

気になるかというと、ちょっと気になります。

といいますのは、自分の場合、 Windows 上でvim でコマンドなどのテキストを記述して、 Terminal に貼り付ける、というようなことをよくやるんです。 (運用環境のサーバに対して作業する場合など)

その場合、改行が入ってると「おっと」となってしまいます。

XP 上では問題なくできてたので、ちょっと戸惑っております。。

mattn commented 12 years ago

ご存知だと思いますが、ビジュアル選択には3つの 袋があり、コブクロ、胃袋、Yahoo知恵袋 選択モードがあります。

矩形選択(ブロックワイズ選択)をする場合というのは、だいたい図形とか、右側、左側に余計な物がある場合で複数行を選択します。選択したい物が1行と分かっている場合、vimを使う人は v (キャラクタワイズ選択)を使うと思っています。(私は) また行としてコピーしたいという人は V (ラインワイズ選択)を使います。

僕は使い分けている派ですが、もしかしたら comutt さんの様に選択時に分けておられる方もいるのかもしれないですね。

ただ既存の動きを変えるとなると

のどちらかになるので取り込まれる可能性は少し低くなります。

comuttun commented 12 years ago

恥ずかしながら、

  • キャラクタワイズ選択

を知りませんでした!

Ctrl-V/Shift-V の使い分けをしていたんです。

勉強になりました。 ひとまず、 v を使うようにいたします。

mattn commented 12 years ago

あ、なるほど。 また新たな問題があれば提案下さい。

koron commented 12 years ago

矩形選択で1行しかない場合に改行が含まれることは自然に見えますねぇ。1行とはいえ矩形です。仮にこの改行を削除するとなると、矩形選択領域の最終行に改行は含まない、という仕様になるんですかね…Vimとしてはちょっと変かな。

ところでちょっと気になったんですが、なんでそのあたりOSの違いが原因で発生したりしなかったりするんでしょうか。もしかして @comutt さんが矩形選択って言っているものが、実はVimのものではなく OSのコンソール のものになっちゃってるんじゃないですかね?

h-east commented 12 years ago

0vg_