답변:
에 정의되어 company-active-map
있습니다. 해당 맵에서 리턴 키를 바인드 해제 할 수 있습니다.
(define-key company-active-map (kbd "<return>") nil)
그러나 여러 후보가있는 경우 return과 tab이 다른 작업을 수행합니다. 탭은에 바인드 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
;;; - /emacs//a/13290/12534
;;; - http://stackoverflow.com/a/22863701/3538165
;;;
;;; See also:
;;; - /emacs//a/24800/12534
;;; - /emacs//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
탐색하거나로 검색하거나 옵션 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)
)
)