14

Ctrl+を使用]してVimの定義にジャンプすることが可能であり、これはctagsまたはCscopeのいずれかと組み合わせて機能することを知っています。PHPを使用する場合、ctagsとCscopeの両方に代わるより正確な方法を探しています。選択できる結果が複数ある場合や、誤検知が発生する場合があります。カーソルの下にあるものの実際の定義ジャンプしたいだけです。理想的には、これは変数、関数、定数、およびクラスに対して機能するはずです。

ファイルを分析してもこれができない理由がわかりません。私はついに、Vimで抱えている他のすべての煩わしさや誤解を学び、カスタマイズすることで克服したので、これを釘付けにすることができれば素晴らしいでしょう。

また、他の人は、CscopeとctagsがPHPに対して十分に正確ではないことに同意しますか、それとも私は何か間違ったことをしていますか?

アップデート

4年後、私はまだPHPでVimを使用していますが、まだこの問題があります。私はeclim、ctags、exubarant-ctags、universal-ctags、およびcscopeを試しました。これらのプログラムにさまざまな引数を渡して、より良いタグを生成できるようにしてみました。これらすべてのオプションのエクスペリエンスは非常に貧弱です。

しかし、私は今、問題をはるかによく理解しています。これらのプログラムによって生成されたタグには何の問題もないかもしれません。Ctrl問題は、VimまたはNeovimで+を押すと]、その名前のタグを探すだけであるようです。編集しているファイルのコンテキストを調べて、その名前のタグを使用する必要があるかどうかを確認することはありません。編集している言語さえ理解せず、その言語のコードからタグを探します。

コンテキストに基づいてタグファイルをよりインテリジェントにvimで検索し、最も可能性の高い場所にジャンプする方法はありますか?良いIDEの中で何が起こるのか、あなたは知っていますか?

4

6 に答える 6

4

C ++開発者として、私は長い間同様の問題を抱えていました。つまり、数年前にVimでタグファイルを使用するアプローチを再編成するまでは。私にとってそれを機能させた秘訣は、コードのスライスごとに別々のタグファイルを生成することでした:私のプロジェクト、さまざまな外部コードライブラリなど...次に、優先度の高いファイルを探すために「タグ」オプションを設定する必要がありましたローカルコードプロジェクトファイルが最初に来て、次にシステムヘッダーファイルが最後になるようにそこから外側に向かって作業します。

私の場合、これらごとに個別のタグファイルがあり、「タグ」オプションにこの順序でリストされています。

  1. 私の地元のプロジェクト
  2. このプロジェクトが使用するその他のプロジェクト
  3. システムバンドルライブラリ(ブースト)
  4. システムバンドルライブラリ(WxWidgets)
  5. システムライブラリ(C ++標準ライブラリ)
  6. システムライブラリ(その他すべて)

私はPHP開発者ではありませんが、私が長い間犯した主な間違いは、すべてに対して単一のタグファイルを生成することでした。(:tagコマンドを使用して)何度も検索するために30以上のタグがあります。複数のタグファイルを生成する場合は、タグの検索順序をより細かく制御できるため、どのタグでどのファイルが検出されるかをより細かく制御できます。

それがあなたのために働くかどうか見てください。それは私のためになりました。

于 2015-03-10T16:30:40.283 に答える
3

PHPのctagsを改善するには、次のようなタグファイルを作成できます。

#!/bin/bash
cd /path/to/framework/library
exec ctags-exuberant -f ~/.vim/mytags/framework \
-h ".php" -R \
--exclude="\.svn" \
--totals=yes \
--tag-relative=yes \
--PHP-kinds=+cf \
--regex-PHP='/abstract class ([^ ]*)/\1/c/' \
--regex-PHP='/interface ([^ ]*)/\1/c/' \
--regex-PHP='/(public |static |abstract |protected |private )+function ([^ (]*)/\2/f/'

次にタグをロードします

:set tags=~/.vim/mytags/framework

私のブログ投稿から取った

于 2011-12-21T10:01:07.263 に答える
2

eclimもご覧ください。

これはEclipseの完了機能を利用する可能性があり、PHPでは正常に機能するはずです(私は試していません)。

于 2012-02-15T12:50:49.550 に答える
2

PHP用のLanguageServerを見つけるまで、同じ問題に長い間苦労していました。

GoToDefinition、ShowReferences、現在のドキュメントのタグなどの機能を提供します。箱から出してすぐにfzfと大丈夫に統合されています。

私がそれについて好きではないこと:

  1. オートコンプリートは、padawanのような他のフレームワークと比較して遅いです
  2. プロジェクトのインデックスは(まだ)キャッシュされません。つまり、neovimを開いたときにインデックスを再作成する必要があります。それでも、インデックス作成中にGoToDefinition機能を使用できます。

vim-plugのクイックセットアップ:

Plug 'autozimu/LanguageClient-neovim', { 'do': ':UpdateRemotePlugins' }

Plug 'roxma/LanguageServer-php-neovim', {'do': 'composer install && composer run-script parse-stubs'}

autocmd FileType php LanguageClientStart

nnoremap <silent> gd :call LanguageClient_textDocument_definition()<CR>

nnoremap <silent> gr :call LanguageClient_textDocument_references()<CR>

私がこれまでに見つけた最良の解決策。

于 2017-06-23T13:48:51.820 に答える
1

g CTRL+[より多くの回避策がありますが、単にの代わりにを押すCTRL+'と、その名前のすべてのタグのリストが表示され、ジャンプ先のタグを選択できます。

于 2011-12-02T19:49:23.133 に答える
1

PHPは適切に設計された言語ではなく、静的に型付けされていません。そのため、実際のプロジェクトで実際に使用できるこの種の優れたツールを作成するための基盤はありません。IDE、言語サーバー、VimおよびNeovimプラグインは、言語が許可する範囲でのみコードについて知ることができます。可能な限り多くのタイプを使用し、ツールが理解できるように言語の限られたサブセットのみを使用する、非常に一貫性のあるコードをPHPで記述することができます。ただし、チームがその優れたPHPコードを記述できる場合は、IDEを強力にサポートするKotlinのように、さらに優れたツールをサポートできる、より適切に設計された言語でコードを書き直すのに十分です。

于 2016-08-01T15:12:52.980 に答える