কীভাবে ইয়াসনিপেট এবং সংস্থার কাজকে আরও সুন্দর করা যায়?


22

আমার ইমাসগুলিতে, ধরা যাক, আমি "elisp"org-মোডে একটি লিসপ ব্লক প্রসারিত করতে একটি ইয়াসনিপেট ব্যবহার করি । তবে আমি এটি বাড়ানোর আগে সংস্থাটি প্রথমে ট্রিগার হয়, যা আমাকে "1. elisp1, 2. elisp2"একটি বিকল্প ছাড়াই একটি মেনু দেয় "elisp"। এখন আমি যদি tabইয়াসনিপেট প্রসারিত করতে ব্যবহার করি তবে এটি সর্বদা বিরক্ত হয় যা "elisp1"সর্বদা প্রথম স্ক্রিনে যায়। সুতরাং আমাকে "1"প্রথমে মুছতে হবে এবং ইয়াসনিপেট স্নিপেটের এক্সটেনশন করতে হবে।

সমাধান হিসাবে, আমি সর্বদা প্রথমে কোম্পানির সমাপ্তি মেনুটি বন্ধ করতে বাম তীর কী ব্যবহার করি, তবে কার্সারটি এখন যাবে "elis|p", তাই আমি আবার কার্সারটিকে শেষের দিকে সরানো "elisp|"এবং স্নিপেট প্রসারিত করতে ডান তীর কী ব্যবহার করি ।

এখানে আমার প্রশ্নটি আসে: আমি কীভাবে tabপ্রথমে যাসনিপেটকে ট্রিগার করতে পারি তবে আমার জীবন বাঁচানোর জন্য সংস্থাকে নয়?


1
আমি tabজন্য companyএবং C-oজন্য ব্যবহার করছি yasnippet। আপনার আগ্রহ থাকলে আমি আরও বর্ণনা করতে পারি।
অ্যাবো-আবো

@ আবো-আবো, ধন্যবাদ উত্তর আমি জানি আমি এটা করতে পারেন হিসাবে আপনি কি, কিন্তু আমি বেঁধে অন্যান্য কমান্ড কো, এবং খারাপভাবে আমার হাতে মানিয়ে পেশী প্রশিক্ষণ tab। সুতরাং আমি বাইন্ডিং পরিবর্তন করতে চাই না।
লিউ_গ্র্যাডি

এজন্যই আমি জিজ্ঞাসা করেছি :) C-oআপনার আগ্রহী না হলে কীভাবে সংক্ষিপ্তসারগুলি এবং স্নিপেটগুলি এবং খোলার লাইন ইত্যাদি প্রসারিত করা যায় সে সম্পর্কে একটি ছদ্মবেশ প্রকাশ করার কোনও অর্থ নেই ।
অ্যাবো-অ্যাবো

আকর্ষণীয় বলে মনে হচ্ছে, আপনি কি আরও বর্ণনা করতে পারবেন? :)
লিউ_গ্র্যাডি

উত্তর:


22

এটিই আমি নিজের জন্য তৈরি করেছি, একই সমস্যার মুখোমুখি। এটি সংস্থা-মোডের ইমাসস উইকি পৃষ্ঠা থেকে এসেছে তবে এটির প্রসারিতভাবে বাড়ানো হয়েছে:

(defun check-expansion ()
  (save-excursion
    (if (looking-at "\\_>") t
      (backward-char 1)
      (if (looking-at "\\.") t
    (backward-char 1)
    (if (looking-at "->") t nil)))))

(defun do-yas-expand ()
  (let ((yas/fallback-behavior 'return-nil))
    (yas/expand)))

(defun tab-indent-or-complete ()
  (interactive)
  (cond
   ((minibufferp)
    (minibuffer-complete))
   (t
    (indent-for-tab-command)
    (if (or (not yas/minor-mode)
        (null (do-yas-expand)))
    (if (check-expansion)
        (progn
          (company-manual-begin)
          (if (null company-candidates)
          (progn
            (company-abort)
            (indent-for-tab-command)))))))))

(defun tab-complete-or-next-field ()
  (interactive)
  (if (or (not yas/minor-mode)
      (null (do-yas-expand)))
      (if company-candidates
      (company-complete-selection)
    (if (check-expansion)
      (progn
        (company-manual-begin)
        (if (null company-candidates)
        (progn
          (company-abort)
          (yas-next-field))))
      (yas-next-field)))))

(defun expand-snippet-or-complete-selection ()
  (interactive)
  (if (or (not yas/minor-mode)
      (null (do-yas-expand))
      (company-abort))
      (company-complete-selection)))

(defun abort-company-or-yas ()
  (interactive)
  (if (null company-candidates)
      (yas-abort-snippet)
    (company-abort)))

(global-set-key [tab] 'tab-indent-or-complete)
(global-set-key (kbd "TAB") 'tab-indent-or-complete)
(global-set-key [(control return)] 'company-complete-common)

(define-key company-active-map [tab] 'expand-snippet-or-complete-selection)
(define-key company-active-map (kbd "TAB") 'expand-snippet-or-complete-selection)

(define-key yas-minor-mode-map [tab] nil)
(define-key yas-minor-mode-map (kbd "TAB") nil)

(define-key yas-keymap [tab] 'tab-complete-or-next-field)
(define-key yas-keymap (kbd "TAB") 'tab-complete-or-next-field)
(define-key yas-keymap [(control tab)] 'yas-next-field)
(define-key yas-keymap (kbd "C-g") 'abort-company-or-yas)

মূলত, এটি বেশিরভাগ সময় <tab>সঠিক কাজটি করে। ট্যাব টিপতে হবে

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

মনে রাখবেন যে যদি স্বয়ংক্রিয়রূপে চলে যাওয়ার সুযোগ থাকে এবং আপনি বর্তমানে স্নিপেটের স্থানধারকটিতে সম্পাদনা করছেন, পরিস্থিতিটি দ্বিধাদ্বন্ধিক। আপস হিসাবে, আমি C-<tab>সরাসরি পরবর্তী স্থানধারককে সরাসরি এড়িয়ে যেতে বাধ্য ।

স্নিপেটের নামটি কোম্পানির মেনুতে উপস্থিত হয় না এবং একটি স্নিপেটের অস্তিত্ব নীরবে ট্যাব কীটির আচরণকে পরিবর্তন করে তোলে বিশেষত, দুর্ভাগ্যবশত ... যদিও কমপক্ষে এটির <return>পরিবর্তে সম্পূর্ণতা পাওয়ার জন্য টাইপ করা সম্ভব স্নিপেটের।


এটি ম্যাজিটটিতে হস্তক্ষেপ বলে মনে হচ্ছে। চৌম্বক ট্যাব বাড়াতে কারণ Buffer is read-only: #<buffer *magit: ~/.emacs.d/*>। কোন ধারণা আমি কীভাবে এটি ঠিক করতে পারি?
zsquare

@ zsquare আমি Magit ব্যবহার করি না (আমি জানি, আমি বাদাম) তাই এটি নিশ্চিত হওয়ার জন্য আমি এটি পরীক্ষা করতে পারছি না, তবে এটি ট্যাব-এর জন্য ম্যাগিটের কী ম্যাপের মতো মনে হচ্ছে, যা এটি আবদ্ধmagit-section-toggle , (global-set-key [tab] 'tab-indent-or-complete)উপরের লাইনের সাথে বিরোধী । দ্রুত এবং নোংরা tab-indent-or-completeফিক্সটি হ'ল উপরের ফাংশনটির শুরুতে একটি চেক যোগ করা হবে তা দেখার জন্য আমরা ম্যাগিট মোডে আছি কিনা, উদাহরণস্বরূপ একটি গ্লোবাল ভেরিয়েবল যা সেট আপ হয় magit-mode-hook
dodgethesteamroller

এই দুর্দান্ত, ধন্যবাদ! :) ছোট শৈলী পয়েন্ট, whenপ্রায় কাছাকাছি একটি হল if+ +progn
ম্যাট ব্রিগস

@zsquare চৌম্বক মোডে ট্যাব সমর্থন করার জন্য এটিকে tab-indent-or-completeকনড add (যুক্ত করেছেন (উত্পন্ন-মোড-পি 'চৌম্বক-মোড) (চৌম্বক-বিভাগ-টগল (চৌম্বক-বর্তমান-বিভাগ))) `
বায়ে

ডিফল্ট মিনিবুফার সমাপ্তির পরিবর্তে আইডো সমর্থন করতে, কনডকে `((মিনিবিফার্প) (ইডো-সম্পূর্ণ)) দিয়ে প্রতিস্থাপন করুন
বায়ে

10

আমি যে কোডটি ব্যবহার করছি তা এখানে:

(global-set-key "\C-o" 'aya-open-line)

(defun aya-open-line ()
  "Call `open-line', unless there are abbrevs or snippets at point.
In that case expand them.  If there's a snippet expansion in progress,
move to the next field. Call `open-line' if nothing else applies."
  (interactive)
  (cond ((expand-abbrev))

        ((yas--snippets-at-point)
         (yas-next-field-or-maybe-expand))

        ((ignore-errors
           (yas-expand)))

        (t
         (open-line 1))))

aya-open-lineঅটো-ইয়াসনিপেট থেকে সমভূমি থেকে বেশি কিছু করা হয় open-line:

  • এটি সংক্ষেপগুলি প্রসারিত করার চেষ্টা করে
  • এটি ইয়াসনিপেটের পরবর্তী ক্ষেত্রে যেতে চেষ্টা করে
  • এটি ইয়াসনিপেটকে প্রসারিত করার চেষ্টা করে
  • সবশেষে open-lineব্যর্থ হলে অবশেষে, এটি কল করে

আপনার স্নিপেট জন্য ধন্যবাদ বেশ ভাল. তবে সমস্যাটি এখনও রয়েছে। আমি যখন প্রথম ব্যবহার করি তখন C-oএটি কেবল সংস্থার মেনু বন্ধ করে দেয় তাই আমার ইয়াসনিপেটটি প্রসারিত করতে দুবার চাপতে হবে।
লিউ_গ্র্যাডি

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