मैं कंपनी मोड में पूर्णता को चालू करने से प्रवेश कुंजी को कैसे रोक सकता हूं?


13

मैं अक्सर एक नई पंक्ति में जाना चाहता हूं, जबकि कंपनी मोड सुझाव दिखा रहा है। मैं कंपनी मोड कैसे सेट कर सकता हूं ताकि केवल टैब कुंजी एक पूरा हो सके?

जवाबों:


8

इसमें परिभाषित किया गया है company-active-map। आप उस मानचित्र में वापसी कुंजी को हटा सकते हैं:

(define-key company-active-map (kbd "<return>") nil)

ध्यान दें कि जब कई उम्मीदवार होते हैं तो रिटर्न और टैब अलग-अलग काम करते हैं। टैब बाध्य है company-complete-common, जबकि वापसी के लिए बाध्य है company-complete-selection। यदि आप वापसी कुंजी को अनबाइंड करते हैं तो आप उपयोग नहीं कर पाएंगे M-nऔर M-pसूची से पूर्णता प्राप्त कर सकते हैं।

आप company-complete-selectionउदाहरण के लिए उपयोग करने के लिए कुछ अन्य कुंजी चुन सकते हैं :

(with-eval-after-load 'company
  (define-key company-active-map (kbd "<return>") nil)
  (define-key company-active-map (kbd "RET") nil)
  (define-key company-active-map (kbd "C-SPC") #'company-complete-selection))

साभार - इतना बेहतर: D
Günter Zöchbauer

8

इस कष्टप्रद डिफ़ॉल्ट व्यवहार को ठीक करने के लिए मेरा पूरा सेटअप है:

  ;;; Prevent suggestions from being triggered automatically. In particular,
  ;;; this makes it so that:
  ;;; - TAB will always complete the current selection.
  ;;; - RET will only complete the current selection if the user has explicitly
  ;;;   interacted with Company.
  ;;; - SPC will never complete the current selection.
  ;;;
  ;;; Based on:
  ;;; - https://github.com/company-mode/company-mode/issues/530#issuecomment-226566961
  ;;; - https://emacs.stackexchange.com/a/13290/12534
  ;;; - http://stackoverflow.com/a/22863701/3538165
  ;;;
  ;;; See also:
  ;;; - https://emacs.stackexchange.com/a/24800/12534
  ;;; - https://emacs.stackexchange.com/q/27459/12534

  ;; <return> is for windowed Emacs; RET is for terminal Emacs
  (dolist (key '("<return>" "RET"))
    ;; Here we are using an advanced feature of define-key that lets
    ;; us pass an "extended menu item" instead of an interactive
    ;; function. Doing this allows RET to regain its usual
    ;; functionality when the user has not explicitly interacted with
    ;; Company.
    (define-key company-active-map (kbd key)
      `(menu-item nil company-complete
                  :filter ,(lambda (cmd)
                             (when (company-explicit-action-p)
                               cmd)))))
  (define-key company-active-map (kbd "TAB") #'company-complete-selection)
  (define-key company-active-map (kbd "SPC") nil)

  ;; Company appears to override the above keymap based on company-auto-complete-chars.
  ;; Turning it off ensures we have full control.
  (setq company-auto-complete-chars nil)

( वर्तमान विन्यास से लिंक , जिसे और बेहतर बनाया गया है लेकिन इस बिंदु से काफी जटिल है)

( इस सवाल के अनुसार अद्यतन )


सूची में पहले आइटम का चयन करने के लिए नीचे की ओर झुके और वापस लौटने के लिए (जैसा कि 'इंटरएक्शन' तक रिटर्न निष्क्रिय है) मैं चयन पूरा करने के लिए बाइंडिंग के रूप में C-RET जोड़ना चाहता था ताकि मैं पहले आइटम पर इसका उपयोग कर सकूं । मैंने शामिल करने की कोशिश की: (define-key company-active-map (kbd "C-RET") #'company-complete-selection) लेकिन यह काम नहीं किया। क्या आप जानते हैं कि क्या यह संभव होगा और कैसे प्राप्त किया जाएगा?
user2237076

@ user2237076 आप TAB'इंटरेक्ट' की आवश्यकता के बिना सूची में पहले आइटम का चयन करने के लिए उपयोग कर सकते हैं । लेकिन आपके सवाल का जवाब देने के लिए, मुझे यकीन है कि आपका टर्मिनल नहीं भेज सकता है C-RET(मेरा नहीं हो सकता)। कोशिश करें C-h k C-RETऔर देखें कि क्या वास्तव में Emacs C-RETको केवल इसके बजाय संकेत मिलता है RET
रेडॉन रोसबोरो

मुझे विकल्पों के माध्यम से साइकिल चलाने के लिए बाध्य किया गया है: (define-key company-active-map (kbd "TAB") #'company-complete-common-or-cycle) लेकिन यह आपके अधिकार की तरह दिखता है, जब मैं सी-आरईटी के अलावा किसी अन्य चीज में बदल गया तो मुझे वांछित व्यवहार मिला। धन्यवाद।
user2237076

@ user2237076 बस कुछ अतिरिक्त जानकारी द्वारा डिफ़ॉल्ट, आप भी साथ विकल्पों पर जाने के कर सकते हैं M-pऔर M-n, या iSearch उन लोगों के साथ C-sहै, या सीधे के साथ एक उम्मीदवार का चयन M-1के माध्यम से M-0(यदि आप सेट संख्या दिखाई जाती हैं company-show-numbers)।
रेडॉन रोसबोरो

-1

बस इसी समस्या के समाधान की तलाश में इसे देखा (हालांकि मेरे लिए कष्टप्रद चाबियाँ थीं ) SPCऔर .

मुझे लगता है कि nil@glucas और @Radon Rosborough द्वारा प्रस्तावित अपमानजनक कुंजियों को बांधना एक अच्छा UX नहीं है क्योंकि तब आपको कंपनी ड्रॉपडाउन को मैन्युअल रूप से समाप्त करना होगा जो गति टाइपिंग के लिए विघटनकारी है।

यही है, अगर कंपनी सक्रिय हो जाती है और आप एक कुंजी टाइप करते हैं तो nil कुछ भी नहीं होगा। ऐसा नहीं है जब आप एक चरित्र टाइप करते हैं तो आप क्या उम्मीद करेंगे। आप उम्मीद करेंगे कि चरित्र डाला जाएगा।

इसके बजाय, Emacs को स्वचालित रूप से कॉल करना company-abort और फिर आपके लिए टाइप किया गया वर्ण सम्मिलित करना बहुत अधिक सुविधाजनक है । यहाँ मेरा समाधान है:

(defun company--my-insert-spc() (interactive) (company-abort)(insert-char #10r32))
(defun company--my-insert-dot() (interactive) (company-abort)(insert-char #10r46))
(define-key company-active-map (kbd "SPC") 'company--my-insert-spc)
(define-key company-active-map (kbd ".") 'company--my-insert-dot)

मुझे लगता है कि आप इसके बजाय RETकॉल करके आसानी से इसे बढ़ा सकते हैं (हालांकि मैंने कोशिश नहीं की है क्योंकि मैं चयन करने के लिए उपयोग करता हूं )।(newline)(insert-char)RET

वास्तव में मैं इसका उपयोग कर रहा हूं use-package, यही मेरे पास है।

(use-package company
  :config
  (global-company-mode)
  (setq company-minimum-prefix-length 3)
  (setq company-auto-complete t)
  (setq company-show-numbers t)
  :bind
  (("C-<tab>" . company-complete)
   :map company-active-map
   ("ESC" . company-abort)
   ;; prevent company from completing on its own when we type regular characters
   ("SPC" . company--my-insert-spc)
   ("."   . company--my-insert-dot)
   )
  )

आपको मेरे द्वारा प्रदान किए गए कोड के साथ कंपनी ड्रॉपडाउन को मैन्युअल रूप से निरस्त नहीं करना चाहिए। टाइपिंग पूरी तरह से निर्बाध है जब तक कि आप स्पष्ट रूप से एम-टीएबी, सीवी, एमवी, सीएस, आदि के माध्यम से ड्रॉपडाउन के साथ बातचीत नहीं करते हैं। आपके कॉन्फ़िगरेशन के साथ कुछ गलत है (जो 10 चर जैसे आप सही ढंग से सेट करने के लिए है, क्योंकि यह आश्चर्यजनक नहीं है। कंपनी उचित तरीके से कार्य करने के लिए ...)।
रेडन रोसबोरो
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.