如何在公司模式下阻止Enter键触发完成?


Answers:


8

这是在中定义的company-active-map。您可以在该映射中取消绑定返回键:

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

但是请注意,当有多个候选者时,return和tab会做不同的事情。Tab绑定到company-complete-common,而return绑定到company-complete-selection。如果取消绑定返回键,则将无法使用M-nM-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-RET看看Emacs是否实际上得到了信号,C-RET而不是仅仅得到了RET
Radon Rosborough

我有选项卡可以循环选择这些选项:(define-key company-active-map (kbd "TAB") #'company-complete-common-or-cycle) 但是看起来像您的权利,当我更改为C-RET以外的其他选项 时,便获得了所需的性能。谢谢。
user2237076'1

@ user2237076只是一些额外的信息,默认情况下,还可以通过与选择周期M-pM-n,或ISEARCH他们C-s,或者直接选择与候选M-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过select)。

实际上我正在使用,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个变量才能获取公司以合理的方式行事……)。
Radon Rosborough
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.