2012-06-26 91 views
1

编辑:Emacs Python自动完成

我刚刚意识到我使用auto-complete.el的0.2版本。我想我需要使用auto-complete.el版本0.1。我可以从哪里下载?我只能在Google上找到更新的版本。


我想在Emacs中为Python设置自动完成。

我使用Ubuntu LTS版本,我安装了Python和Emacs。

这是我的.emacs文件:

(setq-default indent-tabs-mode nil) ; always replace tabs with spaces 
(setq-default tab-width 4) ; set tab width to 4 for all buffers 

(add-to-list 'load-path "~/.emacs.d/vendor") 
(progn (cd "~/.emacs.d/vendor") 
     (normal-top-level-add-subdirs-to-load-path)) 

(require 'python) 
(require 'auto-complete) 
(require 'yasnippet) 

(autoload 'python-mode "python-mode" "Python Mode." t) 
(add-to-list 'auto-mode-alist '("\\.py\\'" . python-mode)) 
(add-to-list 'interpreter-mode-alist '("python" . python-mode)) 

;; Initialize Pymacs                       
(autoload 'pymacs-apply "pymacs") 
(autoload 'pymacs-call "pymacs") 
(autoload 'pymacs-eval "pymacs" nil t) 
(autoload 'pymacs-exec "pymacs" nil t) 
(autoload 'pymacs-load "pymacs" nil t) 
;; Initialize Rope                        
(pymacs-load "ropemacs" "rope-") 
(setq ropemacs-enable-autoimport t) 

;; Initialize Yasnippet                       
;Don't map TAB to yasnippet                      
;In fact, set it to something we'll never use because               
;we'll only ever trigger it indirectly.                   
(setq yas/trigger-key (kbd "C-c <kp-multiply>")) 
(yas/initialize) 
(yas/load-directory "~/.emacs.d/snippets") 



;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;           
;;; Auto-completion                        
;;; Integrates:                        
;;; 1) Rope                         
;;; 2) Yasnippet                        
;;; all with AutoComplete.el                     
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;           
(defun prefix-list-elements (list prefix) 
    (let (value) 
    (nreverse 
    (dolist (element list value) 
     (setq value (cons (format "%s%s" prefix element) value)))))) 
(defvar ac-source-rope 
    '((candidates 
    . (lambda() 
     (prefix-list-elements (rope-completions) ac-target)))) 
    "Source for Rope") 
(defun ac-python-find() 
    "Python `ac-find-function'." 
    (require 'thingatpt) 
    (let ((symbol (car-safe (bounds-of-thing-at-point 'symbol)))) 
    (if (null symbol) 
     (if (string= "." (buffer-substring (- (point) 1) (point))) 
      (point) 
      nil) 
     symbol))) 
(defun ac-python-candidate() 
    "Python `ac-candidates-function'" 
    (let (candidates) 
    (dolist (source ac-sources) 
     (if (symbolp source) 
      (setq source (symbol-value source))) 
     (let* ((ac-limit (or (cdr-safe (assq 'limit source)) ac-limit)) 
      (requires (cdr-safe (assq 'requires source))) 
      cand) 
     (if (or (null requires) 
       (>= (length ac-target) requires)) 
      (setq cand 
        (delq nil 
         (mapcar (lambda (candidate) 
            (propertize candidate 'source source)) 
           (funcall (cdr (assq 'candidates source))))))) 
     (if (and (> ac-limit 1) 
       (> (length cand) ac-limit)) 
      (setcdr (nthcdr (1- ac-limit) cand) nil)) 
     (setq candidates (append candidates cand)))) 
    (delete-dups candidates))) 
(add-hook 'python-mode-hook 
      (lambda() 
       (auto-complete-mode 1) 
       (set (make-local-variable 'ac-sources) 
         (append ac-sources '(ac-source-rope) '(ac-source-yasnippet))) 
       (set (make-local-variable 'ac-find-function) 'ac-python-find) 
       (set (make-local-variable 'ac-candidate-function) 'ac-python-candidate) 
       (set (make-local-variable 'ac-auto-start) nil))) 

;;Ryan's python specific tab completion                   
(defun ryan-python-tab() 
    ; Try the following:                       
    ; 1) Do a yasnippet expansion                     
    ; 2) Do a Rope code completion                    
    ; 3) Do an indent                        
    (interactive) 
    (if (eql (ac-start) 0) 
     (indent-for-tab-command))) 

(defadvice ac-start (before advice-turn-on-auto-start activate) 
    (set (make-local-variable 'ac-auto-start) t)) 
(defadvice ac-cleanup (after advice-turn-off-auto-start activate) 
    (set (make-local-variable 'ac-auto-start) nil)) 

(define-key python-mode-map "\t" 'ryan-python-tab) 
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;           
;;; End Auto Completion                       
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 

里面的.emacs.d目录我:

pymacs.el 
init_python.el 
vendor/ 
snippets/ 

的.emacs.d /供应商我已经安装了内部pymacs,yasnippet和自动完成,所以它看起来是这样的:

auto-complete.el 
pinard-Pymacs-4be2c15/ 
yasnippet-0.5.9/ 

当我启动Emacs这样的:

emacs -nw manage.py 

我收到此错误信息:

![enter image description here][1] 

任何想法如何得到它的工作?

我一直在Google上搜索很长时间,但我找不到任何明确的说明如何让它们一起工作。

回答

0

据我所知,Python模式附带Emacs,所以你甚至不需要做任何事情来激活它。我在Python中一起使用autocompleteyasnippet,它似乎对我很好。下面是我的.emacs

(add-to-list 'load-path 
       "~/.emacs.d/plugins/yasnippet") 

... 

(require 'yasnippet) 
(yas/global-mode 1) 

... 
(require 'auto-complete-config) 
... 
(add-hook 'python-mode-hook 'auto-complete-mode) 

我得到了我从this github repo yasnippet的版本,我从developers' site自动完成的版本(与来自EmacsWiki)中的相关位。

1

不要使用rope/pymacs for python完成Emacs,我建议使用https://github.com/tkf/emacs-jedi,这真的很棒。

您可以使用el-get(https://github.com/dimitri/el-get)安装jedi,它会为您安装必要的依赖关系。

我的.emacs绝地配置:

;;; jedi completion 
;;; see https://github.com/tkf/emacs-jedi 

;; jedi dependency: deferred 
(add-to-list 'load-path (expand-file-name 
         "~/.emacs.d/el-get/deferred")) 
;; jedi dependency: deferred 
(add-to-list 'load-path (expand-file-name 
         "~/.emacs.d/el-get/ctable")) 
;; jedi dependency: epc 
(add-to-list 'load-path (expand-file-name 
         "~/.emacs.d/el-get/epc")) 
(add-to-list 'load-path (expand-file-name 
         "~/.emacs.d/el-get/jedi")) 
(require 'jedi) 
(setq jedi:server-args 
     '("--sys-path" "/usr/lib/python2.7/" 
     "--sys-path" "/usr/lib/python2.7/site-packages")) 

(setq jedi:setup-keys t) 
0

不要以为报的错误与蟒蛇模式什么的。 也许做一个grep,搜索发生错误的程序。 对选项“-nw”的WRT,图形,成像支持可能被错过或损坏。