Вопрос

Я хочу складного блока 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 и нажмите вкладку. Магия! :)

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top