1
0
Fork 0
emacs-config/oni-python/oni-python.el

115 lines
3.6 KiB
EmacsLisp
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

;;; oni-python.el --- Python configuration -*- lexical-binding: t; -*-
;; Copyright (C) 2019 Tom Willemse
;; Author: Tom Willemse <tom@ryuslash.org>
;; Keywords: local
;; Version: 2024.0621.092608
;; Package-Requires: (oni-yasnippet oni-company oni-flycheck oni-hydra oni-lsp rainbow-delimiters reformatter)
;; 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 'whitespace)
(require 'yasnippet)
;; Don't mind if treesit can't be loaded, maybe this Emacs doesn't have it.
(require 'treesit nil t)
(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))
(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))
;;;###autoload
(defun oni-python--enable-hooks (hook)
(add-hook hook 'company-mode)
(add-hook hook 'display-fill-column-indicator-mode)
(add-hook hook 'electric-indent-local-mode)
(add-hook hook 'electric-pair-local-mode)
(add-hook hook 'flycheck-mode)
(add-hook hook 'lsp)
(add-hook hook 'oni-python-set-fill-column)
(add-hook hook 'oni-python-whitespace-mode)
(add-hook hook 'python-black-on-save-mode)
(add-hook hook 'rainbow-delimiters-mode))
(reformatter-define python-black
:program "black"
:args `("--line-length" ,(number-to-string fill-column) "-")
:lighter ""
:group 'python-black)
(define-key python-mode-map (kbd "C-c r") 'python-refactor-hydra/body)
(oni-python--enable-hooks 'python-mode-hook)
;;;###autoload
(when (and (functionp 'treesit-available-p)
(treesit-available-p)
(require 'treesit)
(treesit-ready-p 'python))
(add-to-list 'major-mode-remap-alist '(python-mode . python-ts-mode))
(oni-python--enable-hooks 'python-ts-mode-hook))
(with-eval-after-load 'python
(with-eval-after-load 'yasnippet
(oni-python-snippets-initialize)))
(provide 'oni-python)
;;; oni-python.el ends here