Как составить регион, такой как « Php foo; бар;
Вопрос
Я хочу складного блока PHP в файле шаблона PHP.
<html> <?php $bar = foo(); echo $bar; ?> <h1><?php echo $title; ?></h1> </html> to >>>> <html> {{PHP}} <h1>{{PHP}}</h1> </html>
Во-первых, я стараюсь использовать шрифт-блокировки-ключ, это не удалось. Большое спасибо @gilles за (поддержка? Совет? Я не знаю, какое слово должно быть здесь, извините).
(eval-after-load 'php-mode '(progn (setq font-lock-multiline t) (font-lock-add-keywords 'php-mode `(("\\(<?php .* ?>\\)(" (0 (progn (compose-region (match-beginning 1) (match-end 1) "の") nil)))))))
Затем я пытаюсь ниже, это работает.
(defun lot/php-hide () "compose php block in buffer" (interactive) (beginning-of-buffer) (while (re-search-forward "\\(<\\?php\\(.\\|\n\\)*?\\?>\\)" nil t) ;; (make-overlay (match-beginning 0) (match-end 0)) ;; (hide-region-hide) ;; 'hide-region-hide' doesn't work, so try compose-region (compose-region (match-beginning 0) (match-end 0) ;; "{{PHP}}" ; use word can't work perfect. "の" ) ) )
Покажи мне ошибку, если есть, спасибо XD
Решение
В вашей режиме есть простая ошибка: ?
это особый персонаж, но вы хотите сопоставить его буквально, поэтому вам нужна обратная черта перед ним. Обратите внимание, что цитирование строки и цитирование REGEXP является ортогональными, поэтому обратная категория REGEXP должна быть удвоена в струнном буквальном языке.
Кроме того, regexps жадные, поэтому .*
Часть может соответствовать больше, чем вы намеревались, если у вас есть другой случай ?>(
Позже на линии. Если вы замените .
по [\n>]
, это предотвратит простирание матча за пределы первого >
. Анкет Если вы используете eMACS ≥23, вы можете использовать не-середину оператора вместо этого, чтобы остановить матч как можно раньше: .*?
.
"\\(<\\?php [^\n>]* \\?>\\)("
Это покажет такие вещи, как <?php foo bar?>(
в качестве Ƥ(
.
Обратные скобки \(
…\)
в режиме regexp разделить группу; (match-beginning 1)
а также (match-end 1)
Верните граничные позиции для первой (и единственной) группы.
Документация режима regexps находится в Руководство EMACS.
Если вы хотите, чтобы совпадение простиралось по нескольким линиям, вам нужно [^>]*
или же \\(.\\|\n\\)*?
в режиме. Кроме того, вы должны сообщить библиотеке блокировки шрифта расширить свои поиски по нескольким строкам (по умолчанию, она ограничивает все поиски в конце строки по причинам эффективности). Использовать это:
(eval-after-load 'php-mode
'(progn
(setq font-lock-multiline t)
(font-lock-add-keywords …)))
Другие советы
Итак, вы хотите ввести P
и это должно вывести что -то вроде <?php xxx; xxx; ?>
? Я правильно понял ваш вопрос?
В этом случае проверьте Ясниппет (больше информации об emacswiki) Это позволяет вам определить свои собственные фрагменты (синтаксис действительно прост), например, P, пусть у него есть заполнители (так что вы можете заменить xxx;
а также xxx;
с чем -то еще, когда вызывает фрагмент) и тому подобным. Это действительно удобно. Просто создайте новый фрагмент (имя файла диктует его ярлык, т.е. назовите его P
это этот пример) и введите что -то вроде:
# name: My own P-snippet.
# --
<?php ${first}; ${second}; ?>
Нет необходимости делать собственные шрифты, не нужно использовать Regexp. Просто создайте новый фрагмент. После создания (и загрузки его, я обычно перезапускаю EMACS, так как я ленивый) ваш фрагмент, откройте php-mode
Буфер, введите P и нажмите вкладку. Магия! :)