vim-skk / eskk.vim

eskk is pure Vim script implementation of input method engine SKK
174 stars 28 forks source link

vim-smartinputと競合する #161

Closed crazymaster closed 11 years ago

crazymaster commented 11 years ago

vim-smartinputと競合して、言語モードに入れません。 <C-j>で言語モードに入ろうとすると改行されます。

tyru commented 11 years ago

Lingrの流れ見ました。 thincaさんも言ってた通り、Vimのマッピングの構造上この問題を解決するのは難しいです。 ただ、eskkはすでにマッピングがあればパススルーすべきであるということは以前から考えていたので、解決したいとは思っています。

crazymaster commented 11 years ago

すでに他のプラグインなどでマッピングされているものを無視して、eskkのマッピングにするということでよろしいのでしょうか。

というかそもそもなぜsmartinputで<C-j>がマッピングされているのか分からないのですが...

tyru commented 11 years ago

そうです。上書きするということです。 ただ、その際に元のマッピングを保存しておいて、eskkの変換処理を加えたあとに元のマッピングを実行します。

smartinputで<C-j>などがマッピングされているのは、 コードを読んだ限りではおそらく<C-j><CR>を押された時などに展開するためです。 <C-j><NL>、つまり改行コード(0x0a)です。

eskkやsmartinputなどでこうしたマッピングがなされるのは仕方ない側面もあります。 eskkは入力された文字を変換するために全てのキーをマッピングします。 smartinputも展開するタイミングに必要なキーをマッピングしています。

tyru commented 11 years ago

言語モードはskk.vimなど、IMEプラグインで使われるモードであり目的が明確なためあまり衝突することはありませんが、smartinputがマッピングしているインサートモードとコマンドラインモードは様々な用途に使われるため、問題となったのだと思います。 さらに、「smartinputの展開のために必要なマッピング」は、ルールを登録した段階で自動的にマッピングされるため、「eskkをオンにするために必要なマッピング」のように変更することができないようです。 これが自分は問題だと思っていて、しかし展開するのに仕方なかったのかな...とは思います。

crazymaster commented 11 years ago

<C-j>が改行コードに割り当てられているのは歴史的な事情のようです。 ということはプラグインがなくても改行されるわけですね。

tyru commented 11 years ago

そうです。 試しにvim -u NONE -i NONE -Nとやってプラグインなしで立ち上げて、<C-j>押すと改行されると思います。

今のところ回避方法としては、「eskkをオンにするために必要なマッピング」を<C-j>以外のキーに割り当てることです。 以下のようにすればできます。(<C-g><C-j>にマッピングする例)

imap <C-g><C-j> <Plug>(eskk:toggle)
cmap <C-g><C-j> <Plug>(eskk:toggle)

<C-j>がなぜマッピングされているか、という問題に関しては正直詳しくは分からないので(おそらくこのコメントに理由が書いてあると思うのですが)、vim-smartinputのissuesに登録お願いします。 理由によってはもしかしたら競合が回避可能かもしれません。 と思ったらすでにしてくれてましたね :) kana/vim-smartinput#66

crazymaster commented 11 years ago

あれ、自分で<C-j>にマッピングしたらいけたっぽいぞ。

tyru commented 11 years ago

具体的にどんな設定してますか? eskkとsmartinputの設定両方お願いします。

crazymaster commented 11 years ago

" eskk.vim"{{{
if !exists('g:eskk#disable') || !g:eskk#disable
    " Disable skk.vim
    let g:plugin_skk_disable = 1
    let g:eskk#disable = 0
    let g:eskk#debug = 0

    " Don't keep state.
    let g:eskk#keep_state = 0
    let g:eskk#show_annotation = 1
    let g:eskk#rom_input_style = 'msime'
    let g:eskk#egg_like_newline = 1
    let g:eskk#egg_like_newline_completion = 1

    " Disable mapping.
    "let g:eskk#map_normal_keys = 0

    imap <C-j> <Plug>(eskk:toggle)
    cmap <C-j> <Plug>(eskk:toggle)

    "let g:eskk#dictionary = {
    "\ 'path': expand('~/.skk-eskk-jisyo'),
    "\ 'sorted': 0,
    "\ 'encoding': 'utf-8',
    "\}
    let g:eskk#large_dictionary = {
        \ 'path': expand('/usr/share/skk/SKK-JISYO.L'),
        \ 'sorted': 1,
        \ 'encoding': 'euc-jp',
        \}

    " Use /bin/sh -c "VTE_CJK_WIDTH=1 gnome-terminal --disable-factory" instead of this settings.
    "if &encoding == 'utf-8' && !has('gui_running')
        " GNOME Terminal only.

        " Use <> instead of ▽.
        "let g:eskk#marker_henkan = '<>'
        " Use >> instead of ▼.
        "let g:eskk#marker_henkan_select = '>>'
    "endif

    " Define table.
    autocmd MyAutoCmd User eskk-initialize-pre call s:eskk_initial_pre()
        function! s:eskk_initial_pre() "{{{
            let t = eskk#table#new('rom_to_hira*', 'rom_to_hira')
            call t.add_map('z ', ' ')
            call t.add_map('~', '〜')
            call t.add_map('zc', '©')
            call t.add_map('zr', '®')
            call t.add_map('z9', '(')
            call t.add_map('z0', ')')
            call eskk#register_mode_table('hira', t)
            unlet t
        endfunction "}}}
endif
"}}}

smartinputは何も設定していません。

crazymaster commented 11 years ago

g:smartinput_no_default_key_mappings を定義するとマッピングされないそうです。

tyru commented 11 years ago

smartinputは何も設定していません。

g:smartinput_no_default_key_mappings を定義するとマッピングされないそうです。

ふーむ。smartinputの設定なしでも、起動時にマップするみたいですね。 コード見たら確かにそんな挙動になってました。

LingrのログでShougoさんが言ってる通りプラグインのロード順序のせいな気がします。

  1. 一旦次の行を削除するかコメントアウトしてみてください。

    imap (eskk:toggle) cmap (eskk:toggle)

  2. 次に、コマンドラインで:verbose imap <C-j>と打ってみてください。

2で「Last set from .../vim-smartinput/...」とか表示されるようならsmartinputのせいです。 その場合はこれ以上こっちでは対処しようがないです。

crazymaster commented 11 years ago

Last set from ~/.vim/bundle/vim-smartinput/autoload/smartinput.vim と表示されました。 ぺぐぅ

crazymaster commented 11 years ago

まあ、この問題に関しては

imap <C-j> <Plug>(eskk:toggle)
cmap <C-j> <Plug>(eskk:toggle)

または

let g:smartinput_no_default_key_mappings = 1

とするとなんとかなるので、クローズしていいと思います。

crazymaster commented 11 years ago

というかどちらの方が好ましいのでしょうか?

tyru commented 11 years ago

「これ以上こっちでは対処しようがないです」とか言っちゃいましたが、 冒頭でも「eskkはすでにマッピングがあればパススルーすべきである」と言ってる通り、 こういった衝突を解決するための機能をeskkに追加したいとは思っています。 その機能については↑の #162 で実装してくつもりです。

tyru commented 11 years ago

というかどちらの方が好ましいのでしょうか?

let g:smartinput_no_default_key_mappings = 1で済むならそちらの方がいいとは思いますが、smartinput.vimも使う予定なんですよね? とりあえず併用するなら2つほど解決策があると思います。

  1. imap <C-j> <Plug>(eskk:toggle)としてeskkをオンにするためのキーのみ上書きする
  2. :help smartinput#map_to_trigger()を見ながら、自分がsmartinput発動に必要だと思うキーのみ登録する

2はめんどいですね。 smartinput.vimのデフォルトでマッピングされるキーが今後増えるとも限らないので、その場合追従するコストとか考えると非常にめんどくさいです。 なので1が楽でいいんじゃないでしょうか。

ただプラグインのロード順序に左右される点があまりよろしくないので、VimEnter時にマッピングするとよさそうです。

autocmd vimrc VimEnter * imap <C-j> <Plug>(eskk:toggle)
autocmd vimrc VimEnter * cmap <C-j> <Plug>(eskk:toggle)
Shougo commented 11 years ago

この問題ではまる人は多そうなので、FAQみたいな項目を作り、対処方法を書いておくと良いのではないっでしょうか。

crazymaster commented 11 years ago
autocmd vimrc VimEnter * imap <C-j> <Plug>(eskk:toggle)
autocmd vimrc VimEnter * cmap <C-j> <Plug>(eskk:toggle)

E216: そのようなグループもしくはイベントはありません となるのですが... .vimrcに書いたらだめなのだろうか。

tyru commented 11 years ago

@crazymaster あ、すみません... augroup vimrcvimrcのauto-commandグループを作ってないとエラー出ますね... 単純にvimrc取っちゃってください。

crazymaster commented 11 years ago

了解です。 あとはhelp書いたらこの件はとりあえずおしまいですね。

tyru commented 11 years ago

helpはこんな感じのことを書けばいいですかね?

<C-j>でeskkがオンにならない場合、他のプラグインと干渉している可能性があるので、:verbose imap <C-j>を実行し、どのプラグインによってマッピングされたかをチェックしてください。Last set from .../eskk.vim/...と出ない場合はマッピングが上書きされてしまっています。<Plug>(eskk:enable)を別のキーにマッピングするか、VimEnter時に<C-j><Plug>(eskk:enable)で再度上書きしてください。(以下コード)」

crazymaster commented 11 years ago

<Plug>(eskk:enable)

<Plug>(eskk:toggle)では? 後はいいかと。

tyru commented 11 years ago

おうふ...ありがとうございます。 じゃあそんな感じの文を追加しときますー。

tyru commented 11 years ago

遅くなってすみませんがhelpにFAQの項目追加しました。