iniview.pyw 技術ドキュメント

プログラムの動作

iniview.pyw は、INIファイルやその他のテキストファイルをグラフィカルユーザーインターフェース (GUI) で表示、検索、および管理するためのPythonアプリケーションです。特に、従来のINIパーサーでは扱いにくい、複数行にわたるINIエントリ(3重引用符で囲まれた値)の表示に特化しています。これにより、大規模な設定ファイルや複雑な設定構造を持つファイルを効率的に閲覧・管理できます。

主な機能は以下の通りです。

  • ファイル読み込みと解析: INIファイルだけでなく、一般的なテキストファイルも読み込み、内容を表示します。INIファイルの場合、キーと値のペアを解析し、特に3重引用符で囲まれた複数行の値を正しく扱います。

  • エンコーディング自動検出: chardet ライブラリを使用して、読み込むファイルの文字エンコーディングを自動的に検出します。

  • GUI表示:

    • 左ペインにファイル内のキーを階層的に(バックスラッシュ \ で区切られたキーはフォルダのように)表示するTreeview。

    • 右ペインに選択されたキーに対応する値を表示するテキストエディタ。

  • 検索機能: キー名または値の内容に基づいて、ファイル内のエントリを検索し、結果間を移動できます。

  • コピー機能: 選択したキーの値、または右ペインのテキストコンテンツをクリップボードにコピーできます。

  • 外部コマンド実行: iniview.ini 設定ファイルで定義された外部コマンドを、現在のファイルパスやINIファイル内の値、環境変数を組み合わせて実行できます。

  • ファイル/ターミナル操作: 現在開いているファイルの保存場所をエクスプローラ/Finder/ファイルマネージャーで開いたり、そのディレクトリでターミナルを開いたりする機能を提供します。

  • 設定永続化: ウィンドウのサイズ、ペインの分割位置、最後に開いたファイルパス、および定義された外部コマンドなどのユーザー設定を iniview.ini ファイルに保存し、次回起動時にロードします。

  • 表示オプション: 右ペインのテキストエディタで、長い行の自動折り返し表示を切り替えることができます。

このプログラムは、設定ファイルの閲覧と管理の効率を高めることを目的としています。

原理

iniview.pyw は、以下の主要な原理に基づいて動作します。

  1. ファイルエンコーディングの検出: ファイルを開く前に、chardet ライブラリを使用してファイルのバイナリデータを分析し、最も可能性の高い文字エンコーディングを検出します。これにより、多種多様なエンコーディングで保存されたファイルを正しく表示できます。

  2. INIファイルの解析: parse_multiline_ini 関数がINIファイルの解析を担います。

    • ファイルの内容を一行ずつ読み込みます。

    • 行が key=value 形式であれば、キーと値を抽出します。

    • 特に、value が「3重引用符」で始まる場合、複数行の値が続くと判断し、次の「3重引用符」が現れるまでの複数行をすべてそのキーの値として連結します。これにより、複雑なスクリプトや長いテキストをINIファイル内に埋め込むことが可能になります。

    • 解析されたキーと値のペアはPythonの辞書として保持されます。

    • キーに \ が含まれている場合、GUIのTreeviewではこれを階層構造として解釈し、視覚的に整理された表示を提供します。

  3. グラフィカルユーザーインターフェース (GUI): tkinterttkbootstrap ライブラリを使用してGUIを構築します。

    • tk.PanedWindow を使用してウィンドウを左右のペインに分割し、ユーザーが自由にペインサイズを変更できるようにします。

    • 左ペインには ttkbootstrap.widgets.Treeview を配置し、INIファイルのキーをツリー構造で表示します。

    • 右ペインには tk.Text ウィジェットを配置し、Treeviewで選択されたキーに対応する値を整形して表示します。

    • メニューバーやコンテキストメニューを通じて、ファイル操作、検索、コピーなどの機能を提供します。

  4. 設定の永続化: configparser モジュールを利用して、アプリケーションの終了時に現在のウィンドウの状態(サイズ、位置、ペインの分割、最後に開いたファイル、外部コマンドの設定)を iniview.ini ファイルに保存し、次回起動時にその設定を読み込んで再現します。これにより、ユーザーは常に慣れた環境で作業を再開できます。

  5. 外部コマンドの実行: ユーザーが設定ファイル iniview.ini に定義した外部コマンドは、subprocess モジュールを使用して実行されます。コマンド文字列内の {{file_path}} (現在のファイルのパス)、{{VAR_NAME}} (INIファイル内の対応するキーの値)、および環境変数などは、実行前に実際の値に置換されます。これにより、様々な外部ツールと連携して作業を効率化できます。

必要な非標準ライブラリとインストール方法

iniview.pyw を実行するには、以下の非標準Pythonライブラリが必要です。

  • chardet: ファイルの文字エンコーディングを自動検出するために使用されます。

  • ttkbootstrap: Tkinterのウィジェットにモダンなテーマとスタイルを提供します。

これらのライブラリは pip コマンドを使用してインストールできます。

pip install chardet ttkbootstrap

必要な入力ファイル

iniview.pyw は、主に以下の種類のファイルを読み込みます。

  1. INIファイル (例: .ini):

    • キーと値のペアを含む設定ファイルです。

    • key=value の形式をサポートします。

    • 特に、key="""...""" のように「3重引用符」で囲まれた複数行の値をサポートします。

    • キーにバックスラッシュ \ を含めることで、GUI上で階層的な表示が可能です (例: section\subsection\key=value)。

    • コメント行は # で始まります。

    INIファイルの例:

    # これはコメント行です
    app_name=IniViewer
    version=1.0
    db_config\host=localhost
    db_config\port=5432
    multiline_message="""
    これは
    複数行にわたる
    メッセージです。
    """
    path_to_logs=/var/log/myapp
    
  2. その他のテキストファイル: .ini 以外の拡張子を持つファイル(例: .txt, .log, .py, .c, .f など)も読み込み可能です。これらのファイルは、ファイル全体が単一の「all」というキーの値として扱われ、右ペインにその内容が表示されます。

  3. iniview.ini (設定ファイル):

    • プログラムが起動時に自動的に探し、読み込む設定ファイルです。

    • プログラムの実行ディレクトリに存在することが期待されます。

    • [Window] セクション: ウィンドウのジオメトリ、最後に開いたファイルパス、ペインの分割位置などを保存します。

      • geometry: ウィンドウのサイズと位置 (例: 800x600+100+100)

      • last_file: 最後に開いたファイルの絶対パス

      • sash: 左ペインの幅(ピクセル単位)

    • [paths] セクション: 外部コマンドの定義を保存します。

      • external_cmdX_name: メニューに表示されるコマンド名 (例: external_cmd1_name=メモ帳で開く)

      • external_cmdX_path: 実行するコマンドのパスと引数。{{file_path}} は現在のファイルパスに、{{KEY_NAME}} はINIファイル内の対応するキーの値に、{{ENV_VAR}} は環境変数に置換されます (例: external_cmd1_path=notepad.exe "{{file_path}}")

    iniview.ini の例:

    [Window]
    geometry=1024x768+50+50
    last_file=C:\Projects\my_app\config.ini
    sash=300
    
    [paths]
    external_cmd1_name=VS Codeで開く
    external_cmd1_path=code.exe "{{file_path}}"
    external_cmd2_name=Pythonで実行
    external_cmd2_path=python.exe "{{file_path}}" {{arg1}} {{arg2}}
    

生成される出力ファイル

iniview.pyw は、以下の設定ファイルをプログラム実行ディレクトリに生成または更新します。

  • iniview.ini:

    • プログラムの終了時に、現在のアプリケーションの状態とユーザー設定がこのファイルに保存されます。

    • 保存される主な情報:

      • ウィンドウのジオメトリ: プログラム終了時のウィンドウサイズと位置。

      • 最後に開いたファイル: ユーザーが最後に開いたINIファイルまたはテキストファイルのパス。

      • ペインの分割位置: 左右のペイン間の分割バーの位置。

      • 外部コマンド設定: [paths] セクションで定義されたすべての外部コマンドの名前とパス。

    このファイルは、次回プログラム起動時に読み込まれ、ユーザーの作業環境を復元するために使用されます。

コマンドラインでの使用例 (Usage)

iniview.pyw は、コマンドライン引数としてINIファイルまたはテキストファイルのパスを受け取ることができます。引数なしで実行した場合、設定ファイル (iniview.ini) に保存された最後に開いたファイル(存在すれば)をロードします。

基本的な実行コマンドは以下の通りです。

python iniview.pyw [ファイルパス]

または、Pythonインタープリタが .pyw ファイルに関連付けられている場合は、直接実行できます。

iniview.pyw [ファイルパス]
  • [ファイルパス]: 開きたいINIファイルまたはテキストファイルの絶対パスまたは相対パスを指定します。

コマンドラインでの具体的な使用例

1. 引数なしでプログラムを起動する

python iniview.pyw

実行結果: iniview.pyw が起動し、iniview.ini ファイルに保存されているウィンドウ設定(サイズ、位置、ペイン分割)が適用されます。もし iniview.inilast_file の設定があり、そのファイルが存在すれば、そのファイルが自動的に読み込まれて表示されます。

2. 特定のINIファイルを指定して起動する

my_config.ini という名前のINIファイルがあり、そのパスが C:\Users\User\Documents\my_config.ini であると仮定します。

python iniview.pyw C:\Users\User\Documents\my_config.ini

実行結果: iniview.pyw が起動し、C:\Users\User\Documents\my_config.ini の内容が解析されてGUIに表示されます。左ペインにはキーのツリー、右ペインには選択されたキーの値が表示されます。プログラムを終了すると、この my_config.ini のパスが iniview.inilast_file として保存されます。

3. テキストファイルを指定して起動する

my_log.txt という名前のログファイルがあり、そのパスが /home/user/logs/my_log.txt であると仮定します。

python iniview.pyw /home/user/logs/my_log.txt

実行結果: iniview.pyw が起動し、/home/user/logs/my_log.txt の内容が読み込まれます。このファイルはINI形式ではないため、ファイル全体が単一の「all」というキーの値として扱われ、右ペインにファイルの内容全体が表示されます。