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

时间:2011-12-07 04:31:11

标签: emacs

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

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

我想复制三条线,每条线上没有前导“XX”。但是,不可能标记所需矩形的两个角,因为第一行和第三行没有到达我所追求的矩形的右边缘。那么如何在没有emacs中的前导“XX”的情况下复制上面的三行?

4 个答案:

答案 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)))))))