rlwrap(1) General Commands Manual rlwrap(1)

rlwrap - پوشش‌دهنده ریدلاین برای ویرایش خط فرمان، تاریخچه و تکمیل خودکار

rlwrap [rlwrap-options] command ...

دستور rlwrap دستور مشخص‌شده command را اجرا کرده و با رهگیری ورودی کاربر، قابلیت‌های ویرایش خط، تاریخچه ماندگار و تکمیل خودکار کتابخانه readline را برای آن فراهم می‌کند.

دستور rlwrap تلاش می‌کند (و تقریباً موفق می‌شود) که کاملاً شفاف عمل کند؛ بدین معنی که شما (یا پوسته شما) نباید هیچ تفاوتی بین command و rlwrap command احساس کنید، مگر البته افزوده شدن قابلیت‌های ریدلاین. این موضوع حتی هنگام تغییر مسیر (re-directing)، ارسال به لوله (piping) و ارسال سیگنال‌ها به/از command و زمانی که command تنظیمات ترمینال، دایرکتوری کاری یا (با گزینه -U) خط فرمان خود را دستکاری می‌کند، برقرار است.

گزینه‌های متعددی برای افزودن تکمیل خودکار (قابل برنامه‌ریزی)، مدیریت ورودی‌های چندخطی، رنگ‌آمیزی و بازنویسی اعلان‌ها (prompts) وجود دارد. اگر به آن‌ها نیازی ندارید (که احتمالاً هم ندارید)، می‌توانید از بقیه این صفحه راهنما صرف‌نظر کنید، گرچه برخی از این گزینه‌ها می‌توانند کار با خط فرمان شما را بسیار راحت‌تر کنند...

همیشه در «حالت ریدلاین» (در ادامه توضیح داده شده) باقی بماند، بدون در نظر گرفتن تنظیمات ترمینال command. اگر rlwrap «کاری انجام نمی‌دهد» این گزینه برای استفاده است، چرا که ظاهراً command در حال حاضر خودش ویرایش خط را انجام می‌دهد. نکته: با این گزینه، rlwrap گذرواژه‌ها را در خروجی منعکس (و ذخیره) می‌کند، مگر اینکه اعلان گذرواژه command را به عنوان آرگومان مشخص کنید.

این آرگومان اختیاری است؛ در صورت ارائه، باید مستقیماً بدون فاصله پس از یک گزینه کوتاه (-aPassword:) و پس از یک گزینه بلند با علامت مساوی (--always-readline=Password:) بیاید.

گزینه -N (--no-children) را می‌توان برای جلوگیری از پوشش‌دهی صفحه‌بندها و ویرایشگرهایی که از command فراخوانی می‌شوند به کار برد؛ این کار کارایی آن‌ها را بسیار بهتر می‌کند.

اعلان‌هایی که از رنگ استفاده می‌کنند، یا کدهای CSI دیگر را مثلاً برای تنظیم عنوان پنجره یا فعال‌سازی bracketed-paste به کار می‌برند، ممکن است باعث سردرگمی rlwrap شوند، به‌ویژه در انتهای خطوط ورودی طولانی. این گزینه معمولاً (اما نه در همه موارد) رفتار rlwrap را در چنین شرایطی بهتر می‌کند.

ارائه '!' به عنوان آرگومان باعث می‌شود rlwrap تمام کدهای رنگی را از اعلان حذف کند.

این آرگومان اختیاری است؛ در صورت ارائه، باید مستقیماً بدون فاصله پس از یک گزینه کوتاه (-A!) و پس از یک گزینه بلند با علامت مساوی (--ansi-colour-aware=!) بیاید.

کاراکترهای مشخص‌شده را به عنوان جداکننده کلمه در نظر می‌گیرد. این تعیین می‌کند چه چیزی هم در زمان تکمیل خودکار و هم در زمان ساخت فهرست کلمات تکمیل از فایل‌های مشخص‌شده با گزینه‌های -f بعد از آن (نه قبل از آن!) به عنوان یک «کلمه» شناخته شود. فهرست پیش‌فرض: (){}[],'+-=&^%$#@";|\ مگر اینکه -c مشخص شده باشد، کاراکترهای / و . (نقطه) به این فهرست پیش‌فرض اضافه می‌شوند. فاصله‌های خالی (Whitespace) همیشه جداکننده کلمه هستند، مگر اینکه به ابتدای فهرست پیشوند "precisely:" را اضافه کنید. به عنوان مثال: -b $'precisely:\t' روی تب‌ها تفکیک می‌کند، اما روی فاصله‌ها یا چیز دیگری جداکننده نخواهد بود. به دلیل محدودیتی در rlwrap، خطوط جدید (newlines) همیشه جداکننده کلمه هستند.
تکمیل نام فایل‌ها (تکمیل نام فایل همیشه به بزرگی و کوچکی حروف حساس است، حتی با گزینه -i). در لینوکس، OS X، FreeBSD و Solaris، دستور rlwrap دایرکتوری کاری command را دنبال می‌کند تا نام فایل‌های نسبی همان‌طور که انتظار می‌رود تکمیل شوند.
استفاده از command_name به جای command برای تعیین نام فایل‌های تاریخچه و تکمیل خودکار، و ارزیابی شرط‌های $if command_name در $INPUTRC. آرگومان عددی N > 0 یعنی: استفاده از Nامین آرگومان به عنوان command_name (شمارش معکوس از انتهای فهرست آرگومان‌ها).
میزان سخت‌گیری در حذف موارد تکراری از تاریخچه ورودی. اگر n = 0 باشد، تمام ورودی‌ها در فهرست تاریخچه نگهداری می‌شوند؛ اگر n = 1 باشد (پیش‌فرض)، موارد تکراری متوالی از فهرست حذف می‌شوند، در حالی که n = 2 باعث می‌شود rlwrap تمام رخدادهای قبلی ورودی جاری (در نشست فعال) را از فهرست پاک کند.

استفاده از -D 2 در ترکیب با کلید operate-and-get-next ممکن است موارد تاریخچه را به روشی غیرقابل‌پیش‌بینی جابه‌جا کند!

به طور پیش‌فرض، rlwrap پس از هر متن تکمیل درج‌شده یک فاصله می‌افزاید. با این گزینه می‌توانید آن را به '' (عدم درج هیچ چیز) یا کاراکتری دیگر تغییر دهید.
به طور پیش‌فرض، rlwrap با نمایش '***' در هر زمان که کلاینت فلگ ECHO را در ورودی خود پاک کند، از نمایش گذرواژه‌ها جلوگیری می‌کند. این گزینه باعث می‌شود rlwrap این فلگ ECHO را نادیده بگیرد و همیشه ورودی کاربر را منعکس کند (-aPassword: همچنان طبق انتظار کار خواهد کرد).
تقسیم file به کلمات (با استفاده از کاراکترهای پیش‌فرض تفکیک کلمه، یا کاراکترهای مشخص‌شده توسط گزینه --break-chars قبلی)، و افزودن آن‌ها به فهرست کلمات تکمیل. این گزینه می‌تواند بیش از یک بار مشخص شود، و کلمات را به فهرست تکمیل پیش‌فرض در RLWRAP_HOME$ یا /usr/share/rlwrap/completions اضافه می‌کند.

مشخص کردن -f . باعث می‌شود rlwrap از فایل تاریخچه جاری به عنوان فهرست کلمات تکمیل استفاده کند.

فراموش کردن (یعنی هرگز در فهرست تاریخچه قرار ندادن) خطوط ورودی که با عبارت باقاعده POSIX 1003.2 به نام regexp مطابقت دارند. یک مورد استفاده متداول -g '^[[:blank:]]' (یا به سادگی -g '^ ') است تا خطوط ورودی که با فاصله شروع می‌شوند به خاطر سپرده نشوند. تطابق همیشه غیرحساس به بزرگی و کوچکی حروف است. کلاس‌های کاراکتری به سبک perl مانند '\d' شناخته نمی‌شوند، از '[[:digit:]]' استفاده کنید. برای اطلاعات بیشتر درباره عبارات باقاعده، regex (7) را ببینید.
چاپ یک پیام راهنمای کوتاه.
خواندن تاریخچه دستورات از file (و بازنویسی در آن در صورتی که 0 <= histsize-- باشد).
نادیده گرفتن بزرگی و کوچکی حروف هنگام تکمیل خودکار (تکمیل نام فایل همچنان حساس به حروف باقی می‌ماند). این گزینه باید قبل از هر گزینه -f بیاید.
ارسال سیگنال TERM به command هنگام دریافت INT (مثلاً زمانی که CTRL-C را فشار می‌دهید).
در حالت ریدلاین، الحاق خروجی command (شامل ورودی منعکس‌شده کاربر) به file (در صورت عدم وجود file، ایجاد می‌شود).
فعال‌سازی ورودی چندخطی با استفاده از یک توالی کاراکتری «جایگزین خط جدید» (به طور پیش‌فرض " \ "، [فاصله-بک‌اسلش-فاصله]). جایگزین‌های خط جدید پیش از ارسال ورودی به command به خط جدید تبدیل می‌شوند. با این گزینه، می‌توانید یک ویرایشگر خارجی RLWRAP_EDITOR$ را روی ورودی جاری (گسترش‌یافته) با کلید rlwrap_call_editor (به طور پیش‌فرض CTRL-^) فراخوانی کنید. این آرگومان اختیاری است؛ در صورت ارائه، باید مستقیماً بدون فاصله پس از یک گزینه کوتاه (-m';;') و پس از یک گزینه بلند با علامت مساوی (--multi-line=';;') بیاید.
فراخوانی ویرایشگر چندخطی روی فایل‌های موقت با پسوند نام فایل .ext (برای مثال برای رنگ‌آمیزی خودکار نحو مفید است).
عدم چاپ هشدارها.
زمانی که rlwrap با گزینه --always-readline فراخوانی می‌شود، صفحه‌بندها و ویرایشگرهایی که توسط کلاینت فراخوانی می‌شوند عملاً غیرقابل‌استفاده خواهند بود، زیرا آن‌ها کلیدهای فشرده‌شده را فقط با فشردن ENTER دریافت می‌کنند. دستور rlwrap -N با سوئیچ به حالت مستقیم در صورتی که تشخیص دهد command منتظر یکی از فرزندان خود است، از این مشکل جلوگیری می‌کند.
ارسال یک EOF به command پس از پذیرش اولین خط ورودی.
فقط پردازش (cook) اعلان‌هایی که با regexp مطابقت دارند؛ می‌تواند با '!' شروع شود، به این معنی که تمام اعلان‌های کاندید مطابق بلافاصله پردازش می‌شوند («حالت مطمئن»).
استفاده از یکی از نام‌های رنگ black, red, green, yellow, blue, cyan, purple (=magenta) یا white، یا یک کد رنگی ANSI مانند $'\033[1;33m' یا 'ESC[38;5;209m'. یک نام رنگ با حروف بزرگ (Yellow یا YELLOW) باعث بولد شدن اعلان می‌شود. اعلان‌هایی که از قبل حاوی توالی‌های اسکیپ (رنگی) یا یکی از «نشانگرهای نادیده‌گیری» ریدلاین (ASCII 0x01 و 0x02) هستند، هرگز رنگ‌آمیزی نمی‌شوند. این گزینه به طور ضمنی --ansi-colour-aware را فعال می‌کند. برای کسب اطلاعات بیشتر درباره کدهای رنگ، 'ANSI color' را در گوگل جستجو کنید. این آرگومان اختیاری است؛ در صورت ارائه، باید مستقیماً بدون فاصله پس از یک گزینه کوتاه (-p'Red') و پس از یک گزینه بلند با علامت مساوی (--prompt-colour='Red') بیاید.
شروع rlwrap در حالی که text در بافر ویرایش آن قرار دارد (این کار گزینه --always-readline را به طور خودکار فعال می‌کند).
فرض می‌کند که کاراکترهای داده‌شده هنگام تطبیق پرانتزها به عنوان علامت نقل‌قول عمل می‌کنند. دقت کنید که این فهرست را برای پوسته خود به درستی اسکیپ کنید (مثال: -q "\"'", که پیش‌فرض است، یا -q "\"" که برای ورودی‌های لیسپ مناسب‌تر خواهد بود).
قرار دادن تمام کلمات مشاهده‌شده در ورودی و خروجی در فهرست تکمیل خودکار.
تنظیم اولویت rlwrap به صورتی که بهتر (nicer) از command باشد (مقایسه کنید با nice (1)). این کار ممکن است از قطع شدن command توسط rlwrap برای نمایش اعلان در زمانی که command هنوز در حال پردازش خروجی بعدی است، جلوگیری کند.
محدود کردن فهرست تاریخچه به N ورودی، همراه با کوتاه کردن فایل تاریخچه (پیش‌فرض: 300). اندازه منفی -N (حتی -0) همان معنای N را دارد، اما فایل تاریخچه را فقط‌خواندنی در نظر می‌گیرد.
جایگزین کردن اعلان مشخص‌شده به جای اعلان خود command. عمدتاً زمانی مفید است که command اعلانی ندارد.
تنظیم متغیر TERM دستور command به name. برنامه‌هایی را که با کدهای کنترلی پیچیده صفحه باعث سردرگمی rlwrap می‌شوند، گاهی می‌توان با مشخص کردن -t dumb رام کرد.
(فقط در لینوکس) ردیابی آرگومان‌های command همان‌طور که توسط دستور ps (1) دیده می‌شوند، و بازتاب آن‌ها در آرگومان‌های خود rlwrap. این قابلیت می‌تواند برای دستوراتی مفید باشد که آرگومان‌های گذرواژه خط فرمان را بازنویسی می‌کنند که بدون این گزینه توسط rlwrap فاش می‌شدند. این بازتاب فقط پس از اولین ورودی کاربر یا در صورت استفاده از گزینه --polling (که اگر می‌خواهید خط فرمان را پنهان کنید احتمالاً نیاز دارید) پس از چند میلی‌ثانیه انجام می‌شود.
چاپ نسخه rlwrap.
برای تعیین اینکه آیا آخرین خروجی command یک اعلان است، rlwrap به مدت timeout میلی‌ثانیه پس از دریافت آن منتظر می‌ماند. تنها زمانی که خروجی دیگری نرسد، اعلان پردازش (رنگ‌آمیزی، فیلتر یا جایگزین با اعلان جایگزین) شده و به عنوان اعلان نمایش می‌یابد. پیش از آن، اعلان به صورت «پردازش‌نشده» نمایش داده می‌شود. اکثر کاربران متوجه نخواهند شد، اما کسانی که پردازش سنگین روی اعلان دارند می‌توانند یک علامت منفی قبل از مهلت زمانی قرار دهند، که باعث می‌شود rlwrap اعلان را تا قبل از پردازش نگه دارد («حالت صبور»). این کار از پرش و چشمک‌زدن اعلان جلوگیری می‌کند، اما با خطوط خروجی طولانی تداخل داشته و قابلیت اطمینان سوییچ از حالت مستقیم به حالت ریدلاین را کاهش می‌دهد. مهلت زمانی پیش‌فرض: 40 میلی‌ثانیه.
بیدار شدن در هر timeout میلی‌ثانیه، که در آن timeout همان مقدار گزینه -w (--wait-before-prompt) است (به طور پیش‌فرض 40 میلی‌ثانیه). این ویژگی برای تشخیص کاراکتر وقفه اسلیو و فلگ ISIG و تنظیم پیکربندی ترمینال stdin بر همین اساس به کار می‌رود، حتی پیش از آنکه کلیدی را فشار دهید. این گزینه را زمانی امتحان کنید که مثلاً CTRL-C روی command با و بدون rlwrap رفتار متفاوتی دارد.
عدم ایجاد یک نشست جدید برای command: دستور command ترمینال کنترلی فرآیندی را که rlwrap را فراخوانی کرده به ارث می‌برد. این قابلیت می‌تواند برای پوشش دادن دستوراتی مفید باشد که فرزندانی تولید می‌کنند که انتظار می‌رود با خروج خود دستور به کار ادامه دهند (به‌ویژه: سیگنال SIGHUP دریافت نکنند).
استفاده از filter برای تغییر رفتار rlwrap. فیلترها اسکریپت‌های کوچک python یا perl هستند که توسط rlwrap برای بازنویسی یا سرکوب ورودی، خروجی، اعلان‌ها، موارد تاریخچه و حتی سیگنال‌ها اجرا می‌شوند. می‌توان از آن‌ها برای دور نگه داشتن ورودی حساس از تاریخچه، پیاده‌سازی ماکروهای ساده، کلیدهای میانبر قابل برنامه‌ریزی برای مواردی مانند جستجوی فازی تاریخچه، و تکمیل خودکار برنامه‌پذیر استفاده کرد. دستور rlwrap به همراه یک ماژول perl و یک ماژول python عرضه می‌شود تا نوشتن فیلترها آسان باشد (مقایسه کنید با RlwrapFilter(3pm) برای ماژول پرل؛ ماژول پایتون بسیار مشابه است). تعدادی فیلتر نمونه در دایرکتوری /usr/share/rlwrap/filters نصب شده است.


rlwrap -z listing

تمام فیلترهای نصب‌شده فعلی را فهرست می‌کند، در حالی که


rlwrap -z filter

اطلاعات مربوط به filter را نمایش می‌دهد.

اگر filter به آرگومان نیاز دارد، باید کل خط فرمان فیلتر را داخل کوتیشن قرار دهید:

rlwrap -z 'filter args' command ...
rlwrap -z 'pipeline filter1 ... : filter2 ... : ...' command ...

اگر این خط فرمان شامل کاراکترهای کنترلی پوسته باشد، rlwrap آن را برای تجزیه به پوسته سیستم ارسال می‌کند.

از آنجا که فیلترها باید از یک پروتکل ویژه پیروی کنند، دستورات پوسته مانند sed و grep را نمی‌توان مستقیماً به عنوان فیلترهای rlwrap استفاده کرد. با این حال، می‌توان آن‌ها را توسط فیلتر makefilter به فیلتر تبدیل نمود:


rlwrap -z 'makefilter egrep -i --color "error|$"' command

تمام رخدادهای "error" (یا "Error") را در خروجی command رنگ‌آمیزی می‌کند، در حالی که


rlwrap -z 'makefilter --message-type history sed -e s"/whisky/lemonade/";' command

تاریخچه نوشیدنی‌های شما را پاکسازی می‌کند. البته هر دو فیلتر را می‌توان با استفاده از فیلتر pipeline ترکیب کرد.

اجرای nc (netcat) با قابلیت ویرایش خط فرمان و تاریخچه
rlwrap nc
پوشش‌دهی smbclient (که خود از ریدلاین استفاده می‌کند)، دور نگه داشتن گذرواژه‌ها از تاریخچه و عدم تداخل با صفحه‌بندها (مانند less) که توسط smbclient فراخوانی می‌شوند.
rlwrap -aPassword: -N smbclient //PEANUT/C
پوشش‌دهی sensitive_app، مخفی کردن گذرواژه از ps (در صورتی که sensitive_app این کار را انجام دهد) و دور نگه داشتن تمام ورودی‌هایی که با فاصله شروع می‌شوند از تاریخچه:
rlwrap -g '^ ' -U sensitive_app --password MySeCrEt
پوشش‌دهی gauche (یک مفسر Scheme) با یک اعلان آبی پررنگ، فعال‌سازی ویرایش چندخطی (با استفاده از پسوند فایل scm.) و در نظر نگرفتن علامت نقل‌قول تکی به عنوان کوت (تا پرانتزها مثلاً در (print 'q) تطابق داشته باشند)
rlwrap -pBlue -m -M .scm -q'"' gosh
پوشش‌دهی sqlite3، استفاده از فیلتر pipeto برای توانایی هدایت خروجی دستورات SQL از طریق لوله به grep و/یا less، و تکمیل خودکار (غیرحساس به بزرگی و کوچکی حروف) بر اساس کلمات کلیدی SQL در 'sql_words'
rlwrap -a -z pipeto -i -f sql_words sqlite3 contacts.db
در یک اسکریپت شل، استفاده از rlwrap در حالت 'تک‌مرحله‌ای' (one-shot) به عنوان جایگزینی برای read
order=$(rlwrap -pYellow -S 'Your pizza? ' -H past_orders -P Margherita -o cat)

بیشتر دستورات ساده کنسول، ترمینال شما را در حالت «پردازش‌شده» (cooked) یا «خام» (raw) قرار می‌دهند. در حالت پردازش‌شده، ترمینال تا زمانی که کلید ENTER را فشار ندهید منتظر می‌ماند و سپس تمام خط را به برنامه تحویل می‌دهد؛ در حالت خام، هر کلیدی که فشار می‌دهید بلافاصله تحویل داده می‌شود. در حالت پردازش‌شده معمولاً می‌توانید از کلید backspace برای ویرایش ورودی استفاده کنید، اما کلیدهای جهت‌نما برای این کار عمل نمی‌کنند.

زمانی که از دستور rlwrap command استفاده می‌کنید، rlwrap آن را در یک نشست جداگانه، تحت «شبه‌ترمینال» (pty) کنترلی خود اجرا می‌کند و این pty را تحت نظر می‌گیرد تا ببیند در حالت خام است یا پردازش‌شده. در حالت اول، rlwrap تمام ورودی و خروجی را مستقیماً بین command و ترمینال شما کپی می‌کند («حالت مستقیم»). در حالت دوم، rlwrap از ریدلاین برای ویرایش ورودی استفاده می‌کند («حالت ریدلاین») و خروجی command را زیر نظر می‌گیرد؛ هر خط پایانی که به خط جدید ختم نشود یک اعلان کاندید است. نحوه رفتار با این اعلان کاندید به این بستگی دارد که در حالت «صبور» باشد یا «ناشکیبا» (در ادامه آمده است).

دستورات ساده کنسول هر زمان که خطوط کامل ورودی را بخواهند از حالت پردازش‌شده، و هرگاه فشرده شدن تک‌کلیدها را بخواهند از حالت خام استفاده می‌کنند. این‌ها همان برنامه‌هایی هستند که rlwrap بیشترین کاربرد را برای آن‌ها دارد. دستورات پیچیده‌تر ویرایشگر خط اختصاصی خود را دارند و از این رو همیشه از حالت خام استفاده می‌کنند. در کار با این دستورات، به نظر می‌رسد که rlwrap «کاری انجام نمی‌دهد». بنابراین، اگر زمانی که کاربر برای نخستین بار کلید ENTER را فشار می‌دهد rlwrap در حالت مستقیم باشد، هشداری صادر می‌کند مبنی بر اینکه برای انجام هر کاری به --always-readline نیاز است (هشدارها را می‌توان با گزینه -n غیرفعال کرد).

اگر command خروجی زیادی بنویسد، این خروجی تمایل دارد به صورت «تکه‌های مجزا» (chunks) نوشته (و خوانده) شود. تمام تکه‌ها به یک خط جدید ختم نمی‌شوند، و ما باید آخرین خطوط آن‌ها («اعلان‌های کاندید») را از اعلان‌های واقعی تشخیص دهیم، به‌ویژه اگر بخواهیم اعلان‌ها را بازنویسی («پردازش») کنیم. دستور rlwrap این مشکل را (تقریباً) با کمی صبر حل می‌کند تا ببیند آیا خروجی بیشتری در راه است یا خیر. این زمان به طور پیش‌فرض 40 میلی‌ثانیه است، اما می‌توان آن را با گزینه -w تغییر داد. معمولاً rlwrap اعلان کاندید را به محض دریافت می‌نویسد، و پس از سپری شدن زمان انتظار، آن را با نسخه «پردازش‌شده» جایگزین می‌کند. به این رفتار، حالت «ناشکیبا» (impatient) گفته می‌شود. اگر اثر چشمک‌زدن را دوست ندارید (که در زمان پردازش سنگین اعلان می‌تواند آزاردهنده باشد)، می‌توانید rlwrap را با تعیین مقداری منفی در -w (مثلاً ‎-w -40) در «حالت صبور» قرار دهید. در این صورت، Rlwrap اعلان را نگه می‌دارد و تنها پس از پردازش، آن را چاپ می‌کند. اگر اعلان‌ها همیشه با یک عبارت باقاعده مطابقت دارند، می‌توانید «حالت مطمئن» را با --only-cook='!<regexp>' مشخص کنید (به علامت تعجب توجه نمایید). در این صورت تمام اعلان‌های کاندید مطابق (و فقط آن‌ها) بلافاصله پردازش می‌شوند. با این حال، اگر خروجی بیشتری دریافت شود، به حالت «پردازش‌نشده» بازنمی‌گردند؛ اتفاقی که در صورت اعلان نبودن آن‌ها ممکن است رخ دهد. حالت مطمئن با مقادیر منفی برای گزینه -w کار نمی‌کند.

اگر و زمانی که rlwrap تشخیص دهد که با یک اعلان مواجه است، بسته به گزینه‌های ارائه‌شده مجموعه‌ای از اقدامات را روی آن انجام می‌دهد: فیلتر کردن (-z)، جایگزینی (-S) و رنگ‌آمیزی (-p)، به همین ترتیب. اعلان «پردازش‌شده» حاصل سپس چاپ می‌شود (در صورت لزوم پس از پاک کردن اعلان «خام»).

پذیرش خط جاری، اما قرار ندادن آن در فهرست تاریخچه. این عمل دارای نام دستور readline به صورت rlwrap-accept-line-and-forget است.
استفاده از یک ویرایشگر خارجی (به RLWRAP_EDITOR در ادامه مراجعه کنید) برای ویرایش ورودی جاری (این ویژگی تنها در صورتی کار می‌کند که گزینه -m تنظیم شده باشد). این عمل دارای نام دستور readline به صورت rlwrap-call-editor است.
(در حال حاضر اختصاص داده نشده)
هر کلید (یا توالی کلید، در ادامه ببینید) را می‌توان به دستور readline با نام rlwrap-direct-keypress اختصاص داد. این کلید (یا کلیدها) پس از آن همیشه مستقیماً به command ارسال خواهند شد، حتی زمانی که rlwrap در حالت مستقیم نباشد.
(در حال حاضر اختصاص داده نشده)
هر کلید یا ترکیب کلید را می‌توان به دستور readline با نام rlwrap-direct-prefix اختصاص داد. این امکان تعریف کلیدهای مستقیم چندکلیدی را از طریق تعریف کلید(های) اول آن‌ها به عنوان یک «پیشوند مستقیم» فراهم می‌سازد.
(در حال حاضر اختصاص داده نشده)
چندین کلید را می‌توان به دستور readline با نام rlwrap-hotkey اختصاص داد. هر یک از این کلیدها باعث می‌شود خود کلید، خط ورودی جاری و تاریخچه جاری فیلتر شوند (مقایسه کنید با RlwrapFilter(3pm)) از طریق فیلتر فعال (بنابراین در صورت نبود فیلتر اثری نخواهد داشت)، که سپس می‌تواند خط ورودی را بازنویسی کند، مکان‌نما را جابه‌جا نماید و تاریخچه را به‌روزرسانی کند (برای هر کلید به صورتی متفاوت). پس از آن، کاربر همچنان می‌تواند ورودی حاصل را ویرایش کند.
(در حال حاضر اختصاص داده نشده)
دستور rlwrap-hotkey-without-history مانند rlwrap-hotkey عمل می‌کند، اما تاریخچه (که ممکن است بسیار حجیم باشد) به فیلتر ارسال نمی‌شود. اگر فیلتر در هر صورت کار مفیدی با تاریخچه انجام نمی‌داد، این روش کارآمدتر است.
(در حال حاضر اختصاص داده نشده)
دستور operate-and-get-next خط فعلی را برای بازگشت به برنامه فراخواننده می‌پذیرد گویی کاراکتر خط جدید وارد شده است، و خط بعدی را متناسب با خط جاری از تاریخچه برای ویرایش واکشی می‌کند. کلید میانبر پیش‌فرض readline (CTRL + O) توسط rlwrap بازنویسی می‌شود، اما می‌توان آن را دوباره در ~/.inputrc اختصاص داد. از این دستور در ترکیب با -D 2 (--history-no-dupes 2) استفاده نکنید (به بخش‌های بالا مراجعه شود).

کلیدهای ویژه صرفاً به این دلیل انتخاب شده‌اند که در حال حاضر به هیچ عملیاتی در ریدلاین اختصاص ندارند. اگر آن‌ها را دوست ندارید (یا مدیر پنجره شما آن‌ها را می‌بلعد)، می‌توان آن‌ها (و ۴ دستور دیگر) را با افزودن خطوطی شبیه به موارد زیر در ~/.inputrc به شکلی معقول‌تر بازتعریف کرد:

"\M-\C-m":  rlwrap-accept-line-and-forget         # ESC-ENTER to accept but keep out of history
"\C-x":     rlwrap-call-editor                    # CTRL-x e to edit (multi-line) input in editor of your choice
 $if erl                                          # (only) for the Erlang shell:
    "\C-g": rlwrap-direct-keypress                # pass CTRL-g directly to enter 'user switch' command
 $endif
 "\C-t":    rlwrap-direct-prefix                  # make it possible to define direct keypresses that start with CTRL-t ...
 "\C-tx":   rlwrap-direct-keypress                # ... in that case: pass CTRL-t + x directly.
 "\C-y":    rlwrap-hotkey-without-history         # CTRL-y to filter input line (and e.g. insert X selection)

مقایسه کنید با صفحه راهنمای readline(3). (توجه: دقت کنید کلیدهایی را که از قبل توسط مدیر پنجره یا درایور ترمینال تسخیر شده‌اند، مانند CTRL+S، به کار نبرید، زیرا rlwrap هرگز آن‌ها را دریافت نخواهد کرد).

دایرکتوری که فایل‌های تاریخچه و تکمیل خودکار در آن نگهداری می‌شوند.
ویرایشگری که برای ورودی چندخطی (و rlwrap-edit-history) به کار می‌رود. مثال:
export RLWRAP_EDITOR="vi +%L"
export RLWRAP_EDITOR="vim '+call cursor(%L,%C)'"
export RLWRAP_EDITOR="emacs +%L:%C %F"

اولین مثال در بالا حالت پیش‌فرض است؛ L% و C% با شماره‌های خط و ستون متناظر با موقعیت مکان‌نما در بافر ویرایش rlwrap جایگزین می‌شوند، و F% با نام فایل (موقت) جایگزین می‌گردد. اگر F% استفاده نشود، این نام پس از مقدار (گسترش‌یافته) RLWRAP_EDITOR$ قرار می‌گیرد.

اگر یک فیلتر را با یک مسیر نسبی مشخص کنید (rlwrap -z filter یا rlwrap -z dir/filter)، دستور rlwrap مسیر $RLWRAP_FILTERDIR را به این مسیر اضافه خواهد کرد (یا /usr/share/rlwrap/filters اگر این متغیر تنظیم نشده باشد).

تعدادی از سیگنال‌ها به command فوروارد می‌شوند: HUP INT QUIT USR1 USR2 TERM و (از طریق تغییر اندازه ترمینال command) سیگنال WINCH. تمهیداتی اندیشیده شده تا سیگنال TSTP (معمولاً نتیجه فشار دادن CTRL-Z از ترمینال) به درستی مدیریت شود؛ به عنوان مثال، پس از تعلیق rlwrap در میانه ویرایش یک خط، ادامه کار (با تایپ 'fg') شما را دقیقاً در همان نقطه‌ای که آن را معلق کرده بودید قرار می‌دهد.

یک فیلتر می‌تواند برای تغییر/نادیده گرفتن سیگنال‌ها، یا ارسال خروجی «خارج از باند» به دستور تحت پوشش rlwrap استفاده شود.

فیلترهایی (به جز آن‌هایی که سیگنال‌ها را فیلتر می‌کنند) که پاسخگویی آن‌ها بیش از ۱ ثانیه طول بکشد، می‌توانند با CTRL-C از ترمینال متوقف شوند (اگرچه rlwrap از این وضعیت جان سالم به در نخواهد برد).

اگر command کلیدهایی را که یک سیگنال خاص را از صفحه‌کلید ارسال می‌کنند تغییر دهد (مانند emacs که به جای CTRL-C از CTRL-G استفاده می‌کند)، rlwrap نیز همان کار را خواهد کرد (اما فقط پس از فشرده شدن کلید بعدی؛ برای شفاف‌تر کردن rlwrap در این زمینه از گزینه --polling استفاده کنید).

هنگامی که command با یک سیگنال خاتمه داده شود (kill)، دستور rlwrap پاکسازی‌های لازم را انجام داده، اداره‌کننده‌های سیگنال خود را بازنشانی می‌کند و سپس با ارسال همان سیگنال به خودش خارج می‌شود. این تضمین می‌کند که پوسته شما همان وضعیت خروجی را مشاهده کند که بدون rlwrap مشاهده می‌کرد.

زمانی که ورودی استاندارد یک ترمینال نباشد (یا هنگام اجرا در داخل یک بافر emacs)، ویرایش ورودی معنایی ندارد، بنابراین rlwrap تمام گزینه‌ها را نادیده گرفته و به سادگی command را به جای خود اجرا می‌کند. زمانی که stdout (یا stderr) یک ترمینال نباشد، rlwrap پس از اجرای command آن را دوباره روی dev/tty/ (ترمینال کاربر) باز می‌کند، به طوری که خروجی command طبق انتظار تغییر مسیر داده می‌شود، اما ورودی صفحه‌کلید و پیام‌های خطای rlwrap همچنان قابل مشاهده باقی می‌مانند.

نتیجه این امر این است که rlwrap command هنگام تغییر مسیر، کم و بیش مانند command رفتار می‌کند.

در صورت بروز خطای rlwrap مقداری غیرصفر، و در غیر این صورت وضعیت خروج command است. دستور rlwrap همیشه ترمینال را در وضعیتی مرتب رها می‌کند، حتی پس از یک فروپاشی (crash).

دستور rlwrap انتظار دارد فایل‌های تاریخچه و تکمیل خودکار آن در RLWRAP_HOME$ قرار گیرند، اما در صورت عدم تنظیم این متغیر از فایلهای پنهان (dotfiles) در دایرکتوری خانگی کاربر استفاده می‌کند. اگر از rlwrap برای دستورات متعدد و گوناگونی استفاده کنید، این وضعیت به سرعت نامرتب و شلوغ خواهد شد.

$RLWRAP_HOME/command_history, ~/.command_history
تاریخچه برای command (به یاد داشته باشید که command ممکن است با گزینه --command-name (یا -C) بازنویسی شود).
$RLWRAP_HOME/command_completions, ~/.command_completions
فهرست کلمات تکمیل اختصاصی کاربر برای command. دستور rlwrap هرگز درون این فهرست نمی‌نویسد، اما می‌توان از -l logfile و سپس -f logfile برای شبیه‌سازی اثر گزینه -r که در میان فراخوانی‌های گوناگون کار کند، استفاده کرد.
/usr/share/rlwrap/completions/command
فهرست کلمات تکمیل سراسری سیستم برای command. این فایل تنها در صورتی بررسی می‌شود که فهرست کلمات تکمیل اختصاصی کاربر پیدا نشود.
$INPUTRC, ~/.inputrc
فایل پیکربندی اختصاصی readline (برای فرمت آن به readline (3) مراجعه کنید). دستور rlwrap مقدار application name خود را روی command تنظیم می‌کند (این مورد را می‌توان با گزینه -C بازنویسی کرد)، که رفتارهای متفاوتی را برای دستورات مختلف امکان‌پذیر می‌سازد. می‌توان به عنوان مثال خطوط زیر را در ~/.inputrc قرار داد:
$if coqtop
    set show-all-if-ambiguous On
$endif
تا rlwrap در هر زمان که coqtop را اجرا می‌کند، تمام موارد تکمیل را نمایش دهد.

اگرچه rlwrap انعطاف‌پذیر است، خروجی مورد انتظار را فراهم می‌کند (قابلیت ریدلاین)، و به الگوی یونیکس مبنی بر «ابزارهای کوچک متعدد» وفادار است، اما یک راهکار موقتی و وصله‌پینه‌ای به حساب می‌آید. دستور rlwrap نمی‌تواند از وضعیت داخلی command مطلع شود، که این موضوع تکمیل خودکار وابسته به متن را غیرممکن می‌سازد. استفاده از کتابخانه GNU Readline از درون خود command همچنان با اختلاف بهترین راه‌حل است.

علاوه بر این، «برای تانگو دو نفر لازم است»: هیچ راهی برای rlwrap وجود ندارد که وضعیت داخلی خود را با command همگام‌سازی کند، که به تعدادی شرایط رقابتی (race conditions) ظریف منجر می‌شود؛ جایی که مثلاً ممکن است command وضعیت ترمینال خود را قبل از اینکه rlwrap خروجی command را که قبل از تغییر وضعیت نوشته شده بخواند، تغییر داده باشد. شما این شرایط رقابتی را به‌ویژه روی یک ماشین شلوغ و با پردازش و فیلتر کردن سنگین متوجه خواهید شد، هنگامی که ناگهان (و به شکلی غیرقابل‌پیش‌بینی) اعلان‌ها یا خروجی دستور مخدوش یا با رنگ‌های نادرست نمایش می‌یابند.

دستور rlwrap می‌تواند تلاش کند، اما اغلب در مدیریت اعلان‌هایی که حاوی کاراکترهای کنترلی هستند شکست می‌خورد (اعلان‌ها و اثر -A و -t را می‌توان با فیلتر dissect_prompt تحلیل کرد). اگر -A (--ansi-colour-aware) کمکی نکند، ممکن است برای پاکسازی اعلان به یک فیلتر نیاز باشد. همچنین تعیین --set-term-name با یک ترمینال ساده‌تر یا حتی dumb می‌تواند کمک‌کننده باشد.

این صفحه راهنما مربوط به نسخه 0.48 از rlwrap است.

کتابخانه GNU Readline (نوشته Brian Fox و Chet Ramey) تمام کارهای سنگین پشت صحنه را انجام می‌دهد، کد مدیریت pty (نوشته Geoff C. Wing) عملاً بدون تغییر از rxvt برگرفته شده است، و فهرست‌های کلمات تکمیل توسط کتابخانه libredblack اثر Damian Ivereigh مدیریت می‌شوند. باقی برنامه توسط Hans Lub (hanslub42@gmail.com) نوشته شده است.

November 7, 2025