Как я могу остановить ввод ключа от завершения в режиме компании?


13

Я часто хочу перейти на новую строку, пока отображается предложение режима компании. Как настроить режим компании, чтобы только клавиша табуляции вызывала завершение?

Ответы:


8

Это определено в company-active-map. Вы можете отменить привязку ключа возврата на этой карте:

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

Однако обратите внимание, что return и tab делают разные вещи, когда есть несколько кандидатов. Tab связан с company-complete-common, а return связан с 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
  ;;; - /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-RETи посмотрите, действительно ли Emacs получает сигнал, C-RETа не просто RET.
Радон Росборо

У меня есть вкладка для циклического перебора опций: (define-key company-active-map (kbd "TAB") #'company-complete-common-or-cycle) но, похоже, вы правы, когда я перешел на что-то другое, чем C-RET, я получил желаемое поведение. Спасибо.
user2237076

@ user2237076 Просто некоторая дополнительная информация - по умолчанию вы также можете переключаться между вариантами с помощью M-pи M-n, или искать их с помощью 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.