mirror of
https://gitlab.com/dwt1/dotfiles.git
synced 2026-04-23 11:30:23 +10:00
Moving to Doom Emacs!
This commit is contained in:
19
.emacs.d/modules/lang/sh/README.org
Normal file
19
.emacs.d/modules/lang/sh/README.org
Normal file
@@ -0,0 +1,19 @@
|
||||
#+TITLE: :lang sh
|
||||
|
||||
This module adds support for shell scripting languages.
|
||||
|
||||
+ Code completion (company-shell)
|
||||
+ Syntax Checking (flycheck)
|
||||
+ Added variable interpolation fontification
|
||||
|
||||
* Table of Contents :TOC:
|
||||
- [[#install][Install]]
|
||||
- [[#dependencies][Dependencies]]
|
||||
|
||||
* Install
|
||||
** Dependencies
|
||||
This module has several soft dependencies:
|
||||
|
||||
+ ~shellcheck~ Enables shell script linting.
|
||||
+ ~bashdb~ Enables debugging for bash scripts.
|
||||
+ ~zshdb~ Enables debugging for zsh scripts.
|
||||
38
.emacs.d/modules/lang/sh/autoload.el
Normal file
38
.emacs.d/modules/lang/sh/autoload.el
Normal file
@@ -0,0 +1,38 @@
|
||||
;;; lang/sh/autoload.el -*- lexical-binding: t; -*-
|
||||
|
||||
;;;###autoload
|
||||
(defun +sh--match-variables-in-quotes (limit)
|
||||
"Search for variables in double-quoted strings bounded by LIMIT."
|
||||
(with-syntax-table sh-mode-syntax-table
|
||||
(let (res)
|
||||
(while
|
||||
(and (setq res
|
||||
(re-search-forward
|
||||
"[^\\]\\(\\$\\)\\({.+?}\\|\\<[a-zA-Z0-9_]+\\|[@*#!]\\)"
|
||||
limit t))
|
||||
(not (eq (nth 3 (syntax-ppss)) ?\"))))
|
||||
res)))
|
||||
|
||||
;;;###autoload
|
||||
(defun +sh--match-command-subst-in-quotes (limit)
|
||||
"Search for variables in double-quoted strings bounded by LIMIT."
|
||||
(with-syntax-table sh-mode-syntax-table
|
||||
(let (res)
|
||||
(while
|
||||
(and (setq res
|
||||
(re-search-forward "[^\\]\\(\\$(.+?)\\|`.+?`\\)"
|
||||
limit t))
|
||||
(not (eq (nth 3 (syntax-ppss)) ?\"))))
|
||||
res)))
|
||||
|
||||
(defvar sh-shell-file)
|
||||
;;;###autoload
|
||||
(defun +sh/open-repl ()
|
||||
"Open a shell REPL."
|
||||
(interactive)
|
||||
(let* ((dest-sh (symbol-name sh-shell))
|
||||
(sh-shell-file dest-sh))
|
||||
(sh-shell-process t)
|
||||
(with-current-buffer "*shell*"
|
||||
(rename-buffer (format "*shell [%s]*" dest-sh))
|
||||
(current-buffer))))
|
||||
64
.emacs.d/modules/lang/sh/config.el
Executable file
64
.emacs.d/modules/lang/sh/config.el
Executable file
@@ -0,0 +1,64 @@
|
||||
;;; lang/sh/config.el -*- lexical-binding: t; -*-
|
||||
|
||||
(defvar +sh-builtin-keywords
|
||||
'("cat" "cd" "chmod" "chown" "cp" "curl" "date" "echo" "find" "git" "grep"
|
||||
"kill" "less" "ln" "ls" "make" "mkdir" "mv" "pgrep" "pkill" "pwd" "rm"
|
||||
"sleep" "sudo" "touch")
|
||||
"A list of common shell commands to be fontified especially in `sh-mode'.")
|
||||
|
||||
|
||||
;;
|
||||
;;; Packages
|
||||
|
||||
(use-package! sh-script ; built-in
|
||||
:mode ("\\.zunit\\'" . sh-mode)
|
||||
:mode ("/bspwmrc\\'" . sh-mode)
|
||||
:config
|
||||
(set-electric! 'sh-mode :words '("else" "elif" "fi" "done" "then" "do" "esac" ";;"))
|
||||
(set-repl-handler! 'sh-mode #'+sh/open-repl)
|
||||
|
||||
(setq sh-indent-after-continuation 'always)
|
||||
|
||||
;; [pedantry intensifies]
|
||||
(setq-hook! 'sh-mode-hook mode-name "sh")
|
||||
|
||||
;; recognize function names with dashes in them
|
||||
(add-to-list 'sh-imenu-generic-expression
|
||||
'(sh (nil "^\\s-*function\\s-+\\([[:alpha:]_-][[:alnum:]_-]*\\)\\s-*\\(?:()\\)?" 1)
|
||||
(nil "^\\s-*\\([[:alpha:]_-][[:alnum:]_-]*\\)\\s-*()" 1)))
|
||||
|
||||
;; `sh-set-shell' is chatty about setting up indentation rules
|
||||
(advice-add #'sh-set-shell :around #'doom-shut-up-a)
|
||||
|
||||
;; 1. Fontifies variables in double quotes
|
||||
;; 2. Fontify command substitution in double quotes
|
||||
;; 3. Fontify built-in/common commands (see `+sh-builtin-keywords')
|
||||
(add-hook! 'sh-mode-hook
|
||||
(defun +sh-init-extra-fontification-h ()
|
||||
(font-lock-add-keywords
|
||||
nil `((+sh--match-variables-in-quotes
|
||||
(1 'font-lock-constant-face prepend)
|
||||
(2 'font-lock-variable-name-face prepend))
|
||||
(+sh--match-command-subst-in-quotes
|
||||
(1 'sh-quoted-exec prepend))
|
||||
(,(regexp-opt +sh-builtin-keywords 'symbols)
|
||||
(0 'font-lock-type-face append))))))
|
||||
;; 4. Fontify delimiters by depth
|
||||
(add-hook 'sh-mode-hook #'rainbow-delimiters-mode)
|
||||
|
||||
;; autoclose backticks
|
||||
(sp-local-pair 'sh-mode "`" "`" :unless '(sp-point-before-word-p sp-point-before-same-p)))
|
||||
|
||||
|
||||
(use-package! company-shell
|
||||
:when (featurep! :completion company)
|
||||
:after sh-script
|
||||
:config
|
||||
(set-company-backend! 'sh-mode '(company-shell company-files))
|
||||
(setq company-shell-delete-duplicates t))
|
||||
|
||||
|
||||
(use-package! fish-mode
|
||||
:when (featurep! +fish)
|
||||
:defer t
|
||||
:config (set-formatter! 'fish-mode #'fish_indent))
|
||||
5
.emacs.d/modules/lang/sh/doctor.el
Normal file
5
.emacs.d/modules/lang/sh/doctor.el
Normal file
@@ -0,0 +1,5 @@
|
||||
;;; lang/sh/doctor.el -*- lexical-binding: t; -*-
|
||||
|
||||
(when (featurep! :tools flycheck)
|
||||
(unless (executable-find "shellcheck")
|
||||
(warn! "Couldn't find shellcheck. Shell script linting will not work")))
|
||||
8
.emacs.d/modules/lang/sh/packages.el
Normal file
8
.emacs.d/modules/lang/sh/packages.el
Normal file
@@ -0,0 +1,8 @@
|
||||
;; -*- no-byte-compile: t; -*-
|
||||
;;; lang/sh/packages.el
|
||||
|
||||
(when (featurep! :completion company)
|
||||
(package! company-shell))
|
||||
|
||||
(when (featurep! +fish)
|
||||
(package! fish-mode))
|
||||
Reference in New Issue
Block a user