Closed crazymaster closed 11 years ago
Lingrの流れ見ました。 thincaさんも言ってた通り、Vimのマッピングの構造上この問題を解決するのは難しいです。 ただ、eskkはすでにマッピングがあればパススルーすべきであるということは以前から考えていたので、解決したいとは思っています。
すでに他のプラグインなどでマッピングされているものを無視して、eskkのマッピングにするということでよろしいのでしょうか。
というかそもそもなぜsmartinputで<C-j>
がマッピングされているのか分からないのですが...
そうです。上書きするということです。 ただ、その際に元のマッピングを保存しておいて、eskkの変換処理を加えたあとに元のマッピングを実行します。
smartinputで<C-j>
などがマッピングされているのは、
コードを読んだ限りではおそらく<C-j>
や<CR>
を押された時などに展開するためです。
<C-j>
は<NL>
、つまり改行コード(0x0a)です。
eskkやsmartinputなどでこうしたマッピングがなされるのは仕方ない側面もあります。 eskkは入力された文字を変換するために全てのキーをマッピングします。 smartinputも展開するタイミングに必要なキーをマッピングしています。
言語モードはskk.vimなど、IMEプラグインで使われるモードであり目的が明確なためあまり衝突することはありませんが、smartinputがマッピングしているインサートモードとコマンドラインモードは様々な用途に使われるため、問題となったのだと思います。 さらに、「smartinputの展開のために必要なマッピング」は、ルールを登録した段階で自動的にマッピングされるため、「eskkをオンにするために必要なマッピング」のように変更することができないようです。 これが自分は問題だと思っていて、しかし展開するのに仕方なかったのかな...とは思います。
<C-j>
が改行コードに割り当てられているのは歴史的な事情のようです。
ということはプラグインがなくても改行されるわけですね。
そうです。
試しに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)
と思ったらすでにしてくれてましたね :) kana/vim-smartinput#66<C-j>
がなぜマッピングされているか、という問題に関しては正直詳しくは分からないので(おそらくこのコメントに理由が書いてあると思うのですが)、vim-smartinputのissuesに登録お願いします。
理由によってはもしかしたら競合が回避可能かもしれません。
あれ、自分で<C-j>
にマッピングしたらいけたっぽいぞ。
具体的にどんな設定してますか? eskkとsmartinputの設定両方お願いします。
" 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は何も設定していません。
g:smartinput_no_default_key_mappings を定義するとマッピングされないそうです。
smartinputは何も設定していません。
g:smartinput_no_default_key_mappings を定義するとマッピングされないそうです。
ふーむ。smartinputの設定なしでも、起動時にマップするみたいですね。 コード見たら確かにそんな挙動になってました。
LingrのログでShougoさんが言ってる通りプラグインのロード順序のせいな気がします。
一旦次の行を削除するかコメントアウトしてみてください。
imap
:verbose imap <C-j>
と打ってみてください。2で「Last set from .../vim-smartinput/...」とか表示されるようならsmartinputのせいです。 その場合はこれ以上こっちでは対処しようがないです。
Last set from ~/.vim/bundle/vim-smartinput/autoload/smartinput.vim と表示されました。 ぺぐぅ
まあ、この問題に関しては
imap <C-j> <Plug>(eskk:toggle)
cmap <C-j> <Plug>(eskk:toggle)
または
let g:smartinput_no_default_key_mappings = 1
とするとなんとかなるので、クローズしていいと思います。
というかどちらの方が好ましいのでしょうか?
「これ以上こっちでは対処しようがないです」とか言っちゃいましたが、 冒頭でも「eskkはすでにマッピングがあればパススルーすべきである」と言ってる通り、 こういった衝突を解決するための機能をeskkに追加したいとは思っています。 その機能については↑の #162 で実装してくつもりです。
というかどちらの方が好ましいのでしょうか?
let g:smartinput_no_default_key_mappings = 1
で済むならそちらの方がいいとは思いますが、smartinput.vimも使う予定なんですよね?
とりあえず併用するなら2つほど解決策があると思います。
imap <C-j> <Plug>(eskk:toggle)
としてeskkをオンにするためのキーのみ上書きする: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)
この問題ではまる人は多そうなので、FAQみたいな項目を作り、対処方法を書いておくと良いのではないっでしょうか。
autocmd vimrc VimEnter * imap <C-j> <Plug>(eskk:toggle) autocmd vimrc VimEnter * cmap <C-j> <Plug>(eskk:toggle)
E216: そのようなグループもしくはイベントはありません となるのですが... .vimrcに書いたらだめなのだろうか。
@crazymaster あ、すみません...
augroup vimrc
でvimrc
のauto-commandグループを作ってないとエラー出ますね...
単純にvimrc
取っちゃってください。
了解です。 あとはhelp書いたらこの件はとりあえずおしまいですね。
helpはこんな感じのことを書けばいいですかね?
「<C-j>
でeskkがオンにならない場合、他のプラグインと干渉している可能性があるので、:verbose imap <C-j>
を実行し、どのプラグインによってマッピングされたかをチェックしてください。Last set from .../eskk.vim/...
と出ない場合はマッピングが上書きされてしまっています。<Plug>(eskk:enable)
を別のキーにマッピングするか、VimEnter時に<C-j>
を<Plug>(eskk:enable)
で再度上書きしてください。(以下コード)」
<Plug>(eskk:enable)
<Plug>(eskk:toggle)
では?
後はいいかと。
おうふ...ありがとうございます。 じゃあそんな感じの文を追加しときますー。
遅くなってすみませんがhelpにFAQの項目追加しました。
vim-smartinputと競合して、言語モードに入れません。
<C-j>
で言語モードに入ろうとすると改行されます。