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

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

Архив SciTE-форума


Автор: vladvro, Отправлено:14:03 24-05-2007
нашел баг:
Встроенный поиск по файлам в длинных строках ищет только до 1001 символа, все остальное в строке игнорируется.
Кто-нибудь может объяснить почему?


Добавлено:
нашел почему:
SciTEIO.cxx строка 1026
Код:
class FileReader {
BufferedFile *bf;
int lineNum;
bool lastWasCR;
enum {bufLen = 1000};
char lineToCompare[bufLen+1];
Данный код внедрен в форум с помощью скрипта vladvro
оказывается это не баг, а "фича"
кто-нибудь может сказать как корректно избавиться от этого ограничения?
Автор: BioInfo, Отправлено:17:24 24-05-2007
Ну, решение в лоб: enum {bufLen = 3000}
Посмотри еще как в PropFileEx сделано, я там буфер записывал в SString m_buf;
соответственно можно заменить lineToCompare и lineToShow

Посмотрел в SString, чтобы более или менее похоже стало, поставь ему setsizegrowth в 1000.

Добавлено:
Всем
Необходимо сделать следующие скрипты (ну или вообще хоть чего нить сделать):
1. Чтобы редактор переносил текст когда он превысит Х знаков (граница уже задается в настройках edge.column=100, но к сожалению никак не обрабатывается )
2. Сделать выравнивание по ширине (т.е. выделил текст, нажал выровнять по ширине, а он сам рассчитал сколько пробелов поставить нужно чтобы слова выровнялись и по левой и по правой границе). Выравнивание по центру и по правому краю по такой же схеме.
3. Не решен вопрос с проверкой орфографии.
4. Необходимо сделать чтобы аббревиатуры выпадали в подсказках, т.е. я набрал знакомый набор буков, а он мне подсказку мол можно закончить так.
5. Нужно сделать автоформатинг при вставке - вы выбираем стиль, потом когда делаем вставку кода оно само расставляет скобки, пробелы табуляции и прочее как положено (мне так нужно для С++ ).
6. Нужен скрипт: если мы стоим в закоменченной строке и жмем интер, то на следующую строку у нас переносится как закоменченное, т.е.
// вася (нажили интер) пупкин
получили
// вася
// пупкин

Другое:
1. Принимаются заявки на кнопки в тулбаре
2. Нужно посмотреть скрипт автозакрытие скобок и сделать предложение по улучшению или указать на ошибки и недочеты
Автор: Moon_aka_Sun, Отправлено:18:34 24-05-2007

Цитата:
а зачем, если есть сессии?
Затем, что это разные вещи. Сессии - это сессии, грузятся из текущего каталога, если я не ошибаюсь, а любимые файлы - это специально любимые файлы, доступные всегда и отовсюду.

Автор: mozers, Отправлено:21:42 24-05-2007
Moon_aka_Sun
Цитата:
Никто не думал над тем, чтобы сделать в File подменю Favorites и запихать туда 5-10 любимых файлов, которые чаще всего редактируются?
Есть такой скрипт. Если подумать, то можно и получше сделать...
Цитата:
Сессии - это сессии, грузятся из текущего каталога, если я не ошибаюсь
А ты так и не попробовал SessionManager...

Fire_Sphere
Цитата:
style.*.126
И кстати, можно где-то почитать полный список этих загадочных номеров?
vladvro
Цитата:
"почитать" можно в исходниках редактора.
Я бы решился уточнить - наверное в исходниках конкретного лексера?
Я когда то хотел сделать красивую табличку в виде [номер стиля] -> [что означает], но столкнулся с неприятной неожиданностью, что повидимому, никто жестко не оговаривает это соответствие (так, например, для большинства языков стиль комментариев = 1 или 2, а для CSS = 9)

Midas Moon_aka_Sun vladvro и, конечно, BioInfo
Ну, ребят, вы даете
У меня возражений нет - вношу все исправления в исходники. Но только чтоб потом не орали "а!!! все перечеркать!!! код работет неправильно!!!" (помните, было такое - и до сих пор так никто и не поправил - я про многократный вызов scite.MenuCommand(x))

BioInfo
По поводу предложений:
1 и 2 и 3 комментировать не буду. Думаю кому задача покажется интересной - сделают.
4 хочется уточнить:
Под давлением dB6 параметр autocompleteword.automatic=1 включен в сборку. Сейчас он мне кажется удобным. Но он выводит варианты, беря их только из текущего текста. Возможно было бы удобно если бы он их брал и из api файлов (abbrev тут всетаки не при чем).
Я правильно понял твою мысль?

5 Вообще не понял как это должно работать???
Цитата:
вы выбираем стиль
где выбираем???
Цитата:
потом когда делаем вставку кода
По Ctrl+V что ли? Т.е. в буфере обмена код - одной строкой без скобок пробелов и табуляции? Откуда мы такое уродство взяли?
Цитата:
оно само расставляет скобки, пробелы табуляции и прочее как положено
Как "оно" догадается где что надо вставлять??? Не представляю что такое вообще возможно
Выделить готовый работающий абзац кода, а затем скрипт уберет лишние пробелы и табы и чуть-чуть поправит код, чтобы смотрелся поприличнее - это еще возможно, но проблема в том, что для каждого языка программирования надо писать свой уникальный скрипт. Сомневаюсь что возможно создать чтото универсальное...

Автор: Moon_aka_Sun, Отправлено:05:24 25-05-2007

Цитата:
Есть такой скрипт.
И то правда. Если не упираться в меню File, то проще с нуля написать несчастные 6 строк на Луа.

Автор: BioInfo, Отправлено:07:14 25-05-2007
mozers

Цитата:
4.... Я правильно понял твою мысль?

Нет, нужно именно abbrev. Апи то вроде уже выводится? Или я чегото не догоняю... Написал функцию, поставил точку выпадает список - все работает. Теперь тоже самое нужно для сокращений, написал сокращение выпал список из вариантов.

Цитата:
5 Вообще не понял как это должно работать???
вы выбираем стиль...
где выбираем???

Ну в настройках к примеру: autoformat.style=1
Для начала бы хоть один стиль сделать...

Цитата:
По Ctrl+V что ли? Т.е. в буфере обмена код - одной строкой без скобок пробелов и табуляции? Откуда мы такое уродство взяли?

Ну да, а точнее ПОСЛЕ того как нажали Ctrl+V.
В буфере просто кусок кода, например из этого форума скопипастенный. Согласись, все пишут в разных стилях, кто то функции пишет так
void foo() {
...
}
кто-то так (я, например):
void foo()
{
...
}
Нужно единообразие.

Цитата:
Выделить готовый работающий абзац кода, а затем скрипт уберет лишние пробелы и табы и чуть-чуть поправит код, чтобы смотрелся поприличнее - это еще возможно, но проблема в том, что для каждого языка программирования надо писать свой уникальный скрипт. Сомневаюсь что возможно создать чтото универсальное...

Ну а кто говорил что будет легко А вообще именно такой скрипт и нужен. А при (после) вставке чтобы срабатывал потому, что обычно свой код форматить не нужно, нужно вражеский, а вражеский код попадает в проект при копи-пасте.
Могу привести характеристики какие он должен менять (в зависимости от стиля), их не много, на вскидку:
1. Отступы вначале (пробелы, табы)
2. Расположение скобок {}
3. Расположение аргументов в скобках (), например (i+5,6) и ( i + 5, 6 )
4. Учитывать предыдущий отступ, т.е. если мы код вставляем в блок {}, то отступ должен быть не сначала, а на 1 уровень, если в {{сюда}} то 2 уровня (2 таба) и так далее. Это очень удобно даже когда перемещаешь свой код.
Автор: mozers, Отправлено:11:05 25-05-2007
BioInfo
Цитата:
Нет, нужно именно abbrev. Апи то вроде уже выводится? Или я чегото не догоняю... Написал функцию, поставил точку выпадает список - все работает
Все это работает не за счет встроенного функционала SciTE, а за счет внешнего скрипта AutocompleteObject.lua. Там алгоритм совершенно другой. Если autocompleteword.automatic=1 (встроенный функционал SciTE) после каждого введенного символа ищет в текущем тексте варианты автодополнения, то скрипт ищет не дополнение для слова, а конкретно операторы перечисленные в api файле.
Как из *.abbrev выводить "список вариантов" ??? Там же их - нет! Каждому сокращению соответствует только один вариант полной конструкции.
Поэтому если и можно что то сделать, то только - одно: Расширить (обязательно опционально) функционал autocompleteword.automatic=1, чтобы он варианты не только из текущего текста брал, а и в язык.api заглядывал.

Насчет автоформатирования кода все ясно.
Просто технически проще будет вставлять его неотформатированным, а скрипт потом будет преобразовывать выделенный текст... Вот думаю как бы очертить общие принципы форматирования, чтобы параметр "стиль" определял конкретный язык программирования... (ну очень не хочется пыхтеть над неуниверсальным скриптом)...
Автор: BioInfo, Отправлено:11:25 25-05-2007
mozers

Цитата:
Все это работает не за счет встроенного функционала SciTE, а за счет внешнего скрипта

Мне, чесно говоря, без разницы, главное работает.

Цитата:
Как из *.abbrev выводить "список вариантов" ??? Там же их - нет! Каждому сокращению соответствует только один вариант полной конструкции.

А если я два пропишу, что будет? Он ведь не опрокинется...
Да и к тому же может у меня такие сокращения
auto=
to=
т.е. я набираю auto а у меня список вываливается из двух, а если так прописать например:
for=
for=
for=
То после того как я for набрал вывалится список из трех.
Да и вообще пускай хоть и один, всяко лучше чем все сокращения в башке держать.

Цитата:
Расширить (обязательно опционально) функционал autocompleteword.automatic=1, чтобы он ... и в язык.api заглядывал.

Ну и заодно в abbrev


Цитата:
Просто технически проще будет вставлять его неотформатированным

Я думаю примерно так, запоминаем позицию курсора, вставляем текст, считываем позицию курсора. От первой позиции до последней выделяем. Запускаем автоформатинг. Снимаем выделение (становимся в последнюю позицию курсора). Примерно так.
По такому случаю я могу добавить в код чтобы отлавливало он пасте (если еще не ловит)

З.Ы. Не у кого нет такой проблемы, делаю ctrl+v (вставку) в форму для постинга на форум, автоматически нажимается отправить? Третий раз такая борода...
Автор: vladvro, Отправлено:14:56 25-05-2007
BioInfo
Цитата:
А если я два пропишу, что будет? Он ведь не опрокинется...

нет, но значение все равно будет одно, то что было последним (парсер то тотже, что для всех файлов .properties)

Цитата:
Да и вообще пускай хоть и один, всяко лучше чем все сокращения в башке держать.

есть диалог "Вставить сокращение..." (Ctrl+Shift+R), где можно набрать начало сокращения и по стрелке вниз найти подходящее,
только там не отображается результат развертывания сокращения, вот это и можно было бы добавить в задачи.

Цитата:
З.Ы. Не у кого нет такой проблемы, делаю ctrl+v (вставку) в форму для постинга на форум, автоматически нажимается отправить?

нет, у меня такого нет, использую FireFox 2.0

mozers

Цитата:
Вот думаю как бы очертить общие принципы форматирования, чтобы параметр "стиль" определял конкретный язык программирования... (ну очень не хочется пыхтеть над неуниверсальным скриптом)...

наиболее полную реализацию автоформата я встречал в "студиях" для Java (например IntelliJ IDEA, увы сейчас у меня этого инструмента нет),
думаю что у них и надо "подглядеть" какие параметры задаются в шаблоне.


Добавлено:
All
в продолжение модификации результатов поиска,
теперь отображается так:
Код:
>Internal search for "class DcmFileFormat" in "*.asm *.c *.cc *.cpp *.cxx *.cs *.h *.hh *.hxx *.hpp *.rc"
[no]D:\dcmtk-3.5.4\dcmdata\include\dcmtk\dcmdata\dcfilefo.h:22:[/no] * Purpose: Interface of class DcmFileFormat
[no]D:\dcmtk-3.5.4\dcmdata\include\dcmtk\dcmdata\dcfilefo.h:55:[/no]class DcmFileFormat
[no]D:\dcmtk-3.5.4\dcmdata\libsrc\dcfilefo.cxx:22:[/no] * Purpose: class DcmFileFormat
[no]D:\dcmtk-3.5.4\dcmimgle\include\dcmtk\dcmimgle\didocu.h:66:[/no] * and functions provided by dcmdata (e.g. class DcmFileFormat, DcmItem).
[no]D:\dcmtk-3.5.4\dcmnet\libsrc\dimse.cxx:100:[/no]#include "dcmtk/dcmdata/dcfilefo.h" /* for class DcmFileFormat */
[no]D:\dcmtk-3.5.4\dcmqrdb\include\dcmtk\dcmqrdb\dcmqrcbs.h:42:[/no]class DcmFileFormat;
> Time: 0.556

[more=подробнее...]
SciLexer.h строка 427
Код:
#define SCE_ERR_FIND_VALUE 30 [no]//!-add-[FindResultListStyle][/no]
Данный код внедрен в форум с помощью скрипта vladvro

LexOthers.cxx строка 1005
Код:
[no]//!-start-[FindResultListStyle][/no]
static bool RecogniseFindListStart(const char *lineBuffer, char *findValue) {
if (strstart(lineBuffer, [no]">Internal search for \""[/no])) {
unsigned int p = 22;
while (0 != strncmp(lineBuffer + p, [no]"\" in \""[/no], 6)) {
p++;
if (p > 1022) return false;
}
strncpy(findValue, lineBuffer + 22, p - 22);
findValue[p - 22] = [no]'\0'[/no];
return true;
}
return false;
}

static void ColouriseFindListLine(
const char *lineBuffer,
unsigned int lengthLine,
unsigned int startPos,
unsigned int endPos,
char *findValue,
Accessor &styler) {
int len = strlen(findValue);
unsigned int p = 0;
while (true) {
while (0 != strnicmp(lineBuffer + p, findValue, len)) {
p++;
if (p > lengthLine - len) {
p = lengthLine;
break;
}
}
if (p < lengthLine) {
styler.ColourTo(startPos + p, SCE_ERR_DEFAULT);
styler.ColourTo(startPos + p + len, SCE_ERR_FIND_VALUE);
p += len;
} else {
break;
}
}
styler.ColourTo(endPos, SCE_ERR_DEFAULT);
}
[no]//!-end-[FindResultListStyle][/no]

static void ColouriseErrorListLine(
char *lineBuffer,
unsigned int lengthLine,
unsigned int startPos, [no]//!-add-[FindResultListStyle][/no]
unsigned int endPos,
bool isFindListStyle, [no]//!-add-[FindResultListStyle][/no]
bool &isFindList, [no]//!-add-[FindResultListStyle][/no]
char *findValue, [no]//!-add-[FindResultListStyle][/no]
Accessor &styler) {
[no]//!-start-[FindResultListStyle][/no]
unsigned int styleLength = 0;
int stl = RecogniseErrorListLine(lineBuffer, lengthLine, styleLength);
if (isFindListStyle && stl == SCE_ERR_GCC) {
styler.ColourTo(startPos + styleLength, stl);
if (isFindList) {
ColouriseFindListLine(lineBuffer + styleLength + 1, lengthLine - styleLength - 1, startPos + styleLength, endPos, findValue, styler);
} else {
styler.ColourTo(endPos, SCE_ERR_DEFAULT);
}
} else {
if (isFindListStyle && stl == SCE_ERR_CMD) {
isFindList = RecogniseFindListStart(lineBuffer, findValue);
if (!isFindList) findValue[0] = [no]'\0'[/no];
}
styler.ColourTo(endPos, stl);
}
[no]//!-end-[FindResultListStyle][/no]
}

static void ColouriseErrorListDoc(unsigned int startPos, int length, int, WordList *[], Accessor &styler) {
char lineBuffer[10000];
styler.StartAt(startPos);
styler.StartSegment(startPos);
unsigned int linePos = 0;
[no]//!-start-[FindResultListStyle][/no]
unsigned int startLine = startPos;
bool isFindListStyle = styler.GetPropertyInt([no]"lexer.errorlist.findliststyle"[/no], 0) == 1;
static bool isFindList;
static char findValue[1000];
[no]//!-end-[FindResultListStyle][/no]
for (unsigned int i = startPos; i < startPos + length; i++) {
lineBuffer[linePos++] = styler[i];
if (AtEOL(styler, i) || (linePos >= sizeof(lineBuffer) - 1)) {
[no]// End of line (or of line buffer) met, colourise it[/no]
lineBuffer[linePos] = [no]'\0'[/no];
ColouriseErrorListLine(lineBuffer, linePos, startLine, i, isFindListStyle, isFindList, findValue, styler); [no]//!-change-[FindResultListStyle][/no]
linePos = 0;
startLine = i + 1; [no]//!-add-[FindResultListStyle][/no]
}
}
if (linePos > 0) { [no]// Last line does not have ending characters[/no]
ColouriseErrorListLine(lineBuffer, linePos, startLine, startPos + length - 1, isFindListStyle, isFindList, findValue, styler); [no]//!-change-[FindResultListStyle][/no]
}
}
Данный код внедрен в форум с помощью скрипта vladvro

и задаем стиль для выделения искомого слова
others_.properties строка 152
Код:
[no]# Search value[/no]
style.errorlist.30=fore:#000000,bold
Данный код внедрен в форум с помощью скрипта vladvro

[/more]
Автор: BioInfo, Отправлено:15:59 25-05-2007
vladvro

Цитата:
есть диалог "Вставить сокращение..."

Это я все в курсе, я вообще другую концепцию предлагаю "вставляем аббревиатуры на лету" без гемора и прочих комбинаций клавиш.

Цитата:
значение все равно будет одно, то что было последним (парсер то тотже, что для всех файлов .properties)

Ну, сдесь можно немножечко подпилить или считывать этот файл через скрипт, т.е. вообще не зависимо от редактора.
Кстати если там такой же парсер, то отчего ограничение в 30 символов? Или такое же есть и на properties?

Цитата:
в продолжение модификации результатов поиска

Круто! Если так дальше пойдет, то скоро уже можно будет пользоваться еще и поиском

Цитата:
нет, у меня такого нет, использую FireFox 2.0

аналогично, значит какое-то расширение балуется...
Автор: vladvro, Отправлено:16:12 25-05-2007
BioInfo
Цитата:
я вообще другую концепцию предлагаю "вставляем аббревиатуры на лету"

а... но на мой взгляд, спорное желание, впрочем дело вкуса.

Цитата:
Кстати если там такой же парсер, то отчего ограничение в 30 символов? Или такое же есть и на properties?

а это ограничение в другом месте, на этапе поиска по тексту подходящего под шаблон куска (а то можно долго искать),
кста оно уже давно опциональное:
SciTEGlobal.properties строка 1251
Код:
[no]# Максимальная длинна для сокращений, обрабатываемых по Ctrl+B, если не задана, то = 32 [/no]
[no]# работает только в версии SciTE-Ru (доработка VladVRO)[/no]
abbrev.maximum.length=50
Данный код внедрен в форум с помощью скрипта vladvro

Цитата:
аналогично, значит какое-то расширение балуется...

из дополнений стоит только Google Toolbar

Добавлено:
All
модификация исправляющая дасадное ограничение при поиске по файлам [more=подробнее...]
SciTEIO.cxx строка 1026
Код:
class FileReader {
BufferedFile *bf;
int lineNum;
bool lastWasCR;
enum {bufLen = 1000};
[no]//!-start-[FileReaderbufLen][/no]
char buf[bufLen+1];
SString lineToCompare;
SString lineToShow;
[no]//!-end-[FileReaderbufLen][/no]
bool caseSensitive;
public:

FileReader(FilePath fPath, bool caseSensitive_) {
bf = new BufferedFile(fPath);
lineNum = 0;
lastWasCR = false;
caseSensitive = caseSensitive_;
}
~FileReader() {
delete bf;
bf = NULL;
}
const char *Next() { [no]//!-change-[FileReaderbufLen][/no]
if (bf->Exhausted()) {
return NULL;
}
[no]//!-start-[FileReaderbufLen][/no]
lineToCompare.clear();
lineToShow.clear();
[no]//!-end-[FileReaderbufLen][/no]
int i = 0;
while (!bf->Exhausted()) {
int ch = bf->NextByte();
if (i == 0 && lastWasCR && ch == [no]'\n'[/no]) {
lastWasCR = false;
ch = 0;
} else if (ch == [no]'\r'[/no] || ch == [no]'\n'[/no]) {
lastWasCR = ch == [no]'\r'[/no];
break;
[no]//!-start-[FileReaderbufLen][/no]
} else {
buf[i++] = static_cast<char>(ch);
if (i == bufLen) {
buf[i] = [no]'\0'[/no];
lineToShow += buf;
i = 0;
}
}
}
buf[i] = [no]'\0'[/no];
lineToShow += buf;
[no]//!-end-[FileReaderbufLen][/no]
lineNum++;
[no]/*[/no]
[no] strcpy(lineToCompare, lineToShow);[/no]
[no] if (!caseSensitive) {[/no]
[no] for (int j = 0; j < i; j++) {[/no]
[no] if (lineToCompare[j] >= 'A' && lineToCompare[j] <= 'Z') {[/no]
[no] lineToCompare[j] = static_cast<char>(lineToCompare[j] - 'A' + 'a');[/no]
[no] }[/no]
[no] }[/no]
[no] }[/no]
[no] return lineToCompare;[/no]
[no]*/[/no]
[no]//!-start-[FileReaderbufLen][/no]
lineToCompare = lineToShow;
if (!caseSensitive) {
lineToCompare.lowercase();
}
return lineToCompare.c_str();
[no]//!-end-[FileReaderbufLen][/no]
}
int LineNumber() {
return lineNum;
}
const char *Original() { [no]//!-change-[FileReaderbufLen][/no]
return lineToShow.c_str(); [no]//!-change-[FileReaderbufLen][/no]
}
Данный код внедрен в форум с помощью скрипта vladvro

SciTEIO.cxx строка 1125
Код:
if ((gf & grepBinary) || !fr.BufferContainsNull()) {
while (const char *line = fr.Next()) { [no]//!-change-[FileReaderbufLen][/no]
char *match = strstr(line, searchString);
if (match) {
if (gf & grepWholeWord) {
const char *lineEnd = line + strlen(line); [no]//!-change-[FileReaderbufLen][/no]
Данный код внедрен в форум с помощью скрипта vladvro
[/more]
Автор: vladvro, Отправлено:16:45 26-05-2007
1) после дополнительного тестирования "модификация исправляющая дасадное ограничение" всплыла ошибка
пришлось внести изменения в код

2) после небольших размышлений была сделанна оптимизация для функции ColouriseFindListLine, см. код
Автор: BioInfo, Отправлено:23:31 27-05-2007
Лично мне, весьма не хватает контейнеров и я решил реализовать парочку... Стандартные отчего-то в коде не присутствуют (наверно по идеологическим соображениям), посему я их зафигарил в один файл Containers.h и закинул в scite\src, пользуйтесь на здоровье.
[more=Подробности..]Containers.h
Код:
#ifndef CONTAINERS_H
#define CONTAINERS_H

template<class TYPE, class ARG_TYPE>
class TList
{
protected:
struct Node
{
Node* pNext;
Node* pPrev;
TYPE data;
};
struct __POSITION { };

public:
typedef __POSITION* POSITION;

TList() {
m_nCount = 0;
m_pNodeHead = m_pNodeTail = ((Node *)0);
}

~TList() {
RemoveAll();
}

int GetCount() const {
return m_nCount;
}
bool IsEmpty() const {
return m_nCount == 0;
}

TYPE& GetHead() {
return m_pNodeHead->data;
}
TYPE GetHead() const {
return m_pNodeHead->data;
}
TYPE& GetTail() {
return m_pNodeTail->data;
}
TYPE GetTail() const {
return m_pNodeTail->data;
}

[no]// get head or tail (and remove it) - don't call on empty list ![/no]
TYPE RemoveHead() {
Node* pOldNode = m_pNodeHead;
TYPE returnValue = pOldNode->data;

m_pNodeHead = pOldNode->pNext;
if (m_pNodeHead != ((Node *)0))
m_pNodeHead->pPrev = ((Node *)0);
else
m_pNodeTail = ((Node *)0);
FreeNode(pOldNode);
return returnValue;
}
TYPE RemoveTail() {
Node* pOldNode = m_pNodeTail;
TYPE returnValue = pOldNode->data;

m_pNodeTail = pOldNode->pPrev;
if (m_pNodeTail != ((Node *)0))
m_pNodeTail->pNext = ((Node *)0);
else
m_pNodeHead = ((Node *)0);
FreeNode(pOldNode);
return returnValue;
}

[no]// add before head or after tail[/no]
POSITION AddHead(ARG_TYPE newElement) {
Node* pNewNode = NewNode(((Node *)0), m_pNodeHead);
pNewNode->data = newElement;
if (m_pNodeHead != ((void *)0))
m_pNodeHead->pPrev = pNewNode;
else
m_pNodeTail = pNewNode;
m_pNodeHead = pNewNode;
return (POSITION) pNewNode;
}
POSITION AddTail(ARG_TYPE newElement) {
Node* pNewNode = NewNode(m_pNodeTail, ((Node *)0));
pNewNode->data = newElement;
if (m_pNodeTail != ((Node *)0))
m_pNodeTail->pNext = pNewNode;
else
m_pNodeHead = pNewNode;
m_pNodeTail = pNewNode;
return (POSITION) pNewNode;
}

[no]// remove all elements[/no]
void RemoveAll() {
[no]// destroy elements[/no]
Node* pNode = m_pNodeHead;
while (pNode) {
m_pNodeTail = pNode->pNext;
delete pNode;
pNode = m_pNodeTail;
}
m_nCount = 0;
m_pNodeHead = m_pNodeTail = ((Node *)0);
}

[no]// iteration[/no]
POSITION GetHeadPosition() const {
return (POSITION) m_pNodeHead;
}
POSITION GetTailPosition() const {
return (POSITION) m_pNodeTail;
}
TYPE& GetNext(POSITION& rPosition) { [no]// return *Position++[/no]
Node* pNode = (Node*) rPosition;
rPosition = (POSITION) pNode->pNext;
return pNode->data;
}
TYPE GetNext(POSITION& rPosition) const { [no]// return *Position++[/no]
Node* pNode = (Node*) rPosition;
rPosition = (POSITION) pNode->pNext;
return pNode->data;
}
TYPE& GetPrev(POSITION& rPosition) { [no]// return *Position--[/no]
Node* pNode = (Node*) rPosition;
rPosition = (POSITION) pNode->pPrev;
return pNode->data;
}
TYPE GetPrev(POSITION& rPosition) const { [no]// return *Position--[/no]
Node* pNode = (Node*) rPosition;
rPosition = (POSITION) pNode->pPrev;
return pNode->data;
}

[no]// getting/modifying an element at a given position[/no]
TYPE& GetAt(POSITION position) {
Node* pNode = (Node*) position;
return pNode->data;
}
TYPE GetAt(POSITION position) const {
Node* pNode = (Node*) position;
return pNode->data;
}
void SetAt(POSITION pos, ARG_TYPE newElement) {
Node* pNode = (Node*) pos;
pNode->data = newElement;
}
void RemoveAt(POSITION position) {
Node* pOldNode = (Node*) position;
[no]// remove pOldNode from list[/no]
if (pOldNode == m_pNodeHead)
m_pNodeHead = pOldNode->pNext;
else
pOldNode->pPrev->pNext = pOldNode->pNext;
if (pOldNode == m_pNodeTail)
m_pNodeTail = pOldNode->pPrev;
else
pOldNode->pNext->pPrev = pOldNode->pPrev;
FreeNode(pOldNode);
}

[no]// inserting before or after a given position[/no]
POSITION InsertBefore(POSITION position, ARG_TYPE newElement) {
if (position == ((void *)0))
return AddHead(newElement); [no]// insert before nothing -> head of the list[/no]
[no]// Insert it before position[/no]
Node* pOldNode = (Node*) position;
Node* pNewNode = NewNode(pOldNode->pPrev, pOldNode);
pNewNode->data = newElement;
if (pOldNode->pPrev != ((Node *)0))
pOldNode->pPrev->pNext = pNewNode;
else
m_pNodeHead = pNewNode;
pOldNode->pPrev = pNewNode;
return (POSITION) pNewNode;
}
POSITION InsertAfter(POSITION position, ARG_TYPE newElement) {
if (position == ((void *)0))
return AddTail(newElement); [no]// insert after nothing -> tail of the list[/no]
[no]// Insert it before position[/no]
Node* pOldNode = (Node*) position;
Node* pNewNode = NewNode(pOldNode, pOldNode->pNext);
pNewNode->data = newElement;
if (pOldNode->pNext != ((Node *)0))
pOldNode->pNext->pPrev = pNewNode;
else
m_pNodeTail = pNewNode;
pOldNode->pNext = pNewNode;
return (POSITION) pNewNode;
}

[no]// helper functions (note: O(n) speed)[/no]
[no]// defaults to starting at the HEAD, return NULL if not found[/no]
POSITION Find(ARG_TYPE searchValue, POSITION startAfter = (POSITION)0) const {
Node* pNode = (Node*) startAfter;
if (pNode == ((Node *)0))
pNode = m_pNodeHead; [no]// start at head[/no]
else
pNode = pNode->pNext; [no]// start after the one specified[/no]
for (; pNode != ((Node *)0); pNode = pNode->pNext)
if (pNode->data==searchValue)
return (POSITION)pNode;
return ((POSITION)0);
}
[no]// get the 'nIndex'th element (may return NULL)[/no]
POSITION FindIndex(int nIndex) const {
if (nIndex >= m_nCount || nIndex < 0)
return (POSITION)0; [no]// went too far[/no]
Node* pNode = m_pNodeHead;
while (nIndex--)
pNode = pNode->pNext;
return (POSITION) pNode;
}

protected:
Node* m_pNodeHead;
Node* m_pNodeTail;
int m_nCount;

Node* NewNode(Node* pPrev, Node* pNext) {
Node* pNode = new Node;
pNode->pPrev = pPrev;
pNode->pNext = pNext;
m_nCount++;
return pNode;
}
void FreeNode(Node*pNode) {
delete pNode;
m_nCount--;
[no]// if no more elements, cleanup completely[/no]
if (m_nCount == 0)
RemoveAll();
}
};

template<class TYPE, class ARG_TYPE>
class TArray
{
public:
TArray() {};

int GetSize() const {
return m_ArrayData.GetCount();
}

[no]// Clean up[/no]
void RemoveAll() {
return m_ArrayData.RemoveAll();
}

[no]// Accessing elements[/no]
TYPE GetAt(int nIndex) const {
return m_ArrayData.GetAt(m_ArrayData.FindIndex(nIndex));
}
TYPE& ElementAt(int nIndex) {
return m_ArrayData.GetAt(m_ArrayData.FindIndex(nIndex));
}
void SetAt(int nIndex, ARG_TYPE newElement) {
m_ArrayData.SetAt(m_ArrayData.FindIndex(nIndex),newElement);
}

[no]// Potentially growing the array[/no]
int Add(ARG_TYPE newElement) {
m_ArrayData.AddTail(newElement);
return m_ArrayData.GetCount();
}

[no]// overloaded operator helpers[/no]
TYPE operator[](int nIndex) const {
return m_ArrayData.GetAt(m_ArrayData.FindIndex(nIndex));
}
TYPE& operator[](int nIndex) {
return m_ArrayData.GetAt(m_ArrayData.FindIndex(nIndex));
}

[no]// Operations that move elements around[/no]
void InsertAt(int nIndex, ARG_TYPE newElement, int nCount = 1) {
TList<TYPE, ARG_TYPE>::POSITION pos = m_ArrayData.FindIndex(nIndex);
for (int i=0; i<nCount; i++)
m_ArrayData.InsertBefore(pos,newElement);
}
void RemoveAt(int nIndex, int nCount = 1) {
for (int i=0; i<nCount; i++)
m_ArrayData.RemoveAt(m_ArrayData.FindIndex(nIndex));
}

protected:
TList<TYPE, ARG_TYPE> m_ArrayData;
};

#include "SString.h"

typedef TArray<int,int> ArrayInts;
typedef TArray<SString,SString> ArrayStrings;

#endif
Данный код внедрен в форум с помощью скрипта vladvro
[/more]
Потестил немного, вроде работают... Если у кого есть вопросы, поправки, соображения то пишите, т.к. я планирую дальше их использовать в SciTE.

Добавлено:

Цитата:
Цитата:
У-Ж-А-З
Зачем ее цЫклит??

и точно, циклит... занятно... но с ходу не получилось понять почему.


Цитата:
И все бы хорошо (можно запускать и в скрытом виде и с использованием различных режимов и пр. возможностями) да только циклят и -scite.Perform и -scite.MenuCommand по страшному

Я разобрался отчего ее циклит... Да вот все придумать не могу как грамотно пофиксить.
Смысл в том что в аргументах на запуск потока стоит:
1. Запустить поток (выполнить скрипт, скомпилить, собрать и еще несколько команд включая все в Tools)
2. Выполнить действие х
Ну и соответственно стоит такой штуке разок запуститься и капец.
И обнулить тоже никак по сути, т.к. для всех потоков один и тот же набор аргументов (jobQueue)
Могу предложить такое решение: запретить вложенные запуски вообще, т.е. один раз запустится и все.
Тогда нельзя в скрипте будет вызвать scite.MenuCommand 2 раза, может еще чего-то отвалится, но зато вообще не циклит

Ну а второй вариант пока смутно такой: записывать задачи на выполнение в очередь и поток будет брать задачи соответственно из нее (тут как раз пригодятся мои контейнеры)...
Автор: Midas, Отправлено:11:26 28-05-2007
Компиляция SciTE c MinGW:
http://scite.ruteam.ru/scite/kompilyatory/kompilyaciya-scite-s-mingw
Автор: A2User, Отправлено:06:23 29-05-2007
В последней сборке обнаружилась очень неприятная штука. Редактор не понимает абсолютных путей, т.е. если в диалоге открытия файла указать \\server\folder1\...\file.txt - редактор намертво зависает. Очень неудобно, приходится мапить диски. Кто-нибудь знает, как с этим бороться, подскажите пожалуйста.

P.S. Windows XP sp2, SciTE 1.73.40Ru
Автор: vladvro, Отправлено:09:18 29-05-2007
A2User
Цитата:
Редактор не понимает абсолютных путей, т.е. если в диалоге открытия файла указать \\server\folder1\...\file.txt - редактор намертво зависает.

открой глобальный файл настроек и закомментарь следующую строчку:
SciTEGlobal.properties строка 19
Код:
properties.directory.enable=1

Автор: A2User, Отправлено:10:31 29-05-2007
vladvro
Большое человеческое спасибо
Автор: BioInfo, Отправлено:11:33 29-05-2007

Цитата:
Если в файле глобальных настроек выставить position.autosave=1, то файл пользовательских настроек при выходе затирается и в него добавляется информация, касающаяся окошка


Работа над ошибками
Данную неприятность [more=поправил...]Нужно заменить класс:
SciTEWin.cxx строка 32
Код:
[no]//!-start-[position.autosave][/no]
class PropFileEx
{
public:
bool Open(FilePath filename) {
m_filename = filename;
FILE * file = filename.Open(fileRead);
if (file) {
char propsData[100];
int len;
while ( !feof(file) ) {
len = fread(propsData, 1, sizeof(propsData)-1, file);
propsData[len] = [no]'\0'[/no];
m_buf += propsData;
}
fclose(file);
TypeEOL = GetEOLtype(m_buf);
return true;
}
return false;
}

void SetProperty(SString sProperty, int Value) {
char buf[1024] = {0};
sprintf(buf,[no]"%s=%d"[/no], sProperty.c_str(), Value);
int insertPos = m_buf.search(sProperty.c_str());
if (insertPos != -1 ) {
int firstPos = insertPos;
while (firstPos > 0 && m_buf[firstPos-1] != [no]'\n'[/no] && m_buf[firstPos-1] != [no]'\r'[/no] )
firstPos--;
int lastPos = m_buf.search(StringFromEOLMode(TypeEOL), insertPos);
m_buf.remove(firstPos,
lastPos > firstPos ? lastPos - firstPos : m_buf.length() - firstPos);
m_buf.insert(firstPos, buf);
}
else {
if ( !m_buf.endswith(StringFromEOLMode(TypeEOL)) )
m_buf += StringFromEOLMode(TypeEOL);
m_buf += buf;
m_buf += StringFromEOLMode(TypeEOL);
}
}

void Save() {
if (m_filename.IsSet()) {
FILE * file = m_filename.Open(fileWrite);
if (file) {
fwrite(m_buf.c_str(), sizeof(char), m_buf.length(), file);
fclose(file);
}
}
}

SString GetString() {
return m_buf;
}

int GetEOLtype() {
return TypeEOL;
}

public:
static const char *StringFromEOLMode(int eolMode) {
if (eolMode == SC_EOL_CR) return [no]"\r"[/no];
if (eolMode == SC_EOL_LF) return [no]"\n"[/no];
return [no]"\r\n"[/no];
}

static int GetEOLtype(SString &str) {
int linesCR = 0;
int linesLF = 0;
int linesCRLF = 0;

int lengthDoc = str.length();
char chPrev = [no]' '[/no];
for (int i = 0; i < lengthDoc; i++) {
char ch = str[i];
char chNext = str[i + 1];
if (ch == [no]'\r'[/no]) {
(chNext == [no]'\n'[/no]) ? linesCRLF++ : linesCR++;
} else if (ch == [no]'\n'[/no]) {
if (chPrev != [no]'\r'[/no]) linesLF++;
}
chPrev = ch;
}
if (((linesLF >= linesCR) && (linesLF > linesCRLF)) || ((linesLF > linesCR) && (linesLF >= linesCRLF)))
return SC_EOL_LF;
if (((linesCR >= linesLF) && (linesCR > linesCRLF)) || ((linesCR > linesLF) && (linesCR >= linesCRLF)))
return SC_EOL_CR;
return SC_EOL_CRLF;
}

static void ToDesctopRect(RECT &rc){
ToDesctopRect(rc.left, rc.top, rc.right, rc.bottom);
}

static void ToDesctopRect(long &left, long &top, long &right, long &bottom) {
[no]// See if taskbar's autohide property is on[/no]
APPBARDATA abd = {0};
abd.cbSize = sizeof(abd);
if(!(::SHAppBarMessage(ABM_GETSTATE, &abd) & ABS_AUTOHIDE)) {
[no]// Get the taskbar rect[/no]
::SHAppBarMessage(ABM_GETTASKBARPOS, &abd);
switch(abd.uEdge) {
case ABE_TOP:
top += abd.rc.bottom - abd.rc.top;
bottom += abd.rc.bottom - abd.rc.top;
break;
case ABE_LEFT:
left += abd.rc.right - abd.rc.left;
right+= abd.rc.right - abd.rc.left;
break;
}
}
}

private:
int TypeEOL;
SString m_buf;
FilePath m_filename;
};
[no]//!-end-[position.autosave][/no]
Данный код внедрен в форум с помощью скрипта vladvro
[/more]
Автор: iglezz, Отправлено:11:37 30-05-2007

Цитата:
Компиляция SciTE c MinGW:
http://scite.ruteam.ru/scite/kompilyatory/kompilyaciya-scite-s-mingw


А можно ли выложить отдельно то, что к mingw не относится? Или мини how-to сборки скайта с помощью mingw...
Познания мои скудны, а гпрс не позволяет скачать весь архив (дорого)
Автор: alrusdi81, Отправлено:13:26 30-05-2007
http://alrusdi.nm.ru/lua/helloworld.html
http://alrusdi.nm.ru/lua/syntax.html
http://alrusdi.nm.ru/lua/numbers.html
http://alrusdi.nm.ru/lua/strings.html
Моя попытка написать что-нибудь по LUA. Там пока индексного нет - просто разрозненные странички. Стоит продолжать?



1 / 2 / 3 / 4 / 5 / 6 / 7 / 8 / 9 / 10 / 11 / 12 / 13 / 14 / 15 / 16 / 17 / 18 / 19 / 20 / 21 / 22 / 23 / 24 / 25 / 26 / 27 / 28 / 29 / 30 / 31 / 32 / 33 / 34 / 35 / 36 / 37 / 38 / 39 / 40 / 41 / 42 / 43 / 44 / 45 / 46 / 47 / 48 / 49 / 50 / 51 / 52 / 53 / 54 / 55 / 56 / 57 / 58 / 59 / 60 / 61 / 62 / 63 / 64 / 65 / 66 / 67 / 68 / 69 / 70 / 71 / 72 / 73 / 74 / 75 / 76 / 77 / 78 / 79 / 80 / 81 / 82 / 83 / 84 / 85 / 86 / 87 / 88 / 89 / 90 / 91 / 92 / 93 / 94 / 95 / 96 / 97 / 98 / 99 / 100 / 101 / 102 / 103 / 104 / 105 / 106 / 107 / 108 / 109 / 110 / 111 / 112 / 113 / 114 / 115 / 116 / 117 / 118 / 119 / 120 / 121 / 122 / 123 / 124 / 125 / 126 / 127 / 128 / 129 / 130 / 131 / 132 / 133 / 134 / 135 / 136 / 137 / 138 / 139 / 140 / 141 / 142 / 143 / 144 / 145 / 146 / 147 / 148 / 149 / 150 / 151 / 152 / 153 / 154 / 155 / 156 / 157 / 158 / 159 / 160 / 161 / 162 / 163 / 164 / 165 / 166 / 167 / 168 / 169 / 170 / 171 / 172 / 173 / 174 / 175 / 176 / 177 / 178 / 179 / 180 / 181 / 182 / 183 / 184 / 185 / 186 / 187 / 188 / 189 / 190 / 191 / 192 / 193 / 194 / 195 / 196 / 197 / 198 / 199 / 200 / 201 / 202 / 203 / 204 / 205 / 206 / 207 / 208 / 209 / 210 / 211 / 212 / 213 /
SciTE © 2004 - 2011