Заменить один пробел на два после предложений в Emacs

У меня есть документ с абзацами, где некоторые предложения заканчиваются точкой и одним пробелом (". Nextline")в то время как другие заканчиваются точкой и двумя пробелами (". Nextline"), Я хочу заменить точку замены и один пробел на точку и два пробела, но без увеличения существующей точки и двух пробелов до точки и трех пробелов.

Предложения абзаца не заканчиваются символом новой строки или "\n", кроме последнего. В конце абзаца будет символ новой строки. Я хочу начать каждое предложение с 2 пробелов, ни 1, ни 3 или больше. Если я использую поиск и замену из меню, предложения, начинающиеся с 2 пробелов, увеличиваются до 3 пробелов в начале.

Как я могу это сделать? Я попытался следовать, но это увеличивает два пробела до трех:

(defun space12 ()
    (interactive)
    (while (re-search-forward "\\. ?" nil t)
        (replace-match ".  ")))

Где проблема и как я могу ее исправить.

Пример ввода текста:

This is first sentence (I called it line earlier). This sentence has one space at start.  This has two. And this again has one space at start.

2 ответа

Решение

Ты можешь использовать C-M-% (M-x query-replace-regexp) со строкой поиска \. \([^ ]\) и замена строки . \1,

Когда вы хотите поставить \ в строке помните, что вы должны избежать его с другим \, Например:

(defun space12 ()
  (interactive)
  (while (re-search-forward "\\. \\([^ ]\\)" nil t)
    (replace-match ".  \\1" t)))

Чтобы получить "хорошее поведение", я бы сделал так, чтобы он всегда обрабатывал весь буфер и возвращался в исходное положение после:

(defun space12 ()
  (interactive)
  (save-excursion
    (goto-char (point-min))
    (while (re-search-forward "\\. \\([^ ]\\)" nil t)
      (replace-match ".  \\1" t))))

Есть repunctuate-sentences:

      Put two spaces at the end of sentences from point to the end of buffer.

It works using query-replace-regexp.
If optional argument NO-QUERY is non-nil, make changes without asking for confirmation.

Это довольно просто, просто используя query-replace-regexpс регулярным выражением: \\([]\"')]?\\)\\([.?!]\\)\\([]\"')]?\\) +, но у вас есть возможность решить для каждого по очереди, если хотите, что полезно для ложных срабатываний (например, «ie»).

Другие вопросы по тегам