【发布时间】:2012-07-27 14:32:43
【问题描述】:
我想通过点击C-Space + 移动箭头键执行相同的操作,但在 elisp 中。
未能找到正确的函数(如果它们只是按逻辑分组在命名空间中或以某种方式标记...)。是哪一个?
【问题讨论】:
我想通过点击C-Space + 移动箭头键执行相同的操作,但在 elisp 中。
未能找到正确的函数(如果它们只是按逻辑分组在命名空间中或以某种方式标记...)。是哪一个?
【问题讨论】:
您可以使用 C-h k key 将击键转换为 elisp。
您会注意到用于设置标记set-mark-command 的 elisp 函数采用一个非可选参数。 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 在最后保持标记处于活动状态,否则该区域将不会保持突出显示(尽管点和标记将是您离开它们的位置)。
【讨论】:
(set-mark-command 0),点会移动但标记不会移动,因此不会选择任何内容。我错过了什么?谢谢。
nil 而不是零。我已经用一个例子更新了我的答案。
deactivate-mark 似乎没有什么不同。无论如何,对我的特定目的来说并不重要。
(interactive) 将其定义为交互式命令并使用M-x command-name 调用它或将其绑定到某个键时,视觉反馈才会起作用。
你应该在emacs lisp代码中使用push-mark,如下:
(defun mark-n (n)
"Programmtically mark the next N lines"
(interactive "nNum lines to mark: ")
(push-mark)
(next-line n))
【讨论】:
以防万一此附加信息对其他人有用,我发现以下内容:
(point) 和 (mark) 检索它们各自的位置,例如,可以使用 (set-mark (+ 5 (mark)))。【讨论】:
区域是point 和mark 之间的缓冲区部分。
【讨论】:
set-mark。但是它的 POS 参数的预期类型是什么?