假设我有这个列表文本文件:
field1 variable_length_field variable_length_field
aaaaaa aaaa aaaaaaaaa
bbbbbb bbbbbbbbbbbbbbbbbbbb bbbb
如何将其转换为:
field1 variable_length_field variable_length_field
aaaaaa aaaa aaaaaaaaa
bbbbbb bbbbbbbbbbbbbbbbbbbb bbbb
我知道我可以在该区域使用replace-regexp
,但Emacs regexp并不是自然而然的。我正在寻找像delete-whitespace-rectangle
这样的东西,但这不符合我的期望,或者我在滥用它。能够按列进行此操作也是可取的,即:
field1 variable_length_field variable_length_field
aaaaaa aaaa aaaaaaaaa
bbbbbb bbbbbbbbbbbbbbbbbbbb bbbb
答案 0 :(得分:14)
这个功能可以解决问题:
(defun just-one-space-in-region (beg end)
"replace all whitespace in the region with single spaces"
(interactive "r")
(save-excursion
(save-restriction
(narrow-to-region beg end)
(goto-char (point-min))
(while (re-search-forward "\\s-+" nil t)
(replace-match " ")))))
并且,由于问题已更新以应用于矩形中的空格,请尝试以下操作:
(require 'rect)
(defun just-one-space-in-rect-line (start end)
(save-restriction
(save-match-data
(narrow-to-region (+ (point) start)
(+ (point) end))
(while (re-search-forward "\\s-+" nil t)
(replace-match " ")))))
(defun just-one-space-in-rect (start end)
"replace all whitespace in the rectangle with single spaces"
(interactive "r")
(apply-on-rectangle 'just-one-space-in-rect-line start end))
答案 1 :(得分:12)
没有真正回答你的问题,但有
M-SPC runs the command just-one-space, which is an interactive
compiled Lisp function in `simple.el'.
It is bound to M-SPC.
(just-one-space &optional N)
Delete all spaces and tabs around point, leaving one space (or N spaces).
[back]
当你想在一个关闭案例中删除空格时很有用。它可能适用于宏的情况,其中删除是在没有固定模式的随机行。
答案 2 :(得分:3)
您可以使用cua-mode的矩形编辑工具来处理矩形要求。
M-x cua-selection-mode
RET 或(cua-selection-mode 1)
(我自己,我已永久启用此功能)。
使用 C-RET 和正常移动键标记要在其中折叠空白的矩形。
致电cua-replace-in-rectangle
:
M-r \s-+
RET SPC RET
C-RET 结束矩形编辑。
(*)如果你需要矩形右边的字段保持对齐,这将不起作用,因为在这种情况下你需要插入新的空格来补偿被删除的空格。你可以使用2C-split
和2C-merge
,或者只是杀死/抽出最右边的矩形来解决这个问题。
答案 3 :(得分:0)
您使用的是IDE吗?如果您正在使用Eclipse之类的东西,那么您可以在其中格式化空白选项。 (在Eclipse中,按CTRL + 3并搜索'formatter'。我为不记住确切路径而道歉!)然后,您应该能够突出显示所有内容并按ctrl + shift + G自动=格式化所有内容。
如果有帮助,请告诉我们! (或者,如果您想要执行此操作的代码,请告诉我们该语言。)
答案 4 :(得分:0)
如果您不想使用 cua-selection-mode
,您可以使用 rectangle-mark-mode
或鼠标选择一个矩形,然后进行空白替换。
简短版本:
Cx SPC选择区域,然后CM-% \s-+
回车 SPC 回车 !
将用指定矩形内的单个空格替换所有连续的空格实例
长版:
选择要编辑的区域
您可以按住 C-M,然后使用 mouse-1 单击并拖动以选择一个矩形。 (不适用于我的 emacs 版本,但在 official docs. 中提到)
或者把你想要矩形开始的点,按Cx SPC输入rectangle-mark-mode
,然后移动光标使突出显示您想要的区域
使用 replace-regexp
replace-regexp
,它现在应该会提示您输入要搜索的模式\s-+
作为搜索模式,然后按 Enter(匹配一个或多个空白字符)执行替换