Как составить регион как "<? Php foo; bar;?>"

Я хочу свернуть блок php в файле шаблона php.

  
  

к >>>> {{PHP}}

{{PHP}}

Во-первых, я пытаюсь использовать font-lock-add-Keywords, это не удалось. Большое спасибо @Gilles за (поддержка? Совет? Я не знаю, какое слово должно быть здесь, извините).

(eval-after-load 'php-mode
  "(Progn
     (setq font-lock-multiline t)
     (Шрифт-блокировка надстройка ключевых слов
      'php-mode `(("\\(\\)("
                   (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. Магия!:)

Другие вопросы по тегам