VIS(1) General Commands Manual VIS(1)

vis — یک ویرایشگر متن بسیار کارآمد

vis [-v] [+command] [--] [files ...]

vis یک ویرایشگر متن صفحه‌محور بسیار کارآمد است که نقاط قوت هر دو ویرایشگر vi(m) و sam را با یکدیگر ترکیب می‌کند. این صفحه راهنما برای کاربرانی در نظر گرفته شده است که از پیش با vi/sam آشنایی دارند. سایر کاربران تقریباً به طور قطع باید پیش از خواندن این صفحه راهنما، یک آموزش مناسب درباره هر یک از این دو ویرایشگر مطالعه کنند. گزینه‌های زیر در دسترس هستند:

چاپ اطلاعات نسخه و خروج.
command
اجرای command پس از بارگذاری فایل.
--
نشان‌دهنده پایان گزینه‌ها است. آرگومان‌های پس از این به عنوان نام فایل در نظر گرفته می‌شوند.

فایل ویژه - به vis دستور می‌دهد که از ورودی استاندارد بخواند؛ در این حالت :wq در خروجی استاندارد می‌نویسد و بدین ترتیب امکان استفاده به عنوان یک فیلتر تعاملی را فراهم می‌کند.

اگر ورودی استاندارد تغییر مسیر داده شده باشد و همه ورودی مصرف شود، vis فایل /dev/tty را برای دریافت دستورهای بعدی باز می‌کند. ناتوانی در انجام این کار منجر به خاتمه برنامه می‌شود.

vis از گزینش‌ها (selections) به عنوان عناصر بنیادی ویرایش استفاده می‌کند. یک گزینش، محدوده‌ای جهت‌دار و غیرخالی با دو نقطه انتهایی به نام‌های مکان‌نما (cursor) و لنگر (anchor) است. یک گزینش می‌تواند لنگردار باشد؛ در این حالت لنگر ثابت می‌ماند در حالی که تنها موقعیت مکان‌نما تغییر داده می‌شود. برای گزینش‌های بدون لنگر، هر دو نقطه انتهایی به‌روزرسانی می‌شوند. یک گزینش تک‌عضوی شامل یک نویسه است که هر دو مکان‌نما و لنگر روی آن قرار دارند. همواره یک گزینش اصلی وجود دارد که قابل دیدن باقی می‌ماند (یعنی تغییر موقعیت آن، دیدگاه یا viewport را تنظیم می‌کند).

vis از همان رویکرد ویرایش حالتی (modal) مشابه vi استفاده می‌کند. این ویرایشگر از حالت‌های ‘normal،’ ‘operator pending،’ ‘insert،’ ‘replace’ و ‘visual’ (در هر دو نوع خطی و نویسه‌ای) پشتیبانی می‌کند. حالت‌های visual block و ex عمداً پیاده‌سازی نشده‌اند؛ در عوض vis دارای پشتیبانی داخلی از گزینش‌های چندگانه و یک گونه تعاملی (interactive) از زبان دستوری مبتنی بر عبارات باقاعده ساختاری sam است.

در حالت عادی (normal mode) تمام گزینش‌ها بدون لنگر بوده و به یک نویسه کاهش می‌یابند.

vis برای پیگیری بازبینی‌های متن از یک درخت واگردانی (undo tree) استفاده می‌کند. دستورهای u (واگردانی) و ⟨C-r⟩ (انجام مجدد) را می‌توان برای پیمایش درخت در امتداد شاخه اصلی به کار برد. g+ و g- تاریخچه را به ترتیب زمانی پیمایش می‌کنند. دستورهای :earlier و :later امکان بازگردانی متن به یک وضعیت دلخواه را فراهم می‌سازند.

یک نشانه (mark) یک نام نمادین را به مجموعه‌ای از گزینش‌ها مرتبط می‌کند. یک گزینش ذخیره‌شده هنگامی که مرزهای مشخص‌کننده آن در بافر زیرین تغییر کند، نامعتبر می‌شود. اگر تغییرات یادشده بعداً واگردانی شوند، نشانه دوباره معتبر می‌گردد. m یک نشانه تنظیم می‌کند و M آن را بازیابی می‌نماید. به عنوان مثال، 'am نشانه a را تنظیم می‌کند، در حالی که 'aM آن را بازیابی می‌کند. استفاده از m یا M بدون تعیین نشانه، از نشانه پیش‌فرض استفاده می‌کند.

نشانه‌های موجود عبارتند از:

نشانه پیش‌فرض
گزینش‌های فعال هنگام خروج از حالت visual
–'z
نشانه‌های عمومی

نشانه‌ها در میان فایل‌های مختلف پشتیبانی نمی‌شوند. نشانه‌ها بین نشست‌های ویرایش حفظ نمی‌شوند.

یک فهرست پرش (jump list) محلی برای هر پنجره با اندازه ثابت وجود دارد که نشانه‌ها (یعنی مجموعه‌ای از گزینش‌ها) را ذخیره می‌کند.

پرش به عقب
پرش به جلو
ذخیره گزینش‌های فعال کنونی

ثبات‌ها (registers) فهرست‌های نام‌گذاری‌شده‌ای از متن هستند. خانه‌های مقداردهی‌نشده ثبات‌ها به طور پیش‌فرض رشته خالی هستند. ثبات‌های موجود عبارتند از:

""
ثبات پیش‌فرض
"a–"z
ثبات‌های عمومی
"A–"Z
الحاق به ثبات عمومی متناظر
"*, "+
یکپارچه‌سازی با بریده‌دان سیستم از طریق اسکریپت شل vis-clipboard(1)
"0
ثبات کپی (yank)، جدیدترین محدوده کپی‌شده
"1–"9
 
"&
تطابق‌های زیرعبارت در آخرین دستور x یا y
"/
ثبات جستجو، آخرین الگوی جستجوی استفاده‌شده
":
ثبات دستور، آخرین دستور اجراشده
"_
ثبات سیاه‌چاله (/dev/null،) محتوا را نادیده می‌گیرد و همیشه خالی است
"#
شماره گزینش (فقط‌خواندنی)
".
آخرین متن درج‌شده

اگر ثبات مشخصی تعیین نشود، از ثبات پیش‌فرض استفاده می‌شود.

ثبات‌های عمومی "a–"z می‌توانند برای ضبط ماکرو استفاده شوند. از یکی از ثبات‌های "A–"Z برای افزودن به یک ماکروی موجود استفاده کنید. q ضبط را آغاز می‌کند و @ آن را بازپخش می‌نماید. @@ به آخرین ماکروی ضبط‌شده اشاره دارد. @: آخرین دستور : را تکرار می‌کند. @/ معادل n در حالت عادی است. این عملیات‌ها همواره از اولین خانه ثبات استفاده می‌کنند.

vis همیشه فرض می‌کند که فایل ورودی دارای کدگذاری UTF-8 با پایان خط‌های \n است. اگر می‌خواهید فایل‌هایی با کدگذاری‌های قدیمی یا پایان خط‌های غیر یونیکسی را ویرایش کنید، از iconv(1) و dos2unix(1) برای تبدیل آن‌ها در صورت نیاز استفاده نمایید. ⟨Tab⟩ را می‌توان به طور اختیاری به تعداد قابل تنظیمی از فاصله‌ها باز کرد (بخش گزینه‌های SET (SET OPTIONS) را ببینید).

ماوس در حال حاضر اصلاً استفاده نمی‌شود.

vis از یک نگارش تعاملی از زبان دستورات مبتنی بر عبارات باقاعده ساختاری که توسط sam(1) معرفی شد، پشتیبانی می‌کند.

vis در حال حاضر تطبیق عبارات باقاعده را به کتابخانه C زیرین واگذار می‌کند. این برنامه از آنچه پازیکس “عبارات باقاعده گسترش‌یافته (Extended Regular Expressions)” می‌نامد، مطابق توضیحات regex(7) استفاده می‌کند. لنگرهای ^ و $ با ابتدا و انتهای محدوده‌ای که به آن اعمال می‌شوند تطابق می‌یابند. علاوه بر این، \n و \t می‌توانند به ترتیب برای اشاره به خطوط جدید و تب‌ها به کار روند. اتم . با هر نویسه‌ای به جز خط جدید مطابقت دارد. عبارت باقاعده خالی نشان‌دهنده آخرین عبارت کاملی است که با آن مواجه شده است.

یک آدرس، زیررشته‌ای (یا محدوده‌ای) را در یک فایل مشخص می‌کند. در ادامه، “نویسه n” به معنای رشته پوچ پس از n-امین نویسه در فایل است، که در آن ۱ نویسه اول فایل است. “خط n” به معنای n-امین تطابق عبارت باقاعده “.*\n?” با شروع از ابتدای فایل است.

تمام پنجره‌ها همواره دست‌کم یک زیررشته جاری دارند که آدرس پیش‌فرض است. در sam به این مفهوم (نقطه) گفته می‌شود. در vis چندین “dot” (یا گزینش) می‌توانند هم‌زمان وجود داشته باشند.

n
رشته خالی پس از نویسه n ؛ #0 ابتدای فایل است.
n
خط n.
regexp/
 
regexp?
زیررشته‌ای که با عبارت باقاعده مطابقت دارد، که با جستجو به سمت انتهای (/) یا ابتدای (?) فایل پیدا می‌شود. جستجو در هنگام رسیدن به انتهای (ابتدای) فایل به دور خود نمی‌چرخد (wrap around نمی‌شود).
رشته قبل از اولین خط کامل. این لزوماً رشته پوچ نیست؛ + و - را در زیر ببینید.
رشته پوچ در انتهای فایل.
Dot (نقطه)، محدوده جاری.
m
نشانه m در فایل.

در ادامه، a1 و a2 آدرس هستند.

a1+a2
آدرس a2 که با شروع از انتهای a1 ارزیابی می‌شود.
a1-a2
آدرس a2 که با شروع از ابتدای a1 و در جهت معکوس ارزیابی می‌شود.
a1,a2
زیررشته از ابتدای a1 تا انتهای a2. اگر a1 وجود نداشته باشد، 0 جایگزین می‌شود. اگر a2 وجود نداشته باشد، $ جایگزین می‌گردد.
a1;a2
مانند a1,a2 اما a2 در انتهای a1 ارزیابی شده و محدوده روی a1 تنظیم می‌شود.

عملگرهای + و - دارای اولویت بالا هستند، در حالی که , و ; اولویت پایینی دارند.

در هر دو حالت + و -، اگر a2 یک آدرس خط یا نویسه بدون شماره باشد، شماره به طور پیش‌فرض ۱ است. اگر a1 وجود نداشته باشد، . جایگزین می‌شود. اگر هر دو a1 و a2 حاضر و قابل تشخیص باشند، + می‌تواند حذف شود. a2 می‌تواند یک عبارت باقاعده باشد؛ اگر با نویسه‌های ? محدود شده باشد، اثر + یا - معکوس می‌شود. علامت % نام مستعاری برای , و بنابراین 0,$ است. نمایش یک زیررشته بدشکل توسط یک آدرس ترکیبی، یک خطا محسوب می‌شود.

در ادامه، متن مشخص‌شده با اسلش نشان‌دهنده متنی است که با هر نویسه اَسکی (ASCII) چاپ‌پذیر به جز نویسه‌های حرفی-عددی محدود شده است. هر تعداد از جداکننده‌های پایانی می‌توانند حذف شوند، که در این صورت حذف‌های متعدد نشان‌دهنده رشته‌های پوچ خواهند بود، اما جداکننده نخست همواره باید وجود داشته باشد. در هر متن محدودشده، خط جدید نمی‌تواند به صورت لفظی ظاهر شود؛ \n و \t را می‌توان برای خط جدید و تب نوشت؛ \/ جداکننده (در اینجا /) را نقل‌قول (quote) می‌کند. یک علامت اند & و \n، که در آن n یک رقم (۱ تا ۹) است، با ثبات متناظر جایگزین می‌شوند. در غیر این صورت بک‌اسلش به صورت تحت‌اللفظی تفسیر می‌شود.

بیشتر دستورها می‌توانند پیشوندی از یک آدرس داشته باشند تا محدوده عملکرد خود را مشخص کنند. اگر دستوری آدرس بپذیرد و هیچ آدرسی ارائه نشود، از یک آدرس پیش‌فرض استفاده می‌شود. در حالت عادی، این معادل نویسه‌ای است که گزینش در حال حاضر روی آن قرار دارد. اگر تنها یک گزینش وجود داشته باشد، x و y به طور پیش‌فرض کل فایل 0,$ را در نظر می‌گیرند. در حالت عادی، دستورهای نوشتن w و wq همیشه روی کل فایل اعمال می‌شوند. دستورها برای هر گزینش یک‌بار اجرا می‌شوند. در حالت تصویری (visual)، دستورها به هر گزینش اعمال می‌شوند، گویی یک دستور ضمنی x وجود دارد که با گزینش‌های موجود مطابقت دارد.

در توضیحات، واژه «محدوده» (range) برای نشان دادن هر آدرسی که ارائه شده به کار می‌رود.

بسیاری از دستورها هنگامی که از حالت تصویری صادر می‌شوند، به عنوان یک اثر جانبی، گزینش‌های جدیدی ایجاد می‌کنند. در این صورت، همواره به «نتیجه» تغییر اشاره دارد: متن جدید برای درج، رشته خالی برای حذف، خروجی دستور یک فیلتر و غیره. اگر پس از اجرای موفقیت‌آمیز دستور هیچ گزینشی باقی نماند، ویرایشگر به حالت عادی تغییر وضعیت می‌دهد، در غیر این صورت در حالت تصویری باقی می‌ماند. این امکان بهبود و پالایش تعاملی محدوده‌ها را فراهم می‌سازد.

[count]/text/
درج text به تعداد count بار در فایل پس از محدوده.

همچنین می‌تواند به شکل زیر نوشته شود:

a
lines
of
text
.
یا i
مشابه a، اما c متن را جایگزین می‌کند، در حالی که i قبل از محدوده درج می‌نماید.
حذف متن در محدوده.

ایجاد یک گزینش جدید برای محدوده.

[!] [file name]
جایگزینی فایل با محتوای فایل خارجی نام‌برده. اگر نام فایلی داده نشود، بارگذاری مجدد فایل از دیسک انجام می‌شود.
file name
جایگزینی متن در محدوده با محتوای فایل خارجی نام‌برده.
[!] [file name]
نوشتن محدوده (پیش‌فرض 0,$) در فایل خارجی نام‌برده.
[!] [file name]
مشابه w، اما بستن فایل پس از آن.

اگر آرگومان نام فایل در هر یک از این‌ها وجود نداشته باشد، نام فایل جاری استفاده می‌شود. e همواره نام فایل را تنظیم می‌کند؛ w اگر فایل بی‌نام باشد چنین خواهد کرد. اجبار دستور e با ! تغییرات ذخیره‌نشده را نادیده می‌گیرد. اجبار دستور w فایل را روی دیسک بازنویسی می‌کند، حتی اگر از زمان بارگذاری به صورت خارجی تغییر کرده باشد. دستورهای نوشتن با آدرس‌های غیرپیش‌فرض و بدون نام فایل، مخرب هستند و همیشه باید به صورت اجباری اجرا شوند.

shell command
جایگزینی محدوده با خروجی استاندارد دستور شل.
shell command
ارسال محدوده به ورودی استاندارد دستور شل.
shell command
ارسال محدوده به ورودی استاندارد دستور شل، و جایگزینی آن با خروجی استاندارد آن.
shell command
اجرای دستور شل به صورت تعاملی و هدایت ورودی صفحه‌کلید به آن.
directory
تغییر دایرکتوری کاری. اگر دایرکتوری مشخص نشود، از $HOME استفاده می‌شود.

در هر یک از <، >، | یا !، اگر دستور شل حذف شود، آخرین دستور شل (از هر نوعی) جایگزین می‌گردد. مگر اینکه فایل در حال ویرایش بی‌نام باشد، تمام این دستورهای خارجی می‌توانند از طریق متغیرهای محیطی vis_filepath و vis_filename به مسیر مطلق و نام فایل آن ارجاع دهند.

regexp/ [command]
به ازای هر تطابق عبارت باقاعده در محدوده، دستور را با تنظیم محدوده روی تطابق اجرا می‌کند. اگر عبارت باقاعده و اسلش‌های آن حذف شوند، /.*\n/ فرض می‌شود. تطابق‌های رشته پوچ به طور بالقوه قبل از هر نویسه از محدوده و در انتهای محدوده رخ می‌دهند.

ثبات‌های "1–"9 و "& با تطابق‌های (زیر) عبارت الگو به‌روزرسانی می‌شوند.

regexp/ [command]
مشابه x، اما دستور را برای هر زیررشته‌ای که قبل، بین یا بعد از تطابق‌هایی که توسط x تولید می‌شدند قرار دارد اجرا می‌کند. هیچ رفتار پیش‌فرضی وجود ندارد. زیررشته‌های پوچ به طور بالقوه قبل از هر نویسه در محدوده رخ می‌دهند.
regexp/ command
برای هر فایلی که نام آن با عبارت باقاعده مطابقت دارد، آن را به فایل جاری تبدیل کرده و دستور را اجرا می‌کند. اگر عبارت حذف شود، دستور در هر فایل اجرا می‌شود.
regexp/ command
مشابه X، اما برای فایل‌هایی که با عبارت باقاعده مطابقت ندارند، و وجود عبارت الزامی است.
[count][/regexp/] command
 
[count][/regexp/] command
اگر محدوده count حاوی یک تطابق برای عبارت باشد (g) یا نباشد (v)، دستور را روی محدوده اجرا می‌کند.

مشخص‌کننده count قالب زیر را دارد، که در آن n و m اعداد صحیحی هستند که محدوده‌ها را مشخص می‌کنند.

n,m
بازه بسته از n تا m. اگر n وجود نداشته باشد، 1 جایگزین می‌شود. اگر m وجود نداشته باشد، ∞ جایگزین می‌شود. مقادیر منفی نسبت به آخرین محدوده تفسیر می‌شوند.
n
با هر n-امین محدوده مطابقت دارد.

این‌ها می‌توانند به طور دلخواه و عمیق تو در تو شوند. یک دستور خالی در x یا y به طور پیش‌فرض p است. X، Y، g و v پیش‌فرضی ندارند.

دستورها می‌توانند با قرار گرفتن در آکولاد گروه‌بندی شوند. از نظر معنایی، آکولاد باز مانند یک دستور است: یک آدرس (اختیاری) می‌پذیرد و هر زیردستور را روی محدوده اجرا می‌کند. دستورهای درون آکولاد به ترتیب اجرا می‌شوند، اما تغییرات ایجادشده توسط یک دستور برای دستورهای دیگر قابل مشاهده نیستند.

هنگامی که یک دستور تغییراتی را در یک فایل ایجاد می‌کند، مانند x/re/ c/text/، آدرس‌های تمام تغییرات بر اساس وضعیت اولیه محاسبه می‌شوند. اگر تغییرات هم‌پوشانی نداشته باشند، به ترتیب مشخص‌شده اعمال می‌گردند. تغییرات دارای تداخل رد می‌شوند.

آکولادها می‌توانند به طور دلخواه تو در تو شوند.

در بخش‌های زیر از براکت‌های زاویه‌دار برای نشان دادن کلیدهای ویژه استفاده می‌شود. پیشوندهای C-، S- و M- به ترتیب برای اشاره به کلیدهای تبدیل ⟨Ctrl،⟩ ⟨Shift⟩ و ⟨Alt⟩ به کار می‌روند.

تمام مقیدسازی‌های فعال کلید را می‌توان در زمان اجرا با استفاده از دستور :help فهرست کرد.

عملگرها عملیات خاصی را روی یک محدوده متنی که توسط یک حرکت (motion)، یک شیء متنی (text object) یا یک گزینش موجود مشخص شده است، انجام می‌دهند.

هنگامی که در حالت عادی استفاده می‌شوند، عملگرهای زیر منتظر یک حرکت می‌مانند و vis را در حالت در انتظار عملگر (operator pending) قرار می‌دهند.

تغییر، حذف محدوده و ورود به حالت درج
حذف، بریدن محدوده به ثبات
انتقال به چپ، کاهش تورفتگی
انتقال به راست، افزایش تورفتگی
کپی (yank)، رونوشت از محدوده به ثبات

هنگامی که در حالت عادی استفاده می‌شوند، اقدامات زیر بلافاصله اعمال می‌گردند.

قالب‌بندی، فیلتر کردن محدوده با fmt(1)
تبدیل به حروف کوچک
تبدیل به حروف بزرگ
جابجایی بزرگی و کوچکی حروف
الحاق خطوط، درج فاصله میان آن‌ها
الحاق خطوط، حذف هرگونه فاصله جداکننده
قرار دادن محتوای ثبات پس از مکان‌نما
قرار دادن محتوای ثبات پیش از مکان‌نما

حرکت‌ها موقعیت اولیه فایل را گرفته و آن را به موقعیت مقصد تبدیل می‌کنند، و بدین ترتیب یک محدوده را تعریف می‌نمایند.

ابتدای خط
ابتدای کلمه قبلی
ابتدای کلمه بزرگ قبلی (WORD)
انتهای خط
انتهای کلمه بعدی
انتهای کلمه بزرگ بعدی (WORD)
⟨char⟩
به رخداد قبلی ⟨char⟩ در سمت چپ
⟨char⟩
به رخداد بعدی ⟨char⟩ در سمت راست
اولین نویسه غیرفاصله در خط
ابتدای خط نمایشی
انتهای خط نمایشی
انتهای کلمه قبلی
انتهای کلمه بزرگ قبلی (WORD)
ابتدای فایل
رفتن به خط یا انتهای فایل
خط نمایشی به پایین
خط نمایشی به بالا
کدپوینت به چپ
کدپوینت به راست
بایت به چپ
بایت به راست
آخرین نویسه غیرفاصله در خط
میانه خط نمایشی
g|
رفتن به ستون
نویسه به چپ
رفتن به خط بالای پنجره
خط به پایین
خط به بالا
نویسه به راست
رفتن به خط پایین پنجره
تطابق براکت، گیومه یا بک‌تیک
پاراگراف بعدی
جمله بعدی
تکرار آخرین جستجو رو به عقب
تکرار آخرین جستجو رو به جلو
[{
ابتدای بلوک قبلی
]}
ابتدای بلوک بعدی
[(
ابتدای جفت پرانتز قبلی
])
ابتدای جفت پرانتز بعدی
{
پاراگراف قبلی
(
جمله قبلی
;
تکرار آخرین حرکت جستجوی نویسه (to/till)
,
تکرار آخرین حرکت جستجوی نویسه در جهت مخالف
جستجوی کلمه زیر گزینش رو به عقب
جستجوی کلمه زیر گزینش رو به جلو
⟨char⟩
تا قبل از رخداد بعدی ⟨char⟩ در سمت چپ
⟨char⟩
تا قبل از رخداد بعدی ⟨char⟩ در سمت راست
pattern
به تطابق بعدی pattern در جهت عقب
pattern
به تطابق بعدی pattern در جهت جلو
ابتدای کلمه بعدی
ابتدای کلمه بزرگ بعدی (WORD)

اشیاء متنی یک موقعیت اولیه در فایل را گرفته و آن را به محدوده‌ای تبدیل می‌کنند که لزوماً نباید موقعیت اولیه در محدوده مقصد قرار داشته باشد. تمام اشیاء متنی زیر در دو نوع داخلی (با پیشوند i) که در آن فاصله‌های سفید پیرامون یا نویسه‌های جداکننده جزئی از محدوده حاصل نیستند، و نوع عادی (با پیشوند a) که در آن شامل می‌شوند، پیاده‌سازی شده‌اند.

کلمه (word)
کلمه بزرگ (WORD)
جمله (sentence)
پاراگراف (paragraph)
بلوک محصور شده با این نمادها

اشیاء متنی موجود دیگر عبارتند از:

تطابق با آخرین عبارت جستجو در جهت رو به جلو
تطابق با آخرین عبارت جستجو در جهت رو به عقب
خط جاری
خط جاری بدون فاصله‌های سفید ابتدا و انتها

vis از گزینش‌های چندگانه با بازخورد دیداری فوری پشتیبانی می‌کند. همواره یک گزینش اصلی وجود دارد که در دیدگاه (viewport) جاری قرار گرفته است. گزینش‌های اضافی را می‌توان در صورت نیاز ایجاد کرد. اگر بیش از یک گزینش وجود داشته باشد، گزینش اصلی با ظاهری متفاوت نمایش داده می‌شود.

برای دستکاری گزینش‌ها در حالت عادی، استفاده کنید از:

⟨C-k⟩
ایجاد count گزینش جدید در خطوط بالایی
⟨C-M-k⟩
ایجاد count گزینش جدید در خطوط بالای اولین گزینش
⟨C-j⟩
ایجاد count گزینش جدید در خطوط پایینی
⟨C-M-j⟩
ایجاد count گزینش جدید در خطوط پایین آخرین گزینش
⟨C-p⟩
حذف گزینش اصلی
⟨C-n⟩
انتخاب کلمه‌ای که گزینش روی آن قرار دارد، تغییر حالت به visual
⟨C-u⟩
تبدیل گزینش count قبلی به گزینش اصلی
⟨C-d⟩
تبدیل گزینش count بعدی به گزینش اصلی
⟨C-c⟩
حذف ستون گزینش شماره count
⟨C-l⟩
حذف همه به جز ستون گزینش شماره count
⟨Tab⟩
تلاش برای هم‌تراز کردن همه گزینش‌ها در یک ستون
⟨Escape⟩
کنار گذاشتن همه گزینش‌ها به جز گزینش اصلی

حالت‌های visual برای تشخیص موارد زیر بهبود یافته‌اند:

ایجاد یک گزینش در ابتدای هر خط انتخاب‌شده
ایجاد یک گزینش در انتهای هر خط انتخاب‌شده
⟨Tab⟩
چپ‌چین کردن گزینش‌ها با درج فاصله
⟨S-Tab⟩
راست‌چین کردن گزینش‌ها با درج فاصله
⟨C-a⟩
ایجاد گزینش‌های جدید در تمام موارد مطابق با کلمه یا گزینش جاری
⟨C-n⟩
ایجاد گزینش جدید و انتخاب کلمه بعدی مطابق با گزینش جاری
⟨C-x⟩
پاک کردن (رد شدن از) گزینش جاری، اما انتخاب کلمه منطبق بعدی
⟨C-p⟩
حذف گزینش اصلی
⟨C-u⟩ ⟨C-k⟩
تبدیل گزینش count قبلی به اصلی
⟨C-d⟩ ⟨C-j⟩
تبدیل گزینش count بعدی به اصلی
⟨C-c⟩
حذف ستون گزینش شماره count
⟨C-l⟩
حذف همه به جز ستون گزینش شماره count
چرخاندن گزینش‌ها به راست به تعداد count بار
-
چرخاندن گزینش‌ها به چپ به تعداد count بار
پیرایش گزینش‌ها، حذف فاصله‌های سفید ابتدا و انتها
معکوس کردن جهت گزینش، جابجایی مکان‌نما و لنگر
⟨Escape⟩
پاک کردن تمام گزینش‌ها، تغییر حالت به normal

در حالت درج و جایگزینی:

⟨S-Tab⟩
هم‌تراز کردن تمام گزینش‌ها با درج فاصله

گزینش‌ها را می‌توان با استفاده از عملیات مجموعه‌ای دستکاری کرد. عملوند نخست، گزینش‌های فعال کنونی است در حالی که عملوند دوم می‌تواند به عنوان یک نشانه مشخص شود. برای نمونه، 'a| اجتماع نشانه a و گزینش جاری را حاصل می‌کند. استفاده از عملیات مجموعه‌ای بدون تعیین یک نشانه، از نشانه پیش‌فرض به عنوان عملوند نخست استفاده می‌کند.

اجتماع مجموعه
اشتراک مجموعه
\
تفاضل مجموعه
متمم مجموعه

هر پیشوند یکتا می‌تواند برای کوتاه کردن یک دستور به کار رود.

یک فایل باید حداقل در یک پنجره باز باشد. اگر آخرین پنجره‌ای که فایل مشخصی را نمایش می‌دهد بسته شود، تمام تغییرات ذخیره‌نشده دور ریخته می‌شوند. پنجره‌ها دارای اندازه یکسان هستند و می‌توانند در سطرها (افقی) یا ستون‌ها (عمودی) نمایش داده شوند. نگاشت‌های کلید ⟨C-w⟩ h، ⟨C-w⟩ j، ⟨C-w⟩ k و ⟨C-w⟩ l می‌توانند برای جابجایی بین پنجره‌ها استفاده شوند.

باز کردن یک پنجره خالی، مرتب‌شده به صورت یک سطر جدید (افقی)
باز کردن یک پنجره خالی، مرتب‌شده به صورت یک ستون جدید (عمودی)
[!] [file name]
باز کردن پنجره‌ای جدید، و نمایش نام فایل در صورت ارائه
[file name]
تقسیم افقی پنجره به سطرها
[file name]
تقسیم عمودی پنجره به ستون‌ها
[!] [exit code]
بستن پنجره دارای تمرکز کنونی
[!] [exit code]
بستن تمام پنجره‌ها، خاتمه ویرایشگر با کد خروج (پیش‌فرض 0)

دستورهایی که نام فایل می‌پذیرند، اگر یک الگو یا دایرکتوری به آن‌ها داده شود، ابزار vis-open(1) را فراخوانی خواهند کرد.

vis از نگاشت‌های کلید سراسری و همچنین محلی پنجره در زمان اجرا پشتیبانی می‌کند که همواره به طور بازگشتی ارزیابی می‌شوند.

[!] mode lhs rhs
افزودن نگاشت کلید سراسری
[!] mode lhs rhs
افزودن نگاشت کلید محلی پنجره
mode lhs
حذف نگاشت کلید سراسری
mode lhs
حذف نگاشت کلید محلی پنجره

در بالا، mode به یکی از موارد ‘normal،’ ‘insert،’ ‘replace،’ ‘visual،’ ‘visual-line’ یا ‘operator-pending’ اشاره دارد؛ lhs به کلیدی اشاره دارد که باید نگاشت شود و rhs یک کنش کلید یا نام مستعار است. یک نگاشت موجود ممکن است با اجبار دستور map از طریق تعیین ! بازنویسی شود.

از آنجا که نگاشت‌های کلید همیشه بازگشتی هستند، کاری مانند:

:map! normal j 2j

کار نخواهد کرد زیرا وارد یک حلقه بی‌پایان می‌شود. در عوض، vis از شبه‌کلیدهایی استفاده می‌کند که کنش‌های کلید (key actions) نامیده می‌شوند و می‌توان از آن‌ها برای فراخوانی مجموعه‌ای از توابع موجود ویرایشگر استفاده کرد. دستور :help تمام مقیدسازی‌های فعال کلید و همچنین تمام کلیدهای نمادین موجود را فهرست می‌کند.

به منظور تسهیل استفاده از چینش‌های صفحه‌کلید غیرلاتین، vis امکان نگاشت کلیدهای ویژه محلی به معادل‌های لاتین آن‌ها را از طریق دستور

:langmap locale-keys latin-keys

فراهم می‌کند. به عنوان مثال، دستور زیر کلیدهای حرکتی را در چینش روسی نگاشت می‌کند:

:langmap ролд hjkl

اگر طول دنباله‌های کلید یکسان نباشد، بخش اضافی دنباله طولانی‌تر نادیده گرفته می‌شود.

نگاشت‌های تعریف‌شده در تمام حالت‌های غیرورودی، یعنی همه‌جا به جز حالت‌های insert و replace اعمال می‌شوند.

[count]
بازگشت به وضعیت متنی قدیمی‌تر
[count]
رفتن به وضعیت متنی جدیدتر

اگر پسوند d (روزها،) h (ساعت‌ها،) (دقیقه‌ها) یا s (ثانیه‌ها) به count اضافه شود، به عنوان فاصله‌ای از زمان جاری سیستم تفسیر شده و نزدیک‌ترین وضعیت متنی موجود بازیابی می‌گردد.

تعداد اندکی گزینه وجود دارد که می‌توان آن‌ها را با دستور :set تنظیم (یا لغو تنظیم) کرد تا رفتار ویرایشگر تغییر یابد. این بخش گزینه‌ها، اختصارات و مقادیر پیش‌فرض آن‌ها را شرح می‌دهد. گزینه‌های دودویی (بولی) را می‌توان با افزودن ! به انتهای نام گزینه تغییر وضعیت داد.

در هر مورد زیر، بخش نخست خط برچسب، نام کامل گزینه و به دنبال آن اختصارات معادل آن است. بخش داخل کروشه، مقدار پیش‌فرض گزینه است.

[“/bin/sh”]
شل کاربر برای استفاده در دستورهای خارجی؛ متغیر SHELL و فیلد شل در پایگاه داده گذرواژه /etc/passwd را نادیده می‌گیرد.
[50]
میلی‌ثانیه‌های انتظار پیش از تصمیم‌گیری در مورد اینکه آیا یک دنباله گریز (escape sequence) باید به عنوان یک کلید ⟨Escape⟩ تلقی شود یا خیر.
, tw [8]
عرض نمایشی یک تب و تعداد فاصله‌های مورد استفاده در صورت فعال بودن expandtab.
, ai [off]
تورفتگی خودکار خطوط جدید با کپی کردن فاصله‌های خالی از خط قبلی.
, et [off]
اینکه آیا ⟨Tab⟩ باید به تعداد tabwidth فاصله باز شود یا خیر.
, nu [off]
نمایش شماره خطوط به صورت مطلق.
, rnu [off]
نمایش شماره خطوط به صورت نسبی.
, nuw [0]
حداقل عرض نوار کناری هنگامی که نوار کناری با number یا relativenumbers فعال شده است.
, cul [off]
برجسته‌سازی خطی که مکان‌نمای اصلی روی آن قرار دارد.
, cc [0]
برجسته‌سازی یک ستون مشخص و ثابت.
[32768]
تحلیل‌گر لغوی (lexer) چه تعداد بایت به عقب بازمی‌گردد تا تجزیه را همگام‌سازی کند.
[“default-16” or “default-256”]
تم رنگی مورد استفاده، نام بدون پسوند فایل. از یک زیردایرکتوری themes/ در مسیرهای فهرست‌شده در بخش فایل‌ها (FILES) بارگذاری می‌شود.
[auto]
تحلیل‌گر لغوی برای برجسته‌سازی نحوی، نام بدون پسوند فایل.
[off]
آیا نماد جایگزین به جای تب‌ها نمایش داده شود یا خیر.
[off]
آیا نماد جایگزین به جای خطوط جدید نمایش داده شود یا خیر.
[off]
آیا نماد جایگزین به جای خانه‌های خالی نمایش داده شود یا خیر.
[on]
آیا نماد جایگزین برای خطوط پس از انتهای فایل نمایش داده شود یا خیر.
[auto]
نحوه ذخیره فایل جاری؛ atomic که از rename(2) برای جایگزینی اتمیک فایل استفاده می‌کند، inplace که فایل را کوتاه (truncate) کرده و سپس آن را بازنویسی می‌کند، یا auto که پیش از رجوع به روش دوم، روش اول را امتحان می‌کند. روش تغییر نام (rename) برای پیوندهای نمادین، پیوندهای سخت، در صورت ناکافی بودن مجوزهای دایرکتوری، یا هنگامی که مالک فایل، گروه، ACL پازیکس یا برچسب‌های SELinux نتوانند بازیابی شوند شکست می‌خورد.
[auto]
نحوه بارگذاری فایل‌های موجود؛ read که محتوای فایل را در یک بافر حافظه مستقل کپی می‌کند، mmap که فایل را از دیسک در حافظه نگاشت (memory map) کرده و از قابلیت‌های سیستم‌عامل به عنوان لایه حافظه موقت (کَش) استفاده می‌کند، یا auto که برای فایل‌های کوچک‌تر از 8 مگابایت روش اول و برای فایل‌های بزرگ‌تر روش دوم را امتحان می‌کند. هشدار: تغییر درجا (in-place) روی فایلی که در حافظه نگاشت شده باعث از دست رفتن داده‌ها می‌شود.
[“v” or “h”]
استفاده از چیدمان عمودی یا افقی.
, ic [off]
نادیده گرفتن بزرگی و کوچکی حروف در هنگام جستجو.
, wc [0]
پیچیدن خطوط در حداقلِ عرض پنجره و wrapcolumn.
, brk [“”]
نویسه‌هایی که ممکن است باعث شکستن خط (word wrap) شوند.

اعلان دستور و جستجو که با :، / یا ? باز می‌شود، به صورت پنجره‌ای با ارتفاع یک خط پیاده‌سازی شده است که یک فایل عادی را نمایش می‌دهد و ویرایش آن در حالت insert آغاز می‌شود. ⟨Escape⟩ به حالت normal تغییر وضعیت می‌دهد؛ دومین ⟨Escape⟩ اعلان را لغو می‌کند. ⟨Up⟩ پنجره را بزرگ‌تر کرده و دسترسی به تاریخچه دستورات را فراهم می‌سازد. ⟨C-v⟩ ⟨Enter⟩ یک خط جدید تحت‌اللفظی درج می‌کند و بدین ترتیب امکان استفاده از دستورهای چندخطی را فراهم می‌سازد. ⟨Enter⟩ گزینش تصویری را در صورت وجود اجرا می‌کند، وگرنه هر آنچه را که در ناحیه میان موقعیت گزینش و نمادهای جداکننده اعلان در ابتدای خطوط مجاور قرار دارد اجرا خواهد کرد.

vis از زبان Lua برای پیکربندی و اسکریپت‌نویسی استفاده می‌کند. در هنگام راه‌اندازی، فایل visrc.lua (بخش فایل‌ها (FILES) را ببینید) خوانده و اجرا می‌شود که می‌توان از آن برای اعمال تنظیمات پیکربندی شخصی استفاده کرد. به عنوان مثال دستور زیر نمایش شماره خطوط را فعال می‌کند:

vis:command('set number')

مسیر پیش‌فرض برای بارگذاری فایل‌های پشتیبانی Lua.
دایرکتوری خانگی مورد استفاده برای دستور cd در صورتی که هیچ آرگومانی داده نشود.
نوع ترمینال مورد استفاده برای مقداردهی اولیه واسط curses؛ در صورت عدم تعیین، مقدار پیش‌فرض است.
شل دستوری مورد استفاده برای دستورهای مربوط به ورودی/خروجی مانند !، >، < و |.
دایرکتوری پیکربندی مورد استفاده؛ در صورت عدم تعیین، مقدار پیش‌فرض $HOME/.config است.

تعلیق ویرایشگر.
از سرگیری ویرایشگر.
یک فایل نگاشت‌شده در حافظه (mmap(2)) کوتاه (truncate) شد؛ محتویات ذخیره‌نشده فایل از دست خواهد رفت.
 
بازگردانی وضعیت اولیه ترمینال. محتویات ذخیره‌نشده فایل از دست خواهد رفت.
هنگامی که در حین اجرای یک دستور خارجی یک وقفه رخ دهد، آن دستور پایان می‌یابد.
اندازه صفحه نمایش تغییر می‌کند.

در زمان راه‌اندازی، vis اولین فایل پیکربندی visrc.lua یافت‌شده از میان این مکان‌ها را بارگذاری می‌کند. تمام مسیرهای فعال کنونی را می‌توان در زمان اجرا با استفاده از دستور :help فهرست کرد.

  • $VIS_PATH
  • محل فایل اجرایی vis (در سیستم‌هایی که /proc/self/exe در دسترس است).
  • $XDG_CONFIG_HOME/vis که در آن XDG_CONFIG_HOME در صورت عدم مقداردهی به $HOME/.config اشاره دارد.
  • /etc/vis برای پیکربندی سراسری سیستم که توسط مدیر سیستم ارائه می‌شود.
  • /usr/local/share/vis یا /usr/share/vis بسته به پیکربندی ساخت.

    هنگام ایجاد یک visrc.lua جدید، حتماً ساختار را از اینجا کپی کنید.

The vis utility exits 0 on success, and >0 if an error occurs.

استفاده از vis به عنوان یک فیلتر تعاملی.

$ { echo Pick your number; seq 1 10; } | vis - > choice

استفاده از مرورگر فایل مبتنی بر vis-open(1) برای فهرست کردن تمام فایل‌های منبع زبان C:

:e *.c

اجرای فرایند در پس‌زمینه و لوله‌کشی (pipe) محدوده به ورودی استاندارد آن:

:> { plumber <&3 3<&- & } 3<&0 1>&- 2>&-

sam(1), vi(1), vis-clipboard(1), vis-complete(1), vis-digraph(1), vis-menu(1), vis-open(1)

A Tutorial for the Sam Command Language نوشته Rob Pike

The Text Editor sam نوشته Rob Pike

Plan 9 manual page for sam(1)

Structural Regular Expressions نوشته Rob Pike

vi - screen-oriented (visual) display editor IEEE Std 1003.1 (“POSIX.1”)

vis تلاشی برای سازگاری با IEEE Std 1003.1 (“POSIX.1”) نمی‌کند، اما شباهت‌های آشکاری با ابزار vi دارد.

vis توسط Marc André Tanner ⟨mat at brain-dump.org⟩ نوشته شده است.

در برخی سیستم‌ها از پیش یک باینری با نام vis وجود دارد که باعث تداخل نام می‌شود.

May 14, 2026 Vis v0.9-498-gad0f1deb-dirty