Emacs + clojure。来自项目中所有源文件的自动完成数据

时间:2013-08-15 18:20:42

标签: emacs autocomplete clojure nrepl

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

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

  1. 来自其他项目文件的符号
  2. 外部图书馆(由leiningen管理)。
  3. 是否有任何现有的软件包完全涵盖案例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)
    

3 个答案:

答案 0 :(得分: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进入测试项目并打开它的文件时,我在项目中当前加载的每个命名空间上都有tab-completion。您似乎忘记了'ac-nrepl-setup上的'nrepl-interaction-mode-hook

答案 1 :(得分:2)

自动完成应该能够从所有打开的clojure文件中完成,但是现在我不能说可以从项目中完成&amp;库。这可能是通过Semantic(来自CEDET)完成的,但是现在还没有针对clojure代码的解析器。

我已开始在EDE(CEDET的项目相关部分)中使用Leiningen支持 - 一些代码存在于CEDET回购中,或者您可以在https://github.com/alexott/cedet/tree/devel查看我的CEDET回购(我计划将其合并回CEDET一段时间之后)

答案 2 :(得分: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的模式 苹果酒 paredit 自动完成 自动缩进模式 亮点 - 括号 AC-苹果酒 弹出

您可能至少需要接受苹果酒,苹果酒,clojure模式,自动完成功能,弹出自动完成功能!

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

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

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

M-x cider-jack-in

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