В работе использую EPIC и недавно начал пробовать Komodo IDE. Но в качестве лёгкого «повседневного» редактора в системе у меня установлен mooedit. Не всё в нём идеально, но некоторые вещи можно подкрутить, о чём и пойдёт речь.
Для начала выбираем цветовую схему. Все они берутся из Gtk-шных, поэтому идём сюда и выбираем. Почему-то не перевариваю белый фон, останавливаюсь на синем. И допиливаем по вкусу, получая нечто среднее а-ля Midnight Commander, FAR-овский Colorer и, чего греха таить, Turbo Vision времён борландсей. Сразу бросается в глаза отсутствие отдельного цвета для скобок. Поправляем это за счёт def:special-constant в perl.lang (для других языков, наверное, аналогично — с учётом использования там def:special-constant). Копируем файл в ~/.local/share/medit-1/language-specs/ и добавляем:
<styles>
<!-- ... -->
<style id="special-constant" _name="Brackets" map-to="def:special-constant"/>
<definitions>
<context id="perl" class="no-spell-check">
<include>
<!-- ... -->
<context ref="special-constant"/>
<define-regex id="special-constant" extended="true">
( |
) |
[ |
] |
{ |
}
</define-regex>
<context id="special-constant" style-ref="special-constant">
<match>%{special-constant}</match>
</context>
Соответственно, в файле ~/.local/share/medit-1/language-specs/наш-стиль.xml:
<style name="perl:special-constant" foreground="#66FFFF"/>
Результат:
Теперь добавляем проверку синтаксиса:
Что-то не так… Не хватает перехода на строки с ошибками.
Для этого строки в выводе должны иметь вид имя_файла: номер_строки[: позиция]. Позиция нам недоступна, но с номером строки вопрос можно решить. Кладём в ~/bin/ скрипт примерно с таким кодом:
#!/usr/bin/perl
use strict;
die "Usage: $0 filen" unless $ARGV[0];
my $out = `/usr/bin/perl -c $ARGV[0] 2>&1`;
$out =~ s|^(.*) at (($ARGV[0]) line (d+))(.*)$|$3:$4 $1$5|gm;
print $out;
Прописываем его в качестве утилиты вместо perl -c. Теперь клик мышой по строке с ошибкой будет переносить нас в нужное место окна редактора.
Следующий шаг — настройка форматирования исходника с помощью perltidy. Здесь всё не так просто. Дело в том, что при наличии синтаксических ошибок исходник в окне редактора будет просто затёрт не пойми чем. Чтобы этого избежать сначала прогоняем проверку, и потом уже форматируем. Используем скрипт на Lua, так как он позволяет не безусловно выводить результат в окно редактора, а только когда нужно:
filename = doc.get_filename()
codefile = os.tmpname()
rc = os.execute(string.format("/usr/bin/perl -c "%s" > "%s" 2>&1",filename,codefile))
if rc == 0 then
tidyfile = os.tmpname()
os.execute(string.format("/usr/bin/perltidy -nsak="if elsif unless for while" -pt=0 -i=4 -bl -vt=2 -vtc=2 -boc -st "%s" > "%s"",filename,tidyfile))
out = io.open(tidyfile,"r")
doc.select_all()
doc.replace_selected_text(out:read("*a"))
doc.save()
os.remove(tidyfile)
else
out = io.open(codefile,"r")
moo.error_dialog(string.format("Run syntax check!nn%s",out:read("*a")))
end
os.remove(codefile)
У этого способа есть один недостаток: получить окно вывода мы не можем, поэтому в случае ошибок синтаксиса приходится показывать диалог. Использование аналогичного скрипта на Python вместо Lua не очень помогает: из него мы можем получить объект для вывода, но только в том случае, если он уже существует, создать новый не получится. Автор mooedit уже уведомлён об этом, обещал подумать :)
Ну и вешаем все эти утилиты на отдельные кнопки:
Точно так же можно добавить и запуск скрипта с выводом в область уведомлений редактора (тут всё тривиально), и запуск внешнего отладчика (но это уже отдельные слёзы отдельный разговор), и что-нибудь ещё.
Автор: kloppspb