318bd23dc4
Now in addition to the <layer>/init-<pkg> function there are - <layer>/pre-init-<pkg> (executed before <layer>/init-<pkg>) - <layer>/post-init-<pkg> (executed after <layer>/init-<pkg>) The init function is mandatory, if it is not present then the package is ignored and not installed. This mechanism allows soft (implicit) cross layers dependencies between packages (see company for more info). It is now possible to remove flycheck from spacemacs layer and move it to its own syntax-checking layer.
272 lines
9.5 KiB
EmacsLisp
272 lines
9.5 KiB
EmacsLisp
;;; packages.el --- Python Layer packages File for Spacemacs
|
|
;;
|
|
;; Copyright (c) 2012-2014 Sylvain Benner
|
|
;; Copyright (c) 2014-2015 Sylvain Benner & Contributors
|
|
;;
|
|
;; Author: Sylvain Benner <sylvain.benner@gmail.com>
|
|
;; URL: https://github.com/syl20bnr/spacemacs
|
|
;;
|
|
;; This file is not part of GNU Emacs.
|
|
;;
|
|
;;; License: GPLv3
|
|
|
|
(defvar python-packages
|
|
'(
|
|
anaconda-mode
|
|
ac-anaconda
|
|
company
|
|
company-anaconda
|
|
eldoc
|
|
evil-jumper
|
|
flycheck
|
|
hy-mode
|
|
pony-mode
|
|
pyenv-mode
|
|
pyvenv
|
|
python
|
|
semantic
|
|
smartparens
|
|
cython-mode
|
|
)
|
|
"List of all packages to install and/or initialize. Built-in packages
|
|
which require an initialization must be listed explicitly in the list.")
|
|
|
|
(defun python/init-ac-anaconda ()
|
|
(use-package ac-anaconda
|
|
:if (boundp 'ac-sources)
|
|
:defer t
|
|
:init
|
|
(progn
|
|
(add-hook 'python-mode-hook 'ac-anaconda-setup)
|
|
(evilify anaconda-nav-mode anaconda-nav-mode-map
|
|
(kbd "H") 'previous-error
|
|
(kbd "J") 'anaconda-nav-next-module
|
|
(kbd "K") 'anaconda-nav-previous-module
|
|
(kbd "L") 'next-error))))
|
|
|
|
(defun python/init-anaconda-mode ()
|
|
(use-package anaconda-mode
|
|
:defer t
|
|
:init (add-hook 'python-mode-hook 'anaconda-mode)
|
|
:config
|
|
(progn
|
|
(evil-leader/set-key-for-mode 'python-mode
|
|
"mhh" 'anaconda-mode-view-doc
|
|
"mgg" 'anaconda-mode-goto)
|
|
(spacemacs|hide-lighter anaconda-mode))))
|
|
|
|
(defun python/init-cython-mode ()
|
|
(use-package cython-mode
|
|
:defer t
|
|
:init
|
|
(progn
|
|
(evil-leader/set-key-for-mode 'cython-mode
|
|
"mhh" 'anaconda-mode-view-doc
|
|
"mgg" 'anaconda-mode-goto)
|
|
)))
|
|
|
|
(defun python/init-eldoc ()
|
|
(add-hook 'python-mode-hook 'eldoc-mode))
|
|
|
|
(defun python/init-evil-jumper ()
|
|
(defadvice anaconda-mode-goto (before python/anaconda-mode-goto activate)
|
|
(evil-jumper--push)))
|
|
|
|
(defun python/init-pony-mode ()
|
|
(use-package pony-mode
|
|
:defer t
|
|
:init (progn
|
|
(evil-leader/set-key-for-mode 'python-mode
|
|
; d*j*ango f*a*bric
|
|
"mjaf" 'pony-fabric
|
|
"mjad" 'pony-fabric-deploy
|
|
; d*j*ango *f*iles
|
|
"mjfs" 'pony-goto-settings
|
|
"mjfc" 'pony-setting
|
|
"mjft" 'pony-goto-template
|
|
"mjfr" 'pony-resolve
|
|
; d*j*ango *i*nteractive
|
|
"mjid" 'pony-db-shell
|
|
"mjis" 'pony-shell
|
|
; d*j*ango *m*anage
|
|
; not including one-off management commands like "flush" and
|
|
; "startapp" even though they're implemented in pony-mode,
|
|
; because this is much handier
|
|
"mjm" 'pony-manage
|
|
; d*j*ango *r*unserver
|
|
"mjrd" 'pony-stopserver
|
|
"mjro" 'pony-browser
|
|
"mjrr" 'pony-restart-server
|
|
"mjru" 'pony-runserver
|
|
"mjrt" 'pony-temp-server
|
|
; d*j*ango *s*outh/*s*yncdb
|
|
"mjsc" 'pony-south-convert
|
|
"mjsh" 'pony-south-schemamigration
|
|
"mjsi" 'pony-south-initial
|
|
"mjsm" 'pony-south-migrate
|
|
"mjss" 'pony-syncdb
|
|
; d*j*ango *t*est
|
|
"mjtd" 'pony-test-down
|
|
"mjte" 'pony-test-goto-err
|
|
"mjto" 'pony-test-open
|
|
"mjtt" 'pony-test
|
|
"mjtu" 'pony-test-up))))
|
|
|
|
(defun python/init-pyenv-mode ()
|
|
(use-package pyenv-mode
|
|
:defer t
|
|
:init (progn
|
|
(evil-leader/set-key-for-mode 'python-mode
|
|
"mvs" 'pyenv-mode-set
|
|
"mvu" 'pyenv-mode-unset))))
|
|
|
|
(defun python/init-pyvenv ()
|
|
(use-package pyvenv
|
|
:defer t
|
|
:init
|
|
(evil-leader/set-key-for-mode 'python-mode
|
|
"mV" 'pyvenv-workon)))
|
|
|
|
(defun python/init-python ()
|
|
(use-package python
|
|
:defer t
|
|
:init
|
|
(progn
|
|
(defun python-default ()
|
|
(setq mode-name "Python"
|
|
tab-width 4
|
|
;; auto-indent on colon doesn't work well with if statement
|
|
electric-indent-chars (delq ?: electric-indent-chars))
|
|
(annotate-pdb)
|
|
(spacemacs/highlight-TODO-words)
|
|
;; make C-j work the same way as RET
|
|
(local-set-key (kbd "C-j") 'newline-and-indent))
|
|
|
|
(defun python-setup-shell ()
|
|
(if (executable-find "ipython")
|
|
(setq python-shell-interpreter "ipython"
|
|
;; python-shell-interpreter-args (if (system-is-mac)
|
|
;; "--gui=osx --matplotlib=osx --colors=Linux"
|
|
;; (if (system-is-linux)
|
|
;; "--gui=wx --matplotlib=wx --colors=Linux"))
|
|
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")
|
|
(setq python-shell-interpreter "python")))
|
|
|
|
(add-all-to-hook 'python-mode-hook
|
|
'python-default
|
|
'python-setup-shell))
|
|
:config
|
|
(progn
|
|
(add-hook 'inferior-python-mode-hook 'smartparens-mode)
|
|
;; add support for `ahs-range-beginning-of-defun' for python-mode
|
|
(eval-after-load 'auto-highlight-symbol
|
|
'(add-to-list 'ahs-plugin-bod-modes 'python-mode))
|
|
|
|
(defun python-shell-send-buffer-switch ()
|
|
"Send buffer content to shell and switch to it in insert mode."
|
|
(interactive)
|
|
(python-shell-send-buffer)
|
|
(python-shell-switch-to-shell)
|
|
(evil-insert-state))
|
|
|
|
(defun python-shell-send-defun-switch ()
|
|
"Send function content to shell and switch to it in insert mode."
|
|
(interactive)
|
|
(python-shell-send-defun nil)
|
|
(python-shell-switch-to-shell)
|
|
(evil-insert-state))
|
|
|
|
(defun python-shell-send-region-switch (start end)
|
|
"Send region content to shell and switch to it in insert mode."
|
|
(interactive "r")
|
|
(python-shell-send-region start end)
|
|
(python-shell-switch-to-shell)
|
|
(evil-insert-state))
|
|
|
|
(defun python-start-or-switch-repl ()
|
|
"Start and/or switch to the REPL."
|
|
(interactive)
|
|
(python-shell-switch-to-shell)
|
|
(evil-insert-state))
|
|
|
|
;; reset compile-command (by default it is `make -k')
|
|
(setq compile-command nil)
|
|
(defun spacemacs/python-execute-file (arg)
|
|
"Execute a python script in a shell."
|
|
(interactive "P")
|
|
;; set compile command to buffer-file-name
|
|
;; universal argument put compile buffer in comint mode
|
|
(setq universal-argument t)
|
|
(if arg
|
|
(call-interactively 'compile)
|
|
|
|
(setq compile-command (format "python %s" (file-name-nondirectory
|
|
buffer-file-name)))
|
|
(compile compile-command t)
|
|
(with-current-buffer (get-buffer "*compilation*")
|
|
(inferior-python-mode))))
|
|
|
|
(defun spacemacs/python-execute-file-focus (arg)
|
|
"Execute a python script in a shell and switch to the shell buffer in
|
|
`insert state'."
|
|
(interactive "P")
|
|
(spacemacs/python-execute-file arg)
|
|
(switch-to-buffer-other-window "*compilation*")
|
|
(end-of-buffer)
|
|
(evil-insert-state))
|
|
|
|
(evil-leader/set-key-for-mode 'python-mode
|
|
"mcc" 'spacemacs/python-execute-file
|
|
"mcC" 'spacemacs/python-execute-file-focus
|
|
"mdb" 'python-toggle-breakpoint
|
|
"msB" 'python-shell-send-buffer-switch
|
|
"msb" 'python-shell-send-buffer
|
|
"msF" 'python-shell-send-defun-switch
|
|
"msf" 'python-shell-send-defun
|
|
"msi" 'python-start-or-switch-repl
|
|
"msR" 'python-shell-send-region-switch
|
|
"msr" 'python-shell-send-region)
|
|
|
|
(define-key inferior-python-mode-map (kbd "C-j") 'comint-next-input)
|
|
(define-key inferior-python-mode-map (kbd "C-k") 'comint-previous-input)
|
|
(define-key inferior-python-mode-map (kbd "C-l") 'comint-clear-buffer)
|
|
(define-key inferior-python-mode-map (kbd "C-r") 'comint-history-isearch-backward))))
|
|
|
|
(defun python/init-flycheck ()
|
|
(add-hook 'python-mode-hook 'flycheck-mode))
|
|
|
|
(defun spacemacs/init-hy-mode ()
|
|
(use-package hy-mode
|
|
:defer t))
|
|
|
|
(defun python/init-semantic ()
|
|
;; required to correctly load semantic mode
|
|
;; using the python-mode-hook triggers an error about a deleted buffer.
|
|
(eval-after-load 'python '(semantic-mode 1)))
|
|
|
|
(defun python/init-smartparens ()
|
|
(defadvice python-indent-dedent-line-backspace
|
|
(around python/sp-backward-delete-char activate)
|
|
(let ((pythonp (or (not smartparens-strict-mode)
|
|
(char-equal (char-before) ?\s))))
|
|
(if pythonp
|
|
ad-do-it
|
|
(call-interactively 'sp-backward-delete-char)))))
|
|
|
|
(when (configuration-layer/layer-declaredp 'auto-completion)
|
|
(defun python/post-init-company ()
|
|
(spacemacs|enable-company python-mode))
|
|
|
|
(defun python/init-company-anaconda ()
|
|
(use-package company-anaconda
|
|
:defer t
|
|
:init
|
|
;; we don't use the yasnippet backend here because it
|
|
;; produces some weird bug in company-anaconda back end
|
|
;; (like the f, s, v suffix being at the wrong place in the
|
|
;; completion menu)
|
|
(push 'company-anaconda company-backends-python-mode))))
|