14

私は最近、マウス駆動のプラットフォーム固有のGUIエディターを放棄し、完全にvimに取り組んでいます。これまでの経験は素晴らしかったですが、Javascriptに関しては行き詰まっています。

常に人気のあるタグリストユーティリティ(Exuberant Ctagsを使用)は、Javascript以外のすべてに最適です。言語の形式と構造が非常に自由であるため、タグリストは、開いたときにほんの一握りの関数しか取得できませんでした。次の形式で定義された関数のみです。

function FUNCNAME (arg1, arg2) {

ただし、次のように定義された変数や関数オブジェクトはありません。

var myFunc = function (arg1, arg2) {

そこで、少しググって、ctagsに設定された次の定義を見つけました。これを〜/.ctagsファイルに入れました。

--langdef=js
--langmap=js:.js
--regex-js=/([A-Za-z0-9._$]+)[ \t]*[:=][ \t]*\{/\1/,object/
--regex-js=/([A-Za-z0-9._$()]+)[ \t]*[:=][ \t]*function[ \t]*\(/\1/,function/
--regex-js=/function[ \t]+([A-Za-z0-9._$]+)[ \t]*([^])])/\1/,function/
--regex-js=/([A-Za-z0-9._$]+)[ \t]*[:=][ \t]*\[/\1/,array/
--regex-js=/([^= ]+)[ \t]*=[ \t]*[^""]'[^'']*/\1/,string/
--regex-js=/([^= ]+)[ \t]*=[ \t]*[^'']"[^""]*/\1/,string/

その後、コマンドラインからctagsを実行するのは素晴らしかった。それは私が見つけるのに必要なすべての関数とオブジェクトを見つけました。

問題は、taglist.vimプラグインがこれらの新しい結果を認識していないことです。javascriptファイルをvimで開いて:TlistToggleを押すと、以前とまったく同じわずかな関数しか得られません。「u」を押してリストを更新しましたが、効果はありません。

taglist.vimを掘り下げて、私はこれを見つけました:

" java language
let s:tlist_def_java_settings = 'java;p:package;c:class;i:interface;' .
                               \ 'f:field;m:method'

" javascript language
let s:tlist_def_javascript_settings = 'javascript;f:function'

...これは、javascriptのctagsユーティリティからの特定の種類の出力のみを確認していることを意味します。残念ながら、私はタグリストやvim全般に(まだ)精通していないため、これらのすばらしいctagsコマンドラインの結果をすべてvimに表示するためにどのような変更を加えることができるかを知ることができません。

感謝します!

4

6 に答える 6

21

とった!私はしばらくの間、taglist.vim コードに飛び込みました。これが私が見つけたものです:

taglist.vim は、vim が使用しているのと同じファイルタイプを ctags に強制的に使用させます。したがって、Google で見つけた ~/.ctags スニペットは、非常に必要な定義を新しい「js」言語に割り当て、それを .js で終わるファイルに適用していますが、taglist は ctags に「JavaScript」ファイルタイプを使用するよう強制しています。 vim is using -- これはすでに ctags に組み込まれています。

解決策は、 ~/.ctags ファイルを上で投稿したものから次のように変更することです。

--regex-JavaScript=/([A-Za-z0-9._$]+)[ \t]*[:=][ \t]*new[ \t]+Object\(/\1/o,object/
--regex-JavaScript=/([A-Za-z0-9._$]+)[ \t]*[:=][ \t]*\{/\1/o,object/
--regex-JavaScript=/([A-Za-z0-9._$()]+)[ \t]*[:=][ \t]*function[ \t]*\(/\1/f,function/
--regex-JavaScript=/function[ \t]+([A-Za-z0-9._$]+)[ \t]*\([^\]\)]*\)/\1/f,function/
--regex-JavaScript=/([A-Za-z0-9._$]+)[ \t]*[:=][ \t]*new[ \t]+Array\(/\1/a,array/
--regex-JavaScript=/([A-Za-z0-9._$]+)[ \t]*[:=][ \t]*\[/\1/a,array/
--regex-JavaScript=/([^= ]+)[ \t]*=[ \t]*[^""]'[^'']*/\1/s,string/
--regex-JavaScript=/([^= ]+)[ \t]*=[ \t]*[^'']"[^""]*/\1/s,string/

ctags 内で新しい言語定義を作成するのではなく、既存の JavaScript 言語定義を直接変更します。現在、taglib が vim の登録済みファイルタイプを強制すると、新しい定義が使用されます。また、以前に投稿された ~/.ctags 行に欠落していたのは、Al が回答で言及した「親切な」手紙だったので、それらは私の更新版にも含まれています。

そこから、以下を ~/.vimrc にドロップして新しいタイプを有効にします:

let g:tlist_javascript_settings = 'javascript;s:string;a:array;o:object;f:function'

全体として、新しい正規表現行は完璧ではありません。多くの誤検知を回避するために微調整が必​​要になることは間違いありません。また、定数などを分離するのもよいでしょう。しかし今、少なくとも、私はそれを行う能力を持っています:)。

編集:プラグインを編集せずにタイプをアクティブ化する方法に関する説明を追加し、主要な ctags 関数の正規表現を大幅に改善して、いくつかの誤検知を回避しました。

編集 2: ctags 正規表現に配列とオブジェクトの定義を追加しました。

于 2009-11-24T18:38:28.110 に答える
3

私はグーグル検索でこの投稿に出くわしました、そしてあなたの発見は素晴らしいですが、私たちはそれらを改善することができると思います。これは、ソリューションを少しハッキングした結果です。

.ctags

--regex-JavaScript=/^var[ \t]+([a-zA-Z0-9_$]+) = \[/\1/a,array/
--regex-JavaScript=/^var[ \t]+([a-zA-Z0-9_$]+) = \{/\1/o,object/
--regex-JavaScript=/^var[ \t]+([a-zA-Z0-9_$]+) = (^{^[)+/\1/r,var/
--regex-JavaScript=/^[ \t]*(this\.)?([A-Za-z0-9_$()]+)[ \t]*[:=][ \t]*function[ \t]*\(\)/\2/u,function/
--regex-JavaScript=/^[ \t]*function ([a-z0-9]+[A-Za-z0-9_]*)/\1/u,function/
--regex-JavaScript=/^[ \t]*([A-Za-z0-9]+)\.prototype\.([a-z0-9]+[A-Za-z0-9_]*)/\1 : \2/u,function/
--regex-JavaScript=/^[ \t]*function ([A-Z]+[A-Za-z0-9_]*)/\1/o,object/

.vimrc

let g:tlist_javascript_settings = 'javascript;r:var;s:string;a:array;o:object;u:function'

これにより、さらにいくつかの誤検知がなくなり、より問題のある正規表現を取り除くためのトレードオフとして、いくつかの機能が追加されます。さらに必要な場合は更新を続けます。

編集:私は今、すべてが本当にうまく機能しているようになりました。この結果はしっかりしているように感じます。唯一の大きな欠点は、コンマ区切りの変数定義では機能しないことです。それは特に厄介なようです。たぶん、別の日。:)

.vimrcを変更したことにも注意してください。これは私がフリークだからではありません。どういうわけかtaglistやctagsなどにデフォルト値が設定されているためです。変更しないと、関数や変数が関係する場所で多くのdoubleが発生し、非常に狂ってしまいます(細部に細心の注意を払っています。 。:P)

編集:より多くの微調整。現在、プロトタイプ関数宣言を取り上げており、他の愚かなことはしていません。

于 2010-09-17T18:43:42.103 に答える
2

Vim で JavaScript ソースコードのブラウジング/タグリストを取得するための非常に新しく、きちんとした簡単な方法でもあるベスト プラクティス ソリューションは、Mozilla のDoctorJS (以前はjsctagsとして知られていた) を使用することです。

詳細については、この質問に対する私の回答を参照してください

楽しみ。:)

于 2011-05-05T07:21:36.730 に答える
1

こんにちは、Tom Frost の質問と調査に感謝します。最終的な回答の 4 行目の正規表現に少し問題があると思います。

--regex-JavaScript=/function[ \t]+([A-Za-z0-9._$]+)[ \t]*\([^\]\)]*\)/\1/f,function/

私にはうまくいきませんでした。少し引っ張ったところ、問題なく動作するようになりました:

--regex-JavaScript=/function[ \t]+([A-Za-z0-9._$]+)[ \t]*\([^\)]*\)/\1/f,function/

PD。ここに投稿された他の回答の正規表現は、少なくとも私にとってはまったく機能しません:-?

于 2010-11-27T11:00:26.167 に答える
1

私はjavascriptまたはtaglistをあまり使用していませんが、:help taglist-extendあなたの定義(上記にリストされている)がjavascript出力の名前をjsに変更しているように見えるので、おそらく(vimrcで)次のようなものが必要になるでしょう:

let tlist_js_settings = 'js;f:function;m:method'

これは、ctags 'kind' が関数の場合は 'f'、メソッドの場合は 'm' であると想定しています。タグファイルを見て、「種類」列がどのように見えるかを確認してください。例として、私の C コード タグ ファイルには次の行が含まれています。

ADC_CR1_AWDCH_0 .\LibraryModules\CMSIS\Headers\stm32f10x.h  2871;"  d

これは、リストされたファイルの 2871 行目#defineにあるシンボルADC_CR1_AWDCH_0の です。「d」は、定義された名前の ctags の「種類」です。うまくいけば、それがあなたを動かすのに十分なものになるでしょう。

余談ですが、オーバーライドが正しく機能するかどうかはわかりません。そのため、正しく機能するjs:.mjsまで、ファイルに「myfile.mjs」という名前を付けて、langmap を に変更する価値があるかもしれません。そうすれば、少なくとも、問題がファイルの誤認に関連しているのか、実際の解析に関連しているのかがわかります。

于 2009-11-24T17:07:36.170 に答える
1

ctags の組み込み javascript サポートからの重複エントリを避けるために、元の投稿のように 'js' 言語を定義し、taglist が ctags を使用できるようにします。また、タグ名からあまり役に立たない部分 (引用符、"this."、".prototype") を取り除くようにしています。object/array/string/var 正規表現は使用しませんが、正規表現を他の提案と組み合わせるのは簡単です。

~/.ctags:

--langdef=js
--langmap=js:.js
--regex-js=/["']?(this\.)?([A-Za-z0-9_$]+)["']?((\.prototype)?(\.[A-Za-z0-9_$]+))?[ \t]*[:=][ \t]*function/\2\5/f,function/
--regex-js=/function[ \t]+([A-Za-z0-9_$]+)/\1/f,function/

~/.vimrc:

let g:tlist_javascript_settings = 'js;f:function'
于 2010-12-11T01:13:03.213 に答える