コグノスケ


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------

最近のコメント5件

  • 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を...」

最近の記事20件

  • 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 25年10月22日
    すずき (11/02 02:58)
    「[NTPで時刻をすぐに合わせたい] 目次: LinuxNTPで時刻を調整する方法は2つあって、ズレている時間をジワジワ合わせて...」
  • link 23年6月1日
    すずき (11/02 02:42)
    「[自宅サーバー - まとめリンク] 目次: 自宅サーバーこの日記システム、Wikiの話。カウンターをPerlからPHPに移植日...」
  • link 05年11月23日
    すずき (11/02 02:41)
    「[NTPで時計合わせ、その2] 目次: 自宅サーバー11/23現在、未だGoogle先生に捕捉されていない奇跡。それはさておき...」
  • link 05年11月22日
    すずき (11/02 02:41)
    「[NTPで時計合わせ] 目次: 自宅サーバーパソコンの時計は勝手にどんどんずれていきます。放って置くと1分くらいずれていること...」
  • link 15年5月8日
    すずき (11/02 02:40)
    「[GPSは世界一正確な時計、その2] 目次: 自宅サーバー前回(2015年3月9日の日記参照)はGPSモジュールをPCと接続し...」
  • link 15年3月9日
    すずき (11/02 02:40)
    「[GPSは世界一正確な時計] 目次: 自宅サーバーGPSのレシーバーモジュールを買いました。Globalsat BU-353S...」
  • link 25年10月29日
    すずき (11/02 00:28)
    「[GNU global + pygmentsトラブルシューティングDebian編] 目次: Linux先日(2025年10月2...」
  • link 25年10月27日
    すずき (10/30 23:24)
    「[GNU global + pygmentsでC/C++/Pythonのタグジャンプ] 目次: Linuxプログラムの関数、変...」
  • link 25年10月15日
    すずき (10/19 16:54)
    「[PipeWireの音切れ問題 - サーバー側の設定確認と反映] 目次: ALSAPipeWireに変えてから音切れがなくなり...」
  • link 25年10月18日
    すずき (10/19 16:52)
    「[PipeWireの音切れ問題 - サーバー側PipeWireの設定] 目次: ALSAPipeWireに変えてから音切れがな...」
  • link 22年5月5日
    すずき (10/19 16:49)
    「[ALSA - まとめリンク] 目次: ALSAALSAの話。ALSAその1 - 使ってみようALSAその2 - カードとデバ...」
  • link 25年10月19日
    すずき (10/19 16:47)
    「[PipeWireの音切れ問題 - サーバー側pipewire-pulseの設定] 目次: ALSA未だにPipeWireの音...」
  • link 23年4月11日
    すずき (10/19 14:55)
    「[ブラウザー/メーラー - まとめリンク] 目次: ブラウザー/メーラー関係の深いまとめリンク。目次: Linuxブラウザー。...」
  • link 06年4月22日
    すずき (10/19 14:54)
    「[Seamonkey/Firefoxのメモリ使用量最小化] 目次: ブラウザー/メーラーGIGAZINE 2006年4月15日...」
  • link 25年10月17日
    すずき (10/19 14:53)
    「[Linux版Firefoxアドレスバーの黒線] 目次: ブラウザー/メーラーLinuxデスクトップマシンのFirefox(1...」
  • link 25年10月6日
    すずき (10/16 03:20)
    「[makeのデフォルトルールのリンクはLDを使わない] 目次: LinuxMakefileの達人には常識かもしれませんが、ma...」
  • link 25年10月13日
    すずき (10/16 03:19)
    「[PipeWireをPulseAudioサーバーの代わりにする、その2 - 音切れ多発] 目次: ALSA先日(2025年10...」
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