Получить содержимое в виде строки региона в буфере программой elisp - PullRequest
0 голосов
/ 21 декабря 2018

Вот проблема, которую я решаю: преобразовать область текста в структуру данных строки для последующей обработки программой elisp.Проблема в том, что

  1. Я хочу, чтобы программа elisp выполнялась в интерактивном режиме, не влияя на выбор области
  2. , сохраняя строковое значение в переменной, чтобы я мог в дальнейшем манипулировать им.

Насколько я понимаю, регион определяется меткой и последующей позицией курсора.И я обычно выполняю программу elisp в * нуля * буфере.Кроме того, регион также находится в буфере * scratch *.

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

(setq grabbed (buffer-substring-no-properties (region-beginning) (region-end)))

, но тогда область выбора изменится из-за движения курсора.

Так что мне интересно, как я мог бы выполнить программу elisp, сохранив выбор без изменений и все еще имея доступ к возвращаемому значению.

Ответы [ 2 ]

0 голосов
/ 22 декабря 2018

Наконец-то я нашел желаемое решение!Он использует ielm буфер, реальный ответ elisp.В буфере ielm я могу установить рабочий буфер (C-c C-b) в качестве буфера, в котором у меня есть текст для манипулирования, например, *scratch*.

Затем я могу выбрать область рабочего буфера для обработки, а в буфере ielm я могу набрать и выполнить код elisp для извлечения текста в выбранной области в рабочем буфере, например,

ELISP> (setq grabbed (buffer-substring-no-properties (region-beginning) (region-end)))
"One\nTwo\nThre"
ELISP> grabbed
"One\nTwo\nThre"
ELISP> (split-string grabbed)
("One" "Two" "Thre")

Затем я могу работать со значением, содержащимся в переменной set, grabbed.

Вот очень полезное описание ielm: https://www.masteringemacs.org/article/evaluating-elisp-emacs

0 голосов
/ 21 декабря 2018

Если вы хотите запустить функцию из некоторого кода Elisp, но, как если бы пользователь вызывал ее через связывание клавиш, вы можете использовать call-interactively:

(setq variable-to-keep-the-value (call-interactively 'lines-to-list))

Но в большинстве случаев вам нужновместо этого стоит взять на себя ответственность за выбор части текста, к которой должна применяться функция:

(setq variable-to-keep-the-value 
      (lines-to-list (region-beginning) (region-end)))

Обратите внимание, что границы региона не являются чем-то магическим, независимо от того, были ли они установлены мышью или чем-то еще.

...