dannの日記

2009-11-14

autocomplpopとperl-completion.vimの連携

17:10

id:ns9tksさん! perl-completionと連携できるようにするために、以下のような設定をacp.vimにいれたいんですが、.vimrcで拡張するのって可能でしょうか。

  if g:acp_behaviorPerlOmniValueLength >= 0
    call add(behavs.perl, {
          \ 'command' : "\<C-x>\<C-u>",
          \ 'pattern' : printf('\w->\k\{%d,}$',1),
          \ 'repeat' : 0,
          \ })

  endif

http://github.com/c9s/perl-completion.vim

# acp.vimのほうに手をいれれば実現はできたんですが、その他の方法でどう実現すればいいのかわからなくて。

ns9tksns9tks2009/11/14 19:16どもです。
こちらのほうでサポートしたいので、実装したのですがいかがでしょうか?
(download: http://bitbucket.org/ns9tks/vim-autocomplpop/get/97404067dc5e.zip )
詳細は acp.jax の 「perl オムニ補完」を参照してください。

なお、本家の解説 ( http://gist.github.com/234417 ) では "\<C-x>\<C-o>" をつかっているようだったので、そのようにしました。都合が悪ければ教えてください。

danndann2009/11/15 00:04おぉ、ありがたいです!ns9tks++

perl-completion.vimとの作者さんと調整しながら作ってるので、mappingは変えられるので、そのままで大丈夫です。あざっす!

ns9tksns9tks2009/11/15 23:46了解でっす。
perl-completion.vim の作者さんにも連絡して確認してもらいました。

2009-10-27

vimのpluginの管理方法

02:35

vimのpluginをflatにplugin直下に並べてると、どのpluginがどのファイル使っているのかさっぱりわからず、pluginの管理ができないので、これは何とかしないとなぁと。近いうちに、id:ns9tksさんが書いてる方法を導入しよう。

http://d.hatena.ne.jp/ns9tks/20090613/1244884957

autocomplpopのsnippetの補完

20:15

そもそも大文字でsnippetの補完しようとしてませんでした。壮大に勘違いしてました snippet名が辞書に登録されてて、それがでていて、補完候補として表示されたと勘違いしてました orz...

snippetは大文字での補完なんですね。これはスニペットだけしかでてこないので確かにわかりやすいですね。

http://d.hatena.ne.jp/ns9tks/20091027/1256624215

vimの使い方

19:30

自分の使い方は、以下のような感じです > Shougoさん

小さなスクリプトの場合

vim hoge.pl
(suspend)
テストなどする
fg
編集
編集終わったら:wq

Webアプリの場合

複数のfiletypeを一気にbufferに開いて, buffer jumpしながら移動して開発。vimは立ち上げっぱなし。

vim **/*.{pm,tt2, css}
fuzzyfinderでbuffer移動
screen移動してテスト
screen移動でvimの開発用windowに戻る

大きすぎるプロジェクトは、小さなスクリプトの場合と同じ方法で編集してます。

tagsの更新タイミング

tagsは、言語別にライブラリのtag(gems, cpan用などなど)を用意していて、頻繁には更新してないです(モジュールインストールしたらやるくらいです)。Webアプリ用などのプロジェクト用のtagはつくってないです。bufferに開いて読み込んでいるので、それを使って補完してます。

気になる点

自分が気になったのは、「小さなスクリプトの場合(1ファイル)」のケースで、 サンプルなどの小物を作るときにvimを毎回起動して終了させる使い方だと、cacheの時間が結構気になるなぁと(あくまでtagsのファイルが大きい場合で、dictionaryだけであればさほど気になりませんでした)。

Webアプリの場合(複数のファイルを一気にbufferに開く場合)は、まだneocomplcacheで試してないんですが、vimは落とさないのでcacheタイミングは起動時1回(filetype毎に1回)あれば十分で、そこが遅くてもあまり気にならないなぁと思ってます。

ShougoMatsuShougoMatsu2009/10/29 10:30こんにちは。キャッシュが遅いということですね。よく分かりました。
Ver.3.08候補版では、:NeoComplCacheCachingTagsを実行するまでキャッシュしないようにしてみました。お試しください。
http://github.com/Shougo/neocomplcache/tree/e80234101ff1e3428d040c80fc3f92bad5a31d69
ちなみに、タグ補完より、インクルード補完を使った方が便利だと思います。
http://d.hatena.ne.jp/thinca/20091026/1256569191
ちなみに、

danndann2009/10/29 23:31どもです! なるほど、タグ補完を切って、perlのモジュール名などは辞書にいれて、後はインクルード補完というのもありそうですね。

2009-10-26

neocomplcache 3.06

22:12

かなり実用的に使えるようになってきてます! Shougo++

vimを起動する度に、tagをcacheするので、vimで細かくファイルを編集して閉じるときには、大分キャッシングするところの動作が重く感じてしまいます。vimで多量にbuffer開いて、プロジェクト内のファイルを編集するケースはキャッシングの時間はあまり問題にならないかもしれません。(といっても、30-40くらいbuffer開いたときのパフォーマンスはまだ確認してませんが)

neocomplcacheでいいのは、

  • snippetのcompletion(と、補完時にsnippetであることがマークで分かる事。これ非常に重要!)
  • 補完の動作が高速

neocomplcacheで良くないのは、

  • ファイルを開く度にcacheされるので、小さなファイルを細かく編集する際にはcacheする動作が重く感じる事
    • これが結構、実用上は気になるかなぁという印象です。tagsのサイズを小さくするなど、工夫しないと実用で使うのには少し難しいかなぁという印象です。
  • まだautocomplpopと比較してstableではない
  • オプションが多く、最初何を設定してよいのかよくわからない
    • 便利な設定がみつかるまでちょっと大変かなぁという印象です。逆にそれがわかれば、問題ではなくなりそうではあります。

# 使っている感じだと、まだ幾つかbugがあるようなので、そこらはautocomplpopのほうがstableかなぁという気はします。bugはみつけたらgithubのissuesのほうにでもいれときます。

# autocomplpopのほうでもsnippetのcompletionが実装されたので使ってみました。試したところだと、completionの候補がでたときに補完なのかsnippetなのかどうかわからないので、その点がsnippetの補完としては使いにくいかなぁという印象です。それ以外は特に不満点がないです。

ShougoShougo2009/10/27 14:17きちんと動いているようで良かったです。
> ファイルを開く度にcacheされるので、小さなファイルを細かく編集する際にはcacheする動作が重く感じる事
> * これが結構、実用上は気になるかなぁという印象です。tagsのサイズを小さくするなど、工夫しないと実用で使うのには少し難しいかなぁという印象です。
キャッシュのタイミングは改善したいです。できれば、dannさんがどのようにVimを使っているのか、タグの更新はどのようにしているのか、どういうときに問題が発生するのかという詳しい情報が欲しいです。情報が多ければ、こちらとしても対応しやすくなります。

> # 使っている感じだと、まだ幾つかbugがあるようなので、そこらはautocomplpopのほうがstableかなぁという気はします。bugはみつけたらgithubのissuesのほうにでもいれときます。
進化が早すぎるので、バグ修正が追いついていないのです。バグがあれば報告をよろしくお願いします。

> # autocomplpopのほうでもsnippetのcompletionが実装されたので使ってみました。試したところだと、completionの候補がでたときに補完なのか snippetなのかどうかわからないので、その点がsnippetの補完としては使いにくいかなぁという印象です。それ以外は特に不満点がないです。
autocomplpopの問題点として、補完が統合されていない件がありますね。だから大文字を入力しないとスニペットを補完できないのです。ただし、Vim標準の高速な補完を利用できるのは利点でしょう。neocomplcacheはVimの補完を呼び出せないので。

ちなみに、指摘のあったスニペット補完のバグは修正しておきます。

2009-10-23

neocomplcacheでdictによる補完

00:01

先ほどので動いたと思っていたけれど、肝心のperlでdictの補完が出来てない事に気づく。rubyのほうは上手くいったんだけどなぁ。何か他に設定がいるのかなぁ。

# 3.06で直ってます。

neocomplcacheの設定

23:05

snippetの補完とdictionaryからの補完は期待している動作になりました。かなり高速に動作するので、これは快適です!

まだ、常用するには調整が必要なので、neoconブランチを作って試してみています。

http://github.com/dann/dotfiles/tree/neocon

snipmate-snippetsをneocon用にconvertしてみたものも、以下の場所にいれときました。

http://github.com/dann/vim-neocon-snippets

" ============================================
" neocomplcache
" ============================================
 
drwxr-xr-x   5 dann staff     170 2008-09-02 23:06 ubiquity
set complete=.,w,b,u,t,k
let g:NeoComplCache_EnableAtStartup = 1 
let g:NeoComplCache_KeywordCompletionStartLength = 1 
let g:NeoComplCache_PluginCompletionLength = { 
  \ 'snipMate_complete' : 1,
  \ 'buffer_complete' : 1,
  \ 'include_complete' : 2,
  \ 'syntax_complete' : 2,
  \ 'filename_complete' : 2,
  \ 'keyword_complete' : 2,
  \ 'omni_complete' : 1 
  \ }
let g:NeoComplCache_MinKeywordLength = 2 
let g:NeoComplCache_MinSyntaxLength = 2 
let g:NeoComplCache_SmartCase = 1 
let g:NeoComplCache_PartialCompletionStartLength = 2 
let g:NeoComplCache_PreviousKeywordCompletion = 1 
let g:NeoComplCache_EnableCamelCaseCompletion = 1 
let g:NeoComplCache_EnableUnderbarCompletion = 1 
let g:NeoComplCache_EnableSkipCompletion = 0 
let g:NeoComplCache_SnippetsDir = $HOME . '/.vim/snippets'
let g:NeoComplCache_DictionaryFileTypeLists = { 
  \ 'default' : '', 
  \ 'objc' : $HOME . '/.vim/dict/objectivec.dict',
  \ 'javascript' : $HOME . '/.vim/dict/javascript.dict',
  \ 'ruby' : $HOME . '/.vim/dict/ruby.dict',
  \ 'perl' : $HOME . '/.vim/dict/perl.dict',
  \ }
let g:NeoComplCache_SameFileTypeLists = { 
  \ 'perl' : 'man',
  \ 'erlang' : 'man',
  \ }

" neocon keybindings
"------------------
" <TAB> completion.
inoremap <expr><TAB> pumvisible() ? "\<C-n>" : "\<TAB>"

" snippets expand key
imap <silent> <C-e> <Plug>(neocomplcache_snippets_expand)
smap <silent> <C-e> <Plug>(neocomplcache_snippets_expand)

let g:NeoComplCache_EnableSkipCompletion = 0 で必ずcompletionする設定になるようです。

tagsでの補完は、現状自分のtagsでは動作が不安定なので、もうoffにしてしまってdict一本にしようかなぁと。

補完候補が多すぎると邪魔なのとcache時間が少し面倒になってしまう、syntaxなどのcompletionはoffにしたりと後々調整しようかなぁと思ってます。

要するに、dict, buffer, snippetから補完できればそれでいいかなぁと。

tagsがいいなぁといっていたのは、tag jumpを割と使っているので、そのtagで補完もできたらいいかなぁと思っていたんですが、これはスクリプト用意すればいいだけの話なので、あえてtagから補完できなくてもいいかなぁと少し思い始めました。

# あとは、dictの生成をどうするかだなぁ。package名だけひっぱってきて、それをdictに突っ込むスクリプトを書くかなぁ。

ShougoShougo2009/10/26 13:43いろいろと感想ありがとうございます。
neocomplcache Ver.3.06をリリースしました。
http://github.com/Shougo/neocomplcache/tree/v3.06
インクルード補完が実装されたほか、タグ補完が高速化して使い物になるようになってます。試してみてください。perlでディクショナリ補完ができないのはなんででしょう?

danndann2009/10/26 20:47どうもありがとうございます!3.06で試してみたところ、タグ補完もディクショナリ補完も両方できました。タグ補完も現実的な速度で動作してます! これは早いです!

vimを起動してスクリプトを編集する度にtagのcacheをするので、自分のtagの良だとvimは立ち上げっぱなしにして使う感じじゃないとダメそうですが、何かうまい使い方ってありますか?一つは、タグにいれるものを極端に減らしちゃうというのもあるかなぁとは思ってます。

danndann2009/10/26 21:42includeですが、以下のようにruby.snipを書いてみたのですが、保存するときにload_snippetsが無限ループして、エラーになりました。

include ruby-rails

Error detected while processing function <SNR>52_caching_snippets..<SNR>52_load_snippets..<SNR>52_load_snippet
s..<SNR>52_load_snippets..<SNR>52_load_snippets..

2009-10-22

neocomplcacheの試用 その1

03:42

autocomplpopは日常的に使っていて、補完についてはautocomplpopで満足しているんですが、snippetの補完がないのでそれもできたらなぁと思ってました。これがneocomplcacheを使い始めようと思いました。

neocomplcacheautocomplpop風に補完できるようになると嬉しいなぁと思っていて、今のところ気づいている違いは、

  • neocomplcacheでは補完がされるときとされないときがある
  • tagsから補完するときに、tagsの全てのtagが対象になる

という2点です。

1点目は多分設定があると思うので、確実に補完されるように設定したいなぁと。これは後で調べる事に。

2番目のほうは、tagファイルが大きいと補完に時間がかかって現状のgithubのneoconだと実用的に使うにはちょっと難しそうでした。

(autocomplpopの場合、perlの場合では、tag全てではなく、packageのみが補完対象になっているようで、それは現実的な速度で動いてます)

今のところ試している感じだと、「dictであれば、autocomplpopと同じように使える」ようなので、少しそれで試してみようかなぁとも思ってます。

tagsの補完が何らかの条件で絞り込めてそれが現実的な速度で動作すれば、それがとても有り難いです。tagの絞り込みパターンを正規表現でわたせるようになっていれば、autocomplpopっぽく補完がされるのかもなぁと少し思ったり。

# 諸処の事情でvim7.1環境でつかってるので、autocomplpopも大分前のバージョンで使っているのもあれなので、vim7.0環境でも動作するneocomplcacheを使いたいというのもあります。

snipmate-snippetsをneocon用のsnippetファイルにconvertしてみた

03:06

neocomplcache歴2日目のdannです。neocomplcacheを、autocomplpopにsnippet補完がついたものの用途で使えそうなので、neoconはずっと気になっていました。

まずはsnippet用意しないとねということで、snipmate-snippetsを公開されてる有名なvimerな人がいるので、neocon用にsnippetを一括マージして生成するスクリプトを作ってみました。機械的に変換したので、そのまま使えるのかまだよくわかってませんが...

以下の場所に置いときました。

http://github.com/dann/snipmate2neocon

snipmate-snippetsをcloneしてそのディレクトリに直下において実行すると、neocomplcacheというディレクトリにマージされた各種言語用のsnippetが生成されます。

# ruby周りがディレクトリがわかれてて対応しきれてないので、後でスクリプトのほうは直します。

ShougoShougo2009/10/23 14:38cpan.tagsをインストールしてやってみました。
確かに補完結果がおかしいですね。これはtags_complete.vimのバグでしょう。
tags_complete.vimは全面的に書き直すので、その時に修正します。

danndann2009/10/23 20:08おぉ、どうもありがとうございます!