Emacs:从自定义函数中调用 cua-mode cua-set-rectangle-mark

Emacs: Calling cua-mode cua-set-rectangle-mark from within custom function

目前我将 cua-mode 用于它的 column/rectangle 设施,就像这样(我没有将它用于 copy/pasting):

M-x cua-mode ; Enable cua-mode
<C-return>   ; Call cua-set-rectangle-mark

然后当我完成我的矩形时:

C-g          ; Call cua-cancel

CUA 模式的绑定与其他模式的绑定(例如在 org 模式中)发生冲突,因此我有时发现自己不得不转换 cua 模式 on/off。我只将它用于它的矩形 - 所以我想通过做两件事来解决这个麻烦:

1) 将一个键(例如 f6)绑定到启用 cua 模式(如果尚未启用)的函数,并调用 cua-set-rectangle-mark 以便我可以创建我的矩形。

2) 在 cua-mode 处于活动状态时覆盖 C-g,以便在按下时不仅退出任何矩形,而且还会退出 cua-mode。

那么我的工作流程将是:

<f6> ; Enter cua-mode and call cua-set-rectangle-mark
C-g  ; Call cua-cancel and disable cua-mode

这样我就不需要在发生冲突时不断切换 cua-mode on/off。

对于第 1 部分,我提出了:

(defun cua-activate-plus-set-rectangle-mark()
 (interactive)
 (cua-set-rectangle-mark))

(global-set-key (kbd "<f6>") 'cua-activate-plus-set-rectangle-mark)

当 cua-mode 已经启用时按 f6 有效,但当 cua-mode 未启用时按 f6 无效。如果我把它改成这样:

(defun cua-activate-plus-set-rectangle-mark()
 (interactive)
 (cua-mode)
 (cua-set-rectangle-mark))

那么无论我是否启用了 cua 模式,它都根本不起作用。

对于第 2 部分,我有:

(defun cua-mode-off()
 "Cancels any open active region/rectangle and turns CUA mode off"
 (interactive)
 (cua-cancel)
 (setq cua-mode nil))

该函数完全符合我的要求,但我不知道如何在启用 cua-mode 时将它绑定到 C-g。

所以我的问题是:

1) 如何编写进入 cua-mode 的函数并调用 cua-set-rectangle-mark 使其按预期工作?

2) 如何仅在 cua-mode 激活时覆盖 C-g 以调用我的自定义函数?

我认为您正在寻找的行为已经存在。看看cua-rectangle-mark-mode。来自 the manual:

CUA mode provides enhanced rectangle support with visible rectangle highlighting. Use C-RET to start a rectangle, extend it using the movement commands, and cut or copy it using C-x or C-c. RET moves the cursor to the next (clockwise) corner of the rectangle, so you can easily expand it in any direction. Normal text you type is inserted to the left or right of each line in the rectangle (on the same side as the cursor).

You can use this rectangle support without activating CUA by calling the cua-rectangle-mark-mode command. But see also the standard rectangle-mark-mode. See Rectangles.