2018年11月13日火曜日

Python の prompt-toolkit v2 の Completer を使ってみる

python script をコマンドラインから使う場合、設定ファイルを引数で指定したりするのだが、 色々なケースで使うようになると、 設定ファイルが増えてきて、 ファイル名の確認が面倒になっていた。

そこで、script 内にデフォルトディレクトリを指定しておいて、 globでファイル名リストを作成して、 コンソールで入力補完させてみては、というもの。

自分で考えた訳ではなく、 4 Python libraries for building great command-line user interfaces | Opensource.com を見て、prompt tool kit v2 のドキュメントを見ながらアレンジした次第。

fuzzyfinder は私のレベルでは、不要かもしれないが、 将来使うかもしれないので、一応、入れたままにした。 history は外した。で、こんな感じ。


スクリプトはこんなもん。



#!~/.pyenv/shims/python
"""Test of prompt-toolkit."""
#

from pathlib import Path

from fuzzyfinder import fuzzyfinder
from prompt_toolkit import prompt
from prompt_toolkit import print_formatted_text as pprint
from prompt_toolkit.completion import Completer, Completion

# from prompt_toolkit.history import FileHistory
# from prompt_toolkit.auto_suggest import AutoSuggestFromHistory


class MyfileCompleter(Completer):
    """Set Completer."""

    def get_completions(self, document, complete_event):
        """Get Completer."""
        globbed_path = Path('~/Documents/tours/_config_master').expanduser()
        inifile_list = [f.name for f in globbed_path.glob("*.ini")]
        word_before_cursor = document.get_word_before_cursor(WORD=True)
        matches = fuzzyfinder(word_before_cursor, inifile_list)
        for m in matches:
            yield Completion(m, start_position=-len(word_before_cursor))


def main():
    """Main process."""
    #

    user_input = prompt(
        'Select set file >',
        # history=FileHistory('history.txt'),
        # auto_suggest=AutoSuggestFromHistory(),
        completer=MyfileCompleter(),)

    pprint('select "%s"' % user_input)


if __name__ == '__main__':
    main()
#

こんなインターフェースにしておけば、 設定ファイルの名前を冗長にできるかも、と思ってしまった。

0 件のコメント:

コメントを投稿

麻のボディタオル

2018年の秋(まだ、自転車を封印してない)、 近江上布伝統産業会館 で、興味からボディタオルを購入した。 お、よかった。: 自然派パン工房 ふるさとの道 ほぼ毎日風呂で使ってきて、ついに寿命がきたようだ。 お店の方に、「糸が痩せて破れてくる」まで使える、と...