vim-jp / issues

有志で既知のバグや要望を検討・管理し、オフィシャルへの還元をしていきます。
https://vim-jp.org/
341 stars 11 forks source link

set tags でワイルドカードを設定しPHP のオムニ補完を実行すると QuickFix ウインドウが開く #211

Open heavenshell opened 12 years ago

heavenshell commented 12 years ago

PHP でオムニ補完を実行すると補完のポップアップが実行されずに、QuickFix のウインドウが開きます。

再現手順

autocmd!
set nocompatible
syntax enable
filetype plugin indent on
set backspace=indent,eol,start
if has('path_extra')
  set autochdir
  set tags+=$HOME/.vim/tags/**3/tags;
endif

autocmd QuickfixCmdPost grep,grepadd,vimgrep if len(getqflist()) != 0 | copen | endif
autocmd FileType php setlocal omnifunc=phpcomplete#CompletePHP
  1. vim -u .vimrc_simple sample.php で Vim を起動
  2. <?php for と入力
  3. 入力モードのまま でオムニ補完を実行
  4. QuickFix のウインドウが開く

    再現環境

    • Scientific Linux 6.1 Vim7.3 (最新版ソースを vim.org からダウンロードしコンパイル)をターミナルから使用
    • MacVim Kaoriya Vim7.3(最新版のバイナリをダウンロードし使用)をターミナルから使用

Linux の Vim と MacVim では挙動が少し異なり、

Linux のエラーメッセージ

E315: ml_get: 無効なlnumです: 2
E315: ml_get: 無効なlnumです: 2
E315: ml_get: 無効なlnumです: 2
E322: 行番号が範囲外です: 1 超えています
E320: 行 2 がみつかりません
E315: ml_get: 無効なlnumです: 2

ctags の set tags+=$HOME/.vim/tags/**3/tags; の設定箇所が怪しいです。 tag ファイルは $HOME/.vim/tags/py/tags という Python 用の ctags ファイルがあります。

!_TAG_FILE_FORMAT>2>/extended format; --format=1 will not append ;" to lines/
!_TAG_FILE_SORTED>1>/0=unsorted, 1=sorted, 2=foldcase/
!_TAG_PROGRAM_AUTHOR>-Darren Hiebert>-/dhiebert@users.sourceforge.net/
!_TAG_PROGRAM_NAME>-Exuberant Ctags>//
!_TAG_PROGRAM_URL>http://ctags.sourceforge.net>-/official site/
!_TAG_PROGRAM_VERSION>5.8>//
add>sample.py>/^def add(x, y):$/;">-f
hello>sample.py>/^def hello(x):$/;">f

set tags+=$HOME/.vim/tags/**3/tags;set tags+=$HOME/.vim/tags/py/tags; とすると発生しません。 また autocmd QuickfixCmdPost grep,grepadd,vimgrep if len(getqflist()) != 0 | copen | endif から vimgrep を削ると発生しません。

Linux Vim Vim(Linux) MacVim MacVim

mattn commented 12 years ago

tagfiles() がバグってそげ。

mattn commented 12 years ago

vim が内部で行う findfile は ; があった場合に上方検索を行うので、どんどん検索してメモリが足らなくなったのだと思います。この場合、; はどうしても必要ですか?

mattn commented 12 years ago

ちなみに、; を上方検索として使う場合

/usr/include/sys;/usr の様に ; の後に上方リミットとなるディレクトリを指定します。これが無い所を見ると、おそらく設定間違い?

mattn commented 12 years ago

まぁ、; が空の時に無限回に検索にいく vim も vim ですが。

mattn commented 12 years ago

あ、ちなみに僕が解析したのは

E315: ml_get: 無効なlnumです: 2
E315: ml_get: 無効なlnumです: 2
E315: ml_get: 無効なlnumです: 2
E322: 行番号が範囲外です: 1 超えています
E320: 行 2 がみつかりません
E315: ml_get: 無効なlnumです: 2

の件です。これは本来 vimscript を使っている限りでないエラーなのです。これはメモリ不足になったのが原因だと思います。 quickfix が出る件は別途調べます。

mattn commented 12 years ago

すごい簡単でした。tags ファイルが見つからない場合に vimgrep してます。その結果 quickfix が出てますね。 tags ファイルは中身も見て、function があるかを確認しているので、python の def な tags は無視されて、結果 vimgrep が行われた...という事です。

heavenshell commented 12 years ago

ありがとうございます。 手元の MacVim で set tags+=$HOME/.vim/tags/**3/tags;$HOME とした所、現象が発生しました。 (Linux でも発生するかは帰宅してから確認します)

mattn commented 12 years ago

現象が発生しました。

ml_get のエラーは出ますか?どっちかっていうとそっちが気になります。 ちなみに quickfix の件は

diff -r 869a63c3f311 runtime/autoload/phpcomplete.vim
--- a/runtime/autoload/phpcomplete.vim  Wed Jun 13 19:19:41 2012 +0200
+++ b/runtime/autoload/phpcomplete.vim  Wed Jun 20 10:09:10 2012 +0900
@@ -476,7 +476,7 @@
        " Prepare list of functions from tags file
        let ext_functions = {}
        if fnames != ''
-           exe 'silent! vimgrep /^'.a:base.'.*\tf\(\t\|$\)/j '.fnames
+           exe 'noau silent! vimgrep /^'.a:base.'.*\tf\(\t\|$\)/j '.fnames
            let qflist = getqflist()
            if len(qflist) > 0
                for field in qflist

で直りませんか?

mattn commented 12 years ago

良く見たら結構おうちゃくだなこの処理w

a:base に正規表現が混じってたらアウトだ。

heavenshell commented 12 years ago

ml_get のエラーは出ますか?どっちかっていうとそっちが気になります。

MacVim では元々 ml_get の方エラーは出ないです。 SL でやった時に発生しました。 ちょっと手元に環境がないので、しばらくお待ち下さいませ。

QuickFix の件はご提示のパッチで行けました!

mattn commented 12 years ago

QuickFix の件はご提示のパッチで行けました!

こっちは vim_dev に投げておきます。あざす。

mattn commented 12 years ago

報告ed

https://groups.google.com/d/topic/vim_dev/BCc5aOG_RT0/discussion

heavenshell commented 12 years ago

Linux でも再現しました。 set tags+=$HOME/.vim/tags/**3/tags;$HOME でエラーメッセージが表示されました。 因に VM 環境でメモリが 512MB しか割り当ててないのも要因かもしれません。

ご提示のパッチを適応した場合、再現しませんでした。

mattn commented 12 years ago

本件は autoload/*.vim だけにして、エラー部分は #212 でやります。

heavenshell commented 12 years ago

承知しました。 お手伝いできる事があればしますので、お声がけ下さい。

mattn commented 12 years ago

phpcomplete.vim の author にコンタクト取れとなw 重い作業だw

mattn commented 12 years ago

作者からメールが返ってこないのでbramがじきじきにメールだした←イマココ