如果第一行和最后一行不够长,如何在Emacs中删除文本的矩形?
在Emacs中,我有时想删除或复制一个矩形文本,例如:如果第一行和最后一行不够长,如何在Emacs中删除文本的矩形?,emacs,Emacs,在Emacs中,我有时想删除或复制一个矩形文本,例如: XX first line XX second line is longer XX 3rd line short 我想复制三行,每行不带前导“XX”。但是,不可能标记所需矩形的两个角,因为第一行和第三行没有到达我要搜索的矩形的右边缘。那么,如果没有emacs中的前导“XX”,我如何复制上面的三行呢?从第一行开始标记矩形,当您位于三维行的末尾时,只需键入空格,直到行足够长。那是我通常做的事 复制后,您可以键入M-\(delete horiz
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。这将取消高亮显示,但标记将保持活动状态,因此后续步骤将按说明进行。是的,您是对的,标记将保持活动状态,因此取消选择仍将有效。您不能总是这样做(例如,当缓冲区为只读时)。不过,看起来将采用矩形标记模式。