বাশ ভিআই মোডে, সন্নিবেশ মোড থেকে প্রস্থান করতে মানচিত্র জে কে


12

আমি ব্যাশ শেল সহ ওবুন্টু 16.04 এর একটি নতুন ইনস্টল ব্যবহার করছি। আমি দুটি জিনিস করতে চাই:

  1. Vi মোড সেট আপ করুন যাতে আমি টার্মিনাল থেকে ভিমের মতো চলন করতে পারি
  2. টাইপ করে সন্নিবেশ মোড প্রস্থান করুন jk

আমি অন্য পোস্টে পড়েছি কীভাবে এটি দিয়ে কাজ করা যায় zsh, আমি এটি দিয়ে কীভাবে পারি bash?

TL; ড

করা bind '"jk":vi-movement-mode'আপনার মধ্যে .bashrcফাইলের পর set -o vi:)

server@thinkpad:~$ tail -n 2 .bashrc
set -o vi
bind '"jk":vi-movement-mode'

আরও বিশদ ব্যাখ্যার জন্য দয়া করে @ গ্রাচমালের উত্তর দেখুন


1
রিম্যাপ করে আপনি কী বোঝাতে চাইছেন jk? এটি কি আপনার কীবোর্ডের কোনও বিশেষ কী?
স্টিফেন হ্যারিস

দয়া করে সম্পাদনা দেখুন
এমবিগ্রাস

আপনার প্রথমটির জন্য, .bashrcপ্রতিটি শেলটিতে সাধারণত বলা হয় (যেমন আপনি যদি শেল আউট করেন vi) তবে .bash_profileকেবল লগইন শেলগুলিতে ডাকা হয়। তাই .bashrcসঠিক জায়গা set -o vi। আপনার সংশোধিত ২ য় প্রশ্নের উত্তর আমার কাছে নেই :-(
স্টিফেন হ্যারিস

আপনি কিভাবে আপনার বাশ শেল শুরু করছেন?
.Bashrc

উত্তর:


11

টি এল; ডিআর

ব্যাশ একটি অনুরূপ কার্যকারিতা থাকে zsh's bindkeyমাধ্যমে bind, কিন্তু এটি বিভিন্ন নেই viমত মোড zshset -o viআপনি এটি করার পরে :

bind '"jk":vi-movement-mode'

যা zsh's এর সমতুল্যbindkey -M <all vi modes> jk vi-movement-mode

vi-movement-modeফাংশন থেকে আসে inputrc(দেখুন /etc/inputrcতাদের একটি তালিকা জন্য)।

সম্পূর্ণ লিখা

স্টিফেন হ্যারিস যেমন নিজের মন্তব্যে উল্লেখ করেছেন:

  • .bashrcbashসবসময় বলা হয় (এবং উল্লেখযোগ্যভাবে অন্যান্য শাঁস দ্বারা নয়)।

  • .bash_profile শুধুমাত্র লগইন শেলগুলিতে ডাকা হয় (এবং আবার কেবল বাশ)।

বেশ কয়েকটি ডিস্ট্রোস একটি .bash_profileকঙ্কাল নিয়ে আসে যা নীচে দেখায়:

# ~/.bash_profile
[[ -f ~/.bashrc ]] && . ~/.bashrc

.bash_profileআপনি যেহেতু এটি সহজেই ভুলে যেতে পারেন এটির জন্য একটি ভাল সামগ্রী ।

এখন, শেল সেশনে মানচিত্র jkকরতে Esc, এটি সত্যিই সম্ভব নয়। যখন তুমি কর:

inoremap jk <esc>

ভিমে, আপনি টাইপ করার পরে j, ভিম জানেন যে আপনি kপরবর্তী টাইপ করেছেন কিনা তা দেখার জন্য কিছুটা অপেক্ষা করা দরকার এবং এটি ম্যাপিংটি শুরু করা উচিত (অথবা আপনি অন্য কীটি টাইপ করেন এবং ম্যাপিংটি ট্রিগার করা উচিত নয়)। সংযোজন হিসাবে :set timeoutlen=<miliseconds>এটি ভিমে (দেখুন :h timeoutlen) দ্বারা নিয়ন্ত্রিত হয় ।

বেশ কয়েকটি শেল বা এক্স 11 এর মতো টাইমআউট নিয়ন্ত্রণ নেই এবং একাধিক অক্ষর ম্যাপিংয়ের অনুমতি দেয় না। কেবলমাত্র একটি সি-কি'র ম্যাপিংয়ের অনুমতি রয়েছে (তবে নীচে সমর্থন নোটগুলি দেখুন।)

set -o vi

পড়ে না .vimrc, এটি শেলটিতে ব্যবহারযোগ্য কয়েকটি কী vi(এমনকি নয় vim) মূল সংমিশ্রণগুলি অনুকরণ করে। একই সম্পর্কে বলা যেতে পারে -o emacs, এটি সম্পূর্ণ শক্তির সাথে আসে না emacs


zsh সমর্থন

zshপ্রকৃতপক্ষে মানচিত্রের সময়সীমা সমর্থন করে। এবং আপনি মানচিত্র jkকরতে নিম্নলিখিত ব্যবহার করতে পারেন <esc>:

bindkey -v  # instead of set -o vi
bindkey -e jk \\e

(এটি যেতে হবে ~/.zshrcনা ~/.bashrc)

তবুও, আমি এর বিরুদ্ধে পরামর্শ দিই। আমি vimএবং zshবেশিরভাগ সময় ব্যবহার করি । আমি inoremap jk <esc>আমার মধ্যে vimrcএবং আমি ব্যবহার করার চেষ্টা করুন হয়নি bindkeyউপরে সংমিশ্রণ। এটি ব্যবহার zshকরার সময় মুদ্রণের জন্য খুব বেশি সময় অপেক্ষা jকরে এবং এটি আমাকে অনেক বিরক্ত করেছিল।


বাশ সমর্থন

bashসমর্থন readline bind। আমি বিশ্বাস করি যে bashএইগুলি ব্যতীত সংকলন করা যায় readilneতাই কিছু বিরল সিস্টেমে এমন বাশ থাকতে পারে যা সমর্থন করে না bind(সতর্ক থাকুন)। এতে ম্যাপ jkকরার <esc>জন্য bashআপনাকে যা করতে হবে:

set -o vi
bind '"jk":"\e"'

(হ্যাঁ এটি একটি দ্বিগুণ স্তরের উদ্ধৃতি, এটি প্রয়োজন)

আবার এটি টাইপিংকে jবেশ বিরক্তিকর করে তোলে । তবে zshআমার মেশিনে সমাধানের চেয়ে কোনওভাবেই বিরক্তিকর (সম্ভবত ডিফল্ট সময়সীমাটি ছোট)।


কার্যতালিকা (নন-ব্যাশ এবং নন-জ্যাশ শেলের জন্য)

Escকীটি রিম্যাপ করার কারণ হ'ল এটি কীবোর্ডের থেকে অনেক দূরে রয়েছে এবং টাইপ করতে সময় লাগে। একটি কৌশল যা emacsছেলেদের কাছ থেকে ধার করা যেতে পারে তা পুনর্নির্মাণ করা CapsLockএটি যেহেতু এটি একটি অকেজো চাবি। emacsছেলেরা এটি পুনরায় তৈরি করুন Ctrlতবে আমরা এটির পুনর্নির্মাণ করব Esc

এর xev -event keyboardকিকোড চেক করতে ব্যবহার করুন CapsLock:

KeyPress event, serial 25, synthetic NO, window 0x1c00001,
    root 0x496, subw 0x0, time 8609026, (764,557), root:(765,576),
    state 0x0, keycode 66 (keysym 0xffe5, Caps_Lock), same_screen YES,
    XLookupString gives 0 bytes: 
    XmbLookupString gives 0 bytes: 
    XFilterEvent returns: False

এবং এর কার্যকারিতা পরীক্ষা করতে Esc:

KeyPress event, serial 25, synthetic NO, window 0x1c00001,
    root 0x496, subw 0x0, time 9488531, (571,525), root:(572,544),
    state 0x0, keycode 9 (keysym 0xff1b, Escape), same_screen YES,
    XLookupString gives 1 bytes: (1b) "
    XmbLookupString gives 1 bytes: (1b) "
    XFilterEvent returns: False

খুব ভাল, CapsLockকী-কোড 66 এবং Escএর ফাংশনটিকে "এস্কেপ" বলা হয়। এখন আমরা করতে পারি:

# diable caps lock
xmodmap -e "remove lock = Caps_Lock"
# make an Esc key from the keycode 66
xmodmap -e "keycode 66 = Escape"

উপরেরটি অবশ্যই এই ক্রমে করা উচিত । এখন যতবার আপনি CapsLockএটি হিট করবেন তেমনি একটি Escচাবির মতো কাজ করে ।


জটিল অংশটি এটি সেট করার জন্য। ~/.Xmodmapবিষয়বস্তু সহ একটি ফাইল :

remove lock = Caps_Lock
keycode 66 = Escape

বেশিরভাগ ডিস্ট্রোদের দ্বারা সম্মান করা উচিত (প্রকৃতপক্ষে পরিচালকগণ প্রদর্শন করুন, তবে আমি সরলতার জন্য ডিস্ট্রো বলছি) তবে আমি এমন কয়েকটি ~/X*ফাইল দেখেছি যা বেশ কয়েকটি ফাইলকে সম্মান করে না । এই জাতীয় ডিগ্রোগুলির জন্য আপনি কিছু চেষ্টা করতে পারেন:

if [ "x" != "x$DISPLAY" ]; then
    xmodmap -e "remove lock = Caps_Lock"
    xmodmap -e "keycode 66 = Escape"
fi

আপনার .bashrc

(তত্ত্বের ক্ষেত্রে এটি আরও ভালভাবে স্থাপন করা হবে ~/.xinitrcতবে কোনও ডিসপ্লে ম্যানেজার যদি সম্মান না .Xmodmapকরে তবে অবশ্যই এটি সম্মান করবে না ~/.xnintrc))

অতিরিক্ত দ্রষ্টব্য: এটি কেবল এক্স 11 সেশনে পুনরুদ্ধার CapsLockহয় Esc, অতএব মানচিত্রটি কেবলমাত্র টার্মিনাল এমুলেটরগুলিতে কাজ করবে। আসলটির ttyমানচিত্রটি দেখতে পাবে না।

তথ্যসূত্র এবং অতিরিক্ত পড়া:


বিস্তারিত ব্যাখ্যার জন্য ধন্যবাদ। আপনি jkপরিবর্তে ম্যাপিং বাদে একই প্রক্রিয়া চিত্রিত করতে ইচ্ছুক হবে CapsLock? আমি এটি আমার অসক্স মেশিনে সেট করেছি; তবে, সপ্তাহান্তের বাকি অংশটি আমার কাছে নেই এবং আমি কীভাবে এটি করেছি তা মনে করতে পারি না :)
এমবিগ্রাস

@ এমবিগ্রাস - আপনি কি নিশ্চিত যে এটি ব্যাশে করেছেন? বাশের কোনও অ্যাম্বিগুওস মানচিত্র নেই। আমি এরকম একটা উপায় জানি zsh: bindkey -v; bindkey -s jk \\e। কিন্তু যে এমন কিছু বিষয় যা ফিরে আসা এবং আপনি ফিরে দান্ত দিয়া ফুটা করা যখন আপনি প্রয়োজন হবে jk, কারণ টাইমার কনফিগার নয় এবং আপনি কোন আছে <leader>মধ্যে zsh
গ্রাচমাল

আমি অবশ্যই এটি করেছি zshএবং না bash, এটি কি সম্ভব নয়?
এমবিগ্রাস

@ এমবিগ্রাস - দাঁড়াও, আমি ভুল ছিলাম! পড়া man bashআমি দেখেছি bindযে কাজ চমত্কার অনুরূপ zsh'র bindkey। আমি উত্তর আপডেট করব। আপনি সেখানে যান, আমি zshখুব বেশি ব্যবহার করছি
গ্রোচমাল

2
@ জেসন - আরে, এটি ভাই ভি এসই, এখানে সকলেই একটি সমস্ত ক্যাপ শব্দটি লিখেছেন: "টাইপ শব্দ" <এসকিটি> ভিউইউ :) এর সাথে। কোনও সমাপ্তির প্রয়োজন নেই
গ্রুচমাল

2

ধন্যবাদ, পূর্ববর্তী উত্তরের জন্য, আমি এটি আমার টার্মিনালের ভিআই-এর মতো শর্টকাটের জন্য আমার। / .Zshrc এ ব্যবহার করি। আমি আশা করি এটি কাউকে সাহায্য করবে।

bindkey -v
bindkey 'jk' vi-cmd-mode

আমি এখানে এমন উত্তর খুঁজতে এসেছি যা vi that সক্রিয় zsh এ "নরমাল মোডে" প্রবেশ করতে '^ G' কীটি আবদ্ধ করার জন্য কাজ করে, এবং এটিই কেবল কাজ করে worked
ডালকার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.