Как мне получить доступ к содержимому текущего региона в Emacs Lisp? - PullRequest
43 голосов
/ 03 марта 2009

Я хочу получить доступ к содержимому текущего региона в виде строки внутри функции. Например:

(concat "stringa" (get-region-as-string) "stringb")

Спасибо

Ed

Ответы [ 3 ]

69 голосов
/ 03 марта 2009

Как говорит starblue, (buffer-substring (mark) (point)) возвращает содержимое региона, если установлена ​​метка. Если вам не нужны строковые свойства , вы можете использовать вариант 'buffer-substring-no-properties.

Однако, если вы пишете интерактивную команду , есть лучший способ получить конечные точки региона, используя форму (interactive "r"). Вот пример из simple.el:

(defun count-lines-region (start end)
  "Print number of lines and characters in the region."
  (interactive "r")
  (message "Region has %d lines, %d characters"
       (count-lines start end) (- end start)))

При вызове из кода на Лиспе форма (interactive ...) игнорируется, поэтому вы можете использовать эту функцию для подсчета строк в любой части буфера, а не только в области, путем передачи соответствующих аргументов : например, (count-lines-region (point-min) (point-max)) для подсчета строк в суженной части буфера. Но при интерактивном вызове форма (interactive ...) оценивается, а код "r" предоставляет точку и метку в виде двух числовых аргументов, наименьший из первых.

См. Руководство по Emacs Lisp, разделы 21.2.1 Использование интерактивных и 21.2.2 Кодовые символы для интерактивных .

56 голосов
/ 03 марта 2009

buffer-substring вместе с region-beginning и region-end могут сделать это.

5 голосов
/ 03 марта 2014

Если вы хотите скопировать содержимое региона в коде Lisp в доступную пользователю структуру данных, такую ​​как kill-ring, X clipboard или register, руководство Emacs Lisp рекомендует использовать filter-buffer-substring вместо простого buffer-substring. Перед копированием функция применяет функции фильтра из переменной списка с именем filter-buffer-substring-functions. Функция была добавлена ​​в версии 22.3 .

...