Ilভিল: মানচিত্র কী-বাইন্ডিংগুলি ভিম উপায়?


13

আমি এভিল ফাংশনটি তৈরি করার চেষ্টা করছি evil-jump-to-tag, C-]ইম্যাক্স বাঁধনের মতো আচরণ করব M-.

ট্যাগ ফাইলগুলি ব্রাউজ করার জন্য স্বাভাবিক আচরণ ভাল, তবে আমি এটি slime-edit-definitionস্লাইমস, এলিস্পস ' elisp-slime-nav-find-elisp-thing-at-point, ক্লোজারস cider-jump-to-varইত্যাদির জন্যও কাজ করতে চাই ...

এই প্রধান মোডগুলি এবং আরও অনেকগুলি কী-বাইন্ডিংয়ের সাথে জাম্প-টু-ডেফিনেশনের সমতুল্য সীমাবদ্ধ M-.

এভিল-মোডের জন্য একই আচরণ পেতে, আমাকে এই প্রতিটি মোডের জন্য স্থানীয়ভাবে কী-বাইন্ডিং বাঁধতে হবে, বা কী-বাইন্ডিং নেওয়া এবং ইমাক্সকে বলা সম্ভব, যখনই এই কীটি টিপানো হয়, সেই কীটির জন্য আবদ্ধ ফাংশনটি ব্যবহার করুন ইমাস মোডে?


সম্পর্কিত (আরও সরাসরি ভিম
ইডব্রি

উত্তর:


10

আপনার উত্তরগুলির জন্য ধন্যবাদ, আমি এখন এটি কাজ করে চলেছি:

(defun my-jump-to-tag ()
  (interactive)
  (evil-emacs-state)
  (call-interactively (key-binding (kbd "M-.")))
  (evil-change-to-previous-state (other-buffer))
  (evil-change-to-previous-state (current-buffer)))

(define-key evil-normal-state-map (kbd "C-]") 'my-jump-to-tag)

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


1
আমি যা ব্যবহার করি তা সহজ এবং পুরোপুরি সূক্ষ্মভাবে কাজ করে বলে মনে হয়: (define-key evil-normal-state-map (kbd "C-]") (kbd "\\ M-.")(যেখানে "\" আবদ্ধ evil-execute-in-emacs-state)।
shosti

@ শোস্তি: হ্যাঁ, এটি কমপক্ষে পাশাপাশি কাজ করা উচিত। আমি এটির মতো চেষ্টা করেছি, তবে দ্বিতীয় এবং এম এর মধ্যে স্থানটি অন্তর্ভুক্ত করি নি
মার্টিন

3

এরকম কিছু চেষ্টা করুন

(global-set-key "\C-]" "\M-.")

বা, যদি evilইতিমধ্যে এই কীবাইন্ডটি ব্যবহার করে থাকে তবে আপনার মতো কিছু করার দরকার হতে পারে।

(define-key evil-mode-map "\C-]" "\M-.")

এটি C-]বর্তমানের মেজর-মোডের উপর নির্ভর করে যদি খারাপের আচরণ ধরে রাখতে চান তবে এর আচরণটি সম্পূর্ণরূপে ওভাররাইড হয়ে যাবে , @ টাইলারের সমাধানটি আরও উপযুক্ত কারণ আপনার কোনও ফাংশন থাকতে পারে যা সিদ্ধান্ত নিতে পারে যে M-.এসলে কিছু বলা বা করা উচিত do

এটা কি সাহায্য করে?


2

আমি কী evilকীম্যাপগুলি বুঝতে পারি না , তবে নীচের ফাংশনটি M-.এই মুহূর্তে যা আবদ্ধ রয়েছে তা করে:

(defun my-tag-jump ()
    (interactive)
    (call-interactively (key-binding (kbd "M-."))))

এটিকে উপযুক্ত evilকীম্যাপে বাঁধাই করা আপনি যা চান তা করা উচিত। এটি করার আরও একটি নির্দিষ্ট evilউপায় থাকতে পারে ।

evilবাঁধাই C-]করে evil-motion-state-map, তাই নিম্নলিখিতটি চেষ্টা করুন:

(eval-after-load "evil-maps"
    '(define-key evil-motion-state-map "\C-]" 'my-tag-jump))

আমি কিভাবে এই কারণ মন্দ-মোড শুশ্রূষা, ভালো কাজ করতে পারে না দেখতে না M-.করার evil-repeat-pop-next। আপনি যদি এতে আপনার ফাংশনটি পরিবর্তন করেন: (মাই-ট্যাগ-জাম্প () ইন্টারেক্টিভ) (অবিশ্বাস্য-ইম্যাক্স-স্টেট) (কল-ইন্টারেক্টিভলি (কী-বাইন্ডিং (কেবিডি "এম-।"))) (অশুভ-স্বাভাবিক- রাজ্য))
মার্টিন

যেমনটি আমি বলেছি, আমি খারাপ কী ম্যাপ জানি না। সম্ভবত আরও ভাল সমাধান হ'ল evil-jump-to-tagসংজ্ঞাযুক্ত কী-ম্যাপটি খুঁজে পাওয়া এবং এটি আমার ফাংশনে পুনরায় ফিরিয়ে দেওয়া।
টাইলার

2

সাধারণভাবে, এটি সম্ভব নয়।

কারণটি হ'ল এমন একাধিক মানচিত্র থাকতে পারে যা একই বাঁধাই সংজ্ঞায়িত করে এবং কোনটি আপনি চান তা স্বয়ংক্রিয়ভাবে বের করার উপায় নেই। (আপনার উদাহরণে, elisp-slime-nav-modeএটি একটি ছোটখাটো মোড)। আপনি কেবল কোন সংজ্ঞা চান তা নির্ধারণ করার জন্য একমাত্র সত্যিকারের নির্ভরযোগ্য পন্থা।

এটি বলেছিল ... একটি সম্ভাব্য হ্যাক রয়েছে (সবসময় সেখানে নেই ...) কীটি মুশকিল করে তোলে তার একটি অংশ হ'ল আপনি যে বাঁধাইটি পুনরায় পুনর্নির্মাণ করতে চান সেটি ইতিমধ্যে একটি অশুভ সক্রিয় কীম্যাপ দ্বারা মুখোশযুক্ত, সুতরাং বর্তমান বন্ডিং পেয়ে M-.অকেজো

(defun lookup-no-evil (key)
  ;; excluding evil maps from the lookup. not sure if 
  ;; anything more than evail-normal-state-map is needed
  (let* ((evil-maps (list evil-normal-state-map))
         (bindings
          (remq nil
                (mapcar
                 (lambda (map)
                   (unless (memq map evil-maps)
                     (lookup-key map key)))
                 (current-active-maps)))))
    (when bindings
      ;; let's assume the first one is the right one. 
      ;; Given that minor modes are at the beginning 
      ;; (although this is *not* documented so should not 
      ;; be relied upon), it might be what we would have 
      ;;without evil-mode indeed
      (car bindings))))

(defmacro evil-remap (from to)
  ;; assuming that we want to put it in the normal-state map.
  ;; not sure about that
  `(define-key evil-normal-state-map ,to
       (lambda ()
         (interactive)
         (call-interactively (lookup-no-evil ,from)))))

(evil-remap (kbd "M-.") (kbd "C-]"))

আমি সাধারণত খারাপ ব্যবহার করি না, তাই সামঞ্জস্যতা প্রয়োজন হতে পারে (এম্বেড করা মন্তব্য দেখুন)

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


2

@ সেভারিনের গৃহীত সমাধানটি প্রায় আমার জন্য কাজ করে, তবে, যখন ট্যাগটি পাওয়া যায় না, বাফারটি সাধারণ মোডে ফিরে আসে না। এই বিকল্পটি সব ক্ষেত্রেই আমার পক্ষে কাজ করে:

(defun my-jump-to-tag ()
    (interactive)
    (evil-execute-in-emacs-state)
    (call-interactively (key-binding (kbd "M-."))))
(define-key evil-normal-state-map (kbd "C-]") 'my-jump-to-tag)

1

আমি মনে করি যে সবচেয়ে পরিষ্কার উপায়

(define-key evil-normal-state-map (kbd "M-.") 'xref-find-definitions)

(এবং আপনার আগ্রহী প্রতিটি অন্যান্য মানচিত্র যুক্ত করুন)

xref-find-definitionsM-.আপনি যে কমান্ডটি ব্যবহার করে দেখতে পাচ্ছেন এটি ইম্যাক্সের সাথে আবদ্ধ ফাংশন C-h k


1

কিছু ভিএম স্টাইলের কী-বাইন্ডিং ফাংশন।

এখানে কিছু ফাংশন রয়েছে যা আমি বিশ্ব মানচিত্রে এবং বিভিন্ন মন্দ-রাজ্যে ভিএম-স্টাইল বাঁধাইয়ের জন্য সংজ্ঞায়িত করেছি এবং পাশাপাশি দুটি সাধারণ ফাংশন যা একটি স্বেচ্ছাসেবক কী-মানচিত্র বা স্বেচ্ছাসেবী আবদ্ধ ফাংশন গ্রহণ করে। আমি এই ফাংশনগুলি টুকরো টুকরো করে রেখেছি ।

(defun kbd+ (keyrep &optional need-vector)
  (if (vectorp keyrep) keyrep (edmacro-parse-keys keyrep need-vector)))

(defun gmap (keyrep defstr)
  "Vim-style global keybinding. Uses the `global-set-key' binding function."
  (global-set-key (kbd+ keyrep) (edmacro-parse-keys defstr t)))

(defun fmap (keybind-fn keyrep defstr)
  "Vim-style keybinding using the key binding function KEYBIND-FN."
  (call keybind-fn (kbd+ keyrep) (edmacro-parse-keys defstr t)))

(defun xmap (keymap keyrep defstr)
  "Vim-style keybinding in KEYMAP. Uses the `define-key' binding function."
  (define-key keymap (kbd+ keyrep) (edmacro-parse-keys defstr t)))

(defun nmap (keyrep defstr) "Vim-style keybinding for `evil-normal-state.' Uses the `define-key' binding function."
      (xmap evil-normal-state-map keyrep defstr))
(defun imap (keyrep defstr) "Vim-style keybinding for `evil-insert-state'. Uses the `define-key' binding function."
      (xmap evil-insert-state-map keyrep defstr))
(defun vmap (keyrep defstr) "Vim-style keybinding for `evil-visual-state'. Uses the `define-key' binding function."
      (xmap evil-visual-state-map keyrep defstr))
(defun mmap (keyrep defstr) "Vim-style keybinding for `evil-motion-state'. Uses the `define-key' binding function."
      (xmap evil-motion-state-map keyrep defstr))

সাধারণভাবে, কেবলমাত্র কীবোর্ড-ম্যাক্রো-স্টাইলের বাইন্ডিংগুলির জন্য (প্রশ্নটির ব্যবহারের মতো) এবং অন্য কিছুর জন্য ইম্যাক্স-স্টাইলের কী-বাইন্ডিং ব্যবহার করা ভাল।

মন্তব্য

  • bind-keyথেকে ম্যাক্রো use-packageপ্যাকেজ একটি চমৎকার এবং বহুমুখী কী-বাঁধাই ফাংশন।
  • আপনি যদি একটি কমান্ডের সাথে অন্য কমান্ডটি প্রতিস্থাপন করতে চান তবে আপনি ইমাসের রিম্যাপিং কমান্ড ব্যবহার করতে পারেন ।
  • আপনি যদি নিয়মিত কী-বাইন্ডিংয়ের জন্য এগুলি ব্যবহার করেন তবে মনে রাখবেন যে কোনও "নোরম্যাপ" সংস্করণ নেই, তাই যদি আপনার সংজ্ঞায় বাইন্ডিংগুলি পরিবর্তন হয়, তবে আপনার ব্যবহারকারীর দ্বারা সংজ্ঞায়িত বাইন্ডিংগুলিও পরিবর্তিত হবে।

বাঁধাই C-]করার M-.

লক্ষ্য করুন স্বাভাবিক অবস্থায়, বাঁধাই করার চাইবেন \M-.স্বাভাবিক রাষ্ট্র বেঁধে সাল থেকে Emacs বাঁধাই অ্যাক্সেস করতে M-.করতে 'evil-repeat-pop-next। সুতরাং একটি সাধারণ-রাষ্ট্রীয় বাঁধাই এর সাথে সংজ্ঞায়িত করা যায়:

(nmap "C-]" "\\ M-.")

বা ( evil-jump-to-tagসাধারণ-অবস্থায় কোনও কী পুনর্নির্মাণ করা :

(nmap [remap evil-jump-to-tag] "\\ M-.")
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.