Я пишу простому девочку для региона, и я хочу применить его, даже если нет региона - то есть называть его без выбора. Я думал, что могу сделать что-то вроде следующего:
(defun region-study (strt end)
(interactive "r")
(if (= strt end)
(progn ....) ;; then
(progn ....))) ;; else
, но это не работает. Как оказывается, когда вы звоните (интерактивный «R»)
без региона, он не просто устанавливает границы быть равным. Попробуйте это:
(defun region-study (strt end)
(interactive "r")
(message "strt=%d; end=%d" strt end))
Итак, мой вопрос в том, что: «Как написать Defun, который действует на регион, но действует на точку зрения, если нет региона?»
Редактировать:
Так что я хотел поставить Выбор в скобках или просто для вставки кронштейнов и (обратно-чар 1)
. Вот решение:
(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 "[" "]"))
, а затем вы связываете в .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)
Это так! ДОЛЖЕН работать во всех режимах.
Редактировать2 :
@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))))