сделать стартовой  |  добавить в избранное

   SciTE - редактор кода для программистов

Auto-indent (автоотступ) для PHP и JavaScript


Автор: xDude / Дата: 06.03.2006 / Комментариев: 24
Категория: SciTE, FAQ


В SciTE auto-indent (автоотступ) для PHP и Java-Script отключен (точнее, не настроен) по умолчанию. Чтобы его включить, добавляем следующий код в конец файла html.properties:

Код .properties:
# PHP Auto-Indent
statement.indent.$(file.patterns.html)=121 do else for if while case function
statement.end.$(file.patterns.html)=127 ;
statement.lookback.$(file.patterns.html)=20
block.start.$(file.patterns.html)=127 {
block.end.$(file.patterns.html)=127 }

# JS Auto-Indent
statement.indent.$(file.patterns.html)=47 do else for if while case function
statement.end.$(file.patterns.html)=50 ;
block.start.$(file.patterns.html)=50 {
block.end.$(file.patterns.html)=50 }


В принципе, таким же образом настраивается автоотступ для ASP, Embedded Python, VB-Script и т.д.
Для этого, в statement.end, block.start и block.end число после знака "=" нужно заменить на соответствующий код (например, 127 соответствует символам класса "оператор PHP", а 50 - "оператор (символ) Embedded JavaScript"). А вот для того, чтобы найти нужный код, надо немного почитать комментарии к стилям в html.properties ;)

block.start и block.end определяют символы начала/конца блока. Во всех C-подобных языках это символы "{" и "}"

statement.indent отвечает за автоотступ после определенных ключевых слов. Заметьте, что ключевые слова в списке разделяются пробелами, а самый первый элемент списка - это код класса этих ключевых слов (47 соответствует ключевым словам JavaScript, 121 - ключевым словам PHP)

ну а statement.end - это символ окончания блока, начатого одним из ключевых слов, перечисленных в statement.start. Он имеет тот же код, как и block.start/block.end, и для C-подобных языков это символ ";"


UPDATE by Tugarinov Sergey
Благодаря моим кривым рукам, всюду находящим дыры и мудрым советам находчивого DB6 был найден и исправлен косяк возникающий при использовании автоидента.
Для этого достаточно точно указать язык для которого вы собираетесь использовать сабж, например для PHP, необходимо прописать не Код .properties:
$(file.patterns.html)
как описывалось выше, а Код .properties:
$(file.patterns.php)

Версия для печати / Прочитано: 40943 раз(а)

Комментариев: 24 (rss)

1. Тугаринов Сергей / 06.03.2006 - 18:37
Отличная возможность, во многом благодаря ей теперь скорость написания кода должная увеличиться.
xDude, молодец!
Цитата
2. Тугаринов Сергей / 08.03.2006 - 13:05
Кстати, когда включен автоидент и для JS, то у PHP он начинает работать неправильно, т.е. после такой вот конструкции:
Код PHP:
if($q == 0) {

Курсор встает не на следующую струку через таб как ожидалось, а на следующую строку уже без таба.

Эта проблема решается удалением идента для JS. Тестировать наоборот не пробовал, ибо лень :)
Цитата
3. dB6 / 09.03.2006 - 14:26
Тугаринов Сергей,
Курсор встает не на следующую струку через таб как ожидалось, а на следующую строку уже без таба.

У меня все ок. Правда правильней, имхо, написать:
Код PHP:
PHP">#PHP Auto-Indent
statement.indent.$(file.patterns.php)

и т.д.
Чтобы для файлов PHP, INC и т.д. работало.
Цитата
4. Тугаринов Сергей / 09.03.2006 - 15:37
ХЗ, может проблема опять в том, что у меня пользователь в системе на русском. Менять лень, в свое время случайно, на автомате прописал, до сих пор мучаюсь... :)
Цитата
5. Тугаринов Сергей / 09.03.2006 - 15:38
Если прописывать 'html', то получается, что настройки идут на HyperText, а он в себя в свою очередь включает PHP (или наоборот :)) ), так что думаю, что все нормально.
Цитата
6. dB6 / 09.03.2006 - 15:56
Тугаринов Сергей,
Если прописывать 'html', то получается, что настройки идут на HyperText, а он в себя в свою очередь включает PHP (или наоборот :)) ), так что думаю, что все нормально.

А мне кажется, что не нормально... Тестирую на php-файле.
3 Варианта сочетаний подключения:
1. file.patterns.html + индент для JS: не работает вообще индент.
2. file.patterns.html - индент для JS (не подключаю): работает весьма глючно - не делает отступ для текста в блоке, но скобку ставит правильно.
3. file.patterns.php + индент для JS: все работает чудесно.
Цитата
7. Тугаринов Сергей / 09.03.2006 - 18:26
1. При первом варианте у меня работало, но глючно
2. Второй также
3. Последний, да ты прав (каюсь) все отлично.

UPDATE:
Поправил статью.
Цитата
8. xDude / 09.03.2006 - 19:16
Странно, но у меня все работает отлично с file.patterns.html. А file.patterns.php - ИМХО, немного неправильно, потому что ПХП может встречаться и в файлах .html. PHP считается скриптовым языком, втраиваемым в html-код, как Javascript, поэтому file.patterns.html правильней. Возможно, глюки связаны с реализацией SciTE, например, я пользуюсь CVS-сборкой, в которой, как я прочитал на офф-сайте, исправлены некоторые глюки.
Цитата
9. Тугаринов Сергей / 09.03.2006 - 19:23
xDude,
Странно, но у меня все работает отлично с file.patterns.html. А file.patterns.php - ИМХО, немного неправильно, потому что ПХП может встречаться и в файлах .html. PHP считается скриптовым языком, втраиваемым в html-код, как Javascript, поэтому file.patterns.html правильней

Вот вот, о том же и я писал выше, но для моей и не только редакции SciTE это предположение оказалось неверным. Насчет сборки с поддержкой CVS я не знаю (кстати, опиши плиз, как она с CVS работает), видел, но не скачивал, вполне возможно, что она стабильнее, но так как большинство пользователей ИМХО используют стандартную сборку, то давай пока оставим все как есть, до выяснения :)
Цитата
10. xDude / 09.03.2006 - 19:43
CVS-сборка с CVS-ом не работает, то есть, не нужно для этого лезть в их CVS-репозитарий :)
Она висит на оффициальном сайте, уже собранная с CVS самими разработчиками. Не знаю только, обновляют ли они её по мере обновления CVS, и как часто они это делают. Ясно только одно: она может быть не так стабильна, как стандартный релиз, но в то же время в ней реализовано больше функций, и пофикшены некоторые баги стандартного релиза.
Цитата
11. xDude / 09.03.2006 - 19:48
Тугаринов Сергей,
Курсор встает не на следующую струку через таб как ожидалось, а на следующую строку уже без таба.


По логике statement.lookback как раз и влияет на то, на сколько парсер должен возвращаться назад, чтоб проверить, было ли перед ним ключевое слово, после которого нужно сделать отступ. Хотя, я могу и ошибаться. Так вот, проверь (поиском по файлам), есть ли у тебя в каких-нибудь *.properties statement.lookback=??, и закомментируй его. И еще, по-моему, нужно везде закомментировать indent.maintain=1, или установить его в 0
Цитата
12. Тугаринов Сергей / 09.03.2006 - 19:48
xDude,
CVS-сборка с CVS-ом не работает, то есть, не нужно для этого лезть в их CVS-репозитарий :)

Жаль, я думал, что у нее есть поддержка работы с CVS :)
Прямую ссылочку на нее не скинешь, гляну что почем.

xDude,
Кстати, по логике statement.lookback как раз и влияет на то, на сколько парсер должен возвращаться назад, чтоб проверить, было ли перед ним ключевое слово, после которого нужно сделать отступ. Хотя, я могу и ошибаться. Так вот, проверь (поиском по файлам), есть ли у тебя в каких-нибудь *.properties statement.lookback=??, и закомментируй его. И еще, по-моему, нужно везде закомментировать indent.maintain=1, или установить его в 0.

Смотрел, ничего нет, везде и все убрано, т.е. в принципе никаких подводных камней не должно быть.
Цитата
13. DeadMoroz / 11.03.2006 - 10:23
И всё-таки у меня почему-то работает не совсем правильно. Не знаю, как другие, но я привык набирать парные скобки и кавычки сразу, а потом набирать текст между ними.

Если фигурные скобки набирать по одной, то всё получается нормально:
Код:

if ( /*some statement*/ )
{
// some code goes here
}


т.е. строка после открывающей скобки смещается вправо, а строка, содержащая закрывающую скобку после ее появления - назад влево.

Однако если обе скобки набирать сразу, то закрывающая скобка остается висеть с отступом:
Код:

if ( /*some statement*/ )
{
// some code goes here
}


Может быть есть какая-то возможность изменить это поведение?

P.S. в последних версиях Zend Studio ИМХО это сделано довольно грамотно: при нажатии Enter между открывающей и закрывающей фигурными скобками закрывающая скобка сносится на две строки вниз, а курсор выставляется на строку между ними и делается отступ:
Код:

1. if ( /*some statement*/ )
{|} // <-- курсор стоит в указанной позиции, нажимаем Enter

2. if ( /*some statement*/ )
{
| // <-- получается так
}

Цитата
14. xDude / 13.03.2006 - 20:52
Тугаринов Сергей,
Жаль, я думал, что у нее есть поддержка работы с CVS :)
Прямую ссылочку на нее не скинешь, гляну что почем.

Поддержка работы с CVS - в смысле, прямо из скайта? :))
Это было бы модно :)
А вот, что надо, для того, чтоб получить исходники с CVS:
Код:

"C:\Program Files\cvsnt\cvs.exe" -d:pserver:anonymous@cvs.sourceforge.net:/cvsroot/scintilla login
"C:\Program Files\cvsnt\cvs.exe" -z3 -d:pserver:anonymous@cvs.sourceforge.net:/cvsroot/scintilla co -P scintilla
"C:\Program Files\cvsnt\cvs.exe" -z3 -d:pserver:anonymous@cvs.sourceforge.net:/cvsroot/scintilla co -P scite

Если спросит пароль - ничего не вводить, просто нажать Enter.
Для этого понадобится CVS-клиент (у меня это WinCVS+cvsnt, http://optusnet.dl.sourceforge.net/sourceforge/cvsgui/WinCvs2_0_2-4.zip)
Цитата
15. Тугаринов Сергей / 13.03.2006 - 21:02
xDude,
А вот, что надо, для того, чтоб получить исходники с CVS:

Спасибо, уже получал, правда для этого я пользуюсь встроенным CVS клиентов в IDE Eclipse. Если пишешь на C++, посмотри её, очень приятная IDE.
Цитата
16. xDude / 13.03.2006 - 22:23
Кстати, я понял, почему не работает автоиндент одновременно для PHP и JavaScript если указывать file.patterns.html. Просто настройки перекрываются, несмотря на то, что типы после "=" стоят разные коды. То есть, если указать
Код:
statement.indent.$(file.patterns.html)=121 do else for if while case function

а после этого указать Код:
statement.indent.$(file.patterns.html)=47 do else for if while case function

то последняя настройка перекроет первую, и индент будет работать только для последней (в файлах file.patterns.html), то есть, только для JavaScript'а (47)
Причем этот баг у них по идее исправлен (хотя я уже не уверен) в CVS-версии 1.67, а вот в 1.68 он опять появился :(
Короче, чтобы индент работал для всех языков, нужно, чтобы эти языки находились в фалах с разными расширениями (PHP в *.php, JavaScript в *.js и т.д.). А если в файле *.html есть и PHP, и JavaScript, и что-то-там-еще (например, ASP), и для фалов *.html прописаны настройки AutoIndent для всех этих языков, то работать будут только те настройки, которые указаны в конфигурации последними, потому что они тупо перекроют все предыдущие. Я покопался в исходниках SciTE, но ничего обнадеживающего так и не выкопал, а эксперементировать времени не хватает :(
Так что будем надеяться, что кто-нибудь с этим вопросом обратится к разработчикам, и они выложат в CVS-репозитарий пофикшенную версию.
Цитата
17. mozers™ / 31.03.2006 - 05:52
xDude
Все очень хорошо, но нарушена логика.
Обработка JavaScript задана в cpp.properties
Следовательно, если нужен автоиндент для JS то надо задавать его именно в этом файле.
Точнее - задавать то ничего не надо (там все есть). Единственное что надо изменить в оригинальном файле - добавить *.js в перечень паттерна file.patterns.c.like.
Что, в file.js работает, а в file.html - нет? ;) Да так и задумано! :)))
Просто если в file.html ты задумал редактировать входящий в него JS код, то не почти за труд, переключи в меню Language язык с Hipertext на JavaScript.
Цитата
18. Тугаринов Сергей / 31.03.2006 - 12:40
mozers™,
Что, в file.js работает, а в file.html - нет? ;) Да так и задумано! :)))
Просто если в file.html ты задумал редактировать входящий в него JS код, то не почти за труд, переключи в меню Language язык с Hipertext на JavaScript.

Как всегда, появился mozers, и всех сделал :)
Цитата
19. xDude / 21.04.2006 - 23:04
mozers™,
Обработка JavaScript задана в cpp.properties

Насколько я понял логику SciTE, безразлично, в каком файле указаны настройки. Можно вообще все настройки объеденить в один большой .properties, просто их разбили по разным файлам чисто для удобства.
mozers™,
Что, в file.js работает, а в file.html - нет? ;) Да так и задумано! :)))
Просто если в file.html ты задумал редактировать входящий в него JS код, то не почти за труд, переключи в меню Language язык с Hipertext на JavaScript.

Все немного сложнее, насколько мне кажется. Дело в том, что файлы *.js по умолчанию парсятся лексером C, а файлы *.html - лексером html, который включает в себя парсинг вложенных скриптовых языков, таких как PHP,ASP,Python-script, javascript и т.д. Т.е., переключая Language, мы просто меняем парсер. Это, не решает проблему парсера HTML, а просто перекладывает ее с больной головы на здоровую, то есть, на парсер C. А что если у меня в html-файле сразу несколько языков (а оно так и есть)? Например, PHP+JavaScript+сам HTML? Причем, идут они вперемешку, маленькими кусочками. Это ж как можно запариться языки для них всех переключать постоянно! Именно для этого и придуман универсальный парсер HTML с поддержкой вложенных языков (там даже в комментариях к стилям в html.properties пишется, что это не просто стиль для JS, а именно для Embedded JS, то же самое для ASP,PHP и других языков).
Конечно, я могу ошибаться насчет всего этого, или чего-то недопонимать в архитектуре SciTE, но, ИМХО, проблема остается открытой.
Цитата
20. xDude / 21.04.2006 - 23:12
mozers™
Да, и еще: ведь работало же это все в версии 1.67 CVS, 100% работало, потому что как только появился 1-ый пост, что у кого-то на нормальной версии сглючило, я у себя протестировал, и отписался, что все работает ОК с CVS-сборкой.
Цитата
21. OR / 10.12.2009 - 15:59
DeadMoroz,
Однако если обе скобки набирать сразу, то закрывающая скобка остается висеть с отступом:
DeadMoroz,
Может быть есть какая-то возможность изменить это поведение?

На данный момент в скрипте smartbraces.lua это работает для cpp и css, если в условия
( editor.LexerLanguage == \'cpp\' or editor.LexerLanguage == \'css\')
, которые находятся на 252 и 296 строчках добавить
or editor.LexerLanguage == \'hypertext\'
То то же самое будет применяться для php(и не только)
Цитата


Добавить комментарий:
Имя:
E-mail:
        BBCodes




Интересные статьи / Тематические материалы © 2004 - 2017 - Хранение данных