[Решено] synedit и русский
Модератор: Модераторы
[Решено] synedit и русский
Можно ли добавить русские слова для подсветки?
Решил для начала тупо подправить Syn Sql highliter но русские сочетания добавленные в него не понимает... английские добавленные понимает...
начал смотреть там есть функция которая говорит какие символы принимать...и тип char
тоесть я так понимаю что научить ее русскому нереально???
Добавлено спустя 4 часа 21 минуту 42 секунды:
Добавил поддержку русского в SynHighlighterAny
Решил для начала тупо подправить Syn Sql highliter но русские сочетания добавленные в него не понимает... английские добавленные понимает...
начал смотреть там есть функция которая говорит какие символы принимать...и тип char
тоесть я так понимаю что научить ее русскому нереально???
Добавлено спустя 4 часа 21 минуту 42 секунды:
Добавил поддержку русского в SynHighlighterAny
Re: [Решено] synedit и русский
А потом при обновлении Лазаруса будете каждый раз менять код исходников?
При обновлении Лазаруса, все Ваши переделки, на анси кодировку, вернуться обратно.
Там кстати, можно вместо анси кодировки, заменить всё на массив и тогда сохранится кодировка UTF-8.
.
При обновлении Лазаруса, все Ваши переделки, на анси кодировку, вернуться обратно.
Там кстати, можно вместо анси кодировки, заменить всё на массив и тогда сохранится кодировка UTF-8.
.
Re: [Решено] synedit и русский
хм а есть пример? для замены на массив не очень понял как
-
LearnMagic
- новенький
- Сообщения: 66
- Зарегистрирован: 10.11.2016 22:13:38
Re: [Решено] synedit и русский
Если речь идет о таком, то достаточно сделать наследник от TSynCustomHighlighter и
установить свойство SynEdit.Higlighter
Код: Выделить всё
TSynMySyn = class(TSynCustomHighlighter)
protected
function GetIdentChars: TSynIdentChars; override;
end;
function TSynMySyn.GetIdentChars: TSynIdentChars;
begin
Result := TSynValudStringChars;
end;
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Re: [Решено] synedit и русский
Я не помню точно код, как там, но я тогда делал и оно работало, а потом на меня все программисты накричали,
что исходники править нельзя и тогда мне пришлось делать код в юните.
А суть кода была такой же, просто массив меняете:
что исходники править нельзя и тогда мне пришлось делать код в юните.
А суть кода была такой же, просто массив меняете:
Код: Выделить всё
Const arrayOfBukv = ('А', 'Б', 'В','Г','Д' ИТД, ВЕСЬ МАССИВ РУССКИХ и БУРЖУЙСКИХ БУКВ);
countOfArray := length( arrayOfBukv ); // могу ошибиться полгода работал с PHP
for (i:=0; i<countOfArray; i++) do
if arrayOfBukv[i] = iskomoe then begin
// короче здесь тот же самый код что при переборе char-ов в исходниках SynHighlighterAny, там где Вы меняли код,
// только теперь Вы уже перебираете массив букв в кодировке UTF-8.
end;
Re: [Решено] synedit и русский
Гм а разве Cи-шный цикл for (i:=0; i<countOfArray; i++) do в Лазарусе работает ?
Если да то это не слабый прикол ... 
Re: [Решено] synedit и русский
Alex2013 писал(а):Гм а разве Cи-шный цикл for (i:=0; i<countOfArray; i++) do в Лазарусе работает ? Если да то это не слабый прикол ...
Это не Cи-шный цикл, это цикл из PHP
.
Re: [Решено] synedit и русский
да я понял, спасибо! пока переделывать не планирую. Система для которой пишу только cp1251 понимает все равно )))
там много глюков кроме этого - например если вставляешь в synedit не в той кодировке. то подвисает все и т.п.
там много глюков кроме этого - например если вставляешь в synedit не в той кодировке. то подвисает все и т.п.
Re: [Решено] synedit и русский
поправил SynComplition для поддержки русских букв. например если вызвано автодополнение и начинаешь набирать "пере" и далее из списка выбираешь "перестраховщик" то получалось "переперестраховщик".
Нашел где косяк. Исправил. там суть какая он передавал в определение буква это или нет со смещением в -1 а если буква русская например, то все равно смещал -1 а нужно уже -2. и соответсвенно он не распознавал что это буква и выходил из цикла.
я поправил - но не знаю может коряво...
хорошо бы кто проверил и можно было бы внести в апстрим
Нашел где косяк. Исправил. там суть какая он передавал в определение буква это или нет со смещением в -1 а если буква русская например, то все равно смещал -1 а нужно уже -2. и соответсвенно он не распознавал что это буква и выходил из цикла.
я поправил - но не знаю может коряво...
хорошо бы кто проверил и можно было бы внести в апстрим
Код: Выделить всё
Function UTF8ReverseString(const AText: string): string;
var
i,j:longint;
begin
i:=0;
j:=UTF8Length(atext);
while (i<=j) do
begin
result := result + UTF8Copy(atext,j-i,1);
inc(i);
end;
end;
procedure TSynCompletion.Validate(Sender: TObject; KeyChar: TUTF8Char;
Shift: TShiftState);
var
F: TSynBaseCompletionForm;
Value, CurLine: string;
NewBlockBegin, NewBlockEnd: TPoint;
LogCaret: TPoint;
HighlighterIdentChars: TSynIdentChars;
pos: integer;
utf8Str : String;
i: integer;
begin
//debugln('TSynCompletion.Validate ',dbgsName(Sender),' ',dbgs(Shift),' Position=',dbgs(Position));
F := Sender as TSynBaseCompletionForm;
// Note: Form.Visible can be false, for example when completion only contains one item
if F.CurrentEditor is TCustomSynEdit then
with TCustomSynEdit(F.CurrentEditor) do begin
BeginUndoBlock{$IFDEF SynUndoDebugBeginEnd}('TSynCompletion.Validate'){$ENDIF};
BeginUpdate;
try
if Editor.Highlighter<>nil then
HighlighterIdentChars := Editor.Highlighter.IdentChars
else
HighlighterIdentChars := [];
LogCaret := LogicalCaretXY;
NewBlockBegin:=LogCaret;
CurLine:=Lines[NewBlockBegin.Y - 1];
utf8Str := UTF8ReverseString(Copy(CurLine,1,NewBlockBegin.X-1)); //Реверсируем строку
i:=1;
while (i<=length(utf8Str))
and ((IsIdentifierChar(@utf8Str[i]))
or (utf8Str[i] in HighlighterIdentChars))
do
begin
pos:= UTF8CharacterLength(@utf8Str[i]); // Length(Copy(CurLine, NewBlockEnd.X ,1)) ; //Определяем приращение
inc(i,pos); //Приращиваем
end;
NewBlockBegin.X := NewBlockBegin.X - i + 1 ; //Уменьшаем изменяем начальный символ
//BlockBegin:=NewBlockBegin;
if ssShift in Shift then begin
// replace only prefix
NewBlockEnd := LogCaret;
end else begin
// replace the whole word
NewBlockEnd := LogCaret;
CurLine:=Lines[NewBlockEnd.Y - 1];
while (NewBlockEnd.X<=length(CurLine))
and ((IsIdentifierChar(@CurLine[NewBlockEnd.X]))
or (CurLine[NewBlockEnd.X] in HighlighterIdentChars))
do
begin
pos:= UTF8CharacterLength(@CurLine[NewBlockEnd.X]); // Length(Copy(CurLine, NewBlockEnd.X ,1)) ; //Определение на сколько приращивать
inc(NewBlockEnd.X,pos); //Прирастили на нужную длинну
end
end;
//debugln('TSynCompletion.Validate B Position=',dbgs(Position));
if Position>=0 then begin
if Assigned(FOnCodeCompletion) then
begin
Value := ItemList[Position];
FOnCodeCompletion(Value, TextBetweenPoints[NewBlockBegin, NewBlockEnd],
NewBlockBegin, NewBlockEnd, KeyChar, Shift);
if (CompareCarets(NewBlockBegin, NewBlockEnd) <> 0) or (Value <> '') then
begin
TextBetweenPointsEx[NewBlockBegin, NewBlockEnd, scamEnd] := Value;
TCustomSynEdit(F.CurrentEditor).SetFocus;
end;
end else begin
TextBetweenPointsEx[NewBlockBegin, NewBlockEnd, scamEnd] := ItemList[Position];
TCustomSynEdit(F.CurrentEditor).SetFocus;
end;
end
else
if (ItemList.Count = 0) then
Cancel(Sender);
finally
EndUpdate;
EndUndoBlock{$IFDEF SynUndoDebugBeginEnd}('TSynCompletion.Validate'){$ENDIF};
end;
end;
end; 