как свернуть пробелы в регионе? - PullRequest
12 голосов
/ 30 декабря 2011

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

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

Ответы [ 4 ]

14 голосов
/ 30 декабря 2011

Эта функция должна помочь:

(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))
12 голосов
/ 30 декабря 2011

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

 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 голосов
/ 30 декабря 2011

Вы можете справиться со своими требованиями к прямоугольнику, используя средства редактирования прямоугольников cua-mode *.

  1. Mx cua-selection-mode RET или (cua-selection-mode 1)
    (сам, у меня это включено постоянно).

  2. Отметьте прямоугольник, в котором вы хотите свернуть пробел, используя C-RET инормальное движение клавиш.

  3. Вызов cua-replace-in-rectangle:
    Mr \s-+ RET SPC RET

  4. C-RET снова для завершения редактирования прямоугольника.

(*) Это выиграноне будет работать, если вам нужно, чтобы поля справа от прямоугольника оставались выровненными, так как в этом случае вам нужно будет вставить новые пробелы, чтобы компенсировать те, которые были удалены.Вы можете использовать 2C-split и 2C-merge или просто убить / восстановить самый правый прямоугольник, чтобы обойти это.

0 голосов
/ 30 декабря 2011

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

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

...