Как свернуть пробелы в регионе?

Скажем, у меня есть этот табличный текстовый файл:

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 не возникают естественным образом. Я искал что-то вроде delete-whitespace-rectangle, но это не делает то, что я ожидаю, или я злоупотребляю им. Также желательно иметь возможность делать это для столбца, т.е.

field1        variable_length_field variable_length_field
aaaaaa        aaaa aaaaaaaaa
bbbbbb        bbbbbbbbbbbbbbbbbbbb bbbb

Ответ 1

Эта функция должна выполнить трюк:

(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))

Ответ 2

Не отвечаю на ваш вопрос, но есть

 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]

который полезен, когда вы хотите удалить пробелы в одном случае. Он может быть подходящим для случая макросов, где удаления являются случайными строками без фиксированного шаблона.

Ответ 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 или просто убить/вытащить правый прямоугольник, чтобы обойти это.

Ответ 4

Используете ли вы IDE? Если вы используете что-то вроде Eclipse, тогда вы можете форматировать в нем параметры пробелов. (В Eclipse нажмите CTRL + 3 и найдите "formatter". Я извиняюсь за то, что не помню точный путь!) Затем вы должны иметь возможность выделить все и нажать ctrl + shift + G для автоматического форматирования всего.

Сообщите нам, если это поможет! (Или, если вы хотите использовать код раскрутки, который сделает это, дайте нам знать язык.)