yeet
This commit is contained in:
47
.config/emacs/modules/lang/sh/README.org
Normal file
47
.config/emacs/modules/lang/sh/README.org
Normal 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
|
||||
48
.config/emacs/modules/lang/sh/autoload.el
Normal file
48
.config/emacs/modules/lang/sh/autoload.el
Normal 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))
|
||||
95
.config/emacs/modules/lang/sh/config.el
Executable file
95
.config/emacs/modules/lang/sh/config.el
Executable 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!)))
|
||||
5
.config/emacs/modules/lang/sh/doctor.el
Normal file
5
.config/emacs/modules/lang/sh/doctor.el
Normal 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")))
|
||||
11
.config/emacs/modules/lang/sh/packages.el
Normal file
11
.config/emacs/modules/lang/sh/packages.el
Normal 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"))
|
||||
Reference in New Issue
Block a user