Linuxターミナルでオートコンプリートをコーディングしたいと思います。コードは次のように動作するはずです。
文字列のリストがあります(例: "hello、" hi "、" how are you "、" goodbye "、" great "、...)。
ターミナルでは、ユーザーは入力を開始し、一致する可能性がある場合、可能な文字列のヒントを取得し、そこから選択することができます( vim editor または googleインクリメンタル検索)と同様 )。
例えば彼は「h」と入力し始め、ヒントを得る
こんにちは"
_ "私"
_「お元気ですか」
さらに良いのは、最初からだけでなく、文字列の任意の部分から単語を補完する場合です。
アドバイスありがとうございます。
(これはまさにあなたが求めているものではないことを知っていますが)に表示されるオートコンプリート/提案に満足している場合 TAB (多くのシェルで使用されています)、 readline モジュールを使用すると、すぐに起動して実行できます。
readlineに関するDoug HellmannのPyMOTWの記事 に基づく簡単な例を示します。
import readline
class MyCompleter(object): # Custom completer
def __init__(self, options):
self.options = sorted(options)
def complete(self, text, state):
if state == 0: # on first trigger, build possible matches
if text: # cache matches (entries that start with entered text)
self.matches = [s for s in self.options
if s and s.startswith(text)]
else: # no text entered, all matches possible
self.matches = self.options[:]
# return match indexed by state
try:
return self.matches[state]
except IndexError:
return None
completer = MyCompleter(["hello", "hi", "how are you", "goodbye", "great"])
readline.set_completer(completer.complete)
readline.parse_and_bind('tab: complete')
input = raw_input("Input: ")
print "You entered", input
これにより、次の動作(<TAB>
押されているタブキーを表します):
Input: <TAB><TAB>
goodbye great hello hi how are you
Input: h<TAB><TAB>
hello hi how are you
Input: ho<TAB>ow are you
最後の行(HOTAB 入力)、一致する可能性のあるものは1つだけで、「how are you」という文全体が自動補完されます。
readline
の詳細については、リンクされた記事をご覧ください。
「さらに良いのは、最初からだけでなく、文字列の任意の部分からの補完だけでなく、単語を補完する場合です。」
これは、コンプリーター関数の一致基準を変更するだけで実現できます。から:
self.matches = [s for s in self.options
if s and s.startswith(text)]
次のようなものに:
self.matches = [s for s in self.options
if text in s]
これにより、次の動作が得られます。
Input: <TAB><TAB>
goodbye great hello hi how are you
Input: o<TAB><TAB>
goodbye hello how are you
スクロール/検索用の擬似メニューを作成する簡単な方法は、キーワードを履歴バッファーにロードすることです。その後、上/下矢印キーを使用してエントリをスクロールし、使用することができます Ctrl+R 逆検索を実行します。
これを試すには、次の変更を行います。
keywords = ["hello", "hi", "how are you", "goodbye", "great"]
completer = MyCompleter(keywords)
readline.set_completer(completer.complete)
readline.parse_and_bind('tab: complete')
for kw in keywords:
readline.add_history(kw)
input = raw_input("Input: ")
print "You entered", input
スクリプトを実行するときに、入力してみてください Ctrl+r に続く a。これは、「a」を含む最初の一致を返します。入る Ctrl+r 再び次の試合に向けて。エントリを選択するには、を押します ENTER。
また、上/下キーを使用してキーワードをスクロールしてみてください。
ユーザーがキーを押す必要があると思います。
次のような方法でそれを実現できます(Enterキーを押さずに)。
import termios, os, sys
def getkey():
fd = sys.stdin.fileno()
old = termios.tcgetattr(fd)
new = termios.tcgetattr(fd)
new[3] = new[3] & ~termios.ICANON & ~termios.ECHO
new[6][termios.VMIN] = 1
new[6][termios.VTIME] = 0
termios.tcsetattr(fd, termios.TCSANOW, new)
c = None
try:
c = os.read(fd, 1)
finally:
termios.tcsetattr(fd, termios.TCSAFLUSH, old)
return c
次に、このキーがタブキー(たとえば、実装する必要があるもの)である場合、すべての可能性をユーザーに表示します。それが他のキーである場合は、標準出力に印刷します。
ああ、もちろん、ユーザーがEnterキーを押す限り、しばらくの間getkey()をループさせる必要があります。 raw_inputなどのメソッドを取得することもできます。このメソッドは、タブを押すとWord全体を記号ごとに取得するか、すべての可能性を表示します。
少なくともこれがアイテムです。最初から始めることができます。他の問題が発生した場合は、それらについて書いてください。
編集1:
Get_Wordメソッドは次のようになります。
def get_Word():
s = ""
while True:
a = getkey()
if a == "\n":
break
Elif a == "\t":
print "all possibilities"
else:
s += a
return s
Word = get_Word()
print Word
私が今発生している問題は、サインを表示する方法です。あなたは、入力とスペースなしで入力したばかりで、両方ともprint a
およびprint a,
します。
Pythonシェルでオートコンプリートを有効にするには、次のように入力します。
import rlcompleter, readline
readline.parse_and_bind('tab:complete')
(おかげで http://blog.e-Shell.org/221 )
手順:
次のコマンドでホームディレクトリに.pythonrcファイルを作成します:vi .pythonrc
このコンテンツを入力してください:
import rlcompleter, readline
readline.parse_and_bind('tab:complete')
ファイルを閉じます
今すぐ実行
echo "export PYTHONSTARTUP=~/.pythonrc" >> ~/.bashrc
ターミナルを再起動します
インタプリタでオートコンプリートを検索する(私のような)場合は、次のようになります。
これには、ファイルの作成.pythonrc
、変更.bashrc
と import sys
Pythonインタープリターを起動するたびにインポートする必要があります。
後者はさらに勝つために自動化できるのだろうか。