[ 新規に投稿する ]

ダイレクトタグジャンプの動作についてNo.11477
Suezo さん 23/08/03 17:43 [ コメントを投稿する ]
  いつも便利に使用させてもらっています。

ctagsでtagsファイルを作りダイレクトタグジャンプを使用しています。
複数の構造体の中に共通のメンバがあった場合にダイレクトタグジャンプを実行すると
「ダイレクトタグジャンプ飛び先指定」が表示され選択できますが、
どちらを選択しても同じ箇所に飛んでしまいます。

例:Sample.hが下記内容の場合に、呼び出し元で「Min」を実行すると
  「ダイレクトタグジャンプ飛び先指定」で飛び先が2つ表示されますが、
  どちらを選択しても、TIME1の「Min」に飛んでしまいます。

Sample.h
typedef struct {
 _UBYTE Sec;
 _UBYTE Min;
 _UBYTE Hour;
} TIME1;

typedef struct {
 _UBYTE Sec;
 _UBYTE Min;
 _UBYTE Hour;
} TIME2;

tagsファイルの内容は下記
Hour .\Sample.h /^ _UBYTE Hour;$/;" m struct:__anon1
Hour .\Sample.h /^ _UBYTE Hour;$/;" m struct:__anon2
Min .\Sample.h /^ _UBYTE Min;$/;" m struct:__anon1
Min .\Sample.h /^ _UBYTE Min;$/;" m struct:__anon2
Sec .\Sample.h /^ _UBYTE Sec;$/;" m struct:__anon1
Sec .\Sample.h /^ _UBYTE Sec;$/;" m struct:__anon2
TIME1 .\Sample.h /^} TIME1;$/;" t typeref:struct:__anon1
TIME2 .\Sample.h /^} TIME2;$/;" t typeref:struct:__anon2

Win10 64Bit版/Ver9.25 beta5 で確認。

以上、確認よろしくお願いします。
[ ]
RE:11477 ダイレクトタグジャンプの動作についてNo.11478
秀丸担当 さん 23/08/04 10:44 [ コメントを投稿する ]
  ご指摘ありがとうございます。
ctagsの出力形式で幾つかパターンがあって、そうなるケースが確認できました。
ずっと昔にあって試していた手元のものでは--format=1と--format=2という出力形式があるようでした。
--format=1だと、同じキーワードの場合、2つめ以降は行番号の表現でうまくいきました。
--format=2だと、ご指摘の通りになりました。
こういう場合もできないか試してみます。

最近幾つかのダイアログなどで絞り込みできるようにしていますが、ダイレクトタグジャンプ飛び先指定の結果内での絞り込みはネタにありつつしていませんでした。
これもできないか改めて検討します。

----

ちなみにV9.19以降のLSPのマクロを使うと、cppの場合はLLVM/clangを使うとLSPサーバーになったりするようです。
導入が面倒なのですが、LLVM/clangをインストールしてパスを通しておくと、clangd.exeという実行ファイルがオプションなしでそのまんまLSPサーバーのようです。
このマクロの修正も少し必要でした。
https://hide.maruo.co.jp/lib/macro/lspclientsample002.html

setting.iniは以下のような感じにします。
[.cpp]
@="CLANG"

[CLANG]
type="lsp"
transport="stdio"
command="clangd.exe"
dir=""

client.jsの調整も必要で、opened: function ()のところの、
   textDocument: { uri: fileuri, version: hidemaru.getUpdateCount(), text: null }
を、
   textDocument: { uri: fileuri, version: hidemaru.getUpdateCount(), languageId:"", text: null }
とすると一応できました。
マクロ実行して解析完了後に、手動でまたマクロ実行すると、マクロのメニューから同名の各"Min"にジャンプできたりしました。

サンプルだとうまくいったりしますが、規模が大きくなったりコンパイルオプションとか考えだすと非常にややこしくて、CPU使い続けるし、厳密さが逆に邪魔になったりするので、やっぱりtagsファイルのほうが軽快でいいかもしれません。
[ ]
RE:11478 ダイレクトタグジャンプの動作についてNo.11479
Suezo さん 23/08/07 09:48 [ コメントを投稿する ]
  >--format=2だと、ご指摘の通りになりました。
>こういう場合もできないか試してみます。

よろしくお願いします。

>最近幾つかのダイアログなどで絞り込みできるようにしていますが、ダイレクトタグジャンプ飛び先指定の結果内での絞り込みはネタにありつつしていませんでした。
>これもできないか改めて検討します。

これもできればうれしいです。
よろしくお願いします。
[ ]
RE:11479 ダイレクトタグジャンプの動作についてNo.11480
秀丸担当 さん 23/08/07 11:53 [ コメントを投稿する ]
  やってみて、それなりにできそうではあるのですが、ソートされていると都合が悪かったです。
以下のような名前ありの構造体の場合は、__anon1とかではなくtagTIME4になって、ソートされていると順番も前後して混在することになりました。

typedef struct {
 int Min;
} TIME1;

typedef struct tagTIME4 {
 int Min;
} TIME4;

typedef struct tagTIME3 {
 int Min;
} TIME3;

typedef struct {
 int Min;
} TIME2;

ソートなしオプション--sort=noで、tagsファイル先頭が!_TAG_FILE_SORTED 0になるときに有効というようにしてみようかと思います。
[ ]
RE:11480 ダイレクトタグジャンプの動作についてNo.11481
Suezo さん 23/08/07 13:28 [ コメントを投稿する ]
  >やってみて、それなりにできそうではあるのですが、ソートされていると都合が悪かったです。
>以下のような名前ありの構造体の場合は、__anon1とかではなくtagTIME4になって、ソートされていると順番も前後して混在することになりました。

実際のソースでは名前あり/なしが混在していて、「ダイレクトタグジャンプの飛び先指定」に
名前なしの場合に、struct:__anon1とか表示されるので選択するときに判断つかないなと思ってました。
これはコーディングルールで構造体は必ず名前ありにすればいいかと検討していたところです。

>ソートなしオプション--sort=noで、tagsファイル先頭が!_TAG_FILE_SORTED 0になるときに有効というようにしてみようかと思います。

よろしくお願いします。
[ ]
RE:11480 ダイレクトタグジャンプの動作についてNo.11484
Suezo さん 23/08/09 18:42 [ コメントを投稿する ]
  Ver9.25 beta7 で動作することを確認しました。

ダイレクトタグジャンプ飛び先指定のダイアログで絞り込み検索も
6年前に私が要望していた内容でした。
こちらも動作することを確認しました。

対応ありがとうございました。
[ ]

[ 新規に投稿する ]