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

Программный выбор региона

Я хочу выполнить одно и то же действие, которое вы делаете, нажимая C-Space +, перемещая клавиши со стрелками, но в elisp.

Невозможно найти правильную функцию (если они просто были логически сгруппированы в пространствах имен или как-то помечены...). Кто из них?

4b9b3361

Ответ 1

Вы можете перевести нажатия клавиш в elisp, используя C-h k key.

Вы заметите функцию elisp для установки метки set-mark-command, принимает один необязательный аргумент. Emacs использует специальную функцию interactive, позволяющую естественным образом писать функции elisp с аргументами. Это позволяет им быть универсальным и простым в повторном использовании в других программах elisp, но все же можно вызвать непосредственно из нажатия клавиши. Он также имеет встроенную встроенную префиксную логику C-u.

В случае set-mark-command его первой функцией является (interactive "P"), что означает, что префикс передается в качестве аргумента при вызове с клавиатуры. Вы можете имитировать это непосредственно в elisp с помощью:

(set-mark-command nil)

Например, чтобы выбрать текущую строку в elisp:

(defun my-select-current-line ()
  (interactive)
  (move-beginning-of-line nil)
  (set-mark-command nil)
  (move-end-of-line nil)
  (setq deactivate-mark nil))

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

Ответ 2

Вы должны использовать push-mark в коде emacs lisp, как показано ниже:

(defun mark-n (n)
  "Programmtically mark the next N lines"   
  (interactive "nNum lines to mark: ")
  (push-mark)  
  (next-line n))

Ответ 3

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

  • Что касается программного перемещения, см. Перемещение точки
  • (point) и (mark) получить их соответствующие позиции, поэтому можно сделать (set-mark (+ 5 (mark))), например.

Ответ 4

Область является частью буфера между point и mark.