Відповіді:
Це визначено в 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))
Моя повна установка для виправлення цієї дратівливої поведінки за замовчуванням:
;;; 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)
( посилання на поточну конфігурацію, яка була вдосконалена, але є досить складною до цього моменту)
(оновлено відповідно до цього питання )
(define-key company-active-map (kbd "C-RET") #'company-complete-selection)
але це не вийшло. Чи знаєте ви, чи це було б можливо і як цього досягти?
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, я отримав бажану поведінку. Дякую.
M-p
і M-n
, або ISearch їх з C-s
або безпосередньо вибрати кандидата з M-1
допомогою M-0
(номера вказані при установці company-show-numbers
).
Просто побачив це, шукаючи рішення тієї ж проблеми (хоча дратівливі ключі для мене були 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)
)
)