Pertanyaan Cara membuat python, program command-line autocomplete sewenang-wenang BUKAN penerjemah


Saya sadar bagaimana mengatur pelengkapan otomatis objek python di interpreter python (pada unix).

  • Google menampilkan banyak klik untuk penjelasan tentang cara melakukan ini.
  • Sayangnya, ada banyak referensi yang sulit untuk menemukan apa yang perlu saya lakukan, yang sedikit berbeda.

Saya perlu tahu cara mengaktifkan, tab / auto completion item arbitrary dalam program baris perintah yang ditulis dengan python.

Kasus penggunaan khusus saya adalah program python baris perintah yang perlu mengirim email. Saya ingin dapat secara otomatis melengkapi alamat email (saya memiliki alamat pada disk) ketika pengguna mengetikkan bagiannya (dan secara opsional menekan tombol TAB).

Saya tidak membutuhkannya untuk bekerja di windows atau mac, hanya linux.


76
2017-10-09 14:55


asal


Jawaban:


Gunakan Python readline bindings. Sebagai contoh,

import readline

def completer(text, state):
    options = [i for i in commands if i.startswith(text)]
    if state < len(options):
        return options[state]
    else:
        return None

readline.parse_and_bind("tab: complete")
readline.set_completer(completer)

Resmi dokumen modul tidak jauh lebih rinci, lihat dokumen readline untuk info lebih lanjut.


49
2017-10-09 15:01



Ikuti dokumentasi cmd dan kamu akan baik-baik saja

import cmd

addresses = [
    'here@blubb.com',
    'foo@bar.com',
    'whatever@wherever.org',
]

class MyCmd(cmd.Cmd):
    def do_send(self, line):
        pass

    def complete_send(self, text, line, start_index, end_index):
        if text:
            return [
                address for address in addresses
                if address.startswith(text)
            ]
        else:
            return addresses


if __name__ == '__main__':
    my_cmd = MyCmd()
    my_cmd.cmdloop()

Output untuk tab -> tab -> kirim -> tab -> tab -> f -> tab

(Cmd)
help  send
(Cmd) send
foo@bar.com            here@blubb.com         whatever@wherever.org
(Cmd) send foo@bar.com
(Cmd)

52
2017-10-09 15:08



Karena Anda mengatakan "NOT interpreter" dalam pertanyaan Anda, saya kira Anda tidak ingin jawaban yang melibatkan python readline dan semacamnya. (sunting: di belakang, itu jelas tidak terjadi. Ho hum. Saya pikir info ini menarik, jadi saya akan meninggalkannya di sini.


27
2017-10-13 09:59



Saya terkejut bahwa tidak ada yang menyebutkan argcomplete, di sini adalah contoh dari dokumen:

from argcomplete.completers import ChoicesCompleter

parser.add_argument("--protocol", choices=('http', 'https', 'ssh', 'rsync', 'wss'))
parser.add_argument("--proto").completer=ChoicesCompleter(('http', 'https', 'ssh', 'rsync', 'wss'))

19
2018-05-30 16:59



Berikut ini adalah versi kode yang berfungsi penuh yang sangat disediakan oleh ephemient sini (Terima kasih).

import readline

addrs = ['angela@domain.com', 'michael@domain.com', 'david@test.com']

def completer(text, state):
    options = [x for x in addrs if x.startswith(text)]
    try:
        return options[state]
    except IndexError:
        return None

readline.set_completer(completer)
readline.parse_and_bind("tab: complete")

while 1:
    a = raw_input("> ")
    print "You entered", a

11
2017-10-16 19:26



# ~/.pythonrc
import rlcompleter, readline
readline.parse_and_bind('tab:complete')

# ~/.bashrc
export PYTHONSTARTUP=~/.pythonrc

7
2017-10-24 00:48