Emacs: how to write defun that acts on a region but acts on a point if there is no region?

I am writing a simple defun for an area, and I want to apply it even if there is no area - i.e. call him without a choice whatsoever. I thought I could do something like the following:

(defun region-study (strt end)
  (interactive "r")
  (if (= strt end)
    (progn ....) ;; then
    (progn ....))) ;; else

But that will not work. As it turns out, when you call (interactive "r")without a region, it does not just set the boundaries equal. Try the following:

(defun region-study (strt end)
  (interactive "r")
  (message "strt=%d; end=%d" strt end))

So my question is: "how to write defun that acts on a region but acts on a point if there is no region?"

Edit:

So, I wanted to put the selection in brackets or just insert brackets and (backward-char 1). Here's the solution:

(defun put-in-lft-rit (lft rit)
  (interactive "k")
  (if (use-region-p) ;; act on region
    (progn 
      (setq pP (point)) 

      (setq strt (region-beginning))
      (setq end (region-end))

      (setq meat (buffer-substring-no-properties strt end))
      (setq news (concat lft meat rit))
      (delete-region strt end)
      (goto-char strt)
      (insert news)

      (if (= pP strt)
      (goto-char strt) ; then
      (goto-char (+ end 1))))  ; else
    (progn ;; act on point
      (insert lft rit)
      (backward-char 1))))

(defun bk-put-in-braces ()
  (interactive)
  (put-in-lft-rit "(" ")"))

(defun bk-put-in-curly-braces ()
  (interactive)
  (put-in-lft-rit "{" "}"))

(defun bk-put-in-quotes ()
  (interactive)
  (put-in-lft-rit "'" "'"))

(defun bk-put-in-double-quotes ()
  (interactive)
  (put-in-lft-rit "\"" "\""))

(defun bk-put-in-square-brackes ()
  (interactive)
  (put-in-lft-rit "[" "]"))

And then you contact in .emacs:

(global-set-key (kbd "C-<f9>") 'bk-put-in-square-brackes)
(global-set-key (kbd "<f9>") 'bk-put-in-curly-braces)
(global-set-key (kbd "S-<f7>") 'bk-put-in-quotes)
(global-set-key (kbd "S-<f8>") 'bk-put-in-double-quotes)
(global-set-key (kbd "S-<f9>") 'bk-put-in-braces)

What is it! Should work in all modes.

Edit2

@phils . . - - , . :

(defun put-in-lft-rit (lft rit)
  (interactive "k")
  (if (use-region-p) ;; act on region
      (let ((strt (region-beginning))
            (end (region-end))
            (pP (point)))

        (save-excursion
          (goto-char end)
          (insert rit)
          (goto-char strt)
          (insert lft))

        (if (= pP strt)
          (goto-char strt) ; then
          (goto-char (+ end 1))))  ; else

    (progn ;; act on point
      (insert lft rit)
      (backward-char 1))))
+5
3

use-region-p t, .

+6

...

  • , setq s. (let) , .

  • , . , "", , "", , , .

    ( , " " elisp , , .)

  • save-excursion ( save- with-).

 

(defun put-in-lft-rit (lft rit)
  (interactive "k")
  (if (use-region-p) ;; act on region
      (let ((strt (region-beginning))
            (end (region-end)))
        (save-excursion
          (goto-char end)
          (insert rit)
          (goto-char strt)
          (insert lft)))
    (progn ;; act on point
      (insert lft rit)
      (backward-char 1))))
+8

You can use the region-or-word-at-point function defined in thingatpt + .el

+2
source

All Articles