コグノスケ


link 未来から過去へ表示(*)  link 過去から未来へ表示

link もっと前
2025年11月7日 >>> 2025年10月25日
link もっと後

2025年10月31日

GNU global + pygmentsトラブルシューティングUbuntu編

目次: Linux

先日(2025年10月27日の日記参照)はGNU global + pygmentsでC/C++/Pythonのタグジャンプができる環境を整えましたが、微妙に動かない事態に遭遇したのでトラブルシューティングのメモを残しておきます。

global + pygmentsのトラブルシューティング: Ubuntu 24.04

Ubuntu 24.04は定義や参照へのジャンプができるため機能的には問題ありませんが、gtagsを実行する度に妙な警告が出ます。

Ubuntu 24.04で実行したときの警告
$ gtags --gtagslabel=pygments

/usr/share/global/gtags/script/pygments_parser.py:92: SyntaxWarning: invalid escape sequence '\s'
  tag = re.sub('\s+', '', tag)    # remove newline and spaces
/usr/share/global/gtags/script/pygments_parser.py:161: SyntaxWarning: invalid escape sequence '\s'
  match = re.search(r'(\S+)\s+(\d+)\s+' + re.escape(path) + '\s+(.*)$', line)

エラーの箇所を見るとglobalのヘルパースクリプト(/usr/share/global/gtags/script/pygments_parser.py)が間違っているっぽいので、下記のように修正すると警告が出なくなります。

globalのヘルパースクリプトの変更点
--- pygments_parser.py.org	2025-10-26 22:48:13.811340349 +0900
+++ pygments_parser.py	2025-10-26 22:47:41.250646696 +0900
@@ -89,7 +89,7 @@
                     # we can assume index are delivered in ascending order
                     while self.lines_index[cur_line] <= index:
                         cur_line += 1
-                    tag = re.sub('\s+', '', tag)    # remove newline and spaces
+                    tag = re.sub(r'\s+', '', tag)    # remove newline and spaces
                     if self.options.strip_punctuation:
                         tag = tag.strip(PUNCTUATION_CHARACTERS)
                     if tag:
@@ -158,7 +158,7 @@
             line = self.child_stdout.readline()
             if not line or line.startswith(TERMINATOR):
                 break
-            match = re.search(r'(\S+)\s+(\d+)\s+' + re.escape(path) + '\s+(.*)$', line)
+            match = re.search(r'(\S+)\s+(\d+)\s+' + re.escape(path) + r'\s+(.*)$', line)
             if match:
                 (tag, lnum, image) = match.groups()
                 if self.options.strip_punctuation:

この現象を確認した環境は以下の通りです。

globalとpygmentsのバージョン(Ubuntu 24.04)
$ global --version

global (GNU Global) 6.6.11
Powered by Berkeley DB 1.85 and SQLite3 3.45.1.
Copyright (c) 1996-2023 Tama Communications Corporation
License GPLv3+: GNU GPL version 3 or later <http://www.gnu.org/licenses/gpl.html>
This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

$ dpkg -l | grep global

ii  global                      6.6.11-1                     amd64        Source code search and browse tools


$ pygmentize -V

Pygments version 2.17.2, (c) 2006-2023 by Georg Brandl, Matthäus Chajdas and contributors.

$ dpkg -l | grep pygme

ii  python3-pygments            2.17.2+dfsg-1                all          syntax highlighting package written in Python 3

だいぶ長くなってしまいましたが、これでDebian/Ubuntuともに快適globalタグジャンプ生活が送れるはずです。やったぜ。

編集者:すずき(2025/11/02 03:19)

コメント一覧

  • コメントはありません。
open/close この記事にコメントする



2025年10月29日

GNU global + pygmentsトラブルシューティングDebian編

目次: Linux

先日(2025年10月27日の日記参照)はGNU global + pygmentsでC/C++/Pythonのタグジャンプができる環境を整えましたが、微妙に動かない事態に遭遇したのでトラブルシューティングのメモを残しておきます。

共通の問題

DebianやUbuntuではpython-is-python3をインストールすると/usr/bin/pythonがpython3を指すようになります。しかし何か事情があってPythonをPython3に固定すると困る人はpython-is-python3をインストールしていないでしょう。そのときはglobalがこんなエラーを出します。

PythonがPython3ではないときのエラー
$ gtags --gtagslabel=pygments

/usr/bin/env: 'python': No such file or directory
gtags: unexpected EOF.

何かの理由で/usr/bin/pythonをpython3に固定しない場合、globalのヘルパースクリプト(/usr/share/global/gtags/script/pygments_parser.py)の先頭にあるpythonをpython3に書き換えればエラーが解消されます。かなり強引ですけど。

global + pygmentsのトラブルシューティング: Debian Testing

せっかちさんのために結論を先に書いておくと、Debian Testingではexuberant-ctagsだと動作しません。universal-ctagsに入れ替えてください。

Debian Testingではglobal, python3-pygments, exuberant-ctagsの組み合わせだと、C/Pythonともに定義個所と参照個所の検索ができません。参照個所へのタグジャンプができないのは致命的に使いにくくて困ります。

Debian Testingでglobalの基本機能のテスト
$ global -x cfunc_b

$ global -rx cfunc_b

$ global -x pyfunc_b

$ global -rx pyfunc_b

$ global -gx func
func                3 a.c              int cfunc_b(int b);
func                5 a.c              int cfunc_a(int a)
func                7 a.c               return cfunc_b(a) + 1;
func               13 a.c               printf("%d\n", cfunc_a(a));
func                1 a.py             from b import pyfunc_b
func                3 a.py             def pyfunc_a(a: int):
func                4 a.py                 return pyfunc_b(a) + 1
func                7 a.py                 print(f"{pyfunc_a(5)}")
func                1 b.c              int cfunc_b(int b)
func                1 b.py             def pyfunc_b(b: int):

この現象を確認した環境は以下の通りです。

globalとpygmentsのバージョン(Debian Testing)
$ gtags --version

gtags (GNU Global) 6.6.14
Powered by Berkeley DB 1.85 and SQLite3 3.46.1.
Copyright (c) 1996-2024 Tama Communications Corporation
License GPLv3+: GNU GPL version 3 or later <http://www.gnu.org/licenses/gpl.html>
This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

$ dpkg -l | grep global

ii  global                                           6.6.14-1.1                                amd64        Source code search and browse tools


$ pygmentize -V

Pygments version 2.18.0, (c) 2006-2024 by Georg Brandl, Matthäus Chajdas and contributors.

$ dpkg -l | grep pygments

ii  python3-pygments                                 2.18.0+dfsg-2                             all          syntax highlighting package written in Python 3

たぶん何かの設定間違いですよね。なんだろう?

ソースコードを見る

Debian Testingでは最新版もしくはかなり新しいバージョンが採用されているはずですが「定義個所、参照個所が検知できない問題」が発生します。原因がさっぱりわからないのでglobalのソースコードを見ました。

globalでCtagsを参照しているらしき場所

# Debian Testingのglobalのコード
# global-6.6.14/plugin-factory/pygments_parser.py

def handle_requests(langmap, options):
    # Update ctags's path from the configuration file
    global UNIVERSAL_CTAGS
    path = load_ctags_path()
    if path != '':
       UNIVERSAL_CTAGS = path
    if UNIVERSAL_CTAGS != '' and UNIVERSAL_CTAGS != 'no':
        pygments_parser = PygmentsParser(langmap, options)
        try:
            ctags_parser = CtagsParser(UNIVERSAL_CTAGS, options)
            parser = MergingParser(ctags_parser, pygments_parser)
        except Exception as e:
            parser = pygments_parser
    else:
        parser = PygmentsParser(langmap, options)
#...


# (比較用)Ubuntu 24.04のglobalのコード
# global-6.6.11/plugin-factory/pygments_parser.py

def handle_requests(langmap, options):
    # Update ctags's path from the configuration file
    global EXUBERANT_CTAGS
    path = load_ctags_path()
    if path != '':
       EXUBERANT_CTAGS = path
    if EXUBERANT_CTAGS != '' and EXUBERANT_CTAGS != 'no':
        pygments_parser = PygmentsParser(langmap, options)
        try:
            ctags_parser = CtagsParser(EXUBERANT_CTAGS, options)
            parser = MergingParser(ctags_parser, pygments_parser)
        except Exception as e:
            parser = pygments_parser
    else:
        parser = PygmentsParser(langmap, options)
#...

コードからはDebian Testing側はuniversal-ctagsを参照していて、Ubuntu 24.04側はexuberant-ctagsを参照しているように見えます。公式サイト(https://www.gnu.org/software/global/)を改めて確認すると、"supports 25 languages by Pygments + Universal Ctags plug-in parser."と書いてありました。これは知らなかったです。

Internet Archiveで見ると2016年11月くらいにExuberant CtagsからUniversal Ctagsに表記が変わっていました。Release noteを見ると6.6.11(2023年11月リリース)でExuberant Ctagsがサポート外と記述されています。なぜ6.6.11を採用しているUbuntu 24.04でExuberant Ctagsが使えるのか謎が残りますが、深追いしてもあまり意味はないでしょう……。

Debian Testingではuniversal-ctagsを使おう
$ sudo apt-get purge exuberant-ctags
$ sudo apt-get install universal-ctags

話を戻すと、Debian Testingでは上記のようにexuberant-ctagsをアンインストールして、universal-ctagsをインストール(Debian系ならalternativesで切り替えても良いかも)すれば良いはずです。

globalの動作確認
#### Cの関数定義、参照個所を探す

$ global -x cfunc_b
cfunc_b             1 b.c              int cfunc_b(int b)

$ global -rx cfunc_b
cfunc_b             3 a.c              int cfunc_b(int b);
cfunc_b             7 a.c               return cfunc_b(a) + 1;


#### Pythonの関数定義、参照個所を探す

$ global -x pyfunc_b
pyfunc_b            1 b.py             def pyfunc_b(b: int):

$ global -rx pyfunc_b
pyfunc_b            1 a.py             from b import pyfunc_b
pyfunc_b            4 a.py                 return pyfunc_b(a) + 1


#### grepモードでCもPythonも網羅的に探す

$ global -gx func
func                3 a.c              int cfunc_b(int b);
func                5 a.c              int cfunc_a(int a)
func                7 a.c               return cfunc_b(a) + 1;
func               13 a.c               printf("%d\n", cfunc_a(a));
func                1 a.py             from b import pyfunc_b
func                3 a.py             def pyfunc_a(a: int):
func                4 a.py                 return pyfunc_b(a) + 1
func                7 a.py                 print(f"{pyfunc_a(5)}")
func                1 b.c              int cfunc_b(int b)
func                1 b.py             def pyfunc_b(b: int):

改善されました。良かった良かった。次回はUbuntuです。

編集者:すずき(2025/11/02 00:28)

コメント一覧

  • コメントはありません。
open/close この記事にコメントする



2025年10月27日

GNU global + pygmentsでC/C++/Pythonのタグジャンプ

目次: Linux

プログラムの関数、変数の定義元や参照先に一瞬で飛べるタグジャンプ機能を使っている人は多いと思います。私もGNU globalを使ってタグを生成、vim/gvimでタグジャンプを利用していて、とても便利です。

今まではC/C++のコードを読むことが多かったため、global単体で事足りました。最近はPythonのコードを読むことも増えまして、Pythonもタグジャンプできるように環境を整えることにしました。global単体ではPythonに対応していないので、プラグインとしてpygmentsを使います。exuberant-ctagsのインストールもお忘れなく。

もっとも単純なセットアップ方法&使い方はこんな感じです。

GNU global + pygmentsのインストール、タグ作成
$ sudo apt-get install global python-is-python3 python3-pygments exuberant-ctags

$ gtags --gtagslabel=pygments

下記のテストプログラムを使って、タグが正しく作成されたか確認しましょう。

C言語のテストコード

//// a.c

#include <stdio.h>

int cfunc_b(int b);

int cfunc_a(int a)
{
	return cfunc_b(a) + 1;
}

int main(int argc, char *argv[])
{
	int a = 5;
	printf("%d\n", cfunc_a(a));
	return 0;
}


//// b.c

int cfunc_b(int b)
{
	return b + 2;
}
Pythonのテストコード

#### a.py

from b import pyfunc_b

def pyfunc_a(a: int):
    return pyfunc_b(a) + 1

if __name__ == "__main__":
    print(f"{pyfunc_a(5)}")


#### b.py

def pyfunc_b(b: int):
    return b + 2

テストとして基本的な機能3つを確かめます。

  • CとPythonの関数定義を探せる
  • CとPythonの参照個所を探せる(-rオプション)
  • Grepモード(-gオプション)でfuncを検索してCの関数定義(cfunc)とPythonの関数定義(pyfunc)を両方探せる
globalの基本機能のテスト
#### Cの関数定義、参照個所を探す

$ global -x cfunc_b
cfunc_b             1 b.c              int cfunc_b(int b)

$ global -rx cfunc_b
cfunc_b             3 a.c              int cfunc_b(int b);
cfunc_b             7 a.c               return cfunc_b(a) + 1;


#### Pythonの関数定義、参照個所を探す

$ global -x pyfunc_b
pyfunc_b            1 b.py             def pyfunc_b(b: int):

$ global -rx pyfunc_b
pyfunc_b            1 a.py             from b import pyfunc_b
pyfunc_b            4 a.py                 return pyfunc_b(a) + 1


#### grepモードでCもPythonも網羅的に探す

$ global -gx func
func                3 a.c              int cfunc_b(int b);
func                5 a.c              int cfunc_a(int a)
func                7 a.c               return cfunc_b(a) + 1;
func               13 a.c               printf("%d\n", cfunc_a(a));
func                1 a.py             from b import pyfunc_b
func                3 a.py             def pyfunc_a(a: int):
func                4 a.py                 return pyfunc_b(a) + 1
func                7 a.py                 print(f"{pyfunc_a(5)}")
func                1 b.c              int cfunc_b(int b)
func                1 b.py             def pyfunc_b(b: int):

参照個所を探す機能は地味に便利なので、CでもPythonでも動作してくれるのはありがたいですね。

続きます

こんなあっさり動けば苦労はないですが、実はDebian TestingでもUbuntu 24.04でも微妙に動きませんでした。あまり使われていないのかもしれない。悲しい。次回はトラブルシューティング編です。

編集者:すずき(2025/10/30 23:24)

コメント一覧

  • コメントはありません。
open/close この記事にコメントする



link もっと前
2025年11月7日 >>> 2025年10月25日
link もっと後

管理用メニュー

link 記事を新規作成

<2025>
<<<11>>>
------1
2345678
9101112131415
16171819202122
23242526272829
30------

最近のコメント20件

  • link 25年10月6日
    すずきさん (10/10 13:14)
    「ですね。ccはもはやコンパイラというより...」
  • link 25年10月6日
    hdkさん (10/10 08:27)
    「ただのHello, worldでも試して...」
  • link 25年9月29日
    すずきさん (10/03 00:29)
    「なんと、メタパッケージ入れてなかったです...」
  • link 25年9月29日
    hdkさん (10/02 06:51)
    「あれ、dkmsは自動ビルドされるのが便利...」
  • link 20年8月24日
    すずきさん (08/30 22:06)
    「ですね、自分も今はPulseAudioを...」
  • link 20年8月24日
    hdkさん (08/29 09:32)
    「ALSA懐かしい... PulseAud...」
  • link 16年2月14日
    すずきさん (08/04 01:31)
    「お役に立ったようでしたら幸いです。」
  • link 16年2月14日
    enc28j60さん (08/03 17:40)
    「ちょうど詰まっていたところです。\n非常...」
  • link 25年7月20日
    すずきさん (07/30 00:10)
    「ギクシャクするのは減速時の2速シフトダウ...」
  • link 25年7月20日
    hdkさん (07/29 07:38)
    「2速発進でギクシャクするんですか? 面白...」
  • link 25年7月20日
    すずきさん (07/28 23:16)
    「なるほど。レガシィB4のATはDレンジで...」
  • link 25年7月20日
    hdkさん (07/28 21:28)
    「MT車でも1速はギクシャクするので完全に...」
  • link 25年7月20日
    すずきさん (07/28 00:44)
    「何日か乗ってみて気づいたんですが、Dレン...」
  • link 25年7月20日
    hdkさん (07/22 22:59)
    「2速発進って雪道モードっぽさがありますが...」
  • link 20年8月16日
    すずきさん (07/21 23:27)
    「ありがとうございます。リアル志向が肌に合...」
  • link 20年8月16日
    こここさん (07/21 12:19)
    「個人的でも「正直な感想」と「おすすめのハ...」
  • link 20年8月16日
    すずきさん (07/01 01:11)
    「そうですね。残念ながら私には向いてなかっ...」
  • link 20年8月16日
    ざんねんさん (06/29 17:12)
    「ゲーム内容を理解していない人の残念な雑記」
  • link 24年6月17日
    すずきさん (06/05 23:32)
    「Thnaks for your info...」
  • link 24年6月17日
    Bobさん (06/04 09:25)
    「BindIPv6Only=no does...」

最近の記事3件

  • link 23年4月10日
    すずき (11/04 16:20)
    「[Linux - まとめリンク] 目次: Linuxカーネル、ドライバ関連。Linux kernel 2.4 for ARMが...」
  • link 09年5月18日
    すずき (11/04 16:19)
    「[ffmpegとlibx264] 目次: LinuxせっかくDVDという長めの映像コンテンツが手元にあるので、ffmpegで変...」
  • link 25年10月31日
    すずき (11/02 03:19)
    「[GNU global + pygmentsトラブルシューティングUbuntu編] 目次: Linux先日(2025年10月2...」
link もっとみる

こんてんつ

open/close wiki
open/close Linux JM
open/close Java API

過去の日記

open/close 2002年
open/close 2003年
open/close 2004年
open/close 2005年
open/close 2006年
open/close 2007年
open/close 2008年
open/close 2009年
open/close 2010年
open/close 2011年
open/close 2012年
open/close 2013年
open/close 2014年
open/close 2015年
open/close 2016年
open/close 2017年
open/close 2018年
open/close 2019年
open/close 2020年
open/close 2021年
open/close 2022年
open/close 2023年
open/close 2024年
open/close 2025年
open/close 過去日記について

その他の情報

open/close アクセス統計
open/close サーバ一覧
open/close サイトの情報

合計:  counter total
本日:  counter today

link About www.katsuster.net
RDFファイル RSS 1.0

最終更新: 11/04 16:20