mirror of
https://git.savannah.gnu.org/git/emacs.git
synced 2024-12-18 10:16:51 +00:00
Add a command for string quotes toggling to ruby-mode
* progmodes/ruby-mode.el (ruby-toggle-string-quotes): New command that allows you to quickly toggle between single-quoted and double-quoted string literals.
This commit is contained in:
parent
9b185aa1ae
commit
e8acfc7fb4
@ -2,6 +2,8 @@
|
||||
|
||||
* progmodes/ruby-mode.el (auto-mode-alist): Add .rabl, Berksfile
|
||||
and Puppetfile.
|
||||
(ruby-toggle-string-quotes): New command that allows you to quickly
|
||||
toggle between single-quoted and double-quoted string literals.
|
||||
|
||||
2014-12-09 Eric S. Raymond <esr@snark.thyrsus.com>
|
||||
|
||||
|
@ -152,6 +152,7 @@ This should only be called after matching against `ruby-here-doc-beg-re'."
|
||||
(define-key map (kbd "M-C-p") 'ruby-beginning-of-block)
|
||||
(define-key map (kbd "M-C-n") 'ruby-end-of-block)
|
||||
(define-key map (kbd "C-c {") 'ruby-toggle-block)
|
||||
(define-key map (kbd "C-c '") 'ruby-toggle-string-quotes)
|
||||
map)
|
||||
"Keymap used in Ruby mode.")
|
||||
|
||||
@ -164,6 +165,8 @@ This should only be called after matching against `ruby-here-doc-beg-re'."
|
||||
["End of Block" ruby-end-of-block t]
|
||||
["Toggle Block" ruby-toggle-block t]
|
||||
"--"
|
||||
["Toggle String Quotes" ruby-toggle-string-quotes t]
|
||||
"--"
|
||||
["Backward Sexp" ruby-backward-sexp
|
||||
:visible (not ruby-use-smie)]
|
||||
["Backward Sexp" backward-sexp
|
||||
@ -1763,6 +1766,48 @@ If the result is do-end block, it will always be multiline."
|
||||
(ruby-do-end-to-brace beg end)))
|
||||
(goto-char start))))
|
||||
|
||||
(defun ruby--string-region ()
|
||||
"Return region for string at point."
|
||||
(let ((orig-point (point)) (regex "'\\(\\(\\\\'\\)\\|[^']\\)*'\\|\"\\(\\(\\\\\"\\)\\|[^\"]\\)*\"") beg end)
|
||||
(save-excursion
|
||||
(goto-char (line-beginning-position))
|
||||
(while (and (re-search-forward regex (line-end-position) t) (not (and beg end)))
|
||||
(let ((match-beg (match-beginning 0)) (match-end (match-end 0)))
|
||||
(when (and
|
||||
(> orig-point match-beg)
|
||||
(< orig-point match-end))
|
||||
(setq beg match-beg)
|
||||
(setq end match-end))))
|
||||
(and beg end (list beg end)))))
|
||||
|
||||
(defun ruby-string-at-point-p ()
|
||||
"Check if cursor is at a string or not."
|
||||
(ruby--string-region))
|
||||
|
||||
(defun ruby--inverse-string-quote (string-quote)
|
||||
"Get the inverse string quoting for STRING-QUOTE."
|
||||
(if (equal string-quote "\"") "'" "\""))
|
||||
|
||||
(defun ruby-toggle-string-quotes ()
|
||||
"Toggle string literal quoting between single and double."
|
||||
(interactive)
|
||||
(when (ruby-string-at-point-p)
|
||||
(let* ((region (ruby--string-region))
|
||||
(min (nth 0 region))
|
||||
(max (nth 1 region))
|
||||
(string-quote (ruby--inverse-string-quote (buffer-substring-no-properties min (1+ min))))
|
||||
(content
|
||||
(buffer-substring-no-properties (1+ min) (1- max))))
|
||||
(setq content
|
||||
(if (equal string-quote "\"")
|
||||
(replace-regexp-in-string "\\\\\"" "\"" (replace-regexp-in-string "\\([^\\\\]\\)'" "\\1\\\\'" content))
|
||||
(replace-regexp-in-string "\\\\\'" "'" (replace-regexp-in-string "\\([^\\\\]\\)\"" "\\1\\\\\"" content))))
|
||||
(let ((orig-point (point)))
|
||||
(delete-region min max)
|
||||
(insert
|
||||
(format "%s%s%s" string-quote content string-quote))
|
||||
(goto-char orig-point)))))
|
||||
|
||||
(eval-and-compile
|
||||
(defconst ruby-percent-literal-beg-re
|
||||
"\\(%\\)[qQrswWxIi]?\\([[:punct:]]\\)"
|
||||
|
Loading…
Reference in New Issue
Block a user