我目前正在使用带有eglot(最小lsp 客户端)的Emacs。然而,当我一起使用片段库(例如,YASnippet、tempel)时,没有出现片段的补全。现在我可以指定代码片段名称并在代码中展开它。但我希望 emacs 的工作方式就像当我输入代码片段的名称时,它会显示代码片段的建议。
如果有一种方法可以在使用 eglot 时显示片段建议,我将不胜感激。我的 emacs 配置如下所示。
(use-package eglot
:ensure t
:config
(add-to-list 'eglot-server-programs '(c-mode . ("clangd")))
(add-to-list 'eglot-server-programs '(c++-mode . ("clangd")))
(add-to-list 'eglot-server-programs '(go-mode . ("gopls")))
(add-to-list 'eglot-server-programs '(rustic-mode . ("rust-analyzer")))
(add-to-list 'eglot-server-programs '(python-mode . ("pyls")))
(add-to-list 'eglot-server-programs '(LaTeX-mode . ("digestif")))
(add-hook 'c-mode-hook 'eglot-ensure)
(add-hook 'c++-mode-hook 'eglot-ensure)
(add-hook 'go-mode-hook 'eglot-ensure)
(add-hook 'rustic-mode-hook 'eglot-ensure)
(add-hook 'python-mode-hook 'eglot-ensure)
(add-hook 'LaTeX-mode-hook 'eglot-ensure)
;; format on save
(add-hook 'c-mode-hook '(lambda() (add-hook 'before-save-hook 'eglot-format-buffer nil t)))
(add-hook 'c++-mode-hook '(lambda() (add-hook 'before-save-hook 'eglot-format-buffer nil t)))
(add-hook 'python-mode-hook '(lambda() (add-hook 'before-save-hook 'eglot-format-buffer nil t)))
(define-key eglot-mode-map (kbd "C-c r") 'eglot-rename))
Run Code Online (Sandbox Code Playgroud)
(use-package yasnippet
:ensure t
:hook
(prog-mode . yas-minor-mode)
:bind
(("C-c y n" . yas-new-snippet)
("C-c y v" . yas-visit-snippet-file)
("C-c y i" . yas-insert-snippet))
:config
(yas-reload-all)
(setq yas-snippet-dirs
'("~/.emacs.d/snippets")))
Run Code Online (Sandbox Code Playgroud)
公司(我现在不使用公司,而是转移到科孚/开普敦。)
(use-package company
:ensure t
:diminish company-mode
:bind
(("C-M-i" . company-complete)
:map company-active-map
("M-n" . nil)
("M-p" . nil)
("C-h" . nil)
("C-n" . company-select-next)
("C-p" . company-select-previous)
("C-s" . company-filter-candidates)
("C-i" . company-complete-selection)
([tab] . company-complete-selection))
:hook
(after-init . global-company-mode)
:config
(setq company-backends '((company-capf :with company-yasnippet)))
(setq company-idle-delay 0
company-minimum-prefix-length 2
company-selection-wrap-around t
completion-ignore-case t
company-show-quick-access t))
Run Code Online (Sandbox Code Playgroud)
(use-package corfu
:ensure t
:custom
(corfu-cycle t)
(corfu-auto t)
(corfu-quit-at-boundary nil)
(corfu-scroll-margin 5)
(corfu-echo-documentation t)
:bind
(:map corfu-map
("TAB" . corfu-insert)
([tab] . corfu-insert)
("C-n" . corfu-next)
("C-p" . corfu-previous))
:init
(global-corfu-mode))
;;;;; cape ;;;;;
(use-package cape
:ensure t
:config
(add-to-list 'completion-at-point-functions (cape-company-to-capf #'company-yasnippet)))
Run Code Online (Sandbox Code Playgroud)
我终于从 emacs-jp slack 得到了解决方案。我将其转载,希望对有类似困扰的其他人有所帮助。
;; for company
(add-hook 'eglot-managed-mode-hook (lambda ()
(add-to-list 'company-backends
'(company-capf :with company-yasnippet))))
;; for corfu
(straight-use-package 'cape)
(defun my/eglot-capf ()
(setq-local completion-at-point-functions
(list (cape-super-capf
#'eglot-completion-at-point
(cape-company-to-capf #'company-yasnippet)))))
(add-hook 'eglot-managed-mode-hook #'my/eglot-capf)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2152 次 |
| 最近记录: |