FISH-PROMPT-TUTORIAL(1) fish-shell FISH-PROMPT-TUTORIAL(1)

fish-prompt-tutorial - راهنمای گام‌به‌گام نوشتن اعلان (پرامپت) سفارشی در fish

هشدار:

این سند از قالب‌بندی برای نمایش شکل ظاهری اعلان استفاده می‌کند. اگر این صفحه را در صفحه راهنما (man page) می‌بینید، احتمالاً ترجیح می‌دهید نسخه HTML آن را مشاهده کنید. برای مشاهده آن در مرورگر وب، دستور help custom-prompt را اجرا کنید.

پوسته fish تعدادی اعلان آماده به همراه دارد که می‌توانید با دستور fish_config آن‌ها را مشاهده کنید، و بسیاری از کاربران نیز اعلان‌های خود را به صورت آنلاین به اشتراک گذاشته‌اند.

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

برخلاف سایر پوسته‌ها، اعلان در fish با اجرای یک تابع ساخته می‌شود - تابع fish_prompt. یا دقیق‌تر بگوییم، سه تابع:

  • fish_prompt که تابع اصلی اعلان است.
  • fish_right_prompt که در سمت راست ترمینال نمایش داده می‌شود.
  • fish_mode_prompt که در صورت استفاده از حالت vi نمایش داده می‌شود.

این توابع اجرا می‌شوند و هر آنچه در خروجی چاپ کنند، به عنوان اعلان نمایش داده می‌شود (به جز یک نویسه خط جدید پایانی).

اگر متغیرهای محیطی SHELL_PROMPT_PREFIX یا SHELL_PROMPT_SUFFIX تنظیم شده باشند، به طور خودکار به ابتدا و انتهای اعلان سمت چپ اضافه می‌شوند.

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

بیایید به یک مثال بسیار ساده نگاه کنیم:

function fish_prompt
    echo $PWD '>'
end

این تابع، دایرکتوری کاری جاری (PWD) و یک نماد > را برای نشان دادن انتهای اعلان چاپ می‌کند. نماد > درون کوتیشن قرار گرفته است زیرا در غیر این صورت به معنای تغییرمسیر (redirection) خواهد بود.

از آنجا که از echo استفاده کرده‌ایم، میان این دو فاصله اضافه می‌شود، بنابراین نتیجه به این شکل خواهد بود (با فرض اینکه _ مکان‌نمای شما باشد):

/home/tutorial >_

دستور echo میان آرگومان‌های خود فاصله می‌گذارد. اگر مایل به وجود این فاصله‌ها نیستید، می‌توانید از string join به شکل زیر استفاده کنید:

function fish_prompt
    string join '' -- $PWD '>'
end

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

روش‌های دیگری نیز برای حذف فاصله وجود دارد، از جمله echo -s و printf.

این اعلان کاربردی است، اما کمی خسته‌کننده به نظر می‌رسد. می‌توانیم مقداری رنگ به آن اضافه کنیم.

خوشبختانه، fish دستور set_color را ارائه می‌دهد، بنابراین می‌توانید بنویسید:

echo (set_color red)foo

دستور set_color همچنین از رنگ‌های RGB مانند set_color 23b455 و سایر گزینه‌های قالب‌بندی از جمله درشت (bold) و کج (italic) پشتیبانی می‌کند.

بنابراین، با در نظر گرفتن اعلان قبلی و افزودن رنگ به آن:

function fish_prompt
    string join '' -- (set_color green) $PWD (set_color --reset) '>'
end

گزینه "--reset" به ترمینال اعلام می‌کند که به گزینه‌های قالب‌بندی پیش‌فرض خود بازگردد.

دستور set_color با تولید یک توالی گریز (escape sequence) کار می‌کند؛ رشته متنی خاصی که ترمینال‌ها آن را به عنوان دستورالعمل تفسیر می‌کنند - برای مثال، جهت تغییر رنگ. بنابراین دستور set_color red اثری مشابه زیر ایجاد می‌کند:

echo \e\[31m

اگرچه می‌توانید توالی‌های گریز را به صورت دستی بنویسید، اما استفاده از set_color بسیار آسان‌تر است.

این وضعیت مناسب است، اما متغیر PWD ممکن است کمی طولانی شود، و معمولاً ما فقط به چند دایرکتوری آخر علاقه‌مند هستیم. می‌توانیم این مسیر را با تابع کمکی prompt_pwd کوتاه کنیم که دایرکتوری کاری خلاصه‌شده را به ما می‌دهد:

function fish_prompt
    string join '' -- (set_color green) (prompt_pwd) (set_color --reset) '>'
end

تابع prompt_pwd گزینه‌هایی برای کنترل میزان کوتاه‌سازی دریافت می‌کند. برای نمونه، اگر بخواهیم دو دایرکتوری آخر نمایش داده شوند، از prompt_pwd --full-length-dirs 2 استفاده می‌کنیم:

function fish_prompt
    string join '' -- (set_color green) (prompt_pwd --full-length-dirs 2) (set_color --reset) '>'
end

با دایرکتوری جاری "/home/tutorial/Music/Lena Raine/Oneknowing"، این دستور عبارت زیر را چاپ می‌کند:

~/M/Lena Raine/Oneknowing>_

یکی از اطلاعات مهمی که هر دستور بازمی‌گرداند، وضعیت خروج (status) است. این مقدار یک عدد صحیح از 0 تا 255 است و معمولاً به عنوان کد خطا استفاده می‌شود - مقدار 0 در صورتی که دستور با موفقیت به پایان رسیده باشد، یا عددی از 1 تا 255 در صورت بروز خطا.

نمایش این مقدار در اعلان مفید است، اما نشان دادن آن هنگامی که 0 است بیهوده و اضافه به نظر می‌رسد.

پیش از هر چیز، از آنجا که هر دستور (به جز set) وضعیت را تغییر می‌دهد، لازم است آن را به عنوان نخستین کار در اعلان برای استفاده‌های بعدی ذخیره کنید. از یک متغیر محلی (local) استفاده کنید تا به تابع اعلان شما محدود بماند:

set -l last_status $status

سپس می‌توانید در صورت غیرصفر بودن، یک رشته متنی را مقداردهی کنید:

# تنها در صورتی که وضعیت صفر نباشد نمایش داده شود
set -l stat
if test $last_status -ne 0
    set stat (set_color red)"[$last_status]"(set_color --reset)
end

و برای چاپ آن، آن را به string join اضافه می‌کنیم:

string join '' -- (set_color green) (prompt_pwd) (set_color --reset) $stat '>'

اگر مقدار $last_status برابر 0 باشد، متغیر $stat خالی خواهد بود و در نتیجه اصلاً نمایش داده نخواهد شد.

بنابراین تمام اعلان ما اکنون به این شکل درمی‌آید:

function fish_prompt
    set -l last_status $status
    # تنها در صورتی که وضعیت صفر نباشد نمایش داده شود
    set -l stat
    if test $last_status -ne 0
        set stat (set_color red)"[$last_status]"(set_color --reset)
    end
    string join '' -- (set_color green) (prompt_pwd) (set_color --reset) $stat '>'
end

و پس از اجرای دستور false (که مقدار 1 را برمی‌گرداند)، ظاهر آن به شکل زیر خواهد بود:

~/M/L/Oneknowing>false
~/M/L/Oneknowing[1]>_

برای فعال‌سازی قابلیت اعلان گذرا (transient prompt)، متغیر fish_transient_prompt را روی 1 تنظیم کنید:

set -g fish_transient_prompt 1

با این تنظیم، fish پیش از اجرای هر خط فرمان، توابع اعلان را با آرگومان --final-rendering دوباره اجرا می‌کند. بنابراین می‌توانید از آن برای خلوت کردن و مرتب‌سازی اعلان‌های قبلی خود استفاده کنید. برای مثال، اگر بخواهید هنگام پیمایش به بالا فقط نام دایرکتوری جاری دیده شود:

function fish_prompt
    set -l last_status $status
    set -l stat
    set -l pwd
    # بررسی اینکه آیا اعلان گذرا یا نهایی است
    if contains -- --final-rendering $argv
        set pwd (path basename $PWD)
    else
        set pwd (prompt_pwd)
        # تنها در صورتی که وضعیت صفر نباشد نمایش داده شود
        if test $last_status -ne 0
            set stat (set_color red)"[$last_status]"(set_color --reset)
        end
    end
    string join '' -- (set_color green) $pwd (set_color --reset) $stat '>'
end

اکنون اجرای دو دستور در یک دایرکتوری می‌تواند به چنین صفحه‌ای منجر شود:

Oneknowing>false
~/M/L/Oneknowing[1]>_

هنگامی که از اعلان خود رضایت داشتید، می‌توانید آن را با دستور funcsave fish_prompt ذخیره کنید (رجوع کنید به funcsave - ذخیره تعریف یک تابع در دایرکتوری بارگذاری خودکار کاربر) یا خودتان آن را در مسیر ~/.config/fish/functions/fish_prompt.fish بنویسید.

اگر می‌خواهید دوباره آن را ویرایش کنید، آن فایل را باز کرده یا از دستور funced fish_prompt استفاده کنید (رجوع کنید به funced - ویرایش تعاملی یک تابع).

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

•
پوسته fish توابع کمکی بیشتری ارائه می‌دهد:
  • prompt_login برای شرح کاربر/نام میزبان/کانتینر یا prompt_hostname برای شرح صرفاً نام میزبان
  • fish_is_root_user برای کمک به تغییر نماد مربوط به کاربر ریشه (root).
  • fish_vcs_prompt برای نمایش اطلاعات سیستم کنترل نسخه (یا fish_git_prompt / fish_hg_prompt / fish_svn_prompt برای محدود کردن به سیستم‌های خاص)
  • می‌توانید با تغییر fish_right_prompt یک اعلان سمت راست، یا با تغییر fish_mode_prompt اعلان حالت vi اضافه کنید.
برخی اعلان‌ها دارای ویژگی‌های جالب یا پیشرفته‌ای هستند:
  • افزودن زمان چاپ شدن اعلان
  • نمایش یکپارچه‌سازی‌های گوناگون مانند محیط مجازی پایتون (venv)
  • رنگ‌آمیزی متفاوت بخش‌های مختلف.

می‌توانید برای ایده گرفتن، به اعلان‌های نمونه fish نگاهی بیندازید. دستور fish_config را اجرا کنید، اعلان دلخواه خود را بیابید و آن را برگزینید. برای مثال:

fish_config prompt show # <- تمام اعلان‌های نمونه را نشان می‌دهد
fish_config prompt choose disco # <- اعلان disco را برای این نشست برمی‌گزیند
funced fish_prompt # <- اعلان fish_prompt را در ویرایشگر شما باز می‌کند و پس از خروج آن را مجدداً بارگذاری می‌نماید

توسعه‌دهندگان fish-shell

توسعه‌دهندگان fish-shell

September 7, 2026 4.9