diff options
Diffstat (limited to 'lisp/progmodes/sh-script.el')
-rw-r--r-- | lisp/progmodes/sh-script.el | 141 |
1 files changed, 68 insertions, 73 deletions
diff --git a/lisp/progmodes/sh-script.el b/lisp/progmodes/sh-script.el index f588ad99c9d..b6674731ddf 100644 --- a/lisp/progmodes/sh-script.el +++ b/lisp/progmodes/sh-script.el @@ -403,8 +403,7 @@ This is buffer-local in every such buffer.") "Syntax-table used in Shell-Script mode. See `sh-feature'.") (defvar sh-mode-map - (let ((map (make-sparse-keymap)) - (menu-map (make-sparse-keymap))) + (let ((map (make-sparse-keymap))) (define-key map "\C-c(" 'sh-function) (define-key map "\C-c\C-w" 'sh-while) (define-key map "\C-c\C-u" 'sh-until) @@ -434,74 +433,57 @@ This is buffer-local in every such buffer.") (define-key map "\C-c:" 'sh-set-shell) (define-key map [remap backward-sentence] 'sh-beginning-of-command) (define-key map [remap forward-sentence] 'sh-end-of-command) - (define-key map [menu-bar sh-script] (cons "Sh-Script" menu-map)) - (define-key menu-map [smie-config-guess] - '(menu-item "Learn buffer indentation" smie-config-guess - :help "Learn how to indent the buffer the way it currently is.")) - (define-key menu-map [smie-config-show-indent] - '(menu-item "Show indentation" smie-config-show-indent - :help "Show the how the current line would be indented")) - (define-key menu-map [smie-config-set-indent] - '(menu-item "Set indentation" smie-config-set-indent - :help "Set the indentation for the current line")) - - (define-key menu-map [sh-pair] - '(menu-item "Insert braces and quotes in pairs" - electric-pair-mode - :button (:toggle . (bound-and-true-p electric-pair-mode)) - :help "Inserting a brace or quote automatically inserts the matching pair")) - - (define-key menu-map [sh-s0] '("--")) - ;; Insert - (define-key menu-map [sh-function] - '(menu-item "Function..." sh-function - :help "Insert a function definition")) - (define-key menu-map [sh-add] - '(menu-item "Addition..." sh-add - :help "Insert an addition of VAR and prefix DELTA for Bourne (type) shell")) - (define-key menu-map [sh-until] - '(menu-item "Until Loop" sh-until - :help "Insert an until loop")) - (define-key menu-map [sh-repeat] - '(menu-item "Repeat Loop" sh-repeat - :help "Insert a repeat loop definition")) - (define-key menu-map [sh-while] - '(menu-item "While Loop" sh-while - :help "Insert a while loop")) - (define-key menu-map [sh-getopts] - '(menu-item "Options Loop" sh-while-getopts - :help "Insert a while getopts loop.")) - (define-key menu-map [sh-indexed-loop] - '(menu-item "Indexed Loop" sh-indexed-loop - :help "Insert an indexed loop from 1 to n.")) - (define-key menu-map [sh-select] - '(menu-item "Select Statement" sh-select - :help "Insert a select statement ")) - (define-key menu-map [sh-if] - '(menu-item "If Statement" sh-if - :help "Insert an if statement")) - (define-key menu-map [sh-for] - '(menu-item "For Loop" sh-for - :help "Insert a for loop")) - (define-key menu-map [sh-case] - '(menu-item "Case Statement" sh-case - :help "Insert a case/switch statement")) - (define-key menu-map [sh-s1] '("--")) - (define-key menu-map [sh-exec] - '(menu-item "Execute region" sh-execute-region - :help "Pass optional header and region to a subshell for noninteractive execution")) - (define-key menu-map [sh-exec-interpret] - '(menu-item "Execute script..." executable-interpret - :help "Run script with user-specified args, and collect output in a buffer")) - (define-key menu-map [sh-set-shell] - '(menu-item "Set shell type..." sh-set-shell - :help "Set this buffer's shell to SHELL (a string)")) - (define-key menu-map [sh-backslash-region] - '(menu-item "Backslash region" sh-backslash-region - :help "Insert, align, or delete end-of-line backslashes on the lines in the region.")) map) "Keymap used in Shell-Script mode.") +(easy-menu-define sh-mode-menu sh-mode-map + "Menu for Shell-Script mode." + '("Sh-Script" + ["Backslash region" sh-backslash-region + :help "Insert, align, or delete end-of-line backslashes on the lines in the region."] + ["Set shell type..." sh-set-shell + :help "Set this buffer's shell to SHELL (a string)"] + ["Execute script..." executable-interpret + :help "Run script with user-specified args, and collect output in a buffer"] + ["Execute region" sh-execute-region + :help "Pass optional header and region to a subshell for noninteractive execution"] + "---" + ;; Insert + ["Case Statement" sh-case + :help "Insert a case/switch statement"] + ["For Loop" sh-for + :help "Insert a for loop"] + ["If Statement" sh-if + :help "Insert an if statement"] + ["Select Statement" sh-select + :help "Insert a select statement "] + ["Indexed Loop" sh-indexed-loop + :help "Insert an indexed loop from 1 to n."] + ["Options Loop" sh-while-getopts + :help "Insert a while getopts loop."] + ["While Loop" sh-while + :help "Insert a while loop"] + ["Repeat Loop" sh-repeat + :help "Insert a repeat loop definition"] + ["Until Loop" sh-until + :help "Insert an until loop"] + ["Addition..." sh-add + :help "Insert an addition of VAR and prefix DELTA for Bourne (type) shell"] + ["Function..." sh-function + :help "Insert a function definition"] + "---" + ;; Other + ["Insert braces and quotes in pairs" electric-pair-mode + :style toggle + :selected (bound-and-true-p electric-pair-mode) + :help "Inserting a brace or quote automatically inserts the matching pair"] + ["Set indentation" smie-config-set-indent + :help "Set the indentation for the current line"] + ["Show indentation" smie-config-show-indent + :help "Show the how the current line would be indented"] + ["Learn buffer indentation" smie-config-guess + :help "Learn how to indent the buffer the way it currently is."])) + (defvar sh-skeleton-pair-default-alist '((?\( _ ?\)) (?\)) (?\[ ?\s _ ?\s ?\]) (?\]) (?{ _ ?}) (?\})) @@ -1550,6 +1532,7 @@ with your script for an edit-interpret-debug cycle." (setq-local add-log-current-defun-function #'sh-current-defun-name) (add-hook 'completion-at-point-functions #'sh-completion-at-point-function nil t) + (setq-local outline-regexp "###") ;; Parse or insert magic number for exec, and set all variables depending ;; on the shell thus determined. (sh-set-shell @@ -1614,6 +1597,8 @@ This adds rules for comments and assignments." ;;; Completion +(defvar sh--completion-keywords '("if" "while" "until" "for")) + (defun sh--vars-before-point () (save-excursion (let ((vars ())) @@ -1635,7 +1620,7 @@ This adds rules for comments and assignments." (sh--vars-before-point)) (locate-file-completion-table exec-path exec-suffixes string pred t) - '("if" "while" "until" "for")))) + sh--completion-keywords))) (complete-with-action action cmds string pred))) (defun sh-completion-at-point-function () @@ -1646,9 +1631,17 @@ This adds rules for comments and assignments." (start (point))) (cond ((eq (char-before) ?$) - (list start end (sh--vars-before-point))) + (list start end (sh--vars-before-point) + :company-kind (lambda (_) 'variable))) ((sh-smie--keyword-p) - (list start end #'sh--cmd-completion-table)))))) + (list start end #'sh--cmd-completion-table + :company-kind + (lambda (s) + (cond + ((member s sh--completion-keywords) 'keyword) + ((string-suffix-p "=" s) 'variable) + (t 'function))) + )))))) ;;; Indentation and navigation with SMIE. @@ -2200,6 +2193,8 @@ Point should be before the newline." When used interactively, insert the proper starting #!-line, and make the visited file executable via `executable-set-magic', perhaps querying depending on the value of `executable-query'. +(If given a prefix (i.e., `C-u') don't insert any starting #! +line.) When this function is called noninteractively, INSERT-FLAG (the third argument) controls whether to insert a #!-line and think about making @@ -2223,7 +2218,7 @@ whose value is the shell name (don't quote it)." '("csh" "rc" "sh")) nil nil nil nil sh-shell-file) (eq executable-query 'function) - t)) + (not current-prefix-arg))) (if (string-match "\\.exe\\'" shell) (setq shell (substring shell 0 (match-beginning 0)))) (setq sh-shell (sh-canonicalize-shell shell)) @@ -2678,7 +2673,7 @@ t means to return a list of all possible completions of STRING. (or sh-shell-variables-initialized (sh-shell-initialize-variables)) (nconc (mapcar (lambda (var) - (substring var 0 (string-match "=" var))) + (substring var 0 (string-search "=" var))) process-environment) sh-shell-variables)))) (complete-with-action code vars string predicate))) @@ -2985,7 +2980,7 @@ The document is bounded by `sh-here-document-word'." (define-minor-mode sh-electric-here-document-mode "Make << insert a here document skeleton." - nil nil nil + :lighter nil (if sh-electric-here-document-mode (add-hook 'post-self-insert-hook #'sh--maybe-here-document nil t) (remove-hook 'post-self-insert-hook #'sh--maybe-here-document t))) |