4

我已经开发 C# 应用程序很长时间了。商业 IDE 和工具提供了非常好的代码完成功能。我现在正在学习 clojure,我真的很怀念熟悉的工作流程。

所以,关于emacs。我已经安装了nreplac-nreplclojure-mode。自动完成在 repl 中工作正常。它也适用于当前缓冲区中的符号。但不适用于:

  1. 来自其他项目文件的符号
  2. 外部库(由 leiningen 管理)。

是否有任何现有的包可以完全涵盖案例 1 和 2?

我的 clojure 相关配置:

;;;;;;;;;;;;;;;
;;; clojure ;;;
;;;;;;;;;;;;;;;

(require 'nrepl)

;; Configure nrepl.el
(setq nrepl-hide-special-buffers t)
(setq nrepl-popup-stacktraces-in-repl t)
(setq nrepl-history-file "~/.emacs.d/nrepl-history")

;; Some default eldoc facilities
(add-hook 'nrepl-connected-hook
      (defun pnh-clojure-mode-eldoc-hook ()
        (add-hook 'clojure-mode-hook 'turn-on-eldoc-mode)
        (add-hook 'nrepl-interaction-mode-hook 'nrepl-turn-on-eldoc-mode)
        (nrepl-enable-on-existing-clojure-buffers)))

;; Repl mode hook
(add-hook 'nrepl-mode-hook 'subword-mode)

;; Auto completion for NREPL
(require 'ac-nrepl)
(eval-after-load "auto-complete"
  '(add-to-list 'ac-modes 'nrepl-mode))

(add-hook 'nrepl-mode-hook 'ac-nrepl-setup)
(add-hook 'clojure-nrepl-mode-hook 'ac-nrepl-setup)

(define-key clojure-mode-map (kbd "C-<ret>") 'nrepl-eval-expression-at-point)

;(global-set-key (kbd "C-<ret>") 'nrepl-eval-expression-at-point)

;;;;;;;;;;;;;;;;;;;;;
;;; auto-complete ;;; 
;;;;;;;;;;;;;;;;;;;;;

(require 'auto-complete-config)
(add-to-list 'ac-dictionary-directories "~/.emacs.d/ac-dict")
(setq ac-delay 0.0)
(setq ac-use-quick-help t)
(setq ac-quick-help-delay 0.05)
(setq ac-use-fuzzy 1)
(setq ac-auto-start 1)
(setq ac-auto-show-menu 1)
(ac-config-default)

(define-key ac-mode-map (kbd "C-SPC") 'auto-complete)
4

3 回答 3

8

安装新的 nrepl 和 ac-nrepl 后,这是我放入 .emacs 的内容

(package-initialize)
(require 'auto-complete)
(global-auto-complete-mode)
(add-hook 'nrepl-mode-hook 'ac-nrepl-setup)
(add-hook 'nrepl-interaction-mode-hook 'ac-nrepl-setup)
(add-hook 'clojure-nrepl-mode-hook 'ac-nrepl-setup)

当我现在nrepl-jack-in进入一个测试项目并打开它的文件时,我对项目中当前加载的每个命名空间都有制表符完成。好像你忘记'ac-nrepl-setup'nrepl-interaction-mode-hook.

于 2013-08-15T23:22:52.227 回答
2

自动完成应该能够从所有打开的 clojure 文件中完成,但现在我不能说可以从项目和库中完成。这可能通过 Semantic(来自 CEDET)来完成,但现在那里没有用于 clojure 代码的解析器。

我已经开始在 EDE(CEDET 的项目相关部分)中支持 Leiningen 工作 - CEDET 存储库中存在一些代码,或者您可以在https://github.com/alexott/cedet/tree/devel上查看我的 CEDET 存储库(我计划稍后将其合并回 CEDET)

于 2013-08-15T18:55:42.107 回答
1
(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))

这是我的 init.el 文件。我的包列表包含:clojure-mode cider paredit auto-complete auto-indent-mode highlight-parentheses ac-cider popup

您可能至少需要 ac-cider、cider、clojure-mode、自动完成、自动完成功能的弹出窗口!

**安装并设置 init.el 文件后,使用 Lein 创建一个 Clojure 项目。(它不适用于 .clj 文件,仅适用于 Leiningen 项目。)添加

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

到 project.clj 文件,然后打开一个源文件并运行:**

M-x cider-jack-in

然后您必须能够使用 ac-cider 使用自动完成功能。

于 2015-01-31T07:17:23.907 回答