diff options
Diffstat (limited to 'lisp/ravi-init-python.el')
| -rw-r--r-- | lisp/ravi-init-python.el | 164 |
1 files changed, 164 insertions, 0 deletions
diff --git a/lisp/ravi-init-python.el b/lisp/ravi-init-python.el new file mode 100644 index 0000000..7993092 --- /dev/null +++ b/lisp/ravi-init-python.el @@ -0,0 +1,164 @@ +;;; ravi-init-python.el --- python support + +;; Copyright (C) 2013 + +;; Author: <ravi@nero.lan> +;; Keywords: + +;; This program is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. + +;; This program is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with this program. If not, see <http://www.gnu.org/licenses/>. + +;;; Commentary: + +;; Python programming setup + +;;; Code: + +(use-package python + :mode ("\\.py\\'" . python-mode) + :commands python-shell-switch-to-shell + :config + (progn + + (add-hook 'python-mode-hook 'ravi/python-mode-hook) + (defun ravi/python-mode-hook() + ;; Set ipython as our interpreter + (setq python-shell-interpreter "ipython" + python-shell-interpreter-args "--pylab" + python-shell-prompt-regexp "In \\[[0-9]+\\]: " + python-shell-prompt-output-regexp "Out\\[[0-9]+\\]: " + python-shell-completion-setup-code + "from IPython.core.completerlib import module_completion" + python-shell-completion-module-string-code + "';'.join(module_completion('''%s'''))\n" + python-shell-completion-string-code + "';'.join(get_ipython().Completer.all_completions('''%s'''))\n" + ) + + ;; For ipython 0.10, uncomment the following: + ;; (setq python-shell-completion-string-code + ;; "';'.join(__IP.complete('''%s'''))\n" + ;; python-shell-completion-module-string-code "" + ;; ) + + (when (functionp 'helm-dash) + (setq-local helm-dash-docsets '("Python 2" "NumPy"))) + + ;; I'd really prefer indentation by 2 spaces, but have too much existing + ;; python code with indentation at 4 spaces. + (setq python-indent-offset 4) + ) + + (bind-key "<return>" 'newline-and-indent python-mode-map) + + ;; We no longer use smart-tab-mode + ;(add-to-list 'smart-tab-disabled-major-modes 'inferior-python-mode) + + (define-auto-insert "\\.py\\'" 'ravi/auto-insert-py) + (defun ravi/auto-insert-py () + (progn + (insert "#!/usr/bin/env python\n\n") + ) + ) + + (use-package virtualenvwrapper + :config + (progn + (venv-initialize-interactive-shells) + (venv-initialize-eshell) + (setq venv-location (expand-file-name "~/usr/local/venv/")) + ) + + :ensure t + ) + + ;; Use jedi.el for code completion plus documentation browsing. + ;; The main issue is that this requires both python-side and emacs-side + ;; support, but the python-side support cannot be installed as a package + ;; from MELPA. Fedora does not provide python-epc as an RPM either. We + ;; work around it by adding sexpdata, jedi and python-epc as git submodules. + (use-package jedi-core + :config + (progn + (defun ravi/jedi-setup () + (let ((basic-server-args (list + "--sys-path" (ravi/emacs-file "site-lisp/python-epc") + "--sys-path" (ravi/emacs-file "site-lisp/sexpdata") + "--sys-path" (ravi/emacs-file "site-lisp/jedi")) + )) + (set (make-local-variable 'jedi:server-args) + (if (and (boundp 'extra-jedi-args) + (listp extra-jedi-args)) + (append basic-server-args extra-jedi-args) + basic-server-args)) + (jedi:setup))) + + ;; Override pos-tip support to automatically delete tooltip + (defun ravi/jedi:tooltip-show (string) + (cond + ((and (memq 'pos-tip jedi:tooltip-method) window-system + (featurep 'pos-tip)) + (pos-tip-show (jedi:string-fill-paragraph string) + 'popup-tip-face nil nil 5)) + ((and (memq 'popup jedi:tooltip-method) + (featurep 'popup)) + (popup-tip string)) + (t (when (stringp string) + (let ((message-log-max nil)) + (message string)))))) + (fset 'jedi:tooltip-show 'ravi/jedi:tooltip-show) + + (defun ravi/python-jedi-hook-installer () + ;; (setq jedi:complete-on-dot t) ; needs auto-complete + (add-hook 'hack-local-variables-hook 'ravi/jedi-setup nil t)) + (add-hook 'python-mode-hook 'ravi/python-jedi-hook-installer) + ) + :ensure t + ) + + (use-package company-jedi + :config + (progn + (add-to-list 'company-backends 'company-jedi)) + :ensure t) + + (use-package sphinx-doc + :config + (progn + (defun ravi/sphinx-doc-setup () + (sphinx-doc-mode 1)) + (add-hook 'python-mode-hook 'ravi/sphinx-doc-setup) + ) + :diminish sphinx-doc-mode + :ensure t) + + (use-package python-docstring + :config + (progn + (defun ravi/python-docstring-mode-setup () + (python-docstring-mode 1)) + (add-hook 'python-mode-hook 'ravi/python-docstring-mode-setup)) + :diminish python-docstring-mode + :ensure t) + + (use-package electric-operator + :config + (progn + (add-hook 'python-mode-hook #'electric-operator-mode)) + ;; :diminish electric-operator + :ensure t) + ) + ) + +(provide 'ravi-init-python) + |
