Как зайти в Даркнет?!
25th January, 01:11
6
0
Как в tkinter из поля ввода Entry получить значение в одну переменную и обновить строку кнопкой, затем получить ещё одно введённое значение и затем сложить их. Ниже пример кода
21st July, 19:00
894
0
Программа, которая создает фейковые сервера в поиске игровых серверов CS 1.6 Steam
21st March, 17:43
948
0
Очень долго работает Update запрос Oracle
27th January, 09:58
914
0
не могу запустить сервер на tomcat HTTP Status 404 – Not Found
21st January, 18:02
905
0
Где можно найти фрилансера для выполнения поступающих задач, на постоянной основе?
2nd December, 09:48
938
0
Разработка мобильной кроссплатформенной военной игры
16th July, 17:57
1724
0
период по дням
25th October, 10:44
3955
0
Пишу скрипты для BAS только на запросах
16th September, 02:42
3720
0
Некорректный скрипт для закрытия блока
14th April, 18:33
4613
0
прокидывать exception в блоках try-catch JAVA
11th March, 21:11
4381
0
Помогите пожалуйста решить задачи
24th November, 23:53
6086
0
Не понимаю почему не открывается детальное описание продукта
11th November, 11:51
4350
0
Нужно решить задачу по программированию на массивы
27th October, 18:01
4396
0
Метода Крамера С++
23rd October, 11:55
4309
0
помогите решить задачу на C++
22nd October, 17:31
4002
0
Помогите решить задачу на python с codeforces
22nd October, 11:11
4492
0
Python с нуля: полное руководство для начинающих
18th June, 13:58
2599
0
Красивая печать XML файлов на Emacs
Я использую emacs для редактирования моих xml файлов (nxml-mode), и файлы были сгенерированы машиной не имеют никакого красивого форматирования тегов.
Я искал довольно красивую печать всего файла с отступом и сохранением его, но не смог найти автоматический способ.
Есть ли какой-то выход? Или хотя бы какой-нибудь редактор на linux, который может это сделать.
Вам даже не нужно писать свою собственную функцию-sgml-mode (модуль ядра gnu emacs) имеет встроенную красивую функцию печати под названием (sgml-pretty-print ...) который принимает аргументы начала и конца области.
Если вы режете и вставляете xml, и вы обнаруживаете, что ваш terminal рубит линии в произвольных местах, вы можете использовать этот симпатичный принтер , который сначала исправляет ломаные линии.
Если вам нужен только красивый отступ без введения каких-либо новых разрывов строк, вы можете применить команду indent-region ко всему буферу с помощью этих нажатий клавиш:
C-x h
C-M-\
Если вам также нужно ввести разрывы строк, чтобы открывающие и закрывающие теги находились на отдельных строках, вы можете использовать следующую очень красивую функцию elisp, написанную Бенджамином Феррари . Я нашел его в своем блоге и надеюсь, что это нормально для меня, чтобы воспроизвести его здесь:
(defun bf-pretty-print-xml-region (begin end)
"Pretty format XML markup in region. You need to have nxml-mode
http://www.emacswiki.org/cgi-bin/wiki/NxmlMode installed to do
this. The function inserts linebreaks to separate tags that have
nothing but whitespace between them. It then indents the markup
by using nxml's indentation rules."
(interactive "r")
(save-excursion
(nxml-mode)
(goto-char begin)
(while (search-forward-regexp "\>[ \\t]*\<" nil t)
(backward-char) (insert "\n"))
(indent-region begin end))
(message "Ah, much better!"))
Это не зависит от внешнего инструмента, такого как Tidy.
Я использую режим nXML для редактирования и аккуратности , когда я хочу отформатировать и отступить XML или HTML. Существует также интерфейс Emacs для приведения в порядок.
вот несколько настроек, которые я сделал для версии Бенджамина Феррари:
-
search-forward-regexpне указывал конец, поэтому он будет работать с материалом от начала области до конца буфера (вместо конца области) - Теперь инкременты
endправильно, как заметил Чизо. - он вставил бы разрыв между
<tag></tag>, который изменяет его значение. Да, технически мы изменяем значения всего здесь, но пустое начало/конец гораздо более вероятно будет значительным. Теперь использует два отдельных, немного более строгих поиска, чтобы избежать этого.
Еще есть "не полагается на внешнюю опрятность" и т. д. Однако для макроса incf требуется cl .
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; pretty print xml region
(defun pretty-print-xml-region (begin end)
"Pretty format XML markup in region. You need to have nxml-mode
http://www.emacswiki.org/cgi-bin/wiki/NxmlMode installed to do
this. The function inserts linebreaks to separate tags that have
nothing but whitespace between them. It then indents the markup
by using nxml's indentation rules."
(interactive "r")
(save-excursion
(nxml-mode)
(goto-char begin)
;; split <foo><foo> or </foo><foo>, but not <foo></foo>
(while (search-forward-regexp ">[ \t]*<[^/]" end t)
(backward-char 2) (insert "\n") (incf end))
;; split <foo/></foo> and </foo></foo>
(goto-char begin)
(while (search-forward-regexp "<.*?/.*?>[ \t]*<" end t)
(backward-char) (insert "\n") (incf end))
(indent-region begin end nil)
(normal-mode))
(message "All indented!"))
Один из способов сделать это Если у вас есть что-то в формате ниже
<abc> <abc><abc> <abc></abc> </abc></abc> </abc>
В Emacs, попробовать
M-x nxml-mode
M-x replace-regexp RET > *< RET >C-q C-j< RET
C-M-\ to indent
Это приведет к отступу над xml примером ниже
<abc>
<abc>
<abc>
<abc>
</abc>
</abc>
</abc>
</abc>
В VIM вы можете сделать это с помощью
:set ft=xml
:%s/>\s*</>\r</g
ggVG=
Надеюсь, это поможет.
- Emacs nxml-mode может работать с представленным форматом,но вам придется разделить строки.
- Для более длинных файлов, которые просто не стоят того. Запустите эту таблицу стилей (в идеале с Saxon
который IMHO получает отступы строк справа) против более длинных файлов
чтобы получить хороший красивый отпечаток. Для любых элементов, где вы хотите сохранить пустое пространство
добавьте их имена рядом с 'programlisting', как в 'programlisting yourElementName'
HTH
Я взял версию Джейсона Виерса и добавил логику, чтобы поместить объявления xmlns в их собственные строки. Это предполагает, что у вас есть xmlns= и xmlns: без вмешательства whitespace.
(defun cheeso-pretty-print-xml-region (begin end)
"Pretty format XML markup in region. You need to have nxml-mode
http://www.emacswiki.org/cgi-bin/wiki/NxmlMode installed to do
this. The function inserts linebreaks to separate tags that have
nothing but whitespace between them. It then indents the markup
by using nxml's indentation rules."
(interactive "r")
(save-excursion
(nxml-mode)
;; split <foo><bar> or </foo><bar>, but not <foo></foo>
(goto-char begin)
(while (search-forward-regexp ">[ \t]*<[^/]" end t)
(backward-char 2) (insert "\n") (incf end))
;; split <foo/></foo> and </foo></foo>
(goto-char begin)
(while (search-forward-regexp "<.*?/.*?>[ \t]*<" end t)
(backward-char) (insert "\n") (incf end))
;; put xml namespace decls on newline
(goto-char begin)
(while (search-forward-regexp "\\(<\\([a-zA-Z][-:A-Za-z0-9]*\\)\\|['\"]\\) \\(xmlns[=:]\\)" end t)
(goto-char (match-end 0))
(backward-char 6) (insert "\n") (incf end))
(indent-region begin end nil)
(normal-mode))
(message "All indented!"))
Аккуратность выглядит как хороший режим. Надо посмотреть на него. Буду использовать его, если мне действительно нужны все функции, которые он предлагает.
Так или иначе, эта проблема мучила меня около недели, и я не искал ее должным образом. После публикации я начал искать и нашел один сайт с функцией elisp, которая делает это довольно хорошо. Автор также предлагает использовать Tidy.
Спасибо за ответ Марсель (жаль, что у меня не хватает очков, чтобы поднять вас) .
Скоро я напишу об этом в своем блоге. Вот сообщение об этом (со ссылкой на сайт Марселя).
Я использую xml-reformat-tags из xml-parse.el . Обычно при выполнении этой команды вы хотите иметь точку в начале файла.
Интересно, что файл включен в Emacspeak . Когда я использовал Emacspeak на основе day-by-day, я думал, что xml-reformat-tags -это встроенный Emacs. Однажды я потерял его и должен был сделать поиск в интернете для этого, и таким образом вошел на страницу wiki, упомянутую выше.
Я прилагаю мой код, чтобы начать xml-анализа. Не уверен, что это лучший фрагмент кода Emacs, но, похоже, он мне подходит.
(if (file-exists-p "~/.emacs.d/packages/xml-parse.el")
(let ((load-path load-path))
(add-to-list 'load-path "~/.emacs.d/packages")
(require 'xml-parse))
)
по состоянию на 2017 год emacs уже поставляется с этой возможностью по умолчанию, но вы должны записать эту маленькую функцию в свой ~/.emacs.d/init.el :
(require 'sgml-mode)
(defun reformat-xml ()
(interactive)
(save-excursion
(sgml-pretty-print (point-min) (point-max))
(indent-region (point-min) (point-max))))
тогда просто позвоните M-x reformat-xml
источник: https://davidcapello.com/blog/emacs/reformat-xml-on-emacs/