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

» SciTE - Open Source Text Editor for Windows & Linux

Автор: mozers
Дата сообщения: 08.11.2006 10:15
codewarlock1101
Знаю Я вот как исправить - нет (( Поглядите FontChanger.lua - может у кого и получится без применения тяжелой артиллерии...

CurrentWord - это так, прозапас
Автор: codewarlock1101
Дата сообщения: 08.11.2006 10:57
mozers
Лови!

Код:
-- Смена текущих установок шрифта
-- C блеском заменяет Ctrl+F11.
-- Действует одновременно на все отрытые буфера
-- Можно задать любые комбинации шрифтов
-- mozers™ icq#256106175 (выполняя пожелание Moon_aka_Sun)

-- Для подключения добавьте в свой файл .properties наборы необходимых шрифтов (font.0.* и font.1.*)
------------------------------------------------
function FontChange()
if props["font.set"] ~= "1" then
props["font.base"] = props["font.1.base"]
props["font.small"] = props["font.1.small"]
props["font.comment"] = props["font.1.comment"]
props["font.set"] = "1"
else
props["font.base"] = props["font.0.base"]
props["font.small"] = props["font.0.small"]
props["font.comment"] = props["font.0.comment"]
props["font.set"] = "0"
end
editor.Zoom = editor.Zoom
end

-- Добавляем свой обработчик события, возникающего при вызове пункта меню "Use Monospaced Font"
local old_OnMenuCommand = OnMenuCommand
function OnMenuCommand (msg, source)
local result=true
if old_OnMenuCommand then result = old_OnMenuCommand(msg, source) end
if msg == 450 then --IDM_MONOFONT
FontChange()
end
return result
end
Автор: mozers
Дата сообщения: 08.11.2006 12:10
codewarlock1101
Эээ..., дарагой, ты - неправ.
Ты убрал return "" и поэтому скрипт возвращает управление Скайту. В результате выполняется не то, что задумано, а срабатывает стандартная команда IDM_MONOFONT
Автор: codewarlock1101
Дата сообщения: 08.11.2006 12:13
mozers
Че-то не понял... Работает же!
Автор: mozers
Дата сообщения: 08.11.2006 15:40
codewarlock1101
Ну мы поняли друг друга Объясню для остальных:
Скрипты, приведенные codewarlock1101 прекрасно работают будучи запущенными из меню Tools (тогда код "Добавляем свой обработчик события..." можно вообще из них убирать).
Но вот если их навешивать вместо стандартных событий (в данном случае вместо IDM_MONOFONT) то надо серьезно озадачиваться тем, что вернет скрипт по результату своей работы.
В данном конкретном случае (подмены события OnMenuCommand), если скрипт не будет возвращать пустую строку "" то после выполнения этого скрипта, выполнится еще до кучи и стандартная команда IDM_MONOFONT и изуродует результаты его работы
Автор: codewarlock1101
Дата сообщения: 08.11.2006 16:20
mozers
А вот это уж точно работает как надо!!!! [[Тебе на заметку - return "" -- все же не причем ]]

Код:
-- Смена текущих установок шрифта
-- C блеском заменяет Ctrl+F11.
-- Действует одновременно на все отрытые буфера
-- Можно задать любые комбинации шрифтов
-- mozers™ icq#256106175 (выполняя пожелание Moon_aka_Sun)

-- Для подключения добавьте в свой файл .properties наборы необходимых шрифтов (font.0.* и font.1.*)
------------------------------------------------
local function FontChange()

if props["font.set"]=="" then props["font.set"]="0" end
local nxt_font=string.char(string.byte(props["font.set"])+1)
if props["font."..nxt_font..".base"]=="" then
nxt_font="0"
end
props["font.base"] = props["font."..nxt_font..".base"]
props["font.small"] = props["font."..nxt_font..".small"]
props["font.comment"] = props["font."..nxt_font..".comment"]
props["font.set"]=nxt_font

end

-- Добавляем свой обработчик события, возникающего при вызове пункта меню "Use Monospaced Font"
local enable_idm=true
local old_OnMenuCommand = OnMenuCommand
function OnMenuCommand (msg, source)
local result=false
if old_OnMenuCommand then result = old_OnMenuCommand(msg, source) end
if enable_idm==true and msg == 450 then --IDM_MONOFONT
FontChange()
enable_idm=false
scite.MenuCommand("IDM_MONOFONT")
enable_idm=true
end
return result
end

Автор: vladvro
Дата сообщения: 08.11.2006 16:43
mozers,codewarlock1101
друзья мои, хватит народ вводить в заблуждение!
mozers-у я уже писал, теперь повторю для всех:
все обработчики кроме OnSendEditor на выходе ожидают булевское значение handled, и если оно равно true, то если есть дальнейшая обработка, то она не делается, причем nil, которое возвращается по умолчанию, приравнивается к false, в случае с OnSendEditor - на выходе ожидается текстовое значение, и если оно не NULL, то тогда прекращается дальнейшая обработка, причем нюанс нынешней реализации состоит в том, что в NULL превращается не только nil, но и булевские значения (false и true)!
Автор: codewarlock1101
Дата сообщения: 08.11.2006 16:50
а теперь следующий косяк! - подсветка фона определенная для ключевых слов и выражений, не показывается сразу после открытия файла (например string.gsub и подобный сининьким выделяются). А нормально начинает прорисовыватсья только после действий (типа zoom +-, или monofont). Нахимичено в ReadOnly.lua -- отключаешь - и все нормально

Добавлено:
vladvro
Что-то доходит до меня как до жирафа.... Если можешь - дай пожалуйста объяснения на примере.
1) Что значит на "выходе ожидают"???
Есть код:
local old_OnOpen = OnOpen
function OnOpen(file)
local result
if old_OnOpen then result = old_OnOpen(file) end
if props['FileNameExt'] == 'SciTEGlobal.properties' then
props['fold.compess'] = '0'
end
return result
end

красным - вызывает предыдущий обработчик, верно? ну и как он реагирует на результат? Один фих - следующие строки сработают.... и этот же результат он вернет в обработчик, которы его так же, в свою очередь перегрузил.... И так же нифига result не повлияет на ход событий...
Лучше даже, если сможешь привести наглядный пример, и объясни плиз как работает перегрузка обработчиков
Автор: mozers
Дата сообщения: 08.11.2006 20:22
codewarlock1101
Цитата:
А вот это уж точно работает как надо!!!!

Неа. Не работает. Ты бы хоть проверил перед публикацией...
Единственное, что действительно принимается - это идея с nxt_font. Вот - действительно рабочий и проверенный вариант: [more]
Код: -- Смена текущих установок шрифта
-- C блеском заменяет Ctrl+F11.
-- Действует одновременно на все отрытые буфера, циклически переключая заданные наборы шрифтов
-- Можно задать любое количество комбинаций шрифтов
-- mozers, codewarlock1101

-- Для подключения добавьте в свой файл .properties наборы необходимых шрифтов (font.0.*, font.1.*, font.2.*,...)
------------------------------------------------
local function FontChange()
if props["font.set"]=="" then
props["font.set"]="0"
end
local nxt_font=string.char(string.byte(props["font.set"])+1)
if props["font."..nxt_font..".base"]=="" then
nxt_font="0"
end
props["font.base"] = props["font."..nxt_font..".base"]
props["font.small"] = props["font."..nxt_font..".small"]
props["font.comment"] = props["font."..nxt_font..".comment"]
props["font.set"]=nxt_font
scite.MenuCommand("IDM_PREVFILE") scite.MenuCommand("IDM_NEXTFILE") -- used for updates current buffer
return true
end

-- Добавляем свой обработчик события, возникающего при вызове пункта меню "Use Monospaced Font"
local old_OnMenuCommand = OnMenuCommand
function OnMenuCommand (msg, source)
local result
if old_OnMenuCommand then result = old_OnMenuCommand(msg, source) end
if msg == 450 then --IDM_MONOFONT
if FontChange() then return true end
end
return result
end
Автор: unreal666
Дата сообщения: 09.11.2006 01:33
mozers

Цитата:
А во-вторых нашел свою багу и прибил

Слава богу. А то у меня с твоим предыдущим вариантом в nncron-файлах подсветка синтаксиса совсем кривая была (не работала подсветка фона для конца и начал задач).
Автор: codewarlock1101
Дата сообщения: 09.11.2006 09:26
mozers

Цитата:
Неа. Не работает. Ты бы хоть проверил перед публикацией...

Я в шоке! Он - работает. И объясню почему.При перехвате IDM_MONOFONT вызывается функция смены шрифта, после которой посылается эта же IDM_MONOFONT (только в таком режиме чтобы не вызывался еще раз FontChange() и не было бесконечной рекурсии). При этом мы не возвращаем из перегруженной функции true, чтобы выполнилась реальная IDM_MONOFONT из ядра.
Короче:
1. Меняем шриф
2. IDM_MONOFONT
3. IDM_MONOFONT
Вызовы 2 и 3 взаимо поглощаемые - (то есть запуск этой функции 2 раза возвращает фонт в первоначальное состояние (которое было в момент (1) ), и так как при IDM_MONOFONT скайт запускает перерисовку мы видим изменения фонта!)

Цитата:
Единственное, что действительно принимается - это идея с nxt_font. Вот - действительно рабочий и проверенный вариант: Подробнее...

Твой рабочий и проверенный вариант - не работает, если открыт один файл! Ну не может скрипт переключить буфер, если файл один!


Добавлено:
Mozers! Багу может ты и прибил, только теперь фон назад не меняется когда из ReadOnly возвращаешься!
Автор: vladvro
Дата сообщения: 09.11.2006 10:47
codewarlock1101 и всем

Цитата:
Если можешь - дай пожалуйста объяснения на примере.
1) Что значит на "выходе ожидают"???

согласен, неточная формулировка попробую переформулировать:

"SciTE на выходе от всех обработчиков кроме OnSendEditor ожидает булевское значение handled, и если оно равно true, то если в SciTE заложена дальнейшая обработка события - она не делается,
причем nil, которое возвращается по умолчанию, приравнивается к false,
в случае с OnSendEditor - SciTE на выходе ожидает текстовое значение, и если оно не NULL, то тогда событие не отправляется далее на обработку к ядру Scitilla, а возвращается полученый от обработчика результат,
причем нюанс нынешней реализации состоит в том, что в NULL превращается не только nil, но и булевские значения (false и true)"


пример стандартного обработчика:

Код: local old_OnMenuCommand = OnMenuCommand
function OnMenuCommand (msg, source)
local result
-- вызов исходного обработчика если он был
if old_OnMenuCommand then result = old_OnMenuCommand(msg, source) end
if MyFunction() then return true end
return result
end
Автор: codewarlock1101
Дата сообщения: 09.11.2006 11:07
vladvro
Спасибо! Очень познавательно!
Еще несколько вопросов:
Допусти у нас два (или больше) своих обработчика на одну команду + стандартный обработчик SciTE.
1) Какая будет последовательность выполнения "наших"?
2) Схема, описанная тобой говорит о том, что ВСЕ "наши" обработчки отработают, и при этом, если хотя бы один из них вернет true то стандартный обработчик глушится, я правильно понял?
Автор: vladvro
Дата сообщения: 09.11.2006 11:14
codewarlock1101

Цитата:
Вызовы 2 и 3 взаимо поглощаемые - (то есть запуск этой функции 2 раза возвращает фонт в первоначальное состояние (которое было в момент (1) ), и так как при IDM_MONOFONT скайт запускает перерисовку мы видим изменения фонта!)

проблема состоит в том, что помимо перерисовки, SciTE при этом еще и перезачитывает фонты из конфига (вызов функции ReadFontProperties)


Цитата:
Допусти у нас два (или больше) своих обработчика на одну команду + стандартный обработчик SciTE.
1) Какая будет последовательность выполнения "наших"?
2) Схема, описанная тобой говорит о том, что ВСЕ "наши" обработчки отработают, и при этом, если хотя бы один из них вернет true то стандартный обработчик глушится, я правильно понял?

1) "наши" будут выполнятся по типу: первым был загружен в редактор (первый в файле SciTEStartup.lua), первым и выполнится (хотя вызван будет последним, но в силу построения обратчика, первым отрабатывает исходный).
2) абсолютно правильно. только в каждом случае важно знать, что именно в SciTE заложенно в качестве стандартного обработчика.
Автор: codewarlock1101
Дата сообщения: 09.11.2006 11:38
vladvro

Цитата:
проблема состоит в том, что помимо перерисовки, SciTE при этом еще и перезачитывает фонты из конфига (вызов функции ReadFontProperties)

Разве это пробелма? - это наоборот нам на руку, так как и надо перечитать фонты которые мы подменили.... Или я не прав?

Спасибо за ответы.
Автор: vladvro
Дата сообщения: 09.11.2006 12:23
codewarlock1101

Цитата:
Разве это пробелма? - это наоборот нам на руку, так как и надо перечитать фонты которые мы подменили.... Или я не прав?

прав
точно, именно это нам и надо, согласен с твоим вариантом.
Автор: mozers
Дата сообщения: 09.11.2006 15:31
codewarlock1101 vladvro
Если я вас правильно понял, то оба решения по подмене встроенных обработчиков своими скриптами вполне рабочие.
Более универсален вариант vladvro, но в рассматриваемом случае удобнее использовать вариант codewarlock1101.
Все правильно изложил?
Автор: vladvro
Дата сообщения: 09.11.2006 16:08
mozers

Цитата:
Если я вас правильно понял, то оба решения по подмене встроенных обработчиков своими скриптами вполне рабочие.
Более универсален вариант vladvro, но в рассматриваемом случае удобнее использовать вариант codewarlock1101.
Все правильно изложил?

м... думаю что нет ты немного напутал. я писал правило как надо делать обработчики и что при этом надо учитывать, а не решение конкретной задачи. а вот ты и codewarlock1101
предлагали конкретное решение для смены шрифтов. так вот из этих решений более правильное предложил codewarlock1101, в чем я с ним и согласился
Автор: mozers
Дата сообщения: 09.11.2006 18:00
vladvro Говоря, про твое решение я имел в виду это:
Код: local old_OnEvent = OnEvent
function OnEvent (param1, param2)
    local result
    if old_OnEvent then result = old_OnEvent(param1, param2) end
        if My_Function() then return true end
    return result
end
Автор: vladvro
Дата сообщения: 10.11.2006 12:12
всем
никогда не пользовал функционал сокращений (аббревиатур) в SciTE, а тут решил попробовать,
и первое что обнаружил - это то, что при вставке сокращения остается поле %SEL%, это так и задумывалось или это баг?
и второе - так и не понял, а как же можно задействовать это поле %SEL%?

mozers

Цитата:
Говоря, про твое решение я имел в виду это:
Код:
local old_OnEvent = OnEvent
function OnEvent (param1, param2)
local result
if old_OnEvent then result = old_OnEvent(param1, param2) end
if My_Function() then return true end
return result
end

я бы назвал это схемой, и мне кажется, что решение от codewarlock1101 вполне укладывается в эту схему,
либо я так и не понял, что же ты хотел сказать
Автор: codewarlock1101
Дата сообщения: 10.11.2006 13:14
vladvro
задействовать можно так:
это в файле abbrev
++=%SEL%:=%SEL%+1

потом в скайте:
++privet

privet выделяешь (главная тонкость - чтобы после выделения курсор находился в начале (то есть надо выделять справа налево), жмешь раскрыть аббреаивтуру - и у тебя получается
privet:=privet+1.

А ты наверное аббревиатуру вставляешь через окошко - там этой функции нету... не помню кто делал.... В общем, мульки доступны только в режиме Ctrl+B (то бишь IDM_ABBREV) и не доступны в режиме Ctrl+Shift+R (IDM_INS_ABBREV)
Автор: vladvro
Дата сообщения: 10.11.2006 14:23
codewarlock1101

Цитата:
privet выделяешь (главная тонкость - чтобы после выделения курсор находился в начале (то есть надо выделять справа налево), жмешь раскрыть аббреаивтуру - и у тебя получается
privet:=privet+1.

А ты наверное аббревиатуру вставляешь через окошко - там этой функции нету... не помню кто делал.... В общем, мульки доступны только в режиме Ctrl+B (то бишь IDM_ABBREV) и не доступны в режиме Ctrl+Shift+R (IDM_INS_ABBREV)

вот до этой "тонкости" я сам и не додумался, теперь понятно, спасибо
и конечно я сперва попробовал режим вставки (IDM_INS_ABBREV), и мне он показался даже удобнее...
а делал это mimir, а сейчас куда-то пропал, вобщем получается, что кто бы довел начатое до ума...
Автор: mozers
Дата сообщения: 10.11.2006 14:39
Обновил сборку.
Исправлены все ошибки на которые тыкнули носом и которые нашел сам.
СПАСИБО codewarlock1101 и LEX1 за усовершенствованные варианты скриптов и всем примавшим участие за советы и подсказки

Обновил список Нерешенные задачи и вопросы
Благодаря усилиям наших программистов он стал значительно меньше
Может добавим пожеланий ?

vladvro codewarlock1101
Цитата:
доступны только в режиме Ctrl+B (то бишь IDM_ABBREV) и не доступны в режиме Ctrl+Shift+R (IDM_INS_ABBREV)
Да. Об этом в SciTE.Ru_kernel_changes написано. Дико раздражает, поскольку я Ctrl+B почти не пользуюсь (чаще - Ctrl+Shift+R)
Автор: codewarlock1101
Дата сообщения: 10.11.2006 15:51
Если кто вдруг пользуется для работы TotalCommander'ом, то существует чудесный wlx-плагин, который в Lister'е раскрашивает фалы в соответствии с настройками скайта.
Плагин можно забрать тут:
http://wincmd.ru/plugring/SciLister.html

Он старенький, и у него маленькая бяка - он не знает параметр caret.line.back.alpha, поэтому отображает "как есть" caret.line.back. А это напрягает.
Например мои настройки:

caret.line.back=#0000FF
caret.line.back.alpha=15

кои в Скайте отображаются прияным, еле заметным фиолетовым в листере становятся ядовито-синим, что портит всю малину.
Поэтому на всякий случай даю лекарство:
Пропатчить файл SciLister.wlx (по указанному смещению заменить PLAT_WINNT):
[0x32238]=SCI_LISTER
После этого можно в SciteGlobal.properties написать (после оригинального caret.line.back):

caret.line.back=#0000FF
if SCI_LISTER
caret.line.back=#DCE6FF
endif
Это будет переопределять цвет для плагина
Автор: vladvro
Дата сообщения: 10.11.2006 16:08
mozers

Цитата:
Об этом в SciTE.Ru_kernel_changes написано.

точно, написанно... надо будет внимательнее читать...

а "тонкость" с позицией курсора можно подправить, заменив на позицию начала выделения:
в файле SciTEBase.cxx меняем
    int currentPos = GetCaretInLine();
    int position = SendEditor(SCI_GETCURRENTPOS); // from the beginning
на
    int position = SendEditor(SCI_GETSELECTIONSTART); // from the beginning
    int line = SendEditor(SCI_LINEFROMPOSITION, position);
    int lineStart = SendEditor(SCI_POSITIONFROMLINE, line);
    int currentPos = position - lineStart;
Автор: codewarlock1101
Дата сообщения: 10.11.2006 16:36
vladvro
а если ничего не выделено, совпадают ли эти величины (дожны совпадать, но лучше перестраховаться вопросом )?

SendEditor(SCI_GETCURRENTPOS)==SendEditor(SCI_GETSELECTIONSTART)

Если да - то это хорошо. В противном случае - нехорошо.
Автор: vladvro
Дата сообщения: 10.11.2006 18:42
codewarlock1101

Цитата:
а если ничего не выделено, совпадают ли эти величины (дожны совпадать, но лучше перестраховаться вопросом )?

да они совпадают (проверено по коду)
Автор: mozers
Дата сообщения: 11.11.2006 00:51
codewarlock1101
Цитата:
Если кто вдруг пользуется для работы TotalCommander'ом, то существует чудесный wlx-плагин

Честно говоря, автору руки бы отбить за этот плагин, да только он сгинул куда то насовсем... Не только курсор, а и шрифты плагин уродует. Почему - непонятно. А дело то - элементарное - вызвать SciTE из Тотала с указанием любых нужных параметров.
Я вот сляпал на скорую руку JS скрипт и вызываю его из Тотала по Alt+F3:
Код: var filename = WScript.Arguments(0).replace(/\\/g,"\\\\");
var WshShell = WScript.CreateObject("WScript.Shell");
WshShell.Run('"G:\\Program Files\\SciTE\\SciTE.exe" -open:'+filename+' -property:user.shortcuts=Escape|IDM_QUIT| -property:save.recent=0 -property:save.session=0 -menucommand:416 -menucommand:408',1);
Автор: Linch
Дата сообщения: 11.11.2006 02:00
Нашел шрифт для себя удобный называется Triskweline и пытаюсь заменить шрифт тот что в сборке на него. Меняю тут:

Код:
# Вторая подборка шрифтов - proportional (заменяет 1й набор после нажатия на Ctrl+F11)
font.1.base=font:Triskweline,size:10
font.1.small=font:Triskweline,size:10
font.1.comment=font:Triskweline,size:9
Автор: unreal666
Дата сообщения: 11.11.2006 05:26
Linch

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

А как отображается ?


Добавлено:
Не поделишься этим шрифтом ?

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869

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


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