如何折叠一个地区的空白?

时间:2011-12-30 00:00:56

标签: emacs whitespace

假设我有这个列表文本文件:

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

5 个答案:

答案 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的矩形编辑工具来处理矩形要求。

  1. M-x cua-selection-mode RET (cua-selection-mode 1)
    (我自己,我已永久启用此功能)。

  2. 使用 C-RET 和正常移动键标记要在其中折叠空白的矩形。

  3. 致电cua-replace-in-rectangle
    M-r \s-+ RET SPC RET

  4. 再次
  5. C-RET 结束矩形编辑。

  6. (*)如果你需要矩形右边的字段保持对齐,这将不起作用,因为在这种情况下你需要插入新的空格来补偿被删除的空格。你可以使用2C-split2C-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 回车 !

将用指定矩形内的单个空格替换所有连续的空格实例


长版:

  1. 选择要编辑的区域

    • 您可以按住 C-M,然后使用 mouse-1 单击并拖动以选择一个矩形。 (不适用于我的 emacs 版本,但在 official docs. 中提到)

    • 或者把你想要矩形开始的点,按Cx SPC输入rectangle-mark-mode,然后移动光标使突出显示您想要的区域

  2. 使用 replace-regexp

    去除多余的空格
    • 点击 C-M-% 激活 replace-regexp,它现在应该会提示您输入要搜索的模式
    • 输入 \s-+ 作为搜索模式,然后按 Enter(匹配一个或多个空白字符)
    • 输入你想用什么来替换空格,在这种情况下,你可以通过点击SPC然后Enter
    • 来使用一个空格
  3. 执行替换

    • 现在应该突出显示所有要替换的空格
    • 点击 ! 一次替换它们
    • 或者你可以通过点击 ySPC 来一个一个地替换它们