クラスビュープラグインでシェルスクリプト (*.sh) が解析されない

  1. > 早速クラスビュープラグイン使ってみたのですが、シェルスクリプト (*.sh) のファイルでは何故か解析してくれませんでした…。 *.java のファイルなら解析してくれたので、プラグイン自体は動作しているようなのですが…。

    別トピックで触れた、上記の件です。

    プラグインの動作を見る限り、拡張子によって判定している感じでしょうか?(*.java なら Java として解析する、みたいな)

    もしそうなら、*.sh のファイルが解析対象になっていないのか、あるいは拡張子が別のもので登録されているのか…

    お暇なときにご確認いただければ幸いです 🙇‍♂️

     |  yuko  |  返信
  2. Mery Ver 3.2.1 + クラスビュー Ver 2.4.1 で確認してみましたが *.sh でも問題なく動作しているようで、現象を再現できませんでした。

    > プラグインの動作を見る限り、拡張子によって判定している感じでしょうか?(*.java なら Java として解析する、みたいな)

    プラグインの動作としては、拡張子による判定などはしていないですね。

    クラスビュープラグインはプラグインで解析を行っているわけではなくて、同梱の ctags.exe というソースコードを解析するプログラムを呼び出してるだけなので、*.sh の中に目印になりそうな箇所 (メソッドやクラスなど) がない場合はクラスビュープラグインにも何も表示されません。

    https://ja.wikipedia.org/wiki/Ctags
    ↑ ctags はソースコードを解析してインデックスを作成するためのプログラムです。

    動作としてはファイルのパスを ctags に渡して結果を受け取っているだけなので、解析されるかどうかは ctags 次第になると思います。

    ctags.exe -n --fields=fKs -f "C:\Temp\tag.txt" "C:\Temp\sample.sh"
    

    ↑ 内部的に ctags を上記のパラメーターで呼び出しています。

    "C:\Temp\tag.txt" : 解析結果を出力したいファイル名
    "C:\Temp\sample.sh" : 解析対象のファイル名

    プラグインに同梱されている ctags.exe を使って、上記のコマンドをコマンドプロンプトから直接実行すると解析結果が tag.txt に出力されます。

    上手く動作している場合は数行の ctags のヘッダー情報に加えて、以下のような感じでインデックスのデータが出力されます。

    count_lines	C:\Temp\sample.sh	11;"	function
    get_files	C:\Temp\sample.sh	6;"	function
    

    ヘッダー情報だけしか出力されていない場合は、そのファイルにインデックスにするべき箇所 (メソッドやクラスなど) が含まれていないか、ctags がそのファイルを読み込めていない、などの原因が考えられます。

    また、クラスビューのパネルを右クリックして [プロパティ] を開くと、[Ctags への追加パラメータ] を設定することもできます。

    例えば追加パラメーターで、

    --language-force=sh
    

    と指定してやれば、拡張子にかかわらず強制的に sh の解析モードを適用する、といったことも可能です。

    他にも、パラメーターを駆使すればタグとして抽出する条件を指定したり、正規表現でパターンを指定したりなど、ctags は色々なことができるようですが、ちょっとそこまでは把握していませんので、ctags の仕様につきましてはサポート外とさせていただいてます😅

     |  Kuro  |  返信
  3. Kuro さん

    ctags、以下のヘルプを見てみると、sh は function しかタグとして判定されないっぽい感じでした。(--sh-kinds オプションの定義を見てみると、function しか指定できる項目がないことから)
    https://hp.vector.co.jp/authors/VA025040/ctags/help_j.html

    私がテストしていたときのファイル、変数だけで関数定義を含めていなかったため、それでうまく動作していなかったように見えてしまったようです。お手数おかけしました、、、

    > プラグインの動作としては、拡張子による判定などはしていないですね。

    なるほどー。
    ではプラグインというより ctags.exe の挙動だとは思うのですが、*.java でタグ出力ができていたファイルの拡張子を *.jav に書き換えて再度読み込ませるとタグが出力されなくなるので、ctags のデフォルトの動作で拡張子判定もしているのでしょうね、多分。

     |  yuko  |  返信
  4. > 他にも、パラメーターを駆使すればタグとして抽出する条件を指定したり、正規表現でパターンを指定したりなど、ctags は色々なことができるようですが、ちょっとそこまでは把握していませんので、ctags の仕様につきましてはサポート外とさせていただいてます😅

    ってことはパターン追加を使えばどうにかなる…!?
    と思いまして、以下の追加パラメーターを設定してみました。簡易的ですが、いい感じです😊

    プラグインから追加パラメーターを指定できる機能、とっても親切ですね。

    --regex-sh=/^\s*([a-zA-Z][a-zA-Z0-9]*)=/\1/v,variables/
    

    https://imgur.com/a/Gc1c85q

     |  yuko  |  返信
  5. おおっ!?
    分類を「variables」から「variable」に変えてあげたらアイコンが表示されるようになりました… (プラグイン側の動作をうまく利用したハック的な感じ?)

    https://imgur.com/a/q16SOfU

    --regex-sh=/^\s*([_a-zA-Z][-_a-zA-Z0-9]*)=/\1/v,variable/
    
     |  yuko  |  返信
  6. > ctags のデフォルトの動作で拡張子判定もしているのでしょうね、多分。

    そうですね。普通に ctags.exe を直接呼び出しても拡張子によって結果が異なるようなので、恐らくそういった仕様になっているのだと思います。

    > 以下の追加パラメーターを設定してみました。簡易的ですが、いい感じです😊

    おおっ!すごい。正規表現が使えるかも~ぐらいのノリだったのですが、こんな使い方ができたとは。

    クラスビュープラグインって 7 年前ぐらいにリリースしていますが、使ってるっていう人を見かけたことがないので yuko さんが初めてのユーザーさんかも…😭

    > 分類を「variables」から「variable」に変えてあげたらアイコンが表示されるようになりました… (プラグイン側の動作をうまく利用したハック的な感じ?)

    ぐは。本来であればカテゴリ外のときにも適当なアイコンが表示されるように作っていたつもりだったのですが、プラグインのソースを確認してみたところアイコンのインデックス番号をミスっていて何もないところを指していました😅 (たぶん、アイコン素材を購入したときにアイコンを入れ替えて、インデックスを変更し忘れているのだと…)

    これは後日、修正しておこうと思います。

    ついでにアイコン素材も増えているのでより多くのカテゴリでアイコンを表示できるようにしておこうと思います。あと、ダークモード対応もやらないとですね😱

     |  Kuro  |  返信
  7. >> Kuro さん

    > これは後日、修正しておこうと思います。
    > ついでにアイコン素材も増えているのでより多くのカテゴリでアイコンを表示できるようにしておこうと思います。あと、ダークモード対応もやらないとですね😱

    ありがとうございます!
    もし私しかユーザーがいないとしたら、なんだか贅沢な修正対応ですね😅

    でも、便利なプラグインであることには間違いないので、是非皆さんにも使ってほしいなぁとも思います。(今まで存在に気付いていなかった私が言うのもなんですが…)

     |  yuko  |  返信
スポンサーリンク