আমি কীভাবে আমার রঙের বাশ প্রম্পট মোড়ানো ঠিক করব?


9

আমি বাশ প্রম্পটটিকে (PROMPT_FUNCTION ব্যবহার করে) এর মতো সংজ্ঞায়িত করেছি:

function get_hg_prompt_prefix() {
    local APPLIED_COLOR=$1; shift
    local UNAPPLIED_COLOR=$1; shift
    local ALERT_COLOUR=$1; shift
    local TEXTCOLOR=$1; shift
    local mercurial_prompt_line="{{patches|join(:)|pre_applied(${APPLIED_COLOR})|post_applied(${TEXTCOLOR})|pre_unapplied(${UNAPPLIED_COLOR})|post_unapplied(${TEXTCOLOR})}\n\r}"
    local mercurial_status_prompt="{ ${ALERT_COLOUR}{status}${TEXTCOLOR}}"

    echo "$(hg prompt "${mercurial_prompt_line}" 2>/dev/null)$(hg prompt "${mercurial_status_prompt}" 2>/dev/null)"
}

function set_prompt() {
    bright='\[[01m\]'
    colors_reset='\[[00m\]'
    HOSTCOLOR=${colors_reset}='\[[34m\]'
    USERCOLOR=${colors_reset}='\[[01m\]'
    TEXTCOLOR=${colors_reset}='\[[32m\]'
    APPLIED_COLOR=${colors_reset}='\[[32m\]'
    UNAPPLIED_COLOR=${colors_reset}='\[[37m\]'
    ALERT_COLOUR=${colors_reset}='\[[31m\]'

    hg_status="$(get_hg_prompt_prefix $APPLIED_COLOR $UNAPPLIED_COLOR $ALERT_COLOUR $TEXTCOLOR)"
    ps1_prefix="${hg_status}$colors_reset($bright$(basename $VIRTUAL_ENV)$colors_reset) "
    PROMPTEND='$'
    PS1="${ps1_prefix}${USERCOLOR}\u${colors_reset}${TEXTCOLOR}@${colors_reset}${HOSTCOLOR}\h${colors_reset}${TEXTCOLOR} (\W) ${PROMPTEND}${colors_reset} "
}

PROMPT_COMMAND=set_prompt

সাধারণভাবে, এটি আমাকে একটি বহু-লাইন প্রম্পট দেয় যা কিছু এইচজি স্থিতির তথ্য পাশাপাশি আমার বর্তমান ভার্চুয়ালেনভ প্রদর্শন করে (বর্ণ ছাড়াই) দেখায়:

buggy-wins.patch
 ! (saas) user@computer (~) $ 

সমস্যাটি হ'ল, এটি প্রম্পটের দৈর্ঘ্যের গণনার সাথে স্ক্রু করছে (আমি মনে করি!) এবং অদ্ভুত টার্মিনাল মোড়ানোর সমস্যা এবং কার্সার প্লেসমেন্টের কারণ ঘটায়। উদাহরণস্বরূপ, একটি 80-চর টার্মিনালে, আমি এখানে প্রম্পটটি দেখছি (** - চারপাশের চরিত্রটি কার্সারের অবস্থান):

~) $ **a**nis) crose@chris-rose (~

প্রম্পটটি প্রদর্শনের জন্য পর্যাপ্ত প্রশস্ত টার্মিনালগুলিতে, লাইন মোড়কটি এটির চেয়ে অনেক আগে ঘটে; 108-চর-প্রশস্ত টার্মিনাল উইন্ডোতে প্রম্পটের প্রথম লাইনে আমি ফিট করতে সবচেয়ে সর্বাধিক পাঠ্যটি এখানে (আবার, ** আমার কার্সারের অবস্থান চিহ্নিত করে):

 **(**advanis) crose@chris-rose (~) $ sdkfjlskdjflksdjff

যখন লাইনটি মোড়বে, এটি প্রম্পটে ওভাররাইট করে। ইনপুটটির দ্বিতীয় লাইনটি টার্মিনালের ঠিক প্রান্তে চলে, এবং তারপরে সঠিকভাবে মোড়ানো হয়।

সুতরাং, স্পষ্টতই কিছু প্রম্পটের প্রস্থের সাথে বিশৃঙ্খলা করছে। আমি কীভাবে বাশকে পিএস 1 স্ট্রিংয়ের দৈর্ঘ্য এএনএসআই এর অব্যাহতি কোড অনুসারে নয়, প্রম্পটের প্রকৃত প্রদর্শিত দৈর্ঘ্য অনুসারে নির্ধারণ করতে পারি?

উত্তর:


21

bash\[ \]"প্রদর্শিত দৈর্ঘ্য" নির্ধারণ করতে ব্যবহার করে: এই দুটি পলায়নের মধ্যে পাঠ্যটি ছাপ ছাপানো নয় এবং মোট দৈর্ঘ্যে গণনা করা হয় না; অন্য সব কিছু।

আপনার ভেরিয়েবলগুলির সাথে সমস্যা আছে বলে মনে হচ্ছে: bright='\[[01m\]'আসলে কোনও ইসি অক্ষর অন্তর্ভুক্ত নয়, তাই [01mসাধারণ পাঠ্য হিসাবে মুদ্রিত হয় তবে দৈর্ঘ্যে গণনা করা হয় না। এটা হওয়া উচিত '\[\e[01m\]'। অন্যান্য সমস্ত ভেরিয়েবলের জন্য একই।


সম্পর্কিত:

  • ব্যাশ, আপনি লাগাতে পারেন \$(hg_status)করার $PS1একটি পৃথক প্রয়োজন ছাড়াই সরাসরি PROMPT_COMMAND

1
এটি একটি আংশিক স্থিরতা সরবরাহ করে; লাইন দৈর্ঘ্য এখন সঠিকভাবে সনাক্ত করা হয়েছে, তবে এটি প্রম্পটে প্রথম লাইন মোড়ানো লেখার সাথে সমস্যার সমাধান করে না।
ক্রিস আর

1
ক্রিস আর: আমি আপনার প্রম্পটটি চেষ্টা করেছিলাম এবং কেবল উবুন্টু ১২.০৪-তে বাশের কাজকর্মের '\[[সাথে প্রতিস্থাপন করেছি '\[\e[। এস্কেপিংয়ের রঙগুলি (এবং কিছু অপ্রাসঙ্গিক থেকে প্রম্পট-আকারের অংশগুলি) \[...\]আমাকেও সহায়তা করেছিল তবে আপনার চেয়ে আমার অনেক বেশি জটিল পিএস 1 রয়েছে (একই লাইনে ডান প্রান্তযুক্ত পাঠ্যটি প্রম্পট এবং নীচের ডানদিকে পাঠ্যের মতো) কোণ)। এটি প্রাথমিক মোড়ক এবং ওভারল্যাপিং মোড়কের সমস্যা উভয়ই স্থির করে।
TWiStErRob
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.