2012-06-26 4 views
1

Редактировать:Emacs Python Auto Completion

Я только что понял, что использую версию 0.2 auto-complete.el. Я думаю, мне нужно использовать auto-complete.el версию 0.1. Где я могу скачать его? Я могу найти только новую версию в Google.


Я пытаюсь настроить автоматическое завершение для Python в Emacs.

Я использую версию 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, поэтому вам даже не нужно ничего делать, чтобы его активировать. Я использую autocomplete и yasnippet вместе в python, и, похоже, он работает нормально. Вот соответствующие биты моих .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) 

Я получил свою версию yasnippet от this github repo, и моей версии автозаполнения из developers' site (ссылок с EmacsWiki).

1

Не используйте веревки/пиамы для завершения работы с питоном Emacs, я рекомендую использовать https://github.com/tkf/emacs-jedi, что действительно потрясающе.

И вы можете установить jedi с помощью el-get (https://github.com/dimitri/el-get), и он установит для вас необходимые зависимости.

Моих .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, ища программу, которая выдает эту ошибку. WRT для опции «-nw», графическая поддержка изображений может быть пропущена или сломана.