الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

الإكمال التلقائي في سطر الأوامر

بدأه ahmed_youssef في 19 أبريل 2013 · 6 رد · 969 مشاهدة · في لغة Python
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع
من منا يستطيع الحياة بدون الضغط على tab طوال اليوم عندما يريد إكمال أمر ما أو مسار ما ؟

من مميزات BASH هي خاصية الإكمال التلقائي للأوامر والملفات ، ولكن هل بحثت عن كيف تؤدي BASH هذه الوظيفة ؟

الجواب هو عبر مكتبة خاصة تسمى readline (من GNU ويتم إستخدامها على لينكس) ويوجد مكتبة editline (يتم إستخدامها مع MAC OSX) 

 

بايثون كذلك تتيح لك إستخدام مكتبة readline لإضافة ميزة الإكمال التلقائي من خلال مكتبة readline 

 

 

لننظر إلى تطبيق بسيط 

import readline

import logging 

 

LOG_F= '/tmp/addressbook.log'

logging.basicConfig(filename=LOG_F,level=logging.DEBUG)

 

class Entry(object):

        def __init__(self, name, email):

                self.name=name

                self.email=email

                

entries=[Entry("ahmed", "a@there.com"), Entry("John", "j@there.com"), Entry("Lora", "l@there.com")]

 

def add():

        name=raw_input("Name: ")

        email=raw_input("Email: ")

        entry=Entry(name,email)

entries.append(entry)

 

def remove():

name=raw_input("Name: ")

        for e in entries:

                if e.name == name:

                        entries.remove(e)

                        break 

def update():

        oldname=raw_input("Name: ")

        newname=raw_input("New name: ")

        newemail=raw_input("New email: ")

        newentry=Entry(newname,newemail)

        for idx,e in enumerate(entries):

                if e.name == oldname:

                        entries[idx]=newentry

                        break

def listentries():

print "Listing entries"

        print "---------------"

        if len(entries) > 0:

                for idx, e in enumerate(entries):

                        print idx, " | ", e.name.ljust(5), "|", e.email.ljust(5)

        else:

                print "No entries found"

def usage():

        print """

        

        add:    add new entry

        update: update an existing entry

        remove: remove an existing entry

        list:   listing entries

        help:   usage

        

        """

class Completer(object):

    

    def __init__(self, options):

        self.options = sorted(options)

 

    def complete(self, text, state):

        """

        text - start of completion text. This is the text since the last word break character.

        state - 0 or positive int. This state is zero on the first call for a completion request and increments for each subsequent call until the end of choices is reached.

        """

        matches=[opt for opt in self.options if opt.startswith(text)]

        

        logging.debug("[+] text=%s, state=%d, matches=%s", text, state, str(matches))

        try:

                logging.debug("\t[+RETURN] state=%d, matches=%s, match=%s", state,str(matches), matches[state])

                return matches[state]

        except:

                logging.debug("\tERROR:[!RETURN] state=%d, matches=%s", state, str(matches))

        return None

                

                

 

 

string_to_cmd ={

        'add'   : add,

        'remove': remove,

        'update': update,

        'list'  : listentries,

        'help'  : usage,

        'usage' : usage

}

 

words="add", "remove", "update", "list", "help", "usage"

completer=Completer(words)

 

readline.parse_and_bind("tab: complete")

readline.set_completer(completer.complete)

 

while True:

cmd=raw_input("[command]> ")

        f=string_to_cmd[cmd]

        f()

مايعنينا هو 

1- إستدعاء مكتبة readline 

2- إنشاء دالة للإكمال وهي دالة complete داخل الصف Completer

 

إنتبه توقيع هذه الدالة يجب ان يكون لها معاملين text وهو النص الذي تريد أن تكمله

و state وهي متغير له قيمة 0 او موجب ويتم زيادته عند كل إستدعاء (مسائل داخلية للمكتبة)

 

 

 

class Completer(object):

    

    def __init__(self, options):

        self.options = sorted(options)

 

    def complete(self, text, state):

        """

        text - start of completion text. This is the text since the last word break character.

        state - 0 or positive int. This state is zero on the first call for a completion request and increments for each subsequent call until the end of choices is reached.

        """

        matches=[opt for opt in self.options if opt.startswith(text)]

        

        logging.debug("[+] text=%s, state=%d, matches=%s", text, state, str(matches))

        try:

                logging.debug("\t[+RETURN] state=%d, matches=%s, match=%s", state,str(matches), matches[state])

                return matches[state]

        except:

                logging.debug("\tERROR:[!RETURN] state=%d, matches=%s", state, str(matches))

        return None

 

 

3- تحديد الكلمات التي تريد إكمالها وتمريرها للصف Completer

words="add", "remove", "update", "list", "help", "usage"

completer=Completer(words)

 

4-  تفعيل readline عند الضغط على زر tab وتحديد دالة الإكمال ل readline

 

 

readline.parse_and_bind("tab: complete")

readline.set_completer(completer.complete)

 

يوجد مكتبة أخرى توفر الإكمال التلقائي لبايثون في البيئة التفاعلية تسمى rlcompleter كل ماعليك هو إستدعائها هي و readline وتفعيل الإكمال على ال tab

>>> dir(rlcompleter)

['Completer', '__all__', '__builtin__', '__builtins__', '__doc__', '__file__', '__main__', '__name__', '__package__', 'get_class_members', 'readline']

>>> import readline

>>> readline.parse_and_bind("tab: complete")

 

يوجد مكتبة متقدمة تسمى rl تستطيع تحميلها عبر 

 

easy_install rl

توفر لك دوال للإكمال التلقائي لأسماء الملفات وأسماء المستخدمين على النظام

 

>>> readline.set_completer(readline.username_completion_function)

>>> 

abrt            deluge          mongodb         shutdown

adm             ftp             mysql           smmsp

apache          games           nm-openconnect  smolt

avahi           gdm             nobody          sshd

avahi-autoipd   gopher          openvpn         striky

bin             halt            operator        sync

chrony          linuxfreak      pulse           tcpdump

colord          lp              root            tss

daemon          mail            rtkit           usbmuxd

dbus            mailnull        saslauth        uucp

>>> readline.set_completer(readline.filename_completion_function)

 

 

 

روابط




2
(map share people)

فضلا لاتقم بمراسلتي من أجل أسئلة لها أقسامها في المنتدى حتى تعم الفائدة على الجميع وللحصول على إجابات أفضل من أعضاء أكثر خبرة.
Weblog
@bitbucket
@xmonader

#2

شيء جميل ومفيد للذي يريد عمل محرر بسيط!!

salah.jpg

#3

لدي سؤال استاذ احمد

 

انا اعرف هذا الجزء هو مسؤل عن تكملة الجزء

 

logging.debug("[+] text=%s, state=%d, matches=%s", text, state, str(matches))

 

ﻻكن هذا مالذي فائدته

 

  try:
                logging.debug("\t[+RETURN] state=%d, matches=%s, match=%s", state,str(matches), matches[state])
                return matches[state]
        except:
                logging.debug("\tERROR:[!RETURN] state=%d, matches=%s", state, str(matches))
        return None

 

عندما مسحت هذا الجزء وبقيت الجزء الاذي في اﻻعلى وجربته ,, صحيح وماخرج خطأ

 

 

مافائدة هذا الجزء ومالذي يحتوي متغير matches

salah.jpg

#4

هذه أجزاء خاصة بال logging لتسجيل الأحداث التي حدثت في البرنامج 

(map share people)

فضلا لاتقم بمراسلتي من أجل أسئلة لها أقسامها في المنتدى حتى تعم الفائدة على الجميع وللحصول على إجابات أفضل من أعضاء أكثر خبرة.
Weblog
@bitbucket
@xmonader

#5
السلام عليكم

اذا كنت تريد اكمال سطر الاوامر تلقائيا اثناء البرمجة 

استعمل المحررbpython

هو متوافق مع اللنيكس
#6

bpython شئ آخر عن الموضوع.

مذكور هنا أيضا كيف تضيف ال tab completion ل python أثناء التعامل في ال interactive mode

http://docs.python.org/2/tutorial/interactive.html

 

 

الموضوع يتحدث عن إستخدم GNU readline في تطبيقات خارجية

(map share people)

فضلا لاتقم بمراسلتي من أجل أسئلة لها أقسامها في المنتدى حتى تعم الفائدة على الجميع وللحصول على إجابات أفضل من أعضاء أكثر خبرة.
Weblog
@bitbucket
@xmonader

#7

عفوا 

مواضيع مشابهة

عدد الزوار حالياً

المتواجدون خلال آخر دقيقتين · يتحدّث كل ٣٠ ثانية

—الإجمالي—أعضاء مسجّلون—زوار بدون تسجيل

جارٍ التحقق من المتواجدين…