Ru-Board.club
← Вернуться в раздел «Программы»

» SciTE - Open Source Text Editor for Windows & Linux

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


Добавлено:
нашел почему:
SciTEIO.cxx строка 1026
Код: class FileReader {
BufferedFile *bf;
int lineNum;
bool lastWasCR;
enum {bufLen = 1000};
char lineToCompare[bufLen+1];
Автор: BioInfo
Дата сообщения: 24.05.2007 16:24
Ну, решение в лоб: 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
Дата сообщения: 24.05.2007 17:34

Цитата:
а зачем, если есть сессии?
Затем, что это разные вещи. Сессии - это сессии, грузятся из текущего каталога, если я не ошибаюсь, а любимые файлы - это специально любимые файлы, доступные всегда и отовсюду.
Автор: mozers
Дата сообщения: 24.05.2007 20:42
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
Дата сообщения: 25.05.2007 04:24

Цитата:
Есть такой скрипт.
И то правда. Если не упираться в меню File, то проще с нуля написать несчастные 6 строк на Луа.
Автор: BioInfo
Дата сообщения: 25.05.2007 06:14
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
Дата сообщения: 25.05.2007 10:05
BioInfo
Цитата:
Нет, нужно именно abbrev. Апи то вроде уже выводится? Или я чегото не догоняю... Написал функцию, поставил точку выпадает список - все работает
Все это работает не за счет встроенного функционала SciTE, а за счет внешнего скрипта AutocompleteObject.lua. Там алгоритм совершенно другой. Если autocompleteword.automatic=1 (встроенный функционал SciTE) после каждого введенного символа ищет в текущем тексте варианты автодополнения, то скрипт ищет не дополнение для слова, а конкретно операторы перечисленные в api файле.
Как из *.abbrev выводить "список вариантов" ??? Там же их - нет! Каждому сокращению соответствует только один вариант полной конструкции.
Поэтому если и можно что то сделать, то только - одно: Расширить (обязательно опционально) функционал autocompleteword.automatic=1, чтобы он варианты не только из текущего текста брал, а и в язык.api заглядывал.

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

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

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

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

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

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

Ну и заодно в abbrev


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

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

З.Ы. Не у кого нет такой проблемы, делаю ctrl+v (вставку) в форму для постинга на форум, автоматически нажимается отправить? Третий раз такая борода...
Автор: vladvro
Дата сообщения: 25.05.2007 13:56
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
Автор: BioInfo
Дата сообщения: 25.05.2007 14:59
vladvro

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

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

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

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

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

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

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

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

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

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

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

2) после небольших размышлений была сделанна оптимизация для функции ColouriseFindListLine, см. код
Автор: BioInfo
Дата сообщения: 27.05.2007 22:31
Лично мне, весьма не хватает контейнеров и я решил реализовать парочку... Стандартные отчего-то в коде не присутствуют (наверно по идеологическим соображениям), посему я их зафигарил в один файл 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
Автор: Midas
Дата сообщения: 28.05.2007 10:26
Компиляция SciTE c MinGW:
http://scite.ruteam.ru/scite/kompilyatory/kompilyaciya-scite-s-mingw
Автор: A2User
Дата сообщения: 29.05.2007 05:23
В последней сборке обнаружилась очень неприятная штука. Редактор не понимает абсолютных путей, т.е. если в диалоге открытия файла указать \\server\folder1\...\file.txt - редактор намертво зависает. Очень неудобно, приходится мапить диски. Кто-нибудь знает, как с этим бороться, подскажите пожалуйста.

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

открой глобальный файл настроек и закомментарь следующую строчку:
SciTEGlobal.properties строка 19
Код: properties.directory.enable=1
Автор: A2User
Дата сообщения: 29.05.2007 09:31
vladvro
Большое человеческое спасибо
Автор: BioInfo
Дата сообщения: 29.05.2007 10:33

Цитата:
Если в файле глобальных настроек выставить 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]
Автор: iglezz
Дата сообщения: 30.05.2007 10:37

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


А можно ли выложить отдельно то, что к mingw не относится? Или мини how-to сборки скайта с помощью mingw...
Познания мои скудны, а гпрс не позволяет скачать весь архив (дорого)
Автор: alrusdi81
Дата сообщения: 30.05.2007 12:26
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. Там пока индексного нет - просто разрозненные странички. Стоит продолжать?
Автор: BioInfo
Дата сообщения: 30.05.2007 12:42
alrusdi81

Цитата:
Моя попытка написать что-нибудь по LUA.
Стоит продолжать?


Ну естественно стоит! Что за вопрос?
Скрипты главное пиши, для тренеровки хотябы - будем расширять функционал SciTE.
Какие скрипты нужны я написал выше.
Вобщем: ждем, любим, ценим и т.д. и т.п.

Добавлено:
Смастерил вот такой тулбарчик (а точнее иконки):

Всего 30 команд.
Набор для следующих команд (по порядку в исходном битмапе):
Создать, Открыть, Сохранить, Печать, Вырезать, Копировать, Вставить,
Удалить, Отменить, Повторить, Найти, Заменить, Закрыть, проиграть
скрипт, остановить скрипт, записать скрипт, Выполнить, Собрать,
Компилировать, Отобразить непечатные символы (Вид->Пробелы),
Сохранить как, Кодировка Х, Только для чтения, Выполнить команду в
консоли MS-DOS, Полноэкранный режим, Справка, Настройка1, Настройка2,
Настройка3, Настройка4, Перенос по словам.
Нумерация от 0 до 29
Ну и ссылка на сам buttons.bmp вот.
Как говорится, выставляю на суд благородной общественности.
З.Ы. Иконки "позаимствованы" у gnome, часть я переработал, некоторые вообще сделал сам, но на основе этой библиотеки.
Автор: azzzis
Дата сообщения: 31.05.2007 08:30
BioInfo

Цитата:
Смастерил вот такой тулбарчик


Здоровские кнопочки! Только вот как подключить их?

И еще... никак не могу разобраться с кодировками... Если ставлю по умолчанию utf-8, а я работаю почти только с ней, не могу редактировать файлы в cp1251, то есть когда открываешь файл в этой кодировке, он по умолчанию открывается как Code Page Property и переделать его в cp1251 никак не могу.

Хорошо бы написать сишный модуль, который взял на себя полностью работу с кодировками, например как это работает в komodo.
Автор: AltTab
Дата сообщения: 31.05.2007 10:06
BioInfo

Цитата:
Ну и ссылка на сам buttons.bmp вот.


Красивейшая тема! Вот только ссылка ведет на старый тулбар Ну тот, который со старыми иконками
Автор: BioInfo
Дата сообщения: 31.05.2007 10:50
azzzis

Цитата:
Здоровские кнопочки! Только вот как подключить их?

Пока только пересобрать SciTE
Нужно будет еще заменить в коде:
SciTEWinBar.cxx строка 900
Код: TBADDBITMAP addbmp = { hInstance, IDR_BUTTONS };
::SendMessage(hwndToolBar, TB_ADDBITMAP, 30, (LPARAM)&addbmp);
Автор: vladvro
Дата сообщения: 31.05.2007 12:36
alrusdi81
Цитата:
Моя попытка написать что-нибудь по LUA. Там пока индексного нет - просто разрозненные странички. Стоит продолжать?

Замечательно , продолжать стоит.
небольшие замечания:
1. по helloworld.html
Код: editor:SelectAll() [no]-- выбираем весь текст в редакторе[/no]
ourEditorContentVariable=editor:GetSelText() [no]-- копируем выбранный текст в переменную [/no]
dostring(ourEditorContentVariable) [no]-- выполняем строку как код LUA[/no]
editor:ReplaceSel(ourEditorContentVariable) [no]-- очищаем выделение текста в редакторе[/no]
Автор: mozers
Дата сообщения: 31.05.2007 13:31
alrusdi81
Какое прелестное начало ПОЗДРАВЛЯЮ
Конечно, такое дело обязательно стоит продолжить!
Было бы просто великолепно эти странички перенести на scite.ruteam.ru
Зарегистрироваться там можно совершенно свободно и размещай ко всеобщей радости любые полезные материалы, только в форуме не забывай оставлять ссылку на них (интересно же).
Мне кажется что и комментарии к отдельным статьям (особенно, такие существенные как сделал vladvro) там смотрелись бы более логично...
Прочитал человек статью, ознакомился тут же с комментариями, и стал намного умнее ))
Автор: azzzis
Дата сообщения: 31.05.2007 15:10
BioInfo

Цитата:
А файлы в юникоде SciTE вроде нормально открывает, распознает...

Открывает нормально файлы в UTF только с заголовком BOM, для остальных нужно выбирать кодировку (это если в global.properties стоит по умолчанию cp1251), а если по умолчанию UTF, то файлы в кодировке cp1251 как открыть и отредактировать?
Автор: BioInfo
Дата сообщения: 31.05.2007 19:48
azzzis
А зачем нужно было вообще кодировку по умолчанию такую ставить?
Для новых файлов?
Может быть тогда кто-нить скрипт напишет, чтобы новые файлы запускал в кодировке UTF... Думаю такое возможно.
Автор: azzzis
Дата сообщения: 01.06.2007 00:28
BioInfo

Цитата:
А зачем нужно было вообще кодировку по умолчанию такую ставить?


Я работаю в основном с юникодом и если не поставить по умолчанию utf, тогда для каждого файлика после открытия (или перезапуска скайта) придется выбирать в меню кодировку UTF-8, что очень утомительно. Было бы здорово если бы при открытии файла была бы возможность выбирать кодировку, потом после открытия менять для каждого файла в отдельности и наконец, чтобы кодировка для файла сохранялась в сессию, чтобы открыв по новой скайт все файлы были в нужных нам кодировках.
Вот это было бы идеально! А самое главное нужно и важно для многих веб-програмеров и не только!

Добавлено:
Только не предлагайте мне сохранять файлы в UTF с заголовком BOM, некоторые броузеры (IE к примеру) не понимают заголовка, IE например впадает в quirks mode.
Автор: vladvro
Дата сообщения: 01.06.2007 07:53
azzzis
есть два простых варианта решения для веб-файлов
1. обычно в таких файлах в тексте присутствует задание кодировки:
Content-Type: text/html; charset=UTF-8
в этом случае прекрасно работает вот такой скрипт:
html_in_utf8.lua
Код: [no]--[[[/no]
[no]Автоматическое переключение кодировки в UTF-8 для файлов содержащих:[/no]
[no] Content-Type: text/html; charset=UTF-8[/no]
[no]Автор: VladVRO[/no]

[no]Подключение:[/no]
[no]В файл SciTEStartup.lua добавить строку:[/no]
[no] require ("html_in_utf8.lua")[/no]
[no]]][/no]
[no]--++++++++++++++++++++++++++++++++++++++++++++++++++++++++[/no]

local old_OnOpen = OnOpen
function OnOpen (filename)
local result
if old_OnOpen then result = old_OnOpen(filename) end

if string.find(props[[no]"file.patterns.html"[/no]], props[[no]"FileExt"[/no]]) ~= nil then
if editor:findtext([no]"Content-Type: text/html; charset=UTF-8"[/no], SCFIND_POSIX, 0) then
scite.MenuCommand([no]"IDM_ENCODING_UCOOKIE"[/no])
end
end

return result
end

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869

Предыдущая тема: LeechGet


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.