aboutsummaryrefslogtreecommitdiffstats
path: root/oni-python
diff options
context:
space:
mode:
authorGravatar Tom Willemse2019-08-28 00:06:55 -0700
committerGravatar Tom Willemse2019-08-28 00:07:35 -0700
commit5ad89196c2692e0018d6cfeb708d22fd6620a027 (patch)
tree2418bb691917bd1ac1cffc8c174688c38d1258ff /oni-python
parente530fbfc5f47e5fb19107f442f3d752ed049817c (diff)
downloademacs-config-5ad89196c2692e0018d6cfeb708d22fd6620a027.tar.gz
emacs-config-5ad89196c2692e0018d6cfeb708d22fd6620a027.zip
Add snippets for ‘oni-python’
Diffstat (limited to 'oni-python')
-rw-r--r--oni-python/Cask18
-rw-r--r--oni-python/oni-python.el110
-rw-r--r--oni-python/snippets/python-mode/defm_empty7
-rw-r--r--oni-python/snippets/python-mode/form9
-rw-r--r--oni-python/snippets/python-mode/form_valid8
-rw-r--r--oni-python/snippets/python-mode/form_valid_with_return8
-rw-r--r--oni-python/snippets/python-mode/import_from6
-rw-r--r--oni-python/snippets/python-mode/method7
-rw-r--r--oni-python/snippets/python-mode/permission_guard9
-rw-r--r--oni-python/snippets/python-mode/url5
10 files changed, 187 insertions, 0 deletions
diff --git a/oni-python/Cask b/oni-python/Cask
new file mode 100644
index 0000000..fe11bbd
--- /dev/null
+++ b/oni-python/Cask
@@ -0,0 +1,18 @@
+(source gnu)
+(source melpa)
+
+(package-file "./oni-python.el")
+
+(depends-on "oni-yasnippet" :git "../" :files ("oni-yasnippet.el"))
+(depends-on "oni-company" :git "../" :files ("oni-company.el"))
+(depends-on "company-jedi")
+(depends-on "oni-fci" :git "../" :files ("oni-fci.el"))
+(depends-on "oni-flycheck" :git "../" :files ("oni-flycheck.el"))
+(depends-on "rainbow-delimiters")
+(depends-on "reformatter")
+(depends-on "traad")
+(depends-on "hydra")
+
+(files
+ "*.el"
+ ("snippets" "./snippets/*"))
diff --git a/oni-python/oni-python.el b/oni-python/oni-python.el
new file mode 100644
index 0000000..9be51f8
--- /dev/null
+++ b/oni-python/oni-python.el
@@ -0,0 +1,110 @@
+;;; oni-python.el --- Python configuration -*- lexical-binding: t; -*-
+
+;; Copyright (C) 2019 Tom Willemse
+
+;; Author: Tom Willemse <tom@ryuslash.org>
+;; Keywords: local
+;; Version: 20190828000139
+;; Package-Requires: (oni-yasnippet oni-company company-jedi oni-fci oni-flycheck rainbow-delimiters reformatter traad hydra)
+
+;; 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 <https://www.gnu.org/licenses/>.
+
+;;; Commentary:
+
+;; My Python configuration.
+;;
+;; It features:
+;; - Completion
+;; - Syntax checking
+;; - Right margin
+;; - Delimiter balancing
+;; - Automatic reformatting
+;; - Delimiter highlighting
+
+;;; Code:
+
+(require 'company)
+(require 'hydra)
+(require 'python)
+(require 'reformatter)
+(require 'traad)
+(require 'whitespace)
+(require 'yasnippet)
+
+(autoload 'hl-indent-mode "hl-indent-mode")
+
+(defconst oni-python-root
+ (file-name-directory
+ (or load-file-name
+ (buffer-file-name)))
+ "The directory where ‘oni-python’ was loaded from.")
+
+(defconst oni-python-snippets-dir
+ (expand-file-name "snippets" oni-python-root)
+ "The directory where ‘oni-python’ stores its snippets.")
+
+(defun oni-python-set-fill-column ()
+ "Set the `fill-column' and `comment-fill-column' for the current buffer.
+
+The values are taken from the PEP8 coding standard for Python."
+ (setq-local fill-column 80)
+ (setq-local comment-fill-column 72))
+
+;;;###autoload
+(defun oni-python-snippets-initialize ()
+ "Initialize the snippets for ‘oni-python’."
+ (when (boundp 'yas-snippet-dirs)
+ (add-to-list 'yas-snippet-dirs oni-python-snippets-dir))
+ (yas-load-directory oni-python-snippets-dir))
+
+(defun oni-python-whitespace-mode ()
+ "Set the `whitespace-style' to show the relevat whitespace.
+In Python buffers it should show any tabs being used and and used
+for indentation."
+ (setq-local whitespace-style '(face tabs))
+ (whitespace-mode))
+
+(add-to-list 'company-backends 'company-jedi)
+
+(reformatter-define python-black
+ :program "black"
+ :args `("--line-length" ,(number-to-string fill-column) "-")
+ :lighter ""
+ :group 'python-black)
+
+(defhydra python-refactor-hydra (:color blue)
+ ("r" traad-rename "Rename object")
+ ("m" traad-extract-method "Extract method"))
+
+(define-key python-mode-map (kbd "C-c r") 'python-refactor-hydra/body)
+
+(add-hook 'python-mode-hook 'electric-indent-local-mode)
+(add-hook 'python-mode-hook 'electric-pair-local-mode)
+(add-hook 'python-mode-hook 'flycheck-mode)
+(add-hook 'python-mode-hook 'fci-mode)
+(add-hook 'python-mode-hook 'company-mode)
+(add-hook 'python-mode-hook 'rainbow-delimiters-mode)
+(add-hook 'python-mode-hook 'python-black-on-save-mode)
+(add-hook 'python-mode-hook 'oni-python-set-fill-column)
+(add-hook 'python-mode-hook 'oni-python-whitespace-mode)
+
+;;;###autoload
+(with-eval-after-load 'python
+ (with-eval-after-load 'yasnippet
+ (oni-python-snippets-initialize)))
+
+;;;###autoload(with-eval-after-load 'python (require 'oni-python))
+
+(provide 'oni-python)
+;;; oni-python.el ends here
diff --git a/oni-python/snippets/python-mode/defm_empty b/oni-python/snippets/python-mode/defm_empty
new file mode 100644
index 0000000..baa976e
--- /dev/null
+++ b/oni-python/snippets/python-mode/defm_empty
@@ -0,0 +1,7 @@
+# -*- coding: utf-8 -*-
+# name: Empty Defmethod
+# key: defm
+# --
+def ${1:name}(self, *args, **kwargs):
+ '''$2'''
+ return super(${3:`(progn (re-search-backward "^[ \t]*class \\(.+\\)(") (match-string 1)))`}, self).$1(*args, **kwargs) \ No newline at end of file
diff --git a/oni-python/snippets/python-mode/form b/oni-python/snippets/python-mode/form
new file mode 100644
index 0000000..225d5e4
--- /dev/null
+++ b/oni-python/snippets/python-mode/form
@@ -0,0 +1,9 @@
+# -*- mode: snippet -*-
+# name: Model Form
+# key: form
+# --
+class ${1:Model}Form(forms.ModelForm):
+ '''Form for the $1 model.'''
+
+ class Meta:
+ model = $1 \ No newline at end of file
diff --git a/oni-python/snippets/python-mode/form_valid b/oni-python/snippets/python-mode/form_valid
new file mode 100644
index 0000000..c5a7e58
--- /dev/null
+++ b/oni-python/snippets/python-mode/form_valid
@@ -0,0 +1,8 @@
+# -*- mode: snippet -*-
+# name: Record form
+# key: defm
+# --
+@record_activity(model=${1:`(progn (re-search-backward "^[ \t]*model = \\([a-zA-Z_].*\\)$") (match-string 1))`})
+def form_valid(self, form):
+ '''Make sure any changes to the $1 model get logged.'''
+ return super(${2:`(progn (re-search-backward "^[ \t]*class \\(.+\\)(") (match-string 1)))`}, self).form_valid(form) \ No newline at end of file
diff --git a/oni-python/snippets/python-mode/form_valid_with_return b/oni-python/snippets/python-mode/form_valid_with_return
new file mode 100644
index 0000000..fac23bc
--- /dev/null
+++ b/oni-python/snippets/python-mode/form_valid_with_return
@@ -0,0 +1,8 @@
+# -*- mode: snippet -*-
+# name: form_valid with return
+# key: formvalid
+# --
+def form_valid(self, form):
+ rv = super(`(let ((name (python-info-current-defun))) (substring name 0 (cl-position ?. name)))`, self).form_valid(form)
+ $0
+ return rv \ No newline at end of file
diff --git a/oni-python/snippets/python-mode/import_from b/oni-python/snippets/python-mode/import_from
new file mode 100644
index 0000000..d9cc4e2
--- /dev/null
+++ b/oni-python/snippets/python-mode/import_from
@@ -0,0 +1,6 @@
+# -*- coding: utf-8 -*-
+# name: from ... import ...
+# contributor: Tom Willemse
+# key: from
+# --
+from ${1:module} import ${2:class_or_module}
diff --git a/oni-python/snippets/python-mode/method b/oni-python/snippets/python-mode/method
new file mode 100644
index 0000000..7c033cf
--- /dev/null
+++ b/oni-python/snippets/python-mode/method
@@ -0,0 +1,7 @@
+# -*- mode: snippet -*-
+# name: method
+# key: defm
+# --
+def $1(self$2):
+ '''$3'''
+ $0 \ No newline at end of file
diff --git a/oni-python/snippets/python-mode/permission_guard b/oni-python/snippets/python-mode/permission_guard
new file mode 100644
index 0000000..ab53895
--- /dev/null
+++ b/oni-python/snippets/python-mode/permission_guard
@@ -0,0 +1,9 @@
+# -*- mode: snippet -*-
+# name: Permission guard
+# key: defm
+# --
+@method_decorator(permission_required('$1',
+ raise_exception=True))
+def dispatch(self, *args, **kwargs):
+ '''Make sure the user has the $1 permission.'''
+ return super(${3:`(progn (re-search-backward "^[ \t]*class \\(.+\\)(") (match-string 1)))`}, self).dispatch(*args, **kwargs) \ No newline at end of file
diff --git a/oni-python/snippets/python-mode/url b/oni-python/snippets/python-mode/url
new file mode 100644
index 0000000..00ade72
--- /dev/null
+++ b/oni-python/snippets/python-mode/url
@@ -0,0 +1,5 @@
+# -*- mode: snippet -*-
+# name: url
+# key: url
+# --
+url(r'^$1', $2, name='$3'), \ No newline at end of file