Emacs: добавление 1 к каждому номеру из 2 цифр внутри отмеченной области

Как будто вы пытаетесь получить доступ к объекту, который является null. Рассмотрим ниже пример:

TypeA objA;

. В это время вы только что объявили этот объект, но не инициализировали или не инициализировали. И всякий раз, когда вы пытаетесь получить доступ к каким-либо свойствам или методам в нем, он будет генерировать NullPointerException, что имеет смысл.

См. Также этот пример:

String a = null;
System.out.println(a.toString()); // NullPointerException will be thrown
25
задан SyntaxT3rr0r 21 April 2010 в 21:18
поделиться

5 ответов

Эту проблему можно решить с помощью команды query-replace-regexp (привязан к CM -% ) :

CM -% \ b [0-9] [0-9] \ b return \, (1+ \ # &)

Выражение, следующее за \, будет оцениваться как выражение Лиспа, результат которого используется как строка замены. В выражении Лиспа \ # & будет заменено совпавшей строкой, интерпретируемой как число.

По умолчанию это работает для всего документа, начиная с курсора. Чтобы эта работа работала с регионом, есть несколько возможностей:

  1. Если transient-mark-mode включен, вам просто нужно выбрать регион обычным образом (с помощью точки и метки);
  2. Если по какой-то причине вам не нравится transient-mark-mode , вы можете использовать сужение до области , чтобы ограничить изменения определенной областью: выберите область с помощью точки и mark, Cx nn , чтобы сузить, выполнить query-replace-regexp , как описано выше, и, наконец, Cx nw , чтобы расширить. (Спасибо Джастину Смиту за этот совет.)
  3. Используйте мышь, чтобы выбрать регион.

См. Раздел Regexp Replacement Руководства по Emacs для более подробной информации.

44
ответ дан 28 November 2019 в 18:21
поделиться

Он не защищает от 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 на (точка-мин) и nil .

6
ответ дан 28 November 2019 в 18:21
поделиться

Мне удалось заставить его работать по-другому, используя следующее (мой awk -fu не является сильным, поэтому он, вероятно, может можно сделать более простым способом):

C-u M-x shell-command-on-region RET awk '$2>=0&&$2<=99 {$2++} {print}' RET

но я потерял отступ в процессе :)

Видя все эти ответы, я не могу не испытывать большого уважения к Emacs ...

{{ 1}}
0
ответ дан 28 November 2019 в 18:21
поделиться

Умеренно протестировано; используйте 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))))))
1
ответ дан 28 November 2019 в 18:21
поделиться

Emacs ' режим редактирования столбца - это то, что вам нужно.

  • Активируйте его, набрав M-x cua-mode .

  • Перейдите в начало прямоугольника (оставьте курсор на символе 3 ) и нажмите C-RET .

  • Перейти в конец прямоугольника (оставьте курсор на символе 7 ). Вы будете работать в выделенной области.

  • Теперь нажмите M-i , что увеличивает все значения в регионе.

Готово.! удалить мертвые ссылки ImageShack

12
ответ дан 28 November 2019 в 18:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: