| ZSHCOMPSYS(1) | General Commands Manual | ZSHCOMPSYS(1) |
نام (NAME)
zshcompsys - سامانه کاملسازی zsh
توضیحات (DESCRIPTION)
این سند کد شل را برای سامانه کاملسازی «جدید» که به آن compsys گفته میشود، شرح میدهد. این سامانه در قالب توابع شل و بر اساس ویژگیهای توصیفشده در zshcompwid(1) نوشته شده است.
این ویژگیها وابسته به زمینه (contextual) بوده و به نقطهای که کاملسازی در آن آغاز میشود حساس هستند. بسیاری از کاملسازیها از پیش فراهم شدهاند. به همین دلیل، کاربر میتواند بدون دانستن جزئیاتی فراتر از نحوه راهاندازی اولیه سامانه، کارهای بسیار زیادی را به انجام برساند؛ این موارد در ادامه در بخش INITIALIZATION شرح داده شدهاند.
زمینهای که تعیین میکند چه کاملسازیای باید انجام شود ممکن است موارد زیر باشد:
- •
- موقعیت یک آرگومان یا گزینه: این موارد موقعیتی را در خط فرمان که کاملسازی در آن درخواست شده است توصیف میکنند. برای نمونه «نخستین آرگومان rmdir، کلمهای که کامل میشود نام یک دایرکتوری است»؛
- •
- یک زمینه خاص، که نشاندهنده عنصری در نحو شل است. برای نمونه «یک کلمه در موقعیت دستور» یا «اندیس یک آرایه».
مشخصات کامل یک زمینه، شامل عناصر دیگری نیز هست که شرح داده خواهند شد.
علاوه بر نام دستورها و زمینهها، این سامانه از دو مفهوم دیگر نیز بهره میبرد: styles و tags. این مفاهیم راههایی را برای کاربر فراهم میکنند تا رفتار سامانه را پیکربندی نماید.
برچسبها (tags) نقشی دوگانه ایفا میکنند. آنها به عنوان یک سامانه طبقهبندی برای تطابقها عمل کرده و معمولاً دستهای از اشیاء را نشان میدهند که ممکن است کاربر نیاز به تمایز آنها داشته باشد. برای مثال، هنگام کاملسازی آرگومانهای دستور ls کاربر ممکن است ترجیح دهد پیش از directories، مورد files را امتحان کند، از این رو هر دوی اینها برچسب هستند. آنها همچنین به عنوان راستترین عنصر در مشخصات یک زمینه ظاهر میشوند.
سبکها (styles) عملیاتهای گوناگون سامانه کاملسازی را اصلاح میکنند، از قبیل قالببندی خروجی، و همچنین اینکه چه نوع کاملکنندههایی استفاده شوند (و با چه ترتیبی)، یا کدام برچسبها بررسی گردند. سبکها ممکن است آرگومانهایی را بپذیرند و با استفاده از دستور zstyle که در zshmodules(1) توصیف شده است، مدیریت میشوند.
بهطور خلاصه، برچسبها توصیف میکنند که اشیاء کاملسازی چه چیزی هستند، و سبکها مشخص میکنند که آنها چگونه باید کامل شوند. در نقاط مختلفی از اجرا، سامانه کاملسازی بررسی میکند چه سبکها و/یا برچسبهایی برای زمینه جاری تعریف شدهاند، و از آن برای اصلاح رفتار خود بهره میگیرد. شرح کامل مدیریت زمینه، که مشخص میکند برچسبها و دیگر عناصر زمینه چگونه بر رفتار سبکها اثر میگذارند، در ادامه در COMPLETION SYSTEM CONFIGURATION شرح داده شده است.
هنگامی که یک کاملسازی درخواست میشود، یک تابع توزیعکننده فراخوانی میگردد؛ توضیحات مربوط به _main_complete را در فهرست توابع کنترلی در ادامه ببینید. این توزیعکننده تصمیم میگیرد که کدام تابع باید برای تولید کاملسازیها فراخوانی شود و آن را فراخوانی میکند. نتیجه به یک یا چند completer واگذار میشود؛ توابعی که راهبردهای کاملسازی مجزایی را پیادهسازی میکنند: کاملسازی ساده، تصحیح خطا، کاملسازی همراه با تصحیح خطا، انتخاب از منو و غیره.
بهطور کلیتر، توابع شل موجود در سامانه کاملسازی از دو نوع هستند:
- •
- آنهایی که با «comp» آغاز میشوند و باید مستقیماً فراخوانی گردند؛ تعداد اینها محدود است؛
- •
- آنهایی که با «_» آغاز میشوند و توسط کد کاملسازی فراخوانی میگردند. توابع شل این مجموعه، که رفتار کاملسازی را پیادهسازی کرده و ممکن است به کلیدها متصل (bind) شوند، با نام «widgets» شناخته میشوند. با نیاز به کاملسازیهای جدید، این توابع گسترش مییابند.
اگر سیستم بهطور کامل نصب شده باشد، فراخوانی تابع پوسته compinit از فایل راهاندازی اولیهتان باید کافی باشد؛ به بخش بعدی مراجعه کنید. با این حال، تابع compinstall میتواند توسط کاربر برای پیکربندی جنبههای مختلف سامانه تکمیل اجرا شود.
معمولاً compinstall کدهایی را درون .zshrc قرار میدهد، اگرچه اگر آن فایل قابل نوشتن نباشد، آن را در فایل دیگری ذخیره کرده و مکان آن فایل را به شما اعلام میکند. توجه داشته باشید که اطمینان از اجرای خطوط اضافهشده به .zshrc بر عهده خودتان است؛ برای مثال، اگر .zshrc معمولاً زودتر خاتمه مییابد (returns early)، ممکن است نیاز باشد آنها را به جایگاه بالاتری در فایل منتقل کنید. تا زمانی که همه این خطوط را در کنار یکدیگر نگه دارید (شامل خطوط توضیحات در ابتدا و انتها)، میتوانید compinstall را دوباره اجرا کنید و این دستور بهدرستی این خطوط را پیدا کرده و تغییر میدهد. با این حال، توجه داشته باشید که هر کدی که بهصورت دستی به این بخش اضافه کنید با اجرای دوباره compinstall احتمالاً از بین خواهد رفت، اگرچه خطوطی که از دستور `zstyle' استفاده میکنند باید بهخوبی مدیریت شوند.
کد جدید دفعه بعد که پوسته را آغاز کنید یا .zshrc را بهصورت دستی اجرا کنید اعمال خواهد شد؛ گزینهای نیز برای اعمال فوری آنها وجود دارد. با این حال، اگر compinstall تعاریفی را حذف کرده باشد، برای مشاهده تغییرات باید پوسته را مجدداً راهاندازی کنید.
برای اجرای compinstall باید مطمئن شوید که در دایرکتوری ذکرشده در پارامتر fpath شما قرار دارد، که اگر zsh بهدرستی پیکربندی شده باشد و تا زمانی که فایلهای راهاندازی شما دایرکتوریهای مربوطه را از fpath حذف نکنند، از پیش چنین است. سپس باید بهصورت خودکار بارگذاری شود (اجرای `autoload -U compinstall' توصیه میشود). هر زمان که از شما اطلاعات خواسته شد میتوانید فرایند نصب را لغو کنید و فایل .zshrc شما اصلاً تغییر نخواهد کرد؛ تغییرات فقط در انتهای کار اعمال میشوند، جایی که صریحاً از شما تأیید خواسته میشود.
استفاده از compinit
این بخش استفاده از compinit را برای راهاندازی اولیه تکمیل در نشست فعلی هنگام فراخوانی مستقیم شرح میدهد؛ اگر compinstall را اجرا کرده باشید، بهطور خودکار از فایل .zshrc شما فراخوانی خواهد شد.
برای راهاندازی اولیه سامانه، تابع compinit باید در دایرکتوری ذکرشده در پارامتر fpath باشد، و باید بهصورت خودکار بارگذاری شده (`autoload -U compinit' توصیه میشود)، و سپس بهسادگی بهصورت `compinit' اجرا شود. این کار چند تابع کاربردی را تعریف میکند، تمهیدات لازم برای بارگذاری خودکار تمام توابع پوسته موردنیاز را فراهم میسازد، و سپس تمام ویجتهایی را که عملیات تکمیل را انجام میدهند بازتعریف میکند تا از سامانه جدید استفاده کنند. اگر از ویجت menu-select که بخشی از ماژول zsh/complist است استفاده میکنید، باید مطمئن شوید که آن ماژول پیش از فراخوانی compinit بارگذاری شده است تا آن ویجت نیز بازتعریف شود. اگر سبکهای تکمیل (به زیر مراجعه کنید) طوری تنظیم شده باشند که علاوه بر تکمیل، بهطور پیشفرض بسط (expansion) را نیز انجام دهند و کلید TAB به expand-or-complete متصل شده باشد، compinit آن را دوباره به complete-word متصل میکند؛ این کار برای استفاده از فرم صحیح بسط لازم است.
اگر به استفاده از دستورات تکمیل اولیه نیاز پیدا کردید، همچنان میتوانید با قرار دادن یک `.' در ابتدای نام ویجت، کلیدها را به ویجتهای قدیمی متصل کنید؛ مانند `.expand-or-complete'.
برای افزایش سرعت اجرای compinit، میتوان آن را طوری تنظیم کرد که یک پیکربندی ذخیرهشده (dumped) تولید کند تا در فراخوانیهای بعدی خوانده شود؛ این حالت پیشفرض است، اما میتوان با فراخوانی compinit به همراه گزینه -D آن را غیرفعال کرد. فایل ذخیرهشده .zcompdump نام دارد و در همان دایرکتوری فایلهای راهاندازی (یعنی $ZDOTDIR یا $HOME) قرار میگیرد؛ همچنین، میتوان نام فایلی صریح را با `compinit -d dumpfile' مشخص کرد. در فراخوانی بعدی compinit، به جای انجام یک راهاندازی اولیه کامل، این فایل ذخیرهشده خوانده خواهد شد.
اگر تعداد فایلهای تکمیل تغییر کند، compinit این موضوع را تشخیص داده و یک فایل ذخیره جدید تولید میکند. با این حال، اگر نام یک تابع یا آرگومانهای سطر اول یک تابع #compdef (همانطور که در زیر شرح داده شده) تغییر کند، سادهترین راه این است که فایل ذخیره را بهصورت دستی حذف کنید تا compinit در اجرای بعدی آن را دوباره ایجاد کند. بررسی انجامشده برای یافتن توابع جدید را میتوان با ارائه گزینه -C نادیده گرفت. در این حالت، فایل ذخیره تنها زمانی ایجاد میشود که از قبل وجود نداشته باشد. از گزینه -w برای توضیح اینکه چرا یک فایل ذخیره بارگذاری نشده یا چرا دوباره ایجاد شده است، استفاده کنید.
ذخیرهسازی در واقع توسط تابع دیگری به نام compdump انجام میشود، اما فقط زمانی نیاز به اجرای دستی آن خواهید داشت که پیکربندی را تغییر دهید (مثلاً با استفاده از compdef) و سپس بخواهید پیکربندی جدید را ذخیره کنید. نام فایل ذخیرهشده قبلی برای این منظور به خاطر سپرده خواهد شد.
اگر پارامتر _compdir مقداردهی شده باشد، compinit از آن به عنوان دایرکتوریای که توابع تکمیل در آن یافت میشوند استفاده میکند؛ این تنها در صورتی لازم است که آنها از قبل در مسیر جستجوی توابع نباشند.
به دلایل امنیتی، compinit همچنین بررسی میکند که آیا سامانه تکمیل از فایلهایی استفاده میکند که متعلق به root یا کاربر فعلی نیستند، یا فایلهایی در دایرکتوریهایی قرار دارند که برای همه (world) یا گروه قابل نوشتن هستند یا متعلق به root یا کاربر فعلی نیستند. در صورت یافتن چنین فایلها یا دایرکتوریهایی، compinit میپرسد که آیا سامانه تکمیل واقعاً باید استفاده شود یا خیر. برای اجتناب از این بررسیها و استفاده از تمام فایلهای یافتشده بدون پرسش، از گزینه -u استفاده کنید، و برای اینکه compinit تمام فایلها و دایرکتوریهای ناامن را بدون هشدار نادیده بگیرد، از گزینه -i استفاده کنید. اگر گزینه -C داده شود، به شرطی که dumpfile وجود داشته باشد، این بررسی امنیتی بهطور کامل نادیده گرفته میشود.
بررسی امنیتی را میتوان در هر زمان با اجرای تابع compaudit مجدداً امتحان کرد. این همان بررسی استفادهشده توسط compinit است، اما هنگامی که مستقیماً اجرا میشود، هرگونه تغییری در fpath به صورت محلی در تابع اعمال شده و ماندگار نمیشود. دایرکتوریهای مورد بررسی را میتوان به عنوان آرگومان ارسال کرد؛ اگر هیچ آرگومانی داده نشود، compaudit از fpath و _compdir برای یافتن دایرکتوریهای سامانه تکمیل استفاده میکند و در صورت نیاز موارد ناموجود را به fpath اضافه مینماید. برای اجبار به بررسی دقیقاً همان دایرکتوریهایی که در حال حاضر در fpath نام برده شدهاند، پیش از فراخوانی compaudit یا compinit، پارامتر _compdir را روی یک رشته خالی تنظیم کنید.
تابع bashcompinit سازگاری با سامانه تکمیل برنامهپذیر bash را فراهم میکند. با اجرا، توابع compgen و complete را تعریف میکند که متناظر با دستورات درونی (builtins) با همین نام در bash هستند. پس از آن، امکان استفاده از مشخصات و توابع تکمیل نوشتهشده برای bash وجود خواهد داشت.
قاعده برای توابع بارگذاریخودکار که در تکمیل استفاده میشوند این است که با یک زیرخط (underscore) آغاز شوند؛ همانطور که پیشتر ذکر شد، پارامتر fpath/FPATH باید شامل دایرکتوریای باشد که این توابع در آن ذخیره شدهاند. اگر zsh بهدرستی روی سیستم شما نصب شده باشد، fpath/FPATH بهطور خودکار شامل دایرکتوریهای مورد نیاز برای توابع استاندارد است.
برای نصبهای ناقص، چنانچه compinit تعداد کافی فایل که با زیرخط آغاز میشوند (کمتر از بیست عدد) در مسیر جستجو نیابد، با افزودن دایرکتوری _compdir به مسیر جستجو تلاش میکند موارد بیشتری را پیدا کند. اگر آن دایرکتوری دارای یک زیردایرکتوری به نام Base باشد، تمام زیردایرکتوریها به مسیر اضافه خواهند شد. افزون بر این، اگر زیردایرکتوری Base دارای یک زیردایرکتوری با نام Core باشد، compinit تمام زیردایرکتوریهای زیردایرکتوریها را به مسیر خواهد افزود: این امر اجازه میدهد تا توابع با همان قالبی که در توزیع کد منبع zsh قرار دارند در دسترس باشند.
هنگامی که compinit اجرا میشود، تمام چنین فایلهای قابل دسترسی از طریق fpath/FPATH را جستجو کرده و خط اول هر یک از آنها را میخواند. این خط باید شامل یکی از برچسبهای شرح داده شده در زیر باشد. فایلهایی که نخستین خط آنها با یکی از این برچسبها شروع نشود، بخشی از سیستم تکمیل تلقی نمیشوند و رفتار ویژهای با آنها نخواهد شد.
برچسبها عبارتند از:
- #compdef name ... [ -{p|P} pattern ... [ -N name ... ] ]
- فایل بهصورت قابل بارگذاری خودکار درمیآید و تابع تعریفشده در آن هنگام تکمیل nameها فراخوانی خواهد شد؛ هر کدام از این نامها، یا نام دستوری است که آرگومانهای آن باید تکمیل شوند یا یکی از بافتهای ویژه به شکل -context- است که در ادامه شرح داده شدهاند.
هر name ممکن است به شکل `cmd=service' نیز باشد. هنگام تکمیل دستور cmd، تابع معمولاً بهگونهای رفتار میکند که گویی به جای آن، دستور (یا بافت ویژه) service تکمیل میشود. این کار روشی برای تغییر رفتار توابعی فراهم میکند که میتوانند تکمیلهای مختلفی را انجام دهند. این قابلیت با تنظیم پارامتر $service هنگام فراخوانی تابع پیادهسازی میشود؛ تابع میتواند به هر نحوی که بخواهد آن را تفسیر کند، و توابع سادهتر احتمالاً آن را نادیده خواهند گرفت.
اگر خط #compdef شامل یکی از گزینههای -p یا -P باشد، کلمات پس از آن بهعنوان الگو (pattern) در نظر گرفته میشوند. تابع زمانی فراخوانی خواهد شد که تکمیل برای دستور یا بافتی که با یکی از الگوها مطابقت دارد، درخواست شود. گزینههای -p و -P به ترتیب برای مشخص کردن الگوهایی به کار میروند که باید پیش یا پس از سایر تکمیلها آزموده شوند. بنابراین -P ممکن است برای مشخص کردن اقدامات پیشفرض استفاده شود.
گزینه -N پس از یک لیست به دنبال -p یا -P به کار میرود؛ این گزینه مشخص میکند که کلمات باقیمانده دیگر الگوها را تعریف نمیکنند. امکان جابهجایی میان این سه گزینه به هر تعداد دفعات لازم وجود دارد.
- #compdef -k style key-sequence ...
- این گزینه یک ویجت (widget) ایجاد میکند که رفتاری شبیه به ویجت توکار style دارد و آن را به key-sequenceهای مشخصشده (در صورت وجود) متصل (bind) میکند. مقدار style باید یکی از ویجتهای توکار باشد که تکمیل را انجام میدهند، یعنی complete-word، delete-char-or-list، expand-or-complete، expand-or-complete-prefix، list-choices، menu-complete، menu-expand-or-complete، یا reverse-menu-complete. اگر ماژول zsh/complist بارگذاری شده باشد (به zshmodules(1) مراجعه کنید) ویجت menu-select نیز در دسترس خواهد بود.
هنگامی که یکی از key-sequenceها تایپ شود، تابع درون فایل برای تولید مطابقتها فراخوانی خواهد شد. توجه داشته باشید که اگر کلیدی از پیش متصل شده باشد (یعنی به چیزی غیر از undefined-key متصل باشد)، اتصال آن تغییر نخواهد کرد. ویجت ایجادشده نامی یکسان با فایل دارد و میتواند مانند همیشه با استفاده از bindkey به هر کلید دیگری متصل شود.
- #compdef -K widget-name style key-sequence [ name style seq ... ]
- این گزینه شبیه به -k است، به جز اینکه برای هر جفت widget-name و style تنها یک آرگومان key-sequence میتواند داده شود. با این حال، کل این مجموعه سهتایی از آرگومانها را میتوان با مجموعهای دیگر تکرار کرد. بهویژه توجه داشته باشید که widget-name در هر مجموعه باید متمایز باشد. اگر با `_' آغاز نشود، این نویسه اضافه خواهد شد. نام widget-name نباید با نام هیچ ویجت موجودی تداخل داشته باشد: نامهای مبتنی بر نام تابع بیشترین کاربرد را دارند. برای مثال،
#compdef -K _foo_complete complete-word "^X^C" \ _foo_list list-choices "^X^D"
(همگی در یک خط) یک ویجت _foo_complete را برای تکمیل، متصل به `^X^C' و یک ویجت _foo_list را برای فهرست کردن، متصل به `^X^D' تعریف میکند.
- #autoload [ options ]
- توابع دارای برچسب #autoload برای بارگذاری خودکار علامتگذاری میشوند، اما در غیر این صورت رفتار ویژهای با آنها صورت نمیگیرد. معمولاً قرار است این توابع از درون یکی از توابع تکمیل فراخوانی شوند. هرگونه options ارائهشده به دستور توکار autoload منتقل خواهد شد؛ یک کاربرد معمول آن +X برای واداشتن تابع به بارگذاری فوری است. توجه داشته باشید که پرچمهای -U و -z همیشه بهصورت ضمنی اضافه میشوند.
نویسه # بخشی از نام برچسب است و هیچ فاصله خالیای پس از آن مجاز نیست. برچسبهای #compdef از تابع compdef شرح داده شده در زیر استفاده میکنند؛ تفاوت اصلی این است که نام تابع بهطور ضمنی ارائه میشود.
بافتهای ویژهای که میتوان برای آنها توابع تکمیل تعریف کرد عبارتند از:
- -array-value-
- سمت راست یک انتساب آرایه (`name=(...)')
- -assign-parameter-
- نام یک پارامتر در یک انتساب، یعنی در سمت چپ یک `='
- -brace-parameter-
- نام یک بسط پارامتر درون آکولادها (`${...}')
- -command-
- یک کلمه در جایگاه دستور
- -condition-
- یک کلمه درون یک شرط (`[[...]]')
- -default-
- هر کلمهای که هیچ تکمیل دیگری برای آن تعریف نشده باشد
- -equal-
- کلمهای که با علامت مساوی شروع میشود
- -first-
- این مورد پیش از هر تابع تکمیل دیگری امتحان میشود. تابع فراخوانیشده ممکن است پارامتر _compskip را روی یکی از مقادیر مختلف تنظیم کند: all: هیچ تکمیل دیگری امتحان نمیشود؛ رشتهای شامل زیررشته patterns: هیچ تابع تکمیل الگویی فراخوانی نخواهد شد؛ رشتهای حاوی default: تابع مربوط به بافت `-default-' فراخوانی نمیشود، اما توابع تعریفشده برای دستورها فراخوانی خواهند شد.
- -math-
- درون بافتهای ریاضی، مانند `((...))'
- -parameter-
- نام یک بسط پارامتر (`$...')
- -redirect-
- کلمه پس از یک عملگر تغییر مسیر (redirection).
- -subscript-
- محتوای یک اندیس پارامتر.
- -tilde-
- پس از علامت تیلدا در ابتدای کلمه (`~')، اما پیش از اولین ممیز اسلش در کلمه.
- -value-
- در سمت راست یک انتساب.
پیادهسازیهای پیشفرضی برای هر یک از این بافتها ارائه شده است. در بیشتر موارد، بافت -context- توسط یک تابع متناظر به نام _context پیادهسازی میشود (برای مثال، بافت `-tilde-' و تابع `_tilde').
بافتهای -redirect- و -value- امکان دریافت اطلاعات اضافی مختص بافت را فراهم میکنند. (در داخل سیستم، این سازوکار از طریق فراخوانی تابع _dispatch توسط توابع هر بافت مدیریت میشود.) اطلاعات اضافی با ویرگول جدا شده و اضافه میگردند.
برای بافت -redirect-، اطلاعات اضافی به فرم `-redirect-,op,command' است، که در آن op عملگر تغییر مسیر و command نام دستور موجود در خط است. چنانچه هنوز دستوری روی خط وجود نداشته باشد، فیلد command خالی خواهد بود..PP برای بافت -value-، ساختار بهصورت `-value-,name,command' است، که در آن name نام پارامتر در سمت چپ انتساب است. در مورد عناصر یک آرایهٔ انجمنی، برای نمونه `assoc=(key <TAB>'، name به `name-key' گسترش مییابد. در برخی بافتهای خاص، مانند کاملکردن پس از `make CFLAGS='، بخش command نام دستور را مشخص میکند، در اینجا make؛ در غیر این صورت خالی است.
تعریف کاملسازیهای کاملاً خاص ضروری نیست، چرا که توابع ارائهشده تلاش خواهند کرد تا با جایگزینی تدریجی عناصر با `-default-'، کاملسازیها را تولید کنند. برای نمونه، هنگام کاملکردن پس از `foo=<TAB>'، تابع _value نامهای `-value-,foo,' (به خالی بودن بخش command توجه کنید)، `-value-,foo,-default-' و `-value-,-default-,-default-' را به ترتیب امتحان خواهد کرد تا زمانی که تابعی برای مدیریت این بافت پیدا کند.
بهعنوان یک مثال:
compdef '_files -g "*.log"' '-redirect-,2>,-default-'
فایلهای منطبق با `*.log' را پس از `2> <TAB>' برای هر دستوری که گردانندهٔ خاصتری برای آن تعریف نشده باشد، کامل میکند.
همچنین:
compdef _foo -value-,-default-,-default-
مشخص میکند که _foo کاملسازیها را برای مقادیر پارامترهایی که هیچ تابع خاصی برای آنها تعریف نشده است، ارائه میدهد. این کار معمولاً توسط خود تابع _value انجام میشود.
همین قوانین جستجو هنگام جستجوی سبکها (styles) (همانطور که در زیر شرح داده شده) استفاده میشوند؛ برای نمونه
zstyle ':completion:*:*:-redirect-,2>,*:*' file-patterns '*.log'
روش دیگری است تا کاملسازی پس از `2> <TAB>' فایلهای منطبق با `*.log' را کامل کند.
توابع (Functions)
تابع زیر توسط compinit تعریف شده است و میتوان آن را مستقیماً فراخوانی کرد.
- compdef [ -ane ] function name ... [ -{p|P} pattern ... [ -N name ...]]
- compdef -d name ...
- compdef -k [ -an ] function style key-sequence [ key-sequence ... ]
- compdef -K [ -an ] function name style key-seq [ name style seq ... ]
- حالت نخست، function را برای فراخوانی جهت کاملسازی در بافتهای دادهشده تعریف میکند، همانطور که برای برچسب #compdef در بالا شرح داده شد.
بهعنوان روشی دیگر، تمام آرگومانها میتوانند ساختار `cmd=service' داشته باشند. در اینجا service باید پیشتر توسط خطوط `cmd1=service' در فایلهای #compdef، همانطور که در بالا شرح داده شد، تعریف شده باشد. آرگومان مربوط به cmd به همان روش service کامل خواهد شد.
آرگومان function میتواند رشتهای حاوی تقریباً هر کد پوستهای نیز باشد. اگر این رشته دارای یک علامت مساوی باشد، حالت بالا اولویت خواهد داشت. گزینهٔ -e میتواند برای این مشخص شود که آرگومان نخست حتی در صورت داشتن علامت مساوی، بهعنوان کد پوسته ارزیابی شود. این رشته با استفاده از دستور توکار eval برای تولید کاملسازیها اجرا خواهد شد. این امر روشی فراهم میکند تا از تعریف یک تابع کاملسازی جدید بینیاز شوید. برای نمونه، جهت کاملکردن فایلهای خاتمهیافته به `.h' بهعنوان آرگومانهای دستور foo:
compdef '_files -g "*.h"' foo
گزینهٔ -n از بازنویسی هرگونه کاملسازی تعریفشده از قبل برای دستور یا بافت جلوگیری میکند.
گزینهٔ -d هرگونه کاملسازی تعریفشده برای دستور یا بافتهای فهرستشده را حذف میکند.
مؤلفههای name میتوانند شامل گزینههای -p، -P و -N نیز باشند، همانطور که برای برچسب #compdef شرح داده شد. اثر آنها بر روی فهرست آرگومانها یکسان است، و بین تعاریف الگوهای آزمودهشده در ابتدا، الگوهای آزمودهشده در انتها، و دستورها و بافتهای عادی جابهجا میشود.
پارامتر $_compskip میتواند توسط هر تابعی که برای یک بافت الگو تعریف شده، مقداردهی شود. اگر به مقداری حاوی زیررشتهٔ `patterns' تنظیم شود، هیچیک از توابع الگو فراخوانی نخواهند شد؛ اگر به مقداری حاوی زیررشتهٔ `all' تنظیم شود، هیچ تابع دیگری فراخوانی نخواهد شد. تنظیم $_compskip به این روش، بهویژه هنگام استفاده از گزینهٔ -p بسیار کاربردی است، چرا که در غیر این صورت، توزیعکننده پس از فراخوانی تابعِ بافت الگو، به سراغ توابع اضافی (احتمالاً تابع پیشفرض) خواهد رفت، که در صورت عدم مدیریت صحیح میتواند نمایش حالتهای کاملسازی را مخدوش کند.
حالت همراه با -k یک ابزارک با نامی یکسان با function تعریف میکند که برای هر یک از key-sequenceها فراخوانی خواهد شد؛ این مشابه برچسب #compdef -k است. این تابع باید کاملسازیهای مورد نیاز را تولید کند و در غیر این صورت مانند ابزارک درونی عمل خواهد کرد که نام آن بهعنوان آرگومان style داده شده است. ابزارکهای قابل استفاده برای این منظور عبارتند از: complete-word، delete-char-or-list، expand-or-complete، expand-or-complete-prefix، list-choices، menu-complete، menu-expand-or-complete، و reverse-menu-complete، و همچنین menu-select در صورتی که ماژول zsh/complist بارگذاری شده باشد. گزینهٔ -n از مقید شدن کلید در صورتی که پیشتر به چیزی غیر از undefined-key مقید شده باشد، جلوگیری میکند.
حالت دارای -K مشابه است و چندین ابزارک را بر اساس همان function تعریف میکند، که هر یک از آنها نیازمند مجموعهای از سه آرگومان name، style و key-sequence هستند، که دو مورد آخر همانند -k بوده و مورد اول باید یک نام ابزارک یکتا باشد که با یک زیرخط آغاز میشود.
در هر جا که قابل اعمال باشد، گزینهٔ -a تابع function را خودکاربارگذاریپذیر (autoloadable) میکند، که معادل autoload -U function است.
تابع compdef میتواند برای مرتبط ساختن توابع کاملسازی موجود با دستورهای جدید استفاده شود. برای نمونه،
compdef _pids foo
از تابع _pids برای کاملکردن شناسههای فرآیند برای دستور foo استفاده میکند.
همچنین به تابع _gnu_generic که در زیر شرح داده شده توجه کنید، که میتواند برای کاملکردن گزینهها برای دستورهایی که گزینهٔ `--help' را درک میکنند، استفاده شود.
این بخش مروری کوتاه بر نحوه کارکرد سامانه تکمیل (completion) ارائه میدهد و سپس با جزئیات بیشتر به چگونگی پیکربندی زمان و نحوه تولید موارد منطبق (matches) توسط کاربران میپردازد.
مرور کلی (Overview)
هنگامی که تلاش برای تکمیل در نقطهای از خط فرمان صورت میگیرد، سامانه تکمیل شروع به ساختن بافتار (context) میکند. بافتار نمایانگر تمام چیزهایی است که پوسته درباره معنای خط فرمان و اهمیت موقعیت مکاننما میداند. این موارد شامل چندین فاکتور است، از جمله واژه دستور (مانند `grep' یا `zsh') و گزینههایی که ممکن است واژه فعلی آرگومانی برای آنها باشد (مانند گزینه `-o' برای zsh که یک گزینه پوسته را به عنوان آرگومان دریافت میکند).
بافتار بسیار عمومی آغاز میشود ("ما در حال شروع یک تکمیل هستیم") و با دریافت اطلاعات بیشتر، خاصتر میشود ("واژه فعلی در موقعیتی است که معمولاً یک نام دستور است" یا "واژه فعلی ممکن است یک نام متغیر باشد" و غیره). بنابراین بافتار در طول یک فراخوانی یکسان از سامانه تکمیل تغییر خواهد کرد.
این اطلاعات بافتار در یک رشته متشکل از چندین فیلد جداشده با دونقطه (:) فشرده میشود که در ادامه این مستندات به سادگی به عنوان `بافتار' نامیده میشود. توجه داشته باشید که کاربر سامانه تکمیل به ندرت نیازمند سرهمبندی یک رشته بافتار است، مگر آنکه به عنوان مثال تابع جدیدی برای تکمیل یک دستور تازه نوشته شود. آنچه ممکن است کاربر نیاز به انجام آن داشته باشد، نوشتن یک الگوی style است که در صورت نیاز با یک بافتار مطابقت داده میشود تا گزینههای حساس به بافتار که سامانه تکمیل را پیکربندی میکنند جستجو شوند.
چند بند بعدی توضیح میدهند که چگونه یک بافتار در مجموعه توابع تکمیل سرهمبندی میشود. به دنبال آن، بحثی درباره چگونگی تعریف styleها خواهد آمد. استایلها مواردی مانند چگونگی تولید تطابقها را تعیین میکنند؛ شبیه به گزینههای پوسته اما با کنترل بسیار بیشتر. آنها با دستور توکار zstyle تعریف میشوند (ببینید: zshmodules(1)).
رشته بافتار همیشه از مجموعهای ثابت از فیلدها تشکیل شده است که با دونقطه جدا شده و قبل از اولین فیلد نیز یک دونقطه آغازین قرار دارد. فیلدهایی که هنوز مشخص نیستند خالی گذاشته میشوند، اما دونقطههای اطراف آنها در هر حال نمایش داده میشوند. فیلدها همیشه به ترتیبِ :completion:function:completer:command:argument:tag. قرار میگیرند. این فیلدها معانی زیر را دارند:
- •
- رشته دقیق completion که نشان میدهد این استایل توسط سامانه تکمیل استفاده میشود. این بخش بافتار را از موارد استفادهشده توسط، به عنوان مثال، ابزارکهای zle و توابع ZFTP متمایز میکند.
- •
- بخش function، چنانچه تکمیل به جای سامانه تکمیل عادی از یک ابزارکِ دارای نام فراخوانی شود. معمولاً این بخش خالی است، اما توسط ابزارکهای خاصی مانند predict-on و توابع گوناگون در دایرکتوری Widget توزیع، روی نام آن تابع و اغلب به صورت اختصاری تنظیم میشود.
- •
- بخش completer که در حال حاضر فعال است؛ نام تابع بدون زیرخط (underscore) آغازین و با تبدیل سایر زیرخطها به خط تیره (hyphen). یک `completer' کنترل کلی نحوه انجام تکمیل را بر عهده دارد؛ `complete' سادهترین آنهاست، اما تکمیلکنندههای دیگری نیز برای انجام کارهای مرتبط مانند تصحیح، یا تغییر رفتار یک completer بعدی وجود دارند. برای اطلاعات بیشتر به بخش `Control Functions' در زیر مراجعه کنید.
- •
- بخش command یا یک -context- خاص، دقیقاً همانطور که پس از برچسب #compdef یا تابع compdef ظاهر میشود. توابع تکمیل برای دستوراتی که زیردستور (sub-command) دارند، معمولاً این فیلد را طوری تغییر میدهند که شامل نام دستور و به دنبال آن یک علامت منفی و زیردستور باشد. برای نمونه، تابع تکمیل دستور cvs هنگام تکمیل آرگومانهای زیردستور add، این فیلد را روی cvs-add تنظیم میکند.
- •
- بخش argument؛ این فیلد مشخص میکند که در حال تکمیل کدام آرگومان خط فرمان یا گزینه هستیم. برای آرگومانهای دستور، این بخش معمولاً به شکل argument-n است که در آن n شماره آرگومان است، و برای آرگومانهای گزینهها به شکل option-opt-n است که در آن n شماره آرگومان مربوط به گزینه opt است. با این حال، این حالت تنها زمانی صادق است که خط فرمان با گزینهها و آرگومانهای استاندارد سبک UNIX تجزیه شود؛ بنابراین بسیاری از تکمیلها این مورد را تنظیم نمیکنند.
- •
- بخش tag. همانطور که قبلاً توضیح داده شد، برچسبها (tags) برای تفکیک انواع تطابقهایی که یک تابع تکمیل میتواند در یک بافتار خاص تولید کند به کار میروند. هر تابع تکمیل میتواند از هر نام برچسبی که میخواهد استفاده کند، اما فهرستی از موارد رایجتر در زیر آمده است.
بافتار به تدریج همگام با اجرای توابع سرهم میشود؛ با نقطه ورود اصلی آغاز میگردد که :completion: و در صورت نیاز عنصر function را اضافه میکند. سپس تکمیلکننده عنصر completer را اضافه مینماید. تکمیل بافتاری نیز گزینههای command و argument را میافزاید. در نهایت، هنگامی که انواع تکمیل مشخص شدند، tag افزوده میشود. برای نمونه، نام بافتارِ
:completion::complete:dvips:option-o-1:files
بیانگر آن است که تکمیل عادی به عنوان اولین آرگومانِ گزینه -o از دستور dvips درخواست شده است:
dvips -o ...
و تابع تکمیل نامهای فایل را تولید خواهد کرد.
معمولاً تکمیل برای همه برچسبهای ممکن به ترتیبی که توسط تابع تکمیل مشخص شده است امتحان میشود. با این حال، این مورد را میتوان با استفاده از استایل tag-order تغییر داد. در این صورت، تکمیل به فهرست برچسبهای مشخصشده و با همان ترتیب معین محدود میگردد.
دستور قابل اتصال _complete_help تمام بافتارها و برچسبهای موجود برای تکمیل را در یک نقطه خاص نشان میدهد. این ویژگی روشی آسان برای یافتن اطلاعات مربوط به tag-order و سایر استایلها فراهم میکند. این دستور در بخش `Bindable Commands' در زیر شرح داده شده است.
سامانه تکمیل هنگام جستجوی استایلها از نامهای کامل بافتار، شامل برچسب، استفاده میکند. بنابراین، جستجوی مقدار یک استایل شامل دو چیز است: بافتار، که با خاصترین (مناسبترین) الگو تطبیق داده میشود، و خود نام استایل، که باید دقیقاً مطابقت داشته باشد. مثالهای زیر نشان میدهند که الگوها میتوانند برای استایلهایی با کاربرد گسترده بهصورت کلی، یا برای استایلهایی در شرایط خاصتر، با هر میزان از دقت مورد نظر تعریف شوند.
برای نمونه، بسیاری از توابع تکمیل میتوانند تطابقها را در دو حالت ساده و پرگو (verbose) تولید کنند و از استایل verbose برای تصمیمگیری در مورد استفاده از هر فرم بهره میبرند. برای اینکه تمام این توابع از حالت پرگو استفاده کنند، خط زیر را:
zstyle ':completion:*' verbose yes
در یک فایل راهاندازی (احتمالاً .zshrc) قرار دهید. این کار در هر بافتاری درون سامانه تکمیل به استایل verbose مقدار yes میدهد، مگر اینکه آن بافتار تعریف خاصتری داشته باشد. بهتر است از دادن الگو به صورت `*' خودداری کنید، مبادا که این استایل خارج از سامانه تکمیل معنای دیگری داشته باشد.
بسیاری از این استایلهای عمومی را میتوان به سادگی با استفاده از تابع compinstall پیکربندی کرد.
مثالی خاصتر از کاربرد استایل verbose، تکمیل مربوط به دستور توکار kill است. اگر این استایل تنظیم شده باشد، دستور توکار متنهای کامل کارها (jobs) و خطوط فرمان فرآیندها را فهرست میکند؛ در غیر این صورت، تنها شمارههای کار و PIDs ساده را نشان میدهد. برای خاموش کردن این استایل تنها برای این مورد:
zstyle ':completion:*:*:kill:*:*' verbose no
برای کنترل بیشتر، استایل میتواند از یکی از برچسبهای `jobs' یا `processes' استفاده کند. برای غیرفعال کردن نمایش پرگو تنها برای کارها:
zstyle ':completion:*:*:kill:*:jobs' verbose noگزینهٔ -e در zstyle حتی اجازه میدهد کد تابع تکمیل به عنوان آرگومان یک سبک (style) قرار گیرد؛ این امر مستلزم درک نسبی از سازوکارهای داخلی توابع تکمیل است (نگاه کنید به zshcompwid(1))). برای نمونه،
zstyle -e ':completion:*' hosts 'reply=($myhosts)'
این کار باعث میشود مقدار سبک hosts هر بار که به نام یک میزبان نیاز است، از متغیر myhosts خوانده شود؛ این ویژگی زمانی مفید است که مقدار myhosts بتواند بهصورت پویا تغییر کند. برای یک نمونهٔ کاربردی دیگر، به مثال موجود در توضیحات سبک file-list در ادامه نگاه کنید. این شیوه میتواند کُند باشد و برای سبکهایی که بهطور مکرر بررسی میشوند مانند menu و list-rows-first باید از آن اجتناب کرد.
توجه داشته باشید که ترتیب تعریف شدن سبکها اهمیتی ندارد؛ سازوکار سبکها از خاصترین تطابق ممکن برای یک سبک خاص جهت تعیین مجموعه مقادیر استفاده میکند. رشتهها بر الگوها ترجیح داده میشوند (برای مثال، `:completion::complete:::foo' خاصتر از `:completion::complete:::*' است)، و الگوهای طولانیتر نسبت به الگوی `*' برتری دارند. برای جزئیات به zmodules(1) نگاه کنید.
الگوهای بافتی که برای تطبیق بخشهای میانی بافت -- یعنی completer، command، و argument در :completion:function:completer:command:argument:tag -- از چیزی غیر از نویسهٔ عام (*) استفاده میکنند، باید شامل هر شش دونقطه (:) بهصورت صریح باشند. بدون این کار، الگویی مانند :completion:*:foo:* ممکن است foo را با مؤلفهای غیر از مؤلفهٔ موردنظر تطبیق دهد (برای مثال، تطبیق با completer در حالی که تطبیق با command مدنظر بوده است).
نام سبکها مانند نام برچسبها اختیاری است و به تابع تکمیل بستگی دارد. با این حال، دو بخش بعدی برخی از متداولترین برچسبها و سبکها را فهرست میکنند.
برچسبهای استاندارد (Standard Tags)
برخی از موارد زیر تنها هنگام جستجوی سبکهای خاص استفاده میشوند و به نوع تطابق اشاره ندارند.
- accounts
- برای جستجوی سبک users-hosts استفاده میشود
- all-expansions
- توسط تکمیلکنندهٔ _expand هنگام افزودن رشتهٔ منفردِ شامل تمام بسطهای ممکن استفاده میشود
- all-files
- برای نامهای تمام فایلها (متمایز از یک زیرمجموعهٔ خاص، برچسب globbed-files را ببینید).
- arguments
- برای آرگومانهای یک دستور
- arrays
- برای نامهای پارامترهای آرایهای
- association-keys
- برای کلیدهای آرایههای انجمنی؛ هنگام تکمیل درون اندیس پارامتری از این نوع استفاده میشود
- bookmarks
- هنگام تکمیل نشانکها (برای نمونه برای URLها و مجموعه توابع zftp)
- builtins
- برای نامهای دستورهای داخلی (builtin)
- characters
- برای نویسههای تکی در آرگومانهای دستورهایی مانند stty. همچنین هنگام تکمیل ردههای نویسهای پس از قلاب باز استفاده میشود
- colormapids
- برای شناسههای جدول رنگ (colormap ID) در سامانهٔ X
- colors
- برای نامهای رنگها
- commands
- برای نامهای دستورهای خارجی. همچنین توسط دستورهای پیچیده مانند cvs هنگام تکمیل نامهای زیردستورها استفاده میشود.
- contexts
- برای بافتها در آرگومانهای دستور داخلی zstyle
- corrections
- توسط تکمیلکنندههای _approximate و _correct برای تصحیحهای احتمالی استفاده میشود
- cursors
- برای نامهای مکاننما که توسط برنامههای سامانهٔ X استفاده میشوند
- default
- در برخی بافتها برای ارائهٔ یک پیشفرض در زمانی که برچسبهای خاصتر نیز معتبر هستند استفاده میشود. توجه داشته باشید این برچسب زمانی استفاده میشود که تنها فیلد function از نام بافت تنظیم شده باشد
- descriptions
- هنگام جستجوی مقدار سبک format برای تولید توضیحات مربوط به انواع تطابقها استفاده میشود
- devices
- برای نامهای فایلهای ویژهٔ دستگاه
- directories
- برای نامهای دایرکتوریها -- هنگامی که آرایهٔ cdpath تنظیم شده باشد، هنگام تکمیل آرگومانهای cd و دستورهای داخلی مرتبط، بهجای آن از local-directories استفاده میشود
- directory-stack
- برای مدخلهای موجود در پشتهٔ دایرکتوری
- displays
- برای نامهای نمایشگر (display) سامانهٔ X
- domains
- برای دامنههای شبکه
- email-plugin
- برای نشانیهای ایمیل از پسانهٔ `_email-plugin' متعلق به _email_addresses
- expansions
- توسط تکمیلکنندهٔ _expand برای واژههای منفرد (در مقایسه با مجموعهٔ کامل بسطها) حاصل از بسط یک واژه در خط فرمان استفاده میشود
- extensions
- برای افزونههای سرور X
- file-descriptors
- برای شمارههای توصیفگرهای باز فایل
- files
- برچسب عمومی تطبیق فایل که توسط توابع تکمیل نام فایل استفاده میشود
- fonts
- برای نامهای قلم سامانهٔ X
- fstypes
- برای انواع سیستمهای فایل (برای نمونه برای دستور mount)
- functions
- نامهای توابع -- معمولاً توابع پوسته، گرچه برخی دستورهای خاص ممکن است انواع دیگری از توابع را شناسایی کنند
- globbed-files
- برای نامهای فایل در صورتی که نام از طریق تطبیق الگو تولید شده باشد
- groups
- برای نامهای گروههای کاربری
- history-words
- برای واژههای برگرفته از تاریخچه
- hosts
- برای نامهای میزبان
- indexes
- برای اندیسهای آرایه
- interfaces
- برای رابطهای شبکه
- jobs
- برای کارها (همانطور که توسط دستور داخلی `jobs' فهرست میشوند)
- keymaps
- برای نامهای نگاشتهای کلید در zsh
- keysyms
- برای نامهای keysym سامانهٔ X.TP libraries برای نامهای کتابخانههای سیستم
- limits
- برای محدودیتهای سیستم
- local-directories
- برای نام دایرکتوریهایی که زیردایرکتوریِ دایرکتوری کاری جاری هستند، هنگام تکمیل آرگومانهای دستور توکار cd و دستورهای توکار مرتبط (با path-directories مقایسه شود) -- هنگامی که آرایهٔ cdpath تنظیم نشده باشد، بهجای آن از directories استفاده میشود
- mailboxes
- برای پوشههای رایانامه
- manuals
- برای نامهای صفحات راهنما (manual pages)
- maps
- برای نامهای نگاشت (مانند نگاشتهای NIS)
- messages
- برای جستجوی سبک format جهت پیامها استفاده میشود
- modifiers
- برای نامهای کلیدهای تبدیل X (اصلاحکنندههای X)
- modules
- برای ماژولها (مانند ماژولهای zsh)
- my-accounts
- برای جستجوی سبک users-hosts استفاده میشود
- named-directories
- برای دایرکتوریهای نامگذاریشده (حدسش را نمیزدید، مگر نه؟)
- names
- برای انواع مختلف نامها
- newsgroups
- برای گروههای USENET
- nicknames
- برای نامهای مستعار نگاشتهای NIS
- options
- برای گزینههای دستور
- original
- توسط تکمیلکنندههای _approximate، _correct و _expand هنگام ارائهٔ رشتهٔ اصلی به عنوان یک تطابق استفاده میشود
- other-accounts
- برای جستجوی سبک users-hosts استفاده میشود
- packages
- برای بستهها (مانند بستههای rpm یا بستههای نصبشدهٔ Debian)
- parameters
- برای نامهای پارامترها
- path-directories
- برای نامهای دایرکتوریهای یافتشده با جستجو در آرایهٔ cdpath هنگام تکمیل آرگومانهای cd و دستورهای توکار مرتبط (با local-directories مقایسه شود)
- paths
- برای جستجوی مقادیر سبکهای expand، ambiguous و special-dirs استفاده میشود
- pods
- برای podهای perl (فایلهای مستندات)
- ports
- برای درگاههای ارتباطی (پورتها)
- prefixes
- برای پیشوندها (مانند پیشوندهای یک URL)
- printers
- برای نامهای صف چاپگر
- processes
- برای شناسههای فرایند (PID)
- processes-names
- برای جستجوی سبک command هنگام تولید نامهای فرایندها برای killall استفاده میشود
- sequences
- برای توالیها (مانند توالیهای mh)
- sessions
- برای نشستها در مجموعه توابع zftp
- signals
- برای نامهای سیگنال
- strings
- برای رشتهها (مانند رشتههای جایگزینی برای دستور توکار cd)
- styles
- برای سبکهای استفادهشده توسط دستور توکار zstyle
- suffixes
- برای پسوندهای نام فایل
- برای برچسبها (مانند برچسبهای rpm)
- targets
- برای هدفهای makefile
- time-zones
- برای منطقههای زمانی (مانند هنگام تنظیم پارامتر TZ)
- types
- برای انواع هر چیزی (مانند انواع آدرس برای دستور xhost)
- urls
- برای جستجوی سبکهای urls و local هنگام تکمیل URLها استفاده میشود
- users
- برای نامهای کاربری
- values
- برای یکی از مجموعهای از مقادیر در فهرستهای خاص
- variant
- توسط _pick_variant برای جستجوی دستوری که باید هنگام تعیین برنامهٔ نصبشده برای یک نام دستور خاص اجرا شود، استفاده میشود.
- visuals
- برای جلوههای بصری X (visualها)
- warnings
- برای جستجوی سبک format جهت هشدارها استفاده میشود
- widgets
- برای نامهای ویجتهای zsh
- windows
- برای شناسههای پنجرههای X
- zsh-options
- برای گزینههای پوسته
توجه داشته باشید که مقادیر چندین مورد از این سبکها بیانگر مقادیر بولی (boolean) هستند. هر یک از رشتههای `true'، `on'، `yes' و `1' میتوانند برای مقدار `true' و هر یک از رشتههای `false'، `off'، `no' و `0' برای مقدار `false' استفاده شوند. رفتار به ازای هر مقدار دیگری تعریفنشده است مگر در مواردی که صراحتاً ذکر شده باشد. در صورت تنظیم نشدن سبک، مقدار پیشفرض ممکن است `true' یا `false' باشد.
برخی از این سبکها ابتدا برای هر برچسب (tag) ممکنِ متناظر با یک نوع تطابق بررسی میشوند، و اگر سبکی یافت نشد، برای برچسب default بررسی میگردند. بارزترین سبکهای این دسته عبارتند از menu، list-colors و سبکهای کنترلکنندهٔ فهرستبندی تکمیل مانند list-packed و last-prompt. هنگام بررسی برای برچسب default، تنها فیلد function از بافتار تنظیم خواهد شد، به طوری که سبکی که از برچسب default استفاده میکند معمولاً به شکلی شبیه به این تعریف میشود:
zstyle ':completion:*:default' menu ...
- accept-exact
- این سبک علاوه بر برچسبهای معتبر برای بافتار فعلی، برای برچسب default نیز بررسی میشود. اگر روی `true' تنظیم شده باشد و هر یک از تطابقهای آزمایشی با رشتهٔ موجود در خط فرمان یکسان باشد، این تطابق بلافاصله پذیرفته خواهد شد (حتی اگر در غیر این صورت مبهم تلقی میشد).
هنگام تکمیل مسیرها (جایی که برچسب استفادهشده `paths' است)، این سبک علاوه بر مقادیر بولی، هر تعداد الگو را نیز به عنوان مقدار میپذیرد. نامهای مسیری که با یکی از این الگوها مطابقت داشته باشند بلافاصله پذیرفته میشوند، حتی اگر خط فرمان حاوی اجزای مسیر دیگری باشد که تا حدی تایپ شدهاند و این اجزا با هیچ فایلی در دایرکتوری پذیرفتهشده مطابقت نداشته باشند.
این سبک همچنین توسط تکمیلکنندهٔ _expand استفاده میشود تا تصمیم بگیرد آیا کلماتی که با مدک (tilde) یا بسط پارامتر شروع میشوند باید بسط داده شوند یا خیر. به عنوان مثال، اگر پارامترهای foo و foobar وجود داشته باشند، رشتهٔ `$foo' تنها در صورتی بسط داده میشود که accept-exact روی `true' تنظیم شده باشد؛ در غیر این صورت سیستم تکمیل مجاز خواهد بود که $foo را به $foobar تکمیل کند. اگر سبک روی `continue' تنظیم شده باشد، _expand بسط را به عنوان یک تطابق اضافه میکند و به سیستم تکمیل نیز اجازه داده میشود تا ادامه دهد.
- accept-exact-dirs
- این سبک برای تکمیل نام فایل استفاده میشود. بر خلاف accept-exact، این یک مقدار بولی است. به طور پیشفرض، تکمیل نام فایل تمام اجزای یک مسیر را بررسی میکند تا ببیند آیا تکمیلی برای آن جزء وجود دارد یا خیر، حتی اگر آن جزء با یک دایرکتوری موجود مطابقت داشته باشد. به عنوان مثال، هنگام تکمیل پس از /usr/bin/، تابع تکمیلهای ممکن را برای /usr نیز بررسی میکند.
هنگامی که این سبک `true' باشد، هر پیشوندی از یک مسیر که با یک دایرکتوری موجود مطابقت داشته باشد، بدون هیچ تلاشی برای تکمیل بیشتر آن پذیرفته میشود. بنابراین، در مثال ارائهشده، مسیر /usr/bin/ بلافاصله پذیرفته شده و تکمیل در آن دایرکتوری امتحان میشود.
این سبک همچنین هنگام تکمیل پس از دایرکتوریهایی که با ارجاع به آنها ظاهر میشوند (مانند دایرکتوریهای .zfs در ZFS یا دایرکتوریهای .snapshot در NetApp) مفید است. وقتی این سبک تنظیم شده باشد، شل وجود دایرکتوری را در دایرکتوری والد بررسی نمیکند.
اگر میخواهید این رفتار را به طور کامل غیرفعال کنید، سبک path-completion (پایینتر را ببینید) را روی `false' تنظیم کنید.
- add-space
- این سبک توسط تکمیلکنندهٔ _expand استفاده میشود. اگر روی `true' (پیشفرض) باشد، یک فاصله پس از تمام کلمات حاصل از بسط درج میشود، یا در مورد نامهای دایرکتوری یک اسلش درج میگردد. اگر مقدار `file' باشد، تکمیلکننده تنها به نام فایلهای موجود فاصله اضافه میکند. هر یک از مقادیر بولی `true' یا مقدار `file' را میتوان با `subst' ترکیب کرد، که در این صورت تکمیلکننده به کلمات تولیدشده از بسط یک جایگزینی به شکل `$(...)' یا `${...}' فاصله اضافه نمیکند.
تکمیلکنندهٔ _prefix از این سبک به عنوان یک مقدار بولی ساده استفاده میکند تا تصمیم بگیرد آیا باید یک فاصله قبل از پسوند درج شود یا خیر.
- ambiguous
- این سبک هنگام تکمیل اجزای غیرنهایی مسیرهای فایل اعمال میشود، به عبارت دیگر مواردی که دارای اسلش انتهایی هستند. اگر تنظیم شده باشد، مکاننما پس از اولین جزء مبهم باقی میماند، حتی اگر تکمیل منویی در حال استفاده باشد. این سبک همیشه با برچسب paths بررسی میشود.
- assign-list
- هنگام تکمیل پس از علامت مساوی که به عنوان یک انتساب تلقی میشود، سیستم تکمیل معمولاً تنها یک نام فایل را کامل میکند. در برخی موارد مقدار ممکن است فهرستی از نامهای فایل باشد که با دونقطه (colon) از هم جدا شدهاند، مانند PATH و پارامترهای مشابه. این سبک میتواند روی فهرستی از الگوهای منطبق با نام چنین پارامترهایی تنظیم شود.
حالت پیشفرض این است که وقتی کلمه روی خط فرمان از قبل حاوی یک دونقطه باشد، تکمیل به صورت فهرست انجام شود.
- auto-description
- در صورت تنظیم، مقدار این سبک به عنوان توضیحات برای گزینههایی استفاده میشود که توسط توابع تکمیل توصیف نشدهاند اما دقیقاً یک آرگومان دارند. توالی `%d' در مقدار، با توضیحات مربوط به این آرگومان جایگزین خواهد شد. بسته به ترجیحات شخصی، ممکن است تنظیم این سبک روی چیزی مانند `specify: %d' مفید باشد. توجه داشته باشید که این ممکن است برای برخی دستورها کار نکند.
- avoid-completer
- این سبک توسط تکمیلکنندهٔ _all_matches استفاده میشود تا تصمیم بگیرد آیا رشتهٔ متشکل از تمام تطابقها باید به فهرستی که در حال حاضر تولید میشود اضافه شود یا خیر. مقدار آن فهرستی از نامهای تکمیلکنندهها است. اگر هر یک از آنها نام تکمیلکنندهای باشد که تطابقها را در این تکمیل تولید کرده است، رشته اضافه نخواهد شد.
مقدار پیشفرض این سبک `_expand _oldlist _correct _approximate' است؛ یعنی شامل تکمیلکنندههایی است که تقریباً هیچگاه رشتهای حاوی تمام تطابقها برای آنها مورد نظر نخواهد بود.
- cache-path
- این سبک مسیری را مشخص میکند که در آن هر فایل حافظهٔ پنهان (cache) شامل دادههای تخلیهشدهٔ تکمیل ذخیره میشود. مقدار پیشفرض آن `$ZDOTDIR/.zcompcache'، یا در صورت تعریف نشدن $ZDOTDIR، `$HOME/.zcompcache' است. حافظهٔ پنهان تکمیل استفاده نخواهد شد مگر اینکه سبک use-cache تنظیم شده باشد.
- cache-policy
- این سبک تابعی را مشخص میکند که برای تشخیص نیاز یا عدم نیاز به بازسازی یک حافظهٔ پنهان استفاده خواهد شد. بخش مربوط به تابع _cache_invalid در ادامه را ببینید.
- call-command
- این سبک در توابع مربوط به دستورهایی مانند make و ant استفاده میشود؛ جایی که فراخوانی مستقیم دستور برای تولید تطابقها مشکلاتی مانند کند بودن به همراه دارد یا همانند مورد make میتواند بالقوه باعث اجرای اقداماتی در makefile شود. اگر روی `true' تنظیم شده باشد، دستور برای تولید تطابقها فراخوانی میشود. مقدار پیشفرض این سبک `false' است.
- command
- در بسیاری از جاها، توابع تکمیل برای تولید فهرست تکمیلها نیاز به فراخوانی دستورهای خارجی دارند. از این سبک میتوان برای جایگزینی دستوری که در برخی از این موارد فراخوانی میشود استفاده کرد. عناصر مقدار با فاصله به هم متصل میشوند تا یک خط فرمان برای اجرا تشکیل دهند. مقدار همچنین میتواند با یک خط تیره شروع شود، که در این حالت دستور معمول به انتها افزوده خواهد شد؛ این امر بیش از همه برای قرار دادن `builtin' یا `command' در ابتدا مفید است تا اطمینان حاصل شود که نسخهٔ مناسب دستور فراخوانی میشود، برای مثال برای جلوگیری از فراخوانی یک تابع شل همنام با یک دستور خارجی.
به عنوان مثال، تابع تکمیل برای شناسههای فرایند از این سبک با برچسب processes برای تولید شناسههایی جهت تکمیل و فهرست فرایندها برای نمایش (اگر سبک verbose برابر `true' باشد) استفاده میکند. فهرست تولیدشده توسط این دستور باید شبیه خروجی دستور ps باشد. سطر اول نمایش داده نمیشود، اما در آن برای یافتن رشتهٔ `PID' (یا `pid') جستجو صورت میگیرد تا موقعیت شناسههای فرایند در سطرهای بعدی مشخص شود. اگر سطر حاوی `PID' نباشد، اولین اعداد در هر یک از سطرهای دیگر به عنوان شناسههای فرایند برای تکمیل در نظر گرفته میشوند.
توجه داشته باشید که تابع تکمیل معمولاً باید برای هر تلاش در جهت تولید فهرست تکمیل، دستور مشخصشده را فراخوانی کند. بنابراین باید دقت شود که تنها دستورهایی مشخص شوند که اجرای آنها زمان کوتاهی میبرد، و به ویژه از هر دستوری که ممکن است هرگز پایان نیابد اجتناب شود.
- command-path
- این سبک فهرستی از دایرکتوریها برای جستجوی دستورها جهت تکمیل است. مقدار پیشفرض این سبک، مقدار پارامتر ویژهٔ path است..TP commands این سبک توسط تابعی استفاده میشود که زیردستورها را برای اسکریپتهای مقداردهی اولیه سیستم (واقع در /etc/init.d یا جایی نزدیک به آن) کامل میکند. مقادیر آن دستورهای پیشفرضی را مشخص میکنند که باید برای آن دسته از دستورهایی کامل شوند که تابع کاملسازی قادر به تشخیص خودکار آنها نیست. مقدار پیشفرض برای این سبک، دو رشتهی `start' و `stop' است.
- complete
- این سبک توسط تابع _expand_alias هنگامی که به عنوان یک دستور مقیدشدنی فراخوانی میشود، به کار میرود. اگر روی `true' تنظیم شده باشد و کلمهی موجود در خط فرمان نام یک نام مستعار (alias) نباشد، نامهای مستعار منطبق کامل خواهند شد.
- complete-options
- این سبک توسط کاملکننده برای دستورهای cd، chdir و pushd استفاده میشود. برای این دستورها، از یک - برای معرفی یک مدخل پشتهی دایرکتوری استفاده میشود و کاملسازی این موارد بسیار رایجتر از کاملسازی گزینهها است. بنابراین، مگر اینکه مقدار این سبک `true' باشد، گزینهها حتی پس از یک - اولیه کامل نخواهند شد. اگر روی `true' باشد، گزینهها پس از یک - اولیه کامل میشوند، مگر اینکه یک -- مقدم در خط فرمان وجود داشته باشد.
- completer
- رشتههایی که به عنوان مقدار این سبک ارائه میشوند، نام توابع کاملکننده مورد استفاده را مشخص میکنند. توابع کاملکنندهی موجود در بخش `Control Functions' در زیر شرح داده شدهاند.
هر رشته میتواند نام یک تابع کاملکننده یا رشتهای به شکل `function:name' باشد. در حالت اول، فیلد completer بافتار شامل نام کاملکننده بدون زیرخط ابتدایی و با جایگزینی تمام زیرخطهای دیگر با خط تیره خواهد بود. در حالت دوم، function نام کاملکنندهای است که باید فراخوانی شود، اما بافتار شامل name تعریفشده توسط کاربر در فیلد completer بافتار خواهد بود. اگر name با یک خط تیره شروع شود، رشتهی مربوط به بافتار همانند حالت اول از نام تابع کاملکننده به همراه name که به آن الحاق شده ساخته میشود. به عنوان مثال:
zstyle ':completion:*' completer _complete _complete:-foo
در اینجا، کاملسازی کاملکنندهی _complete را دو بار فراخوانی میکند، یک بار با استفاده از `complete' و یک بار با استفاده از `complete-foo' در فیلد completer بافتار. به طور معمول، استفاده از یک کاملکننده بیش از یک بار فقط زمانی منطقی است که با فرم `functions:name' استفاده شود، زیرا در غیر این صورت نام بافتار در تمام فراخوانیهای کاملکننده یکسان خواهد بود؛ استثناهای احتمالی این قاعده کاملکنندههای _ignored و _prefix هستند.
مقدار پیشفرض برای این سبک `_complete _ignored' است: فقط کاملسازی انجام خواهد شد، ابتدا با استفاده از سبک ignored-patterns و آرایهی $fignore، و سپس بدون نادیده گرفتن تطابقها.
- condition
- این سبک توسط تابع کاملکنندهی _list استفاده میشود تا تصمیم بگیرد آیا درج تطابقها باید بدون قید و شرط به تعویق بیفتد یا خیر. مقدار پیشفرض `true' است.
- delimiters
- این سبک هنگام افزودن یک جداکننده برای استفاده با اصلاحکنندههای تاریخچه یا توصیفکنندههای glob که آرگومانهای تفکیکشده دارند، به کار میرود. این سبک آرایهای از جداکنندههای ترجیحی برای افزودن است. نویسههای غیرخاص ترجیح داده میشوند زیرا در غیر این صورت ممکن است سیستم کاملسازی سردرگم شود. فهرست پیشفرض :، +، /، -، % است. این فهرست میتواند خالی باشد تا کاربر را وادار به تایپ یک جداکننده کند.
- disabled
- اگر روی `true' تنظیم شود، کاملکننده و دستور مقیدشدنی _expand_alias تلاش خواهند کرد نامهای مستعار غیرفعال را نیز بسط دهند. مقدار پیشفرض `false' است.
- domains
- فهرستی از نامهای دامنههای شبکه برای کاملسازی. اگر تنظیم نشده باشد، نامهای دامنه از فایل /etc/resolv.conf گرفته خواهند شد.
- environ
- سبک environ هنگام کاملسازی برای `sudo' استفاده میشود. این سبک به آرایهای از انتسابهای `VAR=value' تنظیم میشود تا قبل از فراخوانی کاملسازی برای دستور هدف، به محیط محلی صادر شوند.
zstyle ':completion:*:sudo::' environ \ PATH="/sbin:/usr/sbin:$PATH" HOME="/root"
- expand
- این سبک هنگام کاملسازی رشتههای متشکل از چند بخش، مانند نام مسیرها، استفاده میشود.
اگر یکی از مقادیر آن رشتهی `prefix' باشد، کلمهی تا حدی تایپشده از خط تا جای ممکن بسط داده میشود حتی اگر بخشهای انتهایی قابل کاملسازی نباشند.
اگر یکی از مقادیر آن رشتهی `suffix' باشد، نامهای منطبق برای مؤلفههای پس از اولین مؤلفهی مبهم نیز اضافه خواهند شد. این بدان معناست که رشتهی حاصل طولانیترین رشتهی غیرمبهم ممکن است. با این حال، میتوان از کاملسازی منویی برای پیمایش در میان تمام تطابقها استفاده کرد.
- extra-verbose
- اگر این سبک روی `true' تنظیم شود، فهرست کاملسازی حتی پرگوتر خواهد بود.
در حال حاضر، این سبک برای برچسبهای commands و parameters استفاده میشود. اگر برای برچسب commands (یا parameters) مقدار `true' داشته باشد، توضیحات کوتاهی از دستورها (یا مقادیر پارامترها) همراه با نامهای دستور (یا پارامتر) نمایش داده میشوند.
- fake
- این سبک میتواند برای هر بافتار کاملسازی تنظیم شود. این سبک رشتههای اضافی را مشخص میکند که همواره در آن بافتار کامل خواهند شد. قالب هر رشته به صورت `value:description' است؛ دونقطه و شرح میتوانند حذف شوند، اما هر دونقطهی لفظی در value باید با یک بکاسلش نقلقول شود. هر description ارائهشده در کنار مقدار در فهرستهای کاملسازی نمایش داده میشود.
هنگام مشخص کردن رشتههای ساختگی، استفاده از یک بافتار به اندازهی کافی محدودکننده حائز اهمیت است. توجه داشته باشید که سبکهای fake-files و fake-parameters قابلیتهای بیشتری را هنگام کاملسازی فایلها یا پارامترها ارائه میدهند.
- fake-always
- این سبک دقیقاً مانند سبک fake کار میکند، با این تفاوت که سبک ignored-patterns روی آن اعمال نمیشود. این ویژگی این امکان را فراهم میکند که با تنظیم الگوهای نادیدهگرفتهشده روی `*'، یک مجموعه از تطابقها را کاملاً بازنویسی کرد.
مثال زیر روشی برای تکمیل هر برچسب با دادههای دلخواه نشان میدهد، در حالی که برای اهداف نمایشی مانند یک برچسب جداگانه رفتار کند. در این مثال، از قابلیتهای سبک tag-order برای تقسیم برچسب named-directories به دو برچسب هنگام انجام کاملسازی با کاملکنندهی استاندارد complete برای آرگومانهای cd استفاده میکنیم. برچسب named-directories-normal طبق روال عادی رفتار میکند، اما برچسب named-directories-mine شامل مجموعهای ثابت از دایرکتوریها است. این کار تأثیر افزودن گروه تطابق `extra directories' با کاملسازیهای ارائهشده را دارد.
zstyle ':completion::complete:cd:*' tag-order \ 'named-directories:-mine:extra\ directories named-directories:-normal:named\ directories *' zstyle ':completion::complete:cd:*:named-directories-mine' \ fake-always mydir1 mydir2 zstyle ':completion::complete:cd:*:named-directories-mine' \ ignored-patterns '*'
- fake-files
- این سبک هنگام کاملسازی فایلها استفاده میشود و بدون برچسب جستجو میگردد. مقادیر آن به شکل `dir:names...' هستند. این کار names (رشتههای جداشده با فاصله) را به عنوان تطابقهای احتمالی هنگام کاملسازی در دایرکتوری dir اضافه میکند، حتی اگر چنین فایلهایی در واقعیت وجود نداشته باشند. دایرکتوری dir ممکن است یک الگو باشد؛ نویسههای الگو یا دونقطهها در dir باید با بکاسلش نقلقول شوند تا به صورت تحتاللفظی تلقی گردند.
این ویژگی میتواند در سیستمهایی که از سیستمهای فایل ویژهای پشتیبانی میکنند که نام مسیرهای سطح بالای آنها را نمیتوان فهرست کرد یا با الگوهای glob تولید نمود مفید باشد (اما برای روش کلیتر برخورد با این مشکل، accept-exact-dirs را ببینید). همچنین میتوان از آن برای دایرکتوریهایی استفاده کرد که کاربر مجوز خواندن آنها را ندارد..PP از ساختار الگو میتوان برای افزودن یک مدخل `magic' خاص به تمام دایرکتوریهای یک سیستمفایل بهخصوص استفاده کرد.
- fake-parameters
- این سبک توسط تابع کاملسازی برای نام پارامترها استفاده میشود. مقادیر آن نامهای پارامترهایی هستند که ممکن است هنوز مقداردهی نشده باشند اما با این وجود باید کامل شوند. هر نام همچنین میتواند با یک دونقطه و رشتهای که نوع پارامتر را تعیین میکند دنبال شود (مانند `scalar'، `array' یا `integer'). اگر نوع مشخص شده باشد، نام تنها در صورتی کامل خواهد شد که در آن زمینه خاص، پارامترهایی از آن نوع لازم باشند. نامهایی که هیچ نوعی برای آنها تعیین نشده است همیشه کامل خواهند شد.
- file-list
- این سبک مشخص میکند آیا فایلهایی که با سازوکار استاندارد توکار کامل شدهاند با یک فهرست طولانی مشابه ls -l فهرستبندی شوند یا خیر. توجه داشته باشید که این ویژگی برای دریافت اطلاعات فایل از ماژول پوسته zsh/stat استفاده میکند؛ این امر دستور توکار stat را بارگذاری میکند که جایگزین هر برنامه اجرایی خارجی stat خواهد شد. برای جلوگیری از این موضوع، میتوان کد زیر را در یک فایل مقداردهی اولیه گنجاند:
zmodload -i zsh/stat disable stat
این سبک میتواند روی مقدار `true' (یا `all')، یا یکی از مقادیر `insert' یا `list' تنظیم شود؛ که نشاندهنده آن است که فایلها در همه شرایط، یا هنگام تلاش برای درج نام فایل، یا هنگام فهرست کردن نامهای فایل بدون تلاش برای درج آن، با قالب طولانی فهرست شوند.
بهطور کلیتر، این مقدار میتواند آرایهای از هر یک از مقادیر بالا باشد، که در صورت تمایل =num به دنبال آن میآید. اگر num وجود داشته باشد، حداکثر تعداد تطابقهایی را مشخص میکند که سبک فهرستبندی طولانی برای آنها استفاده خواهد شد. برای مثال،
zstyle ':completion:*' file-list list=20 insert=10
مشخص میکند که قالب طولانی هنگام فهرست کردن حداکثر ۲۰ فایل یا درج فایلی با حداکثر ۱۰ تطابق استفاده خواهد شد (به فرض اینکه اصلاً قرار باشد فهرستی نشان داده شود، برای مثال در یک کاملسازی مبهم)، در غیر این صورت از قالب کوتاه استفاده میشود.
zstyle -e ':completion:*' file-list \
'(( ${+NUMERIC} )) && reply=(true)'
مشخص میکند هر زمانی که یک آرگومان عددی ارائه شود قالب طولانی استفاده خواهد شد، در غیر این صورت قالب کوتاه بهکار میرود.
- file-patterns
- این سبک توسط تابع استاندارد برای کاملسازی نام فایلها، یعنی _files، استفاده میشود. اگر این سبک تنظیم نشده باشد، بسته به انواع فایلهایی که فراخوانندهٔ _files انتظار دارد، حداکثر تا سه برچسب پیشنهاد میشود: `globbed-files'، `directories' و `all-files'. دو برچسب اول (`globbed-files' و `directories') معمولاً با هم پیشنهاد میشوند تا کاملسازی فایلها در زیردایرکتوریها آسانتر شود.
سبک file-patterns جایگزینهایی برای برچسبهای پیشفرض ارائه میدهد که دیگر استفاده نمیشوند. مقدار آن از عناصری به شکل `pattern:tag' تشکیل شده است؛ هر رشته میتواند شامل هر تعداد از چنین مشخصاتی باشد که با فاصله از هم جدا شدهاند.
الگوی pattern الگویی است که باید برای تولید نام فایلها استفاده شود. هر رخداد از دنباله `%p' با هر الگو(هایی) که توسط تابع فراخوانندهٔ _files ارسال شده است جایگزین میشود. دونقطهها در الگو باید با یک بکاسلش همراه باشند تا از دونقطه قبل از tag قابل تمایز شوند. اگر بیش از یک الگو مورد نیاز باشد، الگوها را میتوان درون آکولادها و جدا شده با کاما قرار داد.
برچسبهای (tagهای) تمام رشتهها در این مقدار توسط _files پیشنهاد خواهند شد و هنگام جستجوی سایر سبکها استفاده میشوند. هر tag در همان کلمه، همزمان و قبل از کلمات بعدی پیشنهاد خواهد شد. اگر هیچ `:tag' داده نشود، برچسب `files' استفاده خواهد شد.
همچنین به دنبال tag میتواند یک دونقطه اختیاری دوم و یک شرح (description) بیاید، که برای `%d' در مقدار سبک format (اگر تنظیم شده باشد) به جای شرح پیشفرضی که تابع کاملسازی ارائه میدهد استفاده خواهد شد. گنجاندن شرح همچنین به گزینههای وابسته مانند گروهبندی کاملسازی تقدم میبخشد، بنابراین میتوان از آن در جایی که فایلها باید جدا شوند استفاده کرد.
برای مثال، برای اینکه دستور rm ابتدا فقط نام فایلهای شیء (object files) و سپس در صورت عدم وجود فایل شیء منطبق، نام تمام فایلها را کامل کند:
zstyle ':completion:*:*:rm:*:*' file-patterns \
'*.o:object-files' '%p:all-files'
برای تغییر رفتار پیشفرض کاملسازی فایل -- پیشنهاد فایلهای منطبق با یک الگو و دایرکتوریها در اولین تلاش، سپس تمام فایلها -- به گونهای که فقط فایلهای منطبق در اولین تلاش، سپس دایرکتوریها، و در نهایت تمام فایلها پیشنهاد شوند:
zstyle ':completion:*' file-patterns \
'%p:globbed-files' '*(-/):directories' '*:all-files'
این روش حتی در جایی که هیچ الگوی خاصی وجود ندارد کار میکند: _files تمام فایلها را با استفاده از الگوی `*' در مرحله اول مطابقت میدهد و هنگامی که این الگو را ببیند متوقف میشود. همچنین توجه داشته باشید که هرگز یک الگو را بیش از یک بار برای یک تلاش کاملسازی امتحان نخواهد کرد.
برای جدا کردن دایرکتوریها در یک گروه جداگانه از فایلها، اما همچنان کاملسازی آنها در اولین تلاش، باید شرحی ارائه شود. توجه داشته باشید که دایرکتوریها باید بهصراحت از globbed-files مستثنی شوند زیرا `*' با دایرکتوریها نیز تطابق مییابد. برای گروهبندی، تنظیم سبک group-name نیز الزامی است.
zstyle ':completion:*' file-patterns \
'%p(^-/):globbed-files *(-/):directories:location'
در طول اجرای توابع کاملسازی، گزینه EXTENDED_GLOB فعال است، بنابراین نویسههای `#'، `~' و `^' در الگوها معانی خاصی دارند.
- file-sort
- تابع استاندارد کاملسازی نام فایل از این سبک بدون برچسب برای تعیین ترتیبی که نامها باید فهرست شوند استفاده میکند؛ کاملسازی منو با همان ترتیب بین آنها جابهجا خواهد شد. مقادیر ممکن عبارتند از: `size' برای مرتبسازی بر اساس اندازه فایل؛ `links' برای مرتبسازی بر اساس تعداد پیوندهای فایل؛ `modification' (یا `time' یا `date') برای مرتبسازی بر اساس زمان آخرین تغییر؛ `access' برای مرتبسازی بر اساس زمان آخرین دسترسی؛ و `inode' (یا `change') برای مرتبسازی بر اساس زمان آخرین تغییر inode. اگر سبک روی هر مقدار دیگری تنظیم شود، یا تنظیم نشده باشد، فایلها بر اساس نام و به ترتیب حروف الفبا مرتب خواهند شد. اگر مقدار شامل رشته `reverse' باشد، مرتبسازی به ترتیب معکوس انجام میشود. اگر مقدار شامل رشته `follow' باشد، برچسبهای زمانی به مقصدهای پیوندهای نمادین مرتبط میشوند؛ مقدار پیشفرض استفاده از برچسبهای زمانی خود پیوندها است.
- file-split-chars
- مجموعهای از نویسهها که باعث میشود تمام کاملسازیهای فایل برای زمینه دادهشده در نقطهای که هر یک از نویسهها رخ میدهد تفکیک شوند. یک کاربرد معمول، تنظیم سبک روی : است؛ سپس هر چیزی تا و شامل آخرین : در رشته فعلی هنگام کاملسازی فایلها نادیده گرفته میشود. از آنجا که این رفتار بسیار سختگیرانه و کلی است، معمولاً ترجیح داده میشود توابع کاملسازی برای زمینههایی که این رفتار در آنها مفید است بهروزرسانی شوند.
- filter
- پلاگین ldap در کاملسازی نشانیهای رایانامه (نگاه کنید به _email_addresses) از این سبک برای مشخص کردن صفتهایی استفاده میکند که هنگام پالایش مدخلها باید با آنها تطابق داده شود. برای مثال، اگر سبک روی `sn' تنظیم شده باشد، تطابق در برابر نامهای خانوادگی انجام میشود. فیلترسازی استاندارد LDAP استفاده میشود بنابراین تطابق معمول کاملسازی نادیده گرفته میشود. اگر این سبک تنظیم نشده باشد، از پلاگین LDAP صرفنظر میشود. همچنین ممکن است لازم باشد سبک command را تنظیم کنید تا نحوه اتصال به کارساز LDAP خود را مشخص نمایید.
- force-list
- این سبک نمایش فهرستی از کاملسازیها را در هر نقطهای که فهرستبندی انجام میشود اجباری میکند، حتی در مواردی که فهرست معمولاً پنهان میشود. برای مثال، در حالت عادی فهرست تنها در صورتی نشان داده میشود که دستکم دو تطابق متفاوت وجود داشته باشد. با تنظیم این سبک روی `always'، فهرست همیشه نشان داده خواهد شد، حتی اگر تنها یک تطابق تکی وجود داشته باشد که بلافاصله پذیرفته شود. این سبک همچنین میتواند روی یک عدد تنظیم شود. در این حالت، اگر دستکم به همان تعداد تطابق وجود داشته باشد، حتی اگر همه آنها رشته یکسانی را درج کنند، فهرست نشان داده خواهد شد. این استایل برای برچسب پیشفرض و همچنین برای هر برچسب معتبر جهت کاملسازی فعلی بررسی میشود. بنابراین فهرستبندی میتواند تنها برای انواع خاصی از تطابق اجباری شود.
- format
- اگر این استایل برای برچسب descriptions تنظیم شود، مقدار آن به عنوان رشتهای برای نمایش در بالای تطابقها در فهرستهای کاملسازی استفاده میشود. توالی «%d» در این رشته با توضیح کوتاهی از ماهیت این تطابقها جایگزین خواهد شد. این رشته ممکن است همچنین حاوی توالیهای مشخصه خروجی باشد که توسط compadd -X فهمیده میشوند (ببینید zshcompwid(1)).
این استایل پیش از بررسی برای برچسب descriptions، برای هر برچسب معتبر جهت کاملسازی فعلی بررسی میشود. بنابراین میتوان رشتههای قالببندی متفاوتی را برای انواع مختلف تطابق تعریف کرد.
همچنین توجه داشته باشید که برخی از توابع کاملساز توالیهای «%» اضافی تعریف میکنند. این موارد ذیل توابع کاملسازی که از آنها استفاده میکنند شرح داده شدهاند.
برخی توابع کاملسازی پیامهایی را نمایش میدهند که ممکن است با تنظیم این استایل برای برچسب messages سفارشیسازی شوند. در اینجا، «%d» با پیامی که توسط تابع کاملسازی ارائه شده است جایگزین میشود.
در نهایت، رشته قالببندی با برچسب warnings بررسی میشود، برای استفاده در زمانی که اصلاً هیچ تطابقی تولید نشود. در این حالت «%d» با توضیحات تطابقهای مورد انتظار که با فاصله جدا شدهاند جایگزین میشود. توالی «%D» با همان توضیحات جداشده با خطوط جدید جایگزین میشود.
استفاده از مشخصکنندههای پهنای فیلد به سبک printf با «%d» و توالیهای گریز مشابه ممکن است. این کار توسط دستور توکار zformat از ماژول zsh/zutil مدیریت میشود، ببینید zshmodules(1).
- gain-privileges
- اگر روی true تنظیم شود، این استایل استفاده از دستورهایی مانند sudo یا doas را برای کسب امتیازات بیشتر هنگام بازیابی اطلاعات جهت کاملسازی فعال میکند. این کار تنها زمانی انجام میشود که دستوری مانند sudo در خط فرمان ظاهر شود. برای اجبار به استفاده از مثلاً sudo یا بازنویسی هر پیشوندی که ممکن است به دلیل gain-privileges افزوده شود، میتوان از استایل command با مقداری که با یک خط تیره شروع میشود استفاده کرد.
- glob
- این مورد توسط کاملساز _expand استفاده میشود. اگر روی «true» (پیشفرض) تنظیم شود، انطباق الگو (globbing) روی کلمات حاصل از جایگزینی قبلی (استایل substitute را ببینید) یا در غیر این صورت رشته اصلی از خط آزمایش خواهد شد.
- global
- اگر این مورد روی «true» (پیشفرض) تنظیم شود، کاملساز _expand_alias و دستور قابل اتصال تلاش خواهند کرد تا نامهای مستعار سراسری (global aliases) را بسط دهند.
- group-name
- سیستم کاملسازی میتواند انواع مختلف تطابقها را که در فهرستهای جداگانه ظاهر میشوند، گروهبندی کند. این استایل میتواند برای تعیین نام گروهها برای برچسبهای مشخص استفاده شود. به عنوان مثال، در موقعیت دستور، سیستم کاملسازی نام دستورهای توکار و خارجی، نامهای مستعار، توابع پوسته، پارامترها و کلمات رزرو شده را به عنوان کاملسازیهای ممکن تولید میکند. برای داشتن دستورهای خارجی و توابع پوسته در فهرستهای جداگانه:
zstyle ':completion:*:*:-command-:*:commands' \
group-name commands
zstyle ':completion:*:*:-command-:*:functions' \
group-name functions
در نتیجه، هر تطابق با همان برچسب در همان گروه نمایش داده خواهد شد.
اگر نام ارائهشده رشته خالی باشد، نام برچسب مربوط به تطابقها به عنوان نام گروه استفاده خواهد شد. بنابراین، برای نمایش جداگانه تمام انواع مختلف تطابقها، میتوان به سادگی تنظیم کرد:
zstyle ':completion:*' group-name ''
تمام تطابقهایی که هیچ نام گروهی برای آنها تعریف نشده است در گروهی به نام -default- قرار خواهند گرفت.
برای نمایش نام گروه در خروجی، استایل format (رجوع شود به آن) را ذیل برچسب descriptions ببینید.
- group-order
- این استایل مکمل استایل group-name است تا ترتیب نمایش گروههای تعریفشده با آن استایل را مشخص کند (مقایسه کنید با tag-order که تعیین میکند اصلاً کدام کاملسازیها ظاهر شوند). گروههای نامبرده به ترتیب ارائهشده نشان داده میشوند؛ هر گروه دیگر به ترتیبی که توسط تابع کاملسازی تعریف شده است نشان داده خواهد شد.
برای مثال، برای اینکه هنگام کاملسازی در موقعیت دستور، نامهای دستورهای توکار، توابع پوسته و دستورهای خارجی به همین ترتیب ظاهر شوند:
zstyle ':completion:*:*:-command-:*:*' group-order \
builtins functions commands
- groups
- فهرستی از نامهای گروههای یونیکس (UNIX). اگر این مقدار تنظیم نشده باشد، نام گروهها از پایگاه داده YP یا فایل «/etc/group» گرفته میشود.
- اگر روی «true» تنظیم شود، تطابقهای زمینه دادهشده فهرست نخواهند شد، اگرچه هرگونه توضیحی برای تطابقها که با استایل format تنظیم شده باشد نمایش داده خواهد شد. اگر روی «all» تنظیم شود، حتی توضیحات نیز نمایش داده نخواهد شد.
توجه داشته باشید که تطابقها همچنان کامل خواهند شد؛ آنها فقط در فهرست نشان داده نمیشوند. برای جلوگیری از در نظر گرفته شدن تطابقها به عنوان کاملسازیهای ممکن به طور کلی، میتوان استایل tag-order را همانطور که در ادامه شرح داده شده است تغییر داد.
- hosts
- فهرستی از نامهای میزبانهایی که باید کامل شوند. اگر این مقدار تنظیم نشده باشد، نام میزبانها از فایل «/etc/hosts» گرفته میشود.
- hosts-ports
- این استایل توسط دستورهایی استفاده میشود که به نامهای میزبان و پورتهای شبکه نیاز داشته یا آنها را میپذیرند. رشتههای موجود در این مقدار باید به شکل «host:port» باشند. پورتهای معتبر با حضور نامهای میزبان مشخص میشوند؛ چندین پورت برای یک میزبان یکسان میتوانند ظاهر شوند.
- ignore-line
- این استایل برای هر برچسب معتبر برای کاملسازی فعلی بررسی میشود. اگر روی «true» تنظیم شود، هیچیک از کلماتی که در حال حاضر روی خط هستند به عنوان کاملسازیهای ممکن در نظر گرفته نخواهند شد. اگر روی «current» تنظیم شود، کلمهای که مکاننما روی آن قرار دارد به عنوان یک کاملسازی ممکن در نظر گرفته نخواهد شد. مقدار «current-shown» مشابه است اما تنها در صورتی اعمال میشود که فهرست کاملسازیها در حال حاضر روی صفحه نمایش داده شده باشد. در نهایت، اگر این استایل روی «other» تنظیم شود، تمام کلمات روی خط به جز کلمه فعلی از کاملسازیهای ممکن کنار گذاشته خواهند شد.
مقادیر «current» و «current-shown» تا حدی شبیه نقطه مقابل استایل accept-exact هستند: فقط رشتههایی با نویسههای جاافتاده کامل خواهند شد.
توجه داشته باشید که تقریباً به طور قطع نمیخواهید این استایل را برای یک زمینه عمومی مانند «:completion:*» روی «true» یا «other» تنظیم کنید. زیرا این کار از کاملسازی، برای مثال، چندباره گزینهها جلوگیری میکند حتی اگر دستور مورد نظر گزینه را بیش از یک بار بپذیرد.
- ignore-parents
- این استایل بدون برچسب توسط تابعی که نام مسیرها را کامل میکند بررسی میشود تا تعیین کند که آیا نام دایرکتوریهایی که قبلاً در کلمه فعلی ذکر شدهاند، یا نام دایرکتوری کاری فعلی نادیده گرفته شوند یا خیر. این مقدار باید شامل یک یا هر دو مورد از رشتههای زیر باشد:
- parent
- نام هر دایرکتوری که مسیر آن قبلاً در کلمه روی خط وجود داشته باشد نادیده گرفته میشود. برای مثال، هنگام کاملسازی پس از foo/../، دایرکتوری foo به عنوان یک کاملسازی معتبر در نظر گرفته نخواهد شد..TP pwd نام دایرکتوری کاری فعلی کامل نخواهد شد؛ بنابراین، برای نمونه، کاملسازی پس از ../ از نام دایرکتوری فعلی استفاده نخواهد کرد.
علاوه بر این، مقدار میتواند شامل یک یا هر دو مورد از موارد زیر باشد:
- ..
- نادیده گرفتن دایرکتوریهای مشخصشده تنها زمانی که کلمهی روی خط شامل زیررشتهی `../' باشد.
- directory
- نادیده گرفتن دایرکتوریهای مشخصشده تنها هنگامی که نام دایرکتوریها کامل میشوند، نه در هنگام کاملسازی نام فایلها.
مقادیر مستثنیشده مشابه با مقادیر سبک ignored-patterns عمل میکنند، بنابراین میتوان آنها را با استفاده از کاملکنندهی _ignored دوباره به بررسی بازگرداند.
- ignored-patterns
- فهرستی از الگوها؛ هر مورد آزمایشی کاملسازی که با یکی از الگوها مطابقت داشته باشد از بررسی کنار گذاشته خواهد شد. کاملکنندهی _ignored میتواند در فهرست کاملکنندهها قرار گیرد تا موارد منطبقِ نادیدهگرفتهشده را بازیابی کند. این نگارشی با قابلیت پیکربندی بیشتر از پارامتر شل $fignore است.
توجه داشته باشید که گزینهی EXTENDED_GLOB در طول اجرای توابع کاملسازی تنظیم میشود، بنابراین نویسههای `#'، `~' و `^' در الگوها دارای معانی ویژهای هستند.
- insert
- این سبک توسط کاملکنندهی _all_matches به کار میرود تا تصمیم بگیرد آیا فهرست تمام تطابقها بدون قید و شرط درج شود یا این که فهرست به عنوان یک تطابق دیگر اضافه گردد.
- insert-ids
- هنگام کاملسازی شناسههای فرآیند (PID)، برای نمونه به عنوان آرگومانهای دستورات توکار kill و wait، نام یک دستور ممکن است به شناسهی فرآیند مناسب تبدیل شود. مشکلی زمانی رخ میدهد که نام فرآیند تایپشده یکتا نباشد. بهطور پیشفرض (یا اگر این سبک به صراحت روی `menu' تنظیم شده باشد) نام بیدرنگ به مجموعهای از شناسههای ممکن تبدیل میشود، و کاملسازی منویی آغاز خواهد شد تا میان آنها پیمایش کند.
اگر مقدار سبک `single' باشد، شل تا زمانی که کاربر به اندازهی کافی برای یکتا کردن دستور تایپ نکرده باشد منتظر میماند و پس از آن نام را به شناسه تبدیل میکند؛ تلاشها برای کاملسازی تا آن زمان ناموفق خواهد بود. اگر مقدار هر رشتهی دیگری باشد، کاملسازی منویی زمانی شروع خواهد شد که رشتهی تایپشده توسط کاربر طولانیتر از پیشوند مشترک شناسههای مربوطه باشد.
- insert-sections
- این سبک با برچسبهایی به قالب `manuals.X' هنگام کاملسازی نام صفحات راهنما استفاده میشود. اگر تنظیم شده باشد و X در نام برچسب با شمارهی بخش صفحهای که در حال کامل شدن است مطابقت داشته باشد، شمارهی بخش همراه با نام صفحه درج میشود. برای نمونه، با در نظر گرفتن:
zstyle ':completion:*:manuals.*' insert-sections true
دستور man ssh_<TAB> ممکن است به man 5 ssh_config کامل شود.
مقدار همچنین میتواند روی یکی از `prepend' یا `suffix' تنظیم شود. `prepend' مانند مثال بالا رفتاری مشابه `true' دارد، در حالی که `suffix' عبارت man ssh_<TAB> را به صورت man ssh_config.5 کامل میکند.
این قابلیت بهویژه در ترکیب با separate-sections سودمند است، چرا که اطمینان میدهد صفحهی درخواستشده از man با صفحهی نمایشدادهشده در فهرست کاملسازی مطابقت دارد، بهویژه زمانی که چندین صفحه با نام یکسان وجود دارند (مانند printf(1) و printf(3)).
پیشفرض این سبک `false' است.
- insert-tab
- اگر این سبک روی `true' تنظیم شده باشد، سامانهی کاملسازی هنگامی که هیچ نویسهی غیرخالی در سمت چپ مکاننما وجود ندارد، به جای انجام کاملسازی، یک نویسهی TAB درج خواهد کرد (با فرض این که برای شروع کاملسازی استفاده شده باشد). اگر روی `false' تنظیم شود، کاملسازی حتی در آنجا نیز انجام خواهد شد.
مقدار همچنین میتواند شامل زیررشتههای `pending' یا `pending=val' باشد. در این حالت، هنگامی که ورودی پردازشنشدهای در انتظار باشد، نویسهی تایپشده به جای شروع کاملسازی درج خواهد شد. اگر یک val مشخص شده باشد، چنانچه دستکم به همان تعداد نویسه ورودی پردازشنشده وجود داشته باشد، کاملسازی انجام نخواهد شد. این امر معمولاً هنگام جایگذاری (paste) نویسهها در ترمینال مفید است. با این حال توجه داشته باشید که این سازوکار به تنظیم صحیح پارامتر ویژهی $PENDING از ماژول zsh/zle وابسته است که روی تمام پلتفرمها تضمین نمیشود.
مقدار پیشفرض این سبک `true' است، مگر برای کاملسازی درون دستور توکار vared که مقدار آن `false' میباشد.
- insert-unambiguous
- این سبک توسط کاملکنندههای _match و _approximate استفاده میشود. این کاملکنندهها اغلب همراه با کاملسازی منویی به کار میروند زیرا کلمهی تایپشده ممکن است شباهت اندکی به کاملسازی نهایی داشته باشد. با این حال، اگر این سبک `true' باشد، کاملکننده تنها زمانی کاملسازی منویی را آغاز میکند که نتواند هیچ رشتهی اولیهی غیرمبهمی دستکم به طول رشتهی اولیهی تایپشده توسط کاربر پیدا کند.
در مورد کاملکنندهی _approximate، فیلد completer در زمینه از قبل روی یکی از مقادیر correct-num یا approximate-num تنظیم شده خواهد بود که در آن num تعداد خطاهای پذیرفتهشده است.
در مورد کاملکنندهی _match، این سبک میتواند روی رشتهی `pattern' نیز تنظیم شود. در این صورت اگر الگو به صورت غیرمبهم مطابقت نداشته باشد، الگوی روی خط بدون تغییر باقی میماند.
- keep-prefix
- این سبک توسط کاملکنندهی _expand استفاده میشود. اگر روی `true' باشد، کاملکننده سعی خواهد کرد پیشوندی شامل مدک (tilde) یا بسط پارامتر را حفظ کند. از این رو، برای نمونه، رشتهی `~/f*' به جای `/home/user/foo' به `~/foo' بسط مییابد. اگر این سبک روی `changed' (پیشفرض) تنظیم شده باشد، پیشوند تنها در صورتی بدون تغییر باقی میماند که تغییرات دیگری میان کلمات بسطیافته و کلمهی اصلی از خط فرمان رخ داده باشد. هر مقدار دیگری بسط پیشوند را بدون قید و شرط اجباری میکند.
رفتار _expand هنگامی که این سبک `true' باشد این است که در صورتی که یک بسط تکی با پیشوند بازیابیشده با مقدار اصلی یکسان باشد، موجب صرفنظر کردن _expand میشود؛ بنابراین هر کاملکنندهی باقیماندهای ممکن است فراخوانی شود.
- known-hosts-files
- این سبک باید شامل فهرستی از فایلها برای جستجوی نامهای میزبان و (در صورت تنظیم بودن سبک use-ip) آدرسهای IP در قالبی سازگار با فایلهای known_hosts مربوط به ssh باشد. در صورت عدم تنظیم، از فایلهای /etc/ssh/ssh_known_hosts و ~/.ssh/known_hosts استفاده میشود.
- last-prompt
- این شکل انعطافپذیرتری از گزینهی ALWAYS_LAST_PROMPT است. اگر `true' باشد، سامانهی کاملسازی پس از نمایش فهرست کاملسازی تلاش خواهد کرد تا مکاننما را به خط فرمان قبلی بازگرداند. این سبک ابتدا برای تمام برچسبهای معتبر برای کاملسازی فعلی، و سپس برای برچسب default بررسی میشود. اگر این سبک برای تمام انواع تطابق `true' باشد، مکاننما به خط قبلی بازگردانده خواهد شد. توجه داشته باشید که برخلاف گزینهی ALWAYS_LAST_PROMPT، این سبک مستقل از آرگومان عددی عمل میکند.
- list
- این سبک توسط دستور مقیدشدنیِ _history_complete_word استفاده میشود. اگر روی `true' تنظیم شود تأثیری ندارد. اگر روی `false' تنظیم شود تطابقها فهرست نخواهند شد. این سبک تنظیمات گزینههای کنترلکنندهی رفتار فهرستبندی، بهویژه AUTO_LIST را لغو میکند. زمینه همواره با `:completion:history-words' آغاز میشود.
- list-colors
- اگر ماژول zsh/complist بارگذاری شده باشد، این سبک میتواند برای تعیین مشخصات رنگ به کار رود. این سازوکار جایگزین استفاده از پارامترهای ZLS_COLORS و ZLS_COLOURS توصیفشده در بخش `The zsh/complist Module' در zshmodules(1) میشود، اما نحو (syntax) آن یکسان است.
اگر این سبک برای برچسب default تنظیم شود، رشتههای موجود در مقدار به عنوان مشخصاتی در نظر گرفته میشوند که باید در همهجا به کار روند. اگر برای برچسبهای دیگر تنظیم شود، این مشخصات تنها برای تطابقهایی از نوع توصیفشده توسط برچسب استفاده میشوند. برای بهترین عملکرد، سبک group-name باید روی یک رشتهی خالی تنظیم شود.
علاوه بر تنظیم سبکها برای برچسبهای خاص، همچنین امکان استفاده از نامهای گروه که به صراحت توسط برچسب group-name مشخص شدهاند، همراه با نحو `(group)' مجاز توسط پارامترهای ZLS_COLORS و ZLS_COLOURS با استفادهی ساده از برچسب default وجود دارد..PP امکان استفاده از هر مشخصات رنگی که از پیش برای نسخهٔ GNU دستور ls تنظیم شده است وجود دارد:
zstyle ':completion:*:default' list-colors \
${(s.:.)LS_COLORS}
رنگهای پیشفرض مشابه دستور GNU ls هستند و با تنظیم این سبک روی یک رشتهٔ خالی (یعنی '') قابل دریافت میباشند.
- list-dirs-first
- این مورد توسط تکمیل فایل استفاده میشود و با تنظیم خاصی از سبک file-patterns مطابقت دارد. در صورت تنظیم، دایرکتوریهای پیشفرض برای تکمیل، به صورت جداگانه و پیش از تکمیل سایر فایلها فهرست میشوند.
- list-grouped
- اگر این سبک `true' (پیشفرض) باشد، سامانهٔ تکمیل سعی خواهد کرد با گروهبندی تطابقها، برخی فهرستهای تکمیل را فشردهتر کند. برای نمونه، گزینههای دستوراتی که دارای توضیحات یکسانی هستند (که هنگام تنظیم سبک verbose روی `true' نشان داده میشوند) به صورت یک مدخل واحد ظاهر خواهند شد. با این حال، میتوان از انتخاب منو (menu selection) برای چرخش در میان تمام تطابقها استفاده کرد.
- list-packed
- این سبک برای هر برچسب معتبر در بافتار (context) جاری و همچنین برچسب default ارزیابی میشود. اگر روی `true' تنظیم شده باشد، تطابقهای مربوطه به گونهای در فهرستها ظاهر میشوند که گویی گزینهٔ LIST_PACKED تنظیم شده است. اگر روی `false' تنظیم شود، به طور عادی فهرست میگردند.
- list-prompt
- اگر این سبک برای برچسب default تنظیم شده باشد، فهرستهای تکمیلی که در صفحه جا نمیشوند قابل پیمایش خواهند بود (توضیحات پودمان zsh/complist در zshmodules(1) را ببینید). مقدار آن در صورتی که رشتهٔ خالی نباشد، پس از هر صفحهٔ کامل نمایش داده میشود و پوسته برای فشردن یک کلید اعلان خواهد داد؛ اگر این سبک روی رشتهٔ خالی تنظیم شود، یک اعلان پیشفرض استفاده خواهد شد.
این مقدار میتواند شامل توالیهای گریز زیر باشد: `%l' یا `%L'، که با شمارهٔ آخرین سطر نمایشیافته و تعداد کل سطرها جایگزین میشوند؛ `%m' یا `%M'، شمارهٔ آخرین تطابق نشاندادهشده و تعداد کل تطابقها؛ و `%p' و `%P'، عبارت `Top' در ابتدای فهرست، `Bottom' در انتهای آن و در غیر این صورت موقعیت به صورت درصدی از طول کل نشان داده میشود. در هر مورد، شکل با حروف بزرگ با یک رشته با عرض ثابت که از سمت راست با فاصلهها پر شده جایگزین میشود، در حالی که شکل با حروف کوچک با رشتهای با عرض متغیر جایگزین خواهد شد. همانند سایر رشتههای اعلان، توالیهای گریز `%S'، `%s'، `%B'، `%b'، `%U'، `%u' برای ورود و خروج از حالتهای نمایشی standout، bold و underline، و `%F'، `%f'، `%K'، `%k' برای تغییر رنگ پیشزمینه و پسزمینه نیز در دسترس هستند، به همراه شکل `%{...%}' برای محصور کردن توالیهای گریزی که با عرض صفر (یا با یک آرگومان عددی، عرضی دیگر) نمایش داده میشوند.
پس از حذف این اعلان، متغیر LISTPROMPT باید unset شود تا حذف آن اثر بگذارد.
- list-rows-first
- این سبک به همان شیوهٔ سبک list-packed بررسی میشود و تعیین میکند که آیا تطابقها به شیوهٔ سطر-اول (rows-first) فهرستبندی شوند، گویی گزینهٔ LIST_ROWS_FIRST تنظیم شده است، یا خیر.
- list-separator
- مقدار این سبک در فهرستبندی تکمیل برای جداسازی رشتهٔ مورد نظر برای تکمیل از توضیحات، در صورت امکان (مثلاً هنگام تکمیل گزینهها)، استفاده میشود. مقدار پیشفرض آن `--' (دو خط تیره) است.
- list-suffixes
- این سبک توسط تابعی که نام فایلها را تکمیل میکند به کار میرود. اگر `true' باشد و تکمیل بر روی رشتهای شامل چندین جزء مسیر که به طور ناقص تایپ شدهاند امتحان شود، تمام اجزای مبهم نمایش داده خواهند شد. در غیر این صورت، تکمیل در اولین جزء مبهم متوقف میشود.
- local
- این مورد برای استفاده با توابعی است که URLهایی را تکمیل میکنند که فایلهای متناظر آنها مستقیماً از سامانهٔ فایل (file system) در دسترس هستند. مقدار آن باید شامل سه رشته باشد: یک نام میزبان (hostname)، مسیر صفحات وب پیشفرض برای سرور، و نام دایرکتوری مورد استفاده توسط کاربری که صفحات وب را در ناحیهٔ خانگی (home) خود قرار میدهد.
برای نمونه:
zstyle ':completion:*' local toast \
/var/http/public/toast public_html
تکمیل پس از `http://toast/stuff/' به دنبال فایلها در دایرکتوری /var/http/public/toast/stuff میگردد، در حالی که تکمیل پس از `http://toast/~yousir/' به دنبال فایلها در دایرکتوری ~yousir/public_html خواهد گشت.
- mail-directory
- در صورت تنظیم، zsh فرض میکند که فایلهای mailbox در دایرکتوری مشخصشده قرار دارند. مقدار پیشفرض آن `~/Mail' است.
- match-original
- این سبک توسط تکمیلکنندهٔ _match استفاده میشود. اگر روی only تنظیم شود، _match تلاش خواهد کرد تا تطابقها را بدون درج یک `*' در موقعیت مکاننما تولید کند. اگر روی هر مقدار غیرخالی دیگری تنظیم شود، ابتدا سعی میکند تطابقها را بدون درج `*' تولید کند و اگر نتیجهای در بر نداشت، دوباره با درج `*' تلاش خواهد کرد. اگر تنظیم نشده باشد یا روی رشتهٔ خالی تنظیم شود، تطبیق فقط با درج `*' انجام خواهد شد.
- matcher
- این سبک برای هر برچسب معتبر در بافتار جاری به طور جداگانه بررسی میشود. مقدار آن پیش از هر مشخصات تطابقی ارائهشده توسط سبک matcher-list قرار میگیرد، بنابراین میتواند از طریق استفاده از یک مشخصهٔ x: آنها را لغو (override) کند. مقدار باید به شکلی باشد که در بخش «Completion Matching Control» در zshcompwid(1) توصیف شده است. برای نمونههایی از این مورد، توضیحات سبک tag-order را ببینید.
برای نکاتی در مقایسهٔ استفاده از این سبک و سبک matcher-list، به بخش ذیل توضیحات سبک tag-order مراجعه کنید.
- matcher-list
- این سبک میتواند روی فهرستی از مشخصات تطابق تنظیم شود که قرار است در همهجا اعمال گردند. مشخصات تطابق در بخش «Completion Matching Control» در zshcompwid(1) توصیف شدهاند. سامانهٔ تکمیل آنها را یکی پس از دیگری برای هر تکمیلکنندهٔ انتخابشده امتحان میکند. برای نمونه، برای اینکه ابتدا تکمیل ساده امتحان شود و در صورت عدم تولید تطابق، تکمیل غیرحساس به بزرگی و کوچکی حروف اعمال گردد:
zstyle ':completion:*' matcher-list '' 'm:{a-zA-Z}={A-Za-z}'
به طور پیشفرض هر مشخصه جایگزین مورد قبلی میشود؛ با این حال، اگر پیشوند یک مشخصه + باشد، به فهرست موجود اضافه خواهد شد. بنابراین میتوان بدون تکرار، مشخصاتی به مراتب عمومیتر ایجاد کرد:
zstyle ':completion:*' matcher-list \
'' '+m:{a-z}={A-Z}' '+m:{A-Z}={a-z}'
ایجاد مشخصات تطابق معتبر برای تکمیلکنندههای خاص با استفاده از فیلد سوم بافتار امکانپذیر است. این مورد تنها برای تکمیلکنندههایی اعمال میشود که matcher-list سراسری را لغو میکنند، که در زمان نگارش این مستند تنها شامل _prefix و _ignored است. برای نمونه، برای استفاده از تکمیلکنندههای _complete و _prefix اما مجاز دانستن تکمیل غیرحساس به بزرگی و کوچکی حروف تنها با _complete:
zstyle ':completion:*' completer _complete _prefix
zstyle ':completion:*:complete:*:*:*' matcher-list \
'' 'm:{a-zA-Z}={A-Za-z}'
نامهای تعریفشده توسط کاربر، همانطور که برای سبک completer توضیح داده شد، در دسترس هستند. این امر امکان امتحان کردن یک تکمیلکننده را برای چند بار، هر بار با مشخصات تطابق متفاوت، فراهم میسازد. برای نمونه، برای امتحان کردن تکمیل عادی بدون مشخصات تطابق، سپس تکمیل عادی با تطبیق غیرحساس به بزرگی و کوچکی حروف، سپس تصحیح، و در پایان تکمیل کلمه به صورت جزئی (partial-word):
zstyle ':completion:*' completer \
_complete _correct _complete:foo zstyle
':completion:*:complete:*:*:*' matcher-list \
'' 'm:{a-zA-Z}={A-Za-z}' zstyle ':completion:*:foo:*:*:*'
matcher-list \
'm:{a-zA-Z}={A-Za-z} r:|[-_./]=* r:|=*'
اگر این سبک در هر زمینهای تنظیم نشده باشد، هیچ مشخصهٔ تطبیقی اعمال نمیگردد. همچنین توجه داشته باشید که برخی از کاملکنندهها مانند _correct و _approximate اصلاً از مشخصههای تطبیق استفاده نمیکنند، هرچند که این کاملکنندهها حتی اگر matcher-list شامل بیش از یک عنصر باشد، تنها یکبار فراخوانی خواهند شد.
در مواردی که مشخصههای چندگانه مفید هستند، توجه داشته باشید که کاملسازی به صورت کامل برای هر عنصر از matcher-list انجام میشود، که میتواند بهسرعت کارایی پوسته را کاهش دهد. به عنوان یک قاعدهٔ سرانگشتی، یک تا سه رشته کارایی قابل قبولی ارائه میدهند. از سوی دیگر، قرار دادن چندین مقدارِ جداشده با فاصله درون یک رشته، تأثیر محسوسی بر کارایی ندارد.
اگر تطبیقدهندهٔ فعلی وجود نداشته باشد یا خالی باشد، و گزینهٔ NO_CASE_GLOB فعال باشد، تطبیق برای فایلها در هر حال بدون حساسیت به بزرگی و کوچکی حروف انجام میشود. با این حال، هر تطبیقدهندهای در صورت نیاز باید تطبیق غیرحساس به بزرگی و کوچکی حروف را به صراحت مشخص کند.
برای
نکاتی در
زمینهٔ
مقایسهٔ
استفاده از
این سبک و
سبک matcher، به
توضیحاتِ
سبک tag-order
مراجعه
کنید.
- max-errors
- این سبک توسط توابع کاملکنندهٔ _approximate و _correct برای تعیین حداکثر تعداد خطاهای مجاز به کار میرود. کاملکننده تلاش خواهد کرد تا کاملسازیها را ابتدا با اجازه دادن به یک خطا، سپس دو خطا و به همین ترتیب تولید کند تا زمانی که یک یا چند تطبیق پیدا شود یا به حداکثر تعداد خطاهای تعیینشده توسط این سبک برسد.
اگر مقدار این سبک شامل رشتهٔ `numeric' باشد، تابع کاملکننده هر آرگومان عددی را به عنوان حداکثر تعداد خطاهای مجاز در نظر میگیرد. برای نمونه با:
zstyle ':completion:*:approximate:::' max-errors 2 numeric
در صورتی که هیچ آرگومان عددی داده نشود دو خطا مجاز است، اما با یک آرگومان عددی شش (مانند `ESC-6 TAB')، تا شش خطا پذیرفته میشود. بنابراین با مقدار `0 numeric'، هیچ کاملسازی اصلاحی انجام نخواهد شد مگر اینکه یک آرگومان عددی ارائه شود.
اگر مقدار شامل رشتهٔ `not-numeric' باشد، کاملکننده هنگام دریافت آرگومان عددی تلاش نخواهد کرد که کاملسازیهای تصحیحشده تولید کند؛ بنابراین در این حالت عددِ تعیینشده باید بزرگتر از صفر باشد. به عنوان مثال، `2 not-numeric' مشخص میکند که کاملسازی اصلاحی معمولاً با دو خطا انجام میشود، اما اگر آرگومان عددی داده شود، کاملسازی اصلاحی انجام نخواهد گرفت.
مقدار پیشفرض برای این سبک `2 numeric' است.
- max-matches-width
- این سبک برای تعیین موازنه بین عرض نمایشِ اختصاصیافته به تطبیقها و عرض نمایشِ توضیحات آنها در زمان فعال بودن سبک verbose به کار میرود. این مقدار، تعداد ستونهای نمایش را برای رزرو کردن به تطبیقها مشخص میکند. مقدار پیشفرض نصف عرض صفحه نمایش است.
این ویژگی بیشترین تأثیر را زمانی دارد که چندین تطبیق دارای توضیحات یکسان بوده و به همین دلیل با یکدیگر گروهبندی شوند. افزایش این مقدار امکان گروهبندی تطبیقهای بیشتری را فراهم میکند؛ کاهش آن نیز باعث میشود بخش بیشتری از توضیحات قابل مشاهده باشد.
- اگر این مقدار در زمینهٔ هر یک از برچسبهای تعریفشده برای کاملسازی فعلی برابر با `true' باشد، کاملسازی منویی (menu completion) استفاده خواهد شد. مقدار مشخصشده برای یک برچسب خاص بر مقدار برچسب `default' اولویت خواهد داشت.
اگر هیچیک از مقادیر یافتشده به این روش `true' نباشد اما حداقل یکی روی `auto' تنظیم شده باشد، پوسته طوری رفتار میکند که گویی گزینهٔ AUTO_MENU تنظیم شده است.
اگر یکی از مقادیر به صراحت روی `false' تنظیم شده باشد، کاملسازی منویی صراحتاً غیرفعال خواهد شد و بر گزینهٔ MENU_COMPLETE و سایر تنظیمات اولویت خواهد داشت.
در قالب `yes=num'، که در آن `yes' میتواند هر یک از مقادیر معادل `true' باشد (`yes'، `true'، `on' و `1')، چنانچه حداقل به تعداد num تطبیق وجود داشته باشد، کاملسازی منویی فعال خواهد شد. در قالب `yes=long'، اگر فهرست در صفحه جا نشود، کاملسازی منویی فعال میشود. این مقدار در حالتی که ویجت به طور معمول تنها کاملسازیها را فهرست میکند، کاملسازی منویی را فعال نمیسازد، اما در آن حالت میتوان کاملسازی منویی را با مقدار `yes=long-list' فعال کرد (معمولاً مقدار `select=long-list' که جلوتر شرح داده شده مفیدتر است چرا که کنترل پیمایش را فراهم میکند).
به طور مشابه، با هر یک از مقادیر معادل `false' (مانند `no=10')، در صورتی که تعداد تطبیقها برابر با num یا بیشتر باشد، از کاملسازی منویی استفاده نخواهد شد.
مقدار این ویجت همچنین انتخاب منویی را، همانگونه که توسط پودمان zsh/complist پیادهسازی شده، کنترل میکند. مقادیر زیر میتوانند در کنار یا به جای مقادیر بالا قرار گیرند.
اگر مقدار شامل رشتهٔ `select' باشد، انتخاب منویی بدون قید و شرط آغاز خواهد شد.
در قالب `select=num'، انتخاب منویی تنها زمانی آغاز میشود که حداقل num تطبیق وجود داشته باشد. اگر مقادیر مربوط به بیش از یک برچسب حاوی یک عدد باشند، کوچکترین عدد اعمال میشود.
انتخاب منویی را میتوان با تعیین مقداری حاوی رشتهٔ `no-select' به صورت صریح غیرفعال کرد.
همچنین میتوان با استفاده از مقدار `select=long'، انتخاب منویی را تنها در صورتی که فهرست تطبیقها در صفحه جا نشود آغاز کرد. برای آغاز انتخاب منویی حتی زمانی که ویجت فعلی تنها عمل فهرستکردن را انجام میدهد، از مقدار `select=long-list' استفاده کنید.
برای فعال کردن کاملسازی منویی یا انتخاب منویی در صورتی که تعداد مشخصی تطبیق وجود داشته باشد یا فهرست تطبیقها در صفحه جا نشود، هر دو مقدار `yes=' و `select=' میتوانند دو بار مشخص شوند؛ یک بار با یک عدد و بار دیگر با `long' یا `long-list'.
در نهایت، امکان فعالسازی دو حالت خاص از انتخاب منویی وجود دارد. کلمهٔ `interactive' در این مقدار باعث میشود تا بلافاصله پس از آغاز انتخاب منویی، حالت تعاملی فعال گردد؛ برای توضیحات مربوط به حالت تعاملی به شرح پودمان zsh/complist در zshmodules(1) مراجعه کنید. گنجاندن رشتهٔ `search' همین رفتار را برای حالت جستجوی افزایشی فراهم میکند. برای انتخاب جستجوی افزایشی رو به عقب، رشتهٔ `search-backward' را اضافه کنید.
- muttrc
- در صورت تنظیم، مسیر فایل پیکربندی mutt را تعیین میکند. مقدار پیشفرض آن `~/.muttrc' است.
- numbers
- این سبک به همراه برچسب jobs به کار میرود. اگر برابر با `true' باشد، پوسته به جای کوتاهترین پیشوند غیرمبهم از متن دستور کار (job)، شمارههای کار را کامل میکند. اگر مقدار یک عدد باشد، شمارههای کار تنها زمانی استفاده میشوند که برای رفع ابهام، به همان تعداد کلمه از شرح کارها نیاز باشد. برای نمونه، اگر مقدار `1' باشد، رشتهها تنها زمانی به کار خواهند رفت که همهٔ کارها در کلمهٔ نخست خط فرمان خود متفاوت باشند.
- old-list
- این سبک توسط کاملکنندهٔ _oldlist به کار میرود. اگر روی `always' تنظیم شده باشد، ویجتهای استانداردی که کار فهرستکردن را انجام میدهند، فهرست فعلی تطبیقها را صرفنظر از شیوهٔ تولید آنها حفظ خواهند کرد؛ این رفتار را میتوان با مقدار `never' صراحتاً غیرفعال کرد که عملکرد بدون کاملکنندهٔ _oldlist را ارائه میدهد. اگر سبک تنظیم نشده باشد، یا هر مقدار دیگری داشته باشد، فهرست موجود از کاملسازیها در صورتی که پیشتر نمایش داده نشده باشد نشان داده خواهد شد؛ در غیر این صورت، فهرست کاملسازی استاندارد تولید میشود؛ این رفتار پیشفرضِ _oldlist است. با این حال، اگر یک فهرست قدیمی وجود داشته باشد و این سبک حاوی نام تابع کاملکنندهای باشد که فهرست را تولید کرده است، فهرست قدیمی حتی اگر توسط ویجتی که کار فهرستکردن را انجام نمیدهد تولید شده باشد، مجدداً استفاده خواهد شد.
برای نمونه، فرض کنید ^Xc را تایپ میکنید تا از ویجت _correct_word استفاده کنید، که فهرستی از تصحیحات را برای کلمهٔ زیر مکاننما تولید میکند. به طور معمول، فشردن ^D یک فهرست استاندارد از کاملسازیها برای کلمهٔ موجود در خط فرمان تولید کرده و آن را نمایش میدهد. با _oldlist، در عوض همان فهرست تصحیحاتی که از قبل تولید شده است نشان داده خواهد شد.
به عنوان نمونهای دیگر کاملکنندهٔ _match را در نظر بگیرید: با تنظیم سبک insert-unambiguous روی `true'، این کاملکننده در صورت وجود تنها یک رشتهٔ پیشوند مشترک را درج میکند. با این حال، این عمل ممکن است بخشهایی از الگوی اصلی را حذف کند، به طوری که کاملسازیهای بعدی بتوانند تطبیقهای بیشتری نسبت به تلاش نخست تولید نمایند. با استفاده از کاملکنندهٔ _oldlist و تنظیم این سبک روی _match، فهرست تطبیقهای تولیدشده در تلاش نخست دوباره مورد استفاده قرار خواهد گرفت. old-matches این سبک توسط کاملکنندهٔ _all_matches استفاده میشود تا تصمیم بگیرد که آیا در صورت وجود یک فهرست قدیمی از تطابقها، باید از آن استفاده شود یا خیر. این ویژگی با یکی از مقادیر «true» یا با رشتهٔ «only» انتخاب میشود. اگر مقدار آن «only» باشد، _all_matches فقط از یک فهرست قدیمی استفاده خواهد کرد و هیچ تأثیری بر فهرست تطابقهایی که در حال حاضر تولید میشوند نخواهد داشت.
اگر این سبک تنظیم شده باشد، معمولاً فراخوانی نامشروط کاملکنندهٔ _all_matches توصیه نمیشود. یک کاربرد ممکن این است که این سبک یا سبک completer همراه با گزینهٔ -e در دستور zstyle تعریف شود تا سبک به صورت شرطی اعمال گردد.
- old-menu
- این سبک توسط کاملکنندهٔ _oldlist استفاده میشود. این سبک نحوهٔ رفتار تکمیل منویی (menu completion) را زمانی که یک تکمیل قبلاً درج شده و کاربر کلید استاندارد تکمیل مانند TAB را میفشارد، کنترل میکند. رفتار پیشفرض _oldlist این است که تکمیل منویی همیشه با فهرست موجود از تکمیلها ادامه مییابد. با این حال، اگر این سبک روی «false» تنظیم شود، در صورتی که فهرست قدیمی توسط یک دستور تکمیلِ متفاوت تولید شده باشد، یک تکمیل جدید آغاز میشود؛ این همان رفتار پوسته بدون کاملکنندهٔ _oldlist است.
برای مثال، فرض کنید ^Xc را برای تولید فهرستی از اصلاحات وارد میکنید و تکمیل منویی به یکی از روشهای معمول آغاز میشود. در حالت عادی، یا با تنظیم این سبک روی «false»، فشردن TAB در این مرحله تلاش برای تکمیل خط به همان شکلی که اکنون ظاهر شده است را آغاز میکند. با _oldlist، به جای آن، چرخش در میان فهرست اصلاحات ادامه مییابد.
- original
- این سبک توسط کاملکنندههای _approximate و _correct استفاده میشود تا مشخص شود آیا رشتهٔ اصلی باید به عنوان یک تکمیل ممکن اضافه شود یا خیر. به طور معمول، این کار تنها در صورتی انجام میشود که حداقل دو اصلاح ممکن وجود داشته باشد، اما اگر این سبک روی «true» تنظیم شود، همیشه افزوده میشود. توجه داشته باشید که این سبک با قرار گرفتن فیلد کاملکننده در نام زمینه (context) به صورت correct-num یا approximate-num بررسی خواهد شد، که در آن num تعداد خطاهای پذیرفتهشده است.
- packageset
- این سبک هنگام تکمیل آرگومانهای برنامهٔ «dpkg» دبیان استفاده میشود. این سبک حاوی یک جایگزینی برای مجموعه بستههای پیشفرض در یک زمینهٔ مشخص است. برای مثال:
zstyle ':completion:*:complete:dpkg:option--status-1:*' \
packageset avail
باعث میشود به جای صرفاً بستههای نصبشده، بستههای موجود (available) نیز برای «dpkg --status» تکمیل شوند.
- path
- تابعی که نام رنگها را تکمیل میکند، از این سبک با برچسب colors استفاده میکند. مقدار آن باید مسیر فایلی شامل نام رنگها در قالب فایل rgb.txt مربوط به X11 باشد. اگر سبک تنظیم نشده باشد اما این فایل در یکی از مکانهای استاندارد مختلف یافت شود، به عنوان پیشفرض استفاده خواهد شد.
- path-completion
- این سبک توسط فرایند تکمیل نام فایل استفاده میشود. به طور پیشفرض، تکمیل نام فایل تمام مؤلفههای یک مسیر را بررسی میکند تا ببیند آیا تکمیلی برای آن مؤلفه وجود دارد یا خیر. برای مثال، /u/b/z میتواند به /usr/bin/zsh تکمیل شود. تنظیم صریح این سبک روی «false» این رفتار را برای مؤلفههای مسیر تا قبل از /ِ پیش از مکاننما بازمیدارد؛ این امر تنظیمات accept-exact-dirs را لغو میکند.
حتی با تنظیم این سبک روی «false»، همچنان با فعال کردن گزینهٔ COMPLETE_IN_WORD و برگرداندن مکاننما به مؤلفهٔ نخست در مسیری که قرار است تکمیل شود، امکان تکمیل چند مسیره وجود دارد. برای مثال، اگر مکاننما بعد از /u باشد، /u/b/z میتواند به /usr/bin/zsh تکمیل شود.
- pine-directory
- در صورت تنظیم، دایرکتوری حاوی فایلهای صندوق پستی PINE را مشخص میکند. هیچ پیشفرضی وجود ندارد، زیرا جستجوی بازگشتی در این دایرکتوری برای کسانی که از PINE استفاده نمیکنند نامطلوب است.
- ports
- فهرستی از نامهای سرویسهای اینترنتی (پورتهای شبکه) برای تکمیل. اگر تنظیم نشده باشد، نام سرویسها از فایل «/etc/services» گرفته میشود.
- prefix-hidden
- این سبک برای تکمیلهای خاصی که پیشوند مشترک دارند استفاده میشود، مانند گزینههای دستور که با خط تیره شروع میشوند. اگر مقدار آن «true» باشد، پیشوند در فهرست تطابقها نمایش داده نخواهد شد.
مقدار پیشفرض این سبک «false» است.
- prefix-needed
- این سبک نیز برای تطابقهایی با پیشوند مشترک کاربرد دارد. اگر روی «true» تنظیم شود، این پیشوند مشترک باید توسط کاربر تایپ شود تا تطابقها ایجاد شوند.
این سبک برای برچسبهای تکمیل options، signals، jobs، functions و parameters قابل اعمال است.
برای گزینههای دستور، این بدان معناست که کاراکتر ابتدایی «-»، «+» یا «--» باید به صراحت تایپ شود تا نام گزینهها تکمیل شود.
برای سیگنالها، وارد کردن «-» در ابتدا برای تکمیل نام سیگنال الزامی است.
برای کارها (jobs)، وارد کردن «%» در ابتدا برای تکمیل نام کار الزامی است.
برای نامهای توابع و پارامترها، یک «_» یا «.» ابتدایی لازم است تا نامهای تابع یا پارامتری که با این کاراکترها آغاز میشوند تکمیل گردند.
مقدار پیشفرض این سبک برای تکمیلهای function و parameter برابر «false»، و در غیر این صورت «true» است.
- preserve-prefix
- این سبک هنگام تکمیل نام مسیرها استفاده میشود. مقدار آن باید الگویی منطبق بر پیشوند ابتدایی کلمهٔ در حال تکمیل باشد که باید تحت هر شرایطی دستنخورده باقی بماند. برای مثال، در برخی سیستمهای Unices یک «//» (اسلش دوتایی) ابتدایی معنای خاصی دارد؛ تنظیم این سبک روی رشتهٔ «//» آن را حفظ خواهد کرد. به عنوان مثالی دیگر، تنظیم این سبک روی «?:/» در محیط Cygwin اجازه میدهد تکمیل پس از «a:/...» و موارد مشابه انجام شود.
- range
- این سبک توسط کاملکنندهٔ _history و دستور قابل اتصالِ _history_complete_word استفاده میشود تا تصمیم گرفته شود کدام کلمات باید تکمیل شوند.
اگر یک عدد منفرد باشد، تنها آخرین N کلمه از تاریخچه تکمیل خواهند شد.
اگر دامنهای به شکل «max:slice» باشد، آخرین slice کلمه تکمیل خواهند شد؛ سپس اگر تطابقی حاصل نشد، slice کلمهٔ قبل از آنها امتحان میشوند و به همین ترتیب ادامه مییابد. این فرایند زمانی متوقف میشود که حداقل یک تطابق پیدا شود، یا به اندازهٔ max کلمه بررسی شده باشد.
حالت پیشفرض این است که تمام کلمات تاریخچه به صورت یکجا تکمیل شوند.
- recursive-files
- اگر این سبک تنظیم شود، مقدار آن آرایهای از الگوها است که با «$PWD/» مقایسه میشوند: به اسلش انتهایی توجه کنید که اجازه میدهد دایرکتوریها در الگو با قرار گرفتن اسلش در هر دو طرف، بدون ابهام مرزبندی شوند. اگر تکمیل فایل معمولی با شکست مواجه شود و کلمهٔ موجود در خط فرمان هنوز بخش دایرکتوری در نام خود نداشته باشد، سبک با استفاده از همان برچسبی که برای تکمیل انجامشده استفاده شد فراخوانی میشود، سپس عناصر آن به نوبت در برابر $PWD/ آزمایش میشوند. اگر یکی از آنها مطابقت داشته باشد، پوسته تکمیل را با پیشوند کردن کلمهٔ روی خط فرمان با هر دایرکتوری در بسط **/*(/) به نوبت دوباره آزمایش میکند. معمولاً عناصر این سبک برای محدود کردن تعداد دایرکتوریهای ذیل دایرکتوری فعلی به مقداری معقول تنظیم میشوند، برای مثال «*/.git/*».
برای مثال:
zstyle ':completion:*' recursive-files '*/zsh/*'
اگر دایرکتوری جاری /home/pws/zsh/Src باشد، آنگاه عبارت zle_tr<TAB> میتواند به Zle/zle_tricky.c تکمیل شود. regular این سبک توسط کاملکننده و دستور قابل انتساب _expand_alias استفاده میشود. اگر روی `true' (پیشفرض) تنظیم شود، نامهای مستعار معمولی تنها در موقعیت دستور گسترش مییابند. اگر روی `false' تنظیم شود، نامهای مستعار معمولی هرگز گسترش نخواهند یافت. اگر روی `always' تنظیم شود، نامهای مستعار معمولی حتی اگر در موقعیت دستور نباشند نیز گسترش مییابند.
- rehash
- اگر این سبک هنگام کاملکردن دستورهای خارجی تنظیم شده باشد، فهرست داخلی (هش) دستورها برای هر جستجو با اجرای دستور rehash بهروزرسانی میشود. این کار با افت سرعت همراه است که احتمالاً تنها زمانی محسوس خواهد بود که دایرکتوریهای موجود در مسیر دسترسی کندی به فایل داشته باشند.
- remote-access
- اگر روی `false' تنظیم شود، از برقراری اتصالات اینترنتی توسط برخی دستورهای خاص برای دریافت اطلاعات از راه دور جلوگیری خواهد شد. این شامل کاملسازی برای دستور CVS نیز میشود.
همواره این امکان وجود ندارد که مشخص شود آیا اتصالات واقعاً به یک پایگاه راه دور هستند یا خیر، بنابراین ممکن است از برخی اتصالات بهطور غیرضروری جلوگیری شود.
- remove-all-dups
- دستور قابل انتساب _history_complete_word و کاملکنندهٔ _history از این سبک برای تصمیمگیری در این مورد استفاده میکنند که آیا همهٔ تطابقهای تکراری باید حذف شوند یا فقط موارد تکراری متوالی.
- select-prompt
- اگر این سبک برای برچسب default تنظیم شده باشد، مقدار آن در طول انتخاب از منو (به سبک menu در بالا مراجعه کنید) زمانی که فهرست کاملسازی بهطور کامل در صفحه جا نمیشود، نمایش داده خواهد شد. همان نویسههای گریز مربوط به سبک list-prompt در اینجا نیز معتبر هستند، جز اینکه شمارهها به تطابق یا خطی که نشانگر روی آن قرار دارد اشاره میکنند. وقتی مقدار برابر با یک رشتهٔ خالی باشد، از یک اعلان پیشفرض استفاده میشود.
- select-scroll
- این سبک برای برچسب default بررسی میشود و تعیین میکند که یک فهرست کاملسازی هنگام انتخاب از منو (به سبک menu در بالا مراجعه کنید) در صورتی که فهرست بهطور کامل در صفحه جا نشود، چگونه پیمایش شود. اگر مقدار `0' (صفر) باشد، فهرست بهاندازهٔ نصف صفحه پیمایش میشود؛ اگر یک عدد صحیح مثبت باشد، فهرست به تعداد خطوط دادهشده پیمایش میشود؛ اگر یک عدد منفی باشد، فهرست بهاندازهٔ یک صفحهٔ کامل منهای مقدار مطلق تعداد خطوط دادهشده پیمایش خواهد شد. حالت پیشفرض، پیمایش خطبهخط است.
- separate-sections
- این سبک با برچسب manuals هنگام کاملکردن نام صفحات راهنما استفاده میشود. اگر روی `true' باشد، مدخلهای بخشهای مختلف بهطور جداگانه با استفاده از نامهای برچسبی به شکل `manuals.X' اضافه میشوند، که در آن X شمارهٔ بخش است. هنگامی که سبک group-name نیز فعال باشد، صفحات بخشهای مختلف بهطور جداگانه نمایش داده خواهند شد. این سبک همچنین بهطور مشابه با سبک words هنگام کاملکردن کلمات برای دستور dict استفاده میشود. این کار اجازه میدهد کلمات از پایگاههای دادهٔ لغتنامهٔ مختلف بهطور جداگانه افزوده شوند. همچنین ببینید: insert-sections.
مقدار پیشفرض برای این سبک `false' است.
- show-ambiguity
- اگر ماژول zsh/complist بارگذاری شده باشد، از این سبک میتوان برای برجستهسازی نخستین نویسهٔ مبهم در فهرستهای کاملسازی استفاده کرد. مقدار آن یا مشخصهٔ رنگی مانند موارد پشتیبانیشده توسط سبک list-colors است یا با مقدار `true'، حالت پیشفرض خط زیرین انتخاب میشود. برجستهسازی تنها در صورتی اعمال میشود که رشتههای نمایشی کاملسازی با تطابقهای واقعی مطابقت داشته باشند.
- show-completer
- هر زمان که یک کاملکنندهٔ جدید آزمایش شود، این سبک بررسی میشود. اگر روی `true' باشد، سامانهٔ کاملسازی یک پیام پیشرفت در ناحیهٔ فهرست نشان میدهد که مشخص میکند چه کاملکنندهای در حال آزمایش است. با یافتن کاملسازیها، این پیام با هر خروجی جدید بازنویسی میشود و پس از پایان کاملسازی حذف خواهد شد.
- single-ignored
- این سبک توسط کاملکنندهٔ _ignored هنگامی که تنها یک تطابق وجود دارد استفاده میشود. اگر مقدار آن `show' باشد، تنها تطابق موجود نمایش داده میشود اما درج نخواهد شد. اگر مقدار `menu' باشد، هم آن تطابق منفرد و هم رشتهٔ اصلی به عنوان تطابق اضافه میشوند و کاملسازی منویی آغاز میشود، که انتخاب هر یک از آنها را آسان میسازد.
- sort
- این سبک اجازه میدهد ترتیب استاندارد تطابقها بازنویسی شود.
اگر مقدار آن `true' یا `false' باشد، مرتبسازی فعال یا غیرفعال میشود. افزون بر این، مقادیر مرتبط با گزینهٔ `-o' در compadd نیز میتوانند مشخص شوند: match، nosort، numeric، reverse. اگر برای زمینه تنظیم نشده باشد، رفتار استاندارد ویجت فراخواننده استفاده میشود.
این سبک ابتدا در برابر زمینهٔ کامل شامل برچسب آزمایش میشود، و اگر مقداری حاصل نشد، در برابر زمینهٔ بدون برچسب بررسی خواهد شد.
در بسیاری از موارد که یک ویجت فراخواننده صراحتاً ترتیب خاصی را به جای پیشفرض انتخاب میکند، مقدار `true' نادیده گرفته میشود. نمونهای که این موضوع در آن صدق نمیکند، تاریخچهٔ دستورها است که در آن پیشفرضِ مرتبسازی زمانیِ تطابقها را میتوان با تنظیم این سبک روی `true' بازنویسی کرد.
در کاملکنندهٔ _expand، اگر روی `true' تنظیم شده باشد، بسطهای تولیدشده همیشه مرتب خواهند شد. اگر روی `menu' تنظیم شود، بسطها تنها زمانی مرتب میشوند که به عنوان رشتههای تکی ارائه شوند، نه در رشتهای که حاوی همهٔ بسطهای ممکن است.
- special-dirs
- در حالت عادی، کد کاملسازی نامهای دایرکتوری `.' و `..' را به عنوان گزینههای کاملسازی ارائه نمیدهد. اگر این سبک روی `true' تنظیم شود، هر دو مورد `.' و `..' را به عنوان کاملسازیهای ممکن اضافه خواهد کرد؛ اگر روی `..' تنظیم شود، تنها `..' اضافه خواهد شد.
مثال زیر special-dirs را زمانی که پیشوند فعلی خالی باشد، یک `.' تکی باشد، یا تنها شامل مسیری باشد که با `../' شروع میشود، روی `..' تنظیم میکند. در غیر این صورت مقدار آن `false' است.
zstyle -e ':completion:*' special-dirs \ '[[ $PREFIX = (../)#(|.|..) ]] && reply=(..)'
- squeeze-slashes
- اگر روی `true' تنظیم شود، توالیهای اسلش در مسیرهای نام فایل (به عنوان مثال در `foo//bar') مانند یک تکاسلش رفتار خواهند شد. این رفتار معمول مسیرهای یونیکس است. با این حال، بهطور پیشفرض تابع کاملسازی فایل بهگونهای عمل میکند که گویی یک `*' بین اسلشها قرار دارد.
- stop
- اگر روی `true' تنظیم شود، دستور قابل انتساب _history_complete_word هنگام رسیدن به ابتدا یا انتهای تاریخچه یک بار متوقف میشود. فراخوانی مجدد _history_complete_word سپس به انتهای مخالف تاریخچه بازمیگردد. اگر این سبک روی `false' (پیشفرض) تنظیم شود، _history_complete_word مانند کاملسازی منویی بلافاصله دور میزند.
- strip-comments
- اگر روی `true' تنظیم شود، این سبک باعث میشود متنهای توضیحی غیرضروری از تطابقهای کاملسازی حذف شوند. در حال حاضر این سبک تنها هنگام کاملکردن نشانیهای ایمیل استفاده میشود که در آن هر نام نمایشی از نشانیها حذف شده و آنها را به شکل سادهٔ user@host خلاصه میکند.
- subst-globs-only
- این سبک توسط کاملکنندهٔ _expand استفاده میشود. اگر روی `true' تنظیم شود، بسط تنها در صورتی استفاده خواهد شد که از الگوخوانی (globbing) حاصل شده باشد؛ بنابراین، اگر بسطها از کاربرد سبک substitute (توضیحدادهشده در زیر) حاصل شده باشند اما با الگوخوانی بیشتر تغییر نکرده باشند، رد خواهند شد.
مقدار پیشفرض برای این سبک `false' است.
- substitute
- این سبک بولی کنترل میکند که آیا کاملکنندهٔ _expand ابتدا تلاش کند همهٔ جایگزینیها را در رشته بسط دهد (مانند `$(...)' و `${...}') یا خیر.
مقدار پیشفرض `true' است.
- suffix
- این سبک توسط کاملکنندهٔ _expand استفاده میشود اگر کلمه با یک مدک (tilde) شروع شود یا حاوی بسط پارامتر باشد. اگر روی `true' تنظیم شود، کلمه تنها در صورتی بسط مییابد که پسوندی نداشته باشد؛ یعنی چیزی مانند `~foo' یا `$foo' باشد نه `~foo/' یا `$foo/bar'، مگر اینکه خود آن پسوند شامل نویسههای واجد شرایط برای بسط باشد. مقدار پیشفرض برای این سبک `true' است.
- tag-order
- این سبک سازوکاری برای مرتبسازی نحوهٔ استفاده از برچسبهای موجود در یک زمینهٔ خاص فراهم میکند.
مقادیر این سبک مجموعههایی از فهرستهای برچسبها هستند که با فاصله جدا شدهاند. برچسبهای موجود در هر مقدار بهطور همزمان آزمایش میشوند؛ اگر تطابقی یافت نشود، مقدار بعدی استفاده خواهد شد. (برای استثنایی بر این رفتار، سبک file-patterns را ببینید.).PP برای مثال:
zstyle ':completion:*:complete:-command-:*:*' tag-order \
'commands functions'
مشخص میکند که تکمیل در جایگاه دستور، ابتدا دستورهای خارجی و توابع پوسته را پیشنهاد دهد. اگر هیچ تکمیلی یافت نشود، برچسبهای باقیمانده امتحان خواهند شد.
علاوه بر نامهای برچسب، هر رشته در مقدار میتواند یکی از قالبهای زیر را داشته باشد:
- -
- اگر هر مقداری تنها شامل یک خط پیوند باشد، آنگاه فقط برچسبهای مشخصشده در سایر مقادیر تولید میشوند. بهطور معمول، اگر برچسبهای مشخصشده هیچ تطابقی ایجاد نکنند، تمام برچسبهایی که بهصراحت انتخاب نشدهاند در آخر امتحان میشوند. این بدان معناست که یک مقدار منفرد که تنها شامل یک خط پیوند باشد، تکمیل را خاموش میکند.
- ! tags...
- رشتهای که با علامت تعجب شروع میشود، نام برچسبهایی را مشخص میکند که نباید استفاده شوند. اثر آن همانند این است که تمام برچسبهای ممکن دیگر برای این زمینه فهرست شده باشند.
- tag:label ...
- در اینجا، tag یکی از برچسبهای استاندارد و label یک نام دلخواه است. تطابقها طبق معمول تولید میشوند اما نام label در زمینهها بهجای tag به کار میرود. این در کلماتی که با ! شروع میشوند کاربردی ندارد.
اگر label با یک خط پیوند آغاز شود، tag به ابتدای label اضافه میشود تا نام مورد استفاده برای جستجو را تشکیل دهد. این را میتوان به کار برد تا سیستم تکمیل یک برچسب خاص را بیش از یک بار امتحان کند و برای هر تلاش تنظیمات سبک متفاوتی را ارائه دهد؛ برای مثال به بخش زیر مراجعه کنید.
- tag:label:description
- مانند حالت قبل، اما description بهجای توضیحات پیشفرضی که تابع تکمیل ارائه میدهد، جایگزین «%d» در مقدار سبک format خواهد شد. فاصلهها در توضیحات باید با یک بکاسلش نقلقول شوند. هر «%d» که در description بیاید، با توضیحی که تابع تکمیل ارائه داده جایگزین میشود.
در هر یک از قالبهای بالا، برچسب میتواند یک الگو یا چند الگو به شکل «{pat1,pat2...}» باشد. در این حالت تمام برچسبهای منطبق استفاده خواهند شد، مگر مواردی که بهصراحت در همان رشته ذکر شده باشند.
یکی از کاربردهای این ویژگیها، امتحان بیش از یکبار یک برچسب است، با تنظیم سبکهای دیگر به شکلهای متفاوت در هر تلاش، در حالی که همچنان از همهٔ برچسبهای دیگر بدون نیاز به تکرار همهٔ آنها استفاده شود. برای مثال، برای اینکه تکمیل نامهای توابع در جایگاه دستور، در اولین باری که تکمیل امتحان میشود، از تمام توابع تکمیلی که با زیرخط شروع میشوند صرفنظر کند:
zstyle ':completion:*:*:-command-:*:*' tag-order \
'functions:-non-comp *' functions
zstyle ':completion:*:functions-non-comp' \
ignored-patterns '_*'
در اولین تلاش، تمام برچسبها ارائه میشوند اما برچسب functions با functions-non-comp جایگزین خواهد شد. سبک ignored-patterns برای این برچسب تنظیم شده است تا توابعی را که با زیرخط شروع میشوند مستثنی کند. اگر هیچ تطابقی وجود نداشته باشد، مقدار دوم سبک tag-order استفاده میشود که توابع را با استفاده از برچسب پیشفرض تکمیل میکند، که این بار احتمالاً شامل تمام نامهای توابع خواهد بود.
تطابقهای یک برچسب را میتوان به گروههای مختلف تقسیم کرد. برای مثال:
zstyle ':completion:*' tag-order \
'options:-long:long\ options
options:-short:short\ options
options:-single-letter:single\ letter\ options'
zstyle ':completion:*:options-long' \
ignored-patterns '[-+](|-|[^-]*)'
zstyle ':completion:*:options-short' \
ignored-patterns '--*' '[-+]?'
zstyle ':completion:*:options-single-letter' \
ignored-patterns '???*'
با تنظیم سبک group-names، گزینههایی که با «--» شروع میشوند، گزینههایی که با یک «-» یا «+» منفرد شروع شده اما شامل چندین نویسه هستند، و گزینههای تکحرفی، در گروههای جداگانه همراه با توضیحات متفاوت نمایش داده خواهند شد.
یکی دیگر از کاربردهای الگوها، امتحان مشخصات تطابق چندگانه بهصورت متوالی است. سبک matcher-list قابلیت مشابهی را ارائه میدهد، اما در مراحل بسیار ابتدایی سیستم تکمیل بررسی میشود و بنابراین نمیتوان آن را برای دستورهای منفرد یا برای زمینههای خاصتر تنظیم کرد. در اینجا نحوهٔ امتحان تکمیل عادی بدون هیچ مشخصهٔ تطابق آورده شده است، و اگر تطابقی حاصل نشد، با تطابق غیرحساس به حروف بزرگ و کوچک دوباره امتحان شود، در حالی که اثر آن به آرگومانهای دستور foo محدود شده است:
zstyle ':completion:*:*:foo:*:*' tag-order '*' '*:-case'
zstyle ':completion:*-case' matcher 'm:{a-z}={A-Z}'
ابتدا، تمام برچسبهای ارائهشده هنگام تکمیل پس از foo با استفاده از نام برچسب عادی امتحان میشوند. اگر هیچ تطابقی حاصل نشود، مقدار دوم tag-order به کار میرود که تمام برچسبها را دوباره امتحان میکند، با این تفاوت که این بار -case برای جستجوی سبکها به نام هرکدام الحاق شده است. بنابراین این بار، مقدار سبک matcher از دومین فراخوانی zstyle در مثال استفاده میشود تا تکمیل غیرحساس به حروف بزرگ و کوچک شود.
میتوان از گزینهٔ -e از دستور توکار zstyle برای تعیین شرایط استفاده از برچسبهای خاص بهره برد. برای مثال:
zstyle -e '*:-command-:*' tag-order '
if [[ -n $PREFIX$SUFFIX ]]; then
reply=( )
else
reply=( - )
fi'
تکمیل در جایگاه دستور تنها در صورتی تلاش خواهد شد که رشتهٔ تایپشده تا این لحظه خالی نباشد. این مورد با استفاده از پارامتر ویژهٔ PREFIX بررسی میشود؛ برای توضیح پارامترهایی که درون ابزارکهای تکمیل ویژه هستند به zshcompwid مراجعه کنید. تنظیم reply روی یک آرایهٔ خالی، رفتار پیشفرض یعنی امتحان کردن همزمان همهٔ برچسبها را فراهم میکند؛ تنظیم آن روی آرایهای که تنها شامل یک خط پیوند است، استفاده از همهٔ برچسبها و در نتیجه تمام تکمیلها را غیرفعال میکند.
اگر هیچ سبک tag-order برای زمینهای تعریف نشده باشد، رشتههای «(|*-)argument-* (|*-)option-* values» و «options» به همراه تمام برچسبهای ارائهشده توسط تابع تکمیل، برای ارائه یک رفتار پیشفرض معقول استفاده میشوند که باعث میشود آرگومانها (خواه آرگومانهای عادی دستور یا آرگومانهای گزینهها) برای بیشتر دستورها پیش از نام گزینهها تکمیل شوند.
- urls
- این سبک به همراه برچسب urls توسط توابعی که URLها را تکمیل میکنند، استفاده میشود.
اگر مقدار از بیش از یک رشته تشکیل شده باشد، یا اگر تنها رشتهٔ موجود، نام یک فایل یا دایرکتوری نباشد، رشتهها به عنوان URLهایی برای تکمیل استفاده میشوند.
اگر مقدار تنها شامل یک رشته باشد که نام یک فایل عادی است، URLها از آن فایل گرفته میشوند (که در آن URLها ممکن است با فاصله یا خط جدید جدا شده باشند).
در نهایت، اگر تنها رشته در این مقدار، نام یک دایرکتوری باشد، سلسلهمراتب دایرکتوری با ریشه در این دایرکتوری، گزینههای تکمیل را مشخص میکند. دایرکتوری سطح بالا باید روش دسترسی به فایل باشد، مانند «http»، «ftp»، «bookmark» و غیره. در بسیاری از موارد سطح بعدی دایرکتوریها یک نام فایل خواهد بود. این سلسلهمراتب دایرکتوری میتواند به اندازهٔ نیاز به سطوح عمیقتر برود..PP برای نمونه،
zstyle ':completion:*' urls ~/.urls mkdir -p ~/.urls/ftp/ftp.zsh.org/pub
تکمیل تمام مؤلفههای نشانی وب ftp://ftp.zsh.org/pub را پس از دستورهای مناسبی مانند `netscape' یا `lynx' ممکن میسازد. با این حال توجه داشته باشید که روشهای دسترسی و فایلها بهطور جداگانه کامل میشوند؛ بنابراین اگر سبک hosts تنظیم شده باشد، میزبانها میتوانند بدون ارجاع به سبک urls تکمیل شوند.
برای اطلاعات بیشتر، به توضیحات درون خود تابع _urls مراجعه کنید (بهعنوان مثال `more $^fpath/_urls(N)').
- use-cache
- اگر این سبک تنظیم شود، لایهٔ حافظهٔ موقت تکمیل برای هر تکمیلی که از آن استفاده میکند (از طریق توابع _store_cache، _retrieve_cache و _cache_invalid) فعال میشود. دایرکتوری حاوی فایلهای حافظهٔ موقت را میتوان با سبک cache-path تغییر داد.
- use-compctl
- اگر این سبک روی رشتهای تنظیم شود که برابر با false، 0، no و off نباشد، سامانهٔ تکمیل ممکن است از هرگونه مشخصهٔ تکمیلی که با دستور توکار compctl تعریف شده است استفاده کند. اگر سبک تنظیم نشده باشد، این کار تنها در صورتی انجام میشود که ماژول zsh/compctl بارگذاری شده باشد. این رشته همچنین میتواند شامل زیررشتهٔ `first' برای استفاده از تکمیلهای تعریفشده با `compctl -T'، و زیررشتهٔ `default' برای استفاده از تکمیل تعریفشده با `compctl -D' باشد.
توجه داشته باشید که این سبک تنها برای تسهیل گذار از compctl به سامانهٔ تکمیل جدید در نظر گرفته شده است و ممکن است در آینده حذف شود.
همچنین توجه داشته باشید که تعاریف compctl تنها در صورتی استفاده خواهند شد که هیچ تابع تکمیل خاصی برای دستور مورد نظر وجود نداشته باشد. برای نمونه، اگر تابعی به نام _foo برای تکمیل آرگومانهای دستور foo وجود داشته باشد، compctl هرگز برای foo فراخوانی نخواهد شد. با این حال، اگر foo تنها از تکمیل پیشفرض استفاده کند، نسخهٔ compctl امتحان خواهد شد.
- use-ip
- بهطور پیشفرض، تابع _hosts که نامهای میزبان را کامل میکند، نشانیهای IP را از مدخلهای خواندهشده از پایگاههای دادهٔ میزبان مانند فایلهای NIS و ssh حذف میکند. اگر این سبک `true' باشد، نشانیهای IP متناظر نیز میتوانند تکمیل شوند. این سبک در هر زمینهای که سبک hosts تنظیم شده باشد استفاده نمیشود؛ همچنین توجه داشته باشید که باید پیش از ایجاد حافظهٔ موقت نامهای میزبان (معمولاً در نخستین تلاش برای تکمیل) تنظیم شود.
- users
- میتوان این سبک را روی فهرستی از نامهای کاربری برای تکمیل تنظیم کرد. اگر تنظیم نشود، تمام نامهای کاربری تکمیل خواهند شد. توجه داشته باشید که در صورت تنظیم، تنها همان فهرست کاربران تکمیل خواهد شد؛ چرا که در برخی سامانهها پرسوجوی تمام کاربران میتواند زمان بسیار زیادی ببرد.
- users-hosts
- مقادیر این سبک باید به شکل `user@host' یا `user:host' باشند. این سبک برای دستورهایی استفاده میشود که به جفتهای نام کاربر و میزبان نیاز دارند. این دستورها نامهای کاربری را (تنها) از این سبک تکمیل میکنند، و تکمیل بعدی نام میزبان را به میزبانهایی محدود خواهند کرد که در یکی از مقادیر این سبک با آن کاربر جفت شدهاند.
امکان گروهبندی مقادیر برای مجموعهای از دستورها که ورود از راه دور را مجاز میدانند، مانند rlogin و ssh، با استفاده از برچسب my-accounts وجود دارد. به همین ترتیب، مقادیر برای مجموعهای از دستورها که معمولاً به حسابهای کاربری افراد دیگر اشاره دارند، مانند talk و finger، میتوانند با استفاده از برچسب other-accounts گروهبندی شوند. دستورهای دوگانهتر میتوانند از برچسب accounts استفاده کنند.
- users-hosts-ports
- مانند users-hosts است اما برای دستورهایی مانند telnet استفاده میشود و شامل رشتههایی به شکل `user@host:port' است.
- verbose
- اگر تنظیم شود، همانطور که بهطور پیشفرض چنین است، فهرست تکمیل با جزئیات بیشتری نمایش داده میشود. بهویژه اگر این سبک `true' باشد، بسیاری از دستورها توضیحاتی را برای گزینهها نشان میدهند.
- word
- این سبک توسط تکمیلکنندهٔ _list استفاده میشود که تا زمان تلاش دوم برای تکمیل در حالتی که خط تغییر نکرده باشد، از درج موارد تکمیلی جلوگیری میکند. روش معمول برای تشخیص تغییر خط این است که کل محتوای آن بین دو مرتبه مقایسه شود. اگر این سبک `true' باشد، مقایسه بهجای آن تنها روی کلمهٔ فعلی انجام میشود. بنابراین اگر تکمیل روی کلمهٔ دیگری با همان محتوا انجام گیرد، تکمیل به تأخیر نخواهد افتاد.
اسکریپت مقداردهی اولیه compinit تمام ویجتهایی را که تکمیل را انجام میدهند بازتعریف میکند تا تابع ویجت ارائهشده _main_complete را فراخوانی کنند. این تابع به عنوان یک پوشش (wrapper) عمل میکند که توابع بهاصطلاح «completer» (تکمیلکننده) را برای تولید تطابقها فراخوانی میکند. اگر _main_complete با آرگومانهایی فراخوانی شود، این آرگومانها به عنوان نام توابع تکمیلکنندهای در نظر گرفته میشوند که باید به ترتیب دادهشده فراخوانی گردند. اگر هیچ آرگومانی داده نشود، مجموعهای از توابع که باید آزمایش شوند از سبک completer گرفته میشود. برای نمونه، جهت استفاده از تکمیل عادی و تصحیح در صورتی که هیچ تطابقی تولید نشود:
zstyle ':completion:*' completer _complete _correct
پس از فراخوانی compinit. مقدار پیشفرض برای این سبک `_complete _ignored' است، یعنی در حالت عادی تنها تکمیل معمول آزمایش میشود؛ ابتدا با اثر سبک ignored-patterns و سپس بدون آن. تابع _main_complete از وضعیت خروج توابع تکمیلکننده استفاده میکند تا تصمیم بگیرد آیا تکمیلکنندههای دیگر باید فراخوانی شوند یا خیر. اگر وضعیت خروج صفر باشد، هیچ تکمیلکننده دیگری آزمایش نمیشود و تابع _main_complete بازمیگردد.
اگر نخستین آرگومان به _main_complete یک خط پیوند منفرد (-) باشد، آرگومانها به عنوان نامهای تکمیلکنندهها در نظر گرفته نخواهند شد. در عوض، آرگومان دوم نامی را مشخص میکند که در فیلد completer از بافت (context) استفاده شود و آرگومانهای دیگر نام دستور و آرگومانهایی را مشخص میکنند که برای تولید تطابقها باید فراخوانی شوند.
توابع تکمیلکننده زیر در توزیع گنجانده شدهاند، هرچند کاربران میتوانند توابع خود را بنویسند. توجه داشته باشید که در بافتها، زیرخط (underscore) ابتدایی حذف میشود؛ برای نمونه، تکمیل پایهای در بافت `:completion::complete:...' انجام میگیرد.
- _all_matches
- این تکمیلکننده میتواند برای افزودن رشتهای شامل تمام تطابقهای دیگر به کار رود. از آنجا که بر تکمیلکنندههای بعدی اثر میگذارد، باید به عنوان نخستین تکمیلکننده در فهرست قرار گیرد. فهرست تمام تطابقها تحت تأثیر سبکهای avoid-completer و old-matches که در بالا شرح داده شدند قرار میگیرد.
ممکن است استفاده از تابع _generic که در زیر توضیح داده شده برای مقید کردن _all_matches به کلید میانبر اختصاصی خود مفید باشد، برای نمونه:
zle -C all-matches complete-word _generic bindkey '^Xa' all-matches zstyle ':completion:all-matches:*' old-matches only zstyle ':completion:all-matches::::' completer _all_matches
توجه داشته باشید که این دستور به خودی خود تکمیلی تولید نمیکند: ابتدا از هر یک از روشهای استاندارد برای ایجاد فهرستی از تکمیلها استفاده کنید، سپس ^Xa را برای نمایش تمام تطابقها به کار ببرید. در عوض میتوان یک تکمیلکننده استاندارد را به فهرست اضافه کرد و درخواست نمود که فهرست تمام تطابقها مستقیماً درج شود:
zstyle ':completion:all-matches::::' completer \
_all_matches _complete
zstyle ':completion:all-matches:*' insert true
در این حالت سبک old-matches نباید تنظیم شود.
- _approximate
- این تابع شبیه تکمیلکننده پایه _complete است اما اجازه میدهد تا تکمیلها دستخوش تصحیح شوند. بیشینه تعداد خطاها را میتوان با سبک max-errors تعیین کرد؛ برای آگاهی از نحوه شمارش خطاها، توضیحات مربوط به تطابق تقریبی را در zshexpn(1) ببینید. معمولاً این تکمیلکننده تنها پس از تکمیلکننده عادی _complete آزمایش خواهد شد:
zstyle ':completion:*' completer _complete _approximate
این کار تکمیلِ همراه با تصحیح را فقط و فقط در صورتی ارائه میدهد که تکمیل عادی هیچ تکمیل ممکنی تولید نکند. هنگامی که تکمیلهای تصحیحشده یافت شوند، تکمیلکننده به طور عادی تکمیل منویی را آغاز میکند که به شما اجازه میدهد در میان این رشتهها پیمایش کنید.
این تکمیلکننده هنگام تولید تصحیحهای ممکن و رشته اصلی، از برچسبهای corrections و original استفاده میکند. سبک format برای برچسب اول میتواند شامل توالیهای اضافی `%e' و `%o' باشد که به ترتیب با تعداد خطاهای پذیرفتهشده برای تولید تصحیحها و رشته اصلی، جایگزین خواهند شد.
تکمیلکننده تعداد خطاهای مجاز را به تدریج تا حد تعیینشده توسط سبک max-errors افزایش میدهد؛ بنابراین اگر تکمیلی با یک خطا پیدا شود، هیچ تکمیلی با دو خطا نمایش داده نخواهد شد، و به همین ترتیب. این تابع نام تکمیلکننده را در بافت تغییر میدهد تا نشان دهد چه تعداد خطا در حال آزمایش است: در تلاش اول فیلد completer شامل `approximate-1'، در تلاش دوم `approximate-2'، و غیره خواهد بود.
هنگامی که _approximate از تابع دیگری فراخوانی میشود، تعداد خطاهای قابل پذیرش را میتوان با گزینه -a ارسال کرد. قالب آرگومان مشابه سبک max-errors و همگی در یک رشته است.
توجه داشته باشید که فراخوانی این تکمیلکننده (و تکمیلکننده _correct که در زیر ذکر شده) به ویژه هنگامی که تعداد زیادی خطا مجاز باشد، میتواند بسیار سنگین و پرهزینه باشد. یک راه برای جلوگیری از این موضوع، تنظیم سبک completer با استفاده از گزینه -e برای zstyle است به طوری که برخی از تکمیلکنندهها تنها زمانی استفاده شوند که تکمیل برای بار دوم روی همان رشته امتحان شود، مثلاً:
zstyle -e ':completion:*' completer '
if [[ $_last_try != "$HISTNO$BUFFER$CURSOR" ]]; then
_last_try="$HISTNO$BUFFER$CURSOR"
reply=(_complete _match _prefix)
else
reply=(_ignored _correct _approximate)
fi'
این پیکربندی از پارامتر HISTNO و پارامترهای خاص BUFFER و CURSOR که درون ویجتهای zle و تکمیل در دسترس هستند استفاده میکند تا متوجه شود آیا خط فرمان از آخرین باری که تکمیل آزمایش شده تغییر کرده است یا خیر. تنها در این صورت است که تکمیلکنندههای _ignored، _correct و _approximate فراخوانی میشوند.
- _canonical_paths [ -A var ] [ -N ] [ -MJV12nfX ] tag descr [ paths ... ]
- این تابع تکمیل، تمامی مسیرهای دادهشده به آن را تکمیل میکند، و همچنین تلاش میکند پیشنهادهایی را ارائه دهد که به همان فایلِ یکی از مسیرهای دادهشده اشاره میکنند (مسیر نسبی هنگامی که یک مسیر مطلق داده شده باشد، و برعکس؛ هنگامی که .. در کلمه مورد نظر برای تکمیل وجود داشته باشد؛ و برخی مسیرهای بهدستآمده از پیوندهای نمادین).
گزینه -A در صورت تعیین، مسیرها را از متغیر آرایه مشخصشده میگیرد. مسیرها همچنین میتوانند همانطور که در بالا نشان داده شد در خط فرمان مشخص شوند. گزینه -N در صورت تعیین، از متعارفسازی مسیرهای دادهشده پیش از استفاده برای تکمیل، در صورتی که از قبل متعارف باشند، جلوگیری میکند. گزینههای -M، -J، -V، -1، -2، -n، -F و -X به compadd فرستاده میشوند.
برای توضیحات درباره tag و descr به _description مراجعه کنید.
- _cmdambivalent
- آرگومانهای مکانی باقیمانده را به عنوان یک دستور خارجی تکمیل میکند. اگر دو یا چند آرگومان مکانی در خط فرمان باقی مانده باشد، دستور خارجی و آرگومانهای آن به عنوان آرگومانهای مجزا (به شیوهای مناسب برای تکمیل /usr/bin/env) تکمیل میشوند، و در غیر این صورت به عنوان یک رشته دستوری نقلقولشده (به شیوه system(...)) تکمیل میگردد. همچنین _cmdstring و _precommand را ببینید.
این تابع هیچ آرگومانی نمیپذیرد.
- _cmdstring
- یک دستور خارجی را به عنوان یک آرگومان منفرد، همانند system(...) تکمیل میکند.
- _complete
- این تکمیلکننده تمام تکمیلهای ممکن را به شیوهای حساس به بافت (context-sensitive) ایجاد میکند، یعنی با استفاده از تنظیمات تعریفشده توسط تابع compdef که در بالا توضیح داده شد و تنظیمات فعلی تمام پارامترهای خاص. این امر رفتار تکمیل عادی را فراهم میکند.
برای تکمیل آرگومانهای دستورها، _complete از تابع ابزاری _normal استفاده میکند که به نوبه خود مسئول یافتن تابع خاص مربوطه است؛ این تابع در زیر شرح داده شده است. بافتهای گوناگون به صورت -context- به طور ویژه رسیدگی میشوند. تمام این موارد در بالا به عنوان آرگومانهای ممکن برای برچسب #compdef ذکر شدهاند..PP پیش از تلاش برای یافتن تابعی برای یک بافت (context) خاص، _complete بررسی میکند که آیا پارامتر «compcontext» مقداردهی شده است یا خیر. مقداردهی «compcontext» اجازه میدهد توزیع معمول کاملسازی بازنویسی (override) شود، که در مواردی مانند تابعی که از vared برای ورودی استفاده میکند مفید است. اگر به صورت یک آرایه مقداردهی شود، عناصر آن به عنوان تطابقهای ممکن در نظر گرفته میشوند که با برچسب (tag) «values» و شرح (description) «value» کامل خواهند شد. اگر به صورت یک آرایهٔ انجمنی (associative array) مقداردهی شود، کلیدها به عنوان کاملسازیهای ممکن و مقادیر (در صورت غیرخالی بودن) به عنوان شرح برای تطابقها استفاده میشوند. اگر «compcontext» به رشتهای حاوی دونقطه تنظیم شود، باید به قالب «tag:descr:action» باشد. در این حالت، tag و descr برچسب و شرح مورد استفاده را مشخص میکنند و action تعیین میکند چه چیزی باید در یکی از قالبهای پذیرفتهشده توسط تابع کمکی _arguments که در زیر شرح داده شده کامل شود.
در نهایت، اگر «compcontext» به رشتهای بدون دونقطه تنظیم شود، مقدار آن به عنوان نام بافتِ مورد استفاده در نظر گرفته شده و تابع تعریفشده برای آن بافت فراخوانی خواهد شد. بدین منظور، بافت ویژهای به نام -command-line- وجود دارد که کل خطوط فرمان (دستورها و آرگومانهای آنها) را کامل میکند. این بافت توسط خود سیستم کاملسازی استفاده نمیشود، اما با این وجود در صورت فراخوانی صریح، مدیریت میگردد.
- _correct
- برای کلمهٔ فعلی تصحیح تولید میکند، اما نه کاملسازی؛ این کاملکننده مشابه _approximate است اما بر خلاف آن، اجازهٔ هیچ تعداد نویسهٔ اضافی در مکاننما را نمیدهد. اثر آن مشابه غلطیابی املایی است. این تابع بر اساس _approximate است، اما فیلد completer در نام بافت، correct است.
برای مثال، با:
zstyle ':completion:::::' completer \
_complete _correct _approximate
zstyle ':completion:*:correct:::' max-errors 2 not-numeric
zstyle ':completion:*:approximate:::' max-errors 3 numeric
تصحیح تا دو خطا را خواهد پذیرفت. اگر یک آرگومان عددی داده شود، تصحیح انجام نخواهد شد، اما کاملسازیِ تصحیحکننده انجام میشود و به تعداد خطاهایی که با آرگومان عددی داده شده خطا میپذیرد. بدون یک آرگومان عددی، ابتدا تصحیح و سپس کاملسازیِ تصحیحکننده امتحان خواهد شد که اولی دو خطا و دومی سه خطا را میپذیرد.
هنگامی که _correct به عنوان یک تابع فراخوانی میشود، تعداد خطاهای قابل پذیرش ممکن است پس از گزینهٔ -a مشخص شود. این آرگومان در قالبی مشابه مقادیر سبک accept، همه در قالب یک رشته است.
این تابع کاملکننده برای استفاده بدون کاملکنندهٔ _approximate یا همانطور که در مثال آمده، درست قبل از آن در نظر گرفته شده است. استفاده از آن پس از کاملکنندهٔ _approximate بیفایده است؛ چرا که _approximate حداقل رشتههای تصحیحشدهٔ تولیدشده توسط کاملکنندهٔ _correct را تولید خواهد کرد -- و احتمالاً فراتر از آن را نیز شامل میشود.
- _expand
- این تابع کاملکننده در واقع کاملسازی انجام نمیدهد، بلکه بررسی میکند آیا کلمهٔ روی خط فرمان واجد شرایط گسترش (expansion) است یا خیر، و در این صورت، کنترلی دقیق بر نحوهٔ انجام این گسترش فراهم میکند. برای رخ دادن این امر، سیستم کاملسازی باید با complete-word فراخوانی شود، نه با expand-or-complete (کلید پیشفرض مقیدشده برای TAB)، زیرا در غیر این صورت رشته پیش از آغاز سیستم کاملسازی توسط سازوکار داخلی پوسته گسترش خواهد یافت. همچنین توجه داشته باشید که این کاملکننده باید قبل از تابع کاملکنندهٔ _complete فراخوانی شود.
برچسبهای مورد استفاده هنگام تولید گسترشها عبارتند از: all-expansions برای رشتهای که شامل تمام گسترشهای ممکن است، expansions هنگام افزودن گسترشهای ممکن به عنوان تطابقهای تکی، و original هنگام افزودن رشتهٔ اصلی از خط فرمان. ترتیبی که این رشتهها (در صورت تولید) ارائه میشوند را میتوان طبق معمول با سبکهای group-order و tag-order کنترل کرد.
رشتهٔ قالب برای all-expansions و برای expansions ممکن است حاوی توالی «%o» باشد که با رشتهٔ اصلی از خط فرمان جایگزین خواهد شد.
نوع گسترشی که باید آزموده شود توسط سبکهای substitute، glob و subst-globs-only کنترل میشود.
همچنین میتوان _expand را به عنوان یک تابع فراخوانی کرد، که در این حالت حالتهای مختلف را میتوان با گزینهها انتخاب کرد: -s برای substitute، -g برای glob و -o برای subst-globs-only.
- _expand_alias
- اگر کلمهای که مکاننما روی آن قرار دارد یک نام مستعار (alias) باشد، گسترش مییابد و هیچ کاملکنندهٔ دیگری فراخوانی نمیشود. انواع نامهای مستعاری را که باید گسترش یابند میتوان با سبکهای regular، global و disabled کنترل کرد.
این تابع یک دستور قابل اتصال به کلید نیز هست؛ بخش «دستورهای مقیدشدنی (Bindable Commands)» را در زیر ببینید.
- _extensions
- اگر مکاننما در پی رشتهٔ «*.» باشد، پسوندهای نام فایل کامل میشوند. پسوندها از فایلهای موجود در دایرکتوری فعلی یا دایرکتوری مشخصشده در ابتدای کلمهٔ فعلی گرفته میشوند. برای تطابقهای دقیق، کاملسازی ادامه مییابد تا به سایر کاملکنندهها مانند _expand اجازه دهد الگو را گسترش دهند. سبکهای استاندارد add-space و prefix-hidden رعایت میشوند.
- _external_pwds
- دایرکتوریهای کاری فعلیِ سایر فرایندهای zsh متعلق به کاربر فعلی را کامل میکند.
این تابع برای استفاده از طریق _generic، متصلشده به یک ترکیب کلید سفارشی در نظر گرفته شده است. توجه داشته باشید که تطبیق الگو فعال است، بنابراین تطبیق مشابه نحوهٔ عملکرد آن با کاملکنندهٔ _match انجام میشود.
- _history
- کلمات را از تاریخچهٔ دستورات پوسته کامل میکند. این کاملکننده میتواند توسط سبکهای remove-all-dups و sort کنترل شود، درست مانند دستور مقیدشدنی _history_complete_word؛ بخش «دستورهای مقیدشدنی (Bindable Commands)» در زیر و بخش «پیکربندی سیستم کاملسازی (Completion System Configuration)» در بالا را ببینید.
- _ignored
- سبک ignored-patterns را میتوان به فهرستی از الگوها تنظیم کرد که با کاملسازیهای ممکن مقایسه میشوند؛ موارد منطبق حذف میگردند. با این کاملکننده، آن تطابقها میتوانند دوباره برقرار شوند، درست مانند اینکه هیچ سبک ignored-patterns تنظیم نشده باشد. این کاملکننده در واقع فهرست تطابقهای خود را تولید میکند؛ اینکه چه کاملکنندههایی فراخوانی شوند به همان شیوهای تعیین میشود که برای کاملکنندهٔ _prefix مشخص شده است. سبک single-ignored نیز همانطور که در بالا شرح داده شد در دسترس است.
- _list
- این کاملکننده اجازه میدهد درج تطابقها تا زمانی که برای بار دوم بدون تغییر کلمه روی خط فرمان تلاش برای کاملسازی شود، به تعویق بیفتد. در تلاش اول، تنها فهرست تطابقها نشان داده خواهد شد. این کاملکننده تحت تأثیر سبکهای condition و word قرار دارد؛ بخش «پیکربندی سیستم کاملسازی (Completion System Configuration)» در بالا را ببینید.
- _match
- این کاملکننده برای استفاده پس از کاملکنندهٔ _complete در نظر گرفته شده است. رفتاری مشابه دارد اما رشتهٔ روی خط فرمان میتواند الگویی برای تطبیق با کاملسازیهای آزمایشی باشد. این رفتار اثری مشابه گزینهٔ GLOB_COMPLETE ایجاد میکند.
به طور معمول، کاملسازی با گرفتن الگو از خط فرمان، درج یک «*» در موقعیت مکاننما و مقایسهٔ الگوی حاصل با کاملسازیهای ممکن تولیدشده انجام خواهد شد. این رفتار را میتوان با سبک match-original که در بالا توضیح داده شد تغییر داد.
تطابقهای تولیدشده در یک کاملسازی منویی ارائه خواهند شد، مگر اینکه سبک insert-unambiguous روی «true» تنظیم شده باشد؛ برای سایر گزینههای این سبک توضیحات بالا را ببینید.
توجه داشته باشید مشخصات تطبیقدهندهای که به صورت سراسری تعریف شدهاند یا توسط توابع کاملسازی استفاده میشوند (سبکهای matcher-list و matcher) مورد استفاده قرار نخواهند گرفت.
- _menu
- این کاملکننده به عنوان یک تابع نمونهٔ ساده نوشته شد تا نشان دهد چگونه میتوان کاملسازی منویی را در کد پوسته فعال کرد. با این حال، اثر قابلتوجه غیرفعالسازی انتخاب منو (menu selection) را دارد که میتواند برای ویجتهای مبتنی بر _generic مفید باشد. این کاملکننده باید به عنوان نخستین کاملکننده در فهرست استفاده شود. توجه داشته باشید که این رفتار مستقل از تنظیم گزینهٔ MENU_COMPLETE است و با سایر ویجتهای کاملسازی منویی مانند reverse-menu-complete یا accept-and-menu-complete کار نمیکند.
- _oldlist
- این کاملکننده نحوهٔ رفتار ویجتهای استاندارد کاملسازی را هنگام وجود یک فهرست موجود از کاملسازیها که ممکن است توسط یک کاملسازی خاص تولید شده باشد (یعنی یک دستور کاملسازی با اتصال کلید جداگانه)، کنترل میکند. این امکان را فراهم میسازد که کلیدهای معمولی کاملسازی به جای تولید فهرست جدیدی از کاملسازیهای بافتی معمولی، همچنان از فهرست کاملسازیهای تولیدشده بدین ترتیب استفاده کنند. این کاملکننده باید در فهرست کاملکنندهها پیش از هر ویجتی که تطابق تولید میکند ظاهر شود. این تابع از دو سبک استفاده میکند: old-list و old-menu؛ بخش «پیکربندی سیستم کاملسازی (Completion System Configuration)» در بالا را ببینید..TP _precommand یک دستور خارجی را در آرگومانهای جداشده با کلمه کامل میکند، همانند exec و /usr/bin/env.
- _prefix
- از این کاملکننده میتوان برای آزمودن تکمیل با نادیده گرفتن پسوند (تمام موارد پس از مکاننما) استفاده کرد. به عبارت دیگر، پسوند بخشی از کلمه برای تکمیل در نظر گرفته نخواهد شد. تأثیر آن مشابه دستور expand-or-complete-prefix است.
سبک completer برای تصمیمگیری دربارهٔ اینکه کدام کاملکنندههای دیگر برای تولید تطابقها فراخوانی شوند استفاده میشود. اگر این سبک تنظیم نشده باشد، فهرست کاملکنندههای تعیینشده برای زمینهٔ فعلی به کار میرود -- البته به جز خودِ کاملکنندهٔ _prefix. علاوه بر این، اگر این کاملکننده بیش از یک بار در فهرست کاملکنندهها بیاید، تنها آن کاملکنندههایی فراخوانی میشوند که در آخرین فراخوانی _prefix هنوز آزموده نشدهاند.
برای نمونه، این سبک سراسری completer را در نظر بگیرید:
zstyle ':completion:*' completer \
_complete _prefix _correct _prefix:foo
در اینجا، کاملکنندهٔ _prefix تکمیل عادی را با نادیده گرفتن پسوند میآزماید. اگر این کار تطابقی تولید نکند، و فراخوانی کاملکنندهٔ _correct پس از آن نیز تطابقی ندهد، _prefix برای بار دوم فراخوانی میشود و این بار تنها تصحیح را با نادیده گرفتن پسوند میآزماید. در دومین فراخوانی، بخش کاملکنندهٔ زمینه به صورت `foo' ظاهر میشود.
برای استفاده از _prefix به عنوان آخرین چاره و آزمودن تنها تکمیل عادی در هنگام فراخوانی آن:
zstyle ':completion:*' completer _complete ... _prefix zstyle ':completion::prefix:*' completer _complete
سبک add-space نیز رعایت میشود. اگر بر روی `true' تنظیم شده باشد، آنگاه _prefix یک فاصله بین تطابقهای تولیدشده (در صورت وجود) و پسوند درج خواهد کرد.
توجه داشته باشید که این کاملکننده تنها در صورتی مفید است که گزینهٔ COMPLETE_IN_WORD تنظیم شده باشد؛ در غیر این صورت، مکاننما پیش از فراخوانی کد تکمیل به انتهای کلمهٔ فعلی منتقل میشود و در نتیجه پسوندی وجود نخواهد داشت.
- _user_expand
- این کاملکننده رفتاری مشابه کاملکنندهٔ _expand دارد، اما به جای آن، بسطهای تعریفشده توسط کاربران را انجام میدهد. سبکهای add-space و sort که مخصوص کاملکنندهٔ _expand هستند، علاوه بر سبکهای دیگر که به صورت عمومیتر توسط سامانهٔ تکمیل مدیریت میشوند، با _user_expand نیز قابل استفادهاند. برچسب all-expansions نیز در دسترس است.
بسط وابسته به این است که سبک آرایهای user-expand برای زمینهٔ فعلی تعریف شده باشد؛ به یاد داشته باشید که زمینه برای کاملکنندهها نسبت به تکمیل زمینهای کلیتر است، چرا که زمینهٔ کامل هنوز تعیین نشده است. عناصر این آرایه میتوانند یکی از شکلهای زیر را داشته باشند:
- $hash
-
hash نام یک آرایهٔ متناظر است. توجه داشته باشید که این یک عبارت پارامتری کامل نیست، صرفاً یک $ است که به شیوهٔ مناسب نقلقول شده تا از بسط فوری جلوگیری شود، و به دنبال آن نام یک آرایهٔ متناظر میآید. اگر کلمهٔ آزمایشی بسط با یک کلید در hash مطابقت داشته باشد، بسط حاصل مقدار متناظر با آن خواهد بود.
- _func
-
_func نام یک تابع پوسته است که نام آن باید با _ آغاز شود، اما از جنبههای دیگر برای سامانهٔ تکمیل خاص نیست. تابع با کلمهٔ آزمایشی به عنوان یک آرگومان فراخوانی میشود. اگر قرار است کلمه بسط داده شود، تابع باید آرایهٔ reply را روی فهرستی از بسطها تنظیم کند. به صورت اختیاری، میتواند REPLY را روی کلمهای تنظیم کند که به عنوان توضیحی برای مجموعهٔ بسطها استفاده شود. وضعیت خروج تابع اهمیتی ندارد.
علاوه بر کاملسازیهای وابسته به زمینهای که ارائه شدهاند و انتظار میرود به شیوهای شهودی و روشن کار کنند، چند ویجت نیز رفتارهای خاصی را پیادهسازی میکنند که میتوانند بهطور جداگانه به کلیدها مقید شوند. موارد زیر فهرستی از این ویجتها و انتسابهای پیشفرض آنها است.
- _bash_completions
- این تابع توسط دو ویجت _bash_complete-word و _bash_list-choices استفاده میشود. هدف از وجود آن، سازگاری با انتسابهای کاملسازی در bash است. آخرین نویسهٔ انتساب مشخص میکند چه چیزی کامل میشود: «!»، نامهای دستورات؛ «$»، متغیرهای محیطی؛ «@»، نامهای میزبان؛ «/»، نامهای فایل؛ «~»، نامهای کاربری. در bash، انتسابی که پیش از آن «\e» بیاید کاملسازی را انجام میدهد، و اگر پیش از آن «^X» بیاید گزینهها را فهرست میکند. از آنجا که برخی از این انتسابها با انتسابهای استاندارد zsh تداخل دارند، تنها «\e~» و «^X~» بهطور پیشفرض مقید شدهاند. برای افزودن بقیه، موارد زیر باید پس از اجرای compinit به .zshrc افزوده شوند:
for key in '!' '$' '@' '/' '~'; do bindkey "\e$key" _bash_complete-word bindkey "^X$key" _bash_list-choices done
این مورد شامل انتسابها برای «~» نیز میشود، در صورتی که پیشتر به چیز دیگری مقید شده باشند؛ کد کاملسازی انتسابهای کاربر را بازنویسی نمیکند.
- _correct_filename (^XC)
- مسیر نام فایل را در موقعیت فعلی مکاننما تصحیح میکند. تا شش خطا را در نام مجاز میداند. همچنین میتوان آن را با یک آرگومان برای تصحیح مسیر نام فایل، مستقل از zle فراخوانی کرد؛ تصحیح در خروجی استاندارد چاپ میشود.
- _correct_word (^Xc)
- تصحیح آرگومان فعلی را با استفاده از کاملسازیهای زمینهای معمول بهعنوان انتخابهای ممکن انجام میدهد. این کار رشتهٔ «correct-word» را در فیلد function از نام زمینه ذخیره کرده و سپس کاملساز _correct را فراخوانی میکند.
- _expand_alias (^Xa)
- این تابع میتواند بهعنوان یک کاملساز و همچنین بهعنوان یک دستور مقیدشدنی استفاده شود. اگر کلمهای که مکاننما روی آن قرار دارد یک نام مستعار (alias) باشد، آن را بسط میدهد. انواع نامهای مستعار بسطیافته را میتوان با سبکهای regular، global و disabled کنترل کرد.
هنگامی که بهعنوان یک دستور مقیدشدنی استفاده میشود، یک ویژگی اضافی وجود دارد که میتواند با تنظیم سبک complete روی «true» انتخاب شود. در این حالت، اگر کلمه نام یک alias نباشد، _expand_alias تلاش میکند بدون بسط دادن کلمه، آن را به یک نام کامل alias تکمیل کند. این تابع مکاننما را مستقیماً پس از کلمهٔ کاملشده قرار میدهد، بهطوری که فراخوانی دوبارهٔ _expand_alias، نام alias را که اکنون کامل شده است بسط خواهد داد.
- _expand_word (^Xe)
- بسط را روی کلمهٔ فعلی انجام میدهد: معادل دستور استاندارد expand-word، اما با استفاده از کاملساز _expand. پیش از فراخوانی آن، فیلد function از زمینه روی «expand-word» تنظیم میشود.
- _generic
- این تابع بهعنوان یک ویجت تعریف نشده و بهطور پیشفرض به کلیدی مقید نیست. با این حال، میتوان از آن برای تعریف یک ویجت استفاده کرد که در این صورت نام ویجت را در فیلد function از زمینه ذخیره کرده و سامانهٔ کاملسازی را فراخوانی میکند. این ویژگی تعریف آسان ویجتهای کاملسازی سفارشی را با مجموعهای از تنظیمات سبک مختص به خود امکانپذیر میسازد. برای مثال، برای تعریف ویجتی که کاملسازی عادی را انجام داده و گزینش منو را آغاز میکند:
zle -C foo complete-word _generic bindkey '...' foo zstyle ':completion:foo:*' menu yes select=1
بهطور ویژه توجه داشته باشید که سبک completer را میتوان برای زمینه تنظیم کرد تا مجموعه توابع مورد استفاده برای تولید تطابقهای ممکن تغییر کند. اگر _generic همراه با آرگومان فراخوانی شود، آن آرگومانها بهجای موارد تعریفشده توسط سبک completer، بهعنوان فهرست کاملسازها به _main_complete ارسال میشوند.
- _history_complete_word (\e/)
- کلمات را از تاریخچهٔ دستورات پوسته کامل میکند. این دستور از سبکهای list، remove-all-dups، sort و stop استفاده میکند.
- _most_recent_file (^Xm)
- نام تازهترین فایل ویرایششده را که با الگوی خط فرمان (که ممکن است خالی باشد) مطابقت دارد کامل میکند. در صورت دریافت آرگومان عددی N، نام Nاُمین فایل تازهویرایششده را کامل میکند. توجه داشته باشید که کاملسازی (در صورت وجود) همواره یکتا است.
- _next_tags (^Xn)
- این دستور مجموعهٔ تطابقهای مورد استفاده را به تطابقهای برچسب بعدی، یا مجموعهای از برچسبها (خواه آنطور که توسط سبک tag-order مشخص شده یا طبق پیشفرض تنظیم شده است) تغییر میدهد؛ در غیر این صورت این تطابقها در دسترس نمیبودند. فراخوانیهای متوالی این دستور، در میان تمام مجموعههای ممکن برچسبها گردش میکند.
- _read_comp (^X^R)
- رشتهای را از کاربر درخواست میکند و از آن برای انجام کاملسازی روی کلمهٔ فعلی استفاده میکند. دو حالت برای این رشته وجود دارد. نخست، میتواند مجموعهای از کلمات باشد که با «_» آغاز میشوند، برای مثال «_files -/»؛ در این حالت تابع به همراه هرگونه آرگومان برای تولید کاملسازیها فراخوانی خواهد شد. بخشهای غیرمبهم نام تابع بهطور خودکار کامل میشوند (کاملسازی عادی در این مرحله در دسترس نیست) تا زمانی که یک فاصله تایپ شود.
دوم، هر رشتهٔ دیگری بهعنوان مجموعهای از آرگومانها به compadd ارسال میشود و بنابراین باید عبارتی باشد که مشخص میکند چه چیزی باید کامل شود.
هنگام خواندن رشته، مجموعهٔ بسیار محدودی از دستورات ویرایشی در دسترس است: «DEL» و «^H» آخرین نویسه را حذف میکنند؛ «^U» خط را پاک میکند، و «^C» و «^G» تابع را لغو میکنند، در حالی که «RET» کاملسازی را میپذیرد. توجه داشته باشید که رشته عیناً بهصورت یک خط فرمان به کار میرود، بنابراین آرگومانها باید بر اساس قواعد استاندارد پوسته نقلقول شوند.
پس از خوانده شدن یک رشته، فراخوانی بعدی _read_comp بهجای خواندن یک رشتهٔ جدید، از همان رشتهٔ موجود استفاده خواهد کرد. برای اجبار به خواندن یک رشتهٔ جدید، _read_comp را با یک آرگومان عددی فراخوانی کنید.
- _complete_debug (^X?)
- این ویجت کاملسازی عادی را انجام میدهد، اما ردگیری (trace) دستورات پوستهای را که توسط سامانهٔ کاملسازی اجرا میشوند در یک فایل موقت ذخیره میکند. هر تلاش برای کاملسازی، فایل اختصاصی خود را دریافت میکند. دستوری برای مشاهدهٔ هر یک از این فایلها بر روی پشتهٔ بافر ویرایشگر قرار میگیرد.
- _complete_help (^Xh)
- این ویجت اطلاعاتی را دربارهٔ نامهای زمینه، برچسبها و توابع کاملسازی استفادهشده هنگام کاملسازی در موقعیت فعلی مکاننما نمایش میدهد. اگر یک آرگومان عددی غیر از 1 (مانند «ESC-2 ^Xh») به آن داده شود، سبکهای استفادهشده و زمینههایی که برای آنها به کار رفتهاند نیز نشان داده خواهند شد.
توجه داشته باشید که اطلاعات مربوط به سبکها ممکن است ناقص باشد؛ این امر به اطلاعات موجود از توابع کاملسازی فراخوانیشده بستگی دارد که آن هم بهنوبهٔ خود توسط سبکها و سایر تنظیمات خود کاربر تعیین میشود.
- _complete_help_generic
- برخلاف سایر دستورات فهرستشده در اینجا، این مورد باید بهجای یک ویجت کاملسازی، بهعنوان یک ویجت عادی ZLE ایجاد شود (یعنی با zle -N). این ویجت برای تولید راهنما همراه با ویجتی که به ویجت _generic توضیحدادهشده در بالا مقید است به کار میرود.
اگر این ویجت با استفاده از نام تابع ایجاد شود، همانطور که بهطور پیشفرض چنین است، هنگام اجرا یک توالی کلید را میخواند. انتظار میرود این توالی به فراخوانی یک تابع کاملسازی که از ویجت _generic استفاده میکند مقید شده باشد. آن ویجت اجرا خواهد شد و اطلاعات با همان قالبی که ویجت _complete_help برای کاملسازی زمینهای نمایش میدهد، ارائه خواهد شد.
اگر نام ویجت شامل debug باشد، برای مثال اگر بهصورت «zle -N _complete_debug_generic _complete_help_generic» ایجاد شده باشد، رشتهکلید یک ویجت عمومی را مانند قبل خوانده و اجرا میکند، اما سپس اطلاعات اشکالزدایی را همانگونه که توسط _complete_debug برای کاملسازی زمینهای انجام میشود تولید خواهد کرد.
اگر نام ویجت شامل noread باشد، رشتهکلیدی را نخواهد خواند، بلکه ترتیبی میدهد که استفادهٔ بعدی از یک ویجت عمومی اجراشده در همان پوسته، اثری همانند آنچه در بالا توضیح داده شد داشته باشد.
این ویجت با تنظیم پارامتر پوستهٔ ZSH_TRACE_GENERIC_WIDGET کار میکند که توسط _generic خوانده میشود. لغو تنظیم این پارامتر، هرگونه اثر معلق حالت noread را باطل میکند..PP برای نمونه، پس از اجرای موارد زیر:
zle -N _complete_debug_generic _complete_help_generic bindkey '^x:' _complete_debug_generic
فشردن «C-x :» و بهدنبال آن توالی کلیدهای مربوط به یک ابزارک (widget) عمومی، باعث میشود که خروجی ردیابی (trace output) آن ابزارک در یک فایل ذخیره شود.
- _complete_tag (^Xt)
- این ابزارک، برچسبهای نماد (symbol tags) ایجاد شده توسط برنامههای etags یا ctags (توجه داشته باشید که ارتباطی با برچسبهای سامانهٔ تکمیل ندارد) که در فایلی به نام TAGS (با قالب استفاده شده توسط etags) یا tags (با قالب ایجاد شده توسط ctags) ذخیره شدهاند را تکمیل میکند. این تابع سلسلهمراتب مسیر را رو به بالا برای یافتن اولین وقوع هر یک از این فایلها جستجو میکند؛ اگر هر دو موجود باشند، فایل TAGS ترجیح داده میشود. میتوانید مسیر کامل فایل TAGS یا tags را به ترتیب با تنظیم پارامترهای $TAGSFILE یا $tagsfile مشخص کنید. برچسبهای تکمیل متناظر استفاده شده، به ترتیب برگرفته از emacs و vi، برابر با etags و vtags هستند.
توابع کمکی (UTILITY FUNCTIONS)
در ادامه توضیحاتی برای توابع کمکی که ممکن است هنگام نوشتن توابع تکمیل مفید باشند آمده است. اگر توابع در زیردایرکتوریها نصب شده باشند، بیشتر آنها در زیردایرکتوری Base قرار دارند. همانند توابع نمونه برای دستورها در این توزیع، تمام توابع کمکی تولیدکنندهٔ تطابقها از این قرارداد پیروی میکنند که در صورت تولید موارد تکمیل وضعیت خروج صفر، و در صورتی که هیچ تکمیل منطبقی نتواند اضافه شود وضعیت غیر صفر را برمیگردانند.
- _absolute_command_paths
- این تابع دستورهای خارجی را بهصورت مسیرهای مطلق تکمیل میکند (برخلاف _command_names -e که نامهای پایهٔ آنها را تکمیل میکند). این تابع هیچ آرگومانی نمیپذیرد.
- _all_labels [ -x ] [ -12VJ ] tag name descr [ command arg ... ]
- این یک رابط کاربری مناسب برای تابع _next_label در زیر است که حلقهٔ نشان دادهشده در مثال _next_label را پیادهسازی میکند. دستور command و آرگومانهای آن برای تولید تطابقها فراخوانی میشوند. گزینههای ذخیرهشده در پارامتر name بهطور خودکار درون argهای ارسالشده به command درج خواهند شد. معمولاً آنها مستقیماً پس از command قرار میگیرند، اما اگر یکی از argها یک خط تیره منفرد باشد، دقیقاً پیش از آن درج میشوند. اگر خط تیره آخرین آرگومان باشد، پیش از فراخوانی command از فهرست آرگومانها حذف خواهد شد. این امر اجازه میدهد تا از _all_labels تقریباً در همهٔ مواردی که تطابقها را میتوان با یک فراخوانی دستور توکار compadd یا با فراخوانی یکی از توابع کمکی تولید کرد، استفاده شود.
برای نمونه:
local expl ... if _requested foo; then ... _all_labels foo expl '...' compadd ... - $matches fi
رشتههای درون پارامتر matches را با استفاده از compadd همراه با گزینههای اضافی که بر گزینههای تولیدشده توسط _all_labels تقدم دارند، تکمیل میکند.
- _alternative [ -O name ] [ -C name ] spec ...
- این تابع در موارد سادهای که چندین برچسب در دسترس هستند مفید است. این تابع اساساً حلقهای مشابه آنچه برای تابع _tags در زیر توضیح داده شده را پیادهسازی میکند.
برچسبهای مورد استفاده و کنشی که در صورت درخواست یک برچسب باید انجام شود، با استفاده از specهایی با قالب زیر توصیف میشوند: «tag:descr:action». برچسبهای tag با استفاده از _tags ارائه میشوند و در صورت درخواست برچسب، action با شرحِ دادهشده در descr اجرا میشود. کنشهای action همان مواردی هستند که توسط تابع _arguments (توضیح داده شده در زیر) پذیرفته میشوند، با استثنائات زیر:
- •
- قالبهای «->state» و «=...» پشتیبانی نمیشوند.
- •
- قالب «((a\:bar b\:baz))» نیازی به گریز دادن دونقطه ندارد، زیرا specها هیچ فیلد جداشده با دونقطهای پس از action ندارند.
برای نمونه، action میتواند یک فراخوانی سادهٔ تابع باشد:
_alternative \
'users:user:_users' \
'hosts:host:_hosts'
نامهای کاربری و نامهای میزبان را به عنوان تطابقهای ممکن ارائه میدهد که به ترتیب توسط توابع _users و _hosts تولید شدهاند.
همانند _arguments، این تابع از _all_labels برای اجرای کنشها استفاده میکند که روی تمام مجموعههای برچسب پیمایش میکند. مدیریت ویژه تنها زمانی مورد نیاز است که یک برچسب معتبر اضافی وجود داشته باشد، برای نمونه درون تابعی که از _alternative فراخوانی شده است.
گزینهٔ «-O name» به همان روشی استفاده میشود که در تابع _arguments به کار میرود. به عبارت دیگر، عناصر آرایهٔ name هنگام اجرای یک کنش به compadd ارسال خواهند شد.
همانند _tags، این تابع از گزینهٔ -C برای تعیین نام متفاوتی برای فیلد زمینهٔ آرگومان (argument context field) پشتیبانی میکند.
- _arguments [ -nswWCRS ] [ -A pat ] [ -O name ] [ -M matchspec ]
- [ : ] spec ...
- _arguments [ opt ... ] -- [ -l ] [ -i pats ] [ -s pair ]
- [ helpspec ...]
- این تابع میتواند برای ارائهٔ مشخصات کامل جهت تکمیل دستوری استفاده شود که آرگومانهای آن از قراردادهای استاندارد گزینه و آرگومان یونیکس پیروی میکنند.
نمای کلی گزینهها
گزینههای خود _arguments باید در کلمات جداگانه باشند، یعنی -s -w، نه -sw. بهدنبال گزینهها، specهایی میآیند که گزینهها و آرگومانهای دستور مورد تحلیل را توصیف میکنند. برای جلوگیری از ابهام، تمام گزینههای خود _arguments میتوانند با یک دونقطهٔ منفرد از فرمهای spec جدا شوند.
فرم «--» برای استنتاج فرمهای spec از خروجی راهنمای (help) دستور در حال تحلیل استفاده میشود و در ادامه با جزئیات شرح داده شده است. optها برای فرم «--» در غیر این صورت همان گزینههای فرم نخست هستند. توجه داشته باشید که «-s» پس از «--» معنایی متمایز از «-s» پیش از «--» دارد و هر دو میتوانند حضور داشته باشند.
گزینههای سوییچ -s، -S، -A، -w و -W بر نحوهٔ تجزیهٔ گزینههای خط فرمانِ مورد تحلیل توسط _arguments تأثیر میگذارند. این سوییچها برای دستورهایی با تجزیهٔ آرگومان استاندارد مفید هستند.
گزینههای _arguments دارای معانی زیر هستند:
- -n
- با این گزینه، _arguments پارامتر NORMARG را روی موقعیت نخستین آرگومان عادی در آرایهٔ $words قرار میدهد، یعنی موقعیت پس از پایان گزینهها. اگر به آن آرگومان نرسیده باشد، NORMARG روی -1 تنظیم میشود. در صورتی که گزینهٔ -n ارسال شود، فراخواننده باید «integer NORMARG» را اعلان کند؛ در غیر این صورت از پارامتر استفاده نمیشود.
- -s
- فعالسازی پشتهسازی گزینهها (option stacking) برای گزینههای تکحرفی، که به موجب آن چندین گزینهٔ تکحرفی میتوانند در یک کلمه ترکیب شوند. برای نمونه، دو گزینهٔ «-x» و «-y» میتوانند در یک کلمهٔ واحد «-xy» ترکیب شوند. بهطور پیشفرض، هر کلمه با یک نام گزینهٔ منفرد متناظر است («-xy» یک گزینهٔ منفرد با نام «xy» است). گزینههایی که با یک خط تیره یا علامت مثبت آغاز میشوند، واجد شرایط انباشتگی (stacking) هستند؛ کلماتی که با دو خط تیره آغاز میشوند واجد شرایط نیستند.
توجه داشته باشید که -s پس از -- معنای متفاوتی دارد که در بخش با عنوان `استخراج شکلهای spec از خروجی راهنما' مستند شده است.
- -w
- در ترکیب با -s، امکان انباشتگی گزینهها را حتی در صورتی که یک یا چند مورد از گزینهها آرگومان بپذیرند فراهم میکند. برای مثال، اگر -x یک آرگومان بپذیرد، بدون -s، مقدار `-xy' به عنوان یک گزینه واحد (پردازشنشده) در نظر گرفته میشود؛ با -s، مقدار -xy گزینهای با آرگومان `y' خواهد بود؛ با وجود هر دو گزینه -s و -w، مقدار -xy شامل گزینه -x و گزینه -y است که آرگومانهای مربوط به -x (و در صورت آرگومانپذیر بودن، مربوط به -y) همچنان باید در کلمات بعدی بیایند.
- -W
- این گزینه قابلیت -w را یک مرحله جلوتر میبرد: تکمیل گزینههای تکحرفی حتی پس از آرگومانی که در همان کلمه آمده است ممکن میشود. با این حال، تکمیل واقعی گزینهها در این نقطه به کنش (action) انجامشده بستگی دارد. برای کنترل بیشتر، از یک تابع کمکی مانند _guard به عنوان بخشی از کنش استفاده کنید.
- -C
- پارامتر curcontext را برای کنشی به فرم `->state' تغییر میدهد. این موضوع در ادامه با جزئیات بررسی شده است.
- -R
- هنگامی که قرار است یک $state در نحو `->string' پردازش شود، به جای صفر، وضعیت خروج ۳۰۰ را بازمیگرداند.
- -S
- پس از ظاهر شدن `--' در خط، گزینهها را تکمیل نمیکند، و `--' را نادیده میگیرد. برای مثال، با -S، در خط
foobar -x -- -y
عبارت `-x' یک گزینه محسوب میشود، `-y' یک آرگومان در نظر گرفته میشود، و `--' هیچکدام تلقی نمیشود.
- -A pat
- پس از نخستین آرگومان غیرگزینهای در خط، گزینهها را تکمیل نمیکند. pat الگویی است که با تمامی رشتههایی که نباید به عنوان آرگومان در نظر گرفته شوند مطابقت میکند. برای نمونه، جهت متوقف کردن تکمیل گزینهها توسط _arguments پس از نخستین آرگومان عادی، اما نادیده گرفتن تمام رشتههایی که با خط تیره آغاز میشوند حتی اگر توسط یکی از optspecها تعریف نشده باشند، فرم مورد استفاده `-A "-*"' است.
- -O name
- عناصر آرایه name را به عنوان آرگومان به توابعی که برای اجرای actionها فراخوانی میشوند ارسال میکند. این موضوع در ادامه با جزئیات بررسی شده است.
- -M matchspec
- از مشخصات تطابق matchspec برای تکمیل نامها و مقادیر گزینهها استفاده میکند. مشخصات تطابق پیشفرض امکان تکمیل بخشی از کلمه را پس از `_' و `-' فراهم میسازد، مانند تکمیل `-f-b' به `-foo-bar'. مقدار پیشفرض matchspec عبارت است از:
r:|[_-]=* r:|=*
- -0
- هنگام مقداردهی به مقادیر آرایه انجمنی `opt_args'، از گریز دادن دو نقطهها و خطهای مورب وارو با بکاسلش خودداری کرده و از NUL به جای دو نقطه برای اتصال مقادیر چندگانه استفاده میکند. این گزینه در ادامه با جزئیات بیشتر تحت عنوان specs: actions توضیح داده شده است.
specها: نمای کلی
هر یک از قالبهای زیر یک spec است که مجموعههای مجزایی از گزینهها یا آرگومانها را در خط فرمانِ در حال تجزیه توصیف میکند.
- n:message:action
- n::message:action
- این مورد آرگومان عادی nام را توصیف میکند. پیام message در بالای تطابقهای تولیدشده چاپ خواهد شد و action نشاندهنده چیزی است که میتواند در این موقعیت تکمیل شود (به پایین مراجعه کنید). اگر دو علامت دو نقطه قبل از message قرار گیرد، آرگومان اختیاری است. اگر message فقط شامل فضای خالی باشد، هیچ چیزی در بالای تطابقها چاپ نخواهد شد مگر اینکه خود کنش یک رشته توضیحی اضافه کند.
- :message:action
- ::message:action
- مشابه حالت قبل است، اما آرگومان بعدی را با هر شمارهای که باشد توصیف میکند. اگر همه آرگومانها به این شکل و با ترتیب صحیح مشخص شوند، نیازی به ذکر شمارهها نخواهد بود.
- *:message:action
- *::message:action
- *:::message:action
- این مورد چگونگی تکمیل آرگومانها (معمولاً آرگومانهای غیرگزینهای، آنهایی که با - یا + آغاز نمیشوند) را در زمانی که هیچیک از دو شکل اول ارائه نشده باشند، توصیف میکند. هر تعداد آرگومان را میتوان به این شیوه تکمیل کرد.
با وجود دو علامت دو نقطه قبل از message، آرایه ویژه words و پارامتر ویژه CURRENT هنگام اجرا یا ارزیابی action تغییر مییابند تا فقط به آرگومانهای عادی اشاره کنند. با وجود سه علامت دو نقطه قبل از message، آنها تغییر مییابند تا فقط به آرگومانهای عادی پوششدادهشده توسط این توصیف اشاره کنند.
- optspec
- optspec:...
- این مورد یک گزینه را توصیف میکند. علامت دو نقطه نشاندهنده پردازش یک یا چند آرگومان برای گزینه است؛ اگر وجود نداشته باشد، فرض میشود که گزینه هیچ آرگومانی نمیپذیرد.
قالبهای زیر برای optspec اولیه در دسترس هستند، صرفنظر از اینکه گزینه دارای آرگومان باشد یا خیر.
- *optspec
- در اینجا optspec یکی از قالبهای باقیمانده در زیر است. این مورد نشان میدهد که optspec بعدی ممکن است تکرار شود. در غیر این صورت، اگر گزینه مربوطه از قبل در سمت چپ مکاننما در خط فرمان وجود داشته باشد، دوباره پیشنهاد نخواهد شد.
- -optname
- +optname
- در سادهترین حالت، optspec تنها نام گزینه است که با علامت منفی یا مثبت آغاز میشود، مانند `-foo'. نخستین آرگومان برای گزینه (در صورت وجود) باید به عنوان کلمهای جداگانه مستقیماً پس از گزینه قرار گیرد.
هر یک از عبارات `-+optname' و `+-optname' را میتوان برای تعیین اینکه هر دوی -optname و +optname معتبر هستند به کار برد.
در تمامی قالبهای باقیمانده، علامت `-' ابتدایی میتواند با `+' جایگزین شده یا به همین صورت با آن جفت شود.
- -optname-
- نخستین آرگومان گزینه باید مستقیماً پس از نام گزینه و در همان کلمه بیاید. برای نمونه، `-foo-:...' مشخص میکند که گزینه و آرگومان تکمیلشده شبیه `-fooarg' خواهند بود.
- -optname+
- نخستین آرگومان میتواند بلافاصله پس از optname در همان کلمه ظاهر شود، یا به عنوان کلمهای جداگانه بعد از گزینه بیاید. برای نمونه، `-foo+:...' مشخص میکند که گزینه و آرگومان تکمیلشده به یکی از صورتهای `-fooarg' یا `-foo arg' خواهند بود.
- -optname=
- آرگومان میتواند به عنوان کلمه بعدی ظاهر شود، یا در همان کلمه نام گزینه قرار گیرد به شرطی که با یک علامت مساوی از آن جدا شده باشد، برای نمونه `-foo=arg' یا `-foo arg'..TP -optname=- آرگومان مربوط به این گزینه باید پس از یک علامت مساوی در همان کلمه بیاید، و نمیتواند در آرگومان بعدی داده شود.
- optspec[explanation]
- یک رشته توضیح میتواند با قرار گرفتن در قلابها (کروشهها) به هر یک از صورتهای قبلی optspec اضافه شود، مانند `-q[query operation]'.
سبک verbose برای تصمیمگیری درباره اینکه آیا رشتههای توضیح به همراه گزینه در فهرست کاملسازی نمایش داده شوند یا خیر به کار میرود.
اگر هیچ رشته توضیحی در داخل قلاب داده نشده باشد اما سبک auto-description تنظیم شده باشد و تنها یک آرگومان برای این optspec شرح داده شده باشد، مقدار این سبک نمایش داده میشود، به طوری که هر بار مشاهده توالی `%d' در آن با message اولین optarg که پس از optspec میآید جایگزین میگردد؛ پایینتر را ببینید.
امکان وجود گزینههایی با نویسه لفظی `+' یا `=' وجود دارد، اما آن نویسه باید نقلقول (اسکیپ) شود، برای نمونه `-\+'.
هر optarg که پس از یک optspec میآید باید یکی از صورتهای زیر را داشته باشد:
- :message:action
- ::message:action
- یک آرگومان برای گزینه؛ با message و action مانند آرگومانهای معمولی رفتار میشود. در صورت نخست، آرگومان اجباری است، و در صورت دوم اختیاری است.
این گروه ممکن است برای گزینههایی که چندین آرگومان میپذیرند تکرار شود. به بیان دیگر، :message1:action1:message2:action2 مشخص میکند که گزینه دو آرگومان میگیرد.
- :*pattern:message:action
- :*pattern::message:action
- :*pattern:::message:action
- این مورد چندین آرگومان را توصیف میکند. تنها آخرین optarg برای گزینهای که چندین آرگومان میپذیرد میتواند در این صورت داده شود. اگر pattern خالی باشد (یعنی :*:)، تمام کلمههای باقیمانده در خط باید به گونهای که توسط action شرح داده شده کامل شوند؛ در غیر این صورت، تمام کلمهها تا و شامل کلمهای که با pattern تطابق دارد باید با استفاده از action کاملسازی شوند.
با دونقطههای چندگانه مانند حالتهای `*:...' برای آرگومانهای معمولی رفتار میشود: هنگامی که قبل از message دو دونقطه آمده باشد، آرایه ویژه words و پارامتر ویژه CURRENT در طول اجرا یا ارزیابی action تغییر مییابند تا تنها به کلمههای پس از گزینه ارجاع دهند. هنگامی که سه دونقطه قبل از آن باشد، آنها تغییر مییابند تا تنها به کلمههای تحت پوشش این توصیف اشاره نمایند.
هر دونقطه لفظی در یک optname، message یا action باید با یک بکاسلش پیشوند شود، `\:'.
هر یک از صورتهای بالا میتواند با فهرستی در پرانتز شامل نامهای گزینه و شمارههای آرگومان آغاز شود. اگر گزینه دادهشده در خط فرمان باشد، گزینهها و آرگومانهای مشخصشده در پرانتز پیشنهاد نخواهند شد. برای نمونه، `(-two -three 1)-one:...' گزینه `-one' را کامل میکند؛ اگر این در خط فرمان ظاهر شود، گزینههای -two و -three و اولین آرگومان معمولی پس از آن کاملسازی نخواهند شد. `(-foo):...' کاملسازی یک آرگومان معمولی را مشخص میکند؛ اگر آن آرگومان از پیش وجود داشته باشد، -foo کامل نخواهد شد.
موارد دیگر ممکن است در فهرست گزینههای مستثنیشده ظاهر شوند تا موارد مختلف دیگری را نشان دهند که هنگام مطابقت با مشخصه کنونی نباید اعمال شوند: یک ستاره تنها (*) برای آرگومانهای باقیمانده (یعنی مشخصهای به صورت `*:...')؛ یک دونقطه (:) برای تمام آرگومانهای عادی (غیر گزینه)؛ و یک خط تیره (-) برای تمام گزینهها. برای نمونه، اگر `(*)' قبل از یک گزینه بیاید و آن گزینه در خط فرمان ظاهر شود، فهرست آرگومانهای باقیمانده (آنهایی که در جدول بالا نشان داده شده و با `*:' شروع میشوند) کاملسازی نخواهند شد.
برای کمک به استفاده مجدد از مشخصهها، میتوان قبل از هر یک از صورتهای بالا یک `!' قرار داد؛ آنگاه آن صورت دیگر کامل نخواهد شد، هرچند اگر گزینه یا آرگومان در خط فرمان ظاهر شود، طبق معمول نادیده گرفته میشوند. کاربرد اصلی این ویژگی زمانی است که آرگومانها توسط یک آرایه داده شوند و _arguments مکرراً برای زمینههای خاصتر فراخوانی شود: در اولین فراخوانی `_arguments $global_options' به کار میرود، و در فراخوانیهای بعدی `_arguments !$^global_options'.
specها: actionها
در هر یک از صورتهای بالا، action تعیین میکند که کاملسازیها چگونه باید تولید شوند. به جز صورت `->string' در زیر، action با فراخوانی تابع _all_labels برای پردازش تمام برچسبهای tag اجرا خواهد شد. هیچ رسیدگی خاصی به برچسبها نیاز نیست مگر اینکه یک فراخوانی تابع، برچسب جدیدی معرفی کند.
توابعی که برای اجرای actionها فراخوانی میشوند، با عنصرهای آرایهای که توسط گزینه `-O name' نامگذاری شده است به عنوان آرگومان فراخوانی خواهند شد. برای نمونه این میتواند برای ارسال همان مجموعه گزینهها برای دستور توکار compadd به تمام actionها استفاده شود.
صورتهای action به شرح زیر هستند.
- (یک فاصله تکی بدون نقلقول)
- این در مواردی مفید است که یک آرگومان مورد نیاز است اما تولید تطابقها برای آن ممکن یا مطلوب نیست. message نمایش داده خواهد شد اما هیچ کاملسازیای فهرست نمیشود. توجه داشته باشید که حتی در این مورد نیز دونقطه در پایان message مورد نیاز است؛ این دونقطه تنها زمانی میتواند حذف شود که نه message و نه action داده نشده باشد.
- (item1 item2 ...)
- یکی از موارد از فهرستی از تطابقهای ممکن، برای نمونه:
:foo:(foo bar baz)
- ((item1\:desc1 ...))
- مشابه مورد بالا، اما با توضیحات برای هر تطابق ممکن. به بکاسلش قبل از دونقطه توجه کنید. برای نمونه،
:foo:((a\:bar b\:baz))
اگر سبک description همراه با تگ values در زمینه تنظیم شده باشد، تطابقها همراه با توضیحاتشان فهرست خواهند شد.
- ->string
- در این صورت، _arguments آرگومانها و گزینهها را پردازش کرده و سپس کنترل را با پارامترهایی تنظیمشده که وضعیت پردازش را نشان میدهند، به تابع فراخوان بازمیگرداند؛ سپس تابع فراخوان تمهیدات لازم خود را برای تولید کاملسازیها به کار میبندد. برای نمونه، توابعی که یک ماشین وضعیت را پیادهسازی میکنند میتوانند از این نوع کنش استفاده کنند.
جایی که _arguments با action در قالب `->string' مواجه میشود، تمام فاصلههای خالی ابتدا و انتهای string را حذف کرده و آرایه state را برابر با مجموعهای از تمام stringهایی که باید برای آنها یک کنش انجام شود تنظیم میکند. به عنصرهای آرایه state_descr فیلد message متناظر از هر optarg دارای چنین actionی اختصاص مییابد.
بهطور پیشفرض و همگام با تمام دیگر توابع خوشرفتار کاملسازی، _arguments در صورتی که قادر به افزودن تطابقها باشد وضعیت صفر و در غیر این صورت مقداری غیرصفر را بازمیگرداند. با این حال، اگر گزینه -R داده شده باشد، _arguments در عوض وضعیت 300 را بازمیگرداند تا نشان دهد که $state باید مدیریت شود.
علاوه بر $state و $state_descr، دستور _arguments همچنین پارامترهای سراسری `context'، `line' و `opt_args' را همانطور که در زیر شرح داده شده است مقداردهی میکند، و هیچیک از تغییرات اعمالشده بر پارامترهای ویژه مانند PREFIX و words را بازنشانی نمیکند. این امر به تابع فراخوان حق انتخاب میدهد که این پارامترها را بازنشانی کند یا تغییرات آنها را انتشار دهد..PP بنابراین تابعی که _arguments را با حداقل یک کنش (action) حاوی `->string' فراخوانی میکند، باید متغیرهای محلی مناسب را اعلان نماید:
local context state state_descr line typeset -A opt_args
تا از تغییر محیط سراسری (global environment) توسط _arguments جلوگیری به عمل آید.
- {eval-string}
- رشتهای در میان آکولاد به عنوان کد شل ارزیابی میشود تا موارد منطبق را تولید کند. این شبیه به کنش ` word ...' است که در زیر شرح داده شده، اما محدود به یک دستور منفرد نیست.
- = action
- اگر action با `= ' (یک علامت مساوی به همراه یک فاصله) آغاز شود، _arguments محتوای فیلد argument از بافت فعلی را به عنوان نخستین عنصر جدید در آرایه ویژه words درج کرده و مقدار پارامتر ویژه CURRENT را افزایش میدهد. این کار اثر درج یک کلمه صوری (dummy word) در خط دستور کاملسازی را بدون تغییر دادن نقطهای که کاملسازی در آن رخ میدهد، به همراه دارد.
این قابلیت بیشترین کاربرد را در کنار مشخصکنندههایی دارد که کلمات خط دستور را که قرار است action روی آنها عمل کند محدود میسازند (حالتهای دو دونقطه و سه دونقطه در بالا). یک کاربرد ویژه زمانی است که خودِ یک action موجب فراخوانی _arguments روی یک محدوده محدودشده شود؛ استفاده از این ترفند برای درج یک نام دستور مناسب در محدوده الزامی است تا فراخوانی دوم به _arguments بتواند خط را تجزیه کند.
- word ...
- word ...
- این حالت تمام فرمهای دیگر به جز موارد فوق را پوشش میدهد. اگر action با یک فاصله آغاز شود، فهرست باقیمانده کلمات بدون تغییر فراخوانی خواهند شد.
در غیر این صورت، با چند رشته اضافی که پس از کلمه اول قرار میگیرند فراخوانی میشود؛ این رشتهها باید به عنوان گزینههایی به دستور توکار compadd ارسال شوند. آنها اطمینان حاصل میکنند وضعیتی که توسط _arguments تعیین شده، به ویژه توضیحات گزینهها و آرگومانها، به درستی به دستور کاملسازی منتقل گردد. این آرگومانهای اضافی از پارامتر آرایهای `expl' گرفته میشوند؛ این پارامتر پیش از اجرای action تنظیم خواهد شد و از این رو میتوان در داخل آن بدان ارجاع داد، معمولاً در بسطی به فرم `$expl[@]' که عناصر خالی آرایه را حفظ میکند.
در حین اجرای کنش، آرایه `line' با آرگومانهای عادی خط دستور مقداردهی میشود، یعنی کلمات خط دستور پس از نام دستور به استثنای تمام گزینهها و آرگومانهای آنها. گزینهها در آرایه انجمنی `opt_args' با نام گزینهها به عنوان کلید و آرگومانهای آنها به عنوان مقدار ذخیره میشوند. به طور پیشفرض، تمام دونقطهها و بکاسلشها در مقدار، با بکاسلش گریز داده میشوند (escaped)، و اگر یک گزینه دارای چند آرگومان باشد (برای نمونه، هنگام استفاده از یک optspec به فرم `*optspec')، آنها با دونقطه (بدون گریز) به هم متصل میشوند. با این حال، اگر گزینه -0 داده شده باشد، هیچ گریزی با بکاسلش انجام نمیگیرد و مقادیر چندگانه با بایتهای NUL به هم وصل میشوند. برای نمونه، پس از `zsh -o foo:foo -o bar:bar -o <TAB>'، محتوای `opt_args'
typeset -A opt_args=( [-o]='foo\:foo:bar\:bar:' )
به طور پیشفرض، و
typeset -A opt_args=( [-o]=$'foo:foo\x00bar:bar\x00' )
در صورتی خواهد بود که _arguments با گزینه -0 فراخوانی شده باشد.
پارامتر `context' هنگام بازگشت به تابع فراخواننده برای انجام کنشی به فرم `->string' تنظیم میشود. این پارامتر با آرایهای از عناصر متناظر با عناصر $state مقداردهی میگردد. هر عنصر، نامی مناسب برای فیلد آرگومان در بافت (context) است: یا رشتهای به فرم `option-opt-n' برای nاُمین آرگومان از گزینه -opt، یا رشتهای به فرم `argument-n' برای nاُمین آرگومان. برای آرگومانهای باقیمانده («rest»)، یعنی آنهایی که در انتهای فهرست هستند و بر اساس موقعیت پردازش نمیشوند، n رشته `rest' خواهد بود. برای نمونه، هنگام کاملسازی آرگومان گزینه -o، این نام `option-o-1' است، در حالی که برای دومین آرگومان عادی (غیر از گزینه) `argument-2' خواهد بود.
علاوه بر این، در طول ارزیابی action، نام بافت در پارامتر curcontext تغییر مییابد تا همان رشتهای که در پارامتر context ذخیره شده است به انتهای آن افزوده شود.
گزینه -C به _arguments اعلام میکند که پارامتر curcontext را برای کنشی به فرم `->state' تغییر دهد. این، پارامتر استانداردی است که برای پیگیری بافت فعلی به کار میرود. در اینجا این متغیر (و نه آرایه context) باید برای تابع فراخواننده محلی (local) شود تا از پس دادن مقدار تغییریافته جلوگیری شود، و در آغاز تابع باید با مقدار فعلی مقداردهی اولیه گردد:
local curcontext="$curcontext"
این مورد در جایی مفید است که امکان معتبر بودن همزمان چندین وضعیت با یکدیگر وجود ندارد.
گروهبندی گزینهها (Grouping Options)
گزینهها را میتوان برای سادهسازی فهرستهای استثنا گروهبندی کرد. یک گروه با `+' و به دنبال آن نام گروه در کلمه بعدی معرفی میشود. سپس میتوان در یک فهرست استثنا به کل گروهها ارجاع داد، یا از یک نام گروه برای ابهامزدایی میان دو فرم از یک گزینه مشابه استفاده کرد. برای نمونه:
_arguments \
'(group2--x)-a' \
+ group1 \
-m \
'(group2)-n' \
+ group2 \
-x -y
اگر نام یک گروه به فرم `(name)' تعیین شود، در این صورت تنها یک مقدار از آن گروه در هر زمان کاملسازی خواهد شد؛ به بیان دقیقتر، تمام مشخصهها نسبت به سایر مشخصههای موجود در آن گروه مانعةالجمع (mutually exclusive) هستند. این برای تعریف گزینههایی که نام مستعار (alias) یکدیگرند مفید است. برای نمونه:
_arguments \
-a -b \
+ '(operation)' \
{-c,--compress}'[compress]' \
{-d,--decompress}'[decompress]' \
{-l,--list}'[list]'
اگر گزینهای در یک گروه روی خط دستور ظاهر شود، در آرایه انجمنی `opt_args' با کلید 'group-option' ذخیره میگردد. در مثال بالا، در صورتی که گزینه `-c' روی خط دستور حضور داشته باشد، کلید `operation--c' استفاده میشود.
تعیین مجموعههای چندگانه آرگومانها (Specifying Multiple Sets of Arguments)
تعیین چندین مجموعه از گزینهها و آرگومانها در حالی که مجموعهها با خطتیرههای تکی از یکدیگر جدا شدهاند امکانپذیر است. تفاوت این حالت با گروهها در این است که مجموعهها نسبت به یکدیگر مانعةالجمع در نظر گرفته میشوند.
مشخصههای پیش از اولین مجموعه و مشخصههای برگرفته از هر گروه، برای تمام مجموعهها مشترک هستند. برای نمونه:
_arguments \
-a \
- set1 \
-c \
- set2 \
-d \
':arg:(x2 y2)'
این، دو
مجموعه را
تعریف
میکند.
هنگامی که
خط فرمان
شامل
گزینهٔ `-c'
باشد،
گزینهٔ `-d' و
آرگومان به
عنوان
تکمیلهای
احتمالی در
نظر گرفته
نخواهند شد.
هنگامی که
شامل `-d' یا یک
آرگومان
باشد،
گزینهٔ `-c' در
نظر گرفته
نخواهد شد.
با این حال،
پس از `-a' هر
دو مجموعه
همچنان
معتبر تلقی
خواهند شد.
همانند گروهها، نام یک مجموعه میتواند در فهرستهای استثنا (exclusion lists) ظاهر شود؛ چه به تنهایی یا پیش از مشخصهٔ یک گزینه یا آرگومان عادی.
کد تکمیل باید خط فرمان را برای هر مجموعه به طور جداگانه تجزیه کند. این کار میتواند کند باشد، بنابراین مجموعهها تنها باید در صورت لزوم استفاده شوند. یک جایگزین مفید اغلب مشخصهٔ گزینهای به همراه rest-arguments است (مانند `-foo:*:...')؛ در اینجا گزینهٔ -foo تمام آرگومانهای باقیمانده را طبق تعاریف optarg میبلعد.
استخراج فرمهای spec از خروجی راهنما
گزینهٔ `--' به _arguments امکان میدهد تا نام گزینههای طولانی را که از گزینهٔ `--help' (که در بسیاری از دستورهای GNU استاندارد است) پشتیبانی میکنند، استخراج کند. کلمهٔ دستور با آرگومان `--help' فراخوانی شده و خروجی آن برای نام گزینهها بررسی میشود. مشخصاً، ارسال این مورد به دستورهایی که ممکن است از این گزینه پشتیبانی نکنند میتواند خطرناک باشد چرا که رفتار دستور نامشخص است.
علاوه بر گزینهها، `_arguments --' تلاش خواهد کرد تا در صورت معتبر بودن فرم `--opt=val'، انواع آرگومانهای در دسترس برای گزینهها را استنتاج کند. همچنین میتوان با بررسی متن راهنمای دستور و افزودن helpspec به فرم `pattern:message:action' نکاتی راهنما ارائه کرد؛ توجه داشته باشید که سایر فرمهای spec در _arguments استفاده نمیشوند. الگوی pattern با متن راهنمای یک گزینه تطبیق داده میشود، و در صورت تطابق، message و action مانند سایر مشخصکنندههای آرگومان استفاده میشوند. حالت خاص `*:' به این معناست که هر دو message و action خالی هستند، که این امر باعث میشود گزینههای فاقد شرح در خروجی راهنما، در فهرستها جلوتر از گزینههای دارای شرح مرتب شوند.
برای مثال:
_arguments -- '*\*:toggle:(yes no)' \
'*=FILE*:file:_files' \
'*=DIR*:directory:_files -/' \
'*=PATH*:directory:_files -/'
در اینجا، `yes' و `no' به عنوان آرگومانِ گزینههایی که شرح آنها به علامت ستاره ختم میشود تکمیل خواهند شد؛ نامهای فایل برای گزینههایی که شامل زیررشتهٔ `=FILE' در شرح خود هستند تکمیل میشوند؛ و دایرکتوریها برای گزینههایی که شرح آنها حاوی `=DIR' یا `=PATH' است تکمیل خواهند شد. سه مورد آخر در واقع پیشفرض هستند و بنابراین نیازی به ذکر صریح آنها نیست، هرچند امکان لغو و بازنویسی کاربرد این الگوها وجود دارد. متن راهنمای نمونهای که از این قابلیت استفاده میکند عبارت است از:
-C, --directory=DIR change to directory DIR
به طوری که مشخصات فوق باعث میشود دایرکتوریها پس از `--directory' تکمیل شوند، هرچند پس از `-C' تکمیل نخواهند شد.
همچنین توجه داشته باشید که _arguments سعی میکند به طور خودکار اختیاری بودن آرگومان یک گزینه را تشخیص دهد. این مورد را میتوان با دو برابر کردن دونقطه قبل از message به طور صریح مشخص کرد.
اگر pattern به `(-)' ختم شود، این بخش از الگو حذف شده و action تنها بلافاصله پس از `=' اعمال میشود، نه در کلمهٔ بعدی. این همان رفتار یک مشخصهٔ عادی تعریفشده با فرم `=-' است.
بهطور پیشفرض، دستور (همراه با گزینهٔ `--help') پس از بازنشانی تمامی دستهبندیهای لوکال (بهجز LC_CTYPE) به `C' اجرا میشود. اگر مشخص باشد که خروجی راهنمای محلیشده به درستی عمل میکند، میتوان گزینهٔ `-l' را پس از `_arguments --' مشخص کرد تا دستور در لوکال فعلی اجرا شود.
عبارت `_arguments --' میتواند با گزینهٔ `-i patterns' دنبال شود تا الگوهایی را برای گزینههایی که نباید تکمیل شوند ارائه دهد. الگوها را میتوان به عنوان نام یک پارامتر آرایهای یا به صورت یک فهرست لفظی در پرانتز مشخص کرد. برای مثال،
_arguments -- -i \
"(--(en|dis)able-FEATURE*)"
باعث خواهد شد که تکمیل از گزینههای `--enable-FEATURE' و `--disable-FEATURE' صرفنظر کند (این مثال با configure گنو مفید است).
فرم `_arguments --' همچنین میتواند با گزینهٔ `-s pair' برای توصیف نامهای مستعار گزینه دنبال شود. مقدار pair از فهرستی از الگوهای متناوب و جایگزینهای متناظر تشکیل شده است که درون پرانتز قرار گرفته و نقلقول شدهاند به طوری که یک کلمه-آرگومان منفرد را در فراخوانی _arguments تشکیل دهند.
برای مثال، خروجی راهنمای برخی اسکریپتهای configure گزینهها را فقط به صورت `--enable-foo' توصیف میکند، اما اسکریپت شکل منفی `--disable-foo' را نیز میپذیرد. برای مجاز ساختن تکمیل شکل دوم:
_arguments -- -s "((#s)--enable- --disable-)"
نکات متفرقه
در نهایت، توجه داشته باشید که _arguments عموماً انتظار دارد تابع اصلیِ مدیریتکنندهٔ هر تکمیلی باشد که برای آن استفاده شده است. ممکن است اثرات جانبی داشته باشد که نحوهٔ برخورد با هرگونه تطابق اضافهشده توسط سایر توابعی را که پس از آن فراخوانی میشوند تغییر دهد. برای ترکیب _arguments با سایر توابع، آن توابع باید یا قبل از _arguments فراخوانی شوند، یا به عنوان یک action درون یک spec، و یا در گردانندههای مربوط به کنشهای `->state'.
در اینجا یک مثال عمومیتر از استفاده از _arguments آورده شده است:
_arguments '-l+:left border:' \
'-format:paper size:(letter A4)' \
'*-copy:output file:_files::resolution:(300 600)' \
':postscript file:_files -g \*.\(ps\|eps\)' \
'*:page number:'
این، سه گزینه را توصیف میکند: `-l'، `-format' و `-copy'. گزینهٔ نخست یک آرگومان میگیرد که با عنوان `left border' توصیف شده است و به دلیل خالی بودن کنش، هیچ تکمیلی برای آن ارائه نخواهد شد. آرگومان آن ممکن است مستقیماً پس از `-l' بیاید یا به عنوان کلمهٔ بعدی در خط فرمان داده شود.
گزینهٔ `-format' یک آرگومان در کلمهٔ بعدی میگیرد که با عنوان `paper size' توصیف شده است و فقط رشتههای `letter' و `A4' برای آن تکمیل خواهند شد.
گزینهٔ `-copy' ممکن است بیش از یک بار در خط فرمان ظاهر شود و دو آرگومان میگیرد. اولی اجباری است و به عنوان یک نام فایل تکمیل خواهد شد. دومی اختیاری است (به دلیل وجود دونقطهٔ دوم قبل از شرح `resolution') و از میان رشتههای `300' و `600' تکمیل خواهد شد.
دو شرح پایانی مشخص میکنند چه مواردی باید به عنوان آرگومانها تکمیل شوند. اولی آرگومان نخست را به عنوان یک `postscript file' شرح میدهد و باعث میشود فایلهایی که به `ps' یا `eps' ختم میشوند تکمیل شوند. شرح آخر به تمامی آرگومانهای دیگر شرح `page number' را اختصاص میدهد اما تکمیلی ارائه نمیکند.
- _as_if command [arg ... ]
- این تابع زمانی مفید است که یک دستور باید طوری تکمیل شود که گویی دستور دیگری با آرگومانهای خاصی است. برای مثال، برای تکمیل foo طوری که گویی bar --baz است، از دستور زیر استفاده کنید:
compdef '_as_if bar --baz' foo
- _cache_invalid cache_identifier
- این تابع در صورتی که حافظهٔ پنهان تکمیلهای متناظر با شناسهٔ کش دادهشده نیاز به بازسازی داشته باشد، وضعیت صفر را برمیگرداند. این وضعیت با جستجوی سبک cache-policy برای زمینهٔ فعلی تعیین میشود. این سبک باید نام تابعی را مشخص کند که با مسیر کامل فایل کش مربوطه به عنوان تنها آرگومان اجرا شود.
مثال:
_example_caching_policy () {
# rebuild if cache is more than a week old
local -a oldp
oldp=( "$1"(Nm+7) )
(( $#oldp )) }
- _call_function return name [ arg ... ]
- اگر تابع name وجود داشته باشد، با آرگومانهای arg فراخوانی میشود. آرگومان return نام پارامتری را مشخص میکند که وضعیت بازگشتی تابع name باید در آن ذخیره شود؛ چنانچه return خالی بوده یا تنها یک خط تیره باشد، نادیده گرفته میشود.
وضعیت بازگشتی خودِ _call_function در صورتی که تابع name وجود داشته و فراخوانی شده باشد صفر، و در غیر این صورت غیرصفر است.
- _call_program [ -l ] [ -p ] tag string ...
- این تابع سازوکاری را برای کاربر فراهم میکند تا استفاده از یک دستور خارجی را بازنویسی کند. این تابع سبک command را با برچسب (tag) ارائهشده جستجو میکند. اگر این سبک تنظیم شده باشد، مقدار آن بهعنوان دستور برای اجرا به کار میرود. رشتههای string حاصل از فراخوانی _call_program، یا حاصل از سبک در صورت تنظیم بودن، با فاصلهای در میانشان به یکدیگر متصل میشوند و رشتهٔ حاصل ارزیابی میگردد. وضعیت بازگشتی، همان وضعیت بازگشتی دستور فراخوانیشده است.
بهطور پیشفرض، دستور در محیطی اجرا میشود که در آن تمام دستهبندیهای محلیسازی (بهجز LC_CTYPE) با فراخوانی تابع کمکی _comp_locale (پایین را ببینید) به `C' بازنشانی میشوند. اگر گزینهٔ `-l' داده شود، دستور با محلیسازی فعلی اجرا میشود.
اگر گزینهٔ `-p' ارائه شود، نشان میدهد که خروجی دستور تحت تأثیر مجوزهایی است که با آنها اجرا میشود. اگر سبک gain-privileges روی true تنظیم شده باشد، _call_program در صورت وجود دستورهایی مانند sudo در خط فرمان، از آنها برای مطابقت دادن مجوزها با آنچه دستور نهایی احتمالاً تحت آن اجرا میشود، استفاده خواهد کرد. هنگام جستجوی سبکهای gain-privileges و command، مؤلفهٔ دستورِ بافتار zstyle با یک ممیز (`/') و بهدنبال آن دستوری که برای ارتقای مجوزها استفاده میشود، پایان مییابد.
- _combination [ -s pattern ] tag style spec ... field opts ...
- این تابع برای کاملکردن ترکیبهایی از مقادیر استفاده میشود؛ برای نمونه جفتهای نام میزبان و نام کاربری. آرگومان style سبکی را مشخص میکند که جفتها را تعریف مینماید؛ این سبک در یک بافتار با برچسب مشخصشدهٔ tag جستجو میشود.
نام سبک شامل نامهای فیلد است که با خط پیوند از یکدیگر جدا شدهاند، مانند `users-hosts-ports'. برای هر فیلدی که مقدار آن از پیش دانسته شده است، یک spec به شکل `field=pattern' داده میشود. برای نمونه، اگر خط فرمان تا اینجا کاربری به نام `pws' را مشخص کرده باشد، باید آرگومان `users=pws' ظاهر شود.
آرگومان بعدی فاقد علامت مساوی، بهعنوان نام فیلدی در نظر گرفته میشود که کاملسازیها باید برای آن تولید شوند (احتمالاً فیلدی نیست که مقدارش از پیش مشخص باشد).
تطابقهای تولیدشده از مقدار سبک برگرفته میشوند. این مقادیر باید شامل مقادیر ممکن برای ترکیبها با ترتیب مناسب باشند (در مثال بالا: کاربران، میزبانها، درگاهها). مقادیر فیلدهای گوناگون با دونقطه (:) از یکدیگر جدا میشوند. این ساختار را میتوان با گزینهٔ -s در _combination که یک الگو را مشخص میکند، تغییر داد. این الگو معمولاً یک ردهٔ نویسه است؛ مانند `-s "[:@]"' در مورد سبک users-hosts. هر مشخصهٔ `field=pattern' کاملسازیها را به عناصری از سبک محدود میکند که فیلدهای همخوانِ مناسبی دارند.
اگر هیچ سبکی با نام دادهشده برای برچسب مشخص تعریف نشده باشد، یا اگر هیچیک از رشتههای موجود در مقدار سبک مطابقت نداشته باشند، اما نام تابعی برای فیلد مورد نظر که پیش از آن یک زیرخط آمده باشد تعریف شده باشد، آن تابع برای تولید تطابقها فراخوانی خواهد شد. برای مثال، اگر سبک `users-hosts-ports' تعریف نشده باشد یا هنگام نیاز به میزبان هیچ نام میزبان همخوانی وجود نداشته باشد، تابع `_hosts' بهطور خودکار فراخوانی خواهد شد.
اگر نام یکسانی برای بیش از یک فیلد به کار رود، چه در `field=pattern' و چه در آرگومانی که نام فیلد جهت کاملسازی را مشخص میکند، شمارهٔ فیلد (شروع از یک) میتواند پس از نام فیلد و با جدا شدن توسط دونقطه آورده شود.
تمام آرگومانهای پس از نام فیلدِ مورد نظر، هنگام تولید تطابقها از مقدار سبک به compadd، یا در صورت فراخوانی توابع مربوط به فیلدها به آن توابع، ارسال میشوند.
- _command_names [ -e | - ]
- این تابع کلماتی را که در جایگاه دستور معتبر هستند کامل میکند: نامهای مستعار (aliases)، دستورهای توکار (builtins)، دستورهای جدول هش (hashed commands)، توابع و موارد دیگر. با پرچم -e، فقط دستورهای جدول هش کامل میشوند. پرچم - نادیده گرفته میشود.
- _comp_locale
- این تابع تمام دستهبندیهای محلیسازی به جز LC_CTYPE را به `C' بازنشانی میکند تا خروجی دستورهای خارجی بهآسانی توسط سامانهٔ کاملسازی تحلیلپذیر باشد. LC_CTYPE مقدار فعلی خود را (با در نظر گرفتن LC_ALL و LANG) حفظ میکند و تضمین مینماید که نویسههای غیر ASCII در نامهای فایل همچنان بهدرستی مدیریت شوند.
این تابع معمولاً فقط باید درون یک زیرپوسته (subshell) اجرا شود، زیرا محلیسازی جدید به محیط صادر (export) میشود. کاربرد متداول آن به صورت `$(_comp_locale; command ...)' خواهد بود.
- _completers [ -p ]
- این تابع نامهای کاملکنندهها (completers) را کامل میکند.
- -p
- گنجاندن زیرخط ابتدایی (`_') در تطابقها.
- _default
- این تابع متناظر با بافتار ویژهٔ -default- است که در زمان عدم تعریف هیچ کاملسازیای اِعمال میشود. فراخوانی آن در شرایط خطای خاص، مانند کاملسازی پس از یک زیردستور ناشناخته، سودمند است. این کار مفهوم کاهش تدریجی کیفیت در صورت بروز خطا (graceful degradation) را در سامانهٔ کاملسازی پیاده میکند و به آن امکان میدهد تا به کاملسازی پایهای موارد پرکاربردی مانند نام فایلها رجوع کند.
- _describe [-12JVx] [ -oO | -t tag ] descr name1 [ name2 ] [ opt ... ]
- [ -- name1 [ name2 ] [ opt ... ] ... ]
- این تابع کاملسازیها را با توضیحات مرتبط میسازد. میتوان چندین گروهِ جداشده با -- را ارائه کرد که بالقوه دارای گزینههای کاملسازی opt متفاوتی هستند.
در صورتی که سبک format برای برچسب descriptions تنظیم شده باشد، descr بهعنوان رشتهای جهت نمایش در بالای تطابقها در نظر گرفته میشود.
به دنبال آن، نام یک یا دو آرایه میآید. متناوباً، آرایهها را میتوان طبق قواعد شرحدادهشده در زیر، با استفاده از نحو (item ...) بهصورت درونخطی ارائه کرد. (برخلاف _arguments فرمت جداگانهٔ ((...)) وجود ندارد.)
آرایهٔ name1 شامل کاملسازیهای ممکن به همراه توضیحات (اختیاری) آنها به شکل `completion:description' است. هر علامت دونقطهٔ واقعی در completion باید با یک ممیز وارونه (backslash) نقلقول (گریز داده) شود. اگر name2 ارائه شود، باید شمار عناصر آن با name1 برابر باشد؛ در این حالت عناصر متناظر، بهجای رشتههای completion از name1، بهعنوان کاملسازیهای ممکن افزوده میشوند. فهرست کاملسازی، توضیحات را از name1 حفظ خواهد کرد.
در نهایت، مجموعهای از گزینهها برای ارسال به compadd میتوانند ظاهر شوند.
اگر گزینهٔ `-o' قبل از اولین آرگومان ظاهر شود، با تطابقهای افزودهشده مانند نامهای گزینههای دستور رفتار میشود (توجه: نه گزینههای پوسته)، که معمولاً در خط فرمان پس از یک `-'، `--' یا `+' قرار میگیرند. در این حالت _describe از سبکهای prefix-hidden، prefix-needed و verbose برای بررسی اینکه آیا رشتهها باید بهعنوان کاملسازی افزوده شوند و آیا توضیحات باید نمایش داده شوند یا خیر استفاده میکند. بدون گزینهٔ `-o'، تنها سبک verbose برای تصمیمگیری در مورد چگونگی نمایش توضیحات به کار میرود. اگر بهجای `-o' از `-O' استفاده شود، گزینههای دستور مانند بالا کامل میشوند اما _describe سبک prefix-needed را مدیریت نخواهد کرد.
با گزینهٔ -t میتوان یک tag را مشخص کرد. مقدار پیشفرض `values' یا در صورت ارائهٔ گزینهٔ -o، `options' است.
گزینههای -1، -2، -J، -V و -x به _next_label ارسال میشوند.
در صورت انتخاب توسط سبک list-grouped، رشتههای دارای توضیح یکسان در کنار هم در فهرست نمایش داده خواهند شد.
تابع _describe از تابع _all_labels برای تولید تطابقها استفاده میکند، بنابراین نیازی نیست که درون حلقهای بر روی برچسبهای تگ قرار گیرد. _description [ -x ] [ -12VJ ] tag name descr [ spec ... ] این تابع نباید با تابع پیشین اشتباه گرفته شود؛ این تابع بهعنوان یک تابع کمکی برای ایجاد گزینهها برای compadd به کار میرود. این تابع در درون بسیاری از توابع سطح بالاتر کاملسازی تعبیه شده و بنابراین اغلب نیازی به فراخوانی مستقیم آن نیست.
سبکهای فهرستشده در زیر با استفاده از tag دادهشده در بافت جاری بررسی میشوند. گزینههای حاصل برای compadd در آرایهای با نام name قرار میگیرند (این نام بهطور سنتی `expl' است، اما این قرارداد اجباری نیست). شرح مربوط به مجموعه تطابقهای متناظر در descr به تابع فرستاده میشود.
سبکهای بررسیشده عبارتند از: format، hidden، matcher، ignore-line، ignored-patterns، group-name و sort. سبک format ابتدا برای tag دادهشده و در صورت پیدا نشدن مقدار، برای برچسب descriptions بررسی میشود، در حالی که باقی سبکها فقط برای برچسب دادهشده بهعنوان آرگومان اول بررسی میشوند. این تابع همچنین _setup را فراخوانی میکند که سبکهای بیشتری را بررسی مینماید.
رشتهٔ بازگرداندهشده توسط سبک format (در صورت وجود) به گونهای اصلاح خواهد شد که توالی `%d' با descr ارائهشده بهعنوان آرگومان سوم بدون هیچ فاصلهٔ خالی ابتدا یا انتها جایگزین شود. اگر پس از حذف فاصلههای خالی، descr رشتهای خالی باشد، از سبک format استفاده نخواهد شد و گزینههای قرارگرفته در آرایهٔ name شامل رشتهٔ توضیحی برای نمایش در بالای تطابقها نخواهند بود.
اگر _description با بیش از سه آرگومان فراخوانی شود، specهای اضافی باید به صورت `char:str' باشند. اینها جایگزینیهای توالی گریز را برای سبک format فراهم میکنند: هر بار تکرار `%char' با string جایگزین خواهد شد. اگر هیچ spec اضافی داده نشود اما شرح در descr با یک ساختار رایج مطابقت داشته باشد، توالیهای گریز بیشتری برای عناصر آن شرح تنظیم میشوند. این عناصر با مقدار پیشفرض (`%o')، واحدها (`%m')، دامنهٔ مقادیر مجاز (`%r') و بخش اولیهٔ باقیمانده از شرح (`%h') مطابقت دارند. ساختاری که شرح به خود میگیرد شامل مشخص کردن واحدها و دامنه در پرانتز و مقدار پیشفرض در براکت است، برای نمونه:
_description times expl 'timeout (seconds) (0-60) [20]'
هنگام قالببندی این عناصر، استفاده از عبارتهای شرطی zformat امکانپذیر است. بنابراین، برای نمونه، برای افزودن `default:' بهعنوان یک برچسب تنها زمانی که یک مقدار پیشفرض برای نمایش وجود دارد، سبک format میتواند شامل `%(o.default: %o.)' باشد.
اگر گزینهٔ -x داده شود، شرح با استفاده از گزینهٔ -x به جای -X پیشفرض به compadd فرستاده خواهد شد. این بدان معناست که شرح حتی در صورت نبود تطابقهای متناظر نیز نمایش داده خواهد شد.
گزینههای قرارگرفته در آرایهٔ name سبک group-name را در نظر میگیرند، بنابراین در صورت لزوم تطابقها در یک گروه جداگانه قرار میگیرند. عناصر گروه معمولاً مرتب شدهاند (با ارسال گزینهٔ -J به compadd)، اما اگر گزینهای که با `-V'، `-J'، `-1' یا `-2' آغاز میشود به _description ارسال گردد، آن گزینه در آرایه گنجانده خواهد شد. از این رو، نامرتب کردن گروه کاملسازی با دادن گزینهٔ `-V'، `-1V' یا `-2V' امکانپذیر است.
در بیشتر موارد، این تابع به این صورت استفاده خواهد شد:
local expl _description files expl file compadd "$expl[@]" - "$files[@]"
به استفاده از پارامتر expl، خط تیره و فهرست تطابقها توجه کنید. تقریباً تمام فراخوانیهای compadd در سامانهٔ کاملسازی از ساختار مشابهی استفاده میکنند؛ این امر تضمین میکند که سبکهای تعیینشده توسط کاربر بهدرستی به توابع توکاری که بخشهای درونی کاملسازی را پیادهسازی میکنند منتقل شوند.
- _dir_list [ -s sep ] [ -S ]
- فهرستی از نام دایرکتوریهای جداشده با دونقطه (با همان قالب $PATH) را کامل میکند.
- -s sep
- استفاده از sep بهعنوان جداکنندهٔ میان موارد. مقدار پیشفرض sep یک دونقطه (`:') است.
- -S
- افزودن sep به جای اسلش (`/') بهعنوان پسوند با قابلیت حذف خودکار.
- _dispatch context string ...
- بافت جاری را روی context تنظیم کرده و با جستوجو در فهرست نامهای دستور یا بافتهای ویژه (همانطور که در بالا برای compdef شرح داده شد) که در قالب stringها داده شدهاند، به دنبال توابع کاملسازی برای مدیریت این بافت میگردد. نخستین تابع کاملسازی که برای یکی از بافتهای موجود در فهرست تعریف شده باشد، برای تولید تطابقها استفاده میشود. بهطور معمول، آخرین string مقدار -default- است تا تابع مربوط به کاملسازی پیشفرض بهعنوان جایگزین (fallback) به کار رود.
این تابع پارامتر $service را روی string در حال آزمایش تنظیم کرده، و فیلد context/command (چهارمین فیلد) از پارامتر $curcontext را روی context ارائهشده بهعنوان آرگومان اول قرار میدهد.
- _email_addresses [ -c ] [ -n plugin ]
- نشانیهای ایمیل را کامل میکند. نشانیها توسط پلاگینها فراهم میشوند.
- -c
- نشانیهای خام localhost@domain.tld را بدون بخش نام یا توضیح کامل میکند. بدون این گزینه، رشتههای منطبق با RFC822 مانند `Firstname Lastname <address>' کامل میشوند.
- -n plugin
- نامهای مستعار را از plugin کامل میکند.
پلاگینهای زیر بهطور پیشفرض در دسترس هستند: _email-ldap (سبک filter را ببینید)، _email-local (نشانیهای یونیکس user@hostname را کامل میکند)، _email-mail (نامهای مستعار را از ~/.mailrc کامل میکند)، _email-mush، _email-mutt و _email-pine.
نشانیهای حاصل از پلاگین _email-foo تحت برچسب `email-foo' افزوده میشوند.
نوشتن پلاگینها
پلاگینها بهصورت توابع جداگانهای با نامهایی که با `_email-' آغاز میشوند، نوشته میشوند. آنها با گزینهٔ -c و گزینههای compadd فراخوانی میشوند. آنها باید یا خودشان کاملسازی را انجام دهند یا آرایهٔ $reply را روی فهرستی از عناصر `alias:address' تنظیم کرده و مقدار 300 را بازگردانند. پلاگینهای جدید بهطور خودکار شناسایی و اجرا خواهند شد.
- _files
- تابع _files یک پوشش (wrapper) برای _path_files است. این تابع از تمامی قابلیتهای آن با برخی بهبودها پشتیبانی میکند -- بهویژه اینکه سبک list-dirs-first را در نظر میگیرد، و به کاربران اجازه میدهد تا رفتار گزینههای -g و -/ را با سبک file-patterns لغو کنند. بنابراین در بیشتر موارد باید _files بر _path_files ترجیح داده شود.
این تابع تمام مجموعه گزینههای مجاز برای _path_files را که در زیر شرح داده شدهاند میپذیرد.
- _gnu_generic
- این تابع یک پوشش ساده برای تابع _arguments شرحدادهشده در بالا است. میتوان از آن برای تشخیص خودکار گزینههای بلندی که توسط دستورهایی که در پاسخ به گزینهٔ `--help' فهرستی تولید میکنند درک میشوند، استفاده کرد. هدف این است که مستقلاً بهعنوان یک تابع کاملسازی سطح بالا به کار رود. برای نمونه، برای فعالسازی کاملسازی گزینهها برای دستورهای foo و bar، عبارت زیر را
compdef _gnu_generic foo bar
پس از فراخوانی compinit استفاده کنید..PP سامانهٔ تکمیل به صورت ارائهشده در استفاده از این تابع محتاطانه عمل میکند، زیرا مهم است اطمینان حاصل شود که دستور گزینهٔ `--help' را میفهمد.
- _guard [ options ] pattern descr
- این تابع در صورتی که pattern با رشتهای که باید تکمیل شود مطابقت داشته باشد، descr را نمایش میدهد. این تابع برای استفاده در action برای مشخصههای ارسالشده به _arguments و توابع مشابه در نظر گرفته شده است.
وضعیت بازگشتی در صورتی که پیام نمایش داده شده باشد و کلمه برای تکمیل خالی نباشد صفر، و در غیر این صورت غیرصفر است.
پیش از pattern میتواند هر یک از گزینههای قابلفهم برای compadd قرار گیرد که از _description منتقل میشوند، یعنی -M، -J، -V، -1، -2، -n، -F و -X. همهٔ این گزینهها نادیده گرفته خواهند شد. این امر بهخوبی با قراردادهای ارسال آرگومانِ کنشها برای _arguments سازگار است.
به عنوان مثال، دستوری را در نظر بگیرید که گزینههای -n و -none را میپذیرد، به طوری که پس از -n باید در همان کلمه یک مقدار عددی بیاید. با استفاده از:
_arguments '-n-: :_guard "[0-9]#" "numeric value"' '-none'
میتوان کاری کرد که _arguments هم پیام `numeric value' را نمایش دهد و هم گزینهها را پس از `-n<TAB>' تکمیل کند. اگر پس از `-n' در حال حاضر یک یا چند رقم آمده باشد (الگوی ارسالشده به _guard)، تنها پیام نمایش داده خواهد شد؛ اگر پس از `-n' نویسهٔ دیگری آمده باشد، فقط گزینهها تکمیل میشوند.
- _message [ -r12 ] [ -VJ group ] descr
- _message -e [ tag ] descr
- از descr به همان روش آرگومان سوم تابع _description استفاده میشود، با این تفاوت که رشتهٔ حاصل فارغ از اینکه تطابقی تولید شده باشد یا خیر، همواره نمایش داده خواهد شد. این قابلیت برای نمایش پیام راهنما در جاهایی که هیچ تکمیلی نمیتواند تولید شود مفید است.
سبک format همراه با برچسب messages برای یافتن پیام بررسی میشود؛ برچسب معمول، descriptions، تنها در صورتی استفاده میشود که این سبک با برچسب اولی تنظیم نشده باشد.
اگر گزینهٔ -r داده شود، هیچ سبکی استفاده نمیشود؛ descr دقیقاً به عنوان رشتهای که باید نمایش داده شود در نظر گرفته میشود. این حالت زمانی بیشترین کاربرد را دارد که descr از یک فهرست آرگومانِ از پیش پردازششده آمده باشد که خود حاوی یک شرح بسطیافته است. توجه داشته باشید که این گزینه تجزیهٔ توالیهای `%' انجامشده توسط compadd را غیرفعال نمیکند.
گزینههای -12VJ و group به compadd ارسال میشوند و بنابراین گروهی را که رشتهٔ پیام به آن افزوده میشود تعیین میکنند.
شکل دوم -e شرحی را برای تکمیلهای با برچسب tag فراهم میکند تا حتی در صورت نبود تطابقی برای آن برچسب، نشان داده شود. این شکل توسط _arguments در حالتی که هیچ کنشی برای مشخصهٔ یک گزینه وجود نداشته باشد، فراخوانی میشود. میتوان برچسب را حذف کرد و در این صورت، برچسب از پارامتر $curtag گرفته میشود؛ این پارامتر توسط سامانهٔ تکمیل نگهداری میشود و بنابراین معمولاً درست است. توجه داشته باشید که اگر در زمان فراخوانی این تابع هیچ تطابقی وجود نداشته باشد، compstate[insert] پاک میشود، بنابراین تطابقهای اضافی که بعداً تولید شوند در خط فرمان درج نخواهند شد.
- _multi_parts [ -i ] sep array
- آرگومان sep یک نویسهٔ جداکننده است. array میتواند نام یک پارامتر آرایهای یا یک آرایهٔ صریح به شکل `(foo bar)' باشد، فهرستی داخل پرانتز از کلمات که با فاصله از هم جدا شدهاند. تکمیلهای احتمالی، رشتههای حاصل از آرایه هستند. با این حال، هر بخش که توسط sep جدا شده است بهطور جداگانه تکمیل خواهد شد. برای مثال، تابع _tar از `_multi_parts / patharray' برای تکمیل مسیرهای جزئی فایل از آرایهٔ ارائهشده از مسیرهای کامل فایل استفاده میکند.
گزینهٔ -i باعث میشود _multi_parts یک تطابق یکتا را درج کند حتی اگر مستلزم درج چندین جداکننده باشد. این رفتار معمولاً در مورد نام فایلها مورد انتظار نیست، اما انواع خاص دیگری از تکمیل، به عنوان مثال مواردی با مجموعهای ثابت از احتمالات، ممکن است برای این شکل مناسبتر باشند.
همانند سایر توابع کمکی، این تابع گزینههای `-V'، `-J'، `-1'، `-2'، `-n'، `-f'، `-X'، `-M'، `-P'، `-S'، `-r'، `-R' و `-q' را میپذیرد و آنها را به دستور توکار compadd ارسال میکند.
- _next_label [ -x ] [ -12VJ ] tag name descr [ option ... ]
- این تابع برای پیادهسازی حلقه روی عنوانهای مختلف برچسب (tag labels) برای یک برچسب خاص، همانطور که در بالا برای سبک tag-order شرح داده شد، استفاده میشود. در هر فراخوانی بررسی میکند که آیا عنوانهای برچسب بیشتری وجود دارد یا خیر؛ در صورت وجود، وضعیت صفر و در غیر این صورت غیرصفر برمیگرداند. از آنجا که این تابع نیازمند تنظیم بودن یک برچسب جاری است، همیشه باید پس از فراخوانی _tags یا _requested بیاید.
گزینههای -x12VJ و سه آرگومان نخست به تابع _description ارسال میشوند. در صورت لزوم، در این فراخوانی tag با یک عنوان برچسب جایگزین خواهد شد. هر شرحی که در سبک tag-order داده شده باشد، بر descr ارسالشده به _next_label ترجیح داده میشود.
گزینههای ارائهشده پس از descr در پارامتر تعیینشده توسط name تنظیم میشوند، و بنابراین باید به compadd یا هر تابعی که برای افزودن تطابقها فراخوانی میشود ارسال گردند.
در اینجا یک کاربرد معمول از این تابع برای برچسب foo آورده شده است. فراخوانی _requested مشخص میکند که آیا اصلاً برچسب foo مورد نیاز است یا خیر؛ حلقه روی _next_label هر عنوانی را که برای آن برچسب در سبک tag-order تعریف شده مدیریت میکند.
local expl ret=1
...
if _requested foo; then
...
while _next_label foo expl '...'; do
compadd "$expl[@]" ... && ret=0
done
...
fi
return ret
- _normal [ -P | -p precommand ]
- این تابع استاندارد برای مدیریت تکمیل در خارج از هرگونه -context- خاص فراخوانی میشود. این تابع هم برای تکمیل کلمهٔ دستور و هم آرگومانهای یک دستور فراخوانی میشود. در حالت دوم، _normal به دنبال تکمیل خاصی برای آن دستور میگردد، و اگر موردی پیدا نشود، از تکمیل زمینهٔ -default- استفاده میکند.
کاربرد دوم، بررسی مجدد خط فرمان مشخصشده توسط آرایهٔ $words و پارامتر $CURRENT پس از تغییر یافتن آنها است. برای مثال، تابع _precommand که تکمیل را پس از مشخصکنندههای پیشدستور نظیر nohup انجام میدهد، کلمهٔ اول را از آرایهٔ words حذف میکند، از مقدار پارامتر CURRENT یکی میکاهد، و سپس `_normal -p $service' را فراخوانی میکند. نتیجه آن است که با `nohup cmd ...' همانند `cmd ...' رفتار میشود.
- -P
- فهرست پیشدستورها را بازنشانی میکند. این گزینه زمانی باید استفاده شود که در حال تکمیل خط فرمانی باشیم که صرفنظر از پیشدستورهای قبلی، دستورهای داخلی (مانند دستورهای توکار و توابع) را مجاز میداند (مانند `zsh -c').
- -p precommand
- مقدار precommand را به انتهای فهرست پیشدستورها اضافه میکند. این گزینه باید تقریباً در همهٔ مواردی که -P کاربرد ندارد، استفاده شود.
اگر نام دستور با یکی از الگوهای ارائهشده توسط یکی از گزینههای -p یا -P به compdef مطابقت داشته باشد، تابع تکمیل مربوطه فراخوانی شده و سپس پارامتر _compskip بررسی میشود. اگر این متغیر مقداردهی شده باشد، تکمیل در همان نقطه متوقف میشود حتی اگر هیچ تطابقی پیدا نشده باشد. این همان اثری است که در زمینهٔ -first- وجود دارد.
- _numbers [ option ... ] [ description ] [ suffix ... ]
- این تابع میتواند در جاهایی استفاده شود که پس از یک عدد، پسوندی برای نمایش یکاها (واحدها) میآید. پسوندهای یکا تکمیل میشوند و همچنین میتوانند در شرحی که هنگام فراخوانی تکمیل برای عدد پیشین استفاده میشود، گنجانده شوند.
علاوه بر گزینههای رایج compadd، تابع _numbers گزینههای زیر را میپذیرد:.PP
- -t tag
- برچسبی را برای استفاده به جای برچسب پیشفرض numbers تعیین میکند.
- -u units
- واحدهای پیشفرض را برای عدد مشخص میکند، مانند bytes.
- -l min
- کمترین مقدار ممکن را برای عدد تعیین میکند.
- -m max
- بیشترین مقدار ممکن را برای عدد تعیین میکند.
- -d default
- مقدار پیشفرض را تعیین میکند.
- -N
- اجازه دادن به اعداد منفی. اگر بازه شامل یک عدد منفی باشد، این مورد به صورت ضمنی اعمال میشود.
- -f
- اجازه دادن به اعداد اعشاری.
در جایی که یک پسوند خاص نمایانگر واحدهای پیشفرض برای یک عدد باشد، باید یک دونقطه (colon) به ابتدای آن اضافه شود. علاوه بر این، پسوندها میتوانند با یک دونقطه و یک توضیح همراه شوند. بنابراین برای مثال، دستور زیر اجازه میدهد سن چیزی، یا بر حسب ثانیه یا با یک پسوند اختیاری با واحد زمانی طولانیتر مشخص شود:
_numbers -u seconds age :s:seconds m:minutes h:hours d:days
معمولاً مفید است که واحدها هنگام تکمیل بر اساس مرتبه بزرگی نمایش داده شوند. برای تسهیل این امر، ترتیبی که در آن مشخص شدهاند حفظ میشود.
هنگامی که سبک format با برچسب descriptions یا برچسب مشخصشده با -t جستجو میشود، فهرست پسوندها به صورت دنباله گریز `%x' در دسترس است. این علاوه بر دنبالههای معمولی است که ذیل سبک format مستند شدهاند. شکلی که این فهرست به خود میگیرد نیز قابل پیکربندی است. بدین منظور، سبک format ابتدا با برچسب unit-suffixes جستجو میشود. قالب بازیابیشده به نوبت روی هر پسوند اعمال میشود و سپس نتایج برای تشکیل فهرست تکمیلشده به یکدیگر متصل میشوند. برای قالب unit-suffixes، شناسه `%x' به پسوند منفرد و `%X' به توضیحات آن بسط مییابد. `%d' نشاندهنده یک پسوند پیشفرض است و میتواند در یک شرط استفاده شود. نمایه و نمایه معکوس به ترتیب در `%i' و `%r' تنظیم میشوند و برای متنی که فقط همراه با اولین و آخرین پسوند در فهرست گنجانده میشود مفید هستند. بنابراین برای مثال، دستور زیر پسوندها را به صورت یک فهرست جداشده با کاما به هم متصل میکند:
zstyle ':completion:*:unit-suffixes' format '%x%(r::,)'
- _options
- این تابع میتواند برای تکمیل نام گزینههای شل استفاده شود. این تابع یک مشخصه تطبیقدهنده ارائه میدهد که `no' ابتدایی را نادیده میگیرد، زیرخطها را نادیده میگیرد و به حروف بزرگ اجازه میدهد تا با معادلهای کوچک خود مطابقت پیدا کنند (برای مثال، `glob'، `noglob' و `NO_GLOB' همگی تکمیل میشوند). هر آرگومانی به دستور توکار compadd ارسال میشود.
- _options_set و _options_unset
- این توابع فقط گزینههای تنظیمشده یا تنظیمنشده را با همان مشخصه تطبیقی که در تابع _options استفاده شده است تکمیل میکنند.
توجه داشته باشید که برای کارکرد درست این توابع، باید چند خط را در تابع _main_complete از حالت توضیح خارج کنید. خطوط مورد نظر برای ذخیره تنظیمات گزینههای فعال، پیش از اینکه ابزارک تکمیل گزینههای مورد نیاز خود را به صورت محلی تنظیم کند، استفاده میشوند. بنابراین این توابع معمولاً توسط سیستم تکمیل استفاده نمیشوند.
- _parameters
- این تابع برای تکمیل نام پارامترهای شل استفاده میشود.
گزینه `-g pattern' تکمیل را به پارامترهایی محدود میکند که نوع آنها با pattern مطابقت دارد. نوع یک پارامتر همان چیزی است که توسط `print ${(t)param}' نمایش داده میشود، از این رو استفاده هوشمندانه از `*' در pattern احتمالاً ضروری است.
تمام آرگومانهای دیگر به دستور توکار compadd ارسال میشوند.
- _path_files
- این تابع در سرتاسر سیستم تکمیل برای تکمیل نام فایلها به کار میرود. این تابع امکان تکمیل مسیرهای جزئی را فراهم میکند. برای مثال، رشته `/u/i/s/sig' ممکن است به `/usr/include/sys/signal.h' تکمیل شود.
گزینههای پذیرفتهشده توسط هر دو تابع _path_files و _files عبارتند از:
- -f
- تکمیل تمام نامهای فایل. این حالت پیشفرض است.
- -/
- مشخص میکند که فقط دایرکتوریها باید تکمیل شوند.
- -g pattern
- مشخص میکند فقط فایلهایی که با pattern مطابقت دارند باید تکمیل شوند.
- -W paths
- پیشوندهای مسیری را مشخص میکند که باید برای تولید نام فایلها به ابتدای رشته ورودی خط فرمان اضافه شوند، اما نباید به عنوان تکمیل درج شوند و نباید در فهرستهای گزینههای تکمیل نشان داده شوند. در اینجا، paths میتواند نام یک پارامتر آرایهای، یک فهرست دقیق از مسیرها درون پرانتز یا یک نام مسیر مطلق باشد.
- -F ignored-files
- رفتاری مشابه با گزینه متناظر در دستور توکار compadd دارد. این گزینه کنترل مستقیمی بر نام فایلهایی که باید نادیده گرفته شوند فراهم میکند. اگر این گزینه مشخص نشده باشد، از سبک ignored-patterns استفاده میشود.
هر دو تابع _path_files و _files گزینههای زیر را نیز که به compadd فرستاده میشوند، میپذیرند: `-J'، `-V'، `-1'، `-2'، `-n'، `-X'، `-M'، `-P'، `-S'، `-q'، `-r' و `-R'.
در نهایت، تابع _path_files از سبکهای expand، ambiguous، special-dirs، list-suffixes و file-sort که در بالا توضیح داده شدند، استفاده میکند.
- _pick_variant [ -b builtin-label ] [ -c command ] [ -r name ]
- label=pattern ... label [ arg .. ]
- این تابع برای رفع شرایطی استفاده میشود که در آن یک نام دستور واحد نیازمند بیش از یک نوع رسیدگی است، چه به این دلیل که چندین گونه مختلف دارد یا به این دلیل که تداخل نام بین دو دستور متفاوت وجود دارد.
دستور برای اجرا از اولین عنصر آرایه words گرفته میشود مگر اینکه توسط گزینه -c لغو شود. این دستور اجرا شده و خروجی آن با یک سری از الگوها مقایسه میشود. آرگومانهایی که باید به دستور ارسال شوند را میتوان در انتها پس از تمام آرگومانهای دیگر مشخص کرد. الگوهایی که باید به ترتیب بررسی شوند توسط آرگومانهای label=pattern مشخص میشوند؛ اگر خروجی `command arg ...' حاوی pattern باشد، آنگاه label به عنوان برچسب گونه دستور انتخاب میشود. اگر هیچیک از الگوها مطابقت نداشته باشند، برچسب نهایی دستور انتخاب شده و وضعیت خروج 1 بازگردانده میشود.
اگر گزینه `-b builtin-label' داده شود، دستور آزمایش میشود تا بررسی شود آیا به عنوان یک دستور توکار شل (احتمالاً autoload شده) ارائه شده است یا خیر؛ در این صورت، برچسب builtin-label به عنوان برچسب این گونه انتخاب میشود.
اگر گزینه `-r name' داده شود، label انتخابشده در پارامتری با نام name ذخیره میشود.
نتایج همچنین در آرایه انجمنی _cmd_variant با نمایهای از نام دستور اجراشده حافظهنهان (cache) میشوند.
- _regex_arguments name spec ...
- این تابع یک تابع تکمیل با نام name تولید میکند که با مشخصات specها، یعنی مجموعهای از عبارات باقاعده همانطور که در زیر شرح داده شده است، مطابقت مییابد. پس از اجرای _regex_arguments، تابع name باید مانند یک تابع تکمیل معمولی فراخوانی شود. الگویی که باید تطبیق داده شود توسط محتویات آرایه words تا موقعیت فعلی مکاننما که با نویسههای تهی به هم متصل شدهاند، ارائه میشود؛ هیچ نشانهگذاری یا نقلقولی اعمال نمیشود. آرگومانها بهصورت مجموعههایی از حالتهای جایگزین گروهبندی میشوند که با «|» از یکدیگر جدا شدهاند و یکبهیک تا زمانی که یکی مطابقت یابد، آزمایش میشوند. هر جایگزین از یک یا چند مشخصه تشکیل شده است که از چپ به راست بررسی میشوند و هر الگوی منطبقشده به نوبهٔ خود از خط فرمانِ در حال آزمایش حذف میشود، تا زمانی که تمام گروه با موفقیت تطبیق یابد یا یکی با شکست مواجه شود؛ در حالت دوم، جایگزین بعدی آزمایش میشود. این ساختار را میتوان با استفاده از پرانتزها تا هر عمق دلخواهی تکرار کرد؛ تطبیق از داخل به بیرون پیش میرود.
اگر هیچ آزمایشی موفق نشود اما رشتهٔ باقیمانده از خط فرمان فاقد نویسهٔ تهی (null) باشد (به این معنی که کلمهٔ باقیمانده همان کلمهای است که تکمیلها باید برای آن تولید شوند)، رویهٔ ویژهای اعمال میشود. هدف تکمیل به کلمهٔ باقیمانده محدود شده و هر action برای الگوهای متناظر اجرا میشود. در این حالت، هیچ چیزی از رشتهٔ خط فرمان حذف نمیشود. ترتیب ارزیابی actionها را میتوان با سبک tag-order تعیین کرد؛ قالبهای گوناگونِ پشتیبانیشده توسط _alternative را میتوان در action به کار برد. از descr برای مقداردهی اولیهٔ پارامتر آرایهای expl استفاده میشود.
آرگومانهای مشخصه یکی از شکلهای زیر را به خود میگیرند، که در آنها فرانویسههایی مانند «(»، «)»، «#» و «|» باید نقلقول (quote) شوند.
- /pattern/ [%lookahead%] [-guard] [:tag:descr:action]
- این یک مؤلفهٔ اولیه ساده است. تابع بررسی میکند که آیا الگوی ترکیبی «(#b)((#B)pattern)lookahead*» با رشتهٔ خط فرمان مطابقت دارد یا خیر. در صورت تطابق، «guard» ارزیابی شده و وضعیت خروج آن برای تعیین موفقیت آزمایش بررسی میشود. تضمین شده است که رشتهٔ pattern به صورت «[]» هرگز مطابقت پیدا نکند. پیش از بررسی الگوی بعدی، lookahead از خط فرمان حذف نمیشود.
آرگومانی که با : شروع میشود، به همان روش آرگومانِ _alternative استفاده میشود.
یک مؤلفه به شرح زیر استفاده میشود: pattern آزمایش میشود تا مشخص گردد آیا مؤلفه از پیش در خط فرمان وجود دارد یا خیر. در صورت وجود، مشخصههای بعدی بررسی میشوند تا موردی برای تکمیل پیدا شود. اگر به مؤلفهای برسد اما هنوز چنین الگویی در خط فرمان وجود نداشته باشد، از رشتهٔ حاوی action برای تولید موارد منطبق جهت درج در آن نقطه استفاده میشود.
- /pattern/+ [%lookahead%] [-guard] [:tag:descr:action]
- این شبیه به «/pattern/ ...» است، اما بخش سمت چپ رشتهٔ خط فرمان (یعنی بخشی که پیشتر توسط الگوهای قبلی مطابقت داده شده است) نیز به عنوان بخشی از هدف تکمیل در نظر گرفته میشود.
- /pattern/- [%lookahead%] [-guard] [:tag:descr:action]
- این شبیه به «/pattern/ ...» است، اما actionهای الگوی کنونی و الگوهای از پیش منطبقشده نادیده گرفته میشوند، حتی اگر «pattern» بعدی با رشتهٔ خالی مطابقت داشته باشد.
- ( spec )
- میتوان از پرانتزها برای گروهبندی specها استفاده کرد؛ توجه داشته باشید که هر پرانتز یک آرگومان مستقل برای _regex_arguments محسوب میشود.
- spec #
- این مورد اجازه میدهد spec به هر تعداد دلخواه تکرار شود.
- spec spec
- این دو spec باید یکی پس از دیگری، همانطور که در بالا شرح داده شد، مطابقت داده شوند.
- spec | spec
- هر یک از این دو spec میتوانند تطبیق داده شوند.
تابع _regex_words میتواند به عنوان یک تابع کمکی برای تولید تطابقها برای مجموعهای از کلمات جایگزین، احتمالاً به همراه آرگومانهای خودشان، به عنوان یک آرگومان خط فرمان استفاده شود.
مثالها:
_regex_arguments _tst /$'[^\0]#\0'/ \
/$'[^\0]#\0'/ :'compadd aaa'
این دستور تابعی به نام _tst تولید میکند که aaa را به عنوان تنها آرگومان خود تکمیل میکند. tag و description برای action جهت اختصار حذف شدهاند (این ساختار کار میکند اما در استفادههای معمول توصیه نمیشود). مؤلفهٔ اول با کلمهٔ دستور مطابقت مییابد که دلخواه است؛ مؤلفهٔ دوم با هر آرگومانی تطبیق پیدا میکند. از آنجا که آرگومان نیز دلخواه است، هر مؤلفهٔ بعدی به حضور aaa وابسته نخواهد بود.
_regex_arguments _tst /$'[^\0]#\0'/ \
/$'aaa\0'/ :'compadd aaa'
این نمونه کاربردی معمولتر است؛ مشابه مورد پیشین است، اما هر الگوی بعدی تنها در صورتی تطبیق مییابد که aaa به عنوان آرگومان نخست وجود داشته باشد.
_regex_arguments _tst /$'[^\0]#\0'/ \( \
/$'aaa\0'/ :'compadd aaa' \
/$'bbb\0'/ :'compadd bbb' \) \#
در این مثال، تعداد نامحدودی از آرگومانهای دستور ممکن است تکمیل شوند. آرگومانهای فرد به صورت aaa و آرگومانهای زوج به صورت bbb تکمیل میشوند. تکمیل با شکست مواجه میشود مگر اینکه مجموعه آرگومانهای aaa و bbb پیش از آرگومان کنونی، به درستی تطبیق یافته باشند.
_regex_arguments _tst /$'[^\0]#\0'/ \
\( /$'aaa\0'/ :'compadd aaa' \| \
/$'bbb\0'/ :'compadd bbb' \) \#
این مثال نیز مشابه است، اما برای هر آرگومان، هر یک از aaa یا bbb میتوانند تکمیل شوند. در این حالت، میتوان از _regex_words برای تولید یک عبارت مناسب برای آرگومانها استفاده کرد.
- _regex_words tag description spec ...
- این تابع میتواند برای تولید آرگومانهایی برای دستور _regex_arguments استفاده شود که میتوانند در هر نقطهای که مجموعهای از قواعد مورد انتظار است، درج شوند. tag و description یک برچسب و شرح استاندارد مربوط به بافت (context) فعلی را ارائه میدهند. هر spec شامل دو یا سه آرگومان است که با دو نقطه از هم جدا شدهاند: توجه داشته باشید که در این حالت هیچ دو نقطهای در ابتدای عبارت وجود ندارد.
هر spec یکی از مجموعهکلماتی را که میتوان در این نقطه تکمیل کرد، به همراه آرگومانهایش مشخص میکند. بنابراین، در هنگام استفاده در حالت تکمیل معمولی (غیر regex)، تقریباً معادل تابع _arguments است.
بخشی از spec که پیش از اولین دونقطه قرار دارد، کلمهای است که باید تکمیل شود. این بخش میتواند شامل یک * باشد؛ کل کلمه، قبل و بعد از * تکمیل میشود، اما تنها متن پیش از * برای تطبیق بافت الزامی است، به طوری که آرگومانهای بعدی میتوانند پس از شکل اختصاری تکمیل گردند.
بخش دوم spec شرحی برای کلمهٔ در حال تکمیل است.
بخش اختیاری سوم از spec توصیف میکند کلماتی که پس از کلمهٔ فعلی میآیند، چگونه باید تکمیل شوند. این بخش ارزیابی خواهد شد تا از بروز مشکلات مرتبط با نقلقول (quoting) جلوگیری شود. بدین معنا که معمولاً حاوی ارجاعی به یک آرایه شامل آرگومانهای regex از پیش تولید شده است.
گزینهٔ -t term به جای فاصلهٔ معمول، یک پایاندهنده برای کلمه تعیین میکند. این پایاندهنده به عنوان یک پسوند با حذف خودکار، به همان روش گزینهٔ -s sep در تابع _values مدیریت میشود.
نتیجهٔ پردازش توسط _regex_words در آرایهٔ reply قرار میگیرد که باید برای تابع فراخواننده به صورت محلی (local) تعریف شود. اگر مجموعهٔ کلمات و آرگومانها قابلیت تطبیق مکرر داشته باشند، باید یک # به آرایهٔ تولید شده در آن نقطه الحاق شود.
برای مثال:
local -a reply _regex_words mydb-commands 'mydb commands' \ 'add:add an entry to mydb:$mydb_add_cmds' \ 'show:show entries in mydb' _regex_arguments _mydb "$reply[@]" _mydb "$@"این یک تابع کاملسازی را برای دستور mydb نشان میدهد که دو آرگومان دستور، add و show را میپذیرد. دستور show هیچ آرگومانی نمیپذیرد، در حالی که آرگومانهای add از پیش در آرایهٔ mydb_add_cmds آماده شدهاند؛ به احتمال زیاد توسط یک فراخوانی قبلی به _regex_words.
- _requested [ -x ] [ -12VJ ] tag [ name descr [ command [ arg ... ] ]
- این تابع برای تصمیمگیری در این مورد فراخوانی میشود که آیا برچسبی (tag) که پیشتر با فراخوانی _tags (پایین را ببینید) ثبت شده است، توسط کاربر درخواست شده و در نتیجه باید کاملسازی برای آن انجام گیرد یا خیر. در صورتی که برچسب درخواست شده باشد، وضعیت خروج صفر و در غیر این صورت غیرصفر بازمیگرداند. این تابع معمولاً به عنوان بخشی از یک حلقه روی برچسبهای گوناگون به صورت زیر استفاده میشود:
_tags foo bar baz
while _tags; do
if _requested foo; then
... # perform completion for foo
fi
... # test the tags bar and baz in the same way
... # exit loop if matches were generated
done
توجه داشته باشید که بررسی تولید شدن مطابقتها تا انتهای حلقهٔ _tags انجام نمیشود. این امر بدان سبب است که کاربر بتواند سبک tag-order را برای تعیین مجموعهای از برچسبها که باید به طور همزمان کامل شوند، تنظیم کند.
اگر name و descr ارائه شده باشند، _requested تابع _description را با این آرگومانها به همراه گزینههای ارائهشده به _requested فراخوانی میکند.
اگر command ارائه شود، تابع _all_labels بلافاصله با همان آرگومانها فراخوانی خواهد شد. در موارد ساده این امکان وجود دارد که بررسی برچسب و تطبیق در یک مرحله انجام پذیرد. برای نمونه:
local expl ret=1
_tags foo bar baz
while _tags; do
_requested foo expl 'description' \
compadd foobar foobaz && ret=0
...
(( ret )) || break
done
اگر command دستور compadd نباشد، با این حال باید برای مدیریت همان گزینهها آماده باشد.
- _retrieve_cache cache_identifier
- این تابع اطلاعات کاملسازی را از فایل ارائهشده توسط cache_identifier بازیابی میکند؛ این فایل در دایرکتوری مشخصشده با سبک cache-path که پیشفرض آن ~/.zcompcache است، ذخیره میشود. وضعیت خروج در صورت بازیابی موفقیتآمیز، صفر است. این تابع تنها در صورتی اقدام به بازیابی میکند که سبک use-cache تنظیم شده باشد، بنابراین میتوانید این تابع را بدون نگرانی دربارهٔ اینکه آیا کاربر قصد استفاده از لایهٔ حافظهٔ پنهان (cache) را داشته است یا خیر، فراخوانی کنید.
برای جزئیات بیشتر به _store_cache در زیر مراجعه نمایید.
- _sep_parts
- به این تابع آرایهها و جداکنندهها به صورت یکی در میان به عنوان آرگومان داده میشوند. آرایهها کاملسازیهایی را برای بخشهایی از رشتهها که باید توسط جداکنندهها جدا شوند، مشخص میکنند. آرایهها میتوانند نام متغیرهای آرایهای یا فهرستی از کلمات درون پرانتز و گیومه باشند. برای نمونه، با آرایهٔ `hosts=(ftp news)' فراخوانی `_sep_parts '(foo bar)' @ hosts' رشتهٔ `f' را به `foo' و رشتهٔ `b@n' را به `bar@news' کامل خواهد کرد.
این تابع گزینههای `-V'، `-J'، `-1'، `-2'، `-n'، `-X'، `-M'، `-P'، `-S'، `-r'، `-R' و `-q' دستور compadd را میپذیرد و آنها را به دستور توکار compadd که برای افزودن مطابقتها استفاده میشود، منتقل میکند.
- _sequence [ -s sep ] [ -n max ] [ -d ] function [ - ] ...
- این تابع پوششی برای سایر توابع جهت کاملسازی موارد در یک فهرست جداسازیشده است. از همان تابع برای کاملسازی هر مورد در فهرست استفاده میشود. جداکننده با گزینهٔ -s مشخص میشود. اگر -s حذف شود، از `,' استفاده خواهد شد. مقادیر تکراری تطبیق داده نمیشوند مگر اینکه -d مشخص شده باشد. اگر تعداد ثابت یا حداکثری از موارد در فهرست وجود دارد، میتوان آن را با گزینهٔ -n تعیین کرد.
گزینههای عمومی compadd به تابع منتقل میشوند. استفاده مستقیم از compadd همراه با _sequence امکانپذیر است، هرچند ممکن است در این موقعیت _values مناسبتر باشد.
- _setup tag [ group ]
- این تابع پارامترهای ویژهای را که سیستم کاملسازی استفاده میکند، متناسب با tag دادهشده به عنوان نخستین آرگومان، راهاندازی میکند. این تابع از سبکهای list-colors، list-packed، list-rows-first، last-prompt، accept-exact، menu و force-list استفاده میکند.
آرگومان اختیاری group نام گروهی را مشخص میکند که مطابقتها در آن قرار خواهند گرفت. اگر ارائه نشود، از tag به عنوان نام گروه استفاده خواهد شد.
این تابع به طور خودکار از _description فراخوانی میشود و از این رو به طور معمول نیازی به فراخوانی صریح آن نیست.
- _store_cache cache_identifier param ...
- این تابع در کنار _retrieve_cache و _cache_invalid، یک لایهٔ حافظهٔ پنهان (کش) را پیادهسازی میکند که در هر تابع کاملسازی قابل استفاده است. دادههای بهدستآمده از طریق عملیاتهای سنگین در پارامترها ذخیره میشوند؛ سپس این تابع مقادیر آن پارامترها را درون یک فایل میریزد. پس از آن، دادهها را میتوان حتی در نمونههای مختلف شل، با سرعت بالا از طریق _retrieve_cache از آن فایل بازیابی کرد.
آرگومان cache_identifier فایلی را مشخص میکند که دادهها باید در آن ریخته شوند. فایل در دایرکتوری تعیینشده با سبک cache-path ذخیره میشود که پیشفرض آن ~/.zcompcache است. آرگومانهای باقیماندهٔ param، پارامترهایی هستند که باید در فایل ریخته شوند.
در صورت ذخیرهسازی موفقیتآمیز، وضعیت خروج صفر است. این تابع تنها در صورتی اقدام به ذخیرهسازی میکند که سبک use-cache تنظیم شده باشد، بنابراین میتوانید این تابع را بدون نگرانی دربارهٔ تمایل کاربر به استفاده از لایهٔ حافظه پنهان فراخوانی کنید.
تابع کاملسازی در صورتی که پیشاپیش دادههای کاملسازی را به صورت پارامتر در دسترس داشته باشد، میتواند از فراخوانی _retrieve_cache خودداری کند. با این حال، در این شرایط باید _cache_invalid را فراخوانی کند تا بررسی نماید که آیا دادههای موجود در پارامترها و حافظه پنهان هنوز معتبر هستند یا خیر.
برای نمونهای ساده از کاربرد لایهٔ حافظه پنهان، تابع کاملسازی _perl_modules را ببینید.
- _tags [ [ -C name ] tag ... ]
- اگر با آرگومانها فراخوانی شود، این آرگومانها به عنوان نام برچسبهای معتبر برای کاملسازیها در بافتار جاری در نظر گرفته میشوند. این برچسبها به صورت داخلی ذخیره شده و با استفاده از سبک tag-order مرتب میگردند.
سپس، _tags به طور مکرر بدون آرگومان از همان تابع کاملسازی فراخوانی میشود. این عمل به ترتیب نخستین، دومین و غیره مجموعه از برچسبهای درخواستشده توسط کاربر را انتخاب میکند. در صورتی که دستکم یکی از برچسبها درخواست شده باشد، وضعیت خروج صفر و در غیر این صورت غیرصفر است. برای بررسی اینکه آیا باید یک برچسب خاص بررسی شود، تابع _requested باید فراخوانی شود (بالا را ببینید).
اگر `-C name' داده شود، name در طول فراخوانی _tags به طور موقت در فیلد argument (فیلد پنجم) از بافتار در پارامتر curcontext ذخیره میشود؛ این فیلد در هنگام خروج بازیابی میگردد. این ویژگی به _tags اجازه میدهد تا از بافتاری دقیقتر استفاده کند، بدون آنکه نیازی به تغییر و بازنشانی پارامتر curcontext (که همین اثر را دارد) باشد.
- _tilde_files
- مشابه _files عمل میکند، اما علامتهای مد (tilde) ابتدایی را مطابق با قواعد بسط نام فایل بازگشایی میکند، بنابراین کاملسازیهای پیشنهادی با یک `~' آغاز نمیشوند حتی اگر نام فایل در خط فرمان با آن آغاز شده باشد.
- _values [ -O name ] [ -s sep ] [ -S sep ] [ -wC ] desc spec ...
- این تابع برای کاملسازی کلیدواژههای دلخواه (مقادیر) و آرگومانهای آنها، یا فهرستهایی از این ترکیبها به کار میرود.
اگر آرگومان نخست گزینهٔ `-O name' باشد، به همان شیوهای که در تابع _arguments انجام میشود، به کار خواهد رفت. به بیان دیگر، عناصر آرایهٔ name در هنگام اجرای یک کنش (action) به compadd ارسال خواهند شد..PP اگر نخستین آرگومان (یا نخستین آرگومان پس از `-O name') برابر `-s' باشد، آرگومان بعدی بهعنوان نویسهای به کار میرود که مقادیر چندگانه را از هم جدا میکند. این نویسه بهطور خودکار پس از هر مقدار به شیوهای با قابلیت حذف خودکار (auto-removable، پایینتر را ببینید) افزوده میشود؛ برخلاف تکمیل با استفاده از _arguments، تمامی مقادیر کاملشده توسط `_values -s' در همان کلمه بر روی خط فرمان ظاهر میشوند. اگر این گزینه وجود نداشته باشد، در هر کلمه تنها یک مقدار کامل خواهد شد.
بهطور معمول، _values تنها از کلمهٔ جاری برای تعیین مقادیری که از قبل روی خط فرمان حضور دارند (و در نتیجه نباید دوباره کامل شوند) استفاده میکند. اگر گزینهٔ -w داده شود، آرگومانهای دیگر نیز بررسی میشوند.
نخستین آرگومان غیرگزینهای، desc، بهعنوان رشتهای برای چاپ شدن به عنوان شرح پیش از فهرست کردن مقادیر به کار میرود.
تمامی آرگومانهای دیگر، مقادیر ممکن و آرگومانهای آنها را با همان قالبی که تابع _arguments برای توصیف گزینهها به کار میبرد، شرح میدهند (بالا را ببینید). تنها تفاوتها این است که در ابتدا نیازی به علامت منفی یا مثبت نیست، مقادیر تنها میتوانند یک آرگومان داشته باشند، و اشکال عملیاتی (actions) که با علامت مساوی آغاز میشوند پشتیبانی نمیشوند.
نویسهٔ جداکنندهٔ یک مقدار از آرگومانش را میتوان با استفاده از گزینهٔ -S تنظیم کرد (مشابه -s، به همراه نویسهای که در آرگومان بعدی بهعنوان جداکننده به کار میرود). بهطور پیشفرض، علامت مساوی بهعنوان جداکننده میان مقادیر و آرگومانها استفاده خواهد شد.
مثال:
_values -s , 'description' \
'*foo[bar]' \
'(two)*one[number]:first count:' \
'two[another number]::second count:(1 2 3)'
این دستور سه مقدار ممکن را توصیف میکند: `foo'، `one' و `two'. اولی با `bar' توصیف شده است، هیچ آرگومانی نمیپذیرد و ممکن است بیش از یک بار ظاهر شود. دومی با `number' توصیف شده است، ممکن است بیش از یک بار ظاهر شود، و یک آرگومان اجباری را میپذیرد که با `first count' توصیف شده است؛ هیچ عملیاتی مشخص نشده است، بنابراین کامل نخواهد شد. عبارت `(two)' در ابتدا بیان میکند که اگر مقدار `one' روی خط باشد، مقدار `two' دیگر بهعنوان یک تکمیل ممکن در نظر گرفته نخواهد شد. در پایان، آخرین مقدار (`two') با `another number' توصیف شده و یک آرگومان اختیاری را میپذیرد که با `second count' توصیف شده است و تکمیلهای آن (که پس از یک `=' ظاهر میشوند) مقادیر `1'، `2' و `3' هستند. تابع _values فهرستهایی از این مقادیر را که با کاما از هم جدا شدهاند کامل خواهد کرد.
مشابه _arguments، این تابع هنگام اجرای action، مؤلفهٔ نام زمینهٔ (context name component) دیگری را موقتاً به مؤلفهٔ آرگومانها (عنصر پنجم) در زمینهٔ جاری اضافه میکند. در اینجا این نام صرفاً نام مقداری است که آرگومانش در حال تکمیل است.
سبک verbose برای تصمیمگیری دربارهٔ این موضوع استفاده میشود که آیا توضیحات مقادیر (اما نه توضیحات آرگومانها) چاپ شوند یا خیر.
آرایهٔ انجمنی val_args برای گزارش مقادیر و آرگومانهای آنها به کار میرود؛ این سازوکار مشابه آرایهٔ انجمنی opt_args است که توسط _arguments استفاده میشود. بنابراین تابعی که _values را فراخوانی میکند، باید پارامترهای محلی state، state_descr، line، context و val_args را اعلان کند:
local context state state_descr line typeset -A val_args
هنگام استفاده از عملیاتی به صورت `->string'. با این تابع، پارامتر context بر روی نام مقداری که آرگومان آن باید کامل شود تنظیم خواهد شد. توجه داشته باشید که برای _values، متغیرهای state و state_descr به جای آرایه، اسکالر هستند. تنها یک حالت منطبق برگردانده میشود.
همچنین توجه داشته باشید که _values معمولاً نویسهای را که بهعنوان جداکننده میان مقادیر استفاده شده، بهصورت یک پسوند با قابلیت حذف خودکار (مشابه یک `/' پس از یک دایرکتوری) میافزاید. با این حال، این امر برای عملیات `->string' ممکن نیست زیرا تطابقهای مربوط به آرگومان توسط تابع فراخواننده تولید میشوند. برای دستیابی به رفتار معمول، تابع فراخواننده میتواند با ارسال گزینههای `-qS x' چه بهطور مستقیم و چه غیرمستقیم به compadd، جداکنندهٔ x را بهعنوان یک پسوند اضافه کند.
گزینهٔ -C به همان روشی مدیریت میشود که در _arguments رفتار میشود. در آن صورت، پارامتر curcontext باید بهجای context محلی گردد (همانطور که در بالا شرح داده شد).
- _wanted [ -x ] [ -C name ] [ -12VJ ] tag name descr command [ arg ...]
- در بسیاری از زمینهها، تکمیل تنها میتواند یک مجموعهٔ خاص از تطابقها را تولید کند، که معمولاً با یک برچسب (tag) منفرد مطابقت دارد. با این حال، همچنان لازم است مشخص شود که آیا کاربر به تطابقهایی از این نوع نیاز دارد یا خیر. این تابع در چنین مواردی مفید است.
آرگومانهای _wanted مشابه آرگومانهای _requested هستند، یعنی آرگومانهایی که باید به _description منتقل شوند. با این حال، در این حالت دستور command اختیاری نیست؛ تمام پردازش برچسبها، شامل پیمایش روی تگها و برچسبهای تگ (tag labels) و تولید تطابقها، بهطور خودکار توسط _wanted انجام میشود.
بنابراین برای ارائهٔ تنها یک برچسب و افزودن فوری تطابقهای متناظر با شرح دادهشده:
local expl
_wanted tag expl 'description' \
compadd -- match1 match2...
همچنین به کاربرد _wanted در تابع نمونه در زیربخش `Dynamic named directories' در zshexpn(1) نگاه کنید.
توجه داشته باشید که همانند _requested، دستور command باید قادر به پذیرش گزینههایی باشد که به compadd پاس داده میشوند.
مشابه _tags، این تابع از گزینهٔ -C برای مشخص کردن نامی متفاوت برای فیلد زمینهٔ آرگومان پشتیبانی میکند. گزینهٔ -x نیز همان مفهومی را دارد که برای _description دارد.
- _widgets [ -g pattern ]
- این تابع نامهای ویجتهای zle را کامل میکند (بخش `Widgets' را در zshzle(1) ببینید). الگوی pattern در صورت وجود، در برابر مقادیر پارامتر ویژهٔ $widgets تطبیق داده میشود که در بخش `The zsh/zleparameter Module' در zshmodules(1) مستند شده است.
تعدادی متغیر استاندارد وجود دارند که توسط تابع _main_complete مقداردهی اولیه شده و سپس توسط توابع دیگر استفاده میشوند.
متغیرهای استاندارد عبارتند از:
- _comp_caller_options
- سیستم تکمیل از setopt برای تنظیم تعدادی گزینه استفاده میکند. این امر اجازه میدهد تا توابع بدون نگرانی در مورد سازگاری با هر ترکیب ممکنی از گزینههای کاربر نوشته شوند. با این حال، گاهی اوقات سیستم تکمیل باید بداند که ترجیحات گزینهای کاربر چه هستند. این موارد در آرایهٔ انجمنی _comp_caller_options ذخیره میشوند. نام گزینهها، که با حروف کوچک و بدون خط زیرین (underscore) نوشته میشوند، به یکی از دو رشتهٔ `on' یا `off' نگاشت میشوند.
- _comp_priv_prefix
- توابع تکمیل مانند _sudo میتوانند آرایهٔ _comp_priv_prefix را روی یک پیشوند دستوری تنظیم کنند که ممکن است سپس توسط _call_program برای تطبیق مجوزها هنگام فراخوانی برنامهها جهت تولید موارد منطبق استفاده شود.
دو قابلیت دیگر توسط تابع _main_complete ارائه میشود. آرایههای compprefuncs و comppostfuncs ممکن است حاوی نام توابعی باشند که باید بلافاصله قبل یا بعد از تلاش برای تکمیل فراخوانی شوند. یک تابع فقط یک بار فراخوانی خواهد شد مگر اینکه صراحتاً خود را مجدداً درون آرایه درج کند.
دایرکتوریهای تکمیل (COMPLETION DIRECTORIES)
در توزیع کد منبع، فایلها در زیرشاخههای مختلفی از دایرکتوری Completion قرار دارند. آنها ممکن است با همان ساختار، یا درون یک دایرکتوری واحد برای توابع نصب شده باشند. آنچه در ادامه میآید، توصیفی از فایلهای موجود در ساختار دایرکتوری اصلی است. اگر میخواهید یک فایل نصبشده را تغییر دهید، باید آن را در دایرکتوریای کپی کنید که در fpath شما قبل از دایرکتوری استانداردی که فایل در آن قرار دارد ظاهر شود.
- Base
- توابع اصلی و ویجتهای ویژهٔ تکمیل که بهطور خودکار به کلیدها مقید (bind) شدهاند. شما قطعاً به بیشتر این موارد نیاز خواهید داشت، اگرچه احتمالاً نیازی به تغییر دادن آنها نخواهید داشت. بسیاری از این موارد در بالا مستند شدهاند.
- Zsh
- توابعی برای تکمیل آرگومانهای دستورهای داخلی (builtin) پوسته و توابع کمکی برای این منظور. برخی از اینها توسط توابع موجود در دایرکتوری Unix نیز استفاده میشوند.
- Unix
- توابعی برای تکمیل آرگومانهای دستورهای خارجی و مجموعههایی از دستورها. ممکن است نیاز باشد این توابع برای سیستم شما اصلاح شوند، اگرچه در بسیاری از موارد تلاشی صورت میگیرد تا مشخص شود کدام نسخه از یک دستور موجود است. برای مثال، تکمیل برای دستور mount سعی میکند سیستمی را که بر روی آن اجرا میشود تعیین کند، در حالی که تکمیل برای بسیاری از ابزارهای دیگر سعی میکند تشخیص دهد آیا نسخهٔ GNU از دستور در حال استفاده است یا خیر، و بنابراین آیا گزینهٔ --help پشتیبانی میشود یا نه.
- X، AIX، BSD، ...
- توابع تکمیل و کمکی برای دستورهایی که تنها روی برخی سیستمها در دسترس هستند. این موارد به صورت سلسلهمراتبی مرتب نشدهاند، بنابراین برای مثال، هر دو دایرکتوری Linux و Debian، و همچنین دایرکتوری X، ممکن است بر روی سیستم شما مفید باشند.
| July 12, 2026 | zsh 5.9.2 |