আমি কীভাবে zsh এর ভিম মোডটি কাস্টমাইজ করব?


25

ঠিক আছে, তাই আমি অবশেষে দুর্দান্ত পরিবর্তন করেছি। আমার .zhenv- এ, আমি আমার সম্পাদনা পরিবর্তন করেছি:

export EDITOR=vim

আমার কাছে বেশ কয়েকটি প্রশ্ন রয়েছে যেগুলি এতই ছোট যে আমি তাদের জন্য পৃথক প্রশ্ন শুরু করতে চাইনি want এখানে তারা:

  1. ভিএম এর মতো সন্নিবেশ মোড এবং কমান্ড মোডের মধ্যে পার্থক্য করার জন্য আমি কীভাবে zsh পাব? সাধারণত এটি কার্সারটিকে আন্ডারলাইন থেকে ভিএম-এর মতো একটি ব্লকে পরিবর্তন করবে তবে নীচে পাঠ্য প্রদর্শন করাও কাজ করবে।

  2. আমি কীভাবে এটি আরও ভিমের মতো অভিনয় করতে পারি? উদাহরণস্বরূপ, আমি বরং এটি ডিফল্টরূপে কমান্ড মোডে থাকতাম এবং একটি আদেশের পরে এটি থেকে বেরিয়ে যাতাম না।


//, কমান্ড-লাইন সম্পাদনাগুলির সাথে আপনি কি কোনও অদ্ভুত আচরণ পাচ্ছেন? আমি মধ্যে চলমান করে থাকেন ~সন্নিবেশিত পেয়ে চরিত্র যখন আমি টিপতে Deleteমুখ্য zsh। আমি এটি সম্পর্কে এখানে একটি প্রশ্ন জিজ্ঞাসা করেছি: superuser.com/questions/997593/…
নাথান বাসানিজ

উত্তর:


25

) ( http://zshwiki.org/home/example/zlewidgets এবং http://pthree.org/2009/03/28/add-vim-editing-mode-to-your-zsh-prompt/ দেখুন ) :

ফাংশন zle-line-init zle-keymap- নির্বাচন
    আরপিএস 1 = "$ {$ {কেইম্যাপ / ভিসমডি / - সাধারণ -} / (প্রধান | ভিনস) / - ইনসার্ট -}"
    RPS2 = $ RPS1
    zle রিসেট-প্রম্পট
}
zle -N zle-line-init
zle -N zle-keymap- নির্বাচন করুন

কোথায়:

  • "আরপিএস" বলতে 'ডান প্রম্পট স্ট্রিং' বোঝায় এবং টার্মিনালের ডানদিকে উপস্থিত প্রম্পটটি সংজ্ঞায়িত করে এবং {{ভেরিয়েবল / প্যাটার্ন / রিপ্লেসমেন্ট} বাক্য গঠনটি 'প্যারামিটার সম্প্রসারণ' এর, দেখুন: http: // মাইউকি .wooledge.org / বাশপত্র # প্যারামিটার_অপারেশন

  • 'zle -N' ব্যবহারকারীর দ্বারা নির্ধারিত উইজেটগুলির 'zle-line-init' এবং 'zle-keymap-પસંદ' আবদ্ধ (একই নামের শেল ফাংশনগুলিতে) আবদ্ধ হতে পারে, যাতে লাইন সম্পাদক যখন আরম্ভ করা হয় তখন তাদের ডাকা হবে এবং কীম্যাপটি যথাক্রমে পরিবর্তিত হয়েছে, দেখুন: http://zsh.sourceforge.net/Doc/Release/Zsh-Line-Editor.html#SEC125

) আমি সন্দেহ করি যে এটি করতে আপনাকে আরও একটি zsh- উইজেট লিখতে হবে, প্রথম সমস্যার জন্য দুটি লিঙ্কের মধ্যে প্রথমটি দ্বারা অনুপ্রাণিত হন।


22

মাল্টি-লাইন প্রম্পটগুলি ব্যবহার করার সময় আকিরের সমাধানটিতে নিম্নলিখিত সমস্যা রয়েছে: ইনস থেকে সেন্টিমিডি মোডে যাওয়ার সময়, প্রম্পট পুনর্নির্মাণের ফলে পূর্ববর্তী আউটপুট থেকে কয়েকটি লাইন মুছে ফেলা হবে (এবং নতুন প্রম্পটটি উপরে কয়েকটি লাইন প্রদর্শিত হবে)। আপনার প্রম্পটে কত লাইন রয়েছে তার উপর কত লাইন নির্ভর করে।

এটির সাথে মোকাবিলা করার উপায়টি সেখানে zle-line-finishব্যবহার zle reset-promptনা করেই ব্যবহার করা। একটি উদাহরণ:

# perform parameter expansion/command substitution in prompt
setopt PROMPT_SUBST

vim_ins_mode="[INS]"
vim_cmd_mode="[CMD]"
vim_mode=$vim_ins_mode

function zle-keymap-select {
  vim_mode="${${KEYMAP/vicmd/${vim_cmd_mode}}/(main|viins)/${vim_ins_mode}}"
  zle reset-prompt
}
zle -N zle-keymap-select

function zle-line-finish {
  vim_mode=$vim_ins_mode
}
zle -N zle-line-finish

এবং তারপরে আপনি এটিকে আপনার ডান প্রম্পটে যুক্ত করতে পারেন, উদাহরণস্বরূপ:

RPROMPT='${vim_mode}'

এটি সম্পর্কে আমার ব্লগ পোস্ট থেকে সরাসরি:


এই উত্তরে প্রচুর ভোট পাওয়া উচিত। এই সমাধানটি আমি এই প্রথম দেখেছি এবং অন্যরা যেখানে না করে সেখানে এটি কাজ করে। আমি zle-line-initউইজেটের সাথে প্রায় এক ঘন্টার ফিডিং ব্যয় করেছিলাম কোনও লাভ হয়নি। পাভেল কী সরবরাহ করেছে এবং বিঙ্গোটি মিলিয়ে দেখতে এটি পরিবর্তন করেছে!
কলিন আর

ধন্যবাদ! এটি এখনও 100% বুলেটপ্রুফ নয় - সময়ে সময়ে আমি এমন একটি পরিস্থিতি অনুভব করি যেখানে আমার আগের আউটপুট থেকে কিছু লাইন মুছে ফেলা হয় - তবে এটি এত কমই ঘটে যে আমি কেবল এড়িয়ে চলেছি।
পাওয়ে গোসিকি

1
RPROMPT2পাশাপাশি সেট করা উচিত যাতে স্থিতি ধারাবাহিকতা লাইনে প্রদর্শিত হয়। এছাড়াও, এটি ব্যবহার করার সময় আপনি setopt transient_rpromptএমনটি করতে চাইতে পারেন যাতে পূর্বে গৃহীত লাইনের মোডগুলি প্রদর্শিত না হয়।
কিউএক্সএক্স

একটি জিনিস যা এখনও অনুপস্থিত: আমি যদি ইমাস মোডে ফিরে যাই (তবে bindkey -e) এটি এখনও দেখায় [INS]
ড্যানিয়েল

1
@ শেফ্লো আপনি আমার এই সেটআপটির বর্তমান সংস্করণটি এখানে দেখতে পাবেন: github.com/pjg/dotfiles/blob/master/.zshrc#L518-L584 - সম্ভবত এটি আপনাকে সহায়তা করবে
পাউয়ে গোসিকি


0

নীচে আপনাকে একটি পরিবর্তিত কার্সার এবং আপনি যে মোডে আছেন তা প্রদর্শন করার একটি প্রম্পট দিয়ে সেট আপ করবে You DEFAULT_VI_MODEআপনি হয় viinsবা তে পরিবর্তন করতে পারেন vicmd। শুরু করতে কেবল নীচে একটি তাজাতে পেস্ট করুন .zshrc:

# Prefer vi shortcuts
bindkey -v
DEFAULT_VI_MODE=viins
KEYTIMEOUT=1

__set_cursor() {
    local style
    case $1 in
        reset) style=0;; # The terminal emulator's default
        blink-block) style=1;;
        block) style=2;;
        blink-underline) style=3;;
        underline) style=4;;
        blink-vertical-line) style=5;;
        vertical-line) style=6;;
    esac

    [ $style -ge 0 ] && print -n -- "\e[${style} q"
}

# Set your desired cursors here...
__set_vi_mode_cursor() {
    case $KEYMAP in
        vicmd)
          __set_cursor block
          ;;
        main|viins)
          __set_cursor vertical-line
          ;;
    esac
}

__get_vi_mode() {
    local mode
    case $KEYMAP in
        vicmd)
          mode=NORMAL
          ;;
        main|viins)
          mode=INSERT
          ;;
    esac
    print -n -- $mode
}

zle-keymap-select() {
    __set_vi_mode_cursor
    zle reset-prompt
}

zle-line-init() {
    zle -K $DEFAULT_VI_MODE
}

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

# Optional: allows you to open the in-progress command inside of $EDITOR
autoload -Uz edit-command-line
bindkey -M vicmd 'v' edit-command-line
zle -N edit-command-line

# PROMPT_SUBST enables functions and variables to re-run everytime the prompt
# is rendered
setopt PROMPT_SUBST

# Single quotes are important so that function is not run immediately and saved
# in the variable
RPROMPT='$(__get_vi_mode)'

দ্রষ্টব্য: আমি কেবল এটি zsh (5.3.1) দিয়ে MacOS (10.12.6) তে টার্মিনাল.এপ (2.7.3) এ পরীক্ষা করেছি। এছাড়াও, আপনি যদি কখনও যুক্ত করেন edit-command-lineতবে মোডটিও সঠিকভাবে সেট হয়ে যাবে।

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