Closed osyo-manga closed 9 years ago
これは、s:get_multibyte_aware_col(pos)
で、set selection=exclusive
のことを
考慮してないからの様です。(こんなオプションあったのですね)
set selection=exclusive
されていると、let c = col(pos)
で、c
が+1されるみたいです。
また、本題とはそれるのですが、#3 でマージしてもらったs:get_multibyte_aware_col(pos)
の修正で、
この他にもバグを見つけてしまいました…
selection
はデフォルトで、マルチバイトな文字の上で
v
→<Plug>(asterisk-z*)
、つまり1文字を範囲選択して検索すると、
マルチバイト文字の中途半端なところで切られて検索してしまいます。
@osyo-manga @presuku 報告ありがとうございます
タイトルそのままなんですが、set selection=exclusive が設定されている時に例えば NeoBundle "kannokanno/previm" の Neo を選択して
<Plug>(asterisk-*)
を呼び出すと NeoB が検索されます。
んーこちらでは再現しないですね. なんでだろう
selectionはデフォルトで、マルチバイトな文字の上で v→
<Plug>(asterisk-z*)
、つまり1文字を範囲選択して検索すると、 マルチバイト文字の中途半端なところで切られて検索してしまいます。
こちらは再現しました.
マルチバイト文字の中途半端なところで切られて検索してしまいます。
こちらは直してみました
.themisrc
に set selection=exclusive
書いたら3つだけテスト落ちた. のでおかしいことはわかった
.themisrc
にset selection=exclusive
書いたら3つだけテスト落ちた. のでおかしいことはわかった https://github.com/haya14busa/vim-asterisk/issues/14#issuecomment-91233276
これ確認するとおかしいのはテストの仕方の方だったので仕様はおかしくなかった.
※ 実行前に選択する viw
の選択範囲がselection
によって変わったのが問題で,選択範囲の文字列を取得する動作は問題がなかった
んーやっぱり同様のテストケースを作成してみても再現しないですね. @presuku さんも再現しているのでしょうか?
申し訳ないですがもう少し詳しく再現手順おねがいします
いらない o
がありますが消しても同じ結果
んーこちらでは再現しないですね. なんでだろう
なんでだろう。 あ、あとそのテストは間違っている気がします。 期待する結果としては、
selection=exclusive
時に \V\<Ne
selection=inclusive
時に \V\<Neo
となるはずです。
これは selection
の設定によってビジュアルの範囲が変わってしまうためです。
normal! v2ly
を実行すると selection
の設定でヤンクされるテキストが異なることがわかると思います。
if has('vim_starting')
set nocompatible
endif
set runtimepath+=/home/worker/neobundle/vim-asterisk
syntax enable
set hlsearch
set selection=exclusive
map * <Plug>(asterisk-*)
homu
を複数行挿入:normal ggv2l*
を実行ho
を検索して欲しいが hom
が検索されるこれで試してもらえないでしょうか。 ※SS載せ忘れてたので追記
@haya14busa
再現しています。
exclusive
の時はnormal v2lo*
ではなくてnormal v3lo*
で、
Neoの3文字の選択だと思います。
とりあえず、こんな感じで直りました…
exclusive
の時に、カーソルを動かさないで*
した場合は、
No selected string
となるようにしてみました。
--- a/autoload/asterisk.vim
+++ b/autoload/asterisk.vim
@@ -197,6 +197,11 @@ function! s:get_selected_text(...) abort
let current_pos = [line('.'), end_col]
let other_end_pos = [line('v'), s:get_multibyte_aware_col('v')]
let [begin, end] = s:sort_pos([current_pos, other_end_pos])
+ if &selection ==# 'exclusive'
+ if s:compare_pos(current_pos, other_end_pos) == 0
+ return ''
+ endif
+ endif
if mode !=# 'V' && begin ==# end
" multibyte handling for one char selection
let lines = [matchstr(getline(begin[0]), printf('\%%%dc.', begin[1]))]
@@ -223,10 +228,13 @@ endfunction
function! s:get_multibyte_aware_col(pos) abort
let [pos, other] = [a:pos, a:pos is '.' ? 'v' : '.']
let c = col(pos)
- let d = s:compare_pos(getpos(pos)[1:2], getpos(other)[1:2]) > 0
- \ ? len(matchstr(getline(pos), '.', c - 1)) - 1
- \ : 0
- return c + d
+ let d = 0
+ let offset = &selection is 'exclusive' ? 1 : 0
+ if s:compare_pos(getpos(pos)[1:2], getpos(other)[1:2]) > 0
+ let c = c - offset
+ let d = len(matchstr(getline(pos), '.', c - 1)) - 1
+ endif
+ return &selection is 'exclusive' ? c : c + d
endfunction
function! s:get_multi_col(pos) abort
@osyo-manga おっと、行き違いでしたね。
うーん、上記だけでは不十分みたいです。
set selection=exclusive
で、
NeoBundle
のNeoBundl
まで、選択して*すると、
\V\<NeoBundl\>
となって、末尾に余計な\>
がついてしまいます。
s:convert_2_word_pattern_4_visual()
かなぁ。
あーとりあえず勘違いしていたことがわかった.すいません.こちらでも再現しました.
見かけ上選択範囲っぽくてもexclusive
だと最後の文字は含まれないのか
@presuku さん
s:get_multibyte_aware_col()
のfix (https://github.com/haya14busa/vim-asterisk/issues/14#issuecomment-91278922 ),このブランチ https://github.com/haya14busa/vim-asterisk/tree/fix-selection-handling に pull request して頂いてもいいでしょうか? (コントリビューションに入るので)
末尾に余計な\>
がついてしまう問題はやっていただいてももちろんいいですが,ボクもやれると思うのでそのまま PR していただいて OKデス! :ok_woman:
@haya14busa さん 連絡おそくなって、申し訳ないです。 https://github.com/haya14busa/vim-asterisk/issues/14#issuecomment-91278922 の変更では、シングルバイト文字の選択時に 問題があることがわかったので、それを修正してからプルリクします。
また、一応確認ですが、上記の修正にはs:get_selected_text()
の変更も含まれてますが、
これも一緒でも良いですか?
末尾に余計な
\>
がついてしまう問題はやっていただいてももちろんいいですが,ボクもやれると思うのでそのまま PR していただいて OKデス! :ok_woman:
こちらは、お願いします!
14 (comment) の変更では、シングルバイト文字の選択時に
問題があることがわかったので、それを修正してからプルリクします。
了解です!
上記の修正にはs:get_selected_text()の変更も含まれてますが、 これも一緒でも良いですか?
okです.おねがいします.
exclusiveの時に、カーソルを動かさないで*した場合は、 No selected stringとなるようにしてみました。
これカーソルを動かさないでy
したときにはカーソル下の文字が取得できるので,*
でもカーソル下の文字を取得する仕様にします
修正してマスターにマージしました.確認をよろしくお願いします.
こちらでも動作することを確認しました。 ありがとうございます。
ありがとうございましたっ
確認しました :+1:
タイトルそのままなんですが、
set selection=exclusive
が設定されている時に例えばの
Neo
を選択して<Plug>(asterisk-*)
を呼び出すとNeoB
が検索されます。