فهرست مطالب

"راهنمای ادیتور vim"

مقدمه🔗

ادیتور vi با تلفظ /ˈviːˈaɪ/ در سال ۱۹۷۶ توسط آقای Bill Joy نوشته شده است.

vi دارای دو مُد command و insert است. در هر حال فقط یک مد فعال است. یعنی یا در مد command هستید یا در مد insert قرار دارید.

vi دستورات فراوانی دارد که در این مقاله به اصلی‌ترین موارد و مواردی که در اثر تجربه، بیشتر از آن‌ها استفاده می‌کنم اشاره‌ می‌کنم.

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

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

ورود به ویرایشگر و خروج از آن🔗

  • در خط فرمان عبارت vi را تایپ کنید و Enter را بزنید. وارد برنامه vi می شوید.
  • برای ورود به مد insert دگمه i را بزنید.
  • هم اکنون وارد مد insert شده‌اید و هر چه تایپ کنید در ویرایشگر نوشته می‌شود. برای نمونه بنویسید: hello world!
  • دگمه Esc را بزنید. از مد insert خارج شده‌اید و وارد مد command گشته اید.
  • تایپ کنید :w test.txt. این دستور متن نوشته شده را تحت نام test.txt در مسیر جاری ذخیره می‌کند.
  • از این پس هرگاه دستور :w را بنویسید فایل را تحت همین نام test.txt ذخیره می‌کند یعنی دستور :w (بدون نام فایل)، معادل save است.
  • مجددا دگمه i را بزنید تا وارد مد insert شوید . به انتهای خط اول بروید و Enter را بزنید. در خط دوم عبارت Good practice! را تایپ کنید.
  • دگمه Esc را بزنید تا از مد insert خارج و وارد مد command شوید . تایپ کنید :w. فایل تحت همان نام test.txt ذخیره می‌شود.
  • برای خروج تایپ کنید: :q . چون فایل بعد از آخرین save تغییری نکرده است از vi خارج خواهید شد و به خط فرمان بر می‌گردید.

نکته

با فشردن دگمه Esc کنترل به مد command بر می‌گردد. زمانی که در مد command هستید با فشردن دگمه i وارد مد insert می‌شوید. این روش تنها راه ورود به مد insert نیست و همین عمل ورود به مد insert به وسیله‌ی دگمه i ، مفهوم خاصی دارد که در ادامه به آن می‌پردازیم.

خروج از ویرایشگر بدون save آخرین تغییرات🔗

یک فایل متنی بلند را انتخاب کنید و آن را در مسیری که خط فرمان به آن اشاره می‌کند کپی کنید. فرض می‌کنیم نام این فایل EULA.txt است.

  • در خط فرمان بنویسید: vi EULA.txt فایل EULA.txt در ویرایشگر vi باز خواهد شد.
  • در هنگام ورود به فایل در مد command قرار خواهید داشت.
  • دگمه i را بزنید تا وارد مد insert شوید و متنی را تایپ کنید.
  • دگمه Esc را بزنید تا به مد command برگردید.
  • برای خروج از vi بدون save کردن تغییرات :q! را تایپ کنید. در این حالت vi مانع خروج شما نخواهد شد.

نکته

دستوراتی که تاکنون در مد command اجرا کردیم با کولُن : شروع شده‌اند و هنگام تایپ، دستور در نوار پایینی نمایش داده می‌شود.

جمع بندی دستورات آموخته شده تاکنون🔗

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

دستور محیط توضیحات
vi خط فرمان طریقه ورود به vi را آموختیم.
:w filename vi command mode آموختیم چگونه فایلی را در vi ایجاد و برای اولین بار آن را با نام دلخواه save کنیم.
:q vi command mode طریقه خروج از vi را آموختیم.
i vi command mode آموختیم با زدن دگمه i از مد command به مد insert می‌رویم.
Esc vi insert mode با زدن دگمه Esc از مد insert خارج و وارد مد command یعنی آماده پذیرش دستورات می‌شویم.
vi filename خط فرمان آموختیم که چگونه یک فایل موجود را در vi باز کنیم.
:q! vi command mode آموختیم چگونه بدون save کردن آخرین تغییرات، از vi خارج شویم.
:x و یا:wq vi command mode save کن و خارج شو!

حرکت در داخل فایل🔗

اکثر سیستم‌های موجود در زمان نوشتن برنامه‌ی vi ، دارای کلید‌های جهتی یا arrow key ها نبودند . به همین دلیل vi تدابیری برای حرکت در فایل اندیشیده است. توجه داشته باشید که در vi موس کار نمی‌کند!

بدیهی است که مطالب زیر جز دستورات vi می‌باشند و می بایست در مد command اجرا شوند .

  • h مشابه دگمه‌ی Left نشانگر را به سمت چپ حرکت می‌دهد.
  • l مشابه دگمه‌ی Right نشانگر را به سمت راست حرکت می‌دهد.
  • j مشابه دگمه‌ی Down نشانگر را به خط پایین می‌برد.
  • k مشابه دگمه‌ی Up نشانگر را به خط بالایی می‌برد.

cut یا حذف کردن یک یا چند خط🔗

دگمه Esc را بزنید تا اطمینان حاصل کنید در مد command هستید.

  • دوبار پشت سر هم d را بزنید. یعنی dd این کار خط فعلی را حذف می‌کند. خط حذف شده در داخل clipboard جای می‌گیرد.
  • دستور dnd با عنایت به اینکه n یک عدد است، n خط با احتساب خط فعلی، را حذف می‌کند. خطوط پاک شده در داخل clipboard قرار می‌گیرند. برای مثال d2d خط فعلی و خط بعد از آن را cut می‌کند و دستور d10d ، خط فعلی و ۹ خط بعد از آن را حذف می‌کند.

paste کردن محتوا و undo نمودن تغییرات🔗

دگمه Esc را بزنید تا اطمینان حاصل کنید در مد command هستید.

  • دوبار پشت سر هم d را بزنید. یعنی dd این کار خط فعلی را پاک میکند. خط پاک شده در داخل clipboard جای می‌گیرد.
  • به خط دلخواهی بروید و دگمه p را بزنید. p محتوای clipboard را در خط بعد از خطی که cursor در آن قرار دارد، paste می‌کند.
  • دگمه u را بزنید. u عمل undo را انجام می‌دهد. فشردن متوالی u باعث undo شدن تغییرات تا لحظه‌ی بازگشت به نسخه اصلی فایل می‌شود.

cut یا حذف کردن باقیمانده‌ی خط، از نقطه فعلی cursor🔗

دگمه Esc را بزنید تا اطمینان حاصل کنید در مد command هستید.

  • با استفاده از کلید های جهتی (h, j, k,l) به ابتدای جایی که می‌خواهید از آن نقطه تا انتهای خط حذف بشود، بروید.
  • دگمه D را بزنید. از نقطه فعلی cursor تا انتهای خط cut خواهد شد و در clipboard قرار خواهد گرفت.

ویرایش یک یا چند خط🔗

دگمه Esc را بزنید تا اطمینان حاصل کنید در مد command هستید.

  • دگمه c را دو بار بزنید، یعنی cc این کار خط فعلی را کاملا پاک می‌کند و به مد insert می‌رود و آماده ورود کاراکترهای بعدی می‌شود. بعد از اتمام ورود متن دلخواه، دگمه Esc را بزنید.
  • cnc با عنایت به اینکه n یک عدد است با احتساب خط فعلی n خط را پاک می‌کند و به مد insert می‌رود تا کاراکترهای جایگزین این خطوط را بخواند. به عنوان مثال c2c یا c5c اولین دستور دو خط و دومی ۵ خط را پاک می‌کند و به مد insert می‌رود. بدیهی است بعد از اتمام ورود کاراکترها می‌بایست Esc را بزنید.

ویرایش باقیمانده خط فعلی🔗

دگمه Esc را بزنید تا اطمینان حاصل کنید در مد command هستید.

  • با استفاده از کلیدهای جهتی (h, j, k, l) به ابتدای جایی که می‌خواهید از آن به بعد را ویرایش کنید بروید.
  • دگمه C (C بزرگ)را بزنید. کاراکتر زیر cursor تا انتهای خط پاک می‌شود و ادیتور به مد insert می‌رود. بعد از اتمام ویرایش دگمه Esc را بزنید.

راههای مختلف ورود به مد insert و تفاوتهای آن🔗

دگمه Esc را بزنید تا اطمینان حاصل کنید در مد command هستید.

  • i کاراکترهای ورودی را در مکان cursor درج می‌کند.
  • a کاراکترهای ورودی را در نقطه بعد از cursor درج می‌کند. a اول کلمه append است.
  • I کاراکترهای ورودی را در ابتدای خط فعلی درج می‌کند.
  • A کاراکترهای ورودی را در انتهای خط فعلی Append یا درج می‌کند.

دستورات فوق علی‌رغم عجیب به نظر رسیدنشان، بسیار ساده و قابل فهم هستند . فایل تست خود را باز کنید و دستورات را روی آن اجرا کنید تا تفاوت‌های ساده آن‌ها را متوجه شوید.

پرش به نقاط مختلف یک خط🔗

Esc را بزنید تا اطمینان حاصل کنید که در مد command هستید.

  • 0 (تنها دگمه 0) معادل دگمه Home است. cursor را به ابتدای خط فعلی می‌برد.
  • $ (تنها کاراکتر $) معادل دگمه End است. cursor را به انتهای خط فعلی می‌برد.
  • w (تنها دگمه w) نشانگر یا cursor را به ابتدای کلمه بعدی منتقل می‌کند. در صورت رسیدن به آخرین کلمه‌ی خط جاری، در صورت فشردن مجدد، cursor به ابتدای اولین کلمه خط بعد منتقل می شود.
  • b (تنها دگمه b) نشانگر یا cursor را به ابتدای کلمه قبلی می‌برد. در صورت رسیدن به ابتدای اولین کلمه خط جاری، در صورت تکرار دستور، cursor به ابتدای آخرین کلمه‌ی خط قبلی می‌رود.

پاک‌کردن و replace کاراکتر🔗

Esc را بزنید تا اطمینان حاصل کنید که در مد command هستید.

  • x (تنها x): کاراکتری که cursor روی آن قرار گرفته است را پاک می‌کند.
  • nx (تنها nx): با عنایت به اینکه n یک عدد است، n کاراکتر از نقطه فعلی cursor به بعد را پاک می‌کند. مثلا عبارت 5x، کاراکتر زیر cursor را به همراه ۴ کاراکتر بعد از آن حذف می‌کند.
  • r (تنها r): برای replace کاراکتر به کار می‌رود. cursor را روی کاراکتری که می‌خواهید آن را با چیز دیگری جایگزین کنید قرار دهید. حال r را فشار دهید و بلافاصله کاراکتر جایگزین را بزنید.

ویرایش یک یا چند کلمه🔗

Esc را بزنید تا اطمینان حاصل کنید که در مد command هستید.

  • با دگمه‌های جهتی (h, j, k, l) به ابتدای کلمه‌ای که می‌خواهید وبرایش کنید بروید.
  • دگمه c و سپس w را بزنید یعنی cw مختصر عبارت change word. کلمه بعد از cursor پاک می‌شود و vi به طور اتوماتیک به مد insert می‌رود و آماده دریافت کاراکترهای ورودی می‌شود. بعد از اتمام نوشتن دگمه Esc را بزنید. در واقع با زدن cw ویرایشگر vi از نقطه فعلی cursor تا انتهای کلمه را پاک می‌کند.
  • عبارت cnw با عنایت به این نکته که n یک عدد است، تعداد n کلمه بعد از cursor را پاک می‌کند و به صورت اتوماتیک وارد مد insert و آماده گرفتن کاراکترهای ورودی می‌شود. طبیعی است بعد از اتمام ویرایش و ورود کاراکترها باید دگمه Esc را بزنید. مثال‌هایی از این مورد می‌تواند c2w برای ویرایش ۲ کلمه از نقطه فعلی cursor یا c5w برای ویرایش ۵ کلمه از نقطه فعلی cursor باشد.

پرش به خط دلخواه🔗

دگمه Esc را بزنید تا اطمینان حاصل کنید که در مد insert هستید.

  • :0 این دستور cursor را به خط اول فایل می‌برد.
  • :$ این دستور cursor را به خط آخر فایل می‌برد.
  • :n با عنایت به این نکته که n یک عدد است cursor را به خط n می‌برد.

پرش صفحه‌ای🔗

دگمه Esc را بزنید تا اطمینان حاصل کنید که در مد insert هستید.

  • Ctrl+f عملکرد آن مشابه دگمه Page Down است. به اندازه یک صفحه به پایین پرش می‌کند.
  • Ctrl+b مشابه Page Up عمل می‌کند. به اندازه یک صفحه به بالا پرش می‌کند.
  • Ctrl+d به اندازه نیم صفحه به پایین پرش می‌کند.
  • Ctrl+u نیم صفحه به بالا پرش می‌کند.

cut یا پاک کردن یک یا چند کلمه🔗

دگمه Esc را بزنید تا اطمینان حاصل کنید در مد insert هستید.

  • با استفاده از کلیدهای جهتی (h, j, k, l) به ابتدای کلمه‌ای که می‌خواهید آنرا پاک کنید بروید.
  • ابتدا دگمه d و سپس w را بزنید، یعنی dw اختصار عبارت delete word. کاراکترهای کلمه فعلی، از نقطه زیر cursor تا انتهای کلمه به همراه کلیه space های بعد از این کلمه و قبل از کلمه بعدی حذف می‌شوند و در داخل clipboard قرار می‌گیرند.
  • دستور dnw با عنایت به اینکه n یک عدد است، n کلمه از نقطه زیر cursor به بعد را حذف می‌کند و در داخل clipboard قرار می‌دهد.

کپی کردن یک یا چند خط🔗

دگمه Esc را بزنید تا اطمینان حاصل کنید که در مد insert هستید.

  • با استفاده از کلیدهای جهتی (h, j, k, l) به خطی که می‌خواهید آنرا کپی کنید بروید.
  • دستور yy را وارد کنید. یعنی دوبار دگمه y را بزنید. این دستور خط فعلی را در داخل clipboard قرار می‌دهد. حال می‌توانید با استفاده از کلیدهای جهتی به نقطه‌ی دلخواه بروید و با فشردن دگمه p متن کپی شده را در خط بعد از نشانگر paste کنید.
  • دستور yny با عنایت به اینکه n یک عدد است، با احتساب خط فعلی، تعداد n خط را در داخل clipboard قرار می‌دهد تا در جای دلخواه آنرا paste کنید.

راه‌های ایجاد خط جدید🔗

بدیهی‌ترین راه اینست که در مد insert در پایان خط Enter را بزنید تا خط جدید ایجاد شود!

Esc را بزنید تا اطمینان حاصل کنید در مد command هستید.

  • o (تنها o کوچک) خطی جدید در زیر خط فعلی ایجاد می‌کند و به صورت اتوماتیک به مد insert می‌رود و آماده ورود کاراکترها می‌شود.
  • O (تنها O بزرگ) مانند o کوچک با این تفاوت که خطی جدید در بالای خط فعلی ایجاد می‌کند و به مد insert می‌رود.

جستجو در داخل فایل🔗

Esc را بزنید تا اطمینان حاصل کنید در مد command هستید.

  • /search از محل قرارگیری cursor به سمت انتهای فایل به جستجوی عبارت وارد شده (در اینجا search) می‌پردازد. در صورت یافتن موردی، cursor به ابتدای عبارت یافت شده منتقل می‌شود. جهت این جستجو از بالا به پایین است.
  • ?search از محل قرارگیری cursor به سمت ابتدای فایل به دنبال عبارت وارد شده می‌گردد و مانند دستور قبلی در صورت یافتن موردی، cursor به ابتدای عبارت یافت شده منتقل می‌شود. جهت این جستجو از پایین به بالا است.
  • برای یافتن موارد بعدی در جستجوی انجام شده از دگمه های n و N استفاده کنید. n مورد بعدی در جهت جستجو را نشان می‌دهد در حالیکه N مورد بعدی در خلاف جهت جستجو را نشان می‌دهد.

یافتن تعداد کل خطوط فایل و شماره خط فعلی🔗

Esc را بزنید تا اطمینان حاصل کنید در مد command هستید.

  • := تعداد کل خطوط فایل را نمایش می‌دهد.
  • :-= شماره خط فعلی که cursor در آن قرار گرفته را نمایش می‌دهد.

دندانه دادن و دندانه گرفتن خطوط🔗

Esc را بزنید تا اطمینان حاصل کنید در مد command هستید.

  • >> خط فعلی را یکبار به سمت راست دندانه (indent) می‌دهد. در صورت تکرار دستور مجددا دندانه خواهد داد.
  • << در صورتی که خط فعلی دندانه (indent) داشته باشد یک دندانه را حذف می‌کند. در صورت تکرار و به شرط داشتن دندانه، یکبار دیگر یک دندانه‌ی دیگر را حذف می‌کند.

خواندن فایل دیگر در فایل موجود و ذخیره سازی🔗

  • :r filename محتوای فایل filename را در خط بعد از خط فعلی cursor اضافه می‌کند.
  • :w filename مشابه دستور save as مرسوم در برنامه‌ها است. محتوای موجود در ویرایشگر را در فایلی به نام filename ذخیره می‌کند. توجه کنید چنانچه قبل از اجرای این دستور فایلی که بر روی آن کار می‌کردید دارای نام بوده است شما همچنان در حال کار بر روی آن فایل باقی می‌مانید. در صورتی که فایل دیگری با نام filename وجود داشته باشد ذخیره سازی انجام نمی شود و برنامه خطا می‌دهد.
  • :w! filename فایل موجود را تحت نام filename ذخیره می‌کند. اگر فایل دیگری با این نام وجود داشته باشد، فایل موجود رونویسی می‌شود.
  • :w مشابه دستور save در برنامه‌هاست. فایل باز شده را تحت همان نام قبلی ذخیره می‌کند.
  • :i,jw filename با عنایت به این نکته که i و j عددهایی حاوی شماره خط آغاز و شماره خط پایان است، محتوای دو خط نام برده شده و خطوط مابین آن ها را در فایل جدیدی تحت نام filename ذخیره می‌کند.

جدول کلیه دستورات این مقاله🔗

جدول زیر فشرده شده‌ی دستورات فوق است:

دستور مد بعدی vi
/ shell command line
توضیحات
i insert ورود به مد insert. کاراکترهای ورودی در نقطه فعلی cursor اضافه می‌شوند.
a insert ورود به مد insert. کاراکترهای ورودی بعد از cursor اضافه می‌شوند.
I insert ورود به مد insert. کاراکترهای ورودی به ابتدای خط فعلی اضافه می‌شوند.
A insert ورود به مد insert. کاراکترهای ورودی به انتهای خط فعلی Append می‌شوند.
h command معادل دگمه‌ی Left. نشانگر یا cursor را یک کاراکتر به سمت چپ می‌برد.
l command معادل دگمه‌ی Right. نشانگر را یک کاراکتر یه سمت راست می‌برد.
j command معادل دگمه‌ی Down. نشانگر یا همان cursor را یک خط پایین می‌برد.
k command معادل دگمه‌ی Up. نشانگر را یک خط به بالا می‌برد.
:wq shell command line ذخیره فایل فعلی و خروج از vi
:x shell command line ذخیره فایل فعلی و خروج از vi
:q command / shell command line در صورتی که فایل از لحظه آخرین ذخیره تغییر نکرده باشد از vi خارج می‌شود. در غیر این صورت پیغام خطا می‌دهد.
:q! shell command line از vi خارج می‌شود ولو اینکه آخرین تغییرات ذخیره نشده باشد.
w command نشانگر را به ابتدای کلمه‌ی بعدی منتقل می‌کند.
b command نشانگر یا cursor را به ابتدای کلمه قبلی منتقل می‌کند.
0 command معادل دگمه Home. نشانگر را به ابتدای خط فعلی می‌برد.
$ command معادل دگمه End. نشانگر یا cursor را به انتهای خط فعلی می‌برد.
u command عمل undo را انجام می‌دهد.
p command محتوای clipboard را در خط بعد از خط فعلی نشانگر paste می‌کند.
x command کاراکتر زیر cursor را پاک می‌کند.
nx command تعداد n کاراکتر از نقطه زیر cursor به بعد را پاک می‌کند.
>> command خط موجود را یکبار به سمت راست دندانه (indent) می‌دهد.
<< command در صورت وجود دندانه در خط موجود یک دندانه (indent) را حذف می‌کند.
o insert یک خط بعد از خط فعلی ایجاد می‌کند و cursor در آن قرار می‌گیرد و vi به مد insert می‌رود.
O insert یک خط در بالای خط فعلی ایجاد می‌کند و cursor به آن منتقل می‌شود و ادیتور در مد insert آماده دریافت کاراکترهای ورودی می‌شود.
r command کاراکتر زیر cursor را با کاراکتری که بعد از r خواهد خواند جایگزین می‌کند.
:0 command نشانگر را به خط اول منتقل می‌کند.
:n command نشانگر را به خط n می‌برد.
:$ command نشانگر را به خط آخر می‌برد.
cw insert کلمه فعلی از نقطه‌ای که cursor در آن قرار گرفته است را پاک می‌کند و به مد insert می‌رود و آماده ورود کارکترهای جایگزین می‌شود.
cnw insert از نقطه ای که cursor قرار گرفته است n کلمه را پاک می‌کند و با ورود اتوماتیک به مد insert، آماده دریافت کاراکترهای جدید می‌شود.
dd command خط فعلی را به طور کامل حذف می‌کند.
dnd command با احتساب خط فعلی n خط را حذف می‌کند.
D command کاراکترهای موجود در خط، از نقطه cursor به بعد را حذف می‌کند.
C insert کاراکترهای موجود در خط فعلی را از نقطه cursor به بعد پاک می‌کند و به مد insert می‌رود تا کاراکترهای جایگزین را بخواند.
cc insert کل محتوای خط فعلی را پاک می‌کند و به طور اتوماتیک به مد insert می‌رود و کاراکترهای ورودی را جایگزین کاراکترهای قبلی می‌کند.
cnc insert با احتساب خط فعلی n خط را پاک می‌کند تا محتوای جدیدی را جایگزین نماید.
dw command کلمه فعلی از نقطه cursor به بعد را حذف می‌کند.
dnw command تعداد n کلمه از نقطه فعلی cursor به بعد را حذف می‌کند.
yy command محتوای خط فعلی را در داخل clipboard کپی می‌کند.
yny command با احتساب خط فعلی، محتوای n خط در داخل clipboard کپی می‌شود.
/search command لغت search را از نقطه فعلی cursor به سمت پایین جستجو می‌کند. برای مورد بعدی n و برای مورد قبلی N را بزنید.
?search command لغت search را از نقطه فعلی cursor به سمت بالا جستجو می‌کند. برای مورد بعدی n و برای مورد قبلی N را بزنید.
:= command تعداد کل خط‌های فایل را می‌دهد.
:-= command شماره خط فعلی را می‌دهد.
:r filename command محتوای فایل filename را می‌خواند و آنرا در خط بعد از خط فعلی cursor قرار می‌دهد.
:w filename command معادل save as. فایل را تحت نام filename ذخیره می‌کند.
:w command معادل save. فایل را تحت نام فعلی ذخیره می‌کند.
:i,jw filename command از خط i تا خط j فایل فعلی را در فایل filename ذخیره می‌کند.
:w! filename command فایل فعلی را تحت نام filename ذخیره می‌کند. اگر فایلی هم اکنون به آن نام وجود داشته باشد آن را رونویسی می‌کند.
Ctrl+f command معادل دگمه Page Down به اندازه یک صفحه به پایین پرش می‌کند.
Ctrl+b command معادل دگمه Page Up. به اندازه یک صفحه به بالا می‌رود.
Ctrl+d command به اندازه نیم صفحه به پایین پرش می‌کند.
Ctrl+u command به اندازه نیم صفحه به بالا پرش می‌کند.
نوشته شده در: 1402-02-09 (1 سال 6 ماه 3 هفته پیش)

من محسن هستم؛ برنامه‌نویس سابق PHP و Laravel و Zend Framework و پایتون و فلسک. تمرکزم بیشتر روی لاراول بود! الان از صفر مشغول مطالعات اقتصادی هستم.

برای ارتباط با من یا در همین سایت کامنت بگذارید و یا به dokaj.ir(at)gmail.com ایمیل بزنید.

علیرضا 2024-04-05 19:50:54

خیلی خوب بود. پاسخ

Mohsen 2024-04-05 20:13:53

ممنون از توجهتون. پاسخ

در مورد این مطلب یادداشتی بنویسید.