(sh-mode-map): Bind C-c C-\.
(sh-backslash-column, sh-backslash-align): New variables. (sh-backslash-region, sh-append-backslash): New functions.
This commit is contained in:
parent
ad8f7f494f
commit
bdd5fa9932
1 changed files with 82 additions and 0 deletions
|
|
@ -448,6 +448,7 @@ This is buffer-local in every such buffer.")
|
|||
(define-key map "\C-c=" 'sh-set-indent)
|
||||
(define-key map "\C-c<" 'sh-learn-line-indent)
|
||||
(define-key map "\C-c>" 'sh-learn-buffer-indent)
|
||||
(define-key map "\C-c\C-\\" 'sh-backslash-region)
|
||||
|
||||
(define-key map "=" 'sh-assignment)
|
||||
(define-key map "\C-c+" 'sh-add)
|
||||
|
|
@ -1183,6 +1184,16 @@ This is for the rc shell."
|
|||
:type `(choice ,@ sh-number-or-symbol-list)
|
||||
:group 'sh-indentation)
|
||||
|
||||
(defcustom sh-backslash-column 48
|
||||
"*Column in which `sh-backslash-region' inserts backslashes."
|
||||
:type 'integer
|
||||
:group 'sh)
|
||||
|
||||
(defcustom sh-backslash-align t
|
||||
"*If non-nil, `sh-backslash-region' will align backslashes."
|
||||
:type 'boolean
|
||||
:group 'sh)
|
||||
|
||||
;; Internal use - not designed to be changed by the user:
|
||||
|
||||
(defun sh-mkword-regexpr (word)
|
||||
|
|
@ -3547,6 +3558,77 @@ The document is bounded by `sh-here-document-word'."
|
|||
(if (re-search-forward sh-end-of-command nil t)
|
||||
(goto-char (match-end 1))))
|
||||
|
||||
;; Backslashification. Stolen from make-mode.el.
|
||||
|
||||
(defun sh-backslash-region (from to delete-flag)
|
||||
"Insert, align, or delete end-of-line backslashes on the lines in the region.
|
||||
With no argument, inserts backslashes and aligns existing backslashes.
|
||||
With an argument, deletes the backslashes.
|
||||
|
||||
This function does not modify the last line of the region if the region ends
|
||||
right at the start of the following line; it does not modify blank lines
|
||||
at the start of the region. So you can put the region around an entire
|
||||
shell command and conveniently use this command."
|
||||
(interactive "r\nP")
|
||||
(save-excursion
|
||||
(goto-char from)
|
||||
(let ((column sh-backslash-column)
|
||||
(endmark (make-marker)))
|
||||
(move-marker endmark to)
|
||||
;; Compute the smallest column number past the ends of all the lines.
|
||||
(if sh-backslash-align
|
||||
(progn
|
||||
(if (not delete-flag)
|
||||
(while (< (point) to)
|
||||
(end-of-line)
|
||||
(if (= (preceding-char) ?\\)
|
||||
(progn (forward-char -1)
|
||||
(skip-chars-backward " \t")))
|
||||
(setq column (max column (1+ (current-column))))
|
||||
(forward-line 1)))
|
||||
;; Adjust upward to a tab column, if that doesn't push
|
||||
;; past the margin.
|
||||
(if (> (% column tab-width) 0)
|
||||
(let ((adjusted (* (/ (+ column tab-width -1) tab-width)
|
||||
tab-width)))
|
||||
(if (< adjusted (window-width))
|
||||
(setq column adjusted))))))
|
||||
;; Don't modify blank lines at start of region.
|
||||
(goto-char from)
|
||||
(while (and (< (point) endmark) (eolp))
|
||||
(forward-line 1))
|
||||
;; Add or remove backslashes on all the lines.
|
||||
(while (and (< (point) endmark)
|
||||
;; Don't backslashify the last line
|
||||
;; if the region ends right at the start of the next line.
|
||||
(save-excursion
|
||||
(forward-line 1)
|
||||
(< (point) endmark)))
|
||||
(if (not delete-flag)
|
||||
(sh-append-backslash column)
|
||||
(sh-delete-backslash))
|
||||
(forward-line 1))
|
||||
(move-marker endmark nil))))
|
||||
|
||||
(defun sh-append-backslash (column)
|
||||
(end-of-line)
|
||||
;; Note that "\\\\" is needed to get one backslash.
|
||||
(if (= (preceding-char) ?\\)
|
||||
(progn (forward-char -1)
|
||||
(delete-horizontal-space)
|
||||
(indent-to column (if sh-backslash-align nil 1)))
|
||||
(indent-to column (if sh-backslash-align nil 1))
|
||||
(insert "\\")))
|
||||
|
||||
(defun sh-delete-backslash ()
|
||||
(end-of-line)
|
||||
(or (bolp)
|
||||
(progn
|
||||
(forward-char -1)
|
||||
(if (looking-at "\\\\")
|
||||
(delete-region (1+ (point))
|
||||
(progn (skip-chars-backward " \t") (point)))))))
|
||||
|
||||
(provide 'sh-script)
|
||||
|
||||
;;; arch-tag: eccd8b72-f337-4fc2-ae86-18155a69d937
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue