This commit is contained in:
ry
2022-01-11 18:05:13 -08:00
parent 2046befee2
commit 8e7b654716
846 changed files with 71287 additions and 4 deletions

View File

@@ -0,0 +1,47 @@
#+TITLE: lang/sh
#+DATE: December 19, 2015
#+SINCE: v0.7
#+STARTUP: inlineimages
* Table of Contents :TOC:
- [[#description][Description]]
- [[#module-flags][Module Flags]]
- [[#plugins][Plugins]]
- [[#hacks][Hacks]]
- [[#prerequisites][Prerequisites]]
- [[#features][Features]]
- [[#configuration][Configuration]]
- [[#troubleshooting][Troubleshooting]]
* Description
This module adds support for shell scripting languages.
+ Code completion (company-shell)
+ Syntax Checking (flycheck)
** Module Flags
+ =+lsp= Enables LSP support for sh-mode. This requires the =:tools lsp= module
to be enabled and [[https://github.com/mads-hartmann/bash-language-server][bash-language-server]] to be installed on your system.
+ =+fish= Add syntax highlighting for fish script files.
+ =+powershell= Add syntax highlighting for Powershell script files .ps1 and .psm1
** Plugins
+ [[https://github.com/Alexander-Miller/company-shell][company-shell]]* (=:completion company=)
+ [[https://github.com/wwwjfy/emacs-fish][fish-mode]]* (=+fish=)
+ [[https://github.com/jschaf/powershell.el][powershell-mode]]* (=+powershell=)
** Hacks
+ Interpolated variables are fontified.
* Prerequisites
This module has several optional dependencies:
+ [[https://github.com/koalaman/shellcheck][shellcheck]]: Enables advanced shell script linting.
+ [[https://github.com/mads-hartmann/bash-language-server][bash-language-server]]: Enables LSP support (with =+lsp= flag).
+ With the =:tools debugger= module
+ [[http://bashdb.sourceforge.net/][bashdb]]: Enables debugging for bash scripts
+ [[https://github.com/rocky/zshdb][zshdb]]: Enables debugging for zsh scripts
* TODO Features
* TODO Configuration
* TODO Troubleshooting

View File

@@ -0,0 +1,48 @@
;;; 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))))
;;;###autoload
(defun +sh-lookup-documentation-handler ()
"Look up documentation in `man' or `woman'."
(interactive)
(call-interactively
(if (executable-find "man")
#'man
#'woman))
(current-buffer))

View File

@@ -0,0 +1,95 @@
;;; 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 ("\\.bats\\'" . sh-mode)
:mode ("\\.\\(?:zunit\\|env\\)\\'" . sh-mode)
:mode ("/bspwmrc\\'" . sh-mode)
:config
(set-docsets! 'sh-mode "Bash")
(set-electric! 'sh-mode :words '("else" "elif" "fi" "done" "then" "do" "esac" ";;"))
(set-formatter! 'shfmt
'("shfmt" "-ci"
("-i" "%d" (unless indent-tabs-mode tab-width))
("-ln" "%s" (pcase sh-shell (`bash "bash") (`mksh "mksh") (_ "posix")))))
(set-repl-handler! 'sh-mode #'+sh/open-repl)
(set-lookup-handlers! 'sh-mode :documentation #'+sh-lookup-documentation-handler)
(set-ligatures! 'sh-mode
;; Functional
:def "function"
;; Types
:true "true" :false "false"
;; Flow
:not "!"
:and "&&" :or "||"
:in "in"
:for "for"
:return "return"
;; Other
:dot "." :dot "source")
(when (featurep! +lsp)
(add-hook 'sh-mode-local-vars-hook #'lsp!))
(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)
:unless (featurep! +lsp)
:after sh-script
:config
(set-company-backend! 'sh-mode '(company-shell company-files))
(setq company-shell-delete-duplicates t
;; whatis lookups are exceptionally slow on macOS (#5860)
company-shell-dont-fetch-meta IS-MAC))
(use-package! fish-mode
:when (featurep! +fish)
:defer t
:config (set-formatter! 'fish-mode #'fish_indent))
(use-package! powershell
:when (featurep! +powershell)
:defer t
:config
(when (featurep! +lsp)
(add-hook 'powershell-mode-local-vars-hook #'lsp!)))

View File

@@ -0,0 +1,5 @@
;;; lang/sh/doctor.el -*- lexical-binding: t; -*-
(when (featurep! :checkers syntax)
(unless (executable-find "shellcheck")
(warn! "Couldn't find shellcheck. Shell script linting will not work")))

View File

@@ -0,0 +1,11 @@
;; -*- no-byte-compile: t; -*-
;;; lang/sh/packages.el
(when (featurep! :completion company)
(package! company-shell :pin "a77f4de75912aa87314cde92c603b831d5050246"))
(when (featurep! +fish)
(package! fish-mode :pin "a7c953b1491ac3a3e00a7b560f2c9f46b3cb5c04"))
(when (featurep! +powershell)
(package! powershell :pin "d1b3f95669343399f199f291ef76c09a0ede5e60"))