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