পিএস 1-এ zsh ডান-জায়েজ করুন


21

আমি একটি ডান সারিবদ্ধ অংশ সহ একটি বহু-লাইন zsh প্রম্পট চাই, এটি দেখতে এরকম কিছু দেখাবে:

2.nate@host:/current/dir                                               16:00
->

আমি zsh এ RPROMPT সম্পর্কে জানি, তবে এটিতে আপনার প্রম্পটের বিপরীতে ডান-প্রান্তিক প্রম্পট রয়েছে, যা আপনার টাইপের মতো পাঠ্যের একই লাইনে রয়েছে।

মাল্টি-লাইন কমান্ড প্রম্পটের প্রথম লাইনে ডান-প্রান্তিককরণের কোনও উপায় আছে কি? আমি PS1 ভেরিয়েবলের মধ্যে একটি ডাইরেক্টিভের সন্ধান করছি যা বলছে যে 'ডান সারিবদ্ধ এখনই' বা একটি ভেরিয়েবল যা পিএস 1 এর কাছে পিআরএমএমপিটি প্রম্পটে কী।

ধন্যবাদ!

উত্তর:


12

আপনি এখানে একটি বিস্তারিত উত্তর এবং একটি উদাহরণ পাবেন । স্ক্রিনের ডানদিকে পাঠ্যের অবস্থান গণনা করতে পিএস 1 এর আগে লাইনটি precmdকলব্যাক, ব্যবহার $COLUMNSএবং কিছুটা গণিত ব্যবহার করার ধারণা write পালানোর ক্রমগুলির জ্ঞান আপনাকে কার্সার পজিশনিং এবং রঙিন করতে সহায়তা করবে।

ওহ মাই জেডএসএইচ থেকে কোনও থিম ব্যবহার করা অন্য সমাধান হতে পারে ।


10

আমি এটিও খুঁজছিলাম আমার জন্য, precmd()টানা রেখাগুলি পুনরায় আকারগুলিতে পুনরায় চিত্রিত হয় না বা যখন ^Lপর্দা সাফ করার জন্য ব্যবহৃত হয় তখন তা আমার কাছে চুলকানি বজায় রেখেছিল। আমি এখন যা করছি তা হ'ল এএনএসআই এস্কেপ সিকোয়েন্সগুলি ব্যবহার করে কার্সারটিকে কিছুটা সরিয়ে নিতে। যদিও আমি সন্দেহ করি যে এগুলি দেওয়ার আরও একটি দুর্দান্ত উপায় আছে তবে এটি আমার পক্ষে কাজ করছে:

_newline=$'\n'
_lineup=$'\e[1A'
_linedown=$'\e[1B'

PROMPT=...whatever...${_newline}...whatever...
RPROMPT=%{${_lineup}%}...whatever...%{${_linedown}%}

মনে রাখবেন যে zsh ম্যানুয়ালটিতে বলা হয়েছে যে% {...% lite আক্ষরিক অব্যাহতি ক্রমের জন্য যা কার্সারটি সরায় না । তবুও, আমি এগুলি ব্যবহার করছি কারণ তারা এটির সামগ্রীর দৈর্ঘ্যটি উপেক্ষা করার অনুমতি দেয় (কীভাবে কীভাবে তাদের ব্যবহার করে কার্সারটি সরানো যায় তা পালনের বিষয়টি কীভাবে নির্ধারণ করতে পারে তা বুঝতে পারেনি)


কিছু সময়ের জন্য এটির সাথে খেলার পরে, এটি মাঝে মধ্যে গণ্ডগোল করে এবং কার্সার বা তারিখটিকে ভুল লাইনে ফেলে দেয়। যদিও এত বড় ব্যাপার নয়; এটি সংশোধন করতে কেবল এন্টার টিপুন।
এমপেন

3

এই মুহুর্তে আমি এই জিনিসটি কীভাবে কনফিগার করেছি। এই পদ্ধতির জন্য কোনও এস্কেপ-সিকোয়েন্স ম্যানিপুলেশনগুলির প্রয়োজন নেই, তবে প্রাথমিক প্রম্পটের জন্য আপনার কাছে দুটি পৃথক ভেরিয়েবল রয়েছে: PS1রঙ সহ এবং NPS1ছাড়াই।

# Here NPS1 stands for "naked PS1" and isn't a built-in shell variable. I've
# defined it myself for PS1-PS2 alignment to operate properly.
PS1='%S%F{red}[%l]%f%s %F{green}%n@%m%f %B%#%b '
NPS1='[%l] %n@%m # '
RPS1='%B%F{green}(%~)%f%b'

# Hook function which gets executed right before shell prints prompt.
function precmd() {
    local expandedPrompt="$(print -P "$NPS1")"
    local promptLength="${#expandedPrompt}"
    PS2="> "
    PS2="$(printf "%${promptLength}s" "$PS2")"
}

ভেরিয়েবলের মধ্যে স্ট্রিংয়ের দৈর্ঘ্য পাওয়ার জন্য, এবং স্পেস সহ বাম-হাতের প্যাডিংয়ের print -Pজন্য প্রম্পট প্রসারণের ব্যবহারটি লক্ষ্য করুন । উভয় এবং অন্তর্নির্মিত কমান্ডগুলি, সুতরাং কোনও পারফরম্যান্স হিট হওয়া উচিত নয়।${#variable}printf "%Nd"Nprintprintf


1

আসুন এই বিন্যাস সহ প্রম্পট সংজ্ঞা দিন:

top_left              top_right
bottom_left        bottom_right

এটি করার জন্য, আমাদের একটি ফাংশন প্রয়োজন যা আমাদের জানায় যে মুদ্রিত হওয়ার পরে প্রদত্ত স্ট্রিংটি কত অক্ষর গ্রহণ করে।

# Usage: prompt-length TEXT [COLUMNS]
#
# If you run `print -P TEXT`, how many characters will be printed
# on the last line?
#
# Or, equivalently, if you set PROMPT=TEXT with prompt_subst
# option unset, on which column will the cursor be?
#
# The second argument specifies terminal width. Defaults to the
# real terminal width.
#
# Assumes that `%{%}` and `%G` don't lie.
#
# Examples:
#
#   prompt-length ''            => 0
#   prompt-length 'abc'         => 3
#   prompt-length $'abc\nxy'    => 2
#   prompt-length '❎'          => 2
#   prompt-length $'\t'         => 8
#   prompt-length $'\u274E'     => 2
#   prompt-length '%F{red}abc'  => 3
#   prompt-length $'%{a\b%Gb%}' => 1
#   prompt-length '%D'          => 8
#   prompt-length '%1(l..ab)'   => 2
#   prompt-length '%(!.a.)'     => 1 if root, 0 if not
function prompt-length() {
  emulate -L zsh
  local COLUMNS=${2:-$COLUMNS}
  local -i x y=$#1 m
  if (( y )); then
    while (( ${${(%):-$1%$y(l.1.0)}[-1]} )); do
      x=y
      (( y *= 2 ));
    done
    local xy
    while (( y > x + 1 )); do
      m=$(( x + (y - x) / 2 ))
      typeset ${${(%):-$1%$m(l.x.y)}[-1]}=$m
    done
  fi
  echo $x
}

আমাদের আর একটি ফাংশন প্রয়োজন যা দুটি আর্গুমেন্ট নিয়ে এবং পর্দার বিরোধী পক্ষগুলিতে এই যুক্তিগুলির সাথে একটি সম্পূর্ণ জরিমানা মুদ্রণ করে।

# Usage: fill-line LEFT RIGHT
#
# Prints LEFT<spaces>RIGHT with enough spaces in the middle
# to fill a terminal line.
function fill-line() {
  emulate -L zsh
  local left_len=$(prompt-length $1)
  local right_len=$(prompt-length $2 9999)
  local pad_len=$((COLUMNS - left_len - right_len - ${ZLE_RPROMPT_INDENT:-1}))
  if (( pad_len < 1 )); then
    # Not enough space for the right part. Drop it.
    echo -E - ${1}
  else
    local pad=${(pl.$pad_len.. .)}  # pad_len spaces
    echo -E - ${1}${pad}${2}
  fi
}

অবশেষে আমরা যে সেট একটি ফাংশন সংজ্ঞায়িত করতে পারেন PROMPTএবং RPROMPT, নির্দেশ ZSH প্রতি প্রম্পট, এবং সেট উপযুক্ত প্রম্পট সম্প্রসারণ অপশন আগে কল করতে:

# Sets PROMPT and RPROMPT.
#
# Requires: prompt_percent and no_prompt_subst.
function set-prompt() {
  emulate -L zsh
  local git_branch="$(git rev-parse --abbrev-ref HEAD 2>/dev/null)"
  git_branch=${${git_branch//\%/%%}/\\/\\\\\\}  # escape '%' and '\'

  local top_left='%F{blue}%~%f'
  local top_right="%F{green}${git_branch}%f"
  local bottom_left='%B%F{%(?.green.red)}%#%f%b '
  local bottom_right='%F{yellow}%T%f'

  PROMPT="$(fill-line "$top_left" "$top_right")"$'\n'$bottom_left
  RPROMPT=$bottom_right
}

autoload -Uz add-zsh-hook
add-zsh-hook precmd set-prompt
setopt noprompt{bang,subst} prompt{cr,percent,sp}

এটি নিম্নলিখিত প্রম্পট উত্পাদন করে:

~/foo/bar                     master
%                             10:51
  • উপরে বাম: নীল বর্তমান ডিরেক্টরি।
  • ডানদিকে: গ্রিন গিট শাখা।
  • নীচে বাম: #মূল, %যদি না; সাফল্যের উপর সবুজ, ত্রুটি লাল।
  • নীচে ডান: হলুদ বর্তমান সময়।

আপনি মাল্টি-লাইন প্রম্পটে অতিরিক্ত বিবরণ সন্ধান করতে পারেন : এই টুকরোটিতে অনুপস্থিত উপাদান এবং সম্পূর্ণ কোড ।


1
সুপার ব্যবহারকারীকে স্বাগতম! যতক্ষণ এই তাত্ত্বিক প্রশ্নের উত্তর হতে পারে, এটা বাঞ্ছনীয় হবে উত্তর অপরিহার্য অংশের এখানে অন্তর্ভুক্ত করা, এবং রেফারেন্স এর জন্য লিঙ্ক প্রদান।
CaldeiraG

1
@ ক্যালডিরাগ আপনার পরামর্শের পরে আমি আমার উত্তরটি পুনরায় লিখেছি। এফডাব্লুআইডাব্লু, আমার আসল উত্তরের আকৃতিটি এই প্রশ্নের সর্বোচ্চ ভোট এবং গ্রহণযোগ্য উত্তর দ্বারা অবহিত হয়েছিল।
রোমান পেরপেলিটসা

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