【问题标题】:How to use Cider's built-in autocompletion in Clojure?如何在 Clojure 中使用 Cider 的内置自动完成功能?
【发布时间】:2014-04-23 01:55:05
【问题描述】:

根据this

CIDER 中的内置完成逻辑依赖于库 clojure-complete,因此您必须将它作为您的类路径才能完成工作。如果您连接到从 lein 开始的 nREPL 服务器(例如,您调用了 M-x cider-jack-in) - 您无需执行任何操作。

所以——我在 Emacs 24.3 中使用了一个 nREPL 插孔,所以我猜想“我无事可做”。但是,我的 Clojure 源文件中没有任何自动完成功能。

为了安全起见,我通过 Elpa 卸载并重新安装了 Cider。显然没有必要手动安装我读过的任何其他自动完成包,但我必须承认让自动完成工作似乎是一项艰巨的任务,谁能指出我错过了什么?

【问题讨论】:

  • 您是否检查过您的自动完成模式是否开启? M-x 自动完成模式。如果是,请尝试 M-x 自动完成功能,看看是否有任何 pop=up 帮助。
  • @GuruDevanla auto-complete 模式与苹果酒使用的 company-mode 不同,我相信。所以我认为将两者结合起来是没有意义的。也许其他人会确认。但是company-mode 在我尝试时也不是可用模式,但它也应该不是您需要手动安装的东西,所以我对此的困惑仍在继续。
  • 我建议,因为我通常在需要对 Clojure+Cider 使用自动完成功能时打开它。没有它,它对我从来没有用过。
  • completionauto-completion 不同...如果您在按下TAB 时收到完成建议,一切都会为您工作。如果您需要内联补全建议,您必须安装 company-mode 并启用其 company-capf 补全后端。

标签: emacs clojure cider


【解决方案1】:

这是我的旧配置。我已经有一段时间没有使用 Clojure 了,但是 我检查过它仍然有效:

(require 'ac-nrepl)
(defun clojure-auto-complete ()
  (interactive)
  (let ((ac-sources
         `(ac-source-nrepl-ns
           ac-source-nrepl-vars
           ac-source-nrepl-ns-classes
           ac-source-nrepl-all-classes
           ac-source-nrepl-java-methods
           ac-source-nrepl-static-methods
           ,@ac-sources)))
    (auto-complete)))

(defun my-clojure-hook ()
  (auto-complete-mode 1)
  (define-key clojure-mode-map
      (kbd "β") 'clojure-auto-complete))

(add-hook 'clojure-mode-hook 'my-clojure-hook)

我很确定我选择了单独的功能而不是修改 ac-sources 出于性能原因(我在 0.4 时有 ac-delay)。

【讨论】:

  • 是的,在安装ac-nrepl 之后就做到了。我不确定这是否是 company-modecider 本身所做的,但至少我已经完成了工作。
  • 实际上,在这段代码中,自动完成模式也被打开了。
【解决方案2】:

确认: 4 月 23 日 6:57 的 abo-abo 答案有效。

当然,只需将“ac-nrepl”改为“ac-cider”即可。

(GNU Emacs 24.3.1 (x86_64-pc-linux-gnu, GTK+ 版本 3.10.9) 2014 年 6 月 6 日在 brownie 上,由 Debian 修改)

【讨论】:

    【解决方案3】:
    (require 'auto-complete-config)
    (require 'clojure-mode)
    (require 'cider-mode)
    (require 'ac-cider)
    
    (ac-config-default)
    ;(add-hook 'cider-repl-mode-hook 'ac-cider-setup)                                                                                                                                             
    (add-hook 'cider-mode-hook 'ac-cider-setup)
    (eval-after-load "auto-complete"
      '(add-to-list 'ac-modes 'cider-repl-mode))
    
    (add-hook 'clojure-mode-hook 'paredit-mode)
    ;(add-hook 'clojurescript-mode-hook 'paredit-mode)                                                                                                                                            
    (add-hook 'clojure-mode-hook 'rainbow-delimiters-mode)
    (setq cider-repl-pop-to-buffer-on-connect nil)
    
    (require 'highlight-parentheses)
    (add-hook 'clojure-mode-hook
              (lambda ()
                (highlight-parentheses-mode t)))
    
    (defun set-auto-complete-as-completion-at-point-function ()
      (setq completion-at-point-functions '(auto-complete)))
    (add-hook 'auto-complete-mode-hook 'set-auto-complete-as-completion-at-point-function)
    ;(add-hook 'cider-repl-mode-hook 'set-auto-complete-as-completion-at-point-function)                                                                                                          
    (add-hook 'cider-mode-hook 'set-auto-complete-as-completion-at-point-function)
    (eval-after-load "cider"
      '(define-key cider-mode-map (kbd "C-c C-d") 'ac-cider-popup-doc))
    

    我的包裹是:

    ac-cider
    auto-complete
    auto-indent
    cider
    clojure-mode
    highlight-parentheses
    parendit
    popup
    rainbow-delimiters
    

    我不想对 repl 和 script 使用自动完成功能,所以我评论了它们。

    你可能不需要它们,但它们都很有用。如果您不想更改 init.el 文件,最好使用列出的所有包。

    完成后,用 Lein 制作一个项目,然后添加

    :plugins [[cider/cider-nrepl "0.8.2"]]
    

    到 project.clj 文件。

    现在,它几乎完成了。 用 Emacs 打开一个源文件,然后运行

    M-x cider-jack-in
    

    那么你必须能够使用代码的自动完成功能!

    【讨论】:

      猜你喜欢
      • 2021-06-24
      • 2014-07-09
      • 2018-12-11
      • 2016-11-16
      • 2022-08-15
      • 2014-04-20
      • 1970-01-01
      • 2015-06-20
      • 1970-01-01
      相关资源
      最近更新 更多