কিভাবে একটি zsh প্রম্পটে পথ বিন্যাস করতে?


22

আমি পড়ার মতো রঙিন পথ চাই। উদাহরণস্বরূপ, ফিরে আসার জন্য% using ব্যবহার করার পরিবর্তে পাথ বিভাজককে হাইলাইট ~/path/to/fooকরার ~$RED/$NOCOLORpath$RED/$NOCOLORto$RED/$NOCOLORfooজন্য আমি এটি বিন্যাস করতে চাই ।

আমি কি PROMPT এর সামগ্রীটি সংজ্ঞায়িত করতে পারি যাতে প্রতিটি ডিসপ্লেতে পাথের এক্সপ্রেশনটি পুনরায় মূল্যায়ন হয়? ${${(%):-%~}//\//_some_format_expression/}স্পষ্টতই কিছু কাজ করে না।

বা আমি কি আরও হ্যাক করব, এবং প্রতি বার ডিরেক্টরি পরিবর্তন করার পরে প্রম্পট মানটি পুনরায় সেট করতে বাধ্য করব?

পাথ ফর্ম্যাটিং লক্ষ্য অর্জনের যে কোনও সমাধান স্বাগত।

ধন্যবাদ :)


যদি আপনি এখনও বিদ্যমান থাকেন তবে আপনি এর জন্য সেরা উত্তর চিহ্নিত করতে চাইতে পারেন :)
ড্যান রোজনস্টার্ক

উত্তর:


34

zsh

এটা চেষ্টা কর:

setopt PROMPT_SUBST
PROMPT='%{$(pwd|grep --color=always /)%${#PWD}G%} %(!.%F{red}.%F{cyan})%n%f@%F{yellow}%m%f%(!.%F{red}.)%#%f '

এখানে প্রম্পটের একটি ভাঙ্গন রয়েছে:

  • PROMPT_SUBST প্রম্পটে কমান্ড প্রতিস্থাপন চালু করে (এবং প্যারামিটার সম্প্রসারণ এবং পাটিগণিত সম্প্রসারণ)
  • %{...%} - একটি অব্যাহতি ক্রম
  • $(pwd|grep --color=always /)- বর্তমান ডিরেক্টরি মুদ্রণ করুন এবং হাইলাইট করুন /- রঙটি $ GREP_COLORS পরিবেশের পরিবর্তনশীল (বা এর ডিফল্ট মান) এর উপর নির্ভর করবে - গা bold় লালটি ডিফল্ট
  • %${#PWD}G- বর্তমান ডিরেক্টরিটির নামের অক্ষরগুলির দৈর্ঘ্যকে একটি গ্লুক মান হিসাবে ব্যবহার করুন। এটি %{শেলটিকে এআরএসআই এর অব্যাহতি সিকোয়েন্স অন্তর্ভুক্ত স্ট্রিংয়ের আসল দৈর্ঘ্যের পরিবর্তে পূর্বের অক্ষর ক্রমের দৈর্ঘ্য (" " পরে ) বিবেচনা করে তোলে । এটি শেলটি প্রম্পটের শেষের সাথে সম্পর্কিত কার্সারের অবস্থান সম্পর্কে বিভ্রান্ত হতে বাধা দেয়।
    - - - - - - - - এটি আপনার প্রশ্নের উত্তর দেয় এমন অংশের সমাপ্তি - - - - - - - -
  • %(!.%F{red}.%F{cyan}) - যদি এটি কোনও সুবিধাযুক্ত শেল (মূল) হয় তবে অগ্রভাগের রঙটি লালকে সেট করুন, অন্যথায় সায়ান
  • %n - আউটপুট ব্যবহারকারীর নাম
  • %f - অগ্রভাগের রঙটি ডিফল্টে পুনরায় সেট করুন
  • @ - একটি আক্ষরিক চিহ্ন
  • %F{yellow} - অগ্রভাগের রঙটি হলুদ করুন
  • %m - হোস্টনাম আউটপুট
  • %f - অগ্রভাগের রঙটি ডিফল্টে পুনরায় সেট করুন
  • %(!.%F{red}.) - যদি এটি কোনও সুবিধাযুক্ত শেল (মূল) হয় তবে অগ্রভাগের রঙটি লালকে সেট করুন
  • %#- একটি সুবিধাযুক্ত #শেলের %জন্য বা একটি অনিবদ্ধদের জন্য আউটপুট এ
  • %f - অগ্রভাগের রঙটি ডিফল্টে পুনরায় সেট করুন

আমি জোর দেওয়ার জন্য এই প্রম্পটে প্রথমে পথটি রেখেছি, যেহেতু প্রশ্নটি পথটিকেই উদ্বেগিত করে।

বিকল্প পাঠ

এখানে zsh এর একটি সংস্করণ রয়েছে যা $GREP_COLORSভেরিয়েবলটি পরিচালনা করে আপনি মূল (বিশেষাধিকারপ্রাপ্ত) কিনা তার উপর নির্ভর করে স্ল্যাশের বর্ণ পরিবর্তন করে:

setopt PROMPT_SUBST
PROMPT='%{$(pwd|([[ $EUID == 0 ]] && GREP_COLORS="mt=01;31" grep --color=always /|| GREP_COLORS="mt=01;34" grep --color=always /))%${#PWD}G%} %(!.%F{red}.%F{cyan})%n%f@%F{yellow}%m%f%(!.%F{red}.)%#%f '

সজোরে আঘাত

আপনি বাশে একই অনুরোধ জানাতে পারেন। এই উদাহরণস্বরূপ, আমি ইউজার এবং হোস্টনামটি প্রথমে রেখেছি এবং ইউআইডি 0 হলে স্ল্যাশগুলির রঙও বদলে যায় War সতর্কতা: এটি বাশের $PS1প্রম্পট ভেরিয়েবলটিকে ওভাররাইট করে । আপনি কোনও বিশেষ কিছু না করা বা আপনি যখন সেই পরিবর্তনশীলটি সরাসরি সেট করেন এবং এটি কার্যকর হয় তখন আপনি আচরণটি পরিবর্তনের প্রত্যাশা না করলে সমস্যাটি হওয়া উচিত নয়। এছাড়াও, এটি " usercolor" নামক একটি ভেরিয়েবল ব্যবহার করে যা অন্য কোনও কিছুর সাথে সংঘর্ষিত হতে পারে, যদিও এই পুরো জিনিসটি একটি ফাংশনে রাখা যেতে পারে এবং ভেরিয়েবলটিকে স্থানীয় হিসাবে ঘোষণা করা হয়।

PROMPT_COMMAND='usercolor="\[\033[0;36m\]";[[ $EUID == 0 ]] && usercolor="\[\033[1;31m\]";PS1="$(pwd)";PS1="$usercolor\u\[\033[0m\]@\[\033[0;33m\]\h\[\033[0m\]:${PS1//\//$usercolor/\[\033[0m\]}$usercolor\\$\[\033[0m\] "'

বিকল্প পাঠ

শর্তসাপেক্ষে স্ল্যাশগুলিকে রঙিন করার জন্য (গ্রেপ ব্যবহারের পরিবর্তে) বাশের প্যারামিটার সম্প্রসারণ বিকল্পটি ব্যবহার করার জন্য zsh এর "গ্লাইচ" বৈশিষ্ট্যটি নেই বলে আমি এই সুবিধাটি নিয়েছি।


আমাকে বোকা বলুন, তবে আমি কেবল ভুল অংশটি হ'ল PROMPT সংজ্ঞাতে একক উদ্ধৃতিগুলির পরিবর্তে ডাবল কোট ব্যবহার করছিলাম। ধন্যবাদ :)
নিকোলাস ডুমাজেট

@ নিকডামজেড, মজার, আমি গতকাল অন্য কোথাও এই সমস্যাটির জন্য প্রায় 20 মিনিট সময় কাটিয়েছি :)
ড্যান রোজনস্টার্ক

1
এটি ব্যাপকভাবে (মজাদার এবং) দুর্দান্ত। ধন্যবাদ ...
ড্যান রোজনস্টার্ক

বাশে এটি কীভাবে করা যায় তার কোনও ধারণা, বা কেন এটি ব্যাশে কাজ করে না? বাশের সাথে আমার জন্য এটি প্রথম ডিরেক্টরিতে আটকে যায় আমি আমার টার্মিনালটি শুরু করি এবং আমি যখন ঘোরাফেরা করি তখন আপডেট হয় না। আমি সবেমাত্র $ (pwd | grep --color = সর্বদা /) নিয়েছি এবং আমার PS1 এ রেখেছি এবং অদ্ভুত আচরণ পেয়েছি। সম্পাদনা: ওহ! বাশ বিভাগটি লোল দেখেনি।
ইব্রাহিম

আসলে, আমি আমার আরও জটিল প্রম্পটে বাশের জন্য আপনার PS1 কৌশলটি ব্যবহার করার চেষ্টা করছি এবং এটি কাজ করছে না, আমার পিডাব্লুডি আবার আটকে যায়। তবে আপনার স্নিপেট যেমন আছে তেমন কাজ করে। PROMPT_COMMAND এর উদ্দেশ্য কী? আমি এটাই পেয়েছি: github.com/ibrahima/dotfiles/blob/master/.bashrc.d/prompt.sh এPS1="$(pwd)"; PS1="${debian_chroot:+($debian_chroot)}\[$bldgrn\]\u@$(fgcolor $hostnamecolor)\h$(resetcolor)\[$txtrst\]:\[$bldblu\]${PS1//\//$txtred/$bldblu}\[\e[00m\]$bldred\$(parse_git_branch)\[$txtrst\] \[$undcyn\]\T \d\[$txtrst\] 95\$ " বর্ণ সংজ্ঞায়িত করা হয়েছে
ইব্রাহিম

4

কিছু ঘোরাঘুরির পরে, আমি ওভাররাইডের একটি সমাধান সরবরাহ করতে পারি chpwd:

doprompt() {
  local my_path=${(%):-%~}
  PROMPT="${yourstuff}${my_path//\//${PR_BOLD_RED}/${reset_color}}${otherstuff}"
}
doprompt

chpwd() {
  doprompt
  # unrelated: set window title
  [[ -t 1 ]] || return;
  print -Pn "\e]2;%n@%m: %~\a";
}
  • অস্থায়ী my_pathভার থেকে মুক্তি পাওয়ার জন্য এই কোডটি উন্নত করার কোনও উপায় আছে কি ? আমি সরাসরি / ভিতরে% replace প্রতিস্থাপন করতে পারি না ...
  • প্রতিটি ডিরেক্টরি পরিবর্তনের dopromptজন্য কল এড়াতে ডায়নামিক সিনট্যাক্স ব্যবহার করে যে কোনও সমাধান সম্ভবত ক্লিনার।

4

একটি খাঁটি zsh সমাধান:

PROMPT='%n@%m: %{$PR_BOLD_RED%}${${(%):-%~}//\//${PR_BOLD_RED}/%f}%f '
  • ${(%):-%~} বর্তমান পথ।
  • ${xxxxx//\//${PR_BOLD_RED}/%f} এক্সএক্সএক্সএক্সএক্সএক্সএক্স / প্রতিটিতে প্রতিস্থাপন করে গা red় লাল বর্ণের by
  • এবং অবশ্যই PROMPT_SUBST চালু থাকতে হবে।

আমি আমার পরীক্ষায় ডাবল উক্তি ব্যবহার করছিলাম, যা প্রতিস্থাপনের অনুমতি দেয় না। একক উদ্ধৃতি দিয়ে সবকিছু ঠিকঠাক কাজ করে।


আপনার অবশ্যই $PR_BOLD_REDঅন্য কোথাও সংজ্ঞা দেওয়া উচিত । দ্বিতীয় "রেড" পরে ক্লোজিং কোঁকড়ানো ধনুর্বন্ধনী (কেবল) PROMPT='%n@%m: %{%B%F{red}%}${${(%):-%~}//\//%B%F{red\}/%b%f}%b%f 'এর খুব অদ্ভুত পলায়ন সহ আমাকে ব্যবহার করতে হবে ।
ডেনিস উইলিয়ামসন

হ্যাঁ, আমি অ্যারন টপোনসের নামগুলি pthree.org/wp-content/uploads/2009/03/zsh_prompt ব্যবহার করি যা আমি দরকারী বলে মনে করি। তদ্ব্যতীত, আমি কোনও কিছু এড়াতে চাই না, এটি সরবরাহ হিসাবে কাজ করে।
নিকোলাস ডুমাজেট

0

এখানে আমার প্রচেষ্টা (নিকডামজেডের উপর ভিত্তি করে):

setopt PROMPT_SUBST
# red, green, yellow, blue, magenta, cyan, white, black
# B (bold), K(background color), F(foreground color)

function doprompt {
# this is just the directory (%d could be %~ -- I prefer full path always)
PROMPT='%F{yellow}${${(%):-%d}//\//%F{magenta\}%B/%b%F{yellow\}}%f'
}

function chpwd() {
    doprompt
}

পার্থক্যটি হ'ল আমি রঙিন পথটি ব্যবহার করছি, সুতরাং স্ল্যাশ রঙিন হয়ে যাওয়ার সাথে সাথে আমাকে পথের জন্য আমার মূল রঙে ফিরে আসতে হবে। আমার ক্ষেত্রে পথটি সাধারণত হলুদ রঙের হয় এবং স্ল্যাশ ম্যাজেন্টা দিয়ে রঙিন হয়ে যায়, তারপরে এটি হলদে ফিরে আসে। আমি% F% f সিকোয়েন্সগুলিও ব্যবহার করতে পছন্দ করি কারণ সেগুলি আমার জন্য আরও বেশি পাঠযোগ্য।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.