Заменить один пробел на два после предложений в 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»).