Emacs: добавление 1 к каждому номеру из 2 цифр внутри отмеченной области
Представьте, что в текстовом файле, открытом в Emacs, есть следующее:
some 34
word 30
another 38
thing 59
to 39
say 10
here 47
и я хочу включить это, добавив 1 к каждому номеру из 2-х цифр:
some 35
word 31
another 39
thing 60
to 40
say 11
here 48
(это краткий пример, моя настоящая потребность в гораздо большем списке, а не на моем вызове)
Как я могу сделать это из Emacs?
Я не против вызывать внешнюю магию Perl/sed/whatever, пока вызов выполняется непосредственно из Emacs и работает только в отмеченной области, которую я хочу.
Как бы вы автоматизировали это из Emacs?
Я думаю, что ответ, о котором я думаю, состоит в вызове shell-command-on-region и замене области на выход... Но я не уверен, как конкретно это сделать.
Ответы
Ответ 1
Это можно решить, используя команду query-replace-regexp (привязанная к C-M-%):
C-M-%
\b[0-9][0-9]\b
return
\,(1+ \#&)
Выражение, которое следует за \,
, будет оцениваться как выражение Lisp, результат которого используется как строка замены. В выражении Lisp, \#&
будет заменен на соответствие строке, интерпретируемой как число.
По умолчанию это работает со всем документом, начиная с курсора. Чтобы иметь эту работу в регионе, есть несколько возможностей:
- Если включен режим переходных меток, вам просто нужно выбрать регион обычно (используя точку и отметку);
- Если по какой-то причине вам не нравится режим переходных меток, вы можете использовать узкую область для ограничения изменений в определенном регионе: выберите область с использованием точки и метки, C-x n n, чтобы сузить, выполнить query-replace-regexp, как описано выше, и, наконец, C-x n w для расширения. (Спасибо Джастину Смиту за этот намек.)
- Используйте мышь, чтобы выбрать регион.
Подробнее см. в разделе Regexp Replacement руководства Emacs.
Ответ 2
Emacs режим редактирования столбцов - это то, что вам нужно.
-
Активируйте его ввод M-x cua-mode.
-
Перейдите к началу прямоугольника (оставьте курсор на символе 3
) и нажмите C-RET.
-
Перейдите в конец прямоугольника (оставьте курсор на символе 7
). Вы будете работать в выделенной области.
-
Теперь нажмите M-i, который увеличивает все значения в регионе.
Вы закончили! удалить мертвые ссылки ImageShack
Ответ 3
Он не защищает от 99- > 100.
(defun add-1-to-2-digits (b e)
"add 1 to every 2 digit number in the region"
(interactive "r")
(goto-char b)
(while (re-search-forward "\\b[0-9][0-9]\\b" e t)
(replace-match (number-to-string (+ 1 (string-to-int (match-string 0)))))))
О, и он работает в регионе. Если вы хотите весь файл, то вы заменяете b
и e
на (point-min)
и nil
.
Ответ 4
умеренно протестировано; используйте M-:
и выполните следующую команду:
(while (re-search-forward "\\<[0-9][0-9]\\>" nil t) (let ((x (match-string 0))) (delete-backward-char 2) (insert (format "%d" (1+ (string-to-int x))))))
Ответ 5
Мне удалось заставить его работать по-другому, используя следующее (мой awk-fu не силен, поэтому, вероятно, это можно сделать проще):
C-u M-x shell-command-on-region RET awk '$2>=0&&$2<=99 {$2++} {print}' RET
но я потерял свой отступ в процессе:)
Увидев все эти ответы, я не могу не уважать Emacs...