日本語検索を「かな漢字変換」を通さずにやる。その3

日本語検索を「かな漢字変換」を通さずにやる。その2を受けて…。

検索文字列に "class" を指定したのに "分類" などが引っかかってくる(かつ "クラス" などが含まれない)と、「一体何でキミはここにいるのかね?」な状況になって困惑してしまいます。そこで、"ripgrep" や "The Platinum Searcher" の出力のように、マッチした文字列をエスケープシーケンスで強調するようにしてみました。

こんな感じです。
BRIGHT_RED = "\033[91m"
BRIGHT_GREEN = "\033[92m"
BRIGHT_YELLOW = "\033[93m"
BRIGHT_BLUE = "\033[94m"
BRIGHT_MAGENTA = "\033[95m"
BRIGHT_CYAN = "\033[96m"
BRIGHT_WHITE = "\033[97m"
DEFAULT = "\033[39m"

def search_in_lsr(pat, dirs):
    """search pat in ls-R files"""
    for target in dirs:
        logger.debug("finding in %s", target)
        try:
            with open(target + "/ls-R", "r", encoding="utf-8") as f:
                lines = f.readlines()

                for line in lines:
                    if res := pat.search(line):
                        line = pat.sub(BRIGHT_CYAN + res.group() + DEFAULT, line)
                        print(target + line, end="")
        except FileNotFoundError as e:
            print(e)
            print(f'run "mp4lsr.py {target}" to generate ls-R files.')
            sys.exit(1)
ファイル名のリストは、mktexlsrの作成する "ls-R" ファイルのように、「このディレクトリ以下のファイルリスト」という形で、いくつかのディレクトリに散らばっています。

例にしてあげるとこんな感じ。
M: -+- 自然科学 -+- 物理学
    |            +- 化学
    |            +- ・・・
    |            +- ls-R
    |
    +- 文化芸術 -+- 音楽 -+- クラシック
                 |        +- 雅楽
                 |        +- 民謡
                 |        +- ・・・
                 |        +- ls-R
                 +- 美術
                 +- ・・・
言ってみれば、ジャンルごとにそのディレクトリツリーの "ls-R" ファイルを作成するわけです。

引数のpatはCMigemoが出力してきた正規表現をre.compileした正規表現オブジェクト、dirsは "ls-R" が置いてあるディレクトリのリストです。
pat.search(line)Nullでなければ、マッチした文字列をすべてエスケープシーケンスで囲むように置換する、という処理をしています。

ところがこれをコマンドプロンプトでやると、指定したエスケープシーケンスが文字のママ出力されてしまい、一層困惑することになります。

そこでPython Windows10 において Console 出力に色を付けるを参考にコマンドプロンプトをVT互換のエスケープシーケンスを処理するように設定することで、一致した文字列を強調できるようになりました。Microsoftによる日本語の解説はコンソールの仮想ターミナル シーケンスにあります。

自画自賛なんですがめちゃくちゃ便利。

0 件のコメント:

コメントを投稿

AstroNvimでtelescope.nvimがエラーを吐いたとき。

Windowsの環境でAstroNvimをインストールして、Find Fileしたらtelescopeがエラーを吐いてきました。 メッセージは、 Failed to run `config` for telescope.nvim ...a/lazy/telescope.nvim/...