Как составить регион как "<? Php foo; bar;?>"
Я хочу свернуть блок php в файле шаблона php.
PHP $ bar = foo (); echo $ bar;?>php echo $ title;?> H1> Html>к >>>> {{PHP}}
{{PHP}} h1> Html>
Во-первых, я пытаюсь использовать font-lock-add-Keywords, это не удалось. Большое спасибо @Gilles за (поддержка? Совет? Я не знаю, какое слово должно быть здесь, извините).
(eval-after-load 'php-mode "(Progn (setq font-lock-multiline t) (Шрифт-блокировка надстройка ключевых слов 'php-mode `(("\\( php. *?>\\)(" (0 (progn (составьте регион (начало совпадения 1) (конец матча 1) "の") ноль)))))))
Затем я попробую ниже, это работает.
(defun lot / php-hide () "создать блок php в буфере" (Интерактивный) (Начало-оф-буфера) (пока (повторный поиск-вперед "\\ (<\\? php \\ (. \\ | \ n \\) *? \\?>\\)" ноль т);; (make-overlay (начало матча 0) (конец матча 0));; (Прятки область скрыть);; 'hide-region-hide' не работает, поэтому попробуйте compose-region (составьте регион (матч-начало 0) (конец матча 0);; "{{PHP}}"; использовать слово не может работать идеально. "の")))
Покажите мне ошибку, если есть, спасибо XD
2 ответа
В вашем регулярном выражении есть простая ошибка: ?
это специальный символ, но вы хотите, чтобы он соответствовал буквально, поэтому перед ним необходимо поставить обратную косую черту. Обратите внимание, что цитирование строкового литерала и цитирование регулярного выражения являются ортогональными, поэтому обратный слеш регулярного выражения должен быть удвоен в строковом литерале.
Кроме того, регулярные выражения являются жадными, поэтому .*
часть может соответствовать больше, чем вы предполагали, если у вас есть другой случай ?>(
позже на линии. Если вы замените .
от [\n>]
, это предотвратит выход матча за пределы первого >
, Если вы используете Emacs ≥23, вы можете вместо этого использовать не жадный оператор, чтобы остановить совпадение как можно раньше: .*?
,
"\\(<\\?php [^\n>]* \\?>\\)("
Это покажет такие вещи, как <?php foo bar?>(
как Ƥ(
,
Обратные косые скобки \(
...\)
в регулярном выражении разграничить группу; (match-beginning 1)
а также (match-end 1)
вернуть граничные позиции для первой (и единственной) группы.
Документация регулярных выражений находится в руководстве по Emacs.
Если вы хотите, чтобы совпадение распространялось на несколько строк, вам нужно [^>]*
или же \\(.\\|\n\\)*?
в регулярном выражении Кроме того, вы должны указать библиотеке Font Lock расширять поиск по нескольким строкам (по умолчанию он ограничивает все поиски в конце строки по соображениям эффективности). Использовать этот:
(eval-after-load 'php-mode
'(progn
(setq font-lock-multiline t)
(font-lock-add-keywords …)))
Итак, вы хотите ввести P
и это должно вывести что-то вроде <?php xxx; xxx; ?>
? Правильно ли я понял ваш вопрос?
В этом случае, проверьте yasnippet ( больше информации на emacswiki). Он позволяет вам определять свои собственные фрагменты (синтаксис очень прост), например, P, пусть у него есть заполнители (так что вы можете заменить xxx;
а также xxx;
с чем-то еще при вызове сниппета) и тому подобное. Это действительно удобно. Просто создайте новый фрагмент (имя файла указывает на его ярлык, т. Е. Назовите его P
это пример) и введите что-то вроде:
# name: My own P-snippet.
# --
<?php ${first}; ${second}; ?>
Нет необходимости создавать собственные блокировки шрифтов, не нужно использовать регулярные выражения. Просто создайте новый фрагмент. Создав (и загрузив его, я обычно перезагружаю emacs, потому что я ленивый) ваш фрагмент, открываю php-mode
буфер, введите P и нажмите Tab. Магия!:)