Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

vim-smartinputと競合する #161

Closed
crazymaster opened this issue Nov 23, 2012 · 24 comments
Closed

vim-smartinputと競合する #161

crazymaster opened this issue Nov 23, 2012 · 24 comments

Comments

@crazymaster
Copy link

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

@tyru
Copy link
Collaborator

tyru commented Nov 23, 2012

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

@crazymaster
Copy link
Author

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

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

@tyru
Copy link
Collaborator

tyru commented Nov 23, 2012

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

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

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

@tyru
Copy link
Collaborator

tyru commented Nov 23, 2012

  • eskkがマッピングしているのは
    • eskkをオンにするために必要なマッピング→インサートモードとコマンドラインモード
    • eskkがオンになったら変換に必要なマッピング→言語モード(:lmap)
  • smartinputがマッピングしているのは
    • 展開のために必要なマッピング→インサートモードとコマンドラインモード

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

@crazymaster
Copy link
Author

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

@tyru
Copy link
Collaborator

tyru commented Nov 23, 2012

そうです。
試しに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
Copy link
Author

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

@tyru
Copy link
Collaborator

tyru commented Nov 23, 2012

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

@crazymaster
Copy link
Author

" 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
Copy link
Author

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

@tyru
Copy link
Collaborator

tyru commented Nov 23, 2012

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
Copy link
Author

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

@crazymaster
Copy link
Author

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

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

または

let g:smartinput_no_default_key_mappings = 1

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

@crazymaster
Copy link
Author

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

@tyru
Copy link
Collaborator

tyru commented Nov 23, 2012

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

@tyru
Copy link
Collaborator

tyru commented Nov 23, 2012

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

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
Copy link
Collaborator

Shougo commented Nov 23, 2012

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

@crazymaster
Copy link
Author

autocmd vimrc VimEnter * imap <C-j> <Plug>(eskk:toggle)
autocmd vimrc VimEnter * cmap <C-j> <Plug>(eskk:toggle)

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

@tyru
Copy link
Collaborator

tyru commented Nov 24, 2012

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

@crazymaster
Copy link
Author

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

@tyru
Copy link
Collaborator

tyru commented Nov 24, 2012

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

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

@crazymaster
Copy link
Author

<Plug>(eskk:enable)

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

@tyru
Copy link
Collaborator

tyru commented Nov 24, 2012

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

@tyru tyru closed this as completed in 71afa3d Dec 8, 2012
@tyru
Copy link
Collaborator

tyru commented Dec 8, 2012

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants