আমি কীভাবে zsh এর ভিআই মোডটিকে বাশের ভিআই মোডের মতো আচরণ করতে পারি?


24

আমি সত্যিই zsh এর সাধারণ গতি পছন্দ করছি তবে দুটি জিনিস আমার থেকে হ্যাক বিরক্ত করছে।

  1. ইতিহাস সন্ধানে পৌঁছানোর জন্য আমাকে পালানোর আঘাত এবং স্ল্যাশ মারার মধ্যে এক মুহূর্ত অপেক্ষা করতে হবে (যদি এটি খুব দ্রুত স্ল্যাশ মারে তবে এটি বলে zsh: do you wish to see all 514 possibilities (172 lines))
  2. আঘাতের কারণে সন্নিবেশ মোডে প্রবেশ করার পরে aবা A, আমি যেখানে inোকানো মোডটি প্রবেশ করেছি সেই স্থানটি পেরিয়ে যেতে পারি না।

আমি জানি যে 2 টি ক্লাসিক ভি এর মতো, তবে আমি ভিম স্টাইলটি আরও ভাল পছন্দ করি।


যে কেউ ঘটাচ্ছে তোমাকে আঘাত আছে ডবল পলায়নের খুব বিরক্তিকর বিষয়টি চলতে থাকে তবে দয়া iদুইবার মোড সন্নিবেশ করতে ফিরে পেতে, আমি অত্যন্ত সুপারিশ করবে এই ফিক্স!
ছাচাম্বারলাইন

এখানে একটি ভাল সংক্ষিপ্তসারও রয়েছে: ডগব্ল্যাক.আইও
ওয়ার্ডস

উত্তর:


22

(1)। কিছু কারণে, বাইন্ডকি "/" এর কথা বলতে গেলে অদ্ভুত আচরণ করে: <esc>এরপরে দ্রুত অনুসরণ করা /হয় হিসাবে ব্যাখ্যা করা হয় <esc-/>। (আমি অন্য দিন এই আচরণটি পর্যবেক্ষণ করেছি; এটির কারণ কী তা পুরোপুরি নিশ্চিত নয়)) আমি জানি না এটি কোনও বাগ বা কোনও বৈশিষ্ট্য কিনা এবং যদি এটি কোনও বৈশিষ্ট্য যদি এটি অক্ষম করা যায় তবে আপনি প্রায় সহজেই এটিকে ঘিরে কাজ করতে পারেন ।

এই কী কম্বোটি সম্ভবত আবদ্ধ _history-complete-older, যা অনাকাঙ্ক্ষিত ফলাফল উত্পন্ন করছে - আপনি bindkey -Lযদি এটি হয় তবে এটি দেখতে ব্যবহার করতে পারেন।

যাহা হউক, আপনি sacrificing কিছু মনে না করেন যদি প্রকৃত <esc-/> (একত্রে চাপা, একটি জ্যা হিসাবে) বাঁধাই, আপনি পুনরায় বেঁধে এটা ষষ্ঠ-মোড ইতিহাস অনুসন্ধান কমান্ড করতে পারেন যাতে করে টাইপিং <esc>অনুসৃত দ্বারা /কোনো টাইপিং এ একই জিনিস আছে গতি. =)

যেহেতু এটি একটি জেল হিসাবে বিবেচনা করা হবে, এর ফলে প্রথমে vi কমান্ড মোডে প্রবেশের প্রভাব পড়বে না, তাই আমাদের এটি নিশ্চিত হওয়া উচিত যে এটি প্রথমে ঘটেছিল। প্রথমত, আপনাকে একটি ফাংশন সংজ্ঞায়িত করতে হবে; fpathআপনি যদি এটি ব্যবহার করেন তবে এটি আপনার কোথাও রেখে দিন বা আপনার .zshrc এ অন্যথায় রাখুন:

vi-search-fix() {
zle vi-cmd-mode
zle .vi-history-search-backward
}

বাকিগুলি আপনার .zshrc- এ কোনওভাবে যায়:

autoload vi-search-fix
zle -N vi-search-fix
bindkey -M viins '\e/' vi-search-fix

যেতে ভাল হতে হবে।

(2)। আপনি ব্যাকস্পেস কীটি নীচের হিসাবে ঠিক করতে পারেন:

`bindkey "^?" backward-delete-char`

এছাড়াও, আপনি যদি অন্য vi স্টাইল কমান্ডগুলির জন্য একই রকম আচরণ চান:

bindkey "^W" backward-kill-word 
bindkey "^H" backward-delete-char      # Control-h also deletes the previous char
bindkey "^U" backward-kill-line            

এটি অন্তর্ভুক্ত ছিল ^[/না \e/, তবে সেগুলি উভয়ই পলায়ন বলার বৈধ উপায়। পরিবর্তন পুরোপুরি কাজ করে। এখন আমি এটির সাথে আরও পুরোপুরি খেলছি, দেখে মনে হচ্ছে zsh এর vi মোড ব্যাশের তুলনায় (বা কমপক্ষে সম্পূর্ণরূপে ডিফল্টরূপে সম্পূর্ণরূপে কনফিগার করা হয়নি) সফল হয়। এর একটি উদাহরণ হ'ল এটি অনুসন্ধানের ইতিহাসের পরে আপনাকে সন্নিবেশ মোডে ফেলে দেয়। পরবর্তী অনুসন্ধান আইটেমটি খুঁজতে আমাকে হিট করতে এন কমান্ড মোডে ফিরে যেতে হবে।
চস ওয়েন্স

1
ঠিক আছে, আপনার অন্য কোনও উদাহরণ আছে কিনা তা আমি জানি না তবে আপনি যেটির উল্লেখ করেছেন সেটি আমার দোষ, জেডএসের নয়। =) যা ঘটেছে তা হ'ল আমি একটি vi-cmd মোড সম্পাদক কমান্ড vi সন্নিবেশ মোডে আবদ্ধ করেছি - কমান্ডটি শেলটি ইতিমধ্যে সেন্টিমিড মোডের মাধ্যমে প্রত্যাশা করে এবং সে অনুযায়ী আচরণ করে। আমাদের একটি সম্পাদক কমান্ড লিখতে হবে যা প্রথমে "এন্টি সেন্টিমিডি মোড" কমান্ডটি কল করে এবং তারপরে সম্পাদন করে .vi-history-search-backward। আমি এটি লিখব এবং আমার উত্তর সম্পাদনা করব - আজ পরে আবার পরীক্ষা করে দেখুন।
মার্শাল ইউবঙ্কস

ঠিক আছে, আমি আমার উত্তর আপডেট করেছি। চেষ্টা কর.
মার্শাল ইউবঙ্কস

(2) এর সাথে শ্রদ্ধার সাথে আমি যখন bindkey | grep <searchterm>কোনও শর্তের জন্য করি তখন সেগুলি সমস্তই উপসর্গযুক্ত থাকে vi-। আমার কি bindkeyকমান্ডগুলি সেটআপ করার দরকার আছে যা পূর্বসূচী নয় vi-?
অ্যাডাম_0

1
ধন্যবাদ. এই হ্যাকগুলি (এবং নীচে wjv এরও) zsh এর vi মোডটি নিকট-অব্যবহারযোগ্য থেকে দুর্দান্ত পর্যন্ত চলে। আমি একটি সুপারভাইজার অ্যাকাউন্ট তৈরি করেছি যাতে আমি আপনাকে ভোট দিতে পারি। :-)
ctrueden

14

আমি কেবল প্রশ্নের সমাধান করতে যাচ্ছি (1)।

আপনার সমস্যাটি কীটিমিওট। আমি zshzle থেকে উদ্ধৃতি (1):

যখন জেডএলই টার্মিনাল থেকে একটি কমান্ড পড়ছে, এটি এমন একটি ক্রম পড়তে পারে যা কিছু কমান্ডের সাথে আবদ্ধ থাকে এবং এটি দীর্ঘতর বাউন্ড স্ট্রিংয়ের উপসর্গও হয়। এই ক্ষেত্রে ZLE আরও অক্ষর টাইপ করা হয়েছে কিনা তা দেখার জন্য একটি নির্দিষ্ট সময় অপেক্ষা করবে এবং যদি না হয় (বা তারা আর কোনও স্ট্রিংয়ের সাথে মেলে না) এটি বাধ্যবাধকতা কার্যকর করবে। এই টাইমআউটটি KEYTIMEOUT পরামিতি দ্বারা সংজ্ঞায়িত করা হয়েছে; এর ডিফল্ট 0.4 সেকেন্ড। উপসর্গের স্ট্রিংটি কোনও কমান্ডের সাথে আবদ্ধ না হলে কোনও সময়সীমা নেই।

ইসিএসকে আঘাত করার পরে আপনি যে বিলম্বের মুখোমুখি হচ্ছেন সেটি হল 0.4s। সমাধানটি শেল স্টার্টআপ ফাইলগুলির মধ্যে একটিতে KEYTIMEOUT ঠিক 0.01 সেটে সেট করতে হবে:

export KEYTIMEOUT=1

দুর্ভাগ্যক্রমে এর একটি নক-অন প্রভাব আছে: অন্যান্য জিনিসগুলি ভুল হতে শুরু করে ...

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

ফিক্স করার জন্য Esc বাঁধে হয় কিছু কমান্ড মোডে, এইভাবে নিশ্চিত কিছু $ KEYTIMEOUT centiseconds পর ZLE প্রেরণ পায়। এখন আমরা এই খারাপ প্রভাব ছাড়াই কমান্ড মোডে ESC দিয়ে শুরু করে বাইন্ডিংগুলি রাখতে পারি। আমি বেল চরিত্রের সাথে ইসএসসি বাঁধাই, যা আমি স্ব-sertোকানো (এবং আমার শেলটি নিঃশব্দ করা হয়েছে) এর চেয়ে কম অনুপ্রবেশজনক বলে মনে করি:

bindkey -sM vicmd '^[' '^G'

আপডেট 2017:

ইসডিকে আবদ্ধ করার জন্য আমি আরও একটি ভাল সমাধান খুঁজে পেয়েছি - undefined-keyউইজেট। আমি নিশ্চিত নই যে আমি যখন এই উত্তরটি মূলত লিখেছিলাম তখন এই উইজেটটি zsh এ উপলব্ধ ছিল কিনা।

bindkey -M vicmd '^[' undefined-key

পরবর্তী সমস্যা: ডিফল্টরূপে ^ এক্স থেকে vi সন্নিবেশ মোডে কিছু দুটি-কী উইজেট রয়েছে; unus KEYTIMEOUT পুরোপুরি নীচে সেট করা থাকলে এগুলি অকেজো হয়ে যায়। আমি যা করি তা হ'ল vi সন্নিবেশ মোডে এক্স-বাইন্ড-এক্স (এটি ডিফল্টরূপে স্ব-sertোকানো); এটি সেই দুটি-কী উইজেটগুলিকে কাজ চালিয়ে যাওয়ার অনুমতি দেয়।

bindkey -rM viins '^X'

আপনি নিজের-সন্নিবেশের জন্য বাধ্যবাধকতাটি হারাতে পারেন, তবে আপনি অবশ্যই এটি অন্য কোনও কিছুকে আবদ্ধ করতে পারেন। (আমি না, যেহেতু এটির জন্য আমার কোনও ব্যবহার নেই))

গত সমস্যা (আমি এতদূর পাওয়া করেছি): ঐ মোড সন্নিবেশ ষষ্ঠ মধ্যে চট্টগ্রাম সিটি কর্পোরেশন থেকে শুরু যা হল: কিছু অবশিষ্ট ডিফল্ট কী-বাইন্ডিং যে, আমরা 'হারান "কারণে $ KEYTIMEOUT অধিকার নিচে, বুদ্ধি সেটিং করার আছে না কী কার্সার। পরিবর্তে them এক্স দিয়ে শুরু করার জন্য আমি ব্যক্তিগতভাবে তাদের পুনরায় ফিরিয়ে দিয়েছি:

bindkey -M viins '^X,' _history-complete-newer \
                 '^X/' _history-complete-older \
                 '^X`' _bash_complete-word

আপডেট 2018:

এটি উপরের পুরো বিভাগটি সরিয়ে দেয় ("আপডেটের পরে 2017") অগত্যা প্রয়োজনীয় নয়। কীবোর্ড ম্যাপিংগুলিতে মেটা কীটি ESC এর সমতুল্য হিসাবে সেট করা সম্ভব:

bindkey -mv

অতএব b এক্স আনবাইন্ড না করা এবং পরিবর্তে নেতা হিসাবে এমইটিএ চেপে (আধুনিক কীবোর্ডগুলিতে ALT বা OPT) চাপিয়ে ESC এ শুরু হওয়া কী-বাইন্ডিংগুলি অ্যাক্সেস করা সম্ভব ।

আপনার যদি কিডল এট ইত্যাদি দ্বারা বাশ থেকে জেড শেল বইটি অ্যাক্সেস থাকে তবে কী -বাইন্ডিংগুলিতে ইসি এবং মেটা এর সমতুল্যতা পৃষ্ঠা p৮-–– এর অধ্যায় ৪ এর সাইডবারে আলোচনা করা হয়েছে।


ধন্যবাদ. এই হ্যাকগুলি (এবং উপরের মার্শালগুলির দ্বারাও) zsh এর ভিআই মোডটি নিকট-অব্যবহারযোগ্য থেকে দুর্দান্ত হয়ে যায়। আমি একটি সুপারভাইজার অ্যাকাউন্ট তৈরি করেছি যাতে আমি আপনাকে ভোট দিতে পারি। :-)
ctrueden

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