如果第一行和最后一行不够长,如何在Emacs中删除文本的矩形?

如果第一行和最后一行不够长,如何在Emacs中删除文本的矩形?,emacs,Emacs,在Emacs中,我有时想删除或复制一个矩形文本,例如: XX first line XX second line is longer XX 3rd line short 我想复制三行,每行不带前导“XX”。但是,不可能标记所需矩形的两个角,因为第一行和第三行没有到达我要搜索的矩形的右边缘。那么,如果没有emacs中的前导“XX”,我如何复制上面的三行呢?从第一行开始标记矩形,当您位于三维行的末尾时,只需键入空格,直到行足够长。那是我通常做的事 复制后,您可以键入M-\(delete horiz

在Emacs中,我有时想删除或复制一个矩形文本,例如:

XX first line
XX second line is longer
XX 3rd line short

我想复制三行,每行不带前导“XX”。但是,不可能标记所需矩形的两个角,因为第一行和第三行没有到达我要搜索的矩形的右边缘。那么,如果没有emacs中的前导“XX”,我如何复制上面的三行呢?

从第一行开始标记矩形,当您位于三维行的末尾时,只需键入空格,直到行足够长。那是我通常做的事


复制后,您可以键入
M-\
delete horizontal space
)删除添加的空格。

我看到两个跳出的选项

第一种是使用M-x艺术家模式, 这将使您移动到第一行/最后一行上所需的位置。 在该点剪切矩形C-x r k,然后粘贴 你想去哪里就去哪里。别忘了键入C-C-C退出

第二种方法是使用常规C-w切割所有三条线
然后在粘贴时,删除行开头的矩形
XX
s。

对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)))))))
(定义结束列(点)
“返回结束列”
(省去远足
(转到字符点)
(移动第1行的末尾)
(当前列)))
(在右矩形上取消应用(函数开始结束和休息参数)
(let(startcol startpt endcol endpt终点)
(省去远足
(转到字符开始)
(setq startcol(当前列))
(行首)
(setq startpt(点))
(转到字符结束)
(setq endcol(当前列))
(前线1)
(setq endpt(点标记))
;确保起始列为左侧。
(如果(
您可以查看(M-x cua选择模式)

它允许您做您想做的事情,但只能在图形化的emacs中(而不是在终端中)。键绑定有点不同:使用C-RET(而不是C-SPC)启动区域,并使用C-w/C-y(不使用矩形命令)简单地剪切/拉伸矩形

你可以在中找到一个例子

要永久启用该模式,只需添加

(cua-selection-mode t)
给你的.emacs


另外,完整cua模式还将进一步更改密钥绑定。不需要使用它。

您不需要进入
艺术家模式
即可使用
C-x r k
。只需标记所需矩形的左上角和右下角。至于扩展到第三行,请点击空格键。@jeremiahd-使用
艺术家模式
是按空格键的替代方法,您只需使用移动绑定。是的,我知道。我只是指出问题中要求的行为不需要空格。@jeremiahd是的,按空格(你的答案)也不需要,这就是为什么我们有两个不同的答案。你会注意到,我的答案并不要求用户删除水平空白;在这种情况下,矩形选择有点尴尬,但如果从左上角开始,移动到最长一行的末尾,然后向下移动到最后一行,就可以了。如果“删除选择模式”处于启用状态,则在标记矩形的开头后按C-g。这将取消高亮显示,但标记将保持活动状态,因此后续步骤将按说明进行。是的,您是对的,标记将保持活动状态,因此取消选择仍将有效。您不能总是这样做(例如,当缓冲区为只读时)。不过,看起来将采用
矩形标记模式。