Skip to content

Files

Latest commit

a9a56f5 · Jun 22, 2012

History

History
171 lines (149 loc) · 7.38 KB

starter-kit-python.org

File metadata and controls

171 lines (149 loc) · 7.38 KB

Starter Kit Python

This is part of the Emacs Starter Kit.

Starter kit Python

Support for the Python programming language.

Use Python’s python-mode.el instead of Emacs’ python.el

Replace the Python mode that comes with Emacs by the Python mode supplied by the Python distribution itself.

(require 'python-mode)
(add-to-list 'auto-mode-alist '("\\.py\\'" . python-mode))
(add-to-list 'interpreter-mode-alist '("python" . python-mode))
(setq org-babel-python-mode 'python-mode)

;;; My modification: get it to stop at underscores...not
(modify-syntax-entry ?_ "w" py-mode-syntax-table)

Facilitate the use of IPython

(defun python-use-ipython (cmd args)
  (setq ipython-command cmd)
  (setq py-python-command-args args)
  (require 'ipython)
  ;; (setq ipython-completion-command-string
  ;;       "print(';'.join(__IP.Completer.all_completions('%s')))\n")
  )
(setq ipython-command "/usr/local/share/python/ipython")

(setq ipython-completion-command-string "print(';'.join(get_ipython().Completer.complete('%s')[1])) #PYTHON-MODE SILENT\n")


    ;;; http://gunnarwrobel.de/wiki/Python.html
(setq interpreter-mode-alist
      (cons '("python" . python-mode)
            interpreter-mode-alist)
      
      python-mode-hook
      '(lambda () (progn
               (set-variable 'py-indent-offset 4)
               (set-variable 'py-smart-indentation nil)
               (set-variable 'indent-tabs-mode nil) )))

;;; Added by Chris
;; (python-use-ipython "/usr/local/share/python/ipython")

In your personal configuration, add something like this to use IPython:

(python-use-ipython "/usr/local/bin/ipython" '("-colors" "LightBG" "-nobanner"))

Virtualenv support

(add-to-list 'load-path (concat dotfiles-dir "/src/virtualenv"))
(require 'virtualenv)

New ropemacs thing

;;  (load-library "init_python")
  ;;; Sometimes commenting so it doesn't stop my emacs startup, requiring me to --debug-init

Ropemacs and Pymacs

  ;;; http://www.enigmacurry.com/2009/01/21/autocompleteel-python-code-completion-in-emacs/
  ;; (add-to-list 'load-path "~/.emacs.d/src/Pymacs-.24b/")
  
  ;; 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)
  
  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;                                         
  ;;; 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) 2)))
;;;                   (set (make-local-variable 'ac-auto-start) nil)))
;;; trying to see why ac won't work
  
  ;;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                                                                                        
  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

Use Cython mode

(require 'cython-mode)
(add-to-list 'auto-mode-alist '("\\.pyx\\'" . cython-mode))
(add-to-list 'auto-mode-alist '("\\.pxd\\'" . cython-mode))
(add-to-list 'auto-mode-alist '("\\.pxi\\'" . cython-mode))