在Emacs中,我有时想要删除或复制一个矩形文本,例如:
XX first line
XX second line is longer
XX 3rd line short
我想复制三条线,每条线上没有前导“XX”。但是,不可能标记所需矩形的两个角,因为第一行和第三行没有到达我所追求的矩形的右边缘。那么如何在没有emacs中的前导“XX”的情况下复制上面的三行?
答案 0 :(得分:5)
从第一行开始标记矩形,当您在3d行的末尾时,只需键入空格,直到该行足够长。这就是我通常做的事情。
复制后,您可以输入M-\
(delete-horizontal-space
)以删除添加的空格。
答案 1 :(得分:4)
我看到两个跳出来的选项。
第一种是使用 M-x artist-mode , 这将让您移动到您想要的第一行/最后一行的位置。 此时你切割矩形 C-x r k ,然后粘贴 它在任何你想要的地方。不要忘记输入 C-c C-c 退出artist mode。
第二种是使用常规 C-w 切割所有三行
然后在粘贴时,删除行开头的XX
s矩形。
答案 2 :(得分:3)
您可以查看cua-selection-mode(M-x cua-selection-mode)。
它允许您执行您想要的操作,但仅限于图形化emacs(不在终端中)。键绑定有点不同:您使用C-RET(而不是C-SPC)启动区域,并使用C-w / C-y(不使用矩形命令)切割/拉动矩形。
您可以在this blog中找到一个示例。
要永久启用该模式,只需添加
(cua-selection-mode t)
到您的.emacs。
P.S。完整的cua模式也将改变进一步的键绑定。没有必要使用它。
答案 3 :(得分:0)
inbulit defuns的简单修改。 kill-right-rectangle
函数可以满足您的需求。
我相信会有更好的方法来做到这一点。尽管如此,它还是有效的。
关于以下代码的两点
- 由于想法是将文本放到行尾,您甚至不需要指定最后一列。只需在第一行标记(在您的示例中指向“f”)并向下到第三行以“3”调用该函数。 (我们只需要一列,所以不需要将光标移动到任何右侧)
- 如果缓冲区是只读的,则不起作用。它只是没有实现。
(defun end-column (POINT)
"returns end column"
(save-excursion
(goto-char POINT)
(move-end-of-line 1)
(current-column)))
(defun apply-on-right-rectangle (function start end &rest args)
(let (startcol startpt endcol endpt final-point)
(save-excursion
(goto-char start)
(setq startcol (current-column))
(beginning-of-line)
(setq startpt (point))
(goto-char end)
(setq endcol (current-column))
(forward-line 1)
(setq endpt (point-marker))
;; ensure the start column is the left one.
(if (< endcol startcol)
(let ((col startcol))
(setq startcol endcol endcol col)))
;; start looping over lines
(goto-char startpt)
(while (< (point) endpt)
(setq endcol (end-column (point)))
(apply function startcol endcol args)
(setq final-point (point))
(forward-line 1)))
final-point))
(defun delete-extract-right-rectangle (start end &optional fill)
(let ((lines (list nil)))
(apply-on-right-rectangle 'delete-extract-rectangle-line start end lines fill)
(nreverse (cdr lines))))
(defun kill-right-rectangle (start end &optional fill)
(interactive "r\nP")
(condition-case nil
(setq killed-rectangle (delete-extract-right-rectangle start end fill))
((buffer-read-only text-read-only)
(setq killed-rectangle (extract-rectangle start end))
(if kill-read-only-ok
(progn (message "Read only text copied to kill ring") nil)
(barf-if-buffer-read-only)
(signal 'text-read-only (list (current-buffer)))))))