회사 모드에서 Enter 키가 완료를 트리거하지 못하게하려면 어떻게해야합니까?


13

회사 모드 제안이 표시되는 동안 종종 줄 바꿈으로 가고 싶습니다. 회사 모드를 설정하여 탭 키만 완료를 트리거하려면 어떻게해야합니까?

답변:


8

에 정의되어 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))

감사합니다 - 훨씬 더 : D
귄터 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
  ;;; - /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)

( 현재 구성에 대한 링크 , 추가 개선되었지만 현재로서는 매우 복잡합니다)

( 이 질문에 따라 업데이트 됨 )


키잉의 성가심을 저장하고 목록의 첫 번째 항목을 선택하기 위해 백업하십시오 ( '상호 작용'할 때까지 반환이 비활성화 됨) C-RET를 선택을 완료하기위한 바인딩으로 추가하여 첫 번째 항목에서 사용할 수 있도록했습니다. . 나는 포함하려고 시도했지만 (define-key company-active-map (kbd "C-RET") #'company-complete-selection) 작동하지 않았다. 이것이 가능하고 달성하는 방법을 알고 있습니까?
user2237076

@ user2237076 TAB'상호 작용'할 필요없이 목록에서 첫 번째 항목을 선택하는 데 사용할 수 있습니다 . 그러나 귀하의 질문에 대답하기 위해, 귀하의 터미널은 보낼 수 없습니다 C-RET(광산 할 수 없음). C-h k C-RETEmacs가 실제로 C-RET대신 신호 를 얻는 지 확인해 보십시오 RET.
Radon Rosborough

옵션을 통해 순환 할 수있는 탭이 있습니다. (define-key company-active-map (kbd "TAB") #'company-complete-common-or-cycle) 그러나 C-RET 이외의 것으로 변경했을 때 원하는 동작을 얻었습니다. 감사.
user2237076

@ user2237076 추가 정보 만 제공합니다. 기본적으로 M-p및로 옵션을 M-n탐색하거나로 검색하거나 옵션 C-sM-1통해 후보를 직접 선택할 수도 M-0있습니다 (설정 한 경우 숫자가 표시됨 company-show-numbers).
Radon Rosborough

-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 등을 통해 드롭 다운과 명시 적으로 상호 작용하지 않으면 입력이 완전히 중단되지 않습니다. 구성에 문제가있는 것입니다. 합리적으로 행동하는 회사…).
Radon Rosborough
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.