osyo-manga / vital-over

18 stars 3 forks source link

NoInsert: fix priority #111

Closed haya14busa closed 9 years ago

haya14busa commented 9 years ago

ref: #110

優先度が指定されていないせいで, digraph や #110 の <C-v> で明示的に特殊キーを入力したくても, 入力できるかどうか運任せになってしまってました.

digraphs はたまたま大丈夫だったっぽいですが #110 は NoInsert で上書きされて入力できなかった

osyo-manga commented 9 years ago

ありがとうございます。 ちなみにこの -10 ってどこから出てきたんでしょうか(ゲス顔 あとわざわざ abort をつけている理由も気になります。

osyo-manga commented 9 years ago

これですが、他のモジュールでも同じ事が起きる可能性があるので、全く別の回避方法をしたほうがよいかもしれませんね。 e.g.) 他のモジュールで挿入する文字が設定されていたら NoInsert は何も行わない。 このあたりの仕様はちょっとまとめたいところ。

osyo-manga commented 9 years ago

と、いうか現状それっぽいことを行っているのか。

haya14busa commented 9 years ago

あとわざわざ abort をつけている理由も気になります。

妖怪スニペットのしわざですスイマセン

ちなみにこの -10 ってどこから出てきたんでしょうか(ゲス顔

アアアッッ. 根拠は一切ないですね. cssとかでz-index 放置していたら大変なことになるように, priority も何もなければそうなってしまうと思うのでなんか規約とかアレバそれに従ってベンリできるという可能性があります

これですが、他のモジュールでも同じ事が起きる可能性があるので、全く別の回避方法をしたほうがよいかもしれませんね。 e.g.) 他のモジュールで挿入する文字が設定されていたら NoInsert は何も行わない と、いうか現状それっぽいことを行っているのか。

あーこれデスをspecial keyでも判定すれば解決するってことデスかね.

\   && a:cmdline.char() == a:cmdline.variables.input
haya14busa commented 9 years ago

あーこれデスをspecial keyでも判定すれば解決するってことデスかね.

あーいやちがった

osyo-manga commented 9 years ago

なんかバグっぽいような気がするので時間があるときにでもみてみます(あとテストコードも。

osyo-manga commented 9 years ago

これの再現手順を教えてもらえますか? 以下のコードだと再現しませんでした。

call vital#of("vital").unload()

let s:V= vital#of("vital")
let s:cmdline = s:V.import("Over.Commandline")

let s:my = s:cmdline.make_standard()

let s:module = {
\   "name" : "LiteralInsert",
\}

function! s:module.on_char_pre(cmdline)
    if a:cmdline.is_input("\<C-v>")
\   || a:cmdline.is_input("\<C-q>")
        call a:cmdline.setchar('^')
        let self.prefix_key = a:cmdline.input_key()
        let self.old_line = a:cmdline.getline()
        let self.old_pos  = a:cmdline.getpos()
        return
    elseif exists("self.prefix_key")
\       && a:cmdline.get_tap_key() == self.prefix_key
        call a:cmdline.setline(self.old_line)
        call a:cmdline.setpos(self.old_pos)
        call a:cmdline.setchar(a:cmdline.input_key())
    endif
endfunction

function! s:module.on_char(cmdline)
    if a:cmdline.is_input("\<C-v>")
\   || a:cmdline.is_input("\<C-q>")
        call a:cmdline.tap_keyinput(self.prefix_key)
        call a:cmdline.disable_keymapping()
        call a:cmdline.setpos(a:cmdline.getpos()-1)
    else
        if exists("self.prefix_key")
            call a:cmdline.untap_keyinput(self.prefix_key)
            call a:cmdline.enable_keymapping()
            unlet! self.prefix_key
        endif
    endif
endfunction

call s:my.connect(s:module)

function! Test()
    " 起動直後にコマンドラインに '^M' が挿入される
    echo s:my.start("\<C-v>\<CR>")
endfunction
haya14busa commented 9 years ago

指定してないとconnect順っぽいですね. なのでstandardではなく defaultを使用して順番を変えてやるとわかりやすいかと思います(こんな感じ) https://gist.github.com/haya14busa/b5b13e352de86437774d

NoInsertのほうがあとにconnectされていると消えると思います

haya14busa commented 9 years ago

アーじゃあなんで今までdigraphsは動いてたんだろうな...絶対connect順ってわけではないのか

osyo-manga commented 9 years ago

ありがとうございます。 こちらでも再現出来ました。

osyo-manga commented 9 years ago

あーやっぱりバグですね。 これはわたしの方で対応を考えておきます。

haya14busa commented 9 years ago

あー確かによくコード読んでみたら順番に関係なく動くはずっぽいですね. hmhm

haya14busa commented 9 years ago

https://github.com/osyo-manga/vital-over/blob/87fdcdd128048ad04016cb98cc7bf68b45015ea5/autoload/vital/__latest__/Over/Commandline/Base.vim#L130

ここが self.char() じゃなくて self.input_key()であるべきっぽいかな...?(試してない)

あと微妙に関係ないですが,コードを読んでるとこの辺の char と比較する演算子が == になっているものが大量にありignorecase 依存になってしまっているのでバグを踏みそうだなーと思いました. (再現コードは書いてない)

osyo-manga commented 9 years ago

ここが self.char() じゃなくて self.input_key()であるべきっぽいかな...?(試してない)

いや、そこは関係ないですね。 setchar() のあたりの挙動をもう少し厳密にする必要があります。

haya14busa commented 9 years ago

a-確かに関係なさそうでした. ちょっと追ってみたけど意外とよくわからなみ...