Как заставить Emacs развернуть блок кода? - PullRequest
4 голосов
/ 16 сентября 2008

Скажем, у меня есть строка в буфере Emacs, которая выглядит следующим образом:

foo -option1 value1 -option2 value2 -option3 value3 \
    -option4 value4 ...

Я хочу, чтобы это выглядело так:

foo -option1 value1 \
    -option2 value2 \
    -option3 value3 \
    -option4 value4 \
    ...

Я хочу, чтобы каждая пара опция / значение находилась на отдельной строке. Я также хочу, чтобы эти последующие строки с соответствующим отступом соответствовали режиму, а не добавляли фиксированное количество пробелов. Я бы предпочел, чтобы код работал с текущим блоком, останавливаясь на первой непустой строке или строке, которая не содержит пару опция / значение, хотя я мог бы согласиться, чтобы она работала в выбранной области.

Кто-нибудь знает функцию elisp для этого?

Ответы [ 4 ]

2 голосов
/ 17 сентября 2008

Ни у кого не было того, что я искал, поэтому я решил стряхнуть с себя руководство по elisp и сделать это сам. Кажется, это работает достаточно хорошо, хотя вывод не совсем то, что я просил. В этой версии первый вариант идет в строке сам по себе, а не в первой строке, как в моем первоначальном вопросе.

(defun tcl-multiline-options ()
  "spread option/value pairs across multiple lines with continuation characters"
  (interactive)
  (save-excursion
    (tcl-join-continuations)
    (beginning-of-line)
    (while (re-search-forward " -[^ ]+ +"  (line-end-position) t)
      (goto-char (match-beginning 0))
      (insert " \\\n")
      (goto-char (+(match-end 0) 3))
      (indent-according-to-mode)
      (forward-sexp))))

(defun tcl-join-continuations ()
  "join multiple continuation lines into a single physical line"
  (interactive)
  (while (progn (end-of-line) (char-equal (char-before) ?\\))
    (forward-line 1))
  (while (save-excursion (end-of-line 0) (char-equal (char-before) ?\\))
    (end-of-line 0)
    (delete-char -1)
    (delete-char 1)
    (fixup-whitespace)))
1 голос
/ 16 сентября 2008

В этом случае я бы использовал макрос. Вы можете начать запись макроса с помощью C-x (и прекратить запись его с помощью C-x). Когда вы хотите воспроизвести макрос типа C-x e.

В этом случае я бы набрал: C-a C-x (C-s v a lu e C-f C-f \ RET SPC SPC SPC SPC C-x)

Это записало бы макрос, который ищет «значение», перемещается вперед 2, вставляет косую черту и символ новой строки и, наконец, переводит новую строку в строку. Тогда вы можете повторить этот макрос несколько раз.

РЕДАКТИРОВАТЬ: я только что понял, ваш буквальный текст может быть не так легко для поиска, как "значение1". Вы также можете искать пробелы и циклически проходить по хитам. Например, нажав C-s несколько раз после первого матча, чтобы пропустить некоторые матчи.

Примечание: так как ваш пример "ad-hoc", это решение тоже будет. Часто вы используете макросы, когда вам нужно специальное решение. Один из способов обеспечить более последовательное применение макроса - поместить исходный оператор в одну строку (это также можно сделать с помощью макроса или вручную).

РЕДАКТИРОВАТЬ: Спасибо за комментарий о (по сравнению с C- (, вы были правы, моя ошибка!

0 голосов
/ 16 сентября 2008

Ваш режим может уже поддерживать это. В режиме C и режиме Makefile, по крайней мере, M-q (fill-абзац) будет вставлять продолжения строк в fill-column и переносить строки.

В каком режиме вы редактируете это?

0 голосов
/ 16 сентября 2008

Лично я все время делаю такие вещи.

Но я не пишу функцию, чтобы сделать это, если я не буду делать это каждый день в течение года.

Вы можете легко сделать это с помощью метода query-replace, например:

m-x (запрос-замена "-option" "^ Q ^ J -option")

Я говорю ^ Q ^ J, потому что это то, что вы напечатаете, чтобы заключить новую строку в кавычки и вставить ее в строка.

Затем просто нажмите «y», чтобы заменить строки, и «n», чтобы пропустить странную строку. угловые футляры, которые вы найдете.

Другая рабочая лошадка - это query-replace-regexp, которая может замены регулярных выражений.

, а также grep-query-replace, который будет выполнять запрос-замену при разборе вывод команды grep. Это полезно, потому что вы можете искать для "foo" в 100 файлах, тогда выполняйте запрос-замену в каждом случае переход от файла к файлу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...