検索文字列に "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 件のコメント:
コメントを投稿