| ZSHCONTRIB(1) | General Commands Manual | ZSHCONTRIB(1) |
نام (NAME)
zshcontrib - مشارکتهای کاربران در zsh
توضیحات (DESCRIPTION)
توزیع سورسکد Zsh شامل مواردی است که توسط جامعه کاربران مشارکت شده است. این موارد ذاتاً بخشی از پوسته نیستند و ممکن است برخی از آنها در هر نصب zsh در دسترس نباشند. مهمترین این موارد در اینجا مستند شدهاند. برای مستندات مربوط به سایر موارد مشارکتشده مانند توابع پوسته، به کامنتهای موجود در فایلهای منبع توابع مراجعه کنید.
ابزارها (UTILITIES)
دسترسی به راهنمای برخط (Accessing On-Line Help)
دنباله کلیدهای ESC h معمولاً توسط ZLE برای اجرای ابزارک run-help مقید (bind) شده است (به zshzle(1) مراجعه کنید). این کار دستور run-help را با کلمه دستوری خط ورودی فعلی به عنوان آرگومان آن فراخوانی میکند. بهطور پیشفرض، run-help یک نام مستعار (alias) برای دستور man است، بنابراین هنگامی که کلمه دستوری یک دستور توکار پوسته یا یک تابع تعریفشده توسط کاربر باشد، اغلب با شکست مواجه میشود. با بازتعریف نام مستعار run-help، میتوان راهنمای برخط ارائهشده توسط پوسته را بهبود بخشید.
ابزار helpfiles، موجود در دایرکتوری Util توزیع، برنامهای به زبان Perl است که میتواند برای پردازش راهنمای zsh جهت تولید یک فایل راهنمای جداگانه برای هر دستور توکار پوسته و همچنین بسیاری از دیگر ویژگیهای پوسته استفاده شود. تابع با قابلیت بارگذاری خودکار (autoloadable) run-help، موجود در Functions/Misc، این فایلهای راهنما را جستجو کرده و چندین بررسی دیگر را انجام میدهد تا کاملترین راهنمای ممکن را برای دستور تولید کند.
فایلهای راهنما بهطور پیشفرض در زیردایرکتوری از /usr/share/zsh یا /usr/local/share/zsh نصب میشوند.
برای ایجاد فایلهای راهنمای اختصاصی با helpfiles، دایرکتوریای را که فایلهای راهنمای هر دستور در آن قرار خواهند گرفت، انتخاب یا ایجاد کنید. برای مثال، میتوانید ~/zsh_help را انتخاب کنید. اگر توزیع zsh را در دایرکتوری خانگی خود استخراج کردهاید، از این دستورات استفاده کنید:
mkdir ~/zsh_help perl ~/zsh-5.9.2/Util/helpfiles ~/zsh_help
پارامتر HELPDIR به run-help میگوید در کجا به دنبال فایلهای راهنما بگردد. در صورت تنظیم نشدن، از مسیر نصب پیشفرض استفاده میکند. برای استفاده از مجموعه فایلهای راهنمای خود، این متغیر را در یکی از فایلهای راهاندازی (startup) خود بر روی مسیر مناسب تنظیم کنید:
HELPDIR=~/zsh_help
برای استفاده از تابع run-help، باید خطوطی شبیه به موارد زیر را به .zshrc یا فایل راهاندازی معادل خود اضافه کنید:
unalias run-help autoload run-help
توجه داشته باشید که برای کارکرد `autoload run-help`، فایل run-help باید در یکی از دایرکتوریهای مشخصشده در آرایه fpath شما قرار داشته باشد (به zshparam(1) مراجعه کنید). در یک نصب استاندارد zsh باید چنین باشد؛ اگر اینطور نیست، Functions/Misc/run-help را در یک دایرکتوری مناسب کپی کنید.
کامپایل مجدد توابع (Recompiling Functions)
اگر مرتباً توابع zsh خود را ویرایش میکنید یا برای پیگیری آخرین تغییرات، نصب zsh خود را به صورت دورهای بهروزرسانی میکنید، ممکن است متوجه شوید که فایلهای چکیده توابع (function digests) کامپایلشده با دستور توکار zcompile نسبت به فایلهای منبع توابع، اغلب منسوخ و قدیمی میشوند. این موضوع معمولاً مشکلی ایجاد نمیکند، زیرا zsh هنگام بارگذاری یک تابع همیشه به دنبال جدیدترین فایل میگردد، اما ممکن است باعث کندتر شدن راهاندازی پوسته و بارگذاری توابع شود. همچنین اگر یک فایل دایجست صریحاً به عنوان عنصری از fpath استفاده شده باشد، zsh بررسی نخواهد کرد که آیا هیچیک از فایلهای منبع آن تغییر کردهاند یا خیر.
تابع قابل بارگذاری خودکار zrecompile، موجود در Functions/Misc، میتواند برای بهروز نگه داشتن فایلهای دایجست توابع استفاده شود.
- zrecompile [ -qt ] [ name ... ]
- zrecompile [ -qt ] -p arg ... [ -- arg ... ]
- این ابزار تلاش میکند فایلهای *.zwc را پیدا کرده و در صورتی که حداقل یکی از فایلهای اصلی از فایل کامپایلشده جدیدتر باشد، آنها را بهطور خودکار دوباره کامپایل کند. این قابلیت تنها در صورتی عمل میکند که نامهای ذخیرهشده در فایلهای کامپایلشده، مسیرهای کامل باشند یا نسبت به دایرکتوریِ حاوی فایل .zwc نسبی باشند.
در فرم اول، هر name نام یک فایل کامپایلشده یا دایرکتوری شامل فایلهای *.zwc است که باید بررسی شوند. اگر هیچ آرگومانی داده نشود، دایرکتوریها و فایلهای *.zwc موجود در fpath استفاده میشوند.
هنگامی که -t داده شود، هیچ کامپایلی انجام نمیشود، اما اگر فایلهایی وجود داشته باشند که نیاز به کامپایل مجدد دارند، وضعیت خروج صفر (درست) و در غیر این صورت غیرصفر (نادرست) تنظیم میشود. گزینه -q خروجیهای تفصیلی را که اقدامات zrecompile را شرح میدهند، بیصدا میکند.
بدون گزینه -t، وضعیت خروج در صورتی صفر است که تمام فایلهای نیازمند کامپایل مجدد با موفقیت کامپایل شوند، و اگر کامپایل حداقل یکی از فایلها با شکست مواجه شود، غیرصفر خواهد بود.
اگر گزینه -p داده شود، argها به عنوان یک یا چند مجموعه آرگومان برای zcompile تفسیر میشوند که با `--` از یکدیگر جدا شدهاند. برای مثال:
zrecompile -p \
-R ~/.zshrc -- \
-M ~/.zcompdump -- \
~/zsh/comp.zwc ~/zsh/Completion/*/_*
این دستور در صورتی که ~/.zshrc.zwc وجود نداشته باشد یا از ~/.zshrc قدیمیتر باشد، ~/.zshrc را به ~/.zshrc.zwc کامپایل میکند. فایل کامپایلشده به جای نگاشت (mapping)، برای خواندن علامتگذاری خواهد شد. همین عمل برای ~/.zcompdump و ~/.zcompdump.zwc انجام میشود، اما این فایل کامپایلشده برای نگاشت نشانهگذاری میگردد. آخرین خط در صورتی که هر یک از فایلهای منطبق با الگوی ارائهشده از آن جدیدتر باشند، فایل ~/zsh/comp.zwc را مجدداً ایجاد میکند.
بدون گزینه -p، دستور zrecompile فایلهای دایجست تابعی را که از قبل وجود ندارند ایجاد نمیکند، و همچنین توابع جدید را به فایل دایجست اضافه نخواهد کرد.
حلقه پوسته زیر، نمونهای از روشی برای ایجاد خلاصههای توابع برای تمام توابع موجود در fpath شما است، با این فرض که دسترسی نوشتن در آن دایرکتوریها را داشته باشید:
for ((i=1; i <= $#fpath; ++i)); do
dir=$fpath[i]
zwc=${dir:t}.zwc
if [[ $dir == (.|..) || $dir == (.|..)/* ]]; then
continue
fi
files=($dir/*(N-.))
if [[ -w $dir:h && -n $files ]]; then
files=(${${(M)files%/*/*}#/})
if ( cd $dir:h &&
zrecompile -p -U -z $zwc $files ); then
fpath[i]=$fpath[i].zwc
fi
fi
done
گزینههای -U و -z برای توابع موجود در fpath پیشفرضِ نصب zsh مناسب هستند؛ ممکن است برای دایرکتوریهای توابع شخصی خود نیاز به استفاده از گزینههای متفاوتی داشته باشید.
هنگامی که دایجستها ایجاد شدند و fpath شما برای ارجاع به آنها تغییر یافت، میتوانید با اجرای zrecompile بدون هیچ آرگومانی، آنها را بهروز نگه دارید.
تعداد بسیار زیاد ترکیبهای ممکن از صفحهکلیدها، ایستگاههای کاری، پایانهها، شبیهسازها و سیستمهای پنجرهای، باعث میشود zsh نتواند مقیدسازیهای پیشساخته کلیدها را برای هر وضعیتی در خود داشته باشد. ابزار کاربردی zkbd، واقع در Functions/Misc، میتواند به شما کمک کند تا سریعاً برای پیکربندی خود مقیدسازیهای کلید را بسازید.
ابزار zkbd را یا به عنوان یک تابع خودبارگذاریشونده (autoloaded)، یا به شکل یک اسکریپت پوسته اجرا کنید:
zsh -f ~/zsh-5.9.2/Functions/Misc/zkbd
هنگامی که zkbd را اجرا میکنید، ابتدا از شما میخواهد که نوع پایانه خود را وارد کنید؛ اگر مقدار پیشفرضی که پیشنهاد میدهد صحیح است، کافی است کلید return را فشار دهید. سپس از شما میخواهد تعدادی کلید مختلف را بفشارید تا مشخصات صفحهکلید و پایانه شما را تشخیص دهد؛ zkbd در صورتی که با موردی غیرعادی برخورد کند به شما هشدار میدهد، مانند کلید Delete که نه ^H و نه ^? را ارسال میکند.
کلیدهای فشردهشدهای که توسط zkbd خوانده میشوند، به عنوان تعریفی برای یک آرایه انجمنی به نام key ثبت شده و در فایلی در زیرپوشه .zkbd درون دایرکتوری HOME یا ZDOTDIR شما نوشته میشوند. نام این فایل از پارامترهای TERM، VENDOR و OSTYPE تشکیل میشود که با خط تیره (hyphen) به هم متصل شدهاند.
شما میتوانید این فایل را با دستورات «source» یا «.» در .zshrc یا یک فایل راهاندازی دیگر بخوانید، و سپس به پارامتر key در دستورات bindkey ارجاع دهید، مانند این:
source ${ZDOTDIR:-$HOME}/.zkbd/$TERM-$VENDOR-$OSTYPE
[[ -n ${key[Left]} ]] && bindkey "${key[Left]}" backward-char
[[ -n ${key[Right]} ]] && bindkey "${key[Right]}" forward-char
# etc.
توجه داشته باشید که برای کارکردن «autoload zkbd»، فایل zkdb باید در یکی از دایرکتوریهای مشخصشده در آرایه fpath شما قرار داشته باشد (به zshparam(1) مراجعه کنید). اگر یک نصب استاندارد zsh را دارید، این مورد از پیش برقرار است؛ در غیر این صورت، Functions/Misc/zkbd را در یک دایرکتوری مناسب کپی کنید.
تخلیه وضعیت پوسته (Dumping Shell State)
گاهی اوقات ممکن است با چیزی مواجه شوید که به نظر یک باگ در پوسته میآید، بهویژه اگر از نسخه بتا یا یک نسخه توسعه zsh استفاده میکنید. معمولاً ارسال شرح مشکل به یکی از فهرستهای پستی zsh کافی است (به zsh(1) مراجعه کنید)، اما گاهی اوقات یکی از توسعهدهندگان zsh نیاز خواهد داشت که برای ردیابی مشکل، محیط شما را بازسازی کند.
اسکریپتی به نام reporter، واقع در دایرکتوری Util توزیع، برای این منظور ارائه شده است. (امکان اجرای autoload reporter نیز وجود دارد، اما reporter به طور پیشفرض در fpath نصب نشده است.) این اسکریپت خروجی تخلیه مفصلی از وضعیت پوسته را در قالب اسکریپت دیگری تولید میکند که میتوان آن را با «zsh -f» خواند تا آن وضعیت دوباره بازسازی شود.
برای استفاده از reporter، اسکریپت را با دستور «.» در پوسته خود بخوانید و خروجی را به یک فایل هدایت کنید:
. ~/zsh-5.9.2/Util/reporter > zsh.report
شما باید فایل zsh.report را برای هرگونه اطلاعات حساس مانند گذرواژهها بررسی کرده و قبل از ارسال اسکریپت به توسعهدهندگان، آنها را به صورت دستی حذف کنید. همچنین، از آنجا که خروجی ممکن است بسیار حجیم باشد، بهتر است منتظر بمانید تا توسعهدهندگان این اطلاعات را درخواست کنند و سپس آن را بفرستید.
همچنین میتوانید از reporter برای تخلیه تنها زیرمجموعهای از وضعیت پوسته استفاده کنید. این کار گاهی برای ایجاد فایلهای راهاندازی برای نخستین بار مفید است. بیشتر خروجی reporter بسیار مفصلتر از آن چیزی است که معمولاً برای یک فایل راهاندازی نیاز است، اما وضعیتهای aliases، options و zstyles ممکن است مفید باشند، زیرا فقط تغییرات نسبت به مقادیر پیشفرض را شامل میشوند. وضعیت bindings در صورتی که نگاشتهای کلید اختصاصی خود را ساخته باشید ممکن است مفید باشد، زیرا reporter دستورات ایجاد نگاشت کلید و همچنین مقیدسازیهای هر نگاشت کلید را خروجی میدهد.
همانطور که در مورد ابزارهای خودکار معمول است، اگر با reporter یک فایل راهاندازی ایجاد میکنید، باید نتایج را برای حذف دستورات غیرضروری ویرایش کنید. توجه داشته باشید که در صورت استفاده از سیستم تکمیل جدید، نباید وضعیت functions را با reporter در فایلهای راهاندازی خود تخلیه کنید؛ در عوض از تابع compdump استفاده کنید (به zshcompsys(1) مراجعه کنید).
- reporter [ state ... ]
- زیرمجموعه مشخصشده از وضعیت فعلی پوسته را در خروجی استاندارد چاپ میکند. آرگومانهای state میتوانند یک یا چند مورد از موارد زیر باشند:
- all
- تمام موارد فهرستشده در زیر را در خروجی قرار میدهد.
- aliases
- تعاریف alias را خروجی میدهد.
- bindings
- نگاشتهای کلید و مقیدسازیهای ZLE را خروجی میدهد.
- completion
- دستورات سبک قدیمی compctl را خروجی میدهد. تکمیل جدید توسط functions و zstyles پوشش داده میشود.
- functions
- بارگذاریهای خودکار (autoloads) و تعاریف توابع را خروجی میدهد.
- limits
- دستورات limit را خروجی میدهد.
- options
- دستورات setopt را خروجی میدهد.
- styles
- مشابه zstyles.
- variables
- مقداردهی پارامترهای پوسته، به علاوه دستورات export برای متغیرهای محیطی را خروجی میدهد.
- zstyles
- دستورات zstyle را خروجی میدهد.
اگر state حذف شود، all در نظر گرفته میشود.
به استثنای «all»، هر state میتواند با هر پیشوندی خلاصه شود، حتی یک حرف منفرد؛ بنابراین a همان aliases است، z همان zstyles است، و غیره.
- add-zsh-hook [ -L | -dD ] [ -Uzk ] hook function
- چندین تابع برای پوسته خاص هستند، همانطور که در بخش SPECIAL FUNCTIONS، ببینید zshmisc(1)، شرح داده شده است، از این جهت که در نقاط مشخصی در طول اجرای پوسته بهطور خودکار فراخوانی میشوند. هر یک دارای یک آرایهٔ مرتبط متشکل از نام توابعی است که باید در همان نقطه فراخوانی شوند؛ اینها اصطلاحاً `hook functions' (توابع قلاب) نامیده میشوند. تابع پوستهٔ add-zsh-hook روشی ساده برای افزودن یا حذف توابع از این آرایه فراهم میکند.
آرگومان hook یکی از توابع خاص مورد نظر شامل chpwd، periodic، precmd، preexec، zshaddhistory، zshexit یا zsh_directory_name است. توجه داشته باشید که zsh_directory_name به روش متفاوتی نسبت به سایر توابع فراخوانی میشود، اما همچنان میتواند بهعنوان یک قلاب دستکاری شود.
آرگومان function نام یک تابع عادی پوسته است. اگر هیچ گزینهای داده نشود، این تابع به آرایهٔ توابعی که باید در بافت دادهشده اجرا شوند اضافه خواهد شد. توابع به ترتیبی که اضافه شدهاند فراخوانی میشوند.
اگر گزینهٔ -L داده شود، مقادیر فعلی آرایههای قلاب با typeset فهرست میشوند.
اگر گزینهٔ -d داده شود، تابع function از آرایهٔ توابعی که باید اجرا شوند حذف میشود.
اگر گزینهٔ -D داده شود، با function مانند یک الگو رفتار میشود و هر نام تابع مطابقی از آرایهٔ توابعی که باید اجرا شوند حذف خواهد شد.
گزینههای -U، -z و -k بهعنوان آرگومان برای function به autoload فرستاده میشوند. برای توابعی که همراه با zsh ارائه میشوند، گزینههای -Uz مناسب هستند.
- add-zle-hook-widget [ -L | -dD ] [ -Uzk ] hook widgetname
- چندین نام ابزارک برای ویرایشگر خط خاص هستند، همانطور که در بخش Special Widgets، ببینید zshzle(1)، شرح داده شده است، از این جهت که در نقاط مشخصی در طول ویرایش بهطور خودکار فراخوانی میشوند. برخلاف قلابهای توابع، اینها از یک آرایهٔ از پیش تعریفشده از نامهای دیگر برای فراخوانی در همان نقطه استفاده نمیکنند؛ تابع پوستهٔ add-zle-hook-widget آرایهای مشابه را نگهداری کرده و شرایطی را فراهم میکند تا ابزارک خاص آن ابزارکهای اضافی را فراخوانی کند.
آرگومان hook یکی از موارد isearch-exit، isearch-update، line-pre-redraw، line-init، line-finish، history-line-set، یا keymap-select است که متناظر با هر یک از ابزارکهای خاص zle-isearch-exit و غیره میباشند. نام ابزارکهای خاص نیز بهعنوان آرگومان hook پذیرفته میشوند.
آرگومان widgetname نام یک ابزارک ZLE است. اگر هیچ گزینهای داده نشود، این ابزارک به آرایهٔ ابزارکهایی که باید در بافت قلاب دادهشده فراخوانی شوند اضافه میشود. ابزارکها به ترتیبی که افزوده شدهاند فراخوانی میشوند، با
zle widgetname -Nw -f "nolast" -- "$@"
توجه داشته باشید که این بدان معناست که پارامتر ویژهٔ `WIDGET' هنگام فراخوانی تابع ابزارک، بهجای ردگیری نام ابزارک قلاب خاص متناظر، widgetname را ردگیری میکند.
اگر گزینهٔ -d داده شود، widgetname از آرایهٔ ابزارکهایی که باید اجرا شوند حذف میشود.
اگر گزینهٔ -D داده شود، با widgetname مانند یک الگو رفتار میشود و هر نام ابزارک مطابق از آرایه حذف خواهد شد.
اگر widgetname هنگام افزوده شدن به آرایه نام یک ابزارک موجود نباشد، فرض میشود که یک تابع پوسته نیز با نام widgetname قرار است پیادهسازی این ابزارک را فراهم کند. بنابراین این نام برای بارگذاری خودکار نشانهگذاری میشود، و گزینههای -U، -z و -k همانند add-zsh-hook بهعنوان آرگومان به autoload فرستاده میشوند. ابزارک همچنین با `zle -N widgetname' ایجاد میشود تا باعث شود تابع متناظر در نخستین باری که قلاب فراخوانی میشود بارگذاری گردد.
آرایههای widgetname در حال حاضر در بافتهای zstyle نگهداری میشوند، یکی برای هر بافت hook، با سبکی از `widgets'. اگر گزینهٔ -L داده شود، این مجموعه از سبکها با `zstyle -L' فهرست میشوند. این پیادهسازی ممکن است تغییر کند، و ابزارکهای خاصی که به این سبکها ارجاع دارند تنها در صورتی ایجاد میشوند که add-zle-hook-widget برای افزودن حداقل یک ابزارک فراخوانی شده باشد؛ بنابراین اگر از این تابع برای هر قلابی استفاده شود، تمام قلابها باید منحصراً از طریق همین تابع مدیریت شوند.
تابع cdr به شما امکان میدهد دایرکتوری کاری را به یکی از دایرکتوریهای کاری قبلی از فهرستی که بهطور خودکار نگهداری میشود، تغییر دهید. این مفهوم مشابه پشتهٔ دایرکتوری است که توسط توابع توکار pushd، popd و dirs کنترل میشود، اما قابلیت پیکربندی بیشتری دارد و از آنجا که تمام ورودیها را در فایلها ذخیره میکند، در بین نشستهای مختلف و (بهطور پیشفرض) بین شبیهسازهای ترمینال در نشست جاری حفظ میشود. موارد تکراری بهطور خودکار حذف میشوند تا فهرست، آخرین استفاده از هر دایرکتوری را منعکس کند.
توجه داشته باشید که پشتهٔ دایرکتوری pushd در واقع توسط cdr تغییر داده نشده یا استفاده نمیشود، مگر اینکه آن را مطابق توضیحات بخش پیکربندی در زیر، برای این کار پیکربندی کرده باشید.
نصب (Installation)
این سازوکار به کمک یک تابع قلاب (hook function) کار میکند که هر بار با تغییر دایرکتوری فراخوانی میشود. برای نصب این سیستم، توابع مورد نیاز را autoload کرده و از تابع add-zsh-hook که در بالا توضیح داده شد استفاده کنید:
autoload -Uz chpwd_recent_dirs cdr add-zsh-hook add-zsh-hook chpwd chpwd_recent_dirs
اکنون هر بار که دایرکتوری را بهصورت تعاملی تغییر دهید، بدون توجه به اینکه از چه دستوری استفاده میکنید، دایرکتوریای که به آن وارد میشوید به ترتیب از جدیدترین به قدیمیترین بهخاطر سپرده خواهد شد.
استفاده (Use)
تمام تعامل مستقیم کاربر از طریق تابع cdr انجام میشود.
آرگومان ورودی cdr یک عدد N متناظر با Nامین دایرکتوری است که اخیراً به آن وارد شدهاید. عدد 1 دایرکتوری بلافاصله قبلی است؛ دایرکتوری جاری بهخاطر سپرده میشود اما به عنوان مقصد پیشنهاد داده نمیشود. توجه داشته باشید که اگر چندین پنجره باز داشته باشید، عدد 1 ممکن است به دایرکتوری تغییریافته در پنجرهای دیگر اشاره کند؛ شما میتوانید با استفاده از فایلهای مجزا به ازای هر ترمینال برای ذخیره دایرکتوری، مطابق آنچه در شیوهٔ recent-dirs-file در زیر توضیح داده شده است، از این مسئله جلوگیری کنید.
اگر شیوهٔ recent-dirs-default توضیحدادهشده در زیر را تنظیم کنید، در صورت ارائه یک آرگومان غیرعددی یا بیش از یک آرگومان، cdr رفتاری مشابه با cd خواهد داشت. با هر روشی که دایرکتوری را تغییر دهید، فهرست دایرکتوریهای اخیر به همان صورت بهروزرسانی میشود.
در صورت حذف آرگومان، مقدار 1 فرض میشود. این رفتار شبیه به رفتار pushd در جابجایی دو دایرکتوری اخیر روی پشته است.
تکمیل خودکار (completion) برای آرگومان cdr در صورتی که compinit اجرا شده باشد در دسترس است؛ انتخاب منویی پیشنهاد میشود، با استفاده از:
zstyle ':completion:*:*:cdr:*:*' menu selection
تا به شما اجازه دهد بین دایرکتوریهای اخیر پیمایش کنید؛ ترتیب حفظ میشود، بنابراین اولین انتخاب جدیدترین دایرکتوری قبل از دایرکتوری فعلی است. شیوهٔ verbose نیز برای اطمینان از نمایش دایرکتوری توصیه میشود؛ این سبک بهطور پیشفرض فعال است، بنابراین نیازی به انجام کاری نیست مگر اینکه آن را تغییر داده باشید.
گزینهها (Options)
رفتار cdr ممکن است با گزینههای زیر تغییر داده شود.
- -l
- شمارهها و دایرکتوریهای متناظر را به صورت کوتاه شده (یعنی با اعمال مجدد جایگزینی ~)، در هر سطر یکی فهرست میکند. دایرکتوریها در اینجا درون علامت نقلقول قرار نمیگیرند (این موضوع تنها زمانی ایجاد اشکال میکند که نام یک دایرکتوری شامل نویسهٔ خط جدید باشد). این گزینه توسط سیستم تکمیل خودکار استفاده میشود.
- -r
- متغیر reply را روی مجموعه دایرکتوریهای جاری تنظیم میکند. چیزی چاپ نمیشود و دایرکتوری تغییر نمیکند.
- -e
- به شما امکان میدهد فهرست دایرکتوریها را، در هر سطر یکی، ویرایش کنید. این فهرست به هر میزانی که مایل باشید قابل ویرایش است؛ هیچ بررسی درستیسنجی (sanity check) انجام نمیشود. تکمیل خودکار در دسترس است. نیازی به نقلقولگذاری نیست (بهجز خطوط جدید که در هر حال پشتیبانی نمیشوند)؛ دایرکتوریها به صورت کامل و غیرمخفف بوده و حاوی مسیر مطلق هستند، یعنی با / شروع میشوند. معمولاً ورودی اول باید به عنوان دایرکتوری فعلی باقی بماند.
- -p 'pattern'
- تمام مواردی از فهرست دایرکتوریها را که با الگوی glob گسترشیافتهٔ مشخصشده مطابقت داشته باشند هرس (حذف) میکند؛ الگو باید درون علامت نقلقول قرار گیرد تا از بسط فوری آن در خط فرمان جلوگیری شود. الگو در برابر هر نام فایل کاملاً بسطیافته در فهرست مطابقت داده میشود؛ کل رشته باید منطبق شود، بنابراین نویسههای عام (wildcard) در انتها (مثلاً '*removeme*') برای حذف ورودیهای دارای یک زیررشتهٔ معین مورد نیاز هستند.
اگر خروجی به یک ترمینال باشد، تابع فهرست جدید را پس از هرس چاپ کرده و از کاربر تأییدیه میخواهد. از این مرحله خروجی و دریافت تأییدیه میتوان با استفاده از -P به جای -p صرفنظر کرد.
پیکربندی از طریق سازوکار سبکها (styles) انجام میشود که باید از سیستم تکمیل (completion) با آن آشنا باشید؛ در غیر این صورت، توضیحات دستور zstyle را در zshmodules(1) مشاهده کنید. بافت (context) برای تنظیم سبکها باید ':chpwd:*' باشد تا در صورت گسترش معنای بافت در آینده مشکلی پیش نیاید، برای مثال:
zstyle ':chpwd:*' recent-dirs-max 0
مقدار سبک recent-dirs-max را برابر با 0 قرار میدهد. در عمل، نام سبک به اندازهٔ کافی خاص هست که بافت '*' نیز کافی باشد.
یک استثنا recent-dirs-insert است که منحصراً توسط سیستم تکمیل استفاده میشود و از این رو بافت معمول سیستم تکمیل را دارد (اگر بافت خاصتری نیاز نباشد، ':completion:*')، هرچند در عمل باز هم '*' باید مناسب باشد.
- recent-dirs-default
- اگر true باشد و دستور در انتظار یک نمایهٔ دایرکتوری اخیر باشد، و بیش از یک آرگومان وجود داشته باشد یا آرگومان یک عدد صحیح نباشد، به "cd" منتقل (fall through) میشود. این قابلیت به افراد تنبل امکان میدهد تنها از یک دستور برای تغییر دایرکتوری استفاده کنند. سیستم تکمیل نیز این موضوع را تشخیص میدهد؛ برای آگاهی از نحوهٔ کنترل تکمیل هنگام استفاده از این گزینه، recent-dirs-insert را ببینید.
- recent-dirs-file
- فایلی که فهرست دایرکتوریها در آن ذخیره میشود. مقدار پیشفرض ${ZDOTDIR:-$HOME}/.chpwd-recent-dirs است، یعنی در دایرکتوری خانگی (home) شما قرار دارد، مگر اینکه متغیر ZDOTDIR را طوری تنظیم کرده باشید که به جای دیگری اشاره کند. نام دایرکتوریها در قالب نقلقولشدهٔ $'...' ذخیره میشوند، بنابراین هر خط در فایل میتواند مستقیماً به عنوان یک آرگومان به پوسته داده شود.
مقدار این سبک میتواند یک آرایه باشد. در این حالت، نخستین فایل در فهرست همواره برای ذخیرهٔ دایرکتوریها استفاده خواهد شد، در حالی که سایر فایلها دستنخورده باقی میمانند. هنگام خواندن فهرست دایرکتوریهای اخیر، اگر تعداد ورودیها در فایل اول کمتر از بیشینهٔ مجاز باشد، محتویات فایلهای بعدی در آرایه الحاق خواهند شد، به طوری که موارد تکراری از فهرست نمایش دادهشده حذف میشوند. محتویات دو فایل با یکدیگر مرتبسازی نمیشوند، یعنی تمام ورودیهای فایل اول در ابتدا نمایش داده میشوند. مقدار ویژهٔ + میتواند در فهرست ظاهر شود تا نشان دهد فایل پیشفرض باید در آن نقطه خوانده شود. این امر امکان پیادهسازی مواردی مانند مثال زیر را فراهم میکند:
zstyle ':chpwd:*' recent-dirs-file \
~/.chpwd-recent-dirs-${TTY##*/} +
دایرکتوریهای اخیر از فایلی شمارهگذاریشده بر اساس ترمینال خوانده میشوند. اگر تعداد ورودیها کافی نباشد، فهرست با فایل پیشفرض تکمیل میشود.
امکان استفاده از zstyle -e برای پیکربندیپذیر کردن دایرکتوری در زمان اجرا وجود دارد:
zstyle -e ':chpwd:*' recent-dirs-file pick-recent-dirs-file
pick-recent-dirs-file() {
if [[ $PWD = ~/text/writing(|/*) ]]; then
reply=(~/.chpwd-recent-dirs-writing)
else
reply=(+)
fi
}
در این مثال، اگر دایرکتوری جاری ~/text/writing یا دایرکتوری زیر آن باشد، از فایلی ویژه برای ذخیرهٔ دایرکتوریهای اخیر استفاده میشود، وگرنه از پیشفرض استفاده خواهد شد.
- recent-dirs-insert
- توسط سیستم تکمیل استفاده میشود. اگر recent-dirs-default برابر با true باشد، تنظیم این سبک روی true باعث میشود که به جای نمایهٔ دایرکتوری، خودِ دایرکتوری واقعی در خط فرمان درج شود؛ این کار اثری مشابه استفاده از نمایهٔ مربوطه دارد، اما تاریخچه (history) را واضحتر و ویرایش خط را آسانتر میکند. با این تنظیم، چنانچه بخشی از یک آرگومان پیشتر تایپ شده باشد، به جای تکمیل دایرکتوریهای اخیر، تکمیل معمولی دایرکتوری انجام میشود؛ زیرا انتظار میرود تکمیل دایرکتوری اخیر با گردش بین ورودیها به صورت منو انجام گیرد.
اگر مقدار این سبک always باشد، تنها دایرکتوریهای اخیر تکمیل خواهند شد؛ در این صورت، هرگاه میخواهید دایرکتوریهای دیگر را تکمیل کنید از دستور cd استفاده نمایید.
اگر مقدار آن fallback باشد، ابتدا دایرکتوریهای اخیر امتحان میشوند، سپس در صورتی که تکمیل دایرکتوریهای اخیر تطابقی پیدا نکند، تکمیل معمولی دایرکتوری انجام میپذیرد.
در نهایت، اگر مقدار آن both باشد، هر دو مجموعه تکمیلها ارائه میشوند؛ سازوکار معمول برچسبگذاری (tag) میتواند برای تمایز نتایج استفاده شود، به طوری که دایرکتوریهای اخیر با برچسب recent-dirs مشخص میشوند. توجه داشته باشید که دایرکتوریهای اخیر درجشده در صورت لزوم با نام دایرکتوری خلاصه میشوند.
- recent-dirs-max
- بیشینهٔ تعداد دایرکتوریهایی که باید در فایل ذخیره شوند. اگر این مقدار صفر یا منفی باشد، بیشینهای وجود نخواهد داشت. مقدار پیشفرض 20 است. توجه داشته باشید که این تعداد شامل دایرکتوری جاری نیز میشود، که ارائه نمیگردد، بنابراین بیشترین تعداد دایرکتوریهایی که به شما پیشنهاد خواهد شد یکی کمتر از مقدار بیشینه است.
- recent-dirs-prune
- این سبک یک آرایه است که تعیین میکند چه دایرکتوریهایی باید (یا نباید) به فهرست موارد اخیر افزوده شوند. عناصر این آرایه میتوانند شامل موارد زیر باشند:
- parent
- هرس کردن (حذف) والدها (به طور دقیقتر، اجداد) از فهرست اخیر. اگر مشخص شود، جابجایی مستقیم به پایین به هر تعداد دایرکتوری باعث میشود دایرکتوری جاری رونویسی شود. برای مثال، تغییر از ~pws به ~pws/some/other/dir باعث میشود ~pws در پشتهٔ دایرکتوریهای اخیر باقی نماند. این فقط برای تغییر مستقیم به دایرکتوریهای نسل بعدی (فرزندان) اعمال میشود؛ دایرکتوریهای قبلی در فهرست هرس نمیشوند. به عنوان نمونه، جابجایی از ~pws/yet/another به ~pws/some/other/dir باعث هرس شدن ~pws نمیشود.
- pattern:pattern
- یک الگوی zsh برای دایرکتوریهایی که نباید به فهرست اخیر اضافه شوند (در صورتی که از قبل آنجا نباشند) مشخص میکند. این عنصر را میتوان برای افزودن الگوهای مختلف تکرار کرد. برای مثال، 'pattern:/tmp(|/*)' مانع از اضافه شدن /tmp یا زیرشاخههای آن میشود. گزینهٔ EXTENDED_GLOB همواره برای این الگوها فعال است.
- recent-dirs-pushd
- اگر روی true تنظیم شود، cdr برای تغییر دایرکتوری به جای cd از pushd استفاده خواهد کرد، بنابراین دایرکتوری در پشتهٔ دایرکتوری ذخیره میشود. از آنجا که پشتهٔ دایرکتوری کاملاً از فهرست فایلهای ذخیرهشده توسط سازوکار استفادهشده در این فایل مجزاست، دلیل مشخصی برای انجام این کار وجود ندارد.
میتوان با استفاده از نحو نامگذاری پویای دایرکتوری و با بهکارگیری تابع ارائهشدهٔ zsh_directory_name_cdr به عنوان یک قلاب (hook)، به دایرکتوریهای اخیر ارجاع داد:
autoload -Uz add-zsh-hook add-zsh-hook -Uz zsh_directory_name zsh_directory_name_cdr
پس از انجام این کار، ~[1] به تازهترین دایرکتوری به جز $PWD ارجاع خواهد داد، و به همین ترتیب. تکمیل خودکار پس از ~[... نیز کار میکند.
جزئیات مدیریت دایرکتوری
این بخش برای افراد کنجکاو یا سردرگم است؛ بیشتر کاربران نیازی به دانستن این اطلاعات نخواهند داشت.
دایرکتوریهای اخیر بلافاصله در یک فایل ذخیره میشوند و بنابراین در میان نشستها حفظ میگردند. توجه داشته باشید که در حال حاضر هیچ قفلگذاری روی فایلی اعمال نمیشود: این فهرست بلافاصله هنگام اجرای دستورهای تعاملی و نه در هیچ جای دیگری بهروزرسانی میشود (برخلاف تاریخچه)، و فرض بر این است که شما در هر زمان تنها در یک پنجره دایرکتوری را تغییر میدهید. این سازوکار در حسابهای کاربری اشتراکی امن نیست، اما در هر حال زمانی که شخص دیگری بدون اطلاع شما به مجموعهای متفاوت از دایرکتوریها میرود، سامانه کاربرد محدودی دارد.
برای ایمنتر کردن این فرایند، تنها تغییرات دایرکتوری که از خط فرمان آغاز شده باشند—چه به صورت مستقیم و چه غیرمستقیم از طریق فراخوانی توابع شل (اما نه از طریق زیرشلها (subshells)، evals، traps، توابع تکمیل و مانند آنها)—ذخیره میشوند. در صورتی که قرار است تغییر دایرکتوری در خط فرمان نامرئی بماند، توابع شل باید از cd -q یا pushd -q برای جلوگیری از عوارض جانبی استفاده کنند. برای جزئیات بیشتر محتویات تابع chpwd_recent_dirs را ببینید.
ارجاعات پویای اختصاری به دایرکتوریها (ABBREVIATED DYNAMIC REFERENCES TO DIRECTORIES)
سامانهٔ نامگذاری پویای دایرکتوری در زیربخش Dynamic named directories از بخش Filename Expansion در zshexpn(1) شرح داده شده است. در این بخش، ارجاع به ~[...] توسط تابعی که از طریق سازوکار قلابها پیدا شده، بسط داده میشود.
تابع ارائهشدهٔ zsh_directory_name_generic سامانهای را فراهم میکند که به کاربر اجازه میدهد تنها با مقدار محدودی کد جدید به دایرکتوریها ارجاع دهد. این تابع از هر سه رابط استاندارد برای نامگذاری دایرکتوری پشتیبانی میکند: تبدیل نام به دایرکتوری، تبدیل در جهت معکوس برای یافتن نام کوتاه، و تکمیل خودکار نامها.
ویژگی اصلی این تابع، یک نحو شبهمسیر است که اختصارات را در چند سطح جداشده با «:» ترکیب میکند. به عنوان مثال، ~[g:p:s] ممکن است مشخصکنندهٔ موارد زیر باشد:
- g
- دایرکتوری سطح بالایی برای ناحیهٔ git شما. این مؤلفهٔ نخست باید مطابقت داشته باشد، در غیر این صورت تابع مقداری برمیگرداند که نشان میدهد باید یک تابع قلاب نام دایرکتوری دیگر امتحان شود.
- p
- نام یک پروژه درون ناحیهٔ git شما.
- s
- ناحیهٔ سورس (source) درون آن پروژه. این به شما امکان میدهد تا ارجاعات به سلسلهمراتبهای طولانی را به شکلی بسیار فشرده خلاصه کنید، به ویژه اگر این سلسلهمراتبها در بخشهای مختلف دیسک مشابه باشند.
مؤلفههای نام ممکن است تکمیل خودکار شوند: اگر توصیفی در بالای فهرست تکمیلها نمایش داده شود، شامل مسیری است که مؤلفههای قبلی به آن بسط مییابند، در حالی که توصیف یک مورد تکمیل منفرد، قطعهمسیر اضافهشونده توسط آن را نشان میدهد. هیچ پیکربندی اضافی برای این کار لازم نیست زیرا سیستم تکمیل خودکار از سازوکار نام پویای دایرکتوری آگاه است.
کاربرد
برای استفاده از این تابع، ابتدا یک تابع پوششی (wrapper function) برای مورد خاص خود تعریف کنید. ما فرض میکنیم که این تابع قرار است به طور خودکار بارگذاری (autoload) شود. این تابع میتواند هر نامی داشته باشد، اما ما از آن با نام zdn_mywrapper یاد میکنیم. این تابع پوششی متغیرهای مختلفی را تعریف کرده و سپس این تابع را با همان آرگومانهایی که تابع پوششی دریافت کرده، فراخوانی میکند. این پیکربندی در زیر شرح داده شده است.
سپس ترتیبی دهید که تابع پوششی به عنوان یک قلاب zsh_directory_name اجرا شود:
autoload -Uz add-zsh-hook zsh_directory_name_generic zdn_mywrapper add-zsh-hook -U zsh_directory_name zdn_mywrapper
تابع پوششی (wrapper function) باید یک آرایهٔ متناظر محلی به نام zdn_top تعریف کند. همچنین این مورد میتواند با یک سبک (style) به نام mapping نیز تنظیم شود. زمینه (context) برای این سبک :zdn:wrapper-name است که در آن wrapper-name تابعی است که zsh_directory_name_generic را فراخوانی میکند؛ برای مثال:
zstyle :zdn:zdn_mywrapper: mapping zdn_mywrapper_top
کلیدها در این آرایهٔ متناظر، متناظر با بخش اول نام هستند. مقادیر، دایرکتوریهای منطبق میباشند. آنها میتوانند یک پسوند اختیاری شامل یک اسلش و به دنبال آن یک دونقطه و نام یک متغیر با همان قالب داشته باشند تا مؤلفهٔ بعدی را مشخص کنند. (اسلش پیش از دونقطه برای رفع ابهام در مواردی است که برای مشخص کردن یک درایو در مسیر به دونقطه نیاز است. در غیر این صورت هیچ ساختاری برای گریز (escaping) از این حالت وجود ندارد، بنابراین مؤلفههای مسیری که نامشان با دونقطه آغاز میشود پشتیبانی نمیشوند.) مؤلفهٔ ویژهٔ :default: متغیری را در قالب /:var تعیین میکند (بخش مسیر نادیده گرفته میشود و بنابراین معمولاً خالی است) که در صورت مشخص نشدن متغیر برای مسیر، برای مؤلفهٔ بعدی استفاده خواهد شد. متغیرهایی که در zdn_top به آنها ارجاع داده میشود، قالبی مشابه خود zdn_top دارند، اما شامل مسیرهای نسبی هستند.
برای مثال،
local -A zdn_top=( g ~/git ga ~/alternate/git gs /scratch/$USER/git/:second2 :default: /:second1 )
این پیکربندی رفتار دایرکتوری مورد ارجاع به صورت ~[g:...] یا ~[ga:...] یا ~[gs:...] را مشخص میکند. مؤلفههای بعدی مسیر اختیاری هستند؛ در این حالت ~[g] به ~/git گسترش مییابد، و به همین ترتیب. gs به /scratch/$USER/git گسترش مییابد و از آرایهٔ متناظر second2 برای تطبیق مؤلفهٔ دوم استفاده میکند؛ g و ga از آرایهٔ متناظر second1 برای تطبیق مؤلفهٔ دوم استفاده میکنند.
هنگام گسترش یک نام به یک دایرکتوری، چنانچه مؤلفهٔ اول g، ga یا gs نباشد، خطا به شمار نمیآید؛ تابع صرفاً مقدار 1 را برمیگرداند تا امکان بررسی یک تابع قلاب (hook) بعدی وجود داشته باشد. با این حال، تطبیق مؤلفهٔ اول، تابع را متعهد میسازد؛ از این رو در صورت عدم تطبیق مؤلفههای بعدی، یک خطا چاپ میشود (هرچند این موضوع مانع از اجرای قلابهای بعدی نمیشود).
برای مؤلفههای پس از بخش اول، یک مسیر نسبی انتظار میرود، اما توجه داشته باشید که ممکن است چندین سطح نیز وجود داشته باشد. در اینجا نمونهای از second1 آورده شده است:
local -A second1=( p myproject s somproject os otherproject/subproject/:third )
مسیر یافتشده از zdn_top با دایرکتوری منطبق گسترش مییابد، بنابراین ~[g:p] تبدیل به ~/git/myproject میشود. اسلش میانی به طور خودکار افزوده میشود (امکان ندارد یک مؤلفهٔ بعدی نام دایرکتوری از پیش تطبیقیافته را دستخوش تغییر کند). تنها os متغیری را برای مؤلفهٔ سوم مشخص میکند، و همچنین هیچ :default: وجود ندارد؛ بنابراین استفاده از نامهایی نظیر ~[g:p:x] یا ~[ga:s:y] خطا محسوب میشود، چرا که مکانی برای جستجوی x یا y وجود ندارد.
آرایههای متناظر باید درون این تابع قابل مشاهده باشند؛ بنابراین تابع عمومی (generic) از نام متغیرهای داخلی که با _zdn_ آغاز میشوند استفاده میکند تا از هرگونه تداخل نامها جلوگیری شود. توجه داشته باشید که متغیر reply باید به شل بازگردانده شود، در نتیجه نباید در تابع فراخواننده به صورت محلی (local) تعریف شده باشد.
این تابع بررسی نمیکند که آیا دایرکتوریهای حاصل از ترکیب مؤلفهها در عمل وجود دارند یا خیر؛ این امر سیستم را قادر میسازد با سیستمهای فایلی با سوار شدن خودکار (automounted) نیز کار کند. خطای ناشی از دستوری که تلاش میکند به یک دایرکتوری ناموجود دسترسی پیدا کند، برای نشان دادن مشکل کفایت خواهد کرد.
در اینجا یک تعریف کامل و ساختگی، اما قابل استفاده و با امکان بارگذاری خودکار (autoloadable) از تابع نمونهای که با کد بالا تعریف شد، آمده است. بنابراین ~[gs:p:s] به /scratch/$USER/git/myscratchproject/top/srcdir بسط مییابد (که در آن $USER نیز بسط داده میشود).
local -A zdn_top=( g ~/git ga ~/alternate/git gs /scratch/$USER/git/:second2 :default: /:second1 ) local -A second1=( p myproject s somproject os otherproject/subproject/:third ) local -A second2=( p myscratchproject s somescratchproject ) local -A third=( s top/srcdir d top/documentation ) # autoload not needed if you did this at initialisation... autoload -Uz zsh_directory_name_generic zsh_directory_name_generic "$@
همچنین میتوان از آرایههای انجمنی سراسری با نامگذاری مناسب استفاده کرد و سبک (style) را برای بافت تابع پوششی (wrapper) خود به گونهای تنظیم نمود که به آن ارجاع دهد. در این صورت کد پیکربندی شما شامل موارد زیر خواهد بود:
typeset -A zdn_mywrapper_top=(...) # ... and so on for other associative arrays ... zstyle ':zdn:zdn_mywrapper:' mapping zdn_mywrapper_top autoload -Uz add-zsh-hook zsh_directory_name_generic zdn_mywrapper add-zsh-hook -U zsh_directory_name zdn_mywrapper
و تابع zdn_mywrapper تنها شامل موارد زیر خواهد بود:
zsh_directory_name_generic "$@"
جمعآوری اطلاعات از سیستمهای کنترل نسخه (GATHERING INFORMATION FROM VERSION CONTROL SYSTEMS)
در بسیاری از موارد، بازیابی خودکار اطلاعات از سیستمهای کنترل نسخه (VCSها)، مانند subversion، CVS یا git، برای نمایش آن به کاربر (بهویژه در اعلان یا همان prompt کاربر) بسیار سودمند است؛ برای نمونه تا بتوانید فوراً متوجه شوید در حال حاضر روی کدام شاخه (branch) قرار دارید.
برای انجام این کار، میتوانید از تابع vcs_info استفاده کنید.
سیستمهای کنترل نسخه (VCS) زیر پشتیبانی میشوند و نام اختصاری ارجاع به آنها در سیستم نیز نشان داده شده است:
- Bazaar (bzr)
- https://bazaar.canonical.com
- Codeville (cdv)
- http://freecode.com/projects/codeville
- Concurrent Versioning System (cvs)
- https://www.nongnu.org/cvs
- Darcs (darcs)
- http://darcs.net
- Fossil (fossil)
- https://fossil-scm.org
- Git (git)
- https://git-scm.com
- GNU arch (tla)
- https://www.gnu.org/software/gnu-arch
- Mercurial (hg)
- https://www.mercurial-scm.org
- Monotone (mtn)
- https://monotone.ca
- Perforce (p4)
- https://www.perforce.com
- Subversion (svn)
- https://subversion.apache.org
- SVK (svk)
- https://svk.bestpractical.com
همچنین از سیستم مدیریت وصله quilt (https://savannah.nongnu.org/projects/quilt) نیز پشتیبانی میشود. برای جزئیات به بخش Quilt Support در ادامه نگاه کنید.
برای بارگذاری vcs_info:
autoload -Uz vcs_info
از این تابع میتوان در هر اعلان (prompt) موجودی استفاده کرد، زیرا نیازی به وجود مدخلهای خاصی از $psvar ندارد.
برای راهاندازی سریع این قابلیت (شامل رنگها)، میتوانید مراحل زیر را انجام دهید (با فرض اینکه vcs_info را بهدرستی بارگذاری کردهاید - بالا را ببینید):
zstyle ':vcs_info:*' actionformats \
'%F{5}(%f%s%F{5})%F{3}-%F{5}[%F{2}%b%F{3}|%F{1}%a%F{5}]%f '
zstyle ':vcs_info:*' formats \
'%F{5}(%f%s%F{5})%F{3}-%F{5}[%F{2}%b%F{5}]%f '
zstyle ':vcs_info:(sv[nk]|bzr):*' branchformat '%b%F{1}:%F{3}%r'
precmd () { vcs_info }
PS1='%F{5}[%F{2}%n%F{5}] %F{3}%3~ ${vcs_info_msg_0_}%f%# '
واضح است که دو خط آخر صرفاً برای نمایش هستند. شما باید vcs_info را از تابع precmd خود فراخوانی کنید. پس از انجام این کار، به یک '${vcs_info_msg_0_}' تکنقلقولشده (single quoted) در اعلان خط فرمان (prompt) خود نیاز خواهید داشت.
برای اینکه بتوانید '${vcs_info_msg_0_}' را مستقیماً مانند این نمونه در اعلان خط فرمان خود به کار ببرید، باید گزینهٔ PROMPT_SUBST را فعال کرده باشید.
اکنون ابزار کاربردی vcs_info_printsys را از خط فرمان اجرا کنید:
% vcs_info_printsys ## list of supported version control backends: ## disabled systems are prefixed by a hash sign (#) bzr cdv cvs darcs fossil git hg mtn p4 svk svn tla ## flavours (cannot be used in the enable or disable styles; they ## are enabled and disabled with their master [git-svn -> git]) ## they *can* be used in contexts: ':vcs_info:git-svn:*'. git-p4 git-svn hg-git hg-hgsubversion hg-hgsvn
ممکن است همهٔ این موارد را نخواهید؛ چرا که اجرای کد برای تشخیص سامانههایی که از آنها استفاده نمیکنید بیهوده است. بنابراین راهی وجود دارد تا برخی از بکاندها را بهطور کامل غیرفعال کنید:
zstyle ':vcs_info:*' disable bzr cdv darcs mtn svk tla
همچنین میتوانید چند مورد را از آن فهرست برگزینید و تنها همانها را فعال کنید:
zstyle ':vcs_info:*' enable git cvs svn
اگر پس از یکی از این دستورها مجدداً vcs_info_printsys را اجرا کنید، بکاندهای فهرستشده در سبک disable (یا بکاندهایی که در سبک enable نیستند - اگر از آن استفاده کرده باشید) را خواهید دید که با علامت هش (#) به عنوان غیرفعال علامتگذاری شدهاند. این بدان معناست که از تشخیص این سامانهها بهطور کامل صرفنظر میشود؛ بنابراین هیچ زمانی هدر نمیرود.
پیکربندی (Configuration)
قابلیت vcs_info از طریق zstyle قابل پیکربندی است.
ابتدا، زمینهای (context) که در آن کار میکنیم:
:vcs_info:vcs-string:user-context:repo-root-name
- vcs-string
- یکی از این موارد است: git، git-svn، git-p4، hg، hg-git، hg-hgsubversion، hg-hgsvn، darcs، bzr، cdv، mtn، svn، cvs، svk، tla، p4 یا fossil. این مورد در حالت Quilt با «.quilt-quilt-mode» (برای جزئیات Quilt Support را ببینید) و در زمان فعال بودن قلابها (hooks) با «+hook-name» دنبال میشود (برای جزئیات Hooks in vcs_info را ببینید).
در حال حاضر، قلابها در حالت quilt اطلاعات «.quilt-quilt-mode» را اضافه نمیکنند. این وضعیت ممکن است در آینده تغییر کند.
- user-context
- رشتهای با قابلیت پیکربندی آزادانه است که توسط کاربر به عنوان آرگومان نخست به vcs_info ارسال میشود (توضیحات آن را در زیر ببینید).
- repo-root-name
- نام مخزنی است که میخواهید یک سبک (style) با آن تطبیق یابد. بنابراین، اگر تنظیمی مخصوص /usr/src/zsh میخواهید که یک چکاوت CVS است، میتوانید repo-root-name را روی zsh تنظیم کنید تا اعمال شود.
سه مقدار ویژه برای vcs-string وجود دارد: اولی -init- نام دارد که تا زمانی که تصمیمی مبنی بر انتخاب بکاند سامانه کنترل نسخه (VCS) گرفته نشده باشد، معتبر است. دومی -preinit- است؛ این مقدار پیش از اجرای vcs_info، هنگام مقداردهی اولیه به متغیرهای صادرکنندهٔ داده استفاده میشود. سومین مقدار ویژه formats است و توسط vcs_info_lastmsg برای جستجوی سبکهای آن به کار میرود.
مقدار اولیهٔ repo-root-name برابر با -all- است و به محض مشخص شدن نام واقعی، با آن جایگزین میشود. از این بخش زمینه تنها برای تعریف سبکهای formats، actionformats یا branchformat استفاده کنید؛ چرا که تضمین شده است repo-root-name تنها برای این سبکها بهدرستی مقداردهی میشود. برای سایر سبکها، تنها از '*' استفاده کنید.
دو مقدار از پیشتعریفشده برای user-context وجود دارد:
- default
- موردی که در صورت مشخص نشدن هیچ مقداری، استفاده میشود
- command
- توسط vcs_info_lastmsg برای جستجوی سبکهای آن استفاده میشود
البته میتوانید از ':vcs_info:*' برای تطبیق همزمان با تمامی VCSها در تمام زمینههای کاربری (user-contexts) استفاده کنید.
در ادامه توضیحی دربارهٔ تمامی سبکهایی که جستجو میشوند آورده شده است.
- formats
- فهرستی از قالبها است که در صورت استفاده نشدن از actionformats (که اغلب اوقات چنین است) به کار میرود.
- actionformats
- فهرستی از قالبها است که در صورت وقوع یک عملیات ویژه در مخزن فعلی شما استفاده میشود؛ مانند یک بازسازی تعاملی (interactive rebase) یا تداخل ادغام (merge conflict).
- branchformat
- برخی بکاندها %b را در سبکهای formats و actionformats بالا، نه تنها با نام شاخه بلکه با شمارهٔ ویرایش (revision number) نیز جایگزین میکنند. این سبک به شما امکان میدهد ظاهر آن رشته را سفارشیسازی کنید.
- nvcsformats
- این «قالبها» زمانی تنظیم میشوند که سامانهٔ کنترل نسخهای برای دایرکتوری فعلی تشخیص داده نشود یا vcs_info غیرفعال شده باشد. این ویژگی زمانی مفید است که بخواهید vcs_info تولید اعلان خط فرمان (prompt) شما را کاملاً بر عهده بگیرد. برای رسیدن به این هدف، کاری مانند PS1='${vcs_info_msg_0_}' را انجام میدهید.
- hgrevformat
- ابزار hg هم از هش و هم از شمارهٔ ویرایش برای ارجاع به یک مجموعه تغییرات (changeset) خاص در مخزن استفاده میکند. با این سبک میتوانید رشتهٔ بازبینی را قالببندی کنید (به branchformat مراجعه کنید) تا شامل یکی از آنها یا هر دو باشد. این ویژگی تنها زمانی مفید است که get-revision برابر با true باشد. توجه داشته باشید که شناسهٔ ویرایش ۴۰ نویسهای کامل در دسترس نیست (مگر هنگام استفاده از گزینهٔ use-simple)، زیرا اجرای بیش از یک بار hg در هر اعلان خط فرمان بسیار کند است؛ میتوانید این رفتار را با استفاده از قلابها سفارشیسازی کنید.
- max-exports
- حداکثر تعداد متغیرهای vcs_info_msg_*_ را که vcs_info تنظیم خواهد کرد، مشخص میکند..TP enable فهرستی از بکاندهایی که میخواهید استفاده کنید. در زمینهٔ -init- بررسی میشود. اگر این فهرست شامل موردی به نام NONE باشد، از هیچ بکاندی استفاده نخواهد شد و vcs_info کاری انجام نمیدهد. اگر این فهرست شامل ALL باشد، vcs_info از همهٔ بکاندهای شناختهشده استفاده خواهد کرد. شیوهٔ disable تنها در صورتی اثرگذار است که ALL در enable قرار داشته باشد. مقادیر ALL و NONE به بزرگی و کوچکی حروف حساس نیستند.
- disable
- فهرستی از سیستمهای کنترل نسخهای که نمیخواهید vcs_info آنها را برای مخازن بررسی کند (این مورد نیز در زمینهٔ -init- بررسی میشود). تنها زمانی استفاده میشود که enable حاوی ALL باشد.
- disable-patterns
- فهرستی از الگوها که با $PWD تطبیق داده میشوند. اگر الگویی مطابقت داشته باشد، vcs_info غیرفعال خواهد شد. این شیوه در زمینهٔ :vcs_info:-init-:*:-all- بررسی میشود.
بهعنوان مثال، فرض کنید ~/.zsh دایرکتوری تحت کنترل نسخه است و نمیخواهید vcs_info در آن فعال باشد؛ دستور زیر را اجرا کنید:
zstyle ':vcs_info:*' disable-patterns "${(b)HOME}/.zsh(|/*)"
- use-quilt
- در صورت فعال بودن، کد پشتیبانی از quilt در حالت «addon» فعال میشود. برای جزئیات به Quilt Support مراجعه کنید.
- quilt-standalone
- در صورت فعال بودن، اگر هیچ سیستم کنترل نسخهای در دایرکتوری دادهشده فعال نباشد، تلاش میشود حالت «standalone» تشخیص داده شود. برای جزئیات به Quilt Support مراجعه کنید.
- quilt-patch-dir
- رونویسی مقدار متغیر محیطی $QUILT_PATCHES. برای جزئیات به Quilt Support مراجعه کنید.
- quiltcommand
- هنگامی که خود دستور quilt در پشتیبانی quilt فراخوانی میشود، مقدار این شیوه بهعنوان نام دستور استفاده میشود.
- check-for-changes
- اگر فعال باشد، این شیوه باعث میشود دنبالههای گریز قالببندی %c و %u نشان دهند که آیا دایرکتوری کاری دارای تغییرات ثبتنشده (uncommitted) هست یا خیر. رشتههای نمایشدادهشده توسط این گریزها را میتوان با شیوههای stagedstr و unstagedstr کنترل کرد. تنها بکاندهایی که در حال حاضر از این گزینه پشتیبانی میکنند git، hg و bzr هستند (دو مورد آخر تنها از تغییرات unstaged پشتیبانی میکنند).
برای ارزیابی این شیوه در بکاند hg، باید شیوهٔ get-revision تنظیم شده و شیوهٔ use-simple غیرفعال باشد. مورد دوم پیشفرض است، اما اولی پیشفرض نیست.
در بکاند bzr، دریافتهای سبک (lightweight checkouts) تنها زمانی از این شیوه پیروی میکنند که شیوهٔ use-server تنظیم شده باشد.
توجه داشته باشید عملیاتی که در صورت فعال بودن این شیوه انجام میشود بالقوه پرهزینه هستند (به این معنی که بسته به اندازهٔ مخزن فعلی، ممکن است کُند باشند). بنابراین، بهطور پیشفرض غیرفعال است.
- check-for-staged-changes
- این شیوه مشابه check-for-changes است، اما هرگز فایلهای درختکاری (worktree) را بررسی نمیکند، بلکه تنها فرادادههای موجود در پوشهٔ .${vcs} را بررسی میکند. بنابراین، این شیوه فقط گریز %c را (با stagedstr) مقداردهی میکند و گریز %u را تنظیم نمیکند. این شیوه از check-for-changes سریعتر است.
در بکاند git، این شیوه تغییرات موجود در نمایهها (index) را بررسی میکند. بکاندهای دیگر در حال حاضر این شیوه را پیادهسازی نکردهاند.
این شیوه بهطور پیشفرض غیرفعال است.
- stagedstr
- اگر تغییرات آمادهسازیشده (staged) در مخزن وجود داشته باشد، این رشته در گریز %c استفاده خواهد شد.
- unstagedstr
- اگر تغییرات آمادهسازینشده (unstaged) در مخزن وجود داشته باشد، این رشته در گریز %u استفاده خواهد شد.
- command
- این شیوه باعث میشود vcs_info از رشتهٔ ارائهشده بهعنوان دستوری که باید باینری سیستم کنترل نسخه باشد استفاده کند. توجه داشته باشید که تنظیم این مورد در ':vcs_info:*' ایدهٔ خوبی نیست.
اگر مقدار این شیوه خالی باشد (که پیشفرض است)، نام باینری مورد استفاده، همان نام بکاند در حال استفاده خواهد بود (بهعنوان مثال در یک مخزن svn از دستور svn استفاده میشود).
بخش repo-root-name در زمینه، هنگام جستجوی این شیوه همیشه برابر مقدار پیشفرض -all- است.
برای نمونه، از این شیوه میتوان برای استفاده از باینریها در مسیرهای نصب غیرپیشفرض بهره برد. فرض کنید git در /usr/bin نصب شده است اما مدیر سیستم نسخه جدیدتری را در /usr/local/bin نصب کرده است. بهجای تغییر ترتیب متغیر $PATH خود، میتوانید این کار را انجام دهید:
zstyle ':vcs_info:git:*:-all-' command /usr/local/bin/git
- use-server
- این مورد توسط بکاند پرفورس (p4) استفاده میشود تا تصمیم بگیرد که آیا باید با کارگزار Perforce تماس بگیرد تا متوجه شود که آیا یک دایرکتوری توسط Perforce مدیریت میشود یا خیر. این تنها روش قابلاعتماد برای این کار است، اما در صورت عدم یافتن نام کارگزار خطر ایجاد تاخیر را به همراه دارد. اگر نتوان با کارگزار (بهطور دقیقتر، جفت host:port که کارگزار را مشخص میکند) ارتباط برقرار کرد، نام آن در آرایهٔ انجمنی vcs_info_p4_dead_servers قرار میگیرد و در طول آن نشست دیگر تماسی با آن برقرار نمیشود، مگر اینکه بهصورت دستی حذف شود. اگر این شیوه را تنظیم نکنید، بکاند p4 تنها در صورتی قابل استفاده خواهد بود که متغیر محیطی P4CONFIG را روی نام یک فایل تنظیم کرده باشید و فایلهای متناظر در دایرکتوریهای ریشهٔ هر کلاینت Perforce وجود داشته باشد. برای جزئیات بیشتر به توضیحات تابع VCS_INFO_detect_p4 مراجعه کنید.
بکاند بازار (bzr) از این مورد برای اجازه دادن به برقراری ارتباط با کارگزار دربارهٔ checkoutهای سبک استفاده میکند؛ شیوهٔ check-for-changes را ببینید.
- use-simple
- اگر دو روش مختلف برای جمعآوری اطلاعات وجود داشته باشد، میتوانید با تنظیم این شیوه بر روی true، روش سادهتر را انتخاب کنید؛ پیشفرض استفاده از کد غیرساده است که بالقوه بسیار کندتر است اما ممکن است در تمام موارد ممکن دقیقتر باشد. این شیوه توسط بکاندهای bzr، hg و git استفاده میشود. در مورد hg، برنامهٔ خارجی hexdump را برای تجزیهٔ فایل حافظهٔ موقت باینری dirstate فراخوانی میکند؛ این روش شمارهٔ بازبینی محلی را بازنمیگرداند.
- get-revision
- اگر روی true تنظیم شود، vcs_info تلاش بیشتری به خرج میدهد تا شمارهٔ بازبینی درختکاری مخزن را بیابد (در حال حاضر برای بکاندهای git و hg که چنین اطلاعاتی همیشه حیاتی نیستند). در git، مقدار هش کامیت فعلی که checkout شده از طریق بسط %i در دسترس است. در hg، شمارهٔ بازبینی محلی و هش سراسری متناظر از طریق %i در دسترس هستند.
- get-mq
- اگر روی true تنظیم شود، بکاند hg به دنبال دایرکتوری وصلهٔ Mercurial Queue (mq) خواهد گشت. اطلاعات از طریق جایگزینی «%m» در دسترس خواهد بود.
- get-bookmarks
- اگر روی true تنظیم شود، بکاند hg تلاش میکند فهرستی از نشانکهای (bookmarks) فعلی به دست آورد. آنها از طریق جایگزینی «%m» در دسترس خواهند بود.
حالت پیشفرض، ایجاد فهرستی جداشده با کاما از تمام نامهای نشانکهایی است که به بازبینی فعلی checkout شده ارجاع میدهند. اگر نشانکی فعال باشد، یک ستاره به انتهای نام آن اضافه شده و در ابتدای فهرست قرار میگیرد.
- use-prompt-escapes
- تعیین میکند که آیا فرض کنیم رشتهٔ سرهمشده از vcs_info شامل دنبالههای گریز خط فرمان (prompt escapes) است یا خیر. (توسط vcs_info_lastmsg استفاده میشود.)
- debug
- خروجی اشکالزدایی را برای ردیابی مشکلات احتمالی فعال میکند. در حال حاضر این شیوه تنها توسط سامانهٔ قلابهای (hooks) دستور vcs_info استفاده میشود.
- hooks
- یک شیوهٔ فهرستی که نام توابع قلاب را تعیین میکند. برای جزئیات به بخش Hooks in vcs_info در ادامه مراجعه کنید.
- patch-format
- nopatch-format
- این جفتشیوه، اطلاعات وصله را که توسط بسطدهندهٔ %m در formats و actionformats برای بکاندهای git و hg استفاده میشود، قالببندی میکنند. این مقدار تابع برخی بسطهای % است که در زیر شرح داده شده است. مقدار بسطیافته در آرایهٔ سراسری backend_misc بهصورت ${backend_misc[patches]} در دسترس قرار میگیرد (همچنین اگر از یک قلاب set-patch-format استفاده شود)..TP get-unapplied این شیوه بولی (boolean) مشخص میکند که آیا یک backend باید برای جمعآوری فهرستی از وصلههای اعمالنشده (برای نمونه با وصلههای Mercurial Queue) تلاش کند یا خیر.
توسط backendهای quilt، hg و git استفاده میشود.
مقادیر پیشفرض برای این شیوهها در تمامی زمینهها عبارتند از:
- formats
- " (%s)-[%b]%u%c-"
- actionformats
- " (%s)-[%b|%a]%u%c-"
- branchformat
- "%b:%r" (برای bzr، svn، svk و hg)
- nvcsformats
- ""
- hgrevformat
- "%r:%h"
- max-exports
- 2
- enable
- ALL
- disable
- (فهرست خالی)
- disable-patterns
- (فهرست خالی)
- check-for-changes
- false
- check-for-staged-changes
- false
- stagedstr
- (رشته: "S")
- unstagedstr
- (رشته: "U")
- command
- (رشته خالی)
- use-server
- false
- use-simple
- false
- get-revision
- false
- get-mq
- true
- get-bookmarks
- false
- use-prompt-escapes
- true
- debug
- false
- hooks
- (فهرست خالی)
- use-quilt
- false
- quilt-standalone
- false
- quilt-patch-dir
- خالی - استفاده از $QUILT_PATCHES
- quiltcommand
- quilt
- patch-format
- وابسته به backend
- nopatch-format
- وابسته به backend
- get-unapplied
- false
در formats و actionformats عادی جایگزینیهای زیر انجام میشوند:
- %s
- سامانه کنترل نسخه (VCS) مورد استفاده (git، hg، svn و غیره).
- %b
- اطلاعات مربوط به شاخه جاری.
- %a
- یک شناسهگر که عملیات (action) را توصیف میکند. فقط در actionformats معنا دارد.
- %i
- شماره یا شناسهگر نگارش (revision) جاری. برای hg میتوان از شیوه hgrevformat برای سفارشیسازی خروجی استفاده کرد.
- %c
- رشته حاصل از شیوه stagedstr در صورتی که تغییرات مرحلهبندیشده (staged) در مخزن وجود داشته باشد.
- %u
- رشته حاصل از شیوه unstagedstr در صورتی که تغییرات مرحلهبندینشده (unstaged) در مخزن وجود داشته باشد.
- %R
- دایرکتوری پایه مخزن.
- %r
- نام مخزن. اگر %R برابر با /foo/bar/repoXY باشد، %r برابر repoXY است.
- %S
- یک زیردایرکتوری درون مخزن. اگر $PWD برابر /foo/bar/repoXY/beer/tasty باشد، %S برابر beer/tasty است.
- %m
- یک جایگزینی «متفرقه» (misc). تصمیمگیری در مورد اینکه این جایگزین به چه چیزی بسط یابد، بر عهده backend است.
backendهای hg و git از این عبارت بسطپذیر (expando) برای نمایش اطلاعات وصله استفاده میکنند. hg اطلاعات وصله را از افزونههای mq استخراج میکند؛ git از عملیاتهای در حال انجام rebase و cherry-pick و از افزونه stgit استفاده میکند. شیوههای patch-format و nopatch-format رشته تولیدشده را کنترل میکنند. مورد اول زمانی استفاده میشود که حداقل یک وصله از صف وصلهها اعمال شده باشد، و مورد دوم در غیر این صورت استفاده میشود.
backend برنامه hg اطلاعات نشانک (bookmark) را در این عبارت بسطپذیر نمایش میدهد (علاوه بر اطلاعات mq). شیوههای get-mq و get-bookmarks را ببینید. هر دوی این شیوهها ممکن است همزمان فعال باشند. اگر هر دو فعال باشند، هر دو رشته حاصل بهوسیله یک نقطه-ویرگول از هم جدا خواهند شد (که در حال حاضر قابل سفارشیسازی نیست).
backend نوع `standalone' ابزار quilt این عبارت بسطپذیر را روی همان مقدار عبارت بسطپذیر %Q تنظیم میکند.
- %Q
- اطلاعات سری Quilt. هنگامی که quilt استفاده میشود (چه در حالت `addon' یا به عنوان یک backend مستقل `standalone')، این عبارت بسطپذیر روی رشته patch-format سری quilt تنظیم میشود. قلاب set-patch-format و شیوه nopatch-format رعایت میشوند.
برای جزئیات بیشتر بخش Quilt Support در زیر را ببینید.
در branchformat این جایگزینیها انجام میشوند:
- %b
- نام شاخه. برای hg، نام شاخه میتواند شامل نام یک موضوع (topic) باشد..TP %r شماره نسخه فعلی یا سبک hgrevformat برای hg.
در hgrevformat این جایگزینیها انجام میشوند:
- %r
- شماره نسخه محلی فعلی.
- %h
- شناسه نسخه سراسری فعلی.
در patch-format و nopatch-format این جایگزینیها انجام میشوند:
- %p
- نام بالاترین وصله اعمالشده؛ ممکن است توسط قلاب applied-string بازنویسی شود.
- %u
- تعداد وصلههای اعمالنشده؛ ممکن است توسط قلاب unapplied-string بازنویسی شود.
- %n
- تعداد وصلههای اعمالشده.
- %c
- تعداد وصلههای اعمالنشده.
- %a
- تعداد تمام وصلهها (%a = %n + %c).
- %g
- نامهای نگهبانهای (guards) فعال mq (موتور پشتیبان hg).
- %G
- تعداد نگهبانهای (guards) فعال mq (موتور پشتیبان hg).
لازم نیست همه موتورهای پشتیبان سامانه کنترل نسخه (VCS) از تمام جایگزینیها پشتیبانی کنند. برای nvcsformats هیچ جایگزینی انجام نمیشود و صرفاً یک رشته است.
موارد عجیب (Oddities)
اگر میخواهید از بسط اعلان %b (خاموش کردن حالت برجسته/bold) در formats استفاده کنید که خودِ %b را بسط میدهد، از %%b استفاده نمایید. این کار موجب میشود بسط vcs_info مقدار %%b را با %b جایگزین کند تا سازوکار بسط اعلان zsh بتواند آن را مدیریت و پردازش نماید. بهطور مشابه، برای فرستادن %b از branchformat، از %%%%b استفاده کنید. پوزش بابت این زحمت، اما اجتناب از آن بهسادگی ممکن نبود. خوشبختانه با بیشتر بسطهای اعلان تداخلی وجود ندارد و این عمل تنها برای همین موارد خاص لازم است.
هنگامی که یکی از قلابهای gen-applied-string، gen-unapplied-string و set-patch-format تعریف شده باشد، اعمال گریزدهی به % (`foo=${foo//'%'/%%}') روی مقادیر درونیابیشده جهت استفاده در اعلان، (مشترکاً) بر عهده آن قلابها خواهد بود؛ زمانی که هیچیک از این قلابها تعریف نشده باشند، vcs_info گریزدهی را خود به تنهایی انجام میدهد. بابت این وابستگی پوزش میخواهیم، اما وجود آن برای سازگاری عقروعلی (عقبرو) الزامی بود.
پشتیبانی از Quilt (Quilt Support)
ابزار Quilt یک سامانه کنترل نسخه نیست، از این رو به عنوان یک موتور پشتیبان پیادهسازی نشده است. این ابزار میتواند به پیگیری مجموعهای از وصلهها کمک کند. افراد از آن برای نگهداری مجموعهای از تغییرات که میخواهند روی بستههای نرمافزاری اعمال کنند بهره میگیرند (که با فرایند ساخت بسته به شکل تنگاتنگی یکپارچه شده است - پروژه دبیان برای تعداد کثیری از بستهها این کار را انجام میدهد). همچنین Quilt میتواند به توسعهدهندگان به صورت انفرادی کمک کند تا وصلههای خود را روی سامانههای کنترل نسخه واقعی مدیریت و دنبال کنند.
یکپارچهسازی vcs_info تلاش میکند تا با ارائه دو حالت عملکردی کمی متفاوت، از هر دو روش استفاده از quilt پشتیبانی کند: حالت «addon» و حالت «standalone».
یکپارچهسازی Quilt به طور پیشفرض غیرفعال است؛ برای فعالسازی آن، سبک use-quilt را تنظیم کرده و %Q را به سبکهای formats یا actionformats خود بیفزایید:
zstyle ':vcs_info:*' use-quilt true
سبکهایی که توسط کد پشتیبانی Quilt بررسی میشوند شامل `.quilt-quilt-mode' در بخش vcs-string بافت هستند، که در آن quilt-mode یا addon است یا standalone. مثال: :vcs_info:git.quilt-addon:default:repo-root-name.
برای فعال شدن حالت «addon»، سامانه vcs_info باید از قبل یک سامانه کنترل نسخه واقعی را که دایرکتوری را کنترل میکند شناسایی کرده باشد. اگر چنین باشد، باید دایرکتوری حاوی وصلههای quilt پیدا شود. آن دایرکتوری از طریق متغیر محیطی `QUILT_PATCHES' قابل پیکربندی است. اگر متغیر مذکور وجود داشته باشد از مقدار آن استفاده میشود، در غیر این صورت مقدار `patches' در نظر گرفته میشود. مقدار بهدستآمده از $QUILT_PATCHES را میتوان با استفاده از سبک `quilt-patch-dir' بازنویسی کرد. (نکته: با استفاده از قلاب post-quilt در vcs_info میتوانید مقدار $QUILT_PATCHES را همیشه درست نگه دارید).
هنگامی که دایرکتوری مورد نظر پیدا شود، quilt فعال فرض میشود. برای گردآوری اطلاعات بیشتر، vcs_info به دنبال دایرکتوریای با نام `.pc' میگردد؛ Quilt از این دایرکتوری برای پیگیری وضعیت فعلی خود استفاده میکند. اگر این دایرکتوری وجود نداشته باشد، میدانیم که quilt هیچ تغییری روی دایرکتوری کاری اعمال نکرده است (بدین معنا که هنوز هیچ وصلهای اعمال نشده است).
اگر وصلههایی اعمال شده باشند، vcs_info سعی خواهد کرد تا مشخص کند کدام وصلهها هستند. چنانچه مایلید بدانید کدام وصلهها از یک مجموعه هنوز اعمال نشدهاند، باید سبک get-unapplied را در بافت مربوطه فعال کنید.
سامانه vcs_info امکان نظارت بسیار دقیقی را بر نحوه نمایش اطلاعات گردآوریشده فراهم میکند (بخشهای Configuration و Hooks in vcs_info را ببینید)، که همگی در ادامه مستند شدهاند. توجه داشته باشید سامانههای ردیابی وصله دیگری نیز وجود دارند که روی سامانههای کنترل نسخه خاصی کار میکنند (مانند stgit برای git، یا mq برای hg)؛ پیکربندی چنین سامانههایی عموماً مانند پشتیبانی از quilt انجام میپذیرد.
اگر پشتیبانی quilt در حالت «addon» عمل کند، رشته تولیدشده به عنوان یک جایگزین ساده قالب (دقیقاً %Q) در دسترس خواهد بود که میتوان از آن در formats و actionformats استفاده کرد؛ برای جزئیات به بخشهای پایینتر رجوع کنید).
در مقابل، اگر کد پشتیبانی در حالت «standalone» فعالیت کند، vcs_info طوری رفتار خواهد کرد که گویی quilt یک سامانه کنترل نسخه واقعی است. این بدان معناست که شناسه سامانه کنترل نسخه (که در غیر این صورت مقداری مانند `svn' یا `cvs' بود) روی `-quilt-' تنظیم خواهد شد. این موضوع روی بافت سبک مورداستفاده که این شناسه عنصر دوم آن است اثرگذار خواهد بود. سامانه vcs_info مقدار مناسبی را برای دایرکتوری ریشه «مخزن» پر میکند و رشته حاوی اطلاعات وضعیت quilt به عنوان جایگزین `misc' (و همچنین %Q به منظور سازگاری با حالت «addon») در دسترس خواهد بود.
آنچه برای بحث باقی میماند چگونگی تشخیص حالت «standalone» است. خود این تشخیص شامل مجموعهای از جستجوها برای دایرکتوریهاست. شما میتوانید این قابلیت تشخیص را همیشه در هر دایرکتوریای که به صورت دیگر تحت کنترل نسخه نیست فعال داشته باشید. اگر میدانید تنها درختهای محدودی وجود دارند که مایلید vcs_info در آنها به جستجوی Quilt در حالت «standalone» بپردازد تا میزان جستجو در هر بار فراخوانی vcs_info به کمترین حد ممکن برسد، روشهای متعددی برای این کار وجود دارد:
اساساً، تشخیص حالت «standalone» توسط سبکی به نام `quilt-standalone' کنترل میشود. این یک سبک رشتهای است و مقدار آن میتواند اثرات مختلفی داشته باشد. سادهترین مقادیر عبارتند از: `always' جهت اجرای تشخیص در هر بار اجرای vcs_info، و `never' به منظور غیرفعالسازی کامل تشخیص.
اگر مقدار quilt-standalone چیز دیگری باشد، به شیوه متفاوتی تفسیر میشود. چنانچه مقدار نام یک متغیر اسکالر (scalar) باشد، مقدار آن متغیر ارزیابی شده و دقیقاً به شیوه `always'/`never' مذکور در بالا به کار میرود.
اگر مقدار quilt-standalone یک آرایه باشد، عناصر آن آرایه به عنوان نام دایرکتوریهایی تلقی میشوند که میخواهید تشخیص در ذیل آنها فعال باشد.
اگر quilt-standalone یک آرایه انجمنی (associative array) باشد، کلیدها به عنوان نام دایرکتوریهایی فرض میشوند که میخواهید تشخیص زیر آنها فعال باشد، اما تنها در حالتی که مقدار متناظر آن رشته `true' باشد.
در آخر، اگر مقدار quilt-standalone نام یک تابع باشد، تابع بدون آرگومان فراخوانی میگردد و مقدار بازگشتی تعیین میکند که آیا تشخیص باید فعال باشد یا خیر. مقدار بازگشتی `0' به معنای درست (true) بوده و مقدار بازگشتی غیرصفر به صورت نادرست (false) تفسیر میگردد.
توجه داشته باشید، اگر هم یک تابع و هم یک متغیر با نام quilt-standalone موجود باشد، تقدم با تابع خواهد بود.
- vcs_info [user-context]
- تابع اصلی که تمام backendها را اجرا کرده و همهٔ دادهها را در ${vcs_info_msg_*_} سرهم میکند. این تابعی است که اگر میخواهید اطلاعات بهروز را در اعلان (prompt) خود بگنجانید، باید آن را از precmd فراخوانی کنید (به شرح متغیرها در زیر نگاه کنید). اگر یک آرگومان داده شود، آن رشته به جای default در فیلد user-context از بافت سبک (style context) استفاده خواهد شد.
- vcs_info_hookadd
- تعدادی از توابع را به صورت ایستا در یک قلاب (hook) مشخص ثبت میکند. قلاب باید به عنوان نخستین آرگومان داده شود؛ آنچه در ادامه میآید فهرستی از نامهای توابع قلاب برای ثبت در آن قلاب است. پیشوند `+vi-' در اینجا باید حذف شود. برای جزئیات به قلابها در vcs_info در زیر مراجعه کنید.
- vcs_info_hookdel
- حذف توابع قلاب از یک قلاب مشخص. قلاب باید به عنوان نخستین آرگومان غیرگزینهای داده شود؛ آنچه در ادامه میآید فهرستی از نامهای توابع قلاب برای لغو ثبت از آن قلاب است. اگر `-a' به عنوان نخستین آرگومان استفاده شود، تمام دفعات وقوع توابع لغو ثبت میشوند. در غیر این صورت تنها آخرین مورد حذف میشود (اگر تابعی بیش از یک بار در قلاب ثبت شده باشد). پیشوند `+vi-' در اینجا باید حذف شود. برای جزئیات به قلابها در vcs_info در زیر مراجعه کنید.
- vcs_info_lastmsg
- مقادیر کنونی ${vcs_info_msg_*_} را در خروجی چاپ میکند. مقدار سبک use-prompt-escapes را در ':vcs_info:formats:command:-all-' لحاظ میکند. همچنین تنها مقادیر را به تعداد max-exports چاپ میکند.
- vcs_info_printsys [user-context]
- فهرستی از تمام سیستمهای کنترل نسخهٔ پشتیبانیشده را چاپ میکند. برای آگاهی از بافتهای ممکن (و اینکه کدامیک فعال هستند) یا مقادیر مناسب برای سبک disable مفید است.
- vcs_info_setsys
- فهرست درونی backendهای دردسترس vcs_info را مقداردهی اولیه میکند. با این تابع میتوانید بدون راهاندازی مجدد شل، پشتیبانی از VCSهای جدید را اضافه کنید.
تمام توابع به نام VCS_INFO_* صرفاً برای استفادهٔ داخلی هستند.
شرح متغیرها
- ${vcs_info_msg_N_} (به زیرخط انتهایی توجه کنید)
- جایی که N یک عدد صحیح است، مانند vcs_info_msg_0_. این متغیرها محل ذخیرهٔ پیام اطلاعاتی هستند که آخرین فراخوانی vcs_info سرهم کرده است. اینها وابستگی شدیدی به سبکهای formats، actionformats و nvcsformats شرحدادهشده در بالا دارند. این سبکها فهرست هستند. نخستین عضو این فهرست در ${vcs_info_msg_0_}، دومی در ${vcs_info_msg_1_} و Nاُمین عضو در ${vcs_info_msg_N-1_} بسط مییابد. (به سبک max-exports در بالا مراجعه کنید.)
تمام متغیرهای به نام VCS_INFO_* صرفاً برای استفادهٔ داخلی هستند.
قلابها در vcs_info
قلابها مکانهایی در vcs_info هستند که میتوانید کد خود را در آنها اجرا کنید. آن کد میتواند با کدی که آن را فراخوانی کرده ارتباط برقرار کند و از این طریق، رفتار سیستم را تغییر دهد.
جهت پیکربندی، قلابها بافت سبک را تغییر میدهند:
:vcs_info:vcs-string+hook-name:user-context:repo-root-name
برای ثبت توابع در یک قلاب، باید آنها را در سبک hooks در بافت مناسب فهرست کنید.
مثال:
zstyle ':vcs_info:*+foo:*' hooks bar baz
این کار توابع را در قلاب `foo' برای تمام backendها ثبت میکند. بهمنظور جلوگیری از تداخل فضای نام، نام همهٔ توابع ثبتشده با یک `+vi-' پیشوندگذاری میشود، بنابراین توابع واقعی فراخوانیشده برای قلاب `foo' عبارتند از `+vi-bar' و `+vi-baz'.
اگر مایلید تابعی را صرفنظر از بافت کنونی در یک قلاب ثبت کنید، میتوانید از تابع vcs_info_hookadd استفاده کنید. برای حذف تابعی که به این شکل اضافه شده است، میتوان از تابع vcs_info_hookdel استفاده کرد.
اگر چیزی عجیب به نظر میرسد، میتوانید سبک بولی `debug' را در بافت مربوطه فعال کنید و کد فراخوانندهٔ قلاب، آنچه را که تلاش کرده اجرا کند و اینکه آیا تابع مورد نظر وجود داشته است یا خیر را چاپ خواهد کرد.
هنگامی که بیش از یک تابع را در یک قلاب ثبت میکنید، همهٔ توابع یکی پس از دیگری اجرا میشوند تا زمانی که یک تابع مقداری غیرصفر بازگرداند یا تمام توابع فراخوانی شوند. توابع قلاب وابسته به بافت، پیش از توابع ایستا ثبتشده (مواردی که با vcs_info_hookadd اضافه شدهاند) اجرا میشوند.
میتوانید از طریق یک آرایهٔ انجمنی به نام user_data دادهها را بین توابع منتقل کنید. برای مثال:
+vi-git-myfirsthook(){
user_data[myval]=$myval
}
+vi-git-mysecondhook(){
# do something with ${user_data[myval]}
}
تعدادی متغیر وجود دارند که در بافتهای قلاب خاص هستند:
- ret
- مقدار بازگشتی که سامانهٔ قلابها به فراخواننده بازمیگرداند. مقدار پیشفرض عدد صحیح `صفر' است. اینکه آیا و چگونه یک مقدار تغییریافتهٔ ret اجرای فراخواننده را تغییر میدهد به قلاب مشخص بستگی دارد. برای جزئیات به مستندات قلاب در زیر مراجعه کنید.
- hook_com
- یک آرایهٔ انجمنی که برای ارتباط دوطرفه بین فراخواننده و توابع قلاب استفاده میشود. کلیدهای مورد استفاده به قلاب خاص بستگی دارد.
- context
- بافت فعال قلاب. توابعی که مایل به تغییر این متغیر هستند باید ابتدا حوزهٔ آن را محلی (local) کنند.
- vcs
- سامانهٔ VCS کنونی پس از تشخیص. همان مقادیر مربوط به سبک enable/disable استفاده میشوند. در تمام قلابها به جز start-up در دسترس است.
در نهایت، فهرست کامل قلابهای در دسترس کنونی:
- start-up
- پس از شروع vcs_info اما پیش از تعیین VCS موجود در این دایرکتوری فراخوانی میشود. در صورت نیاز میتواند برای غیرفعال کردن موقت vcs_info به کار رود. هنگامی که ret روی 1 تنظیم شود، vcs_info لغو شده و کاری انجام نمیدهد؛ زمانی که روی 2 تنظیم شود، vcs_info همهچیز را طوری تنظیم میکند که گویی هیچ کنترل نسخهای فعال نیست و خارج میشود.
- pre-get-data
- مانند start-up اما پس از تشخیص VCS.
- gen-hg-bookmark-string
- در backend مربوط به Mercurial زمانی که یک رشتهٔ نشانک (bookmark) تولید میشود، فراخوانی میگردد؛ سبکهای get-revision و get-bookmarks باید true باشند.
این قلاب نامهای نشانکهای Mercurial را که vcs_info از `hg' جمعآوری کرده، دریافت میکند.
اگر نشانکی فعال باشد، کلید ${hook_com[hg-active-bookmark]} روی نام آن تنظیم میشود. در غیر این صورت این کلید تنظیمنشده (unset) خواهد بود.
هنگام تنظیم ret به مقداری غیرصفر، رشتهٔ موجود در ${hook_com[hg-bookmark-string]} در گریز (escape) مربوط به %m در formats و actionformats استفاده خواهد شد و در آرایهٔ سراسری backend_misc بهصورت ${backend_misc[bookmarks]} در دسترس خواهد بود.
- gen-applied-string
- در backendهای git (همراه با stgit یا در طول rebase یا merge) و hg (همراه با mq) و در پشتیبانی quilt زمانی که applied-string تولید میشود، فراخوانی میگردد؛ zstyle مربوط به use-quilt برای quilt باید true باشد (backendهای mq و stgit بهطور پیشفرض فعال هستند). آرگومانهای ورودی این قلاب، وصلههای اِعمالشده را با ترتیب معکوس شرح میدهند، بدین معنا که نخستین آرگومان، بالاترین وصله است و الی آخر.
هنگامی که پیامهای گزارش وصلهها قابل استخراج باشند، پس از یک فاصله درون هر آرگومان قرار میگیرند؛ بنابراین هر آرگومان به صورت `patch-name first line of the log message' خواهد بود که در آن patch-name شامل هیچ فاصله خالی (whitespace) نیست. پشتیبان mq آرگومانها را به شکل `patch name' همراه با فاصلههای احتمالی، اما بدون استخراج پیام گزارش وصله ارسال میکند.
هنگام تنظیم ret به مقداری غیرصفر، رشته موجود در ${hook_com[applied-string]} به عنوان %p در سبکهای patch-format و nopatch-format در دسترس خواهد بود. این قلاب به همراه set-patch-format مسئول گریزدهی (escape کردن) نویسههای % در آن مقدار جهت استفاده در خط فرمان (prompt) است. (بخش Oddities را ببینید.)
پشتیبان
quilt
ورودیهای
${hook_com[quilt-patches-dir]} و در
صورت مشخص
شدن، ${hook_com[quilt-pc-dir]}
را به این
قلاب ارسال
میکند.
- gen-unapplied-string
- در پشتیبانهای git (با stgit یا هنگام rebase) و hg (با mq) و در پشتیبانی از quilt هنگامی که unapplied-string تولید میشود، فراخوانی میگردد؛ سبک get-unapplied باید مقدار true داشته باشد.
این قلاب نام تمام وصلههای اِعمالنشده را به ترتیبی که vcs_info به دست آورده دریافت میکند، بدین معنا که نخستین آرگومان، وصله بعدی در صف اِعمال است و الی آخر.
قالب هر آرگومان مشابه gen-applied-string در بالا است.
هنگام تنظیم ret به مقداری غیرصفر، رشته موجود در ${hook_com[unapplied-string]} به عنوان %u در سبکهای patch-format و nopatch-format در دسترس خواهد بود. این قلاب به همراه set-patch-format مسئول گریزدهی نویسههای % در آن مقدار جهت استفاده در خط فرمان (prompt) است. (بخش Oddities را ببینید.)
پشتیبان quilt ورودیهای ${hook_com[quilt-patches-dir]} و در صورت مشخص شدن، ${hook_com[quilt-pc-dir]} را به این قلاب ارسال میکند.
- gen-mqguards-string
- در پشتیبان hg هنگام تولید guards-string فراخوانی میشود؛ سبک get-mq باید true باشد (پیشفرض).
این قلاب نامهای همه نگهبانهای (guards) فعال mq را دریافت میکند.
هنگام تنظیم ret به مقداری غیرصفر، رشته موجود در ${hook_com[guards-string]} در توالی گریز %g در سبکهای patch-format و nopatch-format استفاده خواهد شد.
- no-vcs
- این قلاب هنگامی فراخوانی میشود که هیچ سیستم کنترل نگارشی شناسایی نشده باشد.
پارامتر `hook_com' استفاده نمیشود.
- post-backend
- به محض اینکه پشتیبان جمعآوری اطلاعات را به پایان برساند فراخوانی میشود.
کلیدهای `hook_com' در دسترس، همانند قلاب set-message هستند.
- post-quilt
- پس از پایان کار پشتیبانی از quilt فراخوانی میشود. اطلاعات زیر به عنوان آرگومان به قلاب منتقل میشوند: ۱. حالت پشتیبانی quilt (مقدار `addon' یا `standalone')؛ ۲. دایرکتوری حاوی مجموعهوصلهها (patch series)؛ ۳. دایرکتوری نگهدارنده اطلاعات وضعیت quilt (دایرکتوری `.pc') یا رشته "-nopc-" در صورتی که آن دایرکتوری یافت نشده باشد.
پارامتر `hook_com' استفاده نمیشود.
- set-branch-format
- پیش از تنظیم شدن `branchformat' فراخوانی میشود. تنها آرگومان ارسالی به قلاب، قالبی است که در این نقطه پیکربندی شده است.
کلیدهای مورد بررسی در `hook_com'، کلیدهای `branch' و `revision' هستند. آنها روی مقادیری که تاکنون توسط vcs_info شناسایی شده تنظیم میشوند و هرگونه تغییری مستقیماً هنگام جایگزینی واقعی اعمال خواهد شد.
اگر ret روی مقداری غیرصفر تنظیم شود، رشته موجود در ${hook_com[branch-replace]} بدون تغییر به عنوان جایگزین `%b' در متغیرهای تنظیمشده توسط vcs_info استفاده خواهد شد.
- set-hgrev-format
- پیش از تنظیم شدن یک `hgrevformat' فراخوانی میشود. تنها آرگومان ارسالی به قلاب، قالبی است که در این نقطه پیکربندی شده است.
کلیدهای مورد بررسی در `hook_com'، کلیدهای `hash' و `localrev' هستند. آنها روی مقادیری که تاکنون توسط vcs_info مشخص شده تنظیم میشوند و هرگونه تغییری مستقیماً هنگام انجام جایگزینی واقعی به کار خواهد رفت.
اگر ret روی مقداری غیرصفر تنظیم شود، رشته موجود در ${hook_com[rev-replace]} بدون تغییر به عنوان جایگزین `%i' در متغیرهای مقداردهیشده توسط vcs_info استفاده خواهد شد.
- pre-addon-quilt
- این قلاب هنگامی استفاده میشود که قابلیت quilt در vcs_info در حالت "addon" (استفاده از quilt بر فراز یک سیستم کنترل نگارش واقعی) فعال باشد. این قلاب درست پیش از انجام هرگونه اقدام مختص quilt فعال میشود.
تنظیم متغیر `ret' در این قلاب به یک مقدار غیرصفر از اجرای هرگونه اقدام مختص quilt به طور کامل جلوگیری میکند.
- set-patch-format
- این قلاب برای مهار برخی از بسطهای احتمالی در سبکهای patch-format و nopatch-format همراه با سامانههای صف وصله مانند quilt، mqueue و نظایر آن استفاده میشود.
این قلاب در پشتیبانهای git، hg و quilt استفاده میشود.
این قلاب امکان مهار بسطهای %p (${hook_com[applied]}) و %u (${hook_com[unapplied]}) را در تمامی پشتیبانهایی که از این قلاب بهره میبرند فراهم میکند. در پشتیبان mercurial، علاوه بر این موارد، بسط %g (${hook_com[guards]}) نیز قابل کنترل است.
اگر ret به مقداری غیرصفر تنظیم شود، رشته موجود در ${hook_com[patch-replace]} بهجای قالب بسطیافته از patch-format یا nopatch-format، به صورت دستنخورده استفاده خواهد شد.
این قلاب در کنار قلابهای gen-applied-string یا gen-unapplied-string (در صورت تعریف شدن)، مسئول گریزدهی نویسههای % در مقدار نهایی patch-format جهت استفاده در خط فرمان (prompt) است. (بخش Oddities را ببینید.)
پشتیبان quilt ورودیهای ${hook_com[quilt-patches-dir]} و در صورت مشخص شدن، ${hook_com[quilt-pc-dir]} را به این قلاب ارسال میکند.
- set-message
- هر بار پیش از مقداردهی یک پیام `vcs_info_msg_N_' فراخوانی میشود. این قلاب دو آرگومان میپذیرد؛ اولی `N' موجود در نام متغیر پیام، و دومی formats یا actionformats پیکربندیشده فعلی است.
تعدادی کلید `hook_com' وجود دارند که در اینجا به کار میروند: `action'، `branch'، `base'، `base-name'، `subdir'، `staged'، `unstaged'، `revision'، `misc'، `vcs' و یک مدخل `miscN' برای هر فیلد دادهای مختص به پشتیبان (N از صفر شروع میشود). آنها روی مقادیری که تاکنون توسط vcs_info شناسایی شده مقداردهی میشوند و هرگونه تغییری مستقیماً هنگام انجام جایگزینی واقعی اعمال خواهد شد.
از آنجا که این قلاب چندین بار فعال میشود (یک بار برای هر یک از formats یا actionformats پیکربندیشده)، هر کدام از کلیدهای `hook_com' که در بالا ذکر شد (به استثنای مدخلهای miscN) یک همتای `_orig' دارند؛ بنابراین حتی اگر مقداری را مطابق نیاز خود تغییر دهید، همچنان میتوانید در اجرای بعدی به مقدار اصلی دسترسی داشته باشید. دستکاری مقادیر `_orig' احتمالاً ایده مناسبی نیست.
اگر ret به مقداری غیرصفر تنظیم شود، رشته موجود در ${hook_com[message]} بدون تغییر به عنوان پیام توسط vcs_info استفاده خواهد شد.
اگر تمام این موارد تا حدودی گیجکننده به نظر میرسد، به بخش Examples در زیر و همچنین به فایل Misc/vcs_info-examples در کد منبع Zsh نگاهی بیندازید. آنها حاوی کدهای توضیحی هستند..PP
مثالها (Examples)
بههیچوجه از vcs_info استفاده نکنید (حتی اگر در اعلان (prompt) شما قرار دارد):
zstyle ':vcs_info:*' enable NONE
غیرفعال کردن پساندهای مربوط به bzr و svk:
zstyle ':vcs_info:*' disable bzr svk
غیرفعال کردن همهچیز بهجز bzr و svk:
zstyle ':vcs_info:*' enable bzr svk
ارائه قالبهای ویژه برای git:
zstyle ':vcs_info:git:*' formats ' GIT, BABY! [%b]' zstyle ':vcs_info:git:*' actionformats ' GIT ACTION! [%b|%a]'
تمام بسطهای %x در انواع قالبها (formats، actionformats، branchformat و غیره) با استفاده از دستور توکار `zformat' از پودمان `zsh/zutil' انجام میشوند. این بدان معناست که هر آنچه zformat پشتیبانی میکند را میتوانید با این موارد %x انجام دهید. بهویژه، اگر میخواهید مقداری که بسیار طولانی است دارای عرض ثابت باشد، مانند یک هش در branchformat برای mercurial، میتوانید این کار را انجام دهید: %12.12i. این کار هش ۴۰ نویسهای را به ۱۲ نویسه ابتدایی آن خلاصه میکند. این ساختار در واقع به صورت `%min.maxx' است. امکانات بیشتری نیز وجود دارد. برای جزئیات به بخش `The zsh/zutil Module' در zshmodules(1) مراجعه کنید.
استفاده از پساند سریعتر bzr
zstyle ':vcs_info:bzr:*' use-simple true
اگر از use-simple استفاده میکنید، لطفاً گزارش دهید که آیا کارکرد درست و مورد انتظاری (`the-right-thing[tm]') دارد یا خیر.
نمایش شماره بازبینی (revision) با رنگ زرد برای bzr و svn:
zstyle ':vcs_info:(svn|bzr):*' \
branchformat '%b%%F{yellow}:%r'
دلیل دو برابر شدن علامت درصد در بخش Oddities توضیح داده شده است.
بهعنوان روش جایگزین، میتوان مستقیماً از کدهای رنگی خام استفاده کرد:
zstyle ':vcs_info:(svn|bzr):*' \
branchformat '%b%{'${fg[yellow]}'%}:%r'
بهطور معمول وقتی یک متغیر درون یک رشته قالب جایگذاری (interpolate) میشود، باید با % گریزدهی (escape) شود. در این مثال از این کار صرفنظر کردیم زیرا فرض میکنیم مقدار ${fg[yellow]} شامل هیچ علامت % نیست.
اگر میخواهید از رشته ارائهشده توسط vcs_info در اعلانها استفاده کنید، مطمئن شوید که کدهای رنگ را درون %{...%} قرار میدهید.
در اینجا نحوه چاپ اطلاعات VCS به عنوان یک دستور (نه در اعلان) آمده است:
vcsi() { vcs_info interactive; vcs_info_lastmsg }
از این طریق، حتی میتوانید قالبهای متفاوتی را برای خروجی از طریق vcs_info_lastmsg در فضای نام ':vcs_info:*:interactive:*' تعریف کنید.
اکنون همانطور که وعده داده شد، کدی که از قلابها (hooks) استفاده میکند: فرض کنید میخواهید رشته `svn' را با `subversion' در جایگزینی %s در formats برای vcs_info جایگزین کنید.
ابتدا، به vcs_info میگوییم هنگام پر کردن متغیرهای پیام با اطلاعات جمعآوریشده، یک تابع را فراخوانی کند:
zstyle ':vcs_info:*+set-message:*' hooks svn2subversion
هیچ اتفاقی نمیافتد. که البته منطقی است، زیرا ما هنوز تابع واقعی را تعریف نکردهایم. برای مشاهده اینکه زیرسیستم قلابها در تلاش برای انجام چه کاری است، شیوه (style) `debug' را فعال کنید:
zstyle ':vcs_info:*+*:*' debug true
این کار باید تصویری از آنچه در حال رخ دادن است به شما بدهد. بهطور مشخص، تابعی که به دنبال آن هستیم `+vi-svn2subversion' است. به پیشوند `+vi-' توجه کنید. بنابراین، همهچیز مرتب و دقیقاً مطابق مستندات است. وقتی کارتان با بررسی خروجی اشکالزدایی تمام شد، دوباره آن را غیرفعال کنید:
zstyle ':vcs_info:*+*:*' debug false
اکنون، بیایید تابع را تعریف کنیم:
function +vi-svn2subversion() {
[[ ${hook_com[vcs_orig]} == svn ]] && hook_com[vcs]=subversion
}
به اندازه کافی ساده است. و حتی میتوانست سادهتر باشد، اگر فقط تابع خود را در یک زمینه (context) با عمومیت کمتر ثبت میکردیم. اگر این کار را تنها در زمینه پساند `svn' انجام دهیم، دیگر نیازی به بررسی اینکه کدام پساند فعال است نخواهیم داشت:
zstyle ':vcs_info:svn+set-message:*' hooks svn2subversion
function +vi-svn2subversion() {
hook_com[vcs]=subversion
}
و در نهایت یک مثال کمی مفصلتر، که از یک قلاب برای ایجاد یک رشته نشانک (bookmark) سفارشی برای پساند hg استفاده میکند.
مجدداً، با ثبت یک تابع کار را آغاز میکنیم:
zstyle ':vcs_info:hg+gen-hg-bookmark-string:*' hooks hgbookmarks
و سپس تابع `+vi-hgbookmarks' را تعریف میکنیم:
function +vi-hgbookmarks() {
# حالت پیشفرض این است که تمام نامهای نشانک با
# ویرگول به هم متصل شوند. این کار اوضاع را کمی درهم میکند.
# تصور کنید نوعی از نشانکها وجود دارد که برای شما
# خاص است؛ مثلاً به این دلیل که کار *خودتان* است.
# این نشانکها همیشه به این شکل هستند: "sh/*"
# (برای مثال، به این دلیل که حروف اول نام شما sh است).
# این کار باعث میشود رشته نشانکها تنها از آن
# نشانکها استفاده کند. اگر بیش از یکی وجود داشته باشد،
# آنها را با استفاده از ویرگول به هم متصل میکند.
# نشانکهای بازگرداندهشده توسط `hg' در پارامترهای
# موقعیتی تابع در دسترس هستند.
local s="${(Mj:,:)@:#sh/*}"
# اکنون، ارتباط با کدی که توابع قلاب را فراخوانی
# میکند از طریق درهمسازی hook_com[] انجام
# میشود. کلیدی که قلاب `gen-hg-bookmark-string'
# بررسی میکند `hg-bookmark-string' است. بنابراین:
hook_com[hg-bookmark-string]=$s
# و برای اعلام اینکه میخواهیم از رشتهای که تازه تولید
# کردهایم استفاده شود، متغیر ویژه `ret' را روی مقداری
# غیر از پیشفرض صفر تنظیم کنید:
ret=1
return 0
}
برخی
مثالهای
طولانیتر
و
قطعهکدهایی
که ممکن است
مفید باشند
در فایل
مثالها
واقع در Misc/vcs_info-examples
در
دایرکتوری
سورس Zsh در
دسترس
هستند.
این بخش راهنمای گامبهگام ما را دربارهٔ vcs_info در zsh به پایان میرساند.
پوستههای اعلان (PROMPT THEMES)
نصب (Installation)
باید اطمینان حاصل کنید که تمام توابع موجود در دایرکتوری Functions/Prompts از توزیع سورس در دسترس هستند؛ به جز تابع ویژهٔ `promptinit'، همگی آنها با رشتهٔ `prompt_' آغاز میشوند. همچنین به توابع `colors' و `add-zsh-hook' از دایرکتوری Functions/Misc نیاز دارید. تمام این توابع ممکن است از پیش روی سیستم شما نصب شده باشند؛ در غیر این صورت، باید آنها را پیدا کرده و رونوشت بردارید. این دایرکتوری باید به عنوان یکی از عناصر آرایهٔ fpath ظاهر شود (اگر نصب شده باشند، از قبل باید به همین صورت باشد)، و حداقل تابع promptinit باید به صورت خودکار بارگذاری (autoload) شود؛ این تابع باقی توابع را خودکار بارگذاری خواهد کرد. در نهایت، برای مقداردهی اولیه و استفاده از سامانه باید تابع promptinit را فراخوانی کنید. کد زیر در فایل .zshrc شما این سازوکار را فراهم میکند؛ با این فرض که توابع در دایرکتوری ~/myfns ذخیره شده باشند:
fpath=(~/myfns $fpath) autoload -U promptinit promptinit
انتخاب پوسته (Theme Selection)
برای انتخاب پوستهٔ مورد نظر خود از دستور prompt استفاده کنید. این دستور میتواند پس از فراخوانی promptinit به فایل .zshrc شما افزوده شود تا zsh از همان ابتدا با یک پوستهٔ از پیش انتخابشده اجرا گردد.
- prompt [ -c | -l ]
- prompt [ -p | -h ] [ theme ... ]
- prompt [ -s ] theme [ arg ... ]
- تنظیم یا بررسی پوستهٔ اعلان. بدون هیچ گزینهای و همراه با یک آرگومان theme، پوستهای با آن نام به عنوان پوستهٔ کنونی تنظیم میشود. پوستههای در دسترس در زمان اجرا تعیین میشوند؛ برای دیدن فهرست آنها از گزینهٔ -l استفاده کنید. پوستهٔ ویژهٔ `random' یکی از پوستههای موجود را به صورت تصادفی انتخاب کرده و اعلان شما را روی آن تنظیم میکند.
در برخی موارد ممکن است theme با یک یا چند آرگومان که پس از نام پوسته مشخص میشوند، تغییر یابد. برای شرح این آرگومانها به بخش راهنمای هر پوسته مراجعه کنید.
گزینهها عبارتند از:
- -c
- نمایش پوستهٔ انتخابشدهٔ کنونی و پارامترهای آن، در صورت وجود.
- -l
- فهرست کردن تمام پوستههای اعلان در دسترس.
- -p
- پیشنمایش پوستهٔ تعیینشده با theme، یا تمام پوستهها در صورتی که هیچ theme مشخص نشده باشد.
- -h
- نمایش راهنما برای پوستهٔ تعیینشده با theme، یا برای تابع prompt در صورتی که هیچ theme مشخص نشده باشد.
- -s
- تنظیم theme به عنوان پوستهٔ کنونی و ذخیرهٔ وضعیت.
- prompt_theme_setup
- هر theme در دسترس دارای یک تابع راهاندازی است که توسط تابع prompt برای نصب آن پوسته فراخوانی میشود. این تابع ممکن است در صورت نیاز توابع دیگری را برای نگهداری اعلان تعریف کند، از جمله توابعی که برای پیشنمایش اعلان یا ارائهٔ راهنما برای استفاده از آن به کار میروند. در حالت عادی نباید تابع راهاندازی یک پوسته را به صورت مستقیم فراخوانی کنید.
- prompt off
- تم `off' تمامی متغیرهای اعلان را بدون هیچ جلوهٔ ویژهای روی مقادیر کمینه تنظیم میکند.
- prompt default
- تم `default' تمامی متغیرهای اعلان را به همان حالتی تنظیم میکند که گویی یک zsh تعاملی بدون هیچ فایل راهاندازی آغاز شده است.
- prompt restore
- تم ویژهٔ `restore' تمام تنظیمات تم را پاک کرده و متغیرهای اعلان را به وضعیت آنها پیش از نخستین باری که تابع `prompt' اجرا شد بازمیگرداند، به شرطی که هر تم پاکسازی (cleanup) خود را بهدرستی تعریف کرده باشد (پایین را ببینید).
توجه داشته باشید که میتوانید اثر `prompt off' و `prompt default' را با `prompt restore' لغو کنید، اما بازیابی دوم اثر اولی را لغو نمیکند.
نوشتن تمها (Writing Themes)
نخستین گام برای افزودن تم اختصاصی خود، انتخاب نامی برای آن و ایجاد فایلی به نام `prompt_name_setup' در پوشهای درون fpath شماست، مانند ~/myfns در مثال بالا. این فایل باید دستکم حاوی مقداردهیهایی برای متغیرهای اعلانی باشد که تم شما مایل به تغییر آنها است. بر طبق رسم معمول، تمها به جای نامهای طولانیتر PROMPT و RPROMPT، از PS1، PS2، RPS1 و غیره استفاده میکنند.
این فایل بهعنوان یک تابع در زمینهٔ جاری پوسته بهطور خودکار بارگذاری (autoload) میشود، بنابراین میتواند شامل هر دستور لازمی برای سفارشیسازی تم شما باشد، از جمله تعریف توابع اضافی. برای آسانتر کردن برخی وظایف پیچیده، تابع راهاندازی (setup) شما میتواند هر یک از کارهای زیر را نیز انجام دهد:
- مقداردهی prompt_opts
- آرایهٔ prompt_opts میتواند هر یک از مقادیر "bang"، "cr"، "percent"، "sp"، و/یا "subst" را دریافت کند. گزینههای setopt متناظر (promptbang و غیره) فعال شده و سایر گزینههای مرتبط با اعلان خاموش میشوند. در صورتی که تابع شما نیاز داشته باشد، آرایهٔ prompt_opts گزینههای setopt را حتی فراتر از حوزهٔ localoptions حفظ میکند.
- تغییر قلابها (Modify hooks)
- استفاده از add-zsh-hook و add-zle-hook-widget توصیه میشود (بخش Manipulating Hook Functions در بالا را ببینید). تمامی قلابهایی که از الگوی نامگذاری prompt_theme_hook پیروی میکنند، هنگام تغییر یا غیرفعال شدن تم اعلان، بهطور خودکار حذف میشوند.
- اعلام پاکسازی (Declare cleanup)
- اگر تابع شما تغییرات دیگری ایجاد میکند که هنگام غیرفعال شدن تم باید خنثی شوند، تابع راهاندازی شما میتواند این دستور را فراخوانی کند:
prompt_cleanup command
که در آن command باید بهطور مناسبی نقلقول (quote) شده باشد. اگر تم شما روزی غیرفعال شود یا تم دیگری جایگزین آن گردد، command با eval اجرا خواهد شد. شما میتوانید بیش از یک قلاب پاکسازی را تعریف کنید.
- تعریف پیشنمایش (Define preview)
- تعریف یا بارگذاری خودکار یک تابع به نام prompt_name_preview برای نمایش نسخهٔ شبیهسازیشدهای از اعلان شما. یک پیشنمایشگر پیشفرض ساده توسط promptinit برای تمهایی که خودشان پیشنمایش را تعریف نکردهاند تعیین شده است. این تابع پیشنمایش توسط `prompt -p' فراخوانی میشود.
- ارائهٔ راهنما (Provide help)
- تعریف یا بارگذاری خودکار یک تابع به نام prompt_name_help برای نمایش مستندات یا متن راهنمای تم شما. این تابع راهنما توسط `prompt -h' فراخوانی میشود.
ابزارکها (Widgets)
همهٔ این توابع ابزارکهای ZLE تعریفشده توسط کاربر را پیادهسازی میکنند (ببینید zshzle(1)) که میتوانند در شلهای تعاملی به کلیدها متصل شوند. برای استفاده از آنها، فایل .zshrc شما باید شامل خطوطی به این صورت باشد:
autoload function zle -N function
که در ادامهٔ آن دستور مناسب bindkey برای مرتبط کردن تابع با یک توالی کلید قرار میگیرد. اتصالات کلیدی پیشنهادی در زیر شرح داده شدهاند.
- توابع کلمه به سبک bash (bash-style word functions)
- اگر به دنبال توابعی برای پیادهسازی پیمایش و ویرایش کلمات به شیوهٔ bash هستید، که در آن فقط نویسههای حرفیعددی به عنوان نویسههای کلمه در نظر گرفته میشوند، میتوانید از توابع شرحدادهشده در بخش بعدی استفاده کنید. موارد زیر کافی است:
autoload -U select-word-style select-word-style bash
- forward-word-match, backward-word-match
- kill-word-match, backward-kill-word-match
- transpose-words-match, capitalize-word-match
- up-case-word-match, down-case-word-match
- delete-whole-word-match, select-word-match
- select-word-style, match-word-context, match-words-by-style
- هشت تابع نخست `-match' جایگزینهای مستقیمی برای ابزارکهای توکار بدون این پسوند هستند. آنها به صورت پیشفرض به شیوهای مشابه عمل میکنند. با این حال، با استفاده از سبکها (styles) و تابع select-word-style، نحوهٔ تطبیق کلمات میتواند دگرگون شود. تابع select-word-match برای استفاده به عنوان یک شیء متنی (text object) در حالت vi اما با سبکهای سفارشی کلمه در نظر گرفته شده است. برای مقایسه، ابزارکهای شرحدادهشده در zshzle(1) زیر عنوان Text Objects از تعاریف ثابتی برای کلمات استفاده میکنند که با ویرایشگر vim سازگار است.
سادهترین روش برای پیکربندی توابع، استفاده از select-word-style است که میتواند یا به عنوان یک تابع عادی با آرگومان مناسب فراخوانی شود، یا به عنوان یک ابزارک تعریفشده توسط کاربر اجرا گردد که نویسهٔ اول سبک کلمهٔ مورد استفاده را درخواست میکند. نخستین باری که فراخوانی میشود، هشت تابع نخست -match به طور خودکار جایگزین نسخههای توکار میشوند، بنابراین نیازی به بارگذاری صریح آنها نیست.
سبکهای کلمهٔ در دسترس به شرح زیر هستند. فقط نخستین نویسه بررسی میشود.
- bash
- نویسههای کلمه فقط نویسههای حرفیعددی هستند.
- normal
- مانند عملکرد عادی شل: نویسههای کلمه نویسههای حرفیعددی به علاوهٔ هر نویسهٔ موجود در رشتهٔ تعیینشده توسط پارامتر $WORDCHARS هستند.
- shell
- کلمات همان آرگومانهای کامل دستور شل هستند، که احتمالاً شامل رشتههای نقلقولشدهٔ کامل، یا هر نشانهٔ (token) ویژهٔ شل میشوند.
- whitespace
- کلمات هر مجموعهای از نویسهها هستند که با فاصلهٔ سفید (whitespace) از یکدیگر جدا شدهاند.
- default
- تنظیمات پیشفرض را بازیابی میکند؛ این حالت معمولاً همانند `normal' است.
همه به جز `default' میتوانند با یک نویسهٔ بزرگ (upper case) وارد شوند، که همان اثر را دارد اما تطبیق زیرکلمه (subword matching) در آن فعال است. در این حالت، با کلماتی که دارای حروف بزرگ هستند به صورت ویژهای رفتار میشود: هر توالی جداگانه از حروف بزرگ، یا یک نویسهٔ بزرگ که به دنبال آن هر تعداد از نویسههای دیگر بیاید، یک کلمه در نظر گرفته میشود. سبک subword-range میتواند یک محدودهٔ نویسهٔ جایگزین برای پیشفرض `[:upper:]' ارائه دهد؛ مقدار این سبک به عنوان محتویات یک الگوی `[...]' در نظر گرفته میشود (توجه داشته باشید که قلابهای بیرونی نباید داده شوند، فقط قلابهای احاطهکنندهٔ محدودههای نامگذاریشده مورد نیاز هستند).
کنترل دقیقتر را میتوان با استفاده از دستور zstyle، همانطور که در zshmodules(1) شرح داده شده است، به دست آورد. هر سبک در بافتار (context) :zle:widget جستجو میشود که در آن widget نام ابزارک تعریفشده توسط کاربر است، نه نام تابعی که آن را پیادهسازی میکند؛ بنابراین در مورد تعاریف ارائهشده توسط select-word-style، بافتارهای مناسب :zle:forward-word و غیره هستند. خود تابع select-word-style همواره سبکهایی را برای بافتار `:zle:*' تعریف میکند که میتوان آنها را با الگوهای خاصتر (طولانیتر) و همچنین بافتارهای صریح بازنویسی کرد.
سبک word-style قواعد مورد استفاده را مشخص میکند. این سبک میتواند مقادیر زیر را داشته باشد.
- normal
- استفاده از قواعد استاندارد شل، یعنی نویسههای حرفیعددی و $WORDCHARS، مگر اینکه توسط سبکهای word-chars یا word-class بازنویسی شود.
- specified
- مشابه normal، اما تنها نویسههای مشخصشده نویسهٔ کلمه در نظر گرفته میشوند، و نه نویسههای حرفیعددی.
- unspecified
- نقیض specified. نویسههای دادهشده آنهایی هستند که بخشی از یک کلمه در نظر گرفته نمیشوند.
- shell
- کلمات با استفاده از قواعد نحوی برای ایجاد آرگومانهای دستور شل به دست میآیند. علاوه بر این، نشانههای ویژهای که هرگز آرگومان دستور نیستند مانند `()' نیز به عنوان کلمه در نظر گرفته میشوند.
- whitespace
- کلمات رشتههایی از نویسهها هستند که با فاصلهٔ سفید از یکدیگر جدا شدهاند.
سه قاعدهٔ نخست معمولاً از $WORDCHARS استفاده میکنند، اما مقدار درون پارامتر میتواند با سبک word-chars بازنویسی شود که دقیقاً به همان روش $WORDCHARS کار میکند. علاوه بر این، سبک word-class از نحو ردهٔ نویسه (character class) برای گروهبندی نویسهها استفاده میکند و در صورت تنظیم هر دو، بر word-chars اولویت دارد. سبک word-class شامل قلابهای احاطهکنندهٔ ردهٔ نویسه نمیشود؛ برای نمونه، `-:[:alnum:]' یک word-class معتبر است برای در بر گرفتن تمام نویسههای حرفیعددی به علاوهٔ نویسههای `-' و `:'. در گنجاندن `]'، `^' و `-' دقت کنید زیرا این موارد در داخل ردههای نویسه ویژه هستند.
سبک word-style همچنین میتواند `-subword' را به انتهای مقدار خود ضمیمه داشته باشد تا همانطور که در بالا توضیح داده شد، تطبیق زیرکلمه فعال شود.
سبک skip-chars بیشتر برای transpose-words و توابع مشابه سودمند است. در صورت تنظیم، این سبک تعداد نویسههایی را مشخص میکند که با شروع از موقعیت مکاننما، صرفنظر از این که در واقع چه هستند، بخشی از کلمه محسوب نشده و مانند فاصله با آنها برخورد میشود. برای نمونه، اگر
zstyle ':zle:transpose-words' skip-chars 1
تنظیم شده باشد و transpose-words-match در حالی فراخوانی شود که مکاننما روی X از fooXbar قرار دارد (که در آن X میتواند هر نویسهای باشد)، عبارت حاصل barXfoo خواهد بود.
کنترل دقیقتر را میتوان با تنظیم سبک word-context به آرایهای از جفتهای ورودی به دست آورد. هر جفت ورودی شامل یک pattern (الگو) و یک subcontext (زیربافتار) است. آرگومان شلی که مکاننما روی آن قرار دارد به نوبت با هر pattern مطابقت داده میشود تا زمانی که یکی مطابقت یابد؛ در صورت تطابق، بافتار با یک دونقطه (colon) و subcontext متناظر گسترش مییابد. توجه داشته باشید که این بررسی بر روی کلمهٔ اصلی در خط و بدون حذف نقلقولها صورت میگیرد. میان کلمات مدیریت ویژهای انجام میشود: بافتار جاری بررسی میگردد و اگر حاوی رشتهٔ between باشد، کلمه روی یک فاصلهٔ تکی تنظیم میشود؛ در غیر این صورت اگر حاوی رشتهٔ back باشد، کلمهٔ قبل از مکاننما در نظر گرفته میشود، در غیر این صورت کلمهٔ بعد از مکاننما در نظر گرفته خواهد شد. چند نمونه در ادامه آورده شده است..PP سبک skip-whitespace-first فقط همراه با ویجت forward-word استفاده میشود. اگر روی true تنظیم شود، آنگاه forward-word از هر نویسهٔ غیرکلمهای، و در ادامه از هر نویسهٔ غیرکلمهایِ پس از آن میگذرد: این شبیه به رفتار دیگر ویجتهای مبتنی بر کلمه و همچنین رفتار ویرایشگرهای دیگر است، اما با رفتار استاندارد zsh تفاوت دارد. هنگام استفاده از select-word-style، اگر سبک کلمه bash باشد این ویجت در بافتار :zle:* روی true و در غیر این صورت روی false تنظیم میشود. با تنظیم آن در بافتار خاصترِ :zle:forward-word* میتوان مقدار آن را لغو (override) کرد.
ایجاد ویجتهایی با رفتار خاص از طریق تعریف یک ویجت جدید که با تابع عمومی مناسب پیادهسازی شده، و سپس تعیین سبک برای بافتار آن ویجت خاص امکانپذیر است. برای نمونه، دستورات زیر یک ویجت backward-kill-space-word را با استفاده از backward-kill-word-match (ویجت عمومیِ پیادهسازیکنندهٔ رفتار backward-kill-word) تعریف کرده و تضمین میکند که ویجت جدید همواره رفتارِ جداشده با فاصله (space-delimited) را پیادهسازی نماید.
zle -N backward-kill-space-word backward-kill-word-match zstyle :zle:backward-kill-space-word word-style space
اکنون میتوان ویجت backward-kill-space-word را به یک کلید مقید (bind) کرد.
در ادامه چند مثال دیگر از نحوهٔ استفاده از سبکها آمده است که در واقع از رابط کاربری سادهشده در select-word-style برگرفته شدهاند:
zstyle ':zle:*' word-style standard zstyle ':zle:*' word-chars ''
مدیریت کلمه به سبک bash را برای همهٔ ویجتها پیادهسازی میکند، یعنی فقط نویسههای الفباییعددی نویسهٔ کلمه محسوب میشوند؛ معادل خالی تنظیم کردن پارامتر WORDCHARS برای بافتار مربوطه.
style ':zle:*kill*' word-style space
برای ویجتهایی که واژهٔ «kill» در نامشان وجود دارد، از کلمات جداشده با فاصله استفاده میکند. در این حالت هیچیک از سبکهای word-chars یا word-class استفاده نمیشوند.
در اینجا چند مثال از استفاده از سبک word-context برای بسط دادن بافتار آمده است.
zstyle ':zle:*' word-context \
"*/*" filename "[[:space:]]" whitespace
zstyle ':zle:transpose-words:whitespace' word-style shell
zstyle ':zle:transpose-words:filename' word-style normal
zstyle ':zle:transpose-words:filename' word-chars ''
این پیکربندی بسته به اینکه مکاننما روی فاصلهٔ خالی میان کلمات باشد یا روی نام یک فایل (در اینجا هر کلمهای که دارای / باشد)، دو شیوهٔ مختلف را برای استفاده از transpose-words فراهم میکند. روی فاصلهٔ خالی، آرگومانهای کامل آنگونه که طبق قوانین استاندارد پوسته تعریف شدهاند جابهجا میشوند. در یک نام فایل، فقط نویسههای الفباییعددی جابهجا خواهند شد. در جاهای دیگر، کلمات با استفاده از سبک پیشفرضِ :zle:transpose-words جابهجا میشوند.
تطبیق کلمات و تمامی فرایندهای مدیریت تنظیمات zstyle در واقع توسط تابع match-words-by-style پیادهسازی شده است. این تابع میتواند برای ساخت ویجتهای سفارشیِ جدید توسط کاربر استفاده شود. تابع فراخواننده باید پارامتر محلی curcontext را روی :zle:widget تنظیم کرده، پارامتر محلی matched_words را ایجاد نماید و تابع match-words-by-style را بدون هیچ آرگومانی فراخوانی کند. در هنگام بازگشت، matched_words به آرایهای با این عناصر مقداردهی میشود: (۱) ابتدای خط (۲) کلمهٔ قبل از مکاننما (۳) هر نویسهٔ غیرکلمهایِ بین آن کلمه و مکاننما (۴) هر نویسهٔ غیرکلمهای در موقعیت مکاننما به همراه نویسههای غیرکلمهایِ باقیمانده پیش از کلمهٔ بعدی، شامل تمام نویسههای مشخصشده توسط سبک skip-chars، (۵) کلمهٔ روی مکاننما یا پس از آن (۶) هر نویسهٔ غیرکلمهای پس از آن کلمه (۷) باقیماندهٔ خط. هر یک از این عناصر میتواند یک رشتهٔ خالی باشد؛ تابع فراخواننده باید این موضوع را بررسی کند تا تعیین نماید که آیا قادر به اجرای عملکرد خود هست یا خیر.
اگر متغیر matched_words توسط فراخوانندهٔ match-words-by-style به صورت یک آرایهٔ انجمنی (local -A matched_words) تعریف شده باشد، آنگاه مقادیر هفتگانهٔ ارائهشده در بالا باید به عنوان عناصری با نامهای start، word-before-cursor، ws-before-cursor، ws-after-cursor، word-after-cursor، ws-after-word و end از آن استخراج شوند. علاوه بر این، چنانچه مکاننما در آغاز یک کلمه یا زیرکلمه باشد، یا روی فاصلهٔ خالی پیش از آن قرار گرفته باشد (این دو حالت با بررسی عنصر ws-after-cursor قابل تفکیک هستند)، مقدار عنصر is-word-start برابر ۱ و در غیر این صورت ۰ خواهد بود. این شیوه برای حفظ سازگاری در آینده پیشنهاد میشود.
امکان ارسال گزینهها به همراه آرگومان به match-words-by-style جهت بازنویسی و لغو استفاده از سبکها وجود دارد. این گزینهها عبارتند از:
برای مثال، میتوان از دستور match-words-by-style -w shell -c 0 برای استخراج آرگومان دستوریِ پیرامون مکاننما استفاده کرد.
سبک word-context توسط تابع match-word-context پیادهسازی شده است. معمولاً نیازی نیست که این تابع مستقیماً فراخوانی شود.
- bracketed-paste-magic
- ویجت bracketed-paste (به زیربخش «Miscellaneous» در zshzle(1) مراجعه کنید) متن چسباندهشده را به جای تفسیر به عنوان ورودیهای صفحهکلید، به صورت لفظی در بافر ویرایشگر درج میکند. این امر برخی کاربردهای متداول را که در آنها ویجت self-insert برای اعمال پردازشهای بیشتر جایگزین شده است غیرفعال میسازد. یک نمونه از آن، ویجت الحاقی url-quote-magic است که در زیر شرح داده شده است.
ویجت bracketed-paste-magic با این هدف طراحی شده است که bracketed-paste را با یک پوششدهنده (wrapper) جایگزین کند که این عملیاتهای self-insert و دیگر اقدامات تعیینشده توسط zstyleها را مجدداً فعال میسازد. از این رو این ویجت با دستور زیر راهاندازی میشود:
autoload -Uz bracketed-paste-magic zle -N bracketed-paste bracketed-paste-magic
به جز فعال کردن پردازشِ برخی ویجتها، bracketed-paste-magic سعی میکند عملکرد bracketed-paste را تا جای ممکن به شکلی دقیق و وفادارانه بازتولید کند.
سبکهای zstyle زیر را میتوان برای کنترل پردازش متن چسباندهشده تنظیم کرد. همهٔ آنها در بافتار «:bracketed-paste-magic» جستجو میشوند.
- active-widgets
- فهرستی از الگوهای منطبق بر نامهای ویجتهایی است که باید در زمان چسباندن متن فعال شوند. تمام دنبالههای کلید دیگر به صورت self-insert-unmeta پردازش میشوند. مقدار پیشفرض «self-*» است، از این رو هر ویجت سفارشیِ تعریفشده با این پیشوند در کنار ویجت توکار self-insert فعال خواهد بود.
اگر این سبک تنظیم نشود (بهطور صریح حذف گردد) یا مقداری خالی به آن اختصاص یابد، هیچ ویجتی فعال نخواهد بود و متنِ چسباندهشده به صورت لفظی درج میشود. اگر مقدار آن شامل «undefined-key» باشد، هر دنبالهٔ ناشناخته از متن چسباندهشده حذف و نادیده گرفته میشود.
- inactive-keys
- نقطهٔ مقابل active-widgets؛ فهرستی از دنبالههای کلید است که همواره از self-insert-unmeta استفاده میکنند، حتی اگر به یک ویجت فعال مقید شده باشند. توجه داشته باشید که این مورد فهرستی از دنبالههای کلید لفظی (عینی) است، نه الگوها.
- paste-init
- فهرستی از نام توابع است که در بافتار ویجت (اما نه به عنوان ویجت) فراخوانی میشوند. توابع به ترتیب فراخوانی میشوند تا زمانی که یکی از آنها وضعیت خروجی غیرصفر برگرداند. پارامتر «PASTED» حاوی وضعیت اولیهٔ متن چسباندهشده است. تمام پارامترهای دیگر ZLE نظیر «BUFFER» مقادیر و اثرات جانبی عادی خود را دارند و تاریخچهٔ کامل در دسترس است؛ بنابراین برای مثال توابع paste-init میتوانند کلماتی را از BUFFER به PASTED انتقال دهند تا آن کلمات برای active-widgets قابل مشاهده باشند. بازگشت مقداری غیرصفر از یک تابع paste-init مانع از انجام خود عملیات جایگذاری نمیشود.
بارگذاری bracketed-paste-magic تابع کمکی backward-extend-paste را برای استفاده در paste-init تعریف میکند.
zstyle :bracketed-paste-magic paste-init \
backward-extend-paste
هنگامی که یک جایگذاری در میانهی یک کلمه درج شود یا متنی را به کلمهای که از پیش روی خط وجود دارد اضافه کند، backward-extend-paste پیشوند را از LBUFFER به PASTED منتقل میکند تا active-widgets کل کلمه را تا آن نقطه ببینند. این قابلیت میتواند با url-quote-magic مفید باشد.
- paste-finish
- فهرست دیگری از نامهای توابع که به ترتیب فراخوانی میشوند تا زمانی که یکی از آنها مقداری غیرصفر بازگرداند. این توابع پس از پردازش متن جایگذاریشده توسط active-widgets، اما پیش از درج آن در `BUFFER' فراخوانی میشوند. پارامترهای ZLE مقادیر و اثرات جانبی معمول خود را دارند.
بازگشت مقداری غیرصفر از یک تابع paste-finish مانع از انجام خود عملیات جایگذاری نمیشود.
بارگذاری bracketed-paste-magic همچنین تابع کمکی quote-paste را برای استفاده در paste-finish تعریف میکند.
zstyle :bracketed-paste-magic paste-finish \
quote-paste
zstyle :bracketed-paste-magic:finish quote-style \
qqq
هنگامی که متن جایگذاریشده در BUFFER درج میشود، مطابق با مقدار quote-style نقلقولبندی میشود. برای غیرفعال کردن اجباری نقلقولبندی پیشوند عددی توکارِ bracketed-paste، از دستور زیر استفاده کنید:
zstyle :bracketed-paste-magic:finish quote-style \
none
مهم: در
حین پردازش
جایگذاری
توسط active-widgets (پس
از paste-init و پیش
از paste-finish)، BUFFER در
ابتدا خالی
است و
تاریخچه
محدود
میگردد،
بنابراین
حرکات
مکاننما و
موارد
مشابه ممکن
است به خارج
از محتوای
جایگذاریشده
نروند. متنی
که توسط
ویجتهای
فعال به BUFFER
اختصاص
داده
میشود،
پیش از paste-finish
دوباره
درون PASTED کپی
میشود.
- copy-earlier-word
- این ویجت مانند ترکیبی از insert-last-word و copy-prev-shell-word عمل میکند. فراخوانیهای مکرر این ویجت کلمات پیشین را در خط تاریخچهی مربوطه بازیابی میکند. با یک آرگومان عددی N، کلمهی Nام از خط تاریخچه درج میشود؛ N میتواند منفی باشد تا شمارش از انتهای خط انجام گیرد.
اگر از insert-last-word برای بازیابی آخرین کلمهی یک خط تاریخچهی قبلی استفاده شده باشد، فراخوانیهای مکرر آن کلمه را با کلمات پیشین از همان خط جایگزین میکند.
در غیر این صورت، ویجت بر روی کلمات خطی که در حال حاضر ویرایش میشود اعمال میگردد. سبک widget را میتوان روی نام ویجت دیگری تنظیم کرد که باید برای بازیابی کلمات فراخوانی شود. این ویجت باید همان سه آرگومان insert-last-word را بپذیرد.
- cycle-completion-positions
- پس از درج یک رشتهی بدون ابهام در خط فرمان، سامانهی جدید کاملسازی مبتنی بر تابع ممکن است چندین نقطه در این رشته را شناسایی کند که نویسهها در آنها جا افتادهاند یا دستکم با یکی از تطابقهای ممکن تفاوت دارند. سپس مکاننما در موقعیتی قرار میگیرد که جالبترین موقعیت به شمار میرود، یعنی موقعیتی که در آن میتوان با کمترین میزان تایپ، بین بیشترین تطابقهای ممکن رفع ابهام کرد.
این ویجت اجازه میدهد که مکاننما به آسانی به سایر نقاط مهم جابهجا شود. میتوان آن را مکرراً فراخوانی کرد تا میان تمام موقعیتهای گزارششده توسط سامانهی کاملسازی چرخش انجام گیرد.
- delete-whole-word-match
- این تابع دیگری است که مانند توابع -match که پیشتر توضیح داده شد عمل میکند، یعنی از سبکها برای تعیین مرزهای کلمه استفاده میکند. با این حال، جایگزینی برای هیچ تابع موجودی نیست.
رفتار پایهای آن حذف کلمهی پیرامون مکاننما است. هیچ پردازشی روی آرگومان عددی وجود ندارد؛ تنها همان تککلمهی اطراف مکاننما در نظر گرفته میشود. اگر ویجت شامل رشتهی kill باشد، متن حذفشده برای بازگردانی (yank) بعدی در cutbuffer قرار میگیرد. این رفتار را میتوان با تعریف kill-whole-word-match به صورت زیر پیاده کرد:
zle -N kill-whole-word-match delete-whole-word-match
و سپس مقیدسازی ویجت kill-whole-word-match.
- up-line-or-beginning-search, down-line-or-beginning-search
- این ویجتها مشابه توابع توکار up-line-or-search و down-line-or-search هستند: اگر در یک بافر چندخطی باشند به بالا یا پایین در بافر حرکت میکنند، در غیر این صورت به دنبال خطی از تاریخچه میگردند که با ابتدای خط جاری مطابقت داشته باشد. با این حال در این مورد، آنها به جای نخستین کلمهی خط، همانند history-beginning-search-backward و -forward به دنبال خطی میگردند که با خط جاری تا موقعیت فعلی مکاننما مطابقت داشته باشد.
- edit-command-line
- ویرایش خط فرمان با استفاده از ویرایشگر بصری، همانند ksh.
bindkey -M vicmd v edit-command-line
ویرایشگری که باید استفاده شود را نیز میتوان با استفاده از سبک editor در بافتار ویجت مشخص کرد. این ویرایشگر به عنوان آرایهای از دستور و آرگومانها مشخص میشود:
zstyle :zle:edit-command-line editor gvim -f
- expand-absolute-path
- گسترش نام فایل زیر مکاننما به یک مسیر مطلق، به همراه حل پیوندهای نمادین. در صورت امکان، بخش آغازین مسیر به یک دایرکتوری نامگذاریشده یا ارجاعی به دایرکتوری خانگی کاربر تبدیل میشود.
- history-search-end
- این تابع ویجتهای history-beginning-search-backward-end و history-beginning-search-forward-end را پیادهسازی میکند. این دستورها ابتدا با فراخوانی ویجت توکار متناظر (بخش `History Control' در zshzle(1) را ببینید) و سپس جابهجا کردن مکاننما به انتهای خط عمل میکنند. موقعیت اولیهی مکاننما به خاطر سپرده شده و پیش از فراخوانی مجدد ویجت توکار بازگردانی میشود، تا همان جستجو برای پیمایش بیشتر در تاریخچه تکرار شود.
اگرچه تنها یک تابع را autoload میکنید، اما دستورهای استفاده از آن کمی متفاوت هستند چرا که دو ویجت را پیادهسازی میکند.
zle -N history-beginning-search-backward-end \
history-search-end
zle -N history-beginning-search-forward-end \
history-search-end
bindkey '\e^P' history-beginning-search-backward-end
bindkey '\e^N' history-beginning-search-forward-end
- history-beginning-search-menu
- این تابع شکل دیگری از جستجوی تاریخچه را پیادهسازی میکند. متن پیش از مکاننما برای انتخاب خطوط از تاریخچه استفاده میشود، همانند history-beginning-search-backward با این تفاوت که همهی تطابقها در یک منوی شمارهدار نمایش داده میشوند. با فشردن ارقام مربوطه، کل خط تاریخچه درج میگردد. توجه داشته باشید که صفرهای آغازین حتماً باید تایپ شوند (آنها تنها در صورت لزوم برای رفع ابهام نمایش داده میشوند). تمام تاریخچه جستجو میشود؛ هیچ تمایزی میان جستجو به سمت جلو یا عقب وجود ندارد. با یک آرگومان عددی، جستجو به ابتدای خط مقید نمیشود؛ رشته تایپشده توسط کاربر ممکن است در هر کجای خط در تاریخچه ظاهر شود.
اگر نام ویجت شامل `-end' باشد، مکاننما به انتهای خط درجشده منتقل میشود. اگر نام ویجت شامل `-space' باشد، هر فاصلهای در متن تایپشده به عنوان یک نویسه عمومی (wildcard) در نظر گرفته میشود و میتواند با هر چیزی تطابق یابد (از این رو وجود یک فاصله در ابتدا معادل دادن یک آرگومان عددی است). هر دو فرم را میتوان ترکیب کرد، برای مثال:
zle -N history-beginning-search-menu-space-end \
history-beginning-search-menu
- history-pattern-search
- تابع history-pattern-search ویجتهایی را پیادهسازی میکند که الگویی را برای جستجوی تاریخچه به سمت عقب یا جلو درخواست میکنند. الگو در قالب معمول zsh است، با این حال نویسه اول میتواند ^ باشد تا جستجو را به ابتدای خط مقید سازد، و نویسه آخر میتواند $ باشد تا جستجو را به انتهای خط مقید کند. اگر جستجو به انتهای خط مقید نشده باشد، مکاننما درست پس از الگوی یافتشده قرار میگیرد.
دستورهای ایجاد ویجتهای قابل انتساب مشابه موارد موجود در مثال دقیقاً بالا هستند:
autoload -U history-pattern-search zle -N history-pattern-search-backward history-pattern-search zle -N history-pattern-search-forward history-pattern-search
- incarg
- تایپ کلیدهای این ویجت در حالی که مکاننما روی یک عدد صحیح یا در سمت چپ آن قرار دارد، باعث میشود آن عدد صحیح یک واحد افزایش یابد. با یک آرگومان عددی، عدد به میزان مقدار آرگومان افزایش مییابد (و در صورتی که آرگومان عددی منفی باشد، کاهش مییابد). پارامتر پوسته incarg را میتوان برای تغییر مقدار افزایش پیشفرض به مقداری غیر از یک تنظیم کرد.
bindkey '^X+' incarg
- incremental-complete-word
- این ویژگی امکان تکمیل افزایشی یک کلمه را فراهم میکند. پس از شروع این دستور، پس از هر نویسهای که تایپ میکنید فهرستی از گزینههای تکمیل میتواند نمایش داده شود که میتوانید آن را با ^H یا DEL حذف کنید. فشردن return تکمیل انجامشده تا این لحظه را میپذیرد و شما را به ویرایش عادی بازمیگرداند (یعنی خط فرمان بلافاصله اجرا نمیشود). میتوانید TAB را برای تکمیل عادی، ^G را برای لغو و بازگشت به وضعیت زمان شروع، و ^D را برای فهرست کردن تطابقها بزنید.
این ویژگی تنها با سیستم جدید تکمیل مبتنی بر تابع کار میکند.
bindkey '^Xi' incremental-complete-word
- insert-composed-char
- این تابع به شما اجازه میدهد نویسههایی را که روی صفحهکلید وجود ندارند ترکیب کرده و در خط فرمان درج کنید. پس از این دستور، دو کلید متناظر با نویسههای ASCII وارد میشود (هیچ خط اعلانی وجود ندارد). برای نویسههای اعرابدار، این دو کلید عبارتند از یک نویسه پایه و به دنبال آن یک کد برای حرکت، در حالی که برای سایر نویسههای خاص، این دو نویسه با هم یک نماد اختصاری (mnemonic) را برای نویسهای که باید درج شود تشکیل میدهند. کدهای دو-نویسهای زیرمجموعهای از کدهای ارائهشده توسط RFC 1345 هستند (برای مثال ببینید: http://www.faqs.org/rfcs/rfc1345.html).
این تابع میتواند به صورت اختیاری با حداکثر دو نویسه دنبال شود که جایگزین یک یا هر دو نویسه خواندهشده از صفحهکلید میشوند؛ اگر هر دو نویسه ارائه شوند، هیچ ورودیای خوانده نمیشود. برای مثال، insert-composed-char a: میتواند درون یک ویجت برای درج یک a با اوملاوت در خط فرمان استفاده شود. این روش نسبت به استفاده از نویسه تحتاللفظی این مزیت را دارد که سازگارتر و قابلحملتر است.
برای بهترین نتیجه، zsh باید با پشتیبانی از نویسههای چندبایتی ساخته شده باشد (پیکربندیشده با --enable-multibyte)؛ با این حال، این تابع برای دامنه محدودی از نویسههای موجود در مجموعهنویسههای تکبایتی مانند ISO-8859-1 نیز کار میکند.
نویسه به نمایش محلی تبدیل شده و در موقعیت مکاننما در خط فرمان درج میشود. (این تبدیل در داخل پوسته و با استفاده از امکانات فراهمشده توسط کتابخانه C انجام میگیرد.) با یک آرگومان عددی، نویسه و کد آن در خط وضعیت پیشنمایش داده میشوند.
این تابع را میتوان خارج از zle اجرا کرد که در این صورت نویسه را (همراه با یک خط جدید) در خروجی استاندارد چاپ میکند. ورودی همچنان از فشردن کلیدها خوانده میشود.
برای روشی جایگزین جهت درج نویسههای Unicode با استفاده از شماره نویسه شانزدهشانزدهی (هگزادسیمال) آنها، insert-unicode-char را ببینید.
مجموعه نویسههای اعرابدار تا نویسه Unicode با کد U+0180 نسبتاً کامل است، اما مجموعه نویسههای خاص کمتر چنین است. با این حال، از آن نقطه به بعد بسیار پراکنده میشود. افزودن نویسههای جدید آسان است؛ تابع define-composed-chars را ببینید. لطفاً هرگونه مورد جدید را به zsh-workers@zsh.org ارسال کنید.
کدهای نویسه دوم هنگامی که برای اعرابگذاری روی نویسه اول به کار میروند به شرح زیر است. توجه داشته باشید که هر نویسهای نمیتواند هر حرکتی را بپذیرد.
- !
- گراو (Grave).
- '
- اکیوت (Acute).
- >
- سیرکومفلکس (Circumflex).
- ?
- تیلده (Tilde). (این نویسه ~ نیست زیرا RFC 1345 فرض نمیکند که این نویسه روی صفحهکلید موجود باشد.)
- -
- ماکرون (Macron). (یک خط افقی بالای نویسه پایه).
- (
- برِوْ (Breve). (یک شکل پیالهای کمعمق بالای نویسه پایه).
- .
- نقطه بالای نویسه پایه، یا در مورد i بدون نقطه، یا در مورد L و l یک نقطه مرکزی.
- :
- دیهرسیس یا اوملاوت (Diaeresis/Umlaut).
- c
- سدیل (Cedilla).
- _
- زیرخط، با این حال در حال حاضر هیچ نویسه زیرخطداری وجود ندارد.
- /
- خط مورب روی نویسه پایه.
- "
- اکیوت دوگانه (تنها روی چند حرف پشتیبانی میشود).
- ;
- اوگونک (Ogonek). (یک قلاب کوچک رو به جلو در پایین سمت راست نویسه).
- <
- کارون (Caron). (یک v کوچک بالای حرف).
- 0
- دایره بالای نویسه پایه.
- 2
- قلاب بالای نویسه پایه.
- 9
- شاخک (Horn) بالای نویسه پایه.
رایجترین نویسهها از الفباهای عربی، سیریلیک، یونانی و عبری در دسترس هستند؛ برای توالیهای مربوطه به RFC 1345 مراجعه کنید. علاوه بر این، مجموعهای از کدهای دوحرفی که در RFC 1345 وجود ندارند برای نویسههای با عرض دوگانه متناظر با نویسههای ASCII از ! تا ~ (0x21 تا 0x7e) با قرار دادن پیشوند ^ قبل از نویسه در دسترس هستند، برای مثال ^A برای یک A با عرض دوگانه..PP توالیهای دو نویسهای زیر نیز شناختهشده هستند.
- نویسههای ASCII
- این نویسهها هماکنون در بیشتر صفحهکلیدها موجود هستند:
- <(
- قلاب چپ (کروشه باز)
- //
- بکاسلش (ممیز وارونه)
- )>
- قلاب راست (کروشه بسته)
- (!
- ابرو چپ (آکولاد باز)
- !!
- خط عمودی (نماد پایپ)
- !)
- ابرو راست (آکولاد بسته)
- '?
- تیلده (مدک)
- حروف ویژه
- نویسههایی که در گونههای مختلف الفبای لاتین یافت میشوند:
- ss
- استزت (اس تیز یا scharfes S)
- D-, d-
- اث (Eth)
- TH, th
- تورن (Thorn)
- kk
- کرا (Kra)
- 'n
- 'n
- NG, ng
- Ng
- OI, oi
- Oi
- yr
- yr
- ED
- اژ (ezh)
- نمادهای یکای پول
- Ct
- سنت
- Pd
- پوند استرلینگ (همچنین لیر و غیره)
- Cu
- نشان عمومی ارز
- Ye
- ین
- Eu
- یورو (توجه: در RFC 1345 موجود نیست)
- نویسههای نشانهگذاری
- ارجاعها به نقلقولهای «راست» نشاندهنده شکل ظاهری آنهاست (مانند ۹ به جای ۶) نه کاربرد دستوری آنها. (برای نمونه، نقلقول دوگانه پایین «راست» برای باز کردن نقلقول در زبان آلمانی به کار میرود.)
- !I
- علامت تعجب وارونه
- BB
- خط عمودی شکسته
- SE
- بخش (Section)
- Co
- کپیرایت (حق نشر)
- -a
- نشانگر ترتیبی مؤنث اسپانیایی
- <<
- گیومه چپ
- --
- خط پیوند نرم (Soft hyphen)
- Rg
- نشان تجاری ثبتشده
- PI
- پیلکرو (نشان پاراگراف)
- -o
- نشانگر ترتیبی مذکر اسپانیایی
- >>
- گیومه راست
- ?I
- علامت سؤال وارونه
- -1
- خط فاصله (Hyphen)
- -N
- خط تیره ان (En dash)
- -M
- خط تیره ام (Em dash)
- -3
- خط افقی (Horizontal bar)
- :3
- سه نقطه عمودی
- .3
- سه نقطه افقی خط وسط
- !2
- خط عمودی دوتایی
- =2
- خط زیرین دوتایی
- '6
- علامت نقلقول تکی چپ
- '9
- علامت نقلقول تکی راست
- .9
- نقلقول پایین «راست»
- 9'
- نقلقول «راست» معکوس
- "6
- علامت نقلقول دوتایی چپ
- "9
- علامت نقلقول دوتایی راست
- :9
- نقلقول دوتایی پایین «راست»
- 9"
- نقلقول دوتایی «راست» معکوس
- /-
- خنجر (Dagger)
- /=
- خنجر دوتایی (Double dagger)
- نمادهای ریاضی.PD 0
- DG
- درجه
- -2, +-, -+
- علامت -، علامت +/-، علامت -/+
- 2S
- بالانویس ۲
- 3S
- بالانویس ۳
- 1S
- بالانویس ۱
- My
- میکرو
- .M
- نقطه میانی
- 14
- یکچهارم
- 12
- یکدوم (نیم)
- 34
- سهچهارم
- *X
- ضرب
- -:
- تقسیم
- %0
- در هزار (پر میل)
- FA, TE, /0
- به ازای هر (سور عمومی)، وجود دارد (سور وجودی)، مجموعه تهی
- dP, DE, NB
- مشتق جزئی، دلتا (افزایش)، دل (نابَلا)
- (-, -)
- عضوِ، شاملِ
- *P, +Z
- حاصلضرب، مجموع
- *-, Ob, Sb
- ستاره، حلقه، گلوله (bullet)
- RT, 0(, 00
- علامت رادیکال، متناسب با، بینهایت
- نمادهای دیگر
- cS, cH, cD, cC
- خالهای ورق: پیک، دل، خشت، گشنیز
- Md, M8, M2, Mb, Mx, MX
- نتنویسی موسیقی: نت سیاه (یکچهارم)، نت چنگ (یکهشتم)، نت دولاچنگ (یکشانزدهم)، علامت پرچم، علامت بکار (طبیعی)، علامت دیز
- Fm, Ml
- مؤنث، مذکر
- نشانههای اکسان (اعراب) بهتنهایی
- '>
- اکسان سرکومفلکس / هشتک (مشابه کارِت، ^)
- '!
- اکسان گراو (مشابه بکتیک، `)
- ',
- سدیل (Cedilla)
- ':
- دونقطه (اوملاوت)
- 'm
- ماکرون (خط تیره روی حرف)
- ''
- اکسان اگو (Acute)
- insert-files
- این تابع به شما امکان میدهد تا یک الگوی فایل را تایپ کرده و نتایج بسط را در هر مرحله مشاهده کنید. هنگامی که کلید بازگشت (Return) را فشار میدهید، تمام بسطها درون خط فرمان درج میشوند.
bindkey '^Xf' insert-files
- insert-unicode-char
- هنگامی که برای نخستین بار اجرا میشود، کاربر مجموعهای از ارقام هگزادسیمال (شانزدهشانزدهی) را وارد میکند. این ورودی با فراخوانی دیگری از insert-unicode-char پایان میپذیرد. سپس ارقام به نویسه یونیکد متناظر تبدیل میشوند. برای نمونه، اگر ویجت به ^XU مقید شده باشد، توالی نویسه `^XU 4 c ^XU' نویسه L (یونیکد U+004c) را درج میکند.
برای روشی جهت درج نویسهها با استفاده از یک شناسه اختصاری (کد حفظی) دو نویسهای، insert-composed-char را ببینید.
- narrow-to-region [ -p pre ] [ -P post ]
- [ -S statepm | -R statepm | [ -l lbufvar ] [ -r rbufvar ] ]
- [ -n ] [ start end ]
- narrow-to-region-invisible
- بخش قابل ویرایش بافر را به ناحیه بین مکاننما و نشان (mark) محدود میکند، که میتواند به هر ترتیبی باشد. این ناحیه نباید خالی باشد.
narrow-to-region میتواند به عنوان یک ویجت استفاده شود یا به صورت یک تابع از یک ویجت تعریفشده توسط کاربر فراخوانی گردد؛ به طور پیشفرض، متن بیرون از ناحیه قابل ویرایش، مرئی باقی میماند. یک recursive-edit انجام میشود و سپس وضعیت گسترشیافته اولیه بازیابی میگردد. هنگامی که به صورت تابع فراخوانی میشود، گزینهها و آرگومانهای گوناگونی در دسترس هستند.
گزینههای -p pretext و -P posttext میتوانند برای جایگزینی متنِ قبل و بعد از ناحیه نمایش در طول مدت اجرای تابع استفاده شوند؛ هر یک یا هر دوی آنها میتوانند یک رشته خالی باشند.
اگر گزینه -n نیز داده شود، pretext یا posttext تنها در صورتی درج خواهند شد که به ترتیب متنی قبل یا بعد از ناحیه وجود داشته باشد که نامرئی خواهد شد.
میتوان دو آرگومان عددی تعیین کرد که به جای موقعیتهای مکاننما و نشان به کار خواهند رفت.
گزینه -S statepm برای محدودسازی بر اساس سایر گزینهها ضمن ذخیره وضعیت اولیه در پارامتری با نام statepm به کار میرود، در حالی که گزینه -R statepm برای بازیابی وضعیت از آن پارامتر استفاده میشود؛ توجه داشته باشید که در هر دو حالت، نام پارامتر لازم است. در حالت دوم، سایر گزینهها و آرگومانها بیاهمیت هستند. هنگامی که از این روش استفاده میشود، هیچ recursive-editی انجام نمیگیرد؛ ویجت فراخواننده باید این تابع را با گزینه -S فراخوانی کند، ویرایش مورد نظر خود را روی خط فرمان انجام دهد یا از طریق `zle recursive-edit' کنترل را به کاربر بسپارد، سپس این تابع را با گزینه -R فراخوانی نماید. آرگومان statepm باید نام مناسبی برای یک پارامتر معمولی باشد، به جز اینکه پارامترهایی که با پیشوند _ntr_ آغاز میشوند برای استفاده در narrow-to-region رزرو شدهاند. به طور معمول، این پارامتر برای تابع فراخواننده محلی (local) خواهد بود.
گزینههای -l lbufvar و -r rbufvar میتوانند برای مشخص کردن پارامترهایی استفاده شوند که ویجت متن حاصل از عملیات را در آنها ذخیره میکند. پارامتر lbufvar حاوی LBUFFER و rbufvar حاوی RBUFFER خواهد بود. هیچ یک از این دو گزینه نمیتوانند همراه با -S یا -R استفاده شوند.
narrow-to-region-invisible یک ویجت ساده است که narrow-to-region را با آرگومانهایی فراخوانی میکند که هر متنی خارج از ناحیه را با `...' جایگزین مینماید. این ویجت هیچ آرگومانی نمیپذیرد..PP صفحهنمایش با اجرای هر دستور zle که معمولاً موجب پذیرفته شدن یا لغو شدن خط میشود بازیابی میگردد (و ابزارک بازمیگردد). از این رو، یک دستور اضافی از این دست برای پذیرش یا لغو خط فعلی مورد نیاز است.
وضعیت بازگشتی هر دو ابزارک در صورتی که خط پذیرفته شده باشد صفر، و در غیر این صورت غیرصفر است.
در اینجا نمونهای ساده از ابزارکی که از این ویژگی استفاده میکند آمده است.
local state narrow-to-region -p $'Editing restricted region\n' \ -P '' -S state zle recursive-edit narrow-to-region -R state
- predict-on
- این مجموعه توابع، تایپ پیشبینانه را با استفاده از جستجو در تاریخچه پیادهسازی میکند. پس از اجرای predict-on، تایپ نویسهها باعث میشود ویرایشگر در تاریخچه به سمت عقب جستجو کند تا اولین خطی را که با آنچه تا کنون تایپ کردهاید آغاز میشود بیابد. پس از predict-off، ویرایش برای خطِ پیداشده به حالت عادی بازمیگردد. در واقع، اغلب حتی نیازی به استفاده از predict-off ندارید، زیرا اگر خط با موردی در تاریخچه مطابقت نداشته باشد، فشردن یک کلید تکمیل خودکار استاندارد را انجام میدهد و در صورت نیافتن هیچ تکمیل خودکاری، نویسه درج میشود. با این حال، ویرایش در میانه خط ممکن است پیشبینی را دچار سردرگمی کند؛ سبک toggle را در زیر ببینید.
با سیستم تکمیل خودکار مبتنی بر تابع (که برای این کار لازم است)، باید بتوانید تقریباً در هر نقطهای کلید TAB را بزنید تا مکاننما به موقعیت نویسه «جالب» بعدی برود (معمولاً انتهای کلمه جاری، اما گاهی در میانهی کلمه). و البته به محض اینکه کل خط همان چیزی شد که میخواهید، میتوانید بدون نیاز به انتقال مکاننما به انتها، آن را با کلید return بپذیرید.
نخستین باری که predict-on استفاده میشود، چند تابع ابزارک اضافی میسازد:
- delete-backward-and-predict
- جایگزین ابزارک backward-delete-char میشود. نیازی نیست خودتان آن را مقید (bind) کنید.
- insert-and-predict
- تایپ پیشبینانه را با جایگزینی ابزارک self-insert پیادهسازی میکند. نیازی نیست خودتان آن را مقید کنید.
- predict-off
- تایپ پیشبینانه را خاموش میکند.
اگرچه تنها تابع predict-on را autoload میکنید، لازم است یک مقیدسازی کلید برای predict-off نیز تعریف کنید.
zle -N predict-on zle -N predict-off bindkey '^X^Z' predict-on bindkey '^Z' predict-off
- read-from-minibuffer
- این تابع بیشترین کاربرد را زمانی دارد که به عنوان یک تابع از درون یک ابزارک فراخوانی شود، اما به خودی خود نیز به عنوان یک ابزارک به درستی کار خواهد کرد. این ابزارک مقداری را در زیر خط فرمان فعلی درخواست میکند؛ این مقدار را میتوان با استفاده از تمامی عملیات استاندارد zle (و نه صرفاً مجموعه محدودی که مثلاً هنگام اجرای execute-named-cmd در دسترس است) وارد کرد. سپس مقدار در پارامتر $REPLY به تابع فراخوان بازگردانده شده و بافر ویرایش به وضعیت پیشین خود بازیابی میشود. اگر خواندن ورودی با یک وقفه صفحهکلید (معمولاً ^G) لغو شود، تابع وضعیت ۱ را بازمیگرداند و $REPLY مقداردهی نمیشود.
اگر یک آرگومان به تابع داده شود، به عنوان اعلان (prompt) در نظر گرفته میشود، در غیر این صورت از «? » استفاده میشود. اگر دو آرگومان داده شود، اولی اعلان و دومی مقدار اولیهی $LBUFFER است، و اگر آرگومان سومی داده شود مقدار اولیهی $RBUFFER خواهد بود. این کار مقدار پیشفرض و جایگیری اولیه مکاننما را فراهم میکند. پس از بازگشت، کل بافر مقدار $REPLY خواهد بود.
یک گزینه در دسترس است: «-k num» مشخص میکند که به جای کل یک خط، num نویسه خوانده شود. ویرایشگر خط در این حالت به صورت بازگشتی فراخوانی نمیشود، بنابراین بسته به تنظیمات ترمینال ممکن است ورودی قابل مشاهده نباشد، و فقط کلیدهای ورودی در $REPLY قرار میگیرند، نه کل بافر. توجه داشته باشید که بر خلاف دستور توکار read، مقدار num باید حتماً داده شود؛ هیچ پیشفرضی وجود ندارد.
نام این تابع تا حدی نامتناسب است، زیرا در واقع از minibuffer خود شل استفاده نمیشود. بنابراین همچنان امکان فراخوانی executed-named-cmd و توابع مشابه در حین خواندن مقدار وجود دارد.
- replace-argument، replace-argument-edit
- تابع replace-argument میتواند برای جایگزینی یک آرگومان خط فرمان در خط فرمان فعلی یا، در صورت خالی بودن خط فرمان فعلی، در آخرین خط فرمان اجرا شده استفاده شود (خط فرمان جدید اجرا نمیشود). آرگومانها همانگونه که با نحو استاندارد شل تفکیک میشوند، در نظر گرفته خواهند شد.
اگر یک آرگومان عددی داده شود، مشخصکننده آرگومانی است که باید جایگزین شود. 0 به معنای نام دستور است، همانند بسط تاریخچه. یک آرگومان عددی منفی از آخرین کلمه به عقب شمارش میکند.
اگر آرگومان عددی داده نشود، آرگومان فعلی جایگزین میشود؛ در صورتی که از خط پیشین تاریخچه استفاده شود، این آرگومان همان آخرین آرگومان خواهد بود.
تابع برای یک آرگومان جایگزین اعلان نمایش میدهد.
اگر نام ابزارک حاوی رشتهی edit باشد، برای مثال به این صورت تعریف شده باشد:
zle -N replace-argument-edit replace-argument
آنگاه تابع، مقدار فعلی آرگومان را برای ویرایش ارائه میدهد، در غیر این صورت بافر ویرایش برای جایگزینی در ابتدا خالی خواهد بود.
- replace-string، replace-pattern
- replace-string-again، replace-pattern-again
- تابع replace-string سه ابزارک را پیادهسازی میکند. اگر با همان نام تابع تعریف شود، دو رشته را درخواست میکند؛ اولین رشته (مبدأ) با رشته دوم در هر کجای بافر ویرایش خط که ظاهر شود، جایگزین خواهد شد.
اگر نام ابزارک حاوی کلمهی «pattern» باشد، برای نمونه با تعریف ابزارک از طریق دستور «zle -N replace-pattern replace-string»، آنگاه تطبیق با استفاده از الگوهای zsh انجام میشود. تمام الگوهای گسترشیافته گلوبینگ (extended globbing) در zsh میتوانند در رشته مبدأ استفاده شوند؛ توجه داشته باشید که بر خلاف تولید نام فایل، الگو نیازی به تطبیق با یک کلمه کامل ندارد و توصیفکنندههای گلوب (glob qualifiers) نیز هیچ اثری ندارند. علاوه بر این، رشته جایگزین میتواند شامل جایگزینیهای پارامتر یا فرمان باشد. افزون بر این، یک «&» در رشته جایگزین با رشته مبدأ تطبیقیافته جایگزین خواهد شد، و یک رقم با بکاسلش «\N» با Nاُمین عبارت داخل پرانتز تطبیقیافته جایگزین میشود. شکل «\{N}» میتواند برای محافظت از رقم در برابر ارقام بعدی استفاده شود.
اگر ابزارک به جای آن حاوی کلمهی «regex» (یا «regexp») باشد، تطبیق با استفاده از عبارتهای منظم و با رعایت تنظیمات گزینه RE_MATCH_PCRE انجام میشود (توضیحات تابع regexp-replace را در زیر ببینید). امکانات جایگزینی ویژه شرحدادهشده در بالا برای تطبیق الگو در اینجا نیز در دسترس هستند.
به طور پیشفرض، رشته مبدأ یا جایگزین پیشین برای ویرایش ارائه نمیشود. با این حال، این ویژگی را میتوان با تنظیم سبک edit-previous در زمینه :zle:widget (برای مثال :zle:replace-string) بر روی true فعال کرد. علاوه بر این، یک آرگومان عددی مثبت ارائه مقادیر قبلی را اجباری میکند، و آرگومان منفی یا صفر مانع از ارائه آنها میشود.
تابع replace-string-again میتواند برای تکرار جایگزینی قبلی استفاده شود؛ هیچ اعلانی نمایش داده نمیشود. همانند replace-string، اگر نام ابزارک حاوی کلمهی «pattern» یا «regex» باشد، تطبیق الگو یا عبارت منظم انجام میشود، و در غیر این صورت جایگزینی رشته لفظی (literal) صورت میگیرد. توجه داشته باشید که متن مبدأ و جایگزین پیشین یکسان هستند، چه از تطبیق الگو، چه عبارت منظم و چه رشته استفاده شده باشد.
علاوه بر این، replace-string جایگزینی پیشین را در بالای اعلان نشان میدهد، مادامی که در طول نشست جاری موردی وجود داشته باشد؛ اگر رشته مبدأ خالی باشد، آن جایگزینی بدون اینکه ابزارک برای یک رشته جایگزین درخواستی کند تکرار خواهد شد.
برای مثال، با شروع از خط:
print This line contains fan and fond
و فراخوانی replace-pattern با رشتهٔ مبدأ `f(?)n' و رشتهٔ جایگزین `c\1r' خط نهچندان مفیدی را تولید میکند:
print This line contains car and cord
دامنهٔ
رشتهٔ
جایگزین
میتواند
با استفاده
از ابزارک
narrow-to-region-invisible محدود
شود. یکی از
محدودیتهای
نسخهٔ فعلی
این است که
undo پیش از
باطلسازی
خود
جایگزینی،
میان
تغییرات
رشتههای
جایگزین و
مبدأ دور
میزند.
- send-invisible
- این تابع شبیه به read-from-minibuffer است، از این جهت که ممکن است بهصورت یک تابع از درون یک ابزارک یا به عنوان ابزارکی مستقل فراخوانی شود، و بهصورت تعاملی ورودی را از صفحهکلید بخواند. با این حال، ورودیِ در حال تایپ پنهان شده و به جای آن رشتهای از ستارهها (`*') نشان داده میشود. مقدار در پارامتر $INVISIBLE ذخیره میشود که ارجاعی به آن در موقعیت بازگردانیشدهٔ مکاننما در بافر ویرایش درج میگردد. اگر خواندن با یک وقفهٔ صفحهکلید (معمولاً ^G) یا یک خروج دیگر از ویرایش مانند push-line لغو شود، $INVISIBLE خالی تنظیم شده و بافر اصلی بدون تغییر بازگردانده میشود.
اگر یک آرگومان به تابع داده شود، به عنوان اعلان در نظر گرفته میشود، در غیر این صورت از `Non-echoed text: ' استفاده میشود (مانند emacs). اگر آرگومان دوم و سومی ارائه شوند، برای شروع و پایان ارجاع به $INVISIBLE که در بافر درج میشود به کار میروند. پیشفرض این است که با ${ باز شده، سپس INVISIBLE و با } بسته شود، اما جلوههای بسیار دیگری نیز ممکن است.
- smart-insert-last-word
- این تابع میتواند جایگزین ابزارک insert-last-word شود، به این صورت:
zle -N insert-last-word smart-insert-last-word
با یک آرگومان عددی، یا هنگامی که در یک فراخوانی از ابزارکی دیگر آرگومانهای خط فرمان به آن پاس داده شود، مانند insert-last-word رفتار میکند، با این تفاوت که وقتی INTERACTIVE_COMMENTS تنظیم شده باشد، کلمات موجود در توضیحات نادیده گرفته میشوند.
در غیر این صورت، راستترین کلمهٔ «جالب» از دستور پیشین پیدا شده و درج میشود. تعریف پیشفرض «جالب» این است که کلمه دستکم حاوی یک نویسهٔ الفبایی، اسلش یا بکاسلش باشد. این تعریف میتواند با استفاده از سبک match بازنویسی شود. بافت مورد استفاده برای جستجوی این سبک، نام ابزارک است؛ بنابراین بافت معمولاً :insert-last-word است. با این وجود، میتوانید این تابع را به ابزارکهای مختلف مقید کنید تا از الگوهای متفاوتی استفاده کند:
zle -N insert-last-assignment smart-insert-last-word zstyle :insert-last-assignment match '[[:alpha:]][][[:alnum:]]#=*' bindkey '\e=' insert-last-assignment
اگر هیچ کلمهٔ جالبی یافت نشود و سبک auto-previous روی یک مقدار درست تنظیم شده باشد، جستجو به سمت بالا در تاریخچه ادامه مییابد. هنگامی که auto-previous تنظیم نشده یا نادرست باشد (حالت پیشفرض)، ابزارک باید مکرراً فراخوانی شود تا خطوط پیشین تاریخچه جستجو شوند.
- transpose-lines
- تنها با یک بافر ویرایش چندخطی کاربرد دارد؛ خطوط در اینجا خطوطِ درون بافر فعلیِ روی صفحه هستند، نه خطوط تاریخچه. تأثیر آن مشابه تابعی با همین نام در Emacs است.
خط فعلی را با خط قبلی جابهجا میکند و مکاننما را به ابتدای خط بعدی میبرد. تکرار این کار (که با ارائهٔ یک آرگومان عددی مثبت امکانپذیر است) تأثیر جابهجا کردن خط بالای مکاننما به سمت پایین به تعداد معینی خط را دارد.
با یک آرگومان عددی منفی، به دو خط در بالای مکاننما نیاز دارد. این دو خط جابهجا شده و مکاننما به ابتدای خط قبلی منتقل میشود. استفاده از یک آرگومان عددی کمتر از -1 این اثر را دارد که خط بالای مکاننما را به اندازهٔ قرینهٔ آن عدد خط به سمت بالا حرکت میدهد.
- url-quote-magic
- این ابزارک جایگزین دستور توکار self-insert میشود تا تایپ نشانیهای URL به عنوان آرگومانهای خط فرمان را آسانتر کند. همزمان با تایپ کردن شما، نویسهٔ ورودی تحلیل میشود و اگر نیازمند نقلقول باشد، کلمهٔ فعلی برای یافتن یک طرحوارهٔ URI بررسی میشود. اگر موردی یافت شد و کلمهٔ فعلی از قبل داخل نقلقول نبود، یک بکاسلش پیش از نویسهٔ ورودی درج میگردد.
سبکها برای مهار رفتار نقلقول:
- url-metas
- این سبک در بافت `:url-quote-magic:scheme' بررسی میشود (که در آن scheme طرحوارهٔ URL فعلی است، مانند "ftp"). مقدار آن، رشتهای از نویسههایی است که هنگام حضور در URL با آن طرحواره، به عنوان فرانوسههای تطبیق الگو در نظر گرفته میشوند. پیشفرض این است که همهٔ نویسههای تطبیق الگوی گسترشیافتهٔ zsh نقلقول شوند، به جز '<' و '>'، اما شامل آکولادها (مانند گسترش آکولادی). همچنین url-seps را ببینید.
- url-seps
- مانند url-metas، اما نویسههایی را فهرست میکند که باید جداکنندههای دستور، تغییرمسیرها، ارجاعات تاریخچه و غیره در نظر گرفته شوند. حالت پیشفرض، نقلقول کردن مجموعهٔ استاندارد جداکنندههای شل است، به استثنای مواردی که با نویسههای تطبیق الگوی گسترشیافته تداخل دارند، اما شامل '<' و '>' و اولین نویسهٔ $histchars.
- url-globbers
- این سبک در بافت `:url-quote-magic' بررسی میشود. مقادیر، فهرستی از نامهای دستوراتی را تشکیل میدهند که انتظار میرود تطبیق الگوی خودشان را روی رشتهٔ URL انجام دهند. این بدان معناست که آنها برای استفاده از اصلاحگر `noglob' ناممستعار شدهاند. هنگامی که اولین کلمه در خط با یکی از این مقادیر مطابقت داشته باشد و نشانی URL به یک فایل محلی اشاره کند (url-local-schema را ببینید)، تنها نویسههای url-seps نقلقول میشوند؛ نویسههای url-metas دستنخورده باقی میمانند و به آنها اجازه داده میشود که بر تجزیهٔ خط فرمان، کاملسازی و غیره تأثیر بگذارند. مقادیر پیشفرض عبارت است از `noglob' مستقیم بهعلاوهٔ هر دستوری که به تابع کمکی `urlglobber' یا ناممستعار آن `globurl' منتسب شده باشد (زمانی که پیمانهٔ zsh/parameter در دسترس باشد).
- url-local-schema
- این سبک همیشه در بافت `:urlglobber' بررسی میشود، حتی با اینکه توسط هر دو ابزارک url-quote-magic و urlglobber استفاده میشود. مقادیر، فهرستی از طرحوارههای URI را تشکیل میدهند که باید بر اساس نام مسیرهای واقعی محلیشان به عنوان اشاره به فایلهای محلی در نظر گرفته شوند، بر خلاف فایلهایی که نسبت به ریشهٔ اسناد تعریفشده توسط وبسرور مشخص میشوند. مقادیر پیشفرض "ftp" و "file" هستند.
- url-other-schema
- مانند url-local-schema، اما تمام طرحوارههای دیگر URI را فهرست میکند که urlglobber و url-quote-magic باید روی آنها عمل کنند. اگر URI در خط فرمان دارای طرحوارهای نباشد که در این فهرست یا در url-local-schema آمده باشد، به صورت جادویی نقلقول نمیشود. مقادیر پیشفرض "http"، "https" و "ftp" هستند. هنگامی که یک طرحواره هم در اینجا و هم در url-local-schema حضور داشته باشد، بسته به اینکه نام دستور در url-globbers آمده باشد یا خیر، به شیوهای متفاوت نقلقول میشود.
بارگذاری url-quote-magic همچنین یک تابع کمکی به نام `urlglobber' را تعریف میکند و `globurl' را به `noglob urlglobber' ناممستعار میکند. این تابع یک URL محلی را تجزیه کرده، تلاش میکند تا بخش فایل محلی مسیر URL را با الگو تطبیق دهد و سپس نتایج را دوباره در قالب URL بازگرداند.
- vi-pipe
- این تابع یک دستور حرکتی را از صفحهکلید خوانده و سپس برای یک دستور خارجی اعلان نمایش میدهد. بخشی از بافر که توسط آن حرکت پوشش داده شده است، به دستور خارجی پایپ شده و سپس با خروجی آن دستور جایگزین میشود. اگر دستور حرکتی به vi-pipe مقید شده باشد، خط فعلی استفاده میشود.
این تابع به عنوان نمونهای برای خواندن یک دستور حرکتی vi از درون یک ابزارک تعریفشده توسط کاربر عمل میکند.
- which-command
- این تابع یک جایگزین مستقیم برای ابزارک توکار which-command است. این تابع رفتار بهبودیافتهای دارد، از این جهت که به درستی تشخیص میدهد که آیا کلمهٔ دستور نیاز به بسطیافتن به عنوان یک ناممستعار دارد یا خیر؛ در این صورت، به ردیابی کلمهٔ دستور از ناممستعارِ بسطیافته ادامه میدهد تا به دستوری برسد که اجرا خواهد شد.
سبک whence در بافت :zle:$WIDGET در دسترس است؛ این سبک میتواند به یک آرایه تنظیم شود تا دستور و گزینههایی را مشخص کند که برای بررسی کلمهٔ دستور یافتشده استفاده خواهند شد. مقدار پیشفرض whence -c است. zcalc-auto-insert این تابع همراه با تابع zcalc که در بخش «Mathematical Functions» شرح داده شده است، مفید است. این تابع باید به کلیدی متصل شود که نشاندهنده یک عملگر دودویی مانند `+'، `-'، `*' یا `/' است. هنگام اجرا در zcalc، اگر کلید در ابتدای خط یا بلافاصله پس از یک پرانتز باز قرار گیرد، متن "ans " پیش از نمایش خود کلید درج میشود. این کار امکان استفاده آسان از پاسخ محاسبات قبلی در خط فعلی را فراهم میسازد. متنی که قرار است پیش از نماد تایپشده درج شود، میتواند با تنظیم متغیر ZCALC_AUTO_INSERT_PREFIX تغییر یابد.
بنابراین، برای مثال، فشردن `+12' و بهدنبال آن return، مقدار ۱۲ را به نتیجه قبلی اضافه میکند.
اگر zcalc در حالت RPN باشد (گزینه -r)، تأثیر این اتصال کلید بهطور خودکار خنثی میشود؛ زیرا عملگرها بهتنهایی در یک خط معنادار هستند.
هنگامی که در zcalc نیستید، کلید صرفاً خود نماد را درج میکند.
توابع کمکی (Utility Functions)
این توابع در ساخت ویجتها کاربرد دارند. آنها باید با `autoload -U function' بارگذاری شده و مطابق توضیحات، از طریق ویجتهای تعریفشده توسط کاربر فراخوانی شوند.
- split-shell-arguments
- این تابع خطی را که در حال حاضر ویرایش میشود، به آرگومانهای پوسته و فاصلههای خالی تفکیک میکند. نتیجه در آرایه reply ذخیره میشود. این آرایه شامل تمام بخشهای خط به ترتیب است؛ از هر فاصله خالی قبل از اولین آرگومان شروع شده و به هر فاصله خالی بعد از آخرین آرگومان ختم میشود. بنابراین (تا زمانی که گزینه KSH_ARRAYS تنظیم نشده باشد) فاصلههای خالی در نمایههای فرد آرایه و آرگومانها در نمایههای زوج قرار میگیرند. توجه داشته باشید که هیچ نقض یا حذفی در نقلقولها (quotes) صورت نمیگیرد؛ اتصال تمام عناصر reply به ترتیب، تضمین میکند که خط اصلی بازتولید شود.
پارامتر REPLY روی نمایه کلمهای در reply تنظیم میشود که حاوی نویسه پس از مکاننما است، که در آن اولین عنصر دارای نمایه ۱ است. پارامتر REPLY2 روی نمایه نویسه زیر مکاننما در آن کلمه تنظیم میشود، که در آن اولین نویسه نمایه ۱ دارد.
بنابراین reply، REPLY و REPLY2 همگی باید درون تابع دربرگیرنده بهصورت محلی (local) تعریف شوند.
برای مشاهده مثالی از نحوه فراخوانی این تابع، به تابع modify-current-argument که در زیر شرح داده شده است مراجعه کنید.
- modify-current-argument [ expr-using-$ARG | func ]
- این تابع روشی ساده فراهم میکند تا ویجتهای تعریفشده توسط کاربر بتوانند آرگومان خط فرمانِ زیر مکاننما (یا بلافاصله سمت چپ مکاننما، در صورتی که مکاننما بین آرگومانها باشد) را اصلاح کنند.
آرگومان میتواند عبارتی باشد که هنگام ارزیابی، روی پارامتر پوسته ARG عمل میکند؛ پارامتری که روی آرگومان خط فرمانِ زیر مکاننما تنظیم شده است. عبارت باید بهدرستی نقلقول (quote) شود تا از ارزیابی زودهنگام آن جلوگیری شود.
در حالت دیگر، اگر آرگومان حاوی رشته ARG نباشد، فرض میشود که یک تابع پوسته است که آرگومان فعلی خط فرمان بهعنوان تنها آرگومان به آن ارسال میگردد. تابع باید متغیر REPLY را روی مقدار جدید برای آرگومان خط فرمان تنظیم کند. اگر تابع وضعیت خروج غیرصفر بازگرداند، تابع فراخواننده نیز چنین وضعیتی بازخواهد گرداند.
برای مثال، یک ویجت تعریفشده توسط کاربر که حاوی کد زیر است، تمام نویسههای موجود در آرگومانِ زیر مکاننما را به حروف بزرگ تبدیل میکند:
modify-current-argument '${(U)ARG}'
کد زیر هرگونه نقلقول را از کلمه فعلی حذف میکند (چه بکاسلش باشد و چه یکی از سبکهای نقلقول)، و آن را در سراسر کلمه با نقلقول تکی (single quoting) جایگزین میکند:
modify-current-argument '${(qq)${(Q)ARG}}'
کد زیر بسط دایرکتوری را روی آرگومان خط فرمان انجام داده و آن را با مسیر مطلق جایگزین میکند:
expand-dir() {
REPLY=${~1}
REPLY=${REPLY:a}
}
modify-current-argument expand-dir
در عمل، تابع expand-dir احتمالاً درون ویجتی که modify-current-argument در آن فراخوانی میشود، تعریف نخواهد شد.
رفتار چندین مورد از ابزارکهای بالا را میتوان با استفاده از سازوکار zstyle مهار کرد. بهویژه، ابزارکهایی که با سامانهٔ تکمیل تعامل دارند، زمینهٔ خود را به هر تکمیلی که فراخوانی میکنند انتقال میدهند.
- break-keys
- این سبک توسط ابزارک incremental-complete-word استفاده میشود. مقدار آن باید یک الگو باشد، و تمام کلیدهایی که با این الگو مطابقت دارند باعث میشوند ابزارک، بدون داشتن هیچ اثر دیگری از سوی کلید، تکمیل افزایشی را متوقف کند. مانند همهٔ سبکهایی که مستقیماً توسط incremental-complete-word استفاده میشوند، این سبک با استفاده از زمینهٔ `:incremental' جستجو میشود.
- completer
- ابزارکهای incremental-complete-word و insert-and-predict پیش از فراخوانی فرایند تکمیل، نام زمینهٔ سطح بالای خود را برپا میسازند. این امر امکان تعریف مجموعههای مختلفی از توابع تکمیلکننده را برای تکمیل عادی و برای این ابزارکها فراهم میکند. برای نمونه، برای استفاده از تکمیل، تقریب و تصحیح در تکمیل عادی، تکمیل و تصحیح در تکمیل افزایشی و تنها تکمیل در پیشبینی، میتوان اینگونه استفاده کرد:
zstyle ':completion:*' completer \
_complete _correct _approximate
zstyle ':completion:incremental:*' completer \
_complete _correct
zstyle ':completion:predict:*' completer \
_complete
محدود کردن تکمیلکنندههای مورداستفاده در پیشبینی ایدهٔ خوبی است، چرا که ممکن است حین تایپ کردن شما بهطور خودکار فراخوانی شوند. تکمیلکنندههای _list و _menu هرگز نباید همراه با پیشبینی استفاده شوند. تکمیلکنندههای _approximate، _correct، _expand و _match را میتوان استفاده کرد، اما توجه داشته باشید که ممکن است نویسهها را در هر کجای کلمهٔ پشت مکاننما تغییر دهند، بنابراین باید بهدقت مراقب باشید که نتیجه همان چیزی باشد که مد نظر داشتید.
- cursor
- ابزارک insert-and-predict از این سبک در زمینهٔ `:predict' برای تصمیمگیری دربارهٔ محل قرارگیری مکاننما پس از اقدام به تکمیل استفاده میکند. مقادیر عبارتاند از:
- complete
- مکاننما در جایی که هنگام پایان تکمیل بود باقی میماند، اما تنها در صورتی که بعد از نویسهای برابر با نویسهای باشد که کاربر بهتازگی درج کرده است. اگر بعد از نویسهٔ دیگری باشد، این مقدار همانند `key' خواهد بود.
- key
- مکاننما پس از nاُمین رخداد نویسهای که بهتازگی درج شده رها میشود، که در آن n تعداد دفعاتی است که آن نویسه پیش از اقدام به تکمیل در کلمه ظاهر شده بود. بهطور خلاصه، این کار اثر باقی گذاشتن مکاننما پس از نویسهٔ بهتازگی تایپشده را دارد حتی اگر کد تکمیل دریافته باشد که نویسهٔ دیگری در آن موقعیت نیاز به درج ندارد.
هر مقدار دیگری برای این سبک، بدون قید و شرط مکاننما را در موقعیتی رها میکند که کد تکمیل آن را رها کرده است.
- list
- هنگام استفاده از ابزارک incremental-complete-word، این سبک مشخص میکند که آیا تطابقها باید با هر بار فشردن کلید فهرست شوند یا خیر (در صورتی که در صفحه جا شوند). از پیشوند زمینهٔ `:completion:incremental' استفاده کنید.
ابزارک insert-and-predict از این سبک برای تصمیمگیری دربارهٔ اینکه آیا تکمیل حتی در صورت وجود تنها یک تکمیل ممکن نمایش داده شود یا خیر استفاده میکند. این کار در صورتی انجام میشود که مقدار این سبک رشتهٔ always باشد. در این حالت زمینه `:predict' است (نه `:completion:predict').
- match
- این سبک توسط smart-insert-last-word برای ارائهٔ الگویی (با استفاده از نحو کامل EXTENDED_GLOB) که با یک کلمهٔ مورد نظر مطابقت دارد به کار میرود. زمینه، نام ابزارکی است که smart-insert-last-word به آن متصل شده است (بالا را ببینید). رفتار پیشفرض smart-insert-last-word معادل است با:
zstyle :insert-last-word match '*[[:alpha:]/\\]*'
با این حال، ممکن است بخواهید کلماتی را که حاوی فاصله هستند نیز بگنجانید:
zstyle :insert-last-word match '*[[:alpha:][:space:]/\\]*'
یا اعداد را تا زمانی که طول کلمه حداقل دو نویسه باشد بگنجانید:
zstyle :insert-last-word match '*([[:digit:]]?|[[:alpha:]/\\])*'
مثال بالا باعث میشود بازهدایتهایی مانند "2>" نیز گنجانده شوند.
- prompt
- ابزارک incremental-complete-word مقدار این سبک را در طول تکمیل افزایشی در خط وضعیت نمایش میدهد. مقدار رشتهای میتواند شامل هر یک از زیررشتههای زیر به شیوهٔ پارامترهای اعلان PS1 و دیگر اعلانها باشد:
- %c
- با نام تابع تکمیلکنندهای که تطابقها را تولید کرده است (بدون زیرخط آغازین) جایگزین میشود.
- %l
- هنگامی که سبک list تنظیم شده باشد، اگر فهرست تطابقها برای جا شدن در صفحه بیش از حد طولانی باشد با `...' و در غیر این صورت با یک رشتهٔ خالی جایگزین میشود. اگر سبک list برابر `false' باشد یا تنظیم نشده باشد، `%l' همواره حذف میگردد.
- %n
- با تعداد تطابقهای تولیدشده جایگزین میشود.
- %s
- بهترتیب در صورتی که هیچ تکمیلی مطابق با کلمهٔ روی خط نباشد با `-no match-'، اگر تطابقها پیشوند مشترکی متفاوت از کلمهٔ روی خط نداشته باشند با `-no prefix-'، یا در صورت وجود چنین پیشوند مشترکی با یک رشتهٔ خالی جایگزین میشود.
- %u
- با بخش بدونابهام تمام تطابقها، در صورت وجود و در صورتی که متفاوت از کلمهٔ روی خط باشد، جایگزین میشود.
مانند `break-keys'، این سبک نیز از زمینهٔ `:incremental' استفاده میکند.
- stop-keys
- این سبک توسط ابزارک incremental-complete-word استفاده میشود. با مقدار آن بهگونهای مشابه با مقدار سبک break-keys رفتار میشود (و از همان زمینه استفاده میکند: `:incremental'). با این حال، در این مورد تمام کلیدهایی که با الگوی ارائهشده بهعنوان مقدار آن تطابق دارند، تکمیل افزایشی را متوقف کرده و سپس تابع معمول خود را اجرا میکنند.
- toggle
- این سبک بولی توسط predict-on و ابزارکهای مرتبط با آن در زمینهٔ `:predict' استفاده میشود. اگر روی یکی از مقادیر استاندارد `true' تنظیم شود، تایپ پیشگویانه بهطور خودکار در وضعیتهایی که بعید است مفید باشد خاموش میشود، مانند هنگام ویرایش یک میانگیر چندخطی یا پس از رفتن به میانهٔ یک خط و سپس حذف یک نویسه. حالت پیشفرض روشن ماندن پیشبینی تا زمان فراخوانی صریح predict-off است.
- verbose
- این سبک بولی توسط predict-on و ابزارکهای مرتبط با آن در زمینهٔ `:predict' استفاده میشود. اگر روی یکی از مقادیر استاندارد `true' تنظیم شود، این ابزارکها هنگام تغییر حالت پیشگویی، پیامی زیر اعلان نمایش میدهند. این سبک در ترکیب با سبک toggle بیشترین کاربرد را دارد. در حالت پیشفرض این پیامها نمایش داده نمیشوند.
- widget
- این سبک مشابه سبک command است: برای توابع ابزارکی که از zle برای فراخوانی ابزارکهای دیگر استفاده میکنند، گاهی میتوان از این سبک برای جایگزینی ابزارکِ فراخوانیشده استفاده کرد. زمینهٔ این سبک، نام ابزارک فراخواننده است (نه نام تابع فراخواننده، چرا که یک تابع ممکن است به چندین نام ابزارک متصل شده باشد).
zstyle :copy-earlier-word widget smart-insert-last-word
برای تعیین اینکه آیا سبک widget استفاده میشود یا خیر، مستندات ویجت یا تابع فراخواننده را بررسی کنید.
مدیریت استثناها (EXCEPTION HANDLING)
دو تابع برای فعال کردن قابلیت مدیریت استثنا در zsh ارائه شدهاند، به شکلی که باید برای کاربران سایر زبانها آشنا باشد.
- throw exception
- تابع throw استثنای نامبردهشدهٔ exception را پرتاب میکند. این نام یک رشتهٔ اختیاری است و تنها توسط توابع throw و catch استفاده میشود. با یک استثنا در بیشتر موارد همانند یک خطای شل رفتار میشود؛ یعنی یک استثنای مدیریتنشده باعث میشود شل تمام پردازشها را در یک تابع یا اسکریپت متوقف کرده و در یک شل تعاملی به بالاترین سطح بازگردد.
- catch exception-pattern
- تابع catch در صورتی که یک استثنا پرتاب شده باشد و الگوی exception-pattern با نام آن مطابقت داشته باشد، وضعیت صفر را بازمیگرداند؛ در غیر این صورت وضعیت ۱ را بازمیگرداند. exception-pattern یک الگوی استاندارد شل است که از تنظیمات فعلی گزینهٔ EXTENDED_GLOB پیروی میکند. همچنین نام مستعار catch نیز تعریف شده است تا از تطبیق آرگومان تابع با نام فایلها جلوگیری کند؛ بنابراین الگوها میتوانند بدون نقلقول استفاده شوند. توجه داشته باشید از آنجا که استثناها تفاوت بنیادینی با سایر خطاهای شل ندارند، میتوان خطاهای شل را با استفاده از یک رشتهٔ خالی به عنوان نام استثنا دریافت کرد. متغیر شل CAUGHT توسط catch روی نام استثنای دریافتشده تنظیم میشود. پس از دریافت یک استثنا، میتوان با فراخوانی مجدد تابع throw آن را دوباره پرتاب کرد.
این توابع طوری طراحی شدهاند که همراه با ساختار always شرحدادهشده در zshmisc(1) استفاده شوند. این موضوع اهمیت دارد زیرا تنها این ساختار پشتیبانی لازم را برای استثناها فراهم میکند. یک مثال متداول به شرح زیر است:
{
# "try" block
# ... nested code here calls "throw MyExcept"
} always {
# "always" block
if catch MyExcept; then
print "Caught exception MyExcept"
elif catch ''; then
print "Caught a shell error. Propagating..."
throw ''
fi
# Other exceptions are not handled but may be caught further
# up the call stack.
}
اگر لازم باشد همهٔ استثناها دریافت شوند، الگوی زیر ممکن است ترجیح داده شود:
{
# ... nested code here throws an exception
} always {
if catch *; then
case $CAUGHT in
(MyExcept)
print "Caught my own exception"
;;
(*)
print "Caught some other exception"
;;
esac
fi
}
مشابه مدیریت استثنا در سایر زبانها، استثنا میتواند توسط کدی در اعماق بلوک `try' پرتاب شود. با این حال، توجه داشته باشید که این پرتاب باید درون شل جاری انجام شود، نه در یک زیرشل (subshell) که برای خطلوله (pipeline)، ساختار پرانتزبندیشدهٔ شل جاری، یا نوعی جایگزینی دستور یا فرایند ایجاد شده است.
سیستم در داخل از متغیر شل EXCEPTION برای ذخیرهٔ نام استثنا در فاصلهٔ بین پرتاب و دریافت استفاده میکند. یکی از معایب این طرح این است که اگر استثنا مدیریت نشود، متغیر EXCEPTION مقداردهیشده باقی میماند و در صورت وقوع خطای بعدی در شل، ممکن است به اشتباه به عنوان نام یک استثنا شناخته شود. افزودن دستور unset EXCEPTION در ابتدای بیرونیترین لایه از هر کدی که از مدیریت استثنا استفاده میکند، این مشکل را برطرف خواهد کرد.
سه تابع برای مدیریت فایلهایی که از روی پسوندشان شناسایی میشوند در دسترس هستند؛ برای نمونه برای ارسال فایلی مانند text.ps هنگام اجرا به عنوان یک دستور، به یک نمایشدهندهٔ مناسب.
- zsh-mime-setup [ -fv ] [ -l [ suffix ... ] ]
- zsh-mime-handler [ -l ] command argument ...
- این دو تابع از فایلهای ~/.mime.types و /etc/mime.types استفاده میکنند که انواع و پسوندها را مرتبط میسازند، و همچنین فایلهای ~/.mailcap و /etc/mailcap که انواع را به برنامههای گردانندهٔ آنها مرتبط میکنند. این فایلها در بسیاری از سیستمها همراه با پسوندهای چندمنظورهٔ پست الکترونیکی اینترنت (MIME) ارائه میشوند.
برای فعالسازی سیستم، تابع zsh-mime-setup باید خودبارگذاری (autoload) و اجرا شود. این کار اجازه میدهد فایلهای دارای پسوند به عنوان فایل اجرایی در نظر گرفته شوند؛ چنین فایلهایی میتوانند توسط سیستم تکمیل خودکار تابع تکمیل شوند. نیازی نیست تابع zsh-mime-handler توسط کاربر فراخوانی شود.
این سیستم با تنظیم نامهای مستعار پسوند با `alias -s' کار میکند. نامهای مستعار پسوندی که از پیش توسط کاربر نصب شدهاند بازنویسی نخواهند شد.
برای پسوندهایی که با حروف کوچک تعریف شدهاند، حالتهای حروف بزرگ نیز به طور خودکار مدیریت خواهند شد (برای مثال، اگر مدیریت پسوند pdf تعریف شده باشد، PDF نیز به طور خودکار مدیریت میشود)، اما عکس آن برقرار نیست.
فراخوانیهای مکرر zsh-mime-setup نگاشت موجود میان پسوندها و فایلهای اجرایی را بازنویسی نمیکند، مگر اینکه گزینهٔ -f داده شود. با این حال توجه داشته باشید که این کار نامهای مستعار پسوند موجود را که به گردانندههایی جز zsh-mime-handler اختصاص یافتهاند بازنویسی نمیکند.
فراخوانی zsh-mime-setup با گزینهٔ -l نگاشتهای موجود را بدون تغییر دادن آنها فهرست میکند. پسوندهایی که باید فهرست شوند (که ممکن است حاوی نویسههای الگویی باشند که برای جلوگیری از تفسیر فوری در خط فرمان باید نقلقول شوند) میتوانند به عنوان آرگومانهای اضافی داده شوند؛ در غیر این صورت، تمام پسوندها فهرست میشوند.
فراخوانی zsh-mime-setup با گزینهٔ -v باعث میشود خروجی پرگو در طول عملیات راهاندازی نمایش داده شود.
این سیستم پرچمهای mailcap یعنی needsterminal و copiousoutput را رعایت میکند؛ mailcap(4) یا mailcap(5) را ببینید (نام صفحهٔ راهنما در پلتفرمهای مختلف متفاوت است).
این توابع از سبکهای زیر استفاده میکنند که با دستور توکار zstyle تعریف میشوند (به zshmodules(1) مراجعه کنید). آنها باید پیش از اجرای zsh-mime-setup تعریف شوند. زمینههای مورد استفاده همگی با :mime: آغاز میشوند و در برخی موارد اجزای دیگری نیز دارند. توصیه میشود که یک * در انتها (به صورت نقلقولشده مناسب) به الگوهای سبک الحاق شود تا در صورت گسترش سیستم در آینده مشکلی پیش نیاید. چند مثال در زیر آورده شده است.
برای فایلهایی که چند پسوند دارند، برای نمونه .pdf.gz، در جایی که زمینه شامل پسوند است، جستجو با طولانیترین پسوند ممکن آغاز میشود تا زمانی که تطابقی برای سبک یافت شود. برای مثال، اگر .pdf.gz تطابقی برای گرداننده ایجاد کند، از آن استفاده خواهد شد؛ در غیر این صورت از گرداننده برای .gz استفاده میشود. توجه داشته باشید که به دلیل شیوهٔ کارکرد نامهای مستعار پسوند، همواره لازم است که یک گرداننده برای کوتاهترین پسوند ممکن وجود داشته باشد، بنابراین در این مثال .pdf.gz تنها در صورتی قابل مدیریت است که .gz نیز مدیریت شود (اگرچه نه لزوماً به همان روش). از طرف دیگر، اگر به مدیریت مستقل .gz نیازی نیست، افزودن سادهٔ دستور
alias -s gz=zsh-mime-handler
به کد مقداردهی اولیه کافی است؛ .gz به تنهایی مدیریت نخواهد شد، اما ممکن است در ترکیب با پسوندهای دیگر مدیریت شود.
- current-shell
- اگر این سبک بولی درست (true) باشد، گردانندهٔ mailcap برای زمینهٔ مورد نظر با استفاده از دستور توکار eval به جای راهاندازی یک فرایند جدید sh اجرا میشود. این روش کارآمدتر است، اما ممکن است در موارد نادری که گردانندهٔ mailcap از نحو دقیق POSIX استفاده میکند کار نکند.
- disown
- اگر این سبک بولی درست (true) باشد، گردانندههای mailcap که در پسزمینه راهاندازی میشوند رها (disown) خواهند شد؛ یعنی مشمول کنترل کار (job control) در پوستهٔ والد نخواهند بود. چنین گردانندههایی تقریباً همیشه پنجرههای خود را ایجاد میکنند، بنابراین تنها اثر جانبی مضر احتمالیِ تنظیم این سبک آن است که متوقف کردن (kill) کارها از درون پوسته دشوارتر میشود.
- execute-as-is
- این سبک فهرستی از الگوها را ارائه میدهد تا با فایلهای ارسالشده برای اجرا توسط برنامهٔ گرداننده تطبیق داده شوند. اگر فایل با الگو تطابق داشته باشد، کل خط فرمان به شکل فعلی خود و بدون هیچ گردانندهای اجرا میشود. این ویژگی برای فایلهایی که ممکن است پسوند داشته باشند اما خودشان فایلی اجرایی باشند مفید است. اگر این سبک تنظیم نشده باشد، الگوی *(*) *(/) استفاده میشود؛ بنابراین فایلهای اجرایی مستقیماً اجرا شده و به گرداننده ارسال نمیشوند، و گزینهٔ AUTO_CD میتواند برای رفتن به دایرکتوریهایی استفاده شود که بر حسب اتفاق پسوندهای MIME دارند.
- execute-never
- این سبک در ترکیب با execute-as-is مفید است. این سبک به آرایهای از الگوها مربوط به مسیرهای کامل فایلهایی تنظیم میشود که هرگز نباید به عنوان فایل اجرایی تلقی شوند، حتی اگر فایل ارسالشده به گردانندهٔ MIME با execute-as-is مطابقت داشته باشد. این ویژگی برای سیستمهای فایلی که مجوز اجرا را پشتیبانی نمیکنند یا شامل فایلهای اجرایی سیستمعامل دیگری هستند کاربرد دارد. برای نمونه، اگر /mnt/windows یک نقطهٔ اتصال ویندوز باشد، آنگاه
zstyle ':mime:*' execute-never '/mnt/windows/*'
اطمینان حاصل خواهد کرد که هر فایل موجود در آن ناحیه به عنوان انواع MIME اجرا شود، حتی اگر اجرایی باشد. همانطور که این مثال نشان میدهد، نام کامل فایل با الگو مطابقت داده میشود، صرفنظر از اینکه فایل چگونه به گرداننده ارسال شده است. فایل با استفاده از اصلاحگر :P که در زیربخش `Modifiers' در zshexpn(1) شرح داده شده به یک مسیر کامل حل میشود؛ این بدان معناست که پیوندهای نمادین تا حد امکان حل میشوند تا پیوندها به دیگر سیستمهای فایل عملکرد صحیحی داشته باشند.
- file-path
- در صورتی استفاده میشود که سبک find-file-in-path برای همان زمینه درست (true) باشد. به آرایهای از دایرکتوریها تنظیم میشود که برای جستجوی فایلِ مورد نظر برای مدیریت استفاده میشوند؛ پیشفرض، مسیر دستوری است که با پارامتر ویژهٔ path مشخص شده است. گزینهٔ پوسته PATH_DIRS رعایت میشود؛ اگر آن گزینه تنظیم شده باشد، مسیر مناسب جستجو خواهد شد حتی اگر نام فایل برای مدیریت، همانطور که در خط فرمان ظاهر میشود، حاوی یک `/' باشد. زمینهٔ کامل :mime:.suffix: است، همانطور که برای سبک handler توضیح داده شده است.
- find-file-in-path
- در صورت تنظیم، اجازه میدهد فایلهایی که نامشان شامل مسیر مطلق نیست در مسیر دستور یا مسیر مشخصشده با سبک file-path جستجو شوند. اگر فایل در مسیر یافت نشود، به صورت محلی جستجو میشود (چه دایرکتوری جاری در مسیر باشد یا نباشد)؛ اگر به صورت محلی نیز یافت نشود، گرداننده لغو خواهد شد مگر اینکه سبک handle-nonexistent تنظیم شده باشد. فایلهای یافتشده در مسیر همانطور که برای سبک execute-as-is شرح داده شد آزمایش میشوند. زمینهٔ کامل :mime:.suffix: است، همانطور که برای سبک handler شرح داده شده است.
- flags
- پرچمهای همراه با یک گرداننده را تعریف میکند؛ زمینه مانند سبک handler است، و قالب آن همانند پرچمها در mailcap میباشد.
- handle-nonexistent
- به طور پیشفرض، آرگومانهایی که با فایلها مطابقت ندارند به گردانندهٔ MIME ارسال نمیشوند تا از رهگیری دستورهای موجود در مسیر که بر حسب اتفاق پسوند دارند جلوگیری شود. این سبک ممکن است به آرایهای از الگوهای glob گسترشیافته برای آرگومانهایی تنظیم شود که حتی در صورت عدم وجود به گرداننده ارسال خواهند شد. اگر صریحاً تنظیم نشده باشد، مقدار پیشفرض آن [[:alpha:]]#:/* است که اجازه میدهد URLها به گردانندهٔ MIME ارسال شوند، حتی اگر با آن قالب در سیستم فایل وجود نداشته باشند. زمینهٔ کامل :mime:.suffix: است، همانطور که برای سبک handler توصیف شده است.
- handler
- گردانندهای را برای یک پسوند مشخص میکند؛ پسوند بر اساس زمینه به شکل :mime:.suffix: داده میشود و قالب گرداننده دقیقاً همان قالب موجود در mailcap است. به طور ویژه به `.' و دونقطهٔ پایانی برای متمایز کردن این استفاده از زمینه دقت کنید. این سبک هر گردانندهای را که توسط فایلهای mailcap مشخص شده باشد بازنویسی میکند. اگر گرداننده به یک پایانه نیاز داشته باشد، سبک flags باید طوری تنظیم شود که شامل کلمهٔ needsterminal باشد، یا اگر قرار است خروجی از طریق یک صفحهبند (pager) نمایش داده شود (اما نه در صورتی که گرداننده خودش یک صفحهبند باشد)، باید شامل copiousoutput باشد.
- mailcap
- فهرستی از فایلها در قالب ~/.mailcap و /etc/mailcap که هنگام راهاندازی خوانده میشوند و جایگزین فهرست پیشفرض شامل آن دو فایل خواهند شد. زمینهٔ آن :mime: است. یک + در فهرست با فایلهای پیشفرض جایگزین خواهد شد..TP mailcap-priorities این سبک برای رفع ابهام میان چندین مدخل mailcap برای یک نوع MIME یکسان به کار میرود. این سبک از آرایهای از عناصر زیر به ترتیب نزولی اولویت تشکیل شده است؛ در صورتی که مدخلهای ابتدایی نتوانند مدخلهای در حال مقایسه را تفکیک کنند، از مدخلهای بعدی استفاده خواهد شد. اگر هیچیک از آزمونها نتواند مدخلها را تعیین تکلیف کند، نخستین مدخل دیدهشده حفظ میشود.
- files
- ترتیب فایلهای خواندهشده (مدخلها در سبک mailcap). فایلهای اولویتدارتر ترجیح داده میشوند. (توجه داشته باشید که این آزمون ابهام میان مدخلهای موجود در یک فایل را برطرف نمیکند.)
- priority
- پرچم اولویت برگرفته از مدخل mailcap. این اولویت یک عدد صحیح از 0 تا 9 با مقدار پیشفرض 5 است.
- flags
- آزمون ارائهشده توسط گزینهٔ mailcap-prio-flags برای تفکیک مدخلها استفاده میشود.
- place
- مدخلهای بعدی ارجحیت دارند؛ از آنجا که مدخلها دارای ترتیبی اکید هستند، این آزمون همواره موفق خواهد بود.
توجه داشته باشید که چون این سبک در هنگام مقداردهی اولیه پردازش میشود، بافت همواره :mime: است و هیچ تمایزی بر اساس پسوند صورت نمیگیرد.
- mailcap-prio-flags
- این سبک هنگامی به کار میرود که کلیدواژهٔ flags در فهرست آزمونهای مشخصشده توسط سبک mailcap-priorities دیده شود. این سبک باید روی فهرستی از الگوها تنظیم شود که هر یک در برابر پرچمهای مشخصشده در مدخل mailcap (به عبارت دیگر، مجموعههای انتساب موجود در برخی مدخلهای فایل mailcap) سنجیده میشوند. الگوهای ابتدایی فهرست نسبت به الگوهای انتهایی اولویت دارند، و الگوهای منطبقشده بر الگوهای منطبقنشده ترجیح داده میشوند.
- mime-types
- فهرستی از فایلها با قالب ~/.mime.types و /etc/mime.types که باید در طول راهاندازی خوانده شوند و جایگزین فهرست پیشفرض متشکل از این دو فایل گردند. بافت :mime: است. علامت + در فهرست با فایلهای پیشفرض جایگزین خواهد شد.
- never-background
- اگر این سبک بولی تنظیم شود، گرداننده برای بافت دادهشده همواره در پیشزمینه اجرا میشود، حتی اگر پرچمهای ارائهشده در مدخل mailcap نشان دهند که نیازی به آن نیست (برای نمونه، نیازی به ترمینال ندارد).
- pager
- در صورت تنظیم، به جای $PAGER یا more برای مدیریت پسوندهایی که پرچم copiousoutput برای آنها فعال است استفاده خواهد شد. بافت همانند handler است، یعنی :mime:.suffix: برای مدیریت فایلی با suffix مشخصشده.
مثالها:
zstyle ':mime:*' mailcap ~/.mailcap /usr/local/etc/mailcap zstyle ':mime:.txt:' handler less %s zstyle ':mime:.txt:' flags needsterminal
هنگامی که zsh-mime-setup متعاقباً اجرا شود، به دنبال مدخلهای mailcap در دو فایل ارائهشده میگردد. فایلهایی با پسوند .txt با اجرای `less file.txt' مدیریت خواهند شد. پرچم needsterminal تنظیم شده است تا نشان دهد این برنامه باید به صورت متصل به یک ترمینال اجرا شود.
از آنجا که ارسال یک دستور شامل چندین مرحله است، در صورتی که تلاش برای اجرای یک فایل بر اساس پسوند .ext تأثیر مورد انتظار را به همراه نداشت، موارد زیر باید بررسی شوند.
دستور `alias -s ext' باید `ps=zsh-mime-handler' را نمایش دهد. اگر چیز دیگری نشان دهد، به این معنی است که نام مستعار دیگری برای این پسوند از قبل نصب بوده و بازنویسی نشده است. اگر چیزی نشان ندهد، هیچ گردانندهای نصب نشده است: این موضوع احتمالاً به این دلیل است که هیچ گردانندهای در ترکیب .mime.types و mailcap برای فایلهای .ext پیدا نشده است. در این حالت، مدیریت مناسب باید به ~/.mime.types و mailcap اضافه شود.
اگر پسوند توسط zsh-mime-handler مدیریت میشود اما فایل به درستی باز نمیشود، یا گردانندهٔ تعریفشده برای این نوع نادرست است، یا پرچمهای مرتبط با آن نامناسب هستند. اجرای zsh-mime-setup -l گرداننده و در صورت وجود، پرچمها را نشان خواهد داد. یک %s در گرداننده با فایل (در صورت لزوم با نقلقول مناسب) جایگزین میشود. بررسی کنید که برنامهٔ گردانندهٔ فهرستشده وجود داشته باشد و بتواند به شیوهٔ نشان داده شده اجرا شود. همچنین بررسی کنید که در صورت نیاز به اجرای گرداننده در ترمینال، پرچمهای needsterminal یا copiousoutput تنظیم شده باشند؛ پرچم دوم زمانی استفاده میشود که خروجی باید به یک صفحهبند (pager) ارسال شود. نمونهای از یک مدخل مناسب در mailcap برای چنین برنامهای:
text/html; /usr/bin/lynx '%s'; needsterminal
اجرای `zsh-mime-handler -l command line' خط فرمانی را که اجرا خواهد شد چاپ میکند، سادهشده تا اثر هرگونه پرچم حذف شود، و با نقلقول مناسب تا خروجی بتواند به عنوان یک خط فرمان کامل zsh اجرا گردد. این مورد توسط سامانهٔ تکمیل برای تصمیمگیری دربارهٔ نحوهٔ تکمیل پس از فایلی که توسط zsh-mime-setup مدیریت میشود، به کار میرود.
- pick-web-browser
- این تابع از دو تابع MIME شرح داده شده در بالا مجزاست و میتواند مستقیماً به یک پسوند اختصاص یابد:
autoload -U pick-web-browser alias -s html=pick-web-browser
این ابزار به عنوان یک پیشانهٔ هوشمند برای هدایت و اجرای مرورگر وب ارائه شده است. این مورد میتواند به عنوان یک تابع یا یک اسکریپت شل اجرا شود. در صورتی که هیچ مرورگری نتواند راهاندازی شود، وضعیت خروج 255 بازگردانده میشود.
سبکهای گوناگونی برای سفارشیسازی انتخاب مرورگرها در دسترس است:
- browser-style
- مقدار این سبک آرایهای است که اولویتها را به ترتیب نزولی برای نوع مرورگر مورد استفاده مشخص میکند. مقادیر عناصر میتوانند شامل موارد زیر باشند:
- running
- استفاده از یک مرورگر گرافیکی (GUI) که در صورت در دسترس بودن نمایشگر X Window، هماکنون در حال اجرا است. مرورگرهای فهرستشده در سبک x-browsers به ترتیب بررسی میشوند تا یکی یافت شود؛ در صورت یافتن، فایل در آن مرورگر نمایش داده خواهد شد، بنابراین ممکن است لازم باشد کاربر بررسی کند که آیا فایل نمایش داده شده است یا خیر. اگر مرورگر در حال اجرایی یافت نشود، مرورگری آغاز به کار نخواهد کرد. برای مرورگرهایی به جز Firefox، Opera و Konqueror فرض میشود که نحو Mozilla را برای باز کردن URL از راه دور درک میکنند.
- x
- راهاندازی یک مرورگر گرافیکی جدید در هنگام در دسترس بودن نمایشگر X Window. در دسترس بودن یکی از مرورگرهای فهرستشده در سبک x-browsers جستجو شده و نخستین موردی که یافت شود اجرا میگردد. هیچ بررسیای برای مرورگری که از قبل در حال اجرا باشد انجام نمیشود.
- tty
- راهاندازی یک مرورگر مبتنی بر ترمینال. در دسترس بودن یکی از مرورگرهای فهرستشده در سبک tty-browsers جستجو شده و نخستین موردی که یافت شود اجرا میگردد.
اگر این سبک تنظیم نشده باشد، مقدار پیشفرض running x tty استفاده میشود.
- x-browsers
- آرایهای با اولویت نزولی از مرورگرها برای استفاده در هنگام اجرا تحت سامانهٔ X Window System. این آرایه شامل نام دستوری است که مرورگر با آن راهاندازی میشود. این موارد در بافت :mime: جستجو میشوند (که ممکن است در آینده گسترش یابد، بنابراین افزودن `*' توصیه میشود). برای نمونه،
zstyle ':mime:*' x-browsers opera konqueror firefox
مشخص میکند که pick-web-browser ابتدا باید به دنبال یک نمونهٔ در حال اجرای Opera، Konqueror یا Firefox، به همین ترتیب بگردد، و اگر هیچکدام را پیدا نکرد تلاش کند تا Opera را راهاندازی نماید. مقدار پیشفرض firefox mozilla netscape opera konqueror است. tty-browsers آرایهای مشابه با x-browsers، با این تفاوت که مرورگرهایی را مشخص میکند که در صورت در دسترس نبودن نمایشگر X Window باید استفاده شوند. مقدار پیشفرض elinks links lynx است.
- command
- در صورت تنظیم، این سبک (style) برای انتخاب دستوری استفاده میشود که جهت باز کردن یک صفحه برای مرورگر به کار میرود. بافت (context) برای راهاندازی یک مرورگر جدید، :mime:browser:new:$browser: و برای باز کردن یک URL در مرورگری که از پیش در نمایشگر فعلی X در حال اجرا است، :mime:browser:running:$browser: میباشد؛ که در آن $browser مقداری است که در سبک x-browsers یا tty-browsers تطبیق داده شده است. توالی گریز %b در مقدار این سبک، با مرورگر و %u با URL جایگزین خواهد شد. اگر این سبک تنظیم نشده باشد، مقدار پیشفرض برای تمام نمونههای جدید معادل %b %u است و مقادیر پیشفرض برای استفاده از مرورگرهای در حال اجرا معادل مقادیر kfmclient openURL %u برای Konqueror، firefox -new-tab %u برای Firefox، opera -newpage %u برای Opera، و %b -remote "openUrl(%u)" برای سایر موارد است.
توابع ریاضی (MATHEMATICAL FUNCTIONS)
- zcalc [ -erf ] [ expression ... ]
- یک ماشینحساب نسبتاً قدرتمند بر پایهٔ سازوکار ارزیابی محاسباتی zsh. نحو آن مشابه فرمولها در بیشتر زبانهای برنامهنویسی است؛ برای جزئیات، بخش `Arithmetic Evaluation' در zshmisc(1) را ببینید.
افراد غیربرنامهنویس باید توجه داشته باشند که همانند بسیاری از زبانهای برنامهنویسی دیگر، عبارتهایی که فقط شامل اعداد صحیح هستند (خواه ثابتهای بدون `.'، متغیرهای حاوی چنین ثابتهایی به صورت رشته، یا متغیرهایی که به عنوان عدد صحیح اعلان شدهاند) بهطور پیشفرض با استفاده از محاسبات اعداد صحیح ارزیابی میشوند، که روش کار ماشینحسابهای رومیزی معمولی نیست. برای اجبار عملیات ممیز شناور، گزینهٔ -f را ارسال کنید؛ یادداشتهای بیشتر در زیر را ببینید.
اگر فایل ~/.zcalcrc وجود داشته باشد، پس از راهاندازی تابع و هنگامی که در آستانهٔ پردازش خط فرمان است، درون تابع سورس (source) میشود. این کار میتواند برای مثال جهت تنظیم گزینههای پوسته استفاده شود؛ در این مرحله emulate -L zsh و setopt extendedglob فعال هستند. در صورت وجود فایل، هرگونه شکست در بارگذاری (source کردن) آن بحرانی (fatal) تلقی میشود. همانند سایر فایلهای مقداردهی اولیه، در صورت تنظیم بودن دایرکتوری $ZDOTDIR، به جای $HOME از آن استفاده میشود.
کتابخانهٔ ریاضی zsh/mathfunc در صورت در دسترس بودن بارگذاری خواهد شد؛ بخش `The zsh/mathfunc Module' را در zshmodules(1) ببینید. توابع ریاضی متناظر با کتابخانههای خام سیستم هستند، بنابراین توابع مثلثاتی با استفاده از رادیان ارزیابی میشوند و غیره.
هر خط تایپشده به عنوان یک عبارت ارزیابی میشود. اعلان (prompt) عددی را نشان میدهد که متناظر با یک پارامتر مکانی است که نتیجهٔ آن محاسبه در آن ذخیره میشود. برای مثال، نتیجهٔ محاسبه در خطی که پیش از آن `4> ' آمده است به صورت $4 در دسترس خواهد بود. آخرین مقدار محاسبهشده به صورت ans در دسترس است. قابلیت ویرایش کامل خط فرمان، شامل تاریخچهٔ محاسبات پیشین، در دسترس است؛ این تاریخچه در فایل ~/.zcalc_history ذخیره میشود. برای خروج، یک خط خالی وارد کنید یا به تنهایی `:q' را تایپ کنید (استفاده از `q' به دلایل سازگاری تاریخی مجاز است).
خطی که به یک تکبکاسلش ختم میشود همانند ویرایش خط فرمان رفتار میکند: بکاسلش حذف شده، تابع ورودی بیشتری درخواست میکند (اعلان با `...' پیشوند میشود تا این موضوع را نشان دهد)، و خطوط با یکدیگر ترکیب میشوند تا نتیجهٔ نهایی حاصل شود. علاوه بر این، اگر ورودی تا آن نقطه حاوی پرانتزهای باز بیشتری نسبت به پرانتزهای بسته باشد، zcalc ورودی بیشتری را درخواست خواهد کرد.
اگر آرگومانهایی در زمان راهاندازی به zcalc داده شود، از آنها برای پر کردن اولیهٔ اولین پارامترهای مکانی استفاده میشود. هنگام شروع به کار ماشینحساب، یک نشانگر بصری از این موضوع نمایش داده میشود.
ثابتهای PI (3.14159...) و E (2.71828...) فراهم شدهاند. انتساب پارامتر امکانپذیر است، اما توجه داشته باشید که تمامی پارامترها در فضای نام سراسری (global namespace) قرار خواهند گرفت، مگر اینکه از دستور ویژهٔ :local استفاده شود. این تابع متغیرهای محلی ایجاد میکند که نام آنها با _ آغاز میشود، بنابراین کاربران باید از انجام این کار خودداری کنند. به متغیرهای ans (آخرین پاسخ) و stack (پشته در حالت RPN) میتوان مستقیماً ارجاع داد؛ stack یک آرایه است اما عناصر آن عددی هستند. متغیرهای ویژهٔ متعدد دیگری با معانی استاندارد خود به صورت محلی استفاده میشوند، برای مثال compcontext، match، mbegin، mend، psvar.
مبنای خروجی را میتوان با ارسال گزینهٔ `-#base' مقداردهی اولیه کرد، برای مثال `zcalc -#16' (بسته به گزینههای globbing تنظیمشده، ممکن است نیاز به نقلقول کردن `#' باشد).
اگر گزینهٔ `-e' تنظیم شده باشد، تابع بهصورت غیرتعاملی اجرا میشود: با آرگومانها به عنوان عبارتهایی رفتار میشود که باید ارزیابی شوند، گویی خط به خط به صورت تعاملی وارد شدهاند.
اگر گزینهٔ `-f' تنظیم شده باشد، با تمام اعداد به عنوان ممیز شناور رفتار میشود، بنابراین برای مثال عبارت `3/4' به جای 0 به 0.75 ارزیابی میشود. گزینهها باید در کلمات مجزا قرار گیرند.
اگر گزینهٔ `-r' تنظیم شده باشد، حالت RPN (نشانهگذاری معکوس لهستانی) فعال میشود. این حالت ویژگیهای اضافی گوناگونی دارد:
- پشته (Stack)
- مقادیر ارزیابیشده در یک پشته نگهداری میشوند؛ این در آرایهای به نام stack قرار دارد که جدیدترین مقدار آن در ${stack[1]} است.
- عملگرها و توابع (Operators and functions)
- اگر خط واردشده با یک عملگر (+، -، *، /، **، ^، | یا &) یا تابعی ارائهشده توسط کتابخانهٔ zsh/mathfunc مطابقت داشته باشد، عنصر یا عناصر پایینی پشته برداشته (pop) میشوند تا به عنوان آرگومان یا آرگومانها استفاده گردند. عناصر بالاتر پشته (قدیمیترینها) به عنوان آرگومانهای پیشین استفاده میشوند. سپس نتیجه به درون ${stack[1]} رانده (push) میشود.
- عبارتها (Expressions)
- سایر عبارتها به صورت عادی ارزیابی شده، چاپ میشوند و به عنوان مقادیر عددی به پشته اضافه میگردند. نحو درون عبارتها در یک خط منفرد، محاسبات استاندارد پوسته است (نه RPN).
- فهرست پشته (Stack listing)
- اگر بلافاصله و بدون فاصله بعد از گزینهٔ -r یک عدد صحیح بیاید، در هر ارزیابی به همان تعداد از عناصر پشته، در صورت وجود، به جای فقط جدیدترین نتیجه چاپ میشوند. بنابراین، برای مثال، zcalc -r4 هر بار که نتایج چاپ میشوند، $stack[4] تا $stack[1] را نشان میدهد.
- تکثیر: =
- شبهعملگر = باعث میشود جدیدترین عنصر پشته در پشته تکثیر شود.
- pop
- شبهتابع pop باعث میشود جدیدترین عنصر پشته برداشته (pop) شود. یک `>' به تنهایی نیز همین اثر را دارد.
- >ident
- عبارت > که بدون فاصله یک شناسهٔ پوسته به دنبال آن بیاید، باعث میشود جدیدترین عنصر پشته pop شده و به متغیری با آن نام انتساب یابد. این متغیر برای تابع zcalc محلی است.
- <ident
- عبارت < که بدون فاصله یک شناسهٔ پوسته به دنبال آن بیاید، باعث میشود مقدار متغیری با آن نام به درون پشته push شود. ident میتواند یک عدد صحیح باشد، که در این صورت نتیجهٔ قبلی با آن شماره (همانطور که پیش از > در اعلان استاندارد zcalc نشان داده شده) در پشته قرار میگیرد.
- تبادل: xy
- شبهتابع xy باعث میشود دو عنصر آخر پشته با یکدیگر جابهجا شوند. `<>' نیز همین اثر را دارد.
اعلان (prompt) از طریق پارامتر ZCALCPROMPT قابل پیکربندی است که تحت بسط استاندارد اعلان قرار میگیرد. اندیس ورودی جاری به صورت محلی در اولین عنصر آرایهٔ psvar ذخیره میشود که میتوان در ZCALCPROMPT به عنوان `%1v' به آن ارجاع داد. اعلان پیشفرض `%1v> ' است.
متغیر ZCALC_ACTIVE درون تابع مقداردهی میشود و توسط توابع تو در تو قابل بررسی است؛ این متغیر در صورت فعال بودن حالت RPN دارای مقدار rpn، و در غیر این صورت مقدار 1 خواهد بود.
چند دستور ویژه در دسترس هستند؛ این دستورها با یک دونقطه (:) آغاز میشوند. به منظور سازگاری با نسخههای پیشین، دونقطه ممکن است برای برخی دستورها نادیده گرفته شود. اگر compinit اجرا شده باشد، قابلیت تکمیل خودکار (completion) در دسترس خواهد بود.
دقت خروجی را میتوان درون zcalc با دستورهای ویژهای که در بسیاری از ماشینحسابها آشنا هستند تعیین کرد.
- :norm
- قالب خروجی پیشفرض. این گزینه متناظر با مشخصهٔ %g در printf است. معمولاً شش رقم اعشار را نشان میدهد.
- :sci digits
- نماد علمی، متناظر با قالب خروجی %g در printf با دقتی که توسط digits تعیین شده است. این گزینه بسته به مقدار خروجی، نماد ممیز ثابت یا نمایی تولید میکند.
- :fix digits
- نماد ممیز ثابت، متناظر با قالب خروجی %f در printf با دقتی که توسط digits تعیین شده است..TP :eng digits نماد علمی (نمایی)، متناظر با قالب خروجی %E در printf با دقت تعیینشده توسط digits.
- :raw
- خروجی خام: این حالت پیشفرض خروجی ارزیابیهای ریاضی است. ممکن است دقتی بیش از آنچه عدد واقعاً دارد را نمایش دهد.
سایر دستورهای ویژه:
- :!line...
- اجرای line... به عنوان یک خط فرمان عادی شل. توجه داشته باشید که این دستور در زمینه (context) تابع اجرا میشود، یعنی با متغیرهای محلی. فاصله بعد از :! اختیاری است.
- :local arg ...
- اعلان متغیرهای محلی برای تابع. سایر متغیرها نیز میتوانند استفاده شوند، اما از دامنهٔ سراسری (global scope) خوانده شده یا در آن قرار میگیرند.
- :function name [ body ]
- تعریف یک تابع ریاضی یا (بدون body) حذف آن. :function میتواند به :func یا صرفاً :f خلاصه شود. name میتواند حاوی همان نویسههای مجاز در نام توابع شل باشد. این تابع با استفاده از zmathfuncdef تعریف میشود، به بخش زیر مراجعه کنید.
توجه داشته باشید که zcalc خودش تمام نقلقولها (quoting) را مدیریت میکند. بنابراین برای مثال:
:f cube $1 * $1 * $1
تابعی را برای مکعب کردن (به توان ۳ رساندن) تکآرگومان ورودی تعریف میکند. توابعی که بدین شکل تعریف شوند، یا در واقع هر تابعی که مستقیماً یا غیرمستقیم با استفاده از functions -M تعریف شده باشد، در حالت RPN تنها با وارد کردن نامشان روی خط قابل اجرا هستند؛ این کار تعداد آرگومان مناسب را از پشته واکشی میکند (pop) تا به تابع تحویل دهد، یعنی ۱ مورد در مثال تابع cube. اگر آرگومانهای اختیاری وجود داشته باشد، از این طریق فقط آرگومانهای اجباری تأمین میشوند.
- [#base]
- این یک دستور ویژه نیست، بلکه بخشی از نحو محاسباتی عادی است؛ با این حال، هرگاه این ساختار بهتنهایی روی یک خط ظاهر شود مبنای (radix) پیشفرض خروجی روی base تنظیم میشود. برای مثال، از `[#16]' برای نمایش خروجی هگزادسیمال همراه با نشانگر مبنا، یا `[##16]' برای نمایش مستقیم عدد خام در مبنای دادهشده استفاده کنید. خود مبناها همیشه در مبنای دهدهی مشخص میشوند. عبارت `[#]' قالب خروجی عادی را بازمیگرداند. توجه داشته باشید که تنظیم مبنای خروجی، خروجی ممیز شناور را غیرفعال میکند؛ برای بازگشت به عملکرد عادی از `[#]' استفاده کنید.
- $var
- مقدار var را بهصورت مستقیم چاپ میکند؛ این عمل تأثیری بر محاسبات ندارد. برای استفاده از مقدار var، علامت `$' ابتدایی را حذف کنید.
برای چند نکتهٔ اضافی، توضیحات (کامنتهای) درون تابع را ببینید.
- min(arg, ...)
- max(arg, ...)
- sum(arg, ...)
- zmathfunc
- تابع zmathfunc سه تابع ریاضی min، max و sum را تعریف میکند. توابع min و max یک یا چند آرگومان میپذیرند. تابع sum صفر یا چند آرگومان میگیرد. آرگومانها میتوانند از انواع متفاوتی باشند (صحیح و ممیز شناور).
با ماژول zsh/mathfunc که در بخش `The zsh/mathfunc Module' از zshmodules(1) شرح داده شده است، اشتباه گرفته نشود.
- zmathfuncdef [ mathfunc [ body ] ]
- یک رابط کاربری مناسب برای functions -M.
با دو آرگومان، یک تابع ریاضی به نام mathfunc تعریف میکند که در هر شکلی از ارزیابیهای حسابی قابل استفاده است. body یک عبارت ریاضی برای پیادهسازی تابع است. این عبارت ممکن است شامل ارجاعاتی به پارامترهای مکانی $1، $2 و ... برای اشاره به پارامترهای اجباری و ${1:-defvalue} و ... برای اشاره به پارامترهای اختیاری باشد. توجه داشته باشید که این ساختارها باید دقیقاً رعایت شوند تا تابع بتواند تعداد صحیح آرگومانها را محاسبه کند. پیادهسازی در یک تابع شل به نام zsh_math_func_mathfunc نگهداری میشود؛ معمولاً نیازی نیست کاربر مستقیماً به تابع شل ارجاع دهد. هر تابع موجود با همین نام بیصدا جایگزین میشود.
با یک آرگومان، تابع ریاضی mathfunc و همچنین پیادهسازی تابع شل آن را حذف میکند.
بدون آرگومان، تمام توابع mathfunc را در قالبی مناسب برای بازگرداندن تعاریف فهرست میکند. این توابع لزوماً توسط zmathfuncdef تعریف نشدهاند.
ماژول zsh/newuser همراه با تابعی برای کمک به پیکربندی گزینههای شل برای کاربران جدید ارائه میشود. در صورت نصب بودن ماژول، این تابع میتواند بهصورت دستی نیز اجرا شود. این تابع حتی در صورتی که رفتار پیشفرض ماژول، یعنی اجرای تابع برای یک کاربر جدید که بدون فایلهای راهاندازی وارد سیستم میشود، غیرفعال شده باشد نیز در دسترس است.
- zsh-newuser-install [ -f ]
- این تابع گزینههای مختلفی را برای سفارشیسازی اسکریپتهای راهاندازی پیش روی کاربر قرار میدهد. در حال حاضر تنها ~/.zshrc مدیریت میشود. در صورت تنظیم بودن پارامتر ZDOTDIR، بهجای آن از $ZDOTDIR/.zshrc استفاده میشود؛ این امر راهکاری را برای کاربر فراهم میکند تا فایلی را بدون دستکاری .zshrc موجود پیکربندی کند.
بهطور پیشفرض، اگر تابع هر یک از فایلهای .zshenv، .zprofile، .zshrc یا .zlogin را در دایرکتوری مربوطه پیدا کند، بلافاصله خارج میشود. برای اجبار تابع به ادامه کار، گزینه -f الزامی است. توجه داشته باشید که این وضعیت ممکن است حتی در صورتی که خود .zshrc وجود نداشته باشد نیز رخ دهد.
طبق پیکربندی فعلی، اگر کاربر دارای امتیازات ریشه (root) باشد، تابع بلافاصله خارج خواهد شد؛ این رفتار قابل لغو یا تغییر نیست.
پس از فعالسازی، رفتار تابع باید خودتوضیحدهنده باشد. منوهایی وجود دارند که به کاربر اجازه میدهند مقدار گزینهها و پارامترها را تغییر دهد. پیشنهادها برای بهبود همیشه مورد استقبال است.
هنگام خروج اسکریپت، به کاربر این امکان داده میشود که فایل جدید را ذخیره کند یا خیر؛ تا پیش از این نقطه، تغییرات برگشتپذیر هستند. با این حال، اسکریپت دقت دارد که تغییرات فایل را تنها به گروهی محدود کند که با خطوط `# Lines configured by zsh-newuser-install' و `# End of lines configured by zsh-newuser-install' مشخص شده است. علاوه بر این، نسخه قدیمی .zshrc در فایلی با پسوند افزوده شده .zni ذخیره میشود.
اگر تابع یک .zshrc موجود را ویرایش کند، این بر عهده کاربر است که مطمئن شود تغییرات اعمالشده اثرگذار خواهند بود. برای نمونه، اگر کنترل اجرای برنامه معمولاً در اوایل .zshrc موجود خاتمه یابد، این خطوط اجرا نخواهند شد؛ یا ممکن است یک فایل راهاندازی پس از آن، گزینهها یا پارامترها را بازنویسی کند، و مواردی از این دست. خود تابع تلاشی برای تشخیص چنین تداخلهایی نمیکند.
سایر توابع (OTHER FUNCTIONS)
تعداد زیادی تابع مفید در دایرکتوری Functions/Misc از توزیع zsh وجود دارد. بیشتر آنها بسیار ساده هستند و در اینجا نیازی به مستندسازی ندارند، اما چند مورد از آنها شایسته ذکر ویژه هستند.
توضیحات (Descriptions)
- colors
- این تابع چندین آرایه متناظر (associative array) را برای نگاشت نامهای رنگها به (و از) کدهای هشترنگ استاندارد ترمینال ANSI مقداردهی اولیه میکند. اینها توسط سیستم تم اعلان (به بالا مراجعه کنید) استفاده میشوند. بهندرت ممکن است به اجرای colors بیش از یک بار نیاز پیدا کنید.
هشت رنگ اصلی عبارتند از: black، red، green، yellow، blue، magenta، cyan و white. هر یک از اینها کدهایی برای پیشزمینه و پسزمینه دارند. علاوه بر این، هفت ویژگی شدت وجود دارد: bold، faint، standout، underline، blink، reverse و conceal. در نهایت، هفت کد برای خنثیسازی ویژگیها استفاده میشود: none (بازنشانی همه ویژگیها به مقادیر پیشفرض)، normal (نه bold و نه faint)، no-standout، no-underline، no-blink، no-reverse و no-conceal.
برخی از ترمینالها از تمام ترکیبهای رنگها و شدتها پشتیبانی نمیکنند.
آرایههای متناظر عبارتند از:
- color
- colour
- تمام نامهای رنگها را به کدهای عدد صحیح آنها، و کدهای عدد صحیح را به نامهای رنگها نگاشت میکنند. هشت نام اصلی به کدهای رنگ پیشزمینه نگاشت میشوند، همانطور که نامهای دارای پیشوند `fg-'، مانند `fg-red' عمل میکنند. نامهای دارای پیشوند `bg-'، مانند `bg-blue'، به کدهای پسزمینه اشاره دارند. نگاشت معکوس از کد به رنگ، برای کدهای پیشزمینه نام اصلی و برای پسزمینهها قالب bg- را بازمیگرداند.
اگرچه نامیدن آنها بهعنوان «رنگها» دقیق نیست، این آرایهها چهارده ویژگی دیگر را نیز از نام به کد و از کد به نام نگاشت میکنند.
- fg
- fg_bold
- fg_no_bold
- هشت نام رنگ اصلی را به توالیهای گریز ترمینال ANSI نگاشت میکنند که ویژگیهای متنی پیشزمینه متناظر را تنظیم مینمایند. توالیهای fg رنگ را بدون تغییر هشت ویژگی شدت تغییر میدهند.
- bg
- bg_bold
- bg_no_bold
- هشت نام رنگ اصلی را به توالیهای گریز ترمینال ANSI نگاشت میکنند که ویژگیهای پسزمینه متناظر را تنظیم مینمایند. توالیهای bg رنگ را بدون تغییر هشت ویژگی شدت تغییر میدهند.
علاوه بر این، پارامترهای اسکالر reset_color و bold_color بهترتیب روی توالیهای گریز ترمینال ANSI تنظیم میشوند که همه ویژگیها را خاموش و شدت bold را فعال میکنند.
- fned [ -x num ] name
- همانند zed -f. این تابع در توزیع zsh ظاهر نمیشود، اما میتوان با ایجاد پیوند از zed به نام fned در یکی از دایرکتوریهای موجود در fpath شما، آن را ایجاد کرد.
- histed [ [ name ] size ]
- همانند zed -h. این تابع در توزیع zsh ظاهر نمیشود، اما میتوان با ایجاد پیوند از zed به نام histed در یکی از دایرکتوریهای موجود در fpath شما، آن را ایجاد کرد.
- is-at-least needed [ present ]
- یک مقایسه بزرگتر یا مساوی را بین دو رشته دارای قالب شماره نسخه zsh انجام میدهد؛ یعنی رشتهای از اعداد و متن که بخشهای آن با نقطه یا خط تیره از هم جدا شدهاند. اگر رشته present ارائه نشود، از $ZSH_VERSION استفاده میشود. بخشها در دو رشته از چپ به راست جفت میشوند و از بخشهای غیرعددیِ ابتدایی صرفنظر میگردد. اگر یک رشته بخشهای کمتری نسبت به دیگری داشته باشد، بخشهای ناموجود صفر در نظر گرفته میشوند.
این تابع در فایلهای راهاندازی برای تنظیم گزینهها و سایر وضعیتهایی که در همه نسخههای zsh در دسترس نیستند مفید است.
is-at-least 3.1.6-15 && setopt NO_GLOBAL_RCS is-at-least 3.1.0 && setopt HIST_REDUCE_BLANKS is-at-least 2.6-17 || print "You can't use is-at-least here."
- nslookup [ arg ... ]
- این تابع پوششی (wrapper) برای دستور nslookup به ماژول zsh/zpty نیاز دارد (به zshmodules(1) مراجعه کنید). این تابع دقیقاً مانند nslookup استاندارد رفتار میکند، بهجز اینکه اعلانهای سفارشیپذیر (شامل یک اعلان در سمت راست) و تکمیل خودکار دستورات nslookup، نامهای میزبان و غیره را فراهم میآورد (در صورتی که از سیستم تکمیل مبتنی بر تابع استفاده کنید). سبکهای تکمیل ممکن است با پیشوند زمینه `:completion:nslookup' تنظیم شوند.
همچنین به سبکهای pager، prompt و rprompt در ادامه مراجعه کنید.
- regexp-replace var regexp replace
- از عبارتهای باقاعده برای انجام یک عملیات جستجو و جایگزینی سراسری روی یک متغیر استفاده میکند. عبارتهای باقاعده تعمیمیافته POSIX (کوتاهنوشت ERE) استفاده میشوند، مگر اینکه گزینه RE_MATCH_PCRE تنظیم شده باشد، که در این صورت از عبارتهای باقاعده سازگار با Perl استفاده میشود (این امر مستلزم آن است که شل با کتابخانه pcre پیوند خورده باشد). var نام متغیری است که حاوی رشته مورد نظر برای تطبیق است. این متغیر مستقیماً توسط تابع تغییر داده خواهد شد. از متغیرهای MATCH، MBEGIN، MEND، match، mbegin و mend باید خودداری شود چرا که این متغیرها توسط کد عبارات باقاعده (regular expression) استفاده میشوند.
regexp عبارت باقاعدهای است که رشته باید با آن مطابقت داده شود.
replace متن جایگزین است. این مقدار میتواند شامل عبارتهای پارامتری، دستوری و حسابی باشد که جایگزین خواهند شد: بهویژه، ارجاع به $MATCH با متنی که توسط الگو مطابقت داده شده است، جایگزین خواهد شد.
وضعیت بازگشتی در صورتی که حداقل یک تطبیق انجام شده باشد 0، وگرنه 1 است.
توجه
داشته
باشید که در
صورت
استفاده از
POSIX EREها،
عملگرهای ^
یا مرز کلمه
(word boundary) (در صورت
پشتیبانی)
ممکن است
بهدرستی
کار نکنند.
- run-help cmd
- این تابع بهگونهای طراحی شده است که توسط ویجت ZLE run-help، بهجای نام مستعار پیشفرض فراخوانی شود. برای دستورالعملهای راهاندازی، به «Accessing On-Line Help» در بالا مراجعه کنید.
در ادامه، اگر cmd یک مسیر در فایلسیستم باشد، ابتدا به سمتراستترین جزء خود (نام فایل) تقلیل مییابد.
راهنما ابتدا با جستجوی فایلی به نام cmd در دایرکتوری مشخصشده توسط پارامتر HELPDIR جستجو میشود. اگر هیچ فایلی پیدا نشد، یک تابع کمکی، نام مستعار، یا دستوری به نام run-help-cmd جستجو میشود. در صورت یافتن، دستیار کمکی همراه با بقیه خط فرمان فعلی (هر آنچه پس از نام دستور cmd آمده است) بهعنوان آرگومانهایش اجرا میشود. هنگامی که نه فایل و نه دستیار کمکی یافت نشوند، دستور خارجی «man cmd» اجرا میشود.
یک دستیار کمکی نمونه برای دستور «ssh»:
run-help-ssh() {
emulate -LR zsh
local -a args
# Delete the "-l username" option
zparseopts -D -E -a args l:
# Delete other options, leaving: host command
args=(${@:#-*})
if [[ ${#args} -lt 2 ]]; then
man ssh
else
run-help $args[2]
fi
}
تعدادی از این دستیاران در دایرکتوری Functions/Misc ارائه شدهاند. این موارد برای اینکه توسط run-help پیدا و استفاده شوند، باید بهصورت خودکار بارگذاری (autoload) شوند یا بهعنوان اسکریپتهای اجرایی در مسیر جستجوی (search path) شما قرار گیرند.
- run-help-btrfs
- run-help-git
- run-help-ip
- run-help-openssl
- run-help-p4
- run-help-sudo
- run-help-svk
- run-help-svn
- توابع کمکی برای دستورهای btrfs، git، ip، openssl، p4، sudo، svk و svn.
- tetris
- زمانی Zsh متهم شده بود که به اندازه Emacs کامل نیست، چرا که فاقد بازی Tetris بود. این تابع برای رد این تهمت بدخواهانه نوشته شد.
این تابع باید بهعنوان یک ویجت ZLE استفاده شود:
autoload -U tetris zle -N tetris bindkey keys tetris
برای شروع بازی، ویجت را با فشردن keys اجرا کنید. هر خط فرمانی که در حال ویرایش آن بودید موقتاً ناپدید میشود، و نگاشت کلیدهای شما (keymap) نیز موقتاً با کلیدهای کنترلی Tetris جایگزین میشود. وضعیت قبلی ویرایشگر هنگام خروج از بازی (با فشردن «q») یا زمانی که ببازید، بازیابی میشود.
اگر در میانه بازی خارج شوید، فراخوانی بعدی ویجت tetris از همانجایی که بازی را رها کرده بودید ادامه مییابد. اگر باخته باشید، یک بازی جدید آغاز خواهد شد.
- tetriscurses
- این یک پورت از مورد بالا برای zcurses است. مدیریت ورودی اندکی بهبود یافته است بهگونهای که جابجایی یک بلوک به طرفین، گام زمانی (timestep) را بهطور خودکار پیش نمیبرد، و گرافیک بازی از نویسههای بلوکی یونیکد (unicode block graphics) استفاده میکند.
این نسخه وضعیت بازی را بین دفعات فراخوانی ذخیره نمیکند، و بهعنوان یک ویجت اجرا نمیشود، بلکه اجرای آن بهصورت زیر است:
autoload -U tetriscurses tetriscurses
- zargs [ option ... -- ] [ input ... ] [ -- command [ arg ... ] ]
- این تابع کاربردی مشابه با GNU xargs دارد. بهجای خواندن خطوط آرگومانها از ورودی استاندارد، آنها را از خط فرمان میگیرد. این قابلیت بسیار مفید است زیرا zsh، بهویژه با عملگرهای glob بازگشتی، اغلب میتواند برای یک تابع شل خط فرمانی بسازد که طولانیتر از حداکثر طول قابل پذیرش توسط یک دستور خارجی است.
فهرست option نشاندهنده گزینههای خود دستور zargs است که مشابه با گزینههای xargs میباشند. فهرست input مجموعهای از رشتههاست (اغلب نامهای فایل) که آرگومانهای command را تشکیل میدهند، مشابه با ورودی استاندارد در xargs. در نهایت، فهرست arg شامل آرگومانهایی (معمولاً گزینهها) است که هر بار با اجرای command به آن ارسال میشوند. فهرست arg در هر اجرا، مقدم بر عناصر فهرست input قرار میگیرد. اگر هیچ دستوری (command) مشخص نشود، نباید هیچ فهرست آرگومانی (arg) نیز ارائه شود، و در آن حالت، دستور پیشفرض «print» با آرگومانهای «-r --» خواهد بود.
بهعنوان مثال، برای دریافت فهرست تفصیلی ls از همه فایلهای عادی غیرپنهان در دایرکتوری فعلی یا زیردایرکتوریهای آن:
autoload -U zargs zargs -- **/*(.) -- ls -ld --
اولین و سومین رخداد «--» بهترتیب برای نشانهگذاری پایان گزینههای zargs و ls استفاده میشوند تا در برابر نام فایلهایی که با «-» آغاز میشوند محافظت شود، در حالی که رخداد دوم برای تفکیک فهرست فایلها از دستورِ قابل اجرا («ls -ld --») استفاده میشود.
همچنین اولین «--» در صورتی که احتمال خالی بودن فهرست وجود داشته باشد نیز لازم خواهد بود، مانند:
zargs -r -- ./*.back(#qN) -- rm -fدر صورتی که رشتهٔ «--» یک input (ورودی) باشد یا احتمال برود که باشد، میتوان از گزینهٔ -e برای تغییر نشانگر پایان ورودیها استفاده کرد. توجه داشته باشید که این کار نشانگر پایان گزینهها را تغییر نمیدهد. برای مثال، جهت استفاده از «..» به عنوان نشانگر:
zargs -e.. -- **/*(.) .. ls -ld --
این مورد در این مثال انتخاب مناسبی است، چرا که نام هیچ فایل سادهای نمیتواند «..» باشد، اما بهترین نشانگر پایان به شرایط بستگی دارد.
گزینههای -i، -I، -l، -L و -n کمی با کاربردشان در xargs تفاوت دارند. در zargs هیچ خط ورودی برای شمارش وجود ندارد، بنابراین -l و -L در طول فهرست input میشمارند، و -n تعداد آرگومانهای ارسالی به هر بار اجرای command را، شامل هر فهرست arg، میشمارد. همچنین، هر زمان که -i یا -I استفاده شود، هر input به صورت جداگانه پردازش میشود، درست مانند رفتار «-L 1».
برای جزئیات سایر گزینههای zargs، صفحهٔ راهنمای xargs(1) را ببینید (اما به تفاوت در عملکرد بین zargs و xargs توجه داشته باشید) یا zargs را با گزینهٔ --help اجرا کنید.
- zed [ -f [ -x num ] ] name
- zed [ -h [ name ] size ]
- zed -b
- این تابع از ویرایشگر ZLE برای ویرایش یک فایل یا تابع استفاده میکند.
تنها یک آرگومان name مجاز است. اگر گزینهٔ -f داده شود، نام به عنوان یک تابع در نظر گرفته میشود؛ اگر تابع برای بارگذاری خودکار (autoloading) علامتگذاری شده باشد، zed آن را در fpath جستجو کرده و بارگذاری میکند. توجه داشته باشید توابعی که به این شیوه ویرایش میشوند در شل فعلی نصب میگردند، اما روی فایل autoload بازنویسی نمیشوند. در این حالت گزینهٔ -x مشخص میکند که نویسههای tab ابتدایی که تابع را بر اساس نحو تورفتگی دادهاند باید به تعداد مشخصشدهای از فاصلهها تبدیل شوند؛ «-x 2» با قالببندی توابع توزیعشده به همراه شل همخوانی دارد.
بدون -f، مقدار name نام مسیر فایلی است که باید ویرایش شود و نیازی نیست از قبل وجود داشته باشد؛ در صورت نیاز، هنگام نوشتن ایجاد میشود. همراه با -h، فرض میشود که فایل حاوی رویدادهای تاریخچه (history) است.
هنگامی که هیچ نام فایلی برای -h ارائه نشود، تاریخچهٔ شل فعلی درجا ویرایش میشود. پس از خروج موفقیتآمیز zed، شمارهگذاری تاریخچه دوباره انجام میشود.
هنگام ویرایش تاریخچه، رویدادهای چندخطی باید در انتهای هر خط قبل از آخرین خط، یک بکاسلش داشته باشند.
در حین ویرایش، این تابع نگاشت کلید اصلی را به zed و نگاشت کلید دستور vi را به zed-vicmd تنظیم میکند. اگر این نگاشتها در اولین اجرای zed وجود نداشته باشند، از نگاشتهای کلید موجود main و vicmd کپی خواهند شد. از آنها میتوان برای تعریف کلیدهای میانبر ویژهای که فقط در zed کاربرد دارند استفاده کرد.
اگر نگاشت کلید را ایجاد کند، zed کلید return را مجدداً برای درج شکستگی خط و «^X^W» را برای پذیرش ویرایش در نگاشت کلید zed مقید میکند، و «ZZ» را برای پذیرش ویرایش در نگاشت کلید zed-vicmd اختصاص میدهد.
تنها این کلیدهای میانبر را میتوان با اجرای «zed -b» نصب کرد. این کار برای قرار دادن در یک فایل راهانداز مناسب است. توجه داشته باشید که در صورت اجرای مجدد، این دستور نگاشتهای کلید موجود zed و zed-vicmd را بازنویسی خواهد کرد.
قابلیت تکمیل خودکار در دسترس است، و شیوهها را میتوان با پیشوند زمینهٔ «:completion:zed:» تنظیم نمود.
ویجت zle با نام zed-set-file-name در دسترس است. این ویجت را میتوان با نام از درون zed با استفاده از «\ex zed-set-file-name» فراخوانی کرد یا پس از اجرای «zed -b»، میتوان آن را به کلیدی در هر یک از نگاشتهای کلید zed یا zed-vicmd مقید ساخت. هنگامی که ویجت فراخوانی میشود، نام جدیدی برای فایلی که در حال ویرایش است درخواست میکند. زمانی که zed خارج میشود، فایل با آن نام نوشته خواهد شد و فایل اصلی دستنخورده باقی میماند. فراخوانی این ویجت از «zed -f» بیتأثیر است. زمینهٔ تکمیل خودکار به «:completion:zed-set-file-name:» تغییر مییابد. هنگام ویرایش تاریخچهٔ فعلی با «zed -h»، ابتدا تاریخچه بهروزرسانی شده و سپس فایل نوشته میشود، اما تنظیم سراسری HISTFILE دستکاری نمیشود.
در زمان اجرای zed-set-file-name، برنامهٔ zed از نگاشت کلید zed-normal-keymap استفاده میکند که از نگاشت کلید اصلی فعال در زمان راهاندازی میانبرهای zed پیوند داده شده است. (این کار برای این است که کلید return به صورت عادی عمل کند.) در نتیجه اگر نگاشت کلید اصلی تغییر کرده باشد، ویجت متوجه آن نخواهد شد. این موضوع برای بیشتر کاربران اهمیتی ندارد.
- zcp [ -finqQvwW ] srcpat dest
- zln [ -finqQsvwW ] srcpat dest
- به ترتیب مشابه zmv -C و zmv -L هستند. این توابع در توزیع zsh وجود ندارند، اما میتوان با پیوند دادن zmv به نامهای zcp و zln در پوشهای درون fpath، آنها را ایجاد کرد.
- zkbd
- بخش «تعریف صفحهکلید (Keyboard Definition)» در بالا را ببینید.
- zmv [ -finqQsvwW ] [ -C | -L | -M | -{p|P} program ] [ -o optstring ]
- srcpat dest
- انتقال (معمولاً تغییر نام) فایلهای منطبق بر الگوی srcpat به فایلهای متناظر با نامهایی به فرم ارائهشده توسط dest، به طوری که srcpat شامل پرانتزهایی در بر گیرندهٔ الگوها باشد که به نوبت با $1، $2، ... در dest جایگزین خواهند شد. برای مثال،
zmv '(*).lis' '$1.txt'
نام «foo.lis» را به «foo.txt»، «my.old.stuff.lis» را به «my.old.stuff.txt» و به همین ترتیب تغییر میدهد.
الگو همیشه به عنوان یک الگوی EXTENDED_GLOB در نظر گرفته میشود. هر فایلی که نام آن در اثر جایگزینی تغییر نکند، به سادگی نادیده گرفته میشود. هرگونه خطا (جایگزینی به رشتهای خالی منجر شود، دو جایگزینی نتیجهٔ یکسانی داشته باشند، مقصد یک فایل عادی موجود باشد و -f مشخص نشده باشد) باعث متوقف شدن کل تابع بدون انجام هیچ عملیاتی میشود.
علاوه بر جایگزینی الگو، میتوان به متغیر $f در آرگومان دوم (جایگزینی) ارجاع داد. این کار امکان استفاده از جانشینی متغیر برای تغییر آرگومان را فراهم میکند؛ مثالهای زیر را مشاهده کنید.
گزینهها:
- -f
- رونویسی اجباری فایلهای مقصد. در حال حاضر به دلیل پیچیدگیها و تفاوتهای پیادهسازی به دستور mv/cp/ln منتقل نمیشود (اما برای این منظور میتوانید از -o-f استفاده کنید).
- -i
- تعاملی: نمایش هر خطی که قرار است اجرا شود و پرسش از کاربر مبنی بر اجرای آن. «Y» یا «y» آن را اجرا خواهد کرد و هر ورودی دیگری از آن رد میشود. توجه داشته باشید که فقط وارد کردن یک نویسه کافی است.
- -n
- عدم اجرا: چاپ رخدادهایی که قرار است اتفاق بیفتد، بدون اجرای واقعی آنها.
- -q
- غیرفعال کردن توصیفکنندههای سادهٔ الگو (bare glob qualifiers): اکنون بهطور پیشفرض لحاظ میشود، بنابراین اثری ندارد.
- -Q
- فعالسازی اجباری توصیفکنندههای سادهٔ الگو (bare glob qualifiers). این گزینه را فعال نکنید مگر اینکه واقعاً از توصیفکنندههای glob در یک الگو استفاده کنید.
- -s
- نمادین (Symbolic)، که به ln فرستاده میشود؛ فقط با -L کار میکند.
- -v
- حالت پرگو (Verbose): چاپ هر دستور در حین اجرای آن.
- -w
- انتخاب بخشهای نویسهبدل (wildcard) از الگو، همانطور که در بالا توضیح داده شد، و افزودن ضمنی پرانتزها برای ارجاع به آنها.
- -W
- دقیقاً مانند -w، با این ویژگی اضافه که نویسههای بدل در الگوی جایگزینی به ارجاعهای متوالی ${1} .. ${N} تبدیل میشوند.
- -C
- -L.TP
- -M اجبار به استفاده از cp، ln یا mv (به ترتیب)، صرفنظر از نام تابع.
- -p program
- فراخوانی program به جای cp، ln یا mv. هر کاری که انجام میدهد، دستکم باید ساختار `program -- oldname newname' را درک کند، که در آن oldname و newname نامهای فایل تولیدشده توسط zmv هستند. program به کلمات مجزا تقسیم میشود، بنابراین میتواند برای مثال نام یک ابزار بایگانی به همراه یک زیرفرمان کپی یا تغییر نام باشد.
- -P program
- مانند -p program، به جز اینکه program برای نشان دادن پایان گزینهها، -- بعدی را نمیپذیرد. در این حالت، نامهای فایل باید از قبل در قالبی معقول و مناسب برای برنامهٔ مورد نظر باشند.
- -o optstring
- رشتهٔ optstring به کلمات تفکیک شده و عینا به دستور فراخوانیشدهٔ cp، ln یا mv جهت انجام کار تحویل داده میشود. این رشته احتمالا باید با یک `-' شروع شود.
مثالهای بیشتر:
zmv -v '(* *)' '${1// /_}'
برای هر فایل در دایرکتوری جاری که حداقل یک فاصله در نام خود دارد، هر فاصله را با یک زیرخط (underscore) جایگزین کرده و دستورهای اجراشده را نمایش میدهد.
zmv -v '* *' '${f// /_}'
این دستور دقیقا همان کار را با ارجاع به نام فایل ذخیرهشده در $f انجام میدهد.
برای مثالهای کاملتر و سایر جزئیات پیادهسازی، فایل منبع zmv را ببینید، که معمولا در یکی از دایرکتوریهای مشخصشده در fpath شما، یا در Functions/Misc/zmv در توزیع zsh قرار دارد.
- zrecompile
- بخش `Recompiling Functions' در بالا را ببینید.
- zstyle+ context style value [ + subcontext style value ... ]
- این دستور تعریف سبکها را با استفاده از یک `+' منفرد به عنوان نشانهای ویژه سادهتر میکند؛ این نشانه به شما امکان میدهد یک نام زمینه (context) را به نام زمینهٔ قبلا استفادهشده پیوست کنید. مانند این:
zstyle+ ':foo:bar' style1 value1 \
+':baz' style2 value2 \
+':frob' style3 value3
این دستور طبق معمول style1 را با value1 برای زمینهٔ :foo:bar تعریف میکند، اما همچنین style2 را با value2 برای زمینهٔ :foo:bar:baz و style3 را با value3 برای :foo:bar:frob تعریف مینماید. هر subcontext میتواند یک رشتهٔ خالی باشد تا همان زمینهٔ اول بدون تغییر مجددا استفاده شود.
سبکها (Styles)
- insert-tab
- تابع zed این سبک را در زمینهٔ `:completion:zed:*' تنظیم میکند تا در زمان فشرده شدن کلید TAB در ابتدای خط، کاملسازی غیرفعال شود. شما میتوانید با تنظیم مقدار دلخواه خود برای این زمینه و سبک، این رفتار را بازنویسی کنید.
- pager
- تابع nslookup این سبک را در زمینهٔ `:nslookup' جستجو میکند تا برنامهای را تعیین کند که برای نمایش خروجیهای جانشدنی در یک صفحهٔ منفرد استفاده میشود.
- prompt
- rprompt
- تابع nslookup این سبک را در زمینهٔ `:nslookup' جستجو میکند تا به ترتیب اعلان (prompt) و اعلان سمت راست را تنظیم کند. بسطهای معمول برای پارامترهای PS1 و RPS1 قابل استفاده هستند (بخش EXPANSION OF PROMPT SEQUENCES در zshmisc(1) را ببینید).
| July 12, 2026 | zsh 5.9.2 |