Подтвердить что ты не робот

Как получить область (выбор) программно в Emacs Lisp?

Мне нужно получить доступ к выбору в буфере Emacs. Я нашел эту статью Как получить доступ к содержимому текущего региона в Emacs Lisp? и это очень помогает мне.

Но есть проблема. В первый раз, когда я выбираю (выделяю) регион, он работает нормально, но когда я нажимаю Cg и обычно курсор перемещаюсь в другое место, не выделяя никаких символов, я получаю строку от последней метки до текущей точки, пока ожидаю, что пустая.

На самом деле мне нужно реализовать функцию, которая вернет текущий выбор (выделенный) в виде строки или пустую строку, если ничего не подсвечено. Следующий код может выразить яснее.


(defun get-search-term ()
  (interactive)
  (let (
        (selection (buffer-substring-no-properties (region-beginning) (region-end))))
    (if (= (length selection) 0)
        (message "empty string")
      (message selection))))

Любые предложения? Большое спасибо!

4b9b3361

Ответ 1

"r" спецификация интерактивного не указана. Вы видите, почему.

(defun get-search-term (beg end)
  "message region or \"empty string\" if none highlighted"
  (interactive (if (use-region-p)
                   (list (region-beginning) (region-end))
                 (list (point-min) (point-min))))
  (let ((selection (buffer-substring-no-properties beg end)))
    (if (= (length selection) 0)
        (message "empty string")
      (message selection))))

Я не имею в виду "тупой", как в глупости и не полезен; просто, что это не волнует о том, активен ли знак или нет. Я думаю, что это предшествует переходный знак режима.

РЕДАКТИРОВАТЬ: использование (point-min) дважды выше делает код более сложным для понимания при повторном чтении. Вот более эффективная реализация:

(defun get-search-term (beg end)
  "message region or \"empty string\" if none highlighted"
  (interactive (if (use-region-p)
                   (list (region-beginning) (region-end))
                 (list nil nil)))
  (message "%s" (if (and beg end)
                    (buffer-substring-no-properties beg end)
                  "empty string")))

Ответ 2

Проверить переменную mark-active, например. C-h v mark-active

== > mark-active - это переменная, определенная в `C исходном коде '. Его значение равно нулю Локальный в буфере Apropos; глобальное значение равно nil

Автоматически становится буферно-локальным, если он установлен любым способом.

Документация: Non-nil означает, что марка и область в данный момент активны в этом буфере.

(defun get-search-term ()
  (interactive)
  (if mark-active
      (let (
        (selection (buffer-substring-no-properties (region-beginning) (region-end))))
    (if (= (length selection) 0)
        (message "empty string")
      (message selection))
    )
    (error "mark not active"))
  )