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
()
Вы не можете добавлять комментарии в эту тему: топик перемещен в архив.