Как получить область (выбор) программно в 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))))
Любые предложения? Большое спасибо!
Ответы
Ответ 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"))
)