আমার zsh প্রম্পট শো মোটি ভিআই মোডে করুন


44

আমি ব্যবহার করি bindkey -v(বাশ-এর্সের জন্য set -o viআমি মনে করি যে zsh তেও কাজ করে) বা vi (এম) মোড। তবে এটি আমাকে বাগ দেয় যে আমি সন্নিবেশ মোডে বা কমান্ড মোডে আছি কিনা তা বলার জন্য আমার কাছে কোনও ভিজ্যুয়াল কিউ নেই। কেউ কি জানেন যে আমি কীভাবে আমার প্রম্পটটি মোডটি প্রদর্শন করতে পারি?

উত্তর:


25

আমি দেখেছি এই মাধ্যমে SU । যদিও আমি এখনও এটি নিজের জন্য কাস্টমাইজ করছি তবুও এখানে বেসিক উদাহরণটি রয়েছে:

function zle-line-init zle-keymap-select {
    RPS1="${${KEYMAP/vicmd/-- NORMAL --}/(main|viins)/-- INSERT --}"
    RPS2=$RPS1
    zle reset-prompt
}

zle -N zle-line-init
zle -N zle-keymap-select

আমি সত্যিই এটি বুঝতে না পারলে আমি এটি ব্যাখ্যা করব


1
আমি এই পদ্ধতির চেষ্টা করেছিলাম কিন্তু একটি সমস্যা পেয়েছি। আপনি যদি CTRL+Cভিআই-কমান্ড মোডে থাকাকালীন কিছু করেন তবে প্রম্পটটি পুনরায় সেট হয়ে যাবে, তবে আপনি যখন সত্যই সন্নিবেশ মোডে উপস্থিত হবেন তখন কমান্ড মোডে উপস্থিত আছেন indicate zle-line-initalwaysোকানো মোডে সূচকটি সর্বদা পরিবর্তন করা উচিত। কিছু কারণের $KEYMAPজন্য zle-line-init বলা হলে সঠিকভাবে আপডেট হয় না।
প্যাট্রিক

2
zle reset-promptআমার জন্য 1 মুছবে (বা তার বেশি) প্রম্পট উপরে লাইন (আপনার প্রম্পট যদি একাধিক লাইন হয়) যখন redrawing :( এই showstopper হয়।
Pawel Gościcki

@ পাউয়েজিওসিকি আপনার কাছে পিএস 1 এর দুটি বা ততোধিক লাইন থাকলে এটি একটি সমস্যা বলে মনে হয়।
মেটাফক্স

@ মেটাফক্স আমি জানি, আমি কেন "(যদি আপনার প্রম্পটটি মাল্টলাইন হয়)" বলেছি। এর জন্য কোনও ফিক্স?
পাউয়ে গোকিচি

@ PawełGościcki আফসোস দুঃখিত আমি কোনওভাবেই বন্ধুত্বগুলি, খারাপ অভ্যাসে শব্দগুলি এড়িয়ে গেছি। না, আমি এর জন্য কোনও ফিক্স পেলাম না। আপনি কোন প্ল্যাটফর্মে আছেন? ভাবছিলাম যে এটি ওএস এক্স নির্দিষ্ট কিনা।
মেটাফক্স

18

আপনি ইতিমধ্যে খুঁজে পেয়েছেন zle-keymap-selectযা মোড পরিবর্তিত হলে কার্যকর হয়। আপনার টার্মিনালটি কী সমর্থন করে তার উপর নির্ভর করে আপনি প্রম্পটের চেয়ে কিছু অন্যান্য ভিজ্যুয়াল ইন্ডিকেটর সেট করতে এটি ব্যবহার করতে পারেন (এবং অবশ্যই আপনার মোড সূচক প্রদর্শনে স্বাদ)।

কার্সারের আকৃতি পরিবর্তন করার জন্য একটি স্ট্যান্ডার্ড টার্মিনফো ক্ষমতা রয়েছে । তবে কিছু টার্মিনাল উভয় মোডে একই কার্সার প্রদর্শন করে। এক্সটার্মের কম দৃশ্যমান কার্সারের ধারণাটি এটি জ্বলজ্বলে করে তোলে (এবং এটি অবশ্যই -bcকমান্ড লাইন আর্গুমেন্ট বা cursorBlinkসংস্থান দিয়ে সক্ষম করা উচিত )।

zle-keymap-select () {
  case $KEYMAP in
    vicmd) print -rn -- $terminfo[cvvis];; # block cursor
    viins|main) print -rn -- $terminfo[cnorm];; # less visible cursor
  esac
}

কিছু টার্মিনাল সহ, আপনি কার্সার রঙটি print -n '\e]12;pink\a'(রঙের নাম অনুসারে) বা print -n '\e]12;#abcdef\a'(আরজিবি স্পেসিফিকেশন দ্বারা ) পরিবর্তন করতে পারেন । এই ক্রমগুলি ctlseqsফাইলের এক্সটার্ম ডকুমেন্টেশনে বর্ণিত হয়েছে ; আধুনিক টার্মিনাল এমুলেটরগুলি সাধারণত xterm অনুকরণ করে যদিও তারা এর সমস্ত বৈশিষ্ট্য সমর্থন করে না।


কিছু কারণে আমি পেতে mainজন্য KEYMAPপরিবর্তে viins, নিশ্চিত করুন না কেন।
গ্রামীণ

1
@ গ্রায়েম mainএকটি উপনাম viinsবা এর emacsউপর নির্ভর করে zsh আপনার প্রিয় সম্পাদকটি vi শুরু হয়েছিল কিনা তা ভেবেছিল কিনা it আমি ভাবলাম এটি viinsথেকে মোডটি স্যুইচ করার সময় এটি ব্যবহার করবে vicmd, তবে মনে হয় এটি mainপরিবর্তে ব্যবহার করে। আপডেট করা হয়েছে।
গিলস 'অশুভ হওয়া বন্ধ করুন'

1
আপনার এখনও zle-line-init(বা যে কোনও বিকল্প) দ্বিগুণ হওয়া দরকার যেহেতু zle-keymap-selectপ্রবেশের কী-ম্যাপ পরিবর্তন করলে কল করা হবে না।
গ্রামীণ

9

রিসেট প্রম্পট একাধিক লাইন অনুরোধ জানানো মাধ্যমে ব্যবহার করতে কোনো সমস্যা মানুষের জন্য, এই জন্য আমাকে কাজ: http://zeitlens.com/posts/2014-06-29-howto-zsh-vi-style.html সঙ্গে একযোগে HTTPS: // stackoverflow.com/questions/3622943/zsh-vi-mode-status-line আমি শেষ করে শেষ করেছি:

terminfo_down_sc=$terminfo[cud1]$terminfo[cuu1]$terminfo[sc]$terminfo[cud1]

function insert-mode () { echo "-- INSERT --" }
function normal-mode () { echo "-- NORMAL --" }

precmd () {
    # yes, I actually like to have a new line, then some stuff and then 
    # the input line
    print -rP "
[%D{%a, %d %b %Y, %H:%M:%S}] %n %{$fg[blue]%}%m%{$reset_color%}"

    # this is required for initial prompt and a problem I had with Ctrl+C or
    # Enter when in normal mode (a new line would come up in insert mode,
    # but normal mode would be indicated)
    PS1="%{$terminfo_down_sc$(insert-mode)$terminfo[rc]%}%~ $ "
}
function set-prompt () {
    case ${KEYMAP} in
      (vicmd)      VI_MODE="$(normal-mode)" ;;
      (main|viins) VI_MODE="$(insert-mode)" ;;
      (*)          VI_MODE="$(insert-mode)" ;;
    esac
    PS1="%{$terminfo_down_sc$VI_MODE$terminfo[rc]%}%~ $ "
}

function zle-line-init zle-keymap-select {
    set-prompt
    zle reset-prompt
}
preexec () { print -rn -- $terminfo[el]; }

zle -N zle-line-init
zle -N zle-keymap-select

5

আপনি VimMode চেষ্টা করতে পারেন


4
আমি কিছুটা কম লিঙ্কিশ এবং কিছুটা ব্যাখ্যামূলক কিছু আশা করছিলাম। আমি জিনিসগুলি কীভাবে কাজ করে তা জানতে আগ্রহী।
xenoterracide

1
আসলে এটি সব আছে। মন্তব্যগুলি ফাংশনগুলি দেখুন এবং কীভাবে তারা মোড পরিবর্তনের ইভেন্টগুলির সাথে আবদ্ধ।
মার্টিন

5

আমি zsh এ 'ব্লক' এবং 'বিম' আকারের মধ্যে কার্সার পরিবর্তন করতে এটি ব্যবহার করি:

(সাথে পরীক্ষিত Termite , জিনোম-টার্মিনাল এবং সঙ্গী-টার্মিনাল )

# vim mode config
# ---------------

# Activate vim mode.
bindkey -v

# Remove mode switching delay.
KEYTIMEOUT=5

# Change cursor shape for different vi modes.
function zle-keymap-select {
  if [[ ${KEYMAP} == vicmd ]] ||
     [[ $1 = 'block' ]]; then
    echo -ne '\e[1 q'

  elif [[ ${KEYMAP} == main ]] ||
       [[ ${KEYMAP} == viins ]] ||
       [[ ${KEYMAP} = '' ]] ||
       [[ $1 = 'beam' ]]; then
    echo -ne '\e[5 q'
  fi
}
zle -N zle-keymap-select

# Use beam shape cursor on startup.
echo -ne '\e[5 q'

# Use beam shape cursor for each new prompt.
preexec() {
   echo -ne '\e[5 q'
}

এটি কেবলমাত্র টার্মিনাল এবং টার্মিনাল এমুলেটরগুলিতে কাজ করবে যা DECSCUSR বোঝে।
জেডিবিপি

1
আমি এই পছন্দ। আমি আশঙ্কা করি যে প্রেক্সকে লেখা অন্য ব্যবহারের সাথে যোগাযোগ করতে পারে, তাই আমি এটির add-zsh-hookমতো ব্যবহারের জন্য এটি কিছুটা সংশোধন করেছি : gist.github.com/MatrixManAtYrService/…
ম্যাট্রিক্সম্যানআটিআইআরসিয়ার্সেস

4

আই-বিম এবং ব্লক (আন্ডারস্কোর, ব্যবহারের জন্য \033[4 q) এর মধ্যে কার্সারের আকার পরিবর্তন করার জন্য আরও একটি সমাধান । এটি আপনার যুক্ত করুন ~/.zshrc

zle-keymap-select () {
if [ $KEYMAP = vicmd ]; then
    printf "\033[2 q"
else
    printf "\033[6 q"
fi
}
zle -N zle-keymap-select
zle-line-init () {
zle -K viins
printf "\033[6 q"
}
zle -N zle-line-init
bindkey -v

Https://bbs.archlinux.org/viewtopic.php?id=95078 থেকে পরিবর্তিত । জিনোম-টার্মিনাল 3.22 পরীক্ষিত।


হালনাগাদ

তবুও কার্সার আকার পরিবর্তন করার জন্য আরও একটি সমাধান এখানে পাওয়া যাবে । এটি আপাতভাবে আইটার্ম 2 এর জন্য কাজ করে যা আমার কাছে পরীক্ষার উপায় নেই তবে এটি অন্য কারও পক্ষে উপযোগী হলে এখানে এটি যুক্ত করা উচিত। আপনার চূড়ান্ত সংযোজন ~/.zshrcহবে

function zle-keymap-select zle-line-init
{
    # change cursor shape in iTerm2
    case $KEYMAP in
        vicmd)      print -n -- "\E]50;CursorShape=0\C-G";;  # block cursor
        viins|main) print -n -- "\E]50;CursorShape=1\C-G";;  # line cursor
    esac

    zle reset-prompt
    zle -R
}

function zle-line-finish
{
    print -n -- "\E]50;CursorShape=0\C-G"  # block cursor
}

zle -N zle-line-init
zle -N zle-line-finish
zle -N zle-keymap-select

1
আমি নিশ্চিত করেছি যে iTerm2 এর জন্য আপডেট হওয়া স্ক্রিপ্টটি সত্যই কাজ করেছে।
জেসন ডেনি

প্রথম স্ক্রিপ্টটি কেবলমাত্র টার্মিনাল এবং টার্মিনাল এমুলেটরগুলিতে কাজ করবে যা DECSCUSR বোঝে।
জেডিবিপি

এটি সত্যিই মার্জিত সমাধান যা আমার শেলটি বিশৃঙ্খল করে না
tsturzl

3

আমি বর্তমানে বুলেট ট্রেন থিম সহ জেডএস ব্যবহার করছি । সেবাস্তিয়ান ব্লাসকের উত্তরের দেওয়া উদাহরণ অনুসরণ করে আমি কোড বেলো দিয়ে শেষ করেছি

bindkey -v
KEYTIMEOUT=1

function zle-line-init zle-keymap-select {
    case ${KEYMAP} in
        (vicmd)      BULLETTRAIN_PROMPT_CHAR="N" ;;
        (main|viins) BULLETTRAIN_PROMPT_CHAR="I" ;;
        (*)          BULLETTRAIN_PROMPT_CHAR="I" ;;
    esac
    zle reset-prompt
}

zle -N zle-line-init
zle -N zle-keymap-select

এটি কেবলমাত্র ডিফল্ট $ অক্ষরে N কে স্বাভাবিক মোডে এবং আমি মোড sert োকানোর জন্য পরিবর্তন করবে ।

আমি যখন সাধারণ মোডে Ctrl+ টিপব তখন এই চিত্রটি একটি উদাহরণ C:

এখানে চিত্র বর্ণনা লিখুন


2

সেবাস্তিয়ান ব্লাসকের পোস্ট থেকে ভিত্তি করে এখানে আরও একটি সংস্করণ রয়েছে । এটি যতটা সম্ভব অনাহূত হওয়ার উদ্দেশ্যে করা হয়েছিল, অন্য সমস্ত সমাধান হিসাবে আমি অতিরিক্ত অতিরিক্ত লাইন, ডানদিকে অবস্থিতি বা যুক্ত অক্ষরগুলি খুঁজে পেতে পারি।

$সাধারণ মোড সক্ষম থাকলে এটি কেবল সাদা থেকে লাল রঙের রঙ পরিবর্তন করে । আপনার পছন্দ অনুসারে প্রম্পটটি সম্পাদনা করুন

bindkey -v
function zle-line-init zle-keymap-select {
    case ${KEYMAP} in
        (vicmd)      PROMPT=$'%{\e[0;32m%}%~%{\e[0m%} %{\e[0;31m%}$%{\e[0m%} ' ;;
        (main|viins) PROMPT=$'%{\e[0;32m%}%~%{\e[0m%} $ ' ;;
        (*)          PROMPT=$'%{\e[0;32m%}%~%{\e[0m%} $ ' ;;
    esac
    zle reset-prompt
}

zle -N zle-line-init
zle -N zle-keymap-select

2

oh-my-zshব্যবহারকারীদের জন্য একটি সংস্করণ

oh-my-zshনামক একটি প্লাগইন রয়েছে vi-modeযা এখানে পাওয়া যাবে:

robbyrussell / উহু-মাই-zsh / plugins / এখানে ষষ্ঠ-মোড

আমি আমার প্লাগইনগুলি পরিচালনা করতে অ্যান্টিজেন ব্যবহার করি, তাই এটিতে এটি যুক্ত করার মতোই সহজ ছিল .zshrc:

antigen bundle vi-mode

1

Zsh-তেজ-মোড প্লাগইন সন্নিবেশ, কমান্ড, অনুসন্ধান, প্রতিস্থাপন, এবং চাক্ষুষ মোড জন্য একটি সূচক দেখাতে সক্ষম হয়। এটি বিভিন্ন জেডএলই হুকগুলিতে প্রবেশের জন্য অন্যান্য উত্তরের মৌলিক কৌশলটি ব্যবহার করে (zle-keymap-select, zle-isearch-update ইত্যাদি)। এটি [[ $ZLE_STATE = *overwrite* ]]প্রতিস্থাপন মোডের জন্য পরীক্ষা করে। এটি $REGION_ACTIVEভিজ্যুয়াল মোড সনাক্ত করতে চেক করে।

আইজিক মোড ত্যাগ করার সময় জেডএসএইচ কীভাবে ইভেন্টগুলিতে আগুন জ্বালিয়ে দেয় তার কয়েকটি কৌতূহলের দ্বারা যুক্তিটি জটিল।

মডিউলটির আর একটি দুর্দান্ত বৈশিষ্ট্য হল মোডের উপর ভিত্তি করে কার্সার আকার এবং রঙ পরিবর্তন করার ক্ষমতা। উদাহরণস্বরূপ, আপনি INSERT মোডে একটি উল্লম্ব বার এবং লক মোডে একটি জ্বলজ্বলরেখা ব্যবহার করতে পারেন।


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