Как получить начало / конец текущей информации о буфере с помощью emacs / elisp? - PullRequest
6 голосов
/ 25 августа 2010

У меня есть следующий код, который запускает figlet, который имеет вход в качестве диапазона. Как я могу изменить этот код, чтобы проверить, не указано ли b или e, сделать b началом текущего буфера и концом текущего буфера e?

(defun figlet-region (&optional b e) 
  (interactive "r")
  (shell-command-on-region b e "/opt/local/bin/figlet" (current-buffer) t)
  (comment-region (mark) (point)))
(global-set-key (kbd "C-c C-x") 'figlet-region)

ДОБАВЛЕНО

Шон помог мне получить ответ на этот вопрос

(defun figlet-region (&optional b e) 
  (interactive)
  (let ((b (if mark-active (min (point) (mark)) (point-min)))
        (e (if mark-active (max (point) (mark)) (point-max))))
   (shell-command-on-region b e "/opt/local/bin/figlet" (current-buffer) t)
  (comment-region (mark) (point))))
(global-set-key (kbd "C-c C-x") 'figlet-region)

Ответы [ 2 ]

7 голосов
/ 25 августа 2010

Как это:

(defun figlet-region (&optional b e) 
  (interactive "r")
  (shell-command-on-region
   (or b (point-min))
   (or e (point-max))
   "/opt/local/bin/figlet" (current-buffer) t)
  (comment-region (mark) (point)))

Но учтите, что b и e всегда будут установлены, когда эта команда запускается в интерактивном режиме.

Вы также можете сделать это:

(require 'cl)

(defun* figlet-region (&optional (b (point-min)) (e (point-max)))
  # your original function body here
    )

EDIT:

Итак, я предполагаю, что вы хотите иметь возможность запускать команду в интерактивном режиме, даже если регион не активен? Тогда, возможно, это будет работать для вас:

(defun figlet-region ()
  (interactive)
  (let ((b (if mark-active (min (point) (mark)) (point-min)))
        (e (if mark-active (max (point) (mark)) (point-max))))
    # ... rest of your original function body ...
      ))
3 голосов
/ 25 августа 2010

Попробуйте

(unless b (setq b (point-min)))
(unless e (setq e (point-max)))
...