読者です 読者をやめる 読者になる 読者になる

肉とビールとパンケーキ by @sotarok

少し大人になった「肉とご飯と甘いもの」

autocomplpopで日本語がだめだからneocomplcache使ってみたら・・・

Mac + Terminal.app + vim + autocomplpop で,日本語入力時に入力行がずれたり,変換を確定せずに次の文字を打ち込んだときに*1 先頭の1字が入力されなかったりとか *2,右下の変な位置に入力されて文字が打ち込めなかったりなどしていた.

まあ VMWare Player 上の CentOS 5.3 に XP から PuTTYssh していじってるときはこの現象はならないからTerminal.appとの相性があやしい.(そして,上記現象のすべてがvimautocomplpop(以後めんどいので acp)のせいではなさそう.acpオフにしても日本語入力でおかしくなることあるし).


で,autocomplpopのバージョンあげたり,vimrcチェックしたり,Terminal.appの設定みたりとかしてたけど解決できなかったから,

急募でもないが:autocomplpopで日本語入力時には補完をoffにする方法

Twitter / sotarok: 急募でもないが:autocomplpopで日本語入力時には補 ...

とつぶやいたら,

@sotarok http://github.com/Shougo/ne...

Twitter / thinca: @sotarok http://github.com/Sho ...

と,教えていただいたので,ためしてみた.

設定

ひとまずドキュメント見ながらいくつか vimrc に追加してみる.

"""
" NeoComplCache
"""
let g:NeoComplCache_EnableAtStartup=1
" 辞書ファイルリスト
let g:NeoComplCache_DictionaryFileTypeLists = {
    \ 'default' : '',
    \ 'php' : $HOME . '/.vim/dict/php.dict' " ひとまずお試しでPHP
\ }
" 入力文字がこれ以上だと補完しない
" デフォルトは5だけど当然PHPの関数名はそんなんじゃ収まらないからとりあえず増やしまくる
let g:NeoComplCache_MaxTryKeywordLength=100
" 大文字小文字無視
let g:NeoComplCache_IgnoreCase=1
" 大文字を最初に入力したら補完しない
let g:NeoComplCache_SmartCase=1
" 補完リストは最大100
let g:NeoComplCache_MaxList=1000
" _ があっても補完する
let g:NeoComplCache_EnableUnderbarCompletion=1

感想など

ひとまず,PHPファイルいじいじでいろいろためしてみた.

日本語入力

ピンク色の帯がチラチラでてきこないので,邪魔されなくてよい.
入力時におかしくなる現象は現在Linuxなのでわからんw 帰ったら確かめてみる.

部分一致

ためしにつかってみたけど,補完したいのってほとんどの場合が頭うったときなので,いらないな,と思った.

let g:NeoComplCache_PartialMatch=0
頻度による並び替え

これはなんか微妙にもっさり感が否めなかったのでアルファベット順にしてみた.そしてそれでもあまり問題はなさそうげ.でもacpのときは近くにある補完候補とかが上のほうにきてた気がするから,若干不便になるかも.

let g:NeoComplCache_AlphabeticalOrder=1
ディクショナリにある単語が補完候補に現れない
g:NeoComplCache_CacheLineCount^_^_______^_______^_______*g:NeoComplCache_CacheLineCount*
^_______^_______バッファの何行ごとにキャッシュするかを制御する。
^_______^_______Ver.2.31までキャッシュラインは固定だったが、HTMLやTeXで重いために可変となった。
^_______^_______これが小さいほど候補の探索は早くなるが、キャッシュするのに時間がかかる。
^_______^_______
^_______^_______初期値は70である。

って書いてあるから,なんか分割してるんだろうけど,ちょっと問題があった.

というのは,PHPのディクショナリが,5317行あるんですが *3,なんか後ろのほうに定義されてる辞書が補完候補に表示されない.
たとえば,こんなかんじ.


これでは困って,いろいろいじってみたら,

let g:NeoComplCache_CacheLineCount=1000

などとこれを爆発的に増やしてみたら,現れるようになった.


しかし,開くときにあまりにも重い.2秒くらいかかる.キャッシュ生成してるからなんだろうけど.
ていうかディクショナリが5000行もあるからか?いや,そうなんだろうけどw

あと,バッファの切り替えにもそれなりに時間かかる.

バックスペースで戻ったとき「0文字」でも補完される.

最小 2文字とかでやると, fileなんちゃらって言う関数は, fi って入力されたら, fi* にマッチするリストが表示されるんだけど,そこからたとえば,1文字消すと f* にマッチするリストが表示されるようになる(この挙動はacpと同じ.)
しかも,QuickMatch がオンになってると,エラーが大量に表示される.該当箇所みてたら,数字を入力して補完リストから選択する,QuickMatchの関数あたりでのエラーだった.


でまあそれはバグだとおもうので,とりあえず

let g:NeoComplCache_EnableQuickMatch=0

と設定して試してたら,ディクショナリのすべてがリストされた.(もちろんMaxCountで制限されてるから補完リストには100個しか出てないとは思うけど).ものすごく重い.

ちなみに,acpだと,文字を消していくと,1文字のところまでは補完されるけど,0文字になると,補完候補は何もでなくなる.

直してみようかと思ったが

それなりに追ってみたけど,vimscriptよくわからないから自分で治すのは断念.*4
ということでバグ報告代わりにブログにメモを残してみたにとどまったわけです><

あと,スニペット機能とか,オススメのそれらをぜんぜんためしてなくてすみません.

というわけで

日本語の文章を打ちたい場合の最適解は,


vimやめる


ということで,Emacsでも使ってみようかと思います(ぉ


いや,行間をいろいろはしょったからこういう結論が突然現れてなんなんだけど,vimPHPの開発には常用してるしないと話にならないから使いたいし,プログラミングの場合はほとんど日本語打たないからacpでも問題ない.neocomplcacheはまだちょっとバギーだし,重いなーと思うので,ちょっと様子見ってかんじ.
で,じゃあ論文だの日本語中心の文章を書く場合(英語でかけって?それはおいておく),vimじゃねえほうがいいんだ,きっとと思った.
それと,最近はzshキーバインドemacs風になってて,結構なれてきたから昔より良いかも,と思った.

いや,なんか良い方法があったら誰か教えてください><

環境

ちなみに,Macで日本語入力だめだったから試そうとおもってたのに,今環境がLinuxだからLinuxでしかためしてないw
帰ったらMacでも試す.
試した環境は以下.

Windows XP 上の VMWare Player 上の CentOS 5.3 で以下のような環境.

% vim --version
VIM - Vi IMproved 7.2 (2008 Aug 9, compiled Dec 12 2008 18:44:30)
Compiled by sotaro@localhost
Big 版 without GUI.  機能の一覧 有効(+)/無効(-)
+arabic +autocmd -balloon_eval -browse ++builtin_terms +byte_offset +cindent
-clientserver -clipboard +cmdline_compl +cmdline_hist +cmdline_info +comments
+cryptv +cscope +cursorshape +dialog_con +diff +digraphs -dnd -ebcdic
+emacs_tags +eval +ex_extra +extra_search +farsi +file_in_path +find_in_path
+float +folding -footer +fork() +gettext -hangul_input +iconv +insert_expand
+jumplist +keymap +langmap +libcall +linebreak +lispindent +listcmds +localmap
+menu +mksession +modify_fname +mouse -mouseshape +mouse_dec -mouse_gpm
-mouse_jsbterm +mouse_netterm -mouse_sysmouse +mouse_xterm +multi_byte
+multi_lang -mzscheme -netbeans_intg -osfiletype +path_extra +perl +postscript
+printer -profile +python +quickfix +reltime +rightleft +ruby +scrollbind
+signs +smartindent -sniff +statusline -sun_workshop +syntax +tag_binary
+tag_old_static -tag_any_white -tcl +terminfo +termresponse +textobjects +title
 -toolbar +user_commands +vertsplit +virtualedit +visual +visualextra +viminfo
+vreplace +wildignore +wildmenu +windows +writebackup -X11 -xfontset -xim -xsmp
 -xterm_clipboard -xterm_save
      システム vimrc: "$VIM/vimrc"
        ユーザ vimrc: "$HOME/.vimrc"
         ユーザ exrc: "$HOME/.exrc"
       省略時の $VIM: "/usr/local/share/vim"
コンパイル: gcc -c -I. -Iproto -DHAVE_CONFIG_H     -g -O2    -D_REENTRANT -D_GNU_SOURCE   -I/usr/local/include -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -I/usr/include/gdbm  -I/usr/lib/perl5/5.8.8/i386-linux-thread-multi/CORE  -I/usr/include/python2.4 -pthread  -I/usr/lib/ruby/1.8/i386-linux
リンク: gcc   -rdynamic -Wl,-export-dynamic  -Wl,-E -Wl,-rpath,/usr/lib/perl5/5.8.8/i386-linux-thread-multi/CORE   -L/usr/local/lib -o vim       -lncurses -lselinux    -Wl,-E -Wl,-rpath,/usr/lib/perl5/5.8.8/i386-linux-thread-multi/CORE  -L/usr/local/lib /usr/lib/perl5/5.8.8/i386-linux-thread-multi/auto/DynaLoader/DynaLoader.a -L/usr/lib/perl5/5.8.8/i386-linux-thread-multi/CORE -lperl -lresolv -lutil -lc -L/usr/lib/python2.4/config -lpython2.4 -lutil -Xlinker -export-dynamic  -lruby -lm

*1:「今日は晴れ」だとしたら,「きょうは」->Space→(Enterおさずに)「はれ」->Space->Enterってこと

*2:たとえば,「今日はあれ」になる

*3:関数・定数・定義済みクラスのメソッドなど,全部補完候補にしてるので

*4:今はそれに時間をさいていられなかったってのもあるけど.