ダイレクトタグジャンプの動作について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: n
ull }
を、
   textDocument: { uri: fileuri, version: hidemaru.getUpdateCount(), languag
eId:"", 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年前に私が要望していた内容でした。
こちらも動作することを確認しました。

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

[ ]