2015-01-14 04:12:56 +00:00
|
|
|
;;; packages.el --- Python Layer packages File for Spacemacs
|
|
|
|
;;
|
2016-01-12 02:40:54 +00:00
|
|
|
;; Copyright (c) 2012-2016 Sylvain Benner & Contributors
|
2015-01-14 04:12:56 +00:00
|
|
|
;;
|
|
|
|
;; Author: Sylvain Benner <sylvain.benner@gmail.com>
|
|
|
|
;; URL: https://github.com/syl20bnr/spacemacs
|
|
|
|
;;
|
|
|
|
;; This file is not part of GNU Emacs.
|
|
|
|
;;
|
|
|
|
;;; License: GPLv3
|
|
|
|
|
2015-04-19 03:40:24 +00:00
|
|
|
(setq python-packages
|
2014-11-10 04:54:10 +00:00
|
|
|
'(
|
|
|
|
anaconda-mode
|
2015-04-09 03:57:22 +00:00
|
|
|
company
|
2014-11-10 04:54:10 +00:00
|
|
|
company-anaconda
|
2015-04-09 03:57:22 +00:00
|
|
|
cython-mode
|
2014-11-10 04:54:10 +00:00
|
|
|
eldoc
|
2015-09-21 00:56:37 +00:00
|
|
|
evil-matchit
|
2014-11-10 04:54:10 +00:00
|
|
|
flycheck
|
2015-07-24 02:20:25 +00:00
|
|
|
helm-cscope
|
2015-03-29 04:57:43 +00:00
|
|
|
helm-pydoc
|
2014-12-14 05:19:20 +00:00
|
|
|
hy-mode
|
2015-10-29 08:42:37 +00:00
|
|
|
live-py-mode
|
2016-04-05 20:41:05 +00:00
|
|
|
(nose :location local)
|
|
|
|
org
|
2015-04-25 03:54:39 +00:00
|
|
|
pip-requirements
|
2015-01-30 15:30:10 +00:00
|
|
|
pyenv-mode
|
2016-01-18 03:06:04 +00:00
|
|
|
(pylookup :location local)
|
2015-06-08 03:59:23 +00:00
|
|
|
pytest
|
2016-03-26 07:24:35 +00:00
|
|
|
(python :location built-in)
|
2015-06-08 03:59:23 +00:00
|
|
|
pyvenv
|
2016-03-18 14:37:57 +00:00
|
|
|
py-yapf
|
2014-12-09 17:08:30 +00:00
|
|
|
semantic
|
2014-12-12 03:16:09 +00:00
|
|
|
smartparens
|
2015-04-15 22:57:31 +00:00
|
|
|
stickyfunc-enhance
|
2015-07-24 02:20:25 +00:00
|
|
|
xcscope
|
2015-04-19 03:40:24 +00:00
|
|
|
))
|
2014-11-10 04:54:10 +00:00
|
|
|
|
2014-12-09 03:19:55 +00:00
|
|
|
(defun python/init-anaconda-mode ()
|
|
|
|
(use-package anaconda-mode
|
|
|
|
:defer t
|
2015-09-22 23:28:53 +00:00
|
|
|
:init
|
|
|
|
(progn
|
2015-09-23 06:58:48 +00:00
|
|
|
(setq anaconda-mode-installation-directory
|
|
|
|
(concat spacemacs-cache-directory "anaconda-mode"))
|
2016-04-16 02:08:35 +00:00
|
|
|
(add-hook 'python-mode-hook 'anaconda-mode))
|
2014-12-09 03:19:55 +00:00
|
|
|
:config
|
|
|
|
(progn
|
2015-11-18 00:38:05 +00:00
|
|
|
(spacemacs/set-leader-keys-for-major-mode 'python-mode
|
2015-11-22 17:45:12 +00:00
|
|
|
"hh" 'anaconda-mode-show-doc
|
|
|
|
"gg" 'anaconda-mode-find-definitions
|
|
|
|
"ga" 'anaconda-mode-find-assignments
|
2015-11-25 09:21:44 +00:00
|
|
|
"gb" 'anaconda-mode-go-back
|
2015-11-22 17:45:12 +00:00
|
|
|
"gu" 'anaconda-mode-find-references)
|
2015-11-21 10:07:14 +00:00
|
|
|
(evilified-state-evilify anaconda-mode-view-mode anaconda-mode-view-mode-map
|
|
|
|
(kbd "q") 'quit-window)
|
2016-02-15 19:15:29 +00:00
|
|
|
(spacemacs|hide-lighter anaconda-mode)
|
|
|
|
|
|
|
|
(defadvice anaconda-mode-goto (before python/anaconda-mode-goto activate)
|
2016-02-17 14:46:51 +00:00
|
|
|
(evil--jumps-push)))))
|
2014-12-09 03:19:55 +00:00
|
|
|
|
2016-01-18 03:06:04 +00:00
|
|
|
(when (configuration-layer/layer-usedp 'auto-completion)
|
|
|
|
(defun python/post-init-company ()
|
|
|
|
(spacemacs|add-company-hook python-mode)
|
|
|
|
(spacemacs|add-company-hook inferior-python-mode)
|
|
|
|
(push '(company-files company-capf) company-backends-inferior-python-mode)
|
|
|
|
(add-hook 'inferior-python-mode-hook (lambda ()
|
|
|
|
(setq-local company-minimum-prefix-length 0)
|
|
|
|
(setq-local company-idle-delay 0.5))))
|
|
|
|
|
|
|
|
(defun python/init-company-anaconda ()
|
|
|
|
(use-package company-anaconda
|
|
|
|
:if (configuration-layer/package-usedp 'company)
|
|
|
|
:defer t
|
|
|
|
:init
|
|
|
|
(push 'company-anaconda company-backends-python-mode))))
|
|
|
|
|
2015-01-22 16:22:19 +00:00
|
|
|
(defun python/init-cython-mode ()
|
|
|
|
(use-package cython-mode
|
|
|
|
:defer t
|
|
|
|
:init
|
|
|
|
(progn
|
2015-11-18 00:38:05 +00:00
|
|
|
(spacemacs/set-leader-keys-for-major-mode 'cython-mode
|
|
|
|
"hh" 'anaconda-mode-view-doc
|
|
|
|
"gg" 'anaconda-mode-goto
|
|
|
|
"gu" 'anaconda-mode-usages))))
|
2015-01-22 16:22:19 +00:00
|
|
|
|
2015-08-09 03:35:16 +00:00
|
|
|
(defun python/post-init-eldoc ()
|
2016-02-16 15:27:11 +00:00
|
|
|
(defun spacemacs//init-eldoc-python-mode ()
|
|
|
|
(eldoc-mode)
|
|
|
|
(when (configuration-layer/package-usedp 'anaconda-mode)
|
|
|
|
(anaconda-eldoc-mode)))
|
|
|
|
(add-hook 'python-mode-hook 'spacemacs//init-eldoc-python-mode))
|
2014-12-09 03:19:55 +00:00
|
|
|
|
2016-01-18 03:06:04 +00:00
|
|
|
(defun python/post-init-evil-matchit ()
|
|
|
|
(add-hook `python-mode-hook `turn-on-evil-matchit-mode))
|
|
|
|
|
|
|
|
(defun python/post-init-flycheck ()
|
2016-01-27 20:08:25 +00:00
|
|
|
(spacemacs/add-flycheck-hook 'python-mode))
|
2016-01-18 03:06:04 +00:00
|
|
|
|
|
|
|
(when (configuration-layer/layer-usedp 'spacemacs-helm)
|
|
|
|
(defun python/pre-init-helm-cscope ()
|
|
|
|
(spacemacs|use-package-add-hook xcscope
|
|
|
|
:post-init
|
|
|
|
(spacemacs/setup-helm-cscope 'python-mode))))
|
|
|
|
|
|
|
|
(when (configuration-layer/layer-usedp 'spacemacs-helm)
|
|
|
|
(defun python/init-helm-pydoc ()
|
|
|
|
(use-package helm-pydoc
|
|
|
|
:defer t
|
|
|
|
:init
|
|
|
|
(spacemacs/set-leader-keys-for-major-mode 'python-mode "hd" 'helm-pydoc))))
|
|
|
|
|
|
|
|
(defun python/init-hy-mode ()
|
|
|
|
(use-package hy-mode
|
|
|
|
:defer t))
|
|
|
|
|
2015-10-29 08:42:37 +00:00
|
|
|
(defun python/init-live-py-mode ()
|
|
|
|
(use-package live-py-mode
|
|
|
|
:defer t
|
|
|
|
:commands live-py-mode
|
|
|
|
:init
|
|
|
|
(spacemacs/set-leader-keys-for-major-mode 'python-mode
|
2016-01-31 20:47:32 +00:00
|
|
|
"l" 'live-py-mode)))
|
2015-10-29 08:42:37 +00:00
|
|
|
|
2016-01-18 03:06:04 +00:00
|
|
|
(defun python/init-nose ()
|
|
|
|
(use-package nose
|
|
|
|
:if (eq 'nose python-test-runner)
|
|
|
|
:commands (nosetests-one
|
|
|
|
nosetests-pdb-one
|
|
|
|
nosetests-all
|
|
|
|
nosetests-pdb-all
|
|
|
|
nosetests-module
|
|
|
|
nosetests-pdb-module
|
|
|
|
nosetests-suite
|
|
|
|
nosetests-pdb-suite)
|
|
|
|
:init
|
|
|
|
(spacemacs/set-leader-keys-for-major-mode 'python-mode
|
|
|
|
"tA" 'nosetests-pdb-all
|
|
|
|
"ta" 'nosetests-all
|
|
|
|
"tB" 'nosetests-pdb-module
|
|
|
|
"tb" 'nosetests-module
|
|
|
|
"tT" 'nosetests-pdb-one
|
|
|
|
"tt" 'nosetests-one
|
|
|
|
"tM" 'nosetests-pdb-module
|
|
|
|
"tm" 'nosetests-module
|
|
|
|
"tS" 'nosetests-pdb-suite
|
|
|
|
"ts" 'nosetests-suite)
|
|
|
|
:config
|
|
|
|
(progn
|
|
|
|
(add-to-list 'nose-project-root-files "setup.cfg")
|
|
|
|
(setq nose-use-verbose nil))))
|
|
|
|
|
2016-04-05 20:41:05 +00:00
|
|
|
(defun python/pre-init-org ()
|
|
|
|
(spacemacs|use-package-add-hook org
|
|
|
|
:post-config (add-to-list 'org-babel-load-languages '(python . t))))
|
|
|
|
|
2015-04-25 03:54:39 +00:00
|
|
|
(defun python/init-pip-requirements ()
|
|
|
|
(use-package pip-requirements
|
2015-04-25 05:37:18 +00:00
|
|
|
:defer t
|
2015-04-25 03:54:39 +00:00
|
|
|
:init
|
2015-04-25 05:37:18 +00:00
|
|
|
(progn
|
|
|
|
;; company support
|
2015-04-30 03:54:30 +00:00
|
|
|
(push 'company-capf company-backends-pip-requirements-mode)
|
2015-04-25 03:54:39 +00:00
|
|
|
(spacemacs|add-company-hook pip-requirements-mode))))
|
|
|
|
|
2015-01-30 15:30:10 +00:00
|
|
|
(defun python/init-pyenv-mode ()
|
|
|
|
(use-package pyenv-mode
|
2016-01-24 13:42:59 +00:00
|
|
|
:if (executable-find "pyenv")
|
2015-12-07 12:58:36 +00:00
|
|
|
:commands (pyenv-mode-versions)
|
|
|
|
:init
|
|
|
|
(progn
|
|
|
|
(pcase python-auto-set-local-pyenv-version
|
|
|
|
(`on-visit
|
|
|
|
(add-hook 'python-mode-hook 'pyenv-mode-set-local-version))
|
|
|
|
(`on-project-switch
|
|
|
|
(add-hook 'projectile-after-switch-project-hook 'pyenv-mode-set-local-version)))
|
|
|
|
(spacemacs/set-leader-keys-for-major-mode 'python-mode
|
2016-01-09 03:37:35 +00:00
|
|
|
"vu" 'pyenv-mode-unset
|
|
|
|
"vs" 'pyenv-mode-set))))
|
2015-01-30 15:30:10 +00:00
|
|
|
|
2014-12-10 16:30:48 +00:00
|
|
|
(defun python/init-pyvenv ()
|
|
|
|
(use-package pyvenv
|
2014-12-09 03:19:55 +00:00
|
|
|
:defer t
|
|
|
|
:init
|
2015-11-18 00:38:05 +00:00
|
|
|
(spacemacs/set-leader-keys-for-major-mode 'python-mode
|
2016-01-06 19:48:18 +00:00
|
|
|
"Va" 'pyvenv-activate
|
2016-01-09 03:37:35 +00:00
|
|
|
"Vd" 'pyvenv-deactivate
|
|
|
|
"Vw" 'pyvenv-workon)))
|
2014-12-09 03:19:55 +00:00
|
|
|
|
2016-01-18 03:06:04 +00:00
|
|
|
(defun python/init-pylookup ()
|
|
|
|
(use-package pylookup
|
|
|
|
:commands (pylookup-lookup pylookup-update pylookup-update-all)
|
|
|
|
:init
|
|
|
|
(progn
|
|
|
|
(evilified-state-evilify pylookup-mode pylookup-mode-map)
|
|
|
|
(spacemacs/set-leader-keys-for-major-mode 'python-mode
|
2016-02-25 05:17:48 +00:00
|
|
|
"hH" 'pylookup-lookup))
|
2016-01-18 03:06:04 +00:00
|
|
|
:config
|
|
|
|
(progn
|
|
|
|
(let ((dir (configuration-layer/get-layer-local-dir 'python)))
|
|
|
|
(setq pylookup-dir (concat dir "pylookup/")
|
|
|
|
pylookup-program (concat pylookup-dir "pylookup.py")
|
2016-03-01 06:34:34 +00:00
|
|
|
pylookup-db-file (concat pylookup-dir "pylookup.db")))
|
|
|
|
(setq pylookup-completing-read 'completing-read))))
|
2016-01-18 03:06:04 +00:00
|
|
|
|
2015-06-04 09:09:56 +00:00
|
|
|
(defun python/init-pytest ()
|
|
|
|
(use-package pytest
|
2015-06-08 03:59:23 +00:00
|
|
|
:if (eq 'pytest python-test-runner)
|
2015-06-04 09:09:56 +00:00
|
|
|
:defer t
|
|
|
|
:commands (pytest-one
|
|
|
|
pytest-pdb-one
|
|
|
|
pytest-all
|
|
|
|
pytest-pdb-all
|
|
|
|
pytest-module
|
|
|
|
pytest-pdb-module)
|
2015-11-18 00:38:05 +00:00
|
|
|
:init (spacemacs/set-leader-keys-for-major-mode 'python-mode
|
|
|
|
"tA" 'pytest-pdb-all
|
|
|
|
"ta" 'pytest-all
|
|
|
|
"tB" 'pytest-pdb-module
|
|
|
|
"tb" 'pytest-module
|
|
|
|
"tT" 'pytest-pdb-one
|
|
|
|
"tt" 'pytest-one
|
|
|
|
"tM" 'pytest-pdb-module
|
|
|
|
"tm" 'pytest-module)
|
2015-06-08 03:59:23 +00:00
|
|
|
:config (add-to-list 'pytest-project-root-files "setup.cfg")))
|
2015-06-04 09:09:56 +00:00
|
|
|
|
2014-11-10 04:54:10 +00:00
|
|
|
(defun python/init-python ()
|
|
|
|
(use-package python
|
|
|
|
:defer t
|
|
|
|
:init
|
|
|
|
(progn
|
2016-01-26 16:31:15 +00:00
|
|
|
(spacemacs/register-repl 'python 'python-start-or-switch-repl "python")
|
|
|
|
|
2014-12-09 03:19:55 +00:00
|
|
|
(defun python-default ()
|
|
|
|
(setq mode-name "Python"
|
|
|
|
tab-width 4
|
2015-09-21 23:29:23 +00:00
|
|
|
fill-column python-fill-column
|
2014-12-09 03:19:55 +00:00
|
|
|
;; auto-indent on colon doesn't work well with if statement
|
|
|
|
electric-indent-chars (delq ?: electric-indent-chars))
|
2016-04-08 09:42:19 +00:00
|
|
|
(setq-local comment-inline-offset 2)
|
2014-12-09 03:19:55 +00:00
|
|
|
(annotate-pdb)
|
|
|
|
;; make C-j work the same way as RET
|
|
|
|
(local-set-key (kbd "C-j") 'newline-and-indent))
|
|
|
|
|
2014-11-10 04:54:10 +00:00
|
|
|
(defun python-setup-shell ()
|
|
|
|
(if (executable-find "ipython")
|
2015-08-07 08:21:40 +00:00
|
|
|
(progn
|
|
|
|
(setq python-shell-interpreter "ipython")
|
|
|
|
(when (version< emacs-version "24.4")
|
|
|
|
;; these settings are unnecessary and even counter-productive on emacs 24.4 and newer
|
|
|
|
(setq 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")))
|
2014-11-10 04:54:10 +00:00
|
|
|
(setq python-shell-interpreter "python")))
|
|
|
|
|
2015-06-02 11:21:34 +00:00
|
|
|
(defun inferior-python-setup-hook ()
|
|
|
|
(setq indent-tabs-mode t))
|
|
|
|
|
|
|
|
(add-hook 'inferior-python-mode-hook #'inferior-python-setup-hook)
|
2016-05-06 07:05:57 +00:00
|
|
|
(add-hook 'python-mode-hook #'python-default)
|
|
|
|
;; call `python-setup-shell' once, don't put it in a hook (see issue #5988)
|
|
|
|
(python-setup-shell))
|
2014-11-10 04:54:10 +00:00
|
|
|
:config
|
|
|
|
(progn
|
|
|
|
;; add support for `ahs-range-beginning-of-defun' for python-mode
|
2015-09-29 05:07:57 +00:00
|
|
|
(with-eval-after-load 'auto-highlight-symbol
|
|
|
|
(add-to-list 'ahs-plugin-bod-modes 'python-mode))
|
2014-12-09 03:19:55 +00:00
|
|
|
|
|
|
|
(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)
|
Use evil in holy-mode
Motivation
While disabling Evil in holy-mode makes its implementation shorter and
sounds elegant on the paper, in practice it puts a big burden on the
configuration parts which need to know if Evil is enable or not. This is
a bad separation of concerns and the bunch of fixes that we were forced
to do in the past weeks shows this issue. Those fixes were about
removing the knowledge of the activation of Evil by implementing new
dispatching functions to be used by layers, this is cumbersome and makes
Spacemacs layer configuration more subtle which is not good. There was
additional bad consequences of the removal of Evil state like the
impossibility to use Evil lisp state or iedit states, or we would have
been forced to implement a temporary activation of Evil which is
awkward.
Instead I reintroduce Evil as the central piece of Spacemacs design thus
Evil is now re-enabled in holy-mode. It provides the abstraction we need
to isolate editing styles and be able to grow the Spacemacs
configuration coverage sanely. Layers don't need to check whether the
holy mode is active or not and they don't need to know if Evil is
available (it is always available). We also don't need to write
additional dispatching functions, this is the job of Evil, and I think
it provides everything for this. Ideally configuration layer should be
implemented with only Evil in mind and the holy-mode (and hybrid-mode)
should magically make it work for Emacs style users, for instance we can
freely use `evil-insert-state` anywhere in the code without any guard.
Evil is now even more part of Spacemacs, we can really say that
Spacemacs is Emacs+Evil which is now an indivisible pair. Spacemacs
needed this stable API to continue on the right track.
While these changes should be rather transparent to the user, I'm sorry
for this experimental period, I failed to see all the implications of
such a change, I was just excited about the possibility to make Evil
optional. The reality is that Spacemacs has to embrace it and keep its
strong position on being Emacs+Evil at the core.
Implementation
- insert, motion and normal states are forced to emacs state using an
advice on `evil-insert-state`, `evil-motion-state` and
`evil-normal-state` respectively. These functions can be used freely in
the layer configuration.
- A new general hook `spacemacs-editing-style-hook` allow to hook any
code that need to be configured based on the editing style. Functions
hooked to this hook takes the current style as parameter, this
basically generalize the hook used to setup hjkl navigation bindings.
- ESC has been removed from the emacs state map.
- Revert unneeded changes
- Revert "evil: enter insert-state only from normal-state"
commit bdd702dfbe302206bbc989c7a0832daba087a781.
- Revert "avoid being evil in deft with emacs editing style"
commit f3a16f49ed27cc8cf05f23f93b006d6e04235381.
Additional changes
All editing style packages have been moved to a layer called
`spacemacs-editing-styles`
Notes
I did not have time to attack hybrid mode, I should be able to do it
later.
2016-03-13 23:41:18 +00:00
|
|
|
(evil-insert-state))
|
2014-12-09 03:19:55 +00:00
|
|
|
|
|
|
|
(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)
|
Use evil in holy-mode
Motivation
While disabling Evil in holy-mode makes its implementation shorter and
sounds elegant on the paper, in practice it puts a big burden on the
configuration parts which need to know if Evil is enable or not. This is
a bad separation of concerns and the bunch of fixes that we were forced
to do in the past weeks shows this issue. Those fixes were about
removing the knowledge of the activation of Evil by implementing new
dispatching functions to be used by layers, this is cumbersome and makes
Spacemacs layer configuration more subtle which is not good. There was
additional bad consequences of the removal of Evil state like the
impossibility to use Evil lisp state or iedit states, or we would have
been forced to implement a temporary activation of Evil which is
awkward.
Instead I reintroduce Evil as the central piece of Spacemacs design thus
Evil is now re-enabled in holy-mode. It provides the abstraction we need
to isolate editing styles and be able to grow the Spacemacs
configuration coverage sanely. Layers don't need to check whether the
holy mode is active or not and they don't need to know if Evil is
available (it is always available). We also don't need to write
additional dispatching functions, this is the job of Evil, and I think
it provides everything for this. Ideally configuration layer should be
implemented with only Evil in mind and the holy-mode (and hybrid-mode)
should magically make it work for Emacs style users, for instance we can
freely use `evil-insert-state` anywhere in the code without any guard.
Evil is now even more part of Spacemacs, we can really say that
Spacemacs is Emacs+Evil which is now an indivisible pair. Spacemacs
needed this stable API to continue on the right track.
While these changes should be rather transparent to the user, I'm sorry
for this experimental period, I failed to see all the implications of
such a change, I was just excited about the possibility to make Evil
optional. The reality is that Spacemacs has to embrace it and keep its
strong position on being Emacs+Evil at the core.
Implementation
- insert, motion and normal states are forced to emacs state using an
advice on `evil-insert-state`, `evil-motion-state` and
`evil-normal-state` respectively. These functions can be used freely in
the layer configuration.
- A new general hook `spacemacs-editing-style-hook` allow to hook any
code that need to be configured based on the editing style. Functions
hooked to this hook takes the current style as parameter, this
basically generalize the hook used to setup hjkl navigation bindings.
- ESC has been removed from the emacs state map.
- Revert unneeded changes
- Revert "evil: enter insert-state only from normal-state"
commit bdd702dfbe302206bbc989c7a0832daba087a781.
- Revert "avoid being evil in deft with emacs editing style"
commit f3a16f49ed27cc8cf05f23f93b006d6e04235381.
Additional changes
All editing style packages have been moved to a layer called
`spacemacs-editing-styles`
Notes
I did not have time to attack hybrid mode, I should be able to do it
later.
2016-03-13 23:41:18 +00:00
|
|
|
(evil-insert-state))
|
2014-12-09 03:19:55 +00:00
|
|
|
|
2015-02-18 03:00:26 +00:00
|
|
|
(defun python-shell-send-region-switch (start end)
|
2014-12-09 03:19:55 +00:00
|
|
|
"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)
|
Use evil in holy-mode
Motivation
While disabling Evil in holy-mode makes its implementation shorter and
sounds elegant on the paper, in practice it puts a big burden on the
configuration parts which need to know if Evil is enable or not. This is
a bad separation of concerns and the bunch of fixes that we were forced
to do in the past weeks shows this issue. Those fixes were about
removing the knowledge of the activation of Evil by implementing new
dispatching functions to be used by layers, this is cumbersome and makes
Spacemacs layer configuration more subtle which is not good. There was
additional bad consequences of the removal of Evil state like the
impossibility to use Evil lisp state or iedit states, or we would have
been forced to implement a temporary activation of Evil which is
awkward.
Instead I reintroduce Evil as the central piece of Spacemacs design thus
Evil is now re-enabled in holy-mode. It provides the abstraction we need
to isolate editing styles and be able to grow the Spacemacs
configuration coverage sanely. Layers don't need to check whether the
holy mode is active or not and they don't need to know if Evil is
available (it is always available). We also don't need to write
additional dispatching functions, this is the job of Evil, and I think
it provides everything for this. Ideally configuration layer should be
implemented with only Evil in mind and the holy-mode (and hybrid-mode)
should magically make it work for Emacs style users, for instance we can
freely use `evil-insert-state` anywhere in the code without any guard.
Evil is now even more part of Spacemacs, we can really say that
Spacemacs is Emacs+Evil which is now an indivisible pair. Spacemacs
needed this stable API to continue on the right track.
While these changes should be rather transparent to the user, I'm sorry
for this experimental period, I failed to see all the implications of
such a change, I was just excited about the possibility to make Evil
optional. The reality is that Spacemacs has to embrace it and keep its
strong position on being Emacs+Evil at the core.
Implementation
- insert, motion and normal states are forced to emacs state using an
advice on `evil-insert-state`, `evil-motion-state` and
`evil-normal-state` respectively. These functions can be used freely in
the layer configuration.
- A new general hook `spacemacs-editing-style-hook` allow to hook any
code that need to be configured based on the editing style. Functions
hooked to this hook takes the current style as parameter, this
basically generalize the hook used to setup hjkl navigation bindings.
- ESC has been removed from the emacs state map.
- Revert unneeded changes
- Revert "evil: enter insert-state only from normal-state"
commit bdd702dfbe302206bbc989c7a0832daba087a781.
- Revert "avoid being evil in deft with emacs editing style"
commit f3a16f49ed27cc8cf05f23f93b006d6e04235381.
Additional changes
All editing style packages have been moved to a layer called
`spacemacs-editing-styles`
Notes
I did not have time to attack hybrid mode, I should be able to do it
later.
2016-03-13 23:41:18 +00:00
|
|
|
(evil-insert-state))
|
2014-12-09 03:19:55 +00:00
|
|
|
|
|
|
|
(defun python-start-or-switch-repl ()
|
|
|
|
"Start and/or switch to the REPL."
|
|
|
|
(interactive)
|
|
|
|
(python-shell-switch-to-shell)
|
Use evil in holy-mode
Motivation
While disabling Evil in holy-mode makes its implementation shorter and
sounds elegant on the paper, in practice it puts a big burden on the
configuration parts which need to know if Evil is enable or not. This is
a bad separation of concerns and the bunch of fixes that we were forced
to do in the past weeks shows this issue. Those fixes were about
removing the knowledge of the activation of Evil by implementing new
dispatching functions to be used by layers, this is cumbersome and makes
Spacemacs layer configuration more subtle which is not good. There was
additional bad consequences of the removal of Evil state like the
impossibility to use Evil lisp state or iedit states, or we would have
been forced to implement a temporary activation of Evil which is
awkward.
Instead I reintroduce Evil as the central piece of Spacemacs design thus
Evil is now re-enabled in holy-mode. It provides the abstraction we need
to isolate editing styles and be able to grow the Spacemacs
configuration coverage sanely. Layers don't need to check whether the
holy mode is active or not and they don't need to know if Evil is
available (it is always available). We also don't need to write
additional dispatching functions, this is the job of Evil, and I think
it provides everything for this. Ideally configuration layer should be
implemented with only Evil in mind and the holy-mode (and hybrid-mode)
should magically make it work for Emacs style users, for instance we can
freely use `evil-insert-state` anywhere in the code without any guard.
Evil is now even more part of Spacemacs, we can really say that
Spacemacs is Emacs+Evil which is now an indivisible pair. Spacemacs
needed this stable API to continue on the right track.
While these changes should be rather transparent to the user, I'm sorry
for this experimental period, I failed to see all the implications of
such a change, I was just excited about the possibility to make Evil
optional. The reality is that Spacemacs has to embrace it and keep its
strong position on being Emacs+Evil at the core.
Implementation
- insert, motion and normal states are forced to emacs state using an
advice on `evil-insert-state`, `evil-motion-state` and
`evil-normal-state` respectively. These functions can be used freely in
the layer configuration.
- A new general hook `spacemacs-editing-style-hook` allow to hook any
code that need to be configured based on the editing style. Functions
hooked to this hook takes the current style as parameter, this
basically generalize the hook used to setup hjkl navigation bindings.
- ESC has been removed from the emacs state map.
- Revert unneeded changes
- Revert "evil: enter insert-state only from normal-state"
commit bdd702dfbe302206bbc989c7a0832daba087a781.
- Revert "avoid being evil in deft with emacs editing style"
commit f3a16f49ed27cc8cf05f23f93b006d6e04235381.
Additional changes
All editing style packages have been moved to a layer called
`spacemacs-editing-styles`
Notes
I did not have time to attack hybrid mode, I should be able to do it
later.
2016-03-13 23:41:18 +00:00
|
|
|
(evil-insert-state))
|
2014-12-09 03:19:55 +00:00
|
|
|
|
2015-03-14 06:58:11 +00:00
|
|
|
;; 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)
|
2015-03-14 11:14:11 +00:00
|
|
|
|
2015-04-13 19:29:46 +00:00
|
|
|
(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))))
|
2015-03-14 06:58:11 +00:00
|
|
|
|
|
|
|
(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*")
|
2015-03-14 09:41:54 +00:00
|
|
|
(end-of-buffer)
|
Use evil in holy-mode
Motivation
While disabling Evil in holy-mode makes its implementation shorter and
sounds elegant on the paper, in practice it puts a big burden on the
configuration parts which need to know if Evil is enable or not. This is
a bad separation of concerns and the bunch of fixes that we were forced
to do in the past weeks shows this issue. Those fixes were about
removing the knowledge of the activation of Evil by implementing new
dispatching functions to be used by layers, this is cumbersome and makes
Spacemacs layer configuration more subtle which is not good. There was
additional bad consequences of the removal of Evil state like the
impossibility to use Evil lisp state or iedit states, or we would have
been forced to implement a temporary activation of Evil which is
awkward.
Instead I reintroduce Evil as the central piece of Spacemacs design thus
Evil is now re-enabled in holy-mode. It provides the abstraction we need
to isolate editing styles and be able to grow the Spacemacs
configuration coverage sanely. Layers don't need to check whether the
holy mode is active or not and they don't need to know if Evil is
available (it is always available). We also don't need to write
additional dispatching functions, this is the job of Evil, and I think
it provides everything for this. Ideally configuration layer should be
implemented with only Evil in mind and the holy-mode (and hybrid-mode)
should magically make it work for Emacs style users, for instance we can
freely use `evil-insert-state` anywhere in the code without any guard.
Evil is now even more part of Spacemacs, we can really say that
Spacemacs is Emacs+Evil which is now an indivisible pair. Spacemacs
needed this stable API to continue on the right track.
While these changes should be rather transparent to the user, I'm sorry
for this experimental period, I failed to see all the implications of
such a change, I was just excited about the possibility to make Evil
optional. The reality is that Spacemacs has to embrace it and keep its
strong position on being Emacs+Evil at the core.
Implementation
- insert, motion and normal states are forced to emacs state using an
advice on `evil-insert-state`, `evil-motion-state` and
`evil-normal-state` respectively. These functions can be used freely in
the layer configuration.
- A new general hook `spacemacs-editing-style-hook` allow to hook any
code that need to be configured based on the editing style. Functions
hooked to this hook takes the current style as parameter, this
basically generalize the hook used to setup hjkl navigation bindings.
- ESC has been removed from the emacs state map.
- Revert unneeded changes
- Revert "evil: enter insert-state only from normal-state"
commit bdd702dfbe302206bbc989c7a0832daba087a781.
- Revert "avoid being evil in deft with emacs editing style"
commit f3a16f49ed27cc8cf05f23f93b006d6e04235381.
Additional changes
All editing style packages have been moved to a layer called
`spacemacs-editing-styles`
Notes
I did not have time to attack hybrid mode, I should be able to do it
later.
2016-03-13 23:41:18 +00:00
|
|
|
(evil-insert-state))
|
2015-03-14 06:58:11 +00:00
|
|
|
|
2015-10-26 19:45:28 +00:00
|
|
|
(spacemacs/declare-prefix-for-mode 'python-mode "mc" "execute")
|
|
|
|
(spacemacs/declare-prefix-for-mode 'python-mode "md" "debug")
|
|
|
|
(spacemacs/declare-prefix-for-mode 'python-mode "mh" "help")
|
|
|
|
(spacemacs/declare-prefix-for-mode 'python-mode "mg" "goto")
|
|
|
|
(spacemacs/declare-prefix-for-mode 'python-mode "mt" "test")
|
|
|
|
(spacemacs/declare-prefix-for-mode 'python-mode "ms" "send to REPL")
|
|
|
|
(spacemacs/declare-prefix-for-mode 'python-mode "mr" "refactor")
|
2016-01-06 19:48:18 +00:00
|
|
|
(spacemacs/declare-prefix-for-mode 'python-mode "mv" "pyenv")
|
|
|
|
(spacemacs/declare-prefix-for-mode 'python-mode "mV" "pyvenv")
|
2015-11-18 00:38:05 +00:00
|
|
|
(spacemacs/set-leader-keys-for-major-mode 'python-mode
|
2016-01-26 16:31:15 +00:00
|
|
|
"'" 'python-start-or-switch-repl
|
2015-11-18 00:38:05 +00:00
|
|
|
"cc" 'spacemacs/python-execute-file
|
|
|
|
"cC" 'spacemacs/python-execute-file-focus
|
|
|
|
"db" 'python-toggle-breakpoint
|
|
|
|
"ri" 'python-remove-unused-imports
|
|
|
|
"sB" 'python-shell-send-buffer-switch
|
|
|
|
"sb" 'python-shell-send-buffer
|
|
|
|
"sF" 'python-shell-send-defun-switch
|
|
|
|
"sf" 'python-shell-send-defun
|
|
|
|
"si" 'python-start-or-switch-repl
|
|
|
|
"sR" 'python-shell-send-region-switch
|
|
|
|
"sr" 'python-shell-send-region)
|
2014-11-10 04:54:10 +00:00
|
|
|
|
2015-05-23 17:19:48 +00:00
|
|
|
;; Emacs users won't need these key bindings
|
2015-05-28 03:49:19 +00:00
|
|
|
;; TODO: make these key bindings dynamic given the current style
|
|
|
|
;; Doing it only at init time won't update it if the user switches style
|
|
|
|
;; Also find a way to generalize these bindings.
|
2015-05-23 17:19:48 +00:00
|
|
|
(when (eq dotspacemacs-editing-style 'vim)
|
|
|
|
;; the default in Emacs is M-n
|
|
|
|
(define-key inferior-python-mode-map (kbd "C-j") 'comint-next-input)
|
2016-04-03 04:35:52 +00:00
|
|
|
;; the default in Emacs is M-p and this key binding overrides
|
|
|
|
;; default C-k which prevents Emacs users to kill line
|
2015-05-23 17:19:48 +00:00
|
|
|
(define-key inferior-python-mode-map (kbd "C-k") 'comint-previous-input)
|
|
|
|
;; the default in Emacs is M-r; C-r to search backward old output
|
|
|
|
;; and should not be changed
|
2016-04-03 04:35:52 +00:00
|
|
|
(define-key inferior-python-mode-map
|
|
|
|
(kbd "C-r") 'comint-history-isearch-backward)
|
2015-05-23 17:19:48 +00:00
|
|
|
;; this key binding is for recentering buffer in Emacs
|
|
|
|
;; it would be troublesome if Emacs user
|
|
|
|
;; Vim users can use this key since they have other key
|
2016-04-03 04:35:52 +00:00
|
|
|
(define-key inferior-python-mode-map
|
|
|
|
(kbd "C-l") 'spacemacs/comint-clear-buffer))
|
2015-05-23 17:19:48 +00:00
|
|
|
|
|
|
|
;; add this optional key binding for Emacs user, since it is unbound
|
2016-04-03 04:35:52 +00:00
|
|
|
(define-key inferior-python-mode-map
|
2016-04-16 02:08:35 +00:00
|
|
|
(kbd "C-c M-l") 'spacemacs/comint-clear-buffer))))
|
2014-11-10 04:54:10 +00:00
|
|
|
|
2016-01-23 14:00:23 +00:00
|
|
|
(defun python/init-py-yapf ()
|
|
|
|
(use-package py-yapf
|
2016-04-03 18:28:42 +00:00
|
|
|
:commands py-yapf-buffer
|
2016-04-03 04:35:52 +00:00
|
|
|
:init (spacemacs/set-leader-keys-for-major-mode 'python-mode
|
|
|
|
"=" 'py-yapf-buffer)
|
|
|
|
:config (when python-enable-yapf-format-on-save
|
|
|
|
(add-hook 'python-mode-hook 'py-yapf-enable-on-save))))
|
2016-01-23 14:00:23 +00:00
|
|
|
|
2015-04-23 14:35:04 +00:00
|
|
|
(defun python/post-init-semantic ()
|
2016-04-18 18:45:40 +00:00
|
|
|
(when (configuration-layer/package-usedp 'anaconda-mode)
|
|
|
|
(add-hook 'python-mode-hook
|
|
|
|
'spacemacs//disable-semantic-idle-summary-mode t))
|
2016-03-10 13:29:19 +00:00
|
|
|
(add-hook 'python-mode-hook 'semantic-mode)
|
2016-04-16 02:08:35 +00:00
|
|
|
(add-hook 'python-mode-hook 'spacemacs//python-imenu-create-index-use-semantic)
|
2016-03-25 15:09:04 +00:00
|
|
|
|
2016-04-03 04:35:52 +00:00
|
|
|
(defadvice semantic-python-get-system-include-path
|
|
|
|
(around semantic-python-skip-error-advice activate)
|
2015-05-21 14:18:02 +00:00
|
|
|
"Don't cause error when Semantic cannot retrieve include
|
|
|
|
paths for Python then prevent the buffer to be switched. This
|
|
|
|
issue might be fixed in Emacs 25. Until then, we need it here to
|
|
|
|
fix this issue."
|
2016-02-24 15:32:45 +00:00
|
|
|
(condition-case-unless-debug nil
|
2015-05-21 14:18:02 +00:00
|
|
|
ad-do-it
|
|
|
|
(error nil))))
|
2015-04-23 14:35:04 +00:00
|
|
|
|
2016-01-18 03:06:04 +00:00
|
|
|
(defun python/post-init-smartparens ()
|
2016-04-18 13:56:16 +00:00
|
|
|
(add-hook 'inferior-python-mode-hook 'smartparens-mode)
|
2016-01-18 03:06:04 +00:00
|
|
|
(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)))))
|
|
|
|
|
2015-04-16 10:43:10 +00:00
|
|
|
(defun python/post-init-stickyfunc-enhance ()
|
|
|
|
(add-hook 'python-mode-hook 'spacemacs/lazy-load-stickyfunc-enhance))
|
2015-07-24 02:20:25 +00:00
|
|
|
|
|
|
|
(defun python/pre-init-xcscope ()
|
|
|
|
(spacemacs|use-package-add-hook xcscope
|
|
|
|
:post-init
|
2015-11-18 00:38:05 +00:00
|
|
|
(spacemacs/set-leader-keys-for-major-mode 'python-mode "gi" 'cscope/run-pycscope)))
|