Як я можу зупинити введення ключа від запуску завершення в режимі компанії?


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
Гюнтер Зехбауер

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) але це не вийшло. Чи знаєте ви, чи це було б можливо і як цього досягти?
користувач2237076

@ 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) але це виглядає як ваше право, коли я змінився на щось інше, ніж C-RET, я отримав бажану поведінку. Дякую.
користувач2237076

@ 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так це те, що я маю в своєму init:

(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)
   )
  )

Вам не доведеться вручну припиняти спадання компанії за допомогою коду, який я надав. Введення тексту безперебійне, якщо ви явно не взаємодієте зі спадною панеллю через M-TAB, Cv, Mv, Cs тощо. З вашою конфігурацією щось не так (що не дивно, оскільки існує 10 змінних, які потрібно правильно встановити, щоб отримати компанія повинна діяти розумно ...).
Радон Росборо
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.