LINUX.ORG.RU

Emacs и подсветка комментариев


0

0

Добрый день!
Поставил себе emacs. Такой вопрос: почему комментарии в С-шных исходниках подсвечиваются не правильно? Есть, например, большая фунция, вся закомментаренная таким макаром:
/*
static void drawTri(HDC hdc, int width, bool l, bool r,
bool first, bool last)
{
SIZE s;
GetTextExtentPoint(hdc, " ", 1, &s);
..................
}
*/
Так вот, цветом комментария подсвечивается примерно половина функции. Потом идет просто обычный текст, как будто он не закомментирован.
Еще интересный эффект: если функцию
static void SetCaretX(int x)
{
POINT p;
GetCaretPos(&p);
SetCaretPos(x, p.y);
}
попытаться заккоментарить:
/*
static void SetCaretX(int x)
{
POINT p;
GetCaretPos(&p);
SetCaretPos(x, p.y);
}
то как комментарий подсвечивается только static void SetCaretX(int x).
Весь остальной текст отображается, как и отображался.
Это нормально для Емакса? Или что подправить? Потому как, если это устранить не удастся - еще одним пользователем Емакса станет меньше :)

> Это нормально для Емакса?

Нет, ненормально. Во всяком случае, у меня эти примеры подсвечиваются нормально.

> Или что подправить?

А какой Emacs (GNU или X), версия, режим при работе с файлами '*.c'?

Можно попробовать поискать в инете чьи-нибудь файлы '.emacs' и посмотреть, как будет с ними.

DKorolkov
()
Ответ на: комментарий от DKorolkov

Дело не конкретно в этих примерах. Не работает вообще, в принципе подсветка комментариев если комментарить всю функцию, как показано в примерах.
GNU Emacs 21.3.1, Motiff 2.2.2
По поводу готовых конфигов.... Так я свой конфиг убирал и запускал емакс в "голом" виде, так, как он запускается после сборки - со всеми своими зелеными фонами и пр. Эффект аналогичный....

Sergeant
() автор топика
Ответ на: комментарий от Sergeant

> Дело не конкретно в этих примерах. Не работает вообще, в принципе подсветка комментариев если комментарить всю функцию, как показано в примерах.

Это я понял. Просто проверил те же примеры у себя.

А остальная подсветка работает нормально? А как с комментариями типа //? В каком режиме работает Emacs при редактировании сишного файла?

Немного не по теме: код лучше убирать условными директивами типа

#if 0 #endif

или

#if CONDITION #endif .

DKorolkov
()
Ответ на: комментарий от abbr

>lazy-lock-mode, lazy-lock-defer-time

Спасибо! Похоже, то, что надо. Когда щелкаю этим режимом - все становится нормально, перерисовывается. правда, при загрузке файла приходится этот режим передернуть, чтоб рисовало нормально. Но, направление для поиска нужное, дальше, думаю, разберусь. Спасибо за подсказку.

Sergeant
() автор топика
Ответ на: комментарий от DKorolkov

>Немного не по теме: код лучше убирать условными директивами типа
#if 0 #endif

Позвольте полюбопытствовать, почему это лучше?

Dead ★★★★
()
Ответ на: комментарий от Dead

> >Немного не по теме: код лучше убирать условными директивами типа #if 0 #endif

>Позвольте полюбопытствовать, почему это лучше?

Во первых, комментарии лучше использовать по прямому назначению, использование их для двух разных целей создаёт путаницу.

Во вторых, в отключаемом коде тоже могут быть комментарии.

В третьих, условные конструкции типа

#if COND

#endif

позволяют включать/выключать несколько связанных участков кода одним определением #define COND. Это удобнее, чем ставить/убирать комментарии во всём тексте, рискуя ошибиться.

P.S. Всё изложенное частично IMHO, частично где-то вычитано. Сам, каюсь :), не всегда это соблюдаю, но стараюсь делать именно так.

DKorolkov
()
Ответ на: комментарий от Dead

POV-Ray

Потому что меньше соблазн выкинуть код, чем если он просто закомментарен. Замечено: как только удалишь кусок кода, так он сразу понадобится :)

hbee ★★★★
()
Ответ на: POV-Ray от hbee

> Замечено: как только удалишь кусок кода, так он сразу понадобится :)

cvs? :)

DKorolkov
()
Ответ на: комментарий от DKorolkov

Спасибо за разъяснения. Звучит логичино, однако когда копаешься в чужом коде и видишь закоментареную функцию, то сразу же ее пропускаешь, так как видно (хотя бы по подсветке синтаксиса) что она не компилится и уж точно нигде не вызовется...

а вот когда случайно пропустишь этот #if и начнешь пытаться понять код который просто напросто нигде не вызывается, думаю будет раздражать.

Dead ★★★★
()
Ответ на: комментарий от Dead

#if vs /*

> Спасибо за разъяснения. Звучит логичино, однако когда копаешься в чужом коде и видишь закоментареную функцию, то сразу же ее пропускаешь, так как видно (хотя бы по подсветке синтаксиса) что она не компилится и уж точно нигде не вызовется...

Насчёт подсветки согласен. Но недостатки IMHO перевешивают это преимущество. Как я уже говорил, закомментировать участок кода трудно, если в нём есть "нормальные" комментарии. Если функция закомментарена то, скорее всего, внутри неё комментариев нет. И, с большой вероятностью, они отсутствуют и в других функциях. А такой код ужасно трудно читать (как раз сейчас разбираюсь с чужим кодом подобного вида :((((((( ).

> а вот когда случайно пропустишь этот #if и начнешь пытаться понять код который просто напросто нигде не вызывается, думаю будет раздражать.

Если разбирать код начиная с main(...), и далее по вызовам функций, то функцию, которая не вызывается, разбирать не придётся. Если, конечно, автор не выкинул старый вариант функции, и не написал рядом (или не рядом) новый вариант с тем же именем :).

Просто перед выпуском программы код нужно чистить --- выкидывать из файла всё отключённые куски. А чтобы не бояться что-то потерять --- пользоваться CVS или какой-нибудь альтернативой.

Кстати, такая вещь как doxygen пропускает куски, выкинутые условными конструкциями.

DKorolkov
()
Ответ на: комментарий от Dead

>> Немного не по теме: код лучше убирать условными директивами типа #if 0 #endif

> Позвольте полюбопытствовать, почему это лучше?

в коментах нельзя вставлять коменты :)

lg ★★
()
Ответ на: комментарий от Dead

> так как видно (хотя бы по подсветке синтаксиса) что она не компилится и уж точно нигде не вызовется...

Ну Vim, к примеру, умеет подсвечивать код между #if 0 и #endif, может emacs это тоже умеет?

> а вот когда случайно пропустишь этот #if и начнешь пытаться понять код который просто напросто нигде не вызывается, думаю будет раздражать.

Можно настроить "по-нормальному" автоматический folding.

anonymous
()
Ответ на: комментарий от lg

а есть еще в природе компиляторы которые не понимают комментарии // ?

их-же вроде даже в стандарт проталкивали(протолкнули?) какой-там последний? C99?

anonymous
()
Ответ на: комментарий от lg

>> Однострочные // можно :)
>но это уже не C

Теперь уже C, в последнем стандарте -- точно знаю -- это прописано наконец-то.

anonymous
()
Ответ на: комментарий от DKorolkov

>Во первых, комментарии лучше использовать по прямому назначению,
>использование их для двух разных целей создаёт путаницу.

По-моему, комментарии уже навсегда приобрели этот второй смысл,
по-крайней мере, даже от монстров программирования с непререкаемым
авторитетом очень часто можно услышать словосочетание "comment out" :-)
К тому же, гораздо проще выделить в emacs нужную область и дважды
сделать Ctrl-C, чем вписывать эти дурацкие директивы ;-)
Это тоже всего лишь мое IMHO...

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.