vim-jp / issues

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

text-objectの ci) がシングルクォート内で動作しない(text-objectsのi)の挙動が理解できない) #619

Open deris opened 10 years ago

deris commented 10 years ago

こんにちは

text-objectsのi)の挙動がよくわからなかったので質問させてください。

text-objectsのi)の挙動が、cpoptionsMの指定有無で変わり、 この挙動が仕様なのかどうかがhelpを見た限りではわかりませんでした。

試したサンプルを以下に記載します。

" いずれもhogeのhの位置でvi)した。^^^は選択された部分。

" cpo-Mによらず同じケース
" ケース1
((hoge))
  ^^^^
" ケース2
(\(hoge\))
 ^^^^^^^^

" cpo-Mによって異なるケース
" ケース3
" Mなしの場合
(hoge\))
 ^^^^^^
" Mありの場合
(hoge\))
 ^^^^^

" ケース4
" Mなしの場合
(\(hoge))
 ^^^^^^
" Mありの場合
(\(hoge))
 ^^^^^^^

ケース1と3の動きはまぁ納得できるものなのですが、 ケース2とケース4の動きがよくわかりませんでした。 cpo-Mありでバックスラッシュが無視されるのであれば、 ケース2、ケース4はhogeの部分が選択されるのが正しいように思えました。

質問を整理すると、以下3点を確認したいです。

  1. text-objectsのi)の挙動がcpo-Mに依存するのは仕様か?
  2. 1.が仕様なのであれば、現状の動作は意図したものなのか?
  3. 1.が仕様でないのであれば、どのような動作になるべきなのか?

よろしくお願いします。

P.S. 補足ですが、上記疑問は以下のようなコードでci)したときに 意図しない挙動だったため、調査したものです。

" Mなし
" hogeのhでci)
call hoge_func('\%(hoge\)')
                   ^^^^^^^

関数の引数部分を選択したかったのですが、エスケープが考慮されて 上記のような挙動になっていました。 現状動作を考えると、仕様のような気がしますがちょっと不便です。。。

h-east commented 10 years ago

vi(でも試すとちょっとはすっきりするかもです。

h-east commented 10 years ago

vi(でも試すとちょっとはすっきりするかもです。

ごめんウソでした:cat2::dash:

mattn commented 10 years ago

OT) オナラっぽい

deris commented 10 years ago

オナラ3連発! :dog2::dash::poop::dash:

mattn commented 10 years ago

ウンコ出てるで

rhysd commented 10 years ago

ワンコからウンコが…

deris commented 10 years ago

ハッ!なんかすっきりしたと思ったら…(すっきり違い)

0xBADDCAFE commented 10 years ago

今日のクソスレと聞いて飛んで来ました。

bgnori commented 10 years ago

なにがしたい...

h-east commented 10 years ago

んもー!カレー食べてるのにー!!

mattn commented 10 years ago

使われているクォートがシングルクォートなのが原因です。

call hoge_func("\%(hoge\)")

これで hoge の部分で v2i) すれば () 内が選択出来るはずです。 で、じゃぁシングルクォート未対応かという話なんですが、ちょっと弄ってみたら動いたっぽいので一先ず出しておきますが、ちゃんと動くか未確認な部分が多いです。

diff -r dde8ff798ed9 src/search.c
--- a/src/search.c  Sat Aug 30 18:10:19 2014 +0200
+++ b/src/search.c  Tue Sep 02 21:20:57 2014 +0900
@@ -2153,6 +2153,7 @@
        do_quotes = 0;
    else if (do_quotes == -1)
    {
+       int do_squotes = -1;
        /*
         * Count the number of quotes in the line, skipping \" and '"'.
         * Watch out for "\\".
@@ -2161,10 +2162,12 @@
        for (ptr = linep; *ptr; ++ptr)
        {
        if (ptr == linep + pos.col + backwards)
-           at_start = (do_quotes & 1);
+           at_start = (do_quotes & 1) || (do_squotes & 1);
        if (*ptr == '"'
            && (ptr == linep || ptr[-1] != '\'' || ptr[1] != '\''))
            ++do_quotes;
+       else if (*ptr == '\'' && (do_quotes & 1))
+           ++do_squotes;
        if (*ptr == '\\' && ptr[1] != NUL)
            ++ptr;
        }
@@ -2294,6 +2297,11 @@
            pos.col += 2;
            break;
            }
+           else
+           {
+           inquote = !inquote;
+           start_in_quotes = FALSE;
+           }
        }
        }
        /* FALLTHROUGH */

https://gist.github.com/mattn/f5ce1b320f1761c14164

deris commented 10 years ago

パッチありがとうございます! 現状ダブルクォートだと意識するんですね。 挙げていただいたパッチを試してみましたが、私の環境でも動作することを確認しました。 :+1:

mattn commented 10 years ago

タイトル変えました。

h-east commented 9 years ago

711

set cpo+=M時の挙動がPatch 7.4.662で変わっています。ご確認下さい。 https://groups.google.com/d/msg/vim_dev/oNtLa6ZDB8c/UWmVhdvTj94J

Patch 7.4.662以降だと set cpo-=M時の挙動およびset cpo+=M時の挙動は「仕様として正しい動作です」としか言えないです。。

'~' を "~" に変更して挙動が変わるのは(現在のfiletypeに関係なく)「C言語系の文字列の中("~")だったらコメントと同じ扱いとしてすっ飛ばす」か否かの違いということになります。

mattnさんのpatchで直るかもしれないけど、Vimソースの色んなところで「Cコメントをすっ飛ばす」「C文字列をすっ飛ばす」処理が呼ばれているので整合を取るのが難しいかもです。

mattn commented 9 years ago

最新に当ててパッチの動作が壊れてない事は確認したので一度出してみたいと思います。

h-east commented 9 years ago

@mattn 任せます。 ただ、skip_string() [misc1.c:5316] は'~'を文字列としてはみなしていないので、全体の整合的にどうかという懸念はあります。

mattn commented 9 years ago

https://groups.google.com/forum/#!topic/vim_dev/8efdWXWKiNM

mattn commented 9 years ago

僕もこのパッチでどう反応されるか分からないのでひとまず提案として出しました。