質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Vim

VimとはUnix / Linux 系のOSに標準搭載されているターミナル上で動くテキストエディタです。

Q&A

解決済

1回答

251閲覧

imsearch値を変更してからパターン検索に入るコマンドが上手く動かない

matonrin

総合スコア12

Vim

VimとはUnix / Linux 系のOSに標準搭載されているターミナル上で動くテキストエディタです。

0グッド

0クリップ

投稿2018/09/15 04:38

編集2018/09/15 09:19

Vimにおける日本語入力をサポートするための、類似したプラグインが2つあります。

  • imactivatemap
    IMオンの状態でインサートモード(とパターン検索)に入れるマッピングを追加するというプラグインです。例えば、prefixキーが'g'の場合、'gi'と入力することで、iコマンドをIMオンの状態で始められるようになります。

  • im_control
    インサートモード(とパターン検索)に入る際のIMオン/オフの設定を固定できるというプラグインです。

私は、これらのプラグインの良い所を組み合わせたようなものを作ろうとしました。
簡単に説明すると、IM設定を切り替える際に、それと逆の設定でインサートモード(とパターン検索)に入るマッピングを追加するというものです。
例えば、IMオフ設定の時に'gi'と入力するとIMオンで、IMオン設定の時に'gi'と入力するとIMオフでインサートモードに入るようにするということです。
こうすることで、例えば、プログラムなどの英語がメインのファイルを編集する時はIMオフ設定にし、たまにコメント文を日本語で入力する時などにIMオンのコマンドを使用する、という使い方が出来ると考えました。

しかし、実際に動かしてみると、検索コマンド('/'と'?')だけが上手く動きませんでした。
ソースコードは以下の通りです(vimrcとは別ファイルです)。

VimScript

1"デフォルトはIMオフ設定にする 2let g:isImFixOn = get(g:,'isImFixOn',v:false) 3 4command! -nargs=0 ImFixSwitch call <SID>imFixSwitch() 5fu! s:imFixSwitch() 6 let g:isImFixOn = !g:isImFixOn 7 call s:imSwitch(g:isImFixOn) 8 call s:imReverseMapSwitch(g:isImFixOn) 9endf 10 11fu! s:imSwitch(on) 12 let &imi = (a:on) ? 2 : 0 13 let &ims = (a:on) ? 2 : 0 14endfu 15 16fu! s:imiSwitchBy(on,cmd) 17 let &imi = (a:on) ? 2 : 0 18 return a:cmd 19endf 20 21fu! s:imsSwitchBy(on,cmd) 22 let &ims = (a:on) ? 2 : 0 23 return a:cmd 24endf 25 26"現在のIM設定と逆の動作をするコマンドのマッピングを行う 27fu! s:imReverseMapSwitch(on) 28 let l:prefix='g' 29 let l:imicmdlist = ['i','I','a','A', 30 \ 'o','O','s','S', 31 \ 'c','C','r','R', 32 \ 'f','F','t','T'] 33 let l:imscmdlist = ['/','?'] 34 35 for imicmd in l:imicmdlist 36 exe 'map <expr> <silent> '.l:prefix.imicmd.' <SID>imiSwitchBy('.!a:on.",'".imicmd."')" 37 endfor 38 "FIXME: こっちだけ動かない 39 for imscmd in l:imscmdlist 40 exe 'map <expr> <silent> '.l:prefix.imscmd.' <SID>imsSwitchBy('.!a:on.",'".imscmd."')" 41 endfor 42 43 "インサートモードから抜ける際、元の設定に戻すための自動コマンド 44 if a:on 45 aug recover_im_reverse 46 au! 47 au InsertLeave * call <SID>imSwitch(v:true) 48 aug END 49 else 50 aug recover_im_reverse 51 au! 52 au InsertLeave * call <SID>imSwitch(v:false) 53 aug END 54 endif 55endf 56"起動時にマッピングが登録されているようにする 57call s:imReverseMapSwitch(g:isImFixOn)

例えば、IMオフ設定で'g/'と入力してみると、コマンドラインの右端に'/'と表示され、次のキー入力を待機しているという状態で停止しました。この時カーソルは依然としてウィンドウ内にあり、IMはオンになっていました。そしてその状態で何らかの文字('ほげ'とします)を入力し、確定すると、'/ほげ'というように、その文字が検索パターンとしてコマンドラインに入力されました。
IMオン設定の場合も、これと同様の挙動になりました。

結果を見れば成功と言えなくもないですが、普段使いする以上、この謎の不具合を取り除いておきたいです。
この不具合の原因の究明へのご協力、よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

imactivatemapのマッピングを切り替えるという方法で同様の機能を実現出来ました。

投稿2018/10/06 06:35

matonrin

総合スコア12

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問