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

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

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


Автор: SufiT, Отправлено:15:19 31-08-2010
Правлю CSS в scite. Когда открываю фигурную скобку, автоматически закрывающаяся скобка появляется через строку и, соответственно, курсор появляется на строке между скобками.
Как в настройках сделать так, чтобы скобки находились на одной строке: { } ?
Подскажите плиз.
Автор: TymurGubayev, Отправлено:20:04 31-08-2010

Цитата:
Вот. Я чесноговоря по большому счету нихрена не понял.


По приведенной ссылке есть ещё одна, вот сюда: http://www.scintilla.org/nulex.html

А там есть такой абзац:

Цитата:
Single lexer per document

A problem with current Scintilla is that lexers and lexer options such as properties and keywords are attached to the view (ScintillaBase) object rather than the Document object. When two views are showing one document then it is possible for two different lexers to be called to style the text leading to arbitrary and confusing results.

To fix this, lexer state is being moved from ScintillaBase to Document although the state is still being set up by ScintillaBase as it is providing the API to client code.

This will change the scope of some settings so may require changes to applications. Applications that only set up properties or word lists at initialisation or when changing languages will have to repeat these for each document. Conversely, there will no longer be a need to set parameters for each view on a document or when switching between documents on a view since documents retain settings.


из которого более-менее понятно, о чём речь.

А т.к. split view в SciTE вроде нет, то нас это новшество касается мало (ИМХО)
Автор: BioInfo, Отправлено:11:11 01-09-2010
SufiT
Обновил скрипт
smartbraces.lua [строка 1] : [more]
Код:
--[[--------------------------------------------------
SciTE Smart braces
Version: 1.2.5
Authors: Dmitry Maslov, Julgo, TymurGubayev
-------------------------------------------------
Работает, если:

Подключен в автозагрузку
В настройках установлено braces.autoclose = 1
В настройках установлено braces.open = открывающиеся скобки
В настройках установлено braces.close = закрывающиеся скобки
Используется только в русской сборке из-за расширенной функции OnKey

-------------------------------------------------
Функционал:

Автозакрытие скобок
Автозакрытие выделенного текста в скобки
Особая обработка { и } в cpp: автоматом делает отступ

-------------------------------------------------
Логика работы:

Скрипт срабатывает только если braces.autoclose = 1

Если мы вводим символ из braces.open, то автоматически вставляется
ему пара из braces.close, таким образом, курсор оказывается между скобок

Если мы вводим закрывающуюся скобку из braces.close и следующий символ
эта же закрывающаяся скобка, то ввод проглатывается и лишняя закрывающаяся
скобка не печатается

Если у нас выделен текст и мы вводим символ из braces.open
то текст обрамляется кавычками braces.open - braces.close
если он уже был обрамлен кавычками, то они снимаются,
при этом учитывается символ переноса строки, т.е. если выделенный
текст оканчивается переводом строки, то скобки вставляются до переноса
строки

Если мы вводим символ { при редактировании файла cpp, то автоматически
вставляется перенос строки два раза, а после } - курсор при этом оказывается
в середине, т.е. после первого переноса строки, все отступы сохраняются

Если мы вставляем символ } при редактировании файла cpp, то отступ
автоматически уменьшается на один

Если мы только что вставили скобку автоматом, то после того
как нажимаем BACK_SPACE удаляется вставленная скобка, т.е.
срабатывает как DEL, а не как BACK_SPACE

Если вставляем скобку у которой braces.open == braces.close
то вставляется пара только если таких скобок четно в строке

ВНИМАНИЕ: В скрипте используется ф-ция string.pattern из COMMON.lua
--]]--------------------------------------------------

-- Возвращает текущий символ перевода строки
local function GetEOL()
local eol = "\r\n"
if editor.EOLMode == SC_EOL_CR then
eol = "\r"
elseif editor.EOLMode == SC_EOL_LF then
eol = "\n"
end
return
eol
end

local function
FindCount( text, textToFind )
local count = 0;
for w in string.gmatch( text, textToFind:pattern() )
do
count = count + 1
end
return
count
end

-- позиция это начало строки (учитывая отступ)
local function IsLineStartPos( pos )
return ( editor.LineIndentPosition[editor:LineFromPosition(pos)] == pos )
end

-- Получить номер текущей строки
local function GetCurrLineNumber()
return editor:LineFromPosition( editor.CurrentPos )
end

-- Получить отступ в строке
local function GetLineIndentation( num_line )
if ( num_line < 0 ) then num_line = 0 end
if
( num_line >= editor.LineCount ) then num_line = editor.LineCount - 1 end
return
( editor.LineIndentation[num_line] / editor.Indent )
end

-- последний в строке ?
local function IsInLineEnd( num_line, text )
local endpos = editor.LineEndPosition[num_line]
if ( endpos >= string.len( text ) )
and
string.find( editor:textrange( editor:PositionBefore( endpos - string.len( text ) + 1 ), endpos ), text:pattern() )
then
return true
end
return false
end

-- последний символ в строке - конец строки?
local function IsEOLlast( text )
-- в луа конец строки всегда один символ
--[[ if string.find( text, GetEOL(), string.len( text ) - 1 ) then
return true
end
return false]]
return (text:sub(-1) == GetEOL())
end

-- следующий за позицией текст == text ?
local function nextIs(pos, text)
if ( string.find( editor:textrange( pos, editor:PositionAfter( pos + string.len( text ) - 1 ) ), text:pattern() ) ) then
return true
end
return false
end

-- следующий символ позиции конец строки?
local function nextIsEOL(pos)
if ( pos == editor.Length )
or
( nextIs( pos, GetEOL() ) )
then
return true
end
return false
end

-----------------------------------------------------------------
-- проверяет скобки, заданные bracebegin и braceend в строке s на
-- сбалансированность: "(x)y(z)" -> true, "x)y(z" -> false
local function BracesBalanced (s, bracebegin, braceend)
if (#bracebegin + #braceend) > 2 then
--@warn: данная функция не будет работать со "скобками" больше одного символа.
--@todo: для "длинных" скобок нужно переписать эту функцию на lpeg. Но кому оно надо?..
return true
end
local
b,e = s:find("%b"..bracebegin..braceend)
local b2 = s:find(bracebegin, 1, true)
local e2 = s:find(braceend, 1, true)
return (b == b2) and (e == e2)
end -- BracesBalanced

local function BlockBraces( bracebegin, braceend )
local text, lenght = editor:GetSelText()
local selbegin = editor.SelectionStart
local selend = editor.SelectionEnd
local b, e = string.find( text, "^%s*"..bracebegin:pattern() )
local b2, e2 = string.find( text, braceend:pattern().."%s*$" )
local add = ( IsEOLlast( text ) and GetEOL() ) or ""

editor:BeginUndoAction()
if (b and b2) and BracesBalanced( text:sub( e+1, b2-1 ) , bracebegin, braceend ) then
text = string.sub( text, e+1, b2-1 )
editor:ReplaceSel( text..add )
editor:SetSel( selbegin, selbegin + #( text..add ) )
else
editor:insert( selend - #add, braceend )
editor:insert( selbegin, bracebegin )
editor:SetSel( selbegin, selend + #( bracebegin..braceend ) )
end
editor:EndUndoAction()

return true
end

local function
GetIndexFindCharInProps( value, findchar )
if findchar then
local
resIndex = string.find( props[value], findchar:pattern() , 1 )
if ( resIndex ~= nil )
and
( string.sub( props[value], resIndex,resIndex ) == findchar )
then
return
resIndex
end
end
return nil
end

local function
GetCharInProps( value, index )
return string.sub( props[value], index, index )
end

-- возвращает открывающуюся скобку и закрывающуюся скобку
-- по входящему символу, т.е. например,
-- если на входе ')' то на выходе '(' ')'
-- если на входе '(' то на выходе '(' ')'
local function GetBraces( char )
local braceOpen = ''
local braceClose = ''
local symE = ''
local brIdx = GetIndexFindCharInProps( 'braces.open', char )
if ( brIdx ~= nil ) then
symE = GetCharInProps( 'braces.close', brIdx )
if ( symE ~= nil ) then
braceOpen = char
braceClose = symE
end
else
brIdx = GetIndexFindCharInProps( 'braces.close', char )
if ( brIdx ~= nil ) then
symE = GetCharInProps( 'braces.open', brIdx )
if ( symE ~= nil ) then
braceOpen = symE
braceClose = char
end
end
end
return
braceOpen, braceClose
end

local
g_isPastedBraceClose = false

-- "умные скобки/кавычки"
-- возвращает true когда обрабатывать дальше символ не нужно
local function SmartBraces( char )
if ( props['braces.autoclose'] == '1' ) then
local
isSelection = editor.SelectionStart ~= editor.SelectionEnd
-- находим парный символ
local braceOpen, braceClose = GetBraces(char)
if ( braceOpen ~= '' and braceClose ~= '' ) then
-- проверяем выделен ли у нас какой либо текст
if ( isSelection == true ) then
-- делаем обработку по автозакрытию текста скобками
return BlockBraces( braceOpen, braceClose )
else
-- если следующий символ закрывающаяся скобка
-- и мы ее вводим, то ввод проглатываем
local nextsymbol = string.format( "%c", editor.CharAt[editor.CurrentPos] )
if ( GetIndexFindCharInProps( 'braces.close', nextsymbol ) ~= nil )
and
( nextsymbol == char )
then
editor:CharRight()
return true
end
-- если мы ставим открывающуюся скобку и
-- следующий символ конец строки или это парная закрывающаяся скобка
-- то сразу вставляем закрывающуюся скобку
if ( char == braceOpen )
and
( nextIsEOL( editor.CurrentPos ) or nextIs( editor.CurrentPos, braceClose ) )
then
-- по волшебному обрабатываем скобку { в cpp
if ( char == '{' ) and
( editor:GetLexerLanguage() == 'cpp' )
then
editor:BeginUndoAction()
local ln = GetCurrLineNumber()
if ( ln > 0 and GetLineIndentation( ln ) > GetLineIndentation( ln - 1 ) )
and
( IsLineStartPos( editor.CurrentPos ) )
and
( not IsInLineEnd( ln-1, '{' ) )
then
editor:BackTab()
end
editor:AddText( '{' )
editor:NewLine()
if ( GetLineIndentation( ln ) == GetLineIndentation( ln + 1 ) ) then
editor:Tab()
end
local
pos = editor.CurrentPos
editor:NewLine()
if ( GetLineIndentation( ln + 2 ) == GetLineIndentation( ln + 1 ) ) then
editor:BackTab()
end
editor:AddText( '}' )
editor:GotoPos( pos )
editor:EndUndoAction()
return true
end
-- если вставляем скобку с одинаковыми правой и левой, то смотрим есть ли уже открытая в строке
if ( braceOpen == braceClose )
and
( math.fmod( FindCount( editor:GetCurLine(), braceOpen ), 2 ) == 1 )
then
return false
end
-- вставляем закрывающуюся скобку
editor:BeginUndoAction()
editor:InsertText( editor.CurrentPos, braceClose )
editor:EndUndoAction()
g_isPastedBraceClose = true
end
-- если мы ставим закрывающуюся скобку
if ( char == braceClose ) then
-- "по волшебному" обрабатываем скобку } в cpp
if ( char == '}' ) and
( editor:GetLexerLanguage() == 'cpp' )
then
editor:BeginUndoAction()
if (IsLineStartPos( editor.CurrentPos ) )
then
editor:BackTab()
end
editor:AddText( '}' )
editor:EndUndoAction()
return true
end
end
end
end
end
return false
end

-- Перехватываем функцию редактора OnKey
AddEventHandler("OnKey", function(key, shift, ctrl, alt, char)
if ( editor.Focus ) then
if
( key == 8 and g_isPastedBraceClose == true ) then -- VK_BACK (08)
g_isPastedBraceClose = false
editor:BeginUndoAction()
editor:CharRight()
editor:DeleteBack()
editor:EndUndoAction()
return true
end

g_isPastedBraceClose = false

if
( char ~= '' ) then
return
SmartBraces( char )
end
end
end
)
[/more]
Автор: Cuprume, Отправлено:16:29 01-09-2010
BioInfo
Спасибо! Тоже ждал, вдруг кто сделает. Все-таки в линию мне удобнее.
В принципе теперь можно ввести настроечный параметр (чтобы пользователь мог выбрать) который указывает как делать обработку фигурных скобок - в линию или с переносом.

Автор: j52, Отправлено:23:02 04-09-2010
2010-09-02 обновился релиз SciTE до 2.21
Ссылка
Автор: ALeXkRU, Отправлено:23:25 04-09-2010
j52
дак, уже три дня как
Автор: j52, Отправлено:00:47 05-09-2010
ALeXkRU

Цитата:
дак, уже три дня как

- а в ветке инфы об этом не было...
Автор: mozers, Отправлено:22:09 05-09-2010
j52
Абсолютно верно. В топике инфы не было, а теперь уважаемый ALeXkRU приготовил нам перевод всех новинок версии 2.21.
Изменений - много. В основном это исправления ошибок предыдущего релиза.
Формулировка
Цитата:
В HTML лексере запоминается состояние строки, вызываемое строкой на этой строке, а не на следующей строке.
не понравилась самому автору перевода. Может кто предложит лучший вариант? (Ссылочку на первоисточник я привел).
Автор: ruruboard, Отправлено:13:50 06-09-2010
Давайте попробую...


Цитата:
LexHTML is now changed to work this way: the state taking into
account the contents of a line is stored as the linestate of that line
rather than the next one. When the lexer starts processing another
block it picks up the line state from the previous line. This should
be more robust when lines are inserted and removed.


"Лексер для HTML сейчас работает так: Состояние лексера для текущей строки сохраняется в этой же строке (ранее оно хранилось в следующей строке). Когда лексер обрабатывает следующий блок, он берёт состояние из предыдущей строки. Это решение должно быть более правильным, когда строки вставляются и удаляются".

Добавлено:
Хотя еси чесна, я не понял, что он имел ввиду. )

По идее, у каждого символа строки должно быть своё состояние: ключевое слово/идентификатор/оператор/строка и т.п. Соотв. строка не может иметь ОДНО состояние. А лексер (при изменении текста текущей строки) должен взять состояние последнего символа из предыдущей строки. Может, Нэйл это имел ввиду?
Автор: mozers, Отправлено:21:04 06-09-2010
ruruboard
По тому как в приведенный выше тред никто, кроме самого Нейла, не вякнул, смысл этой доработки не дошел даже до тех у кого английский - родной язык
Автор: ruruboard, Отправлено:11:46 07-09-2010
Видимо, его лексер строко-ориентированный (что несколько глупо в свете сильной зависимости от предыдущих фрагментов текста), поэтому (я так понял) он для текущей строки хранит её "состояние", которое есть ни что иное, как состояние последнего символа.
В любом случае, мне его лексер-энжын не очень понравился - примитивен. Я писал лексер для D, возникали неудобства. Про кривую фолдинг архитектуру вообще молчу.
Автор: mozers, Отправлено:13:19 07-09-2010
ruruboard

Цитата:
Про кривую фолдинг архитектуру вообще молчу
С точки зрения С - не скажу, но писал как то скриптик на lua для поддержки свертывания в txt - мне показалось что создание фолдинга просто и логично. Что же касается лексеров... Вот как раз в пред-последнем релизе структура лексеров поменялась. Насколько сильно - сказать не могу (не спец). А вот ты, судя по разговору, специалист по С++ и внутренности SciTE знаешь не по наслышке. Так почему же тебя нет в соседнем топике? Очень помощь нужна. Дел - по горло. Welcome, please


Автор: ruruboard, Отправлено:15:05 07-09-2010
В том и прикол, что фолдинг я писал на Си - мне хватило. Внутренняя структура для фолдинга не продуманна.

Я уже давно не касался С++, сейчас я шарповод. А scite - так, баловался, когда было время. С удовольствием помог бы, но 1) времени стало намного меньше 2) Не очень хочется копаться в scite - мой пятый элемент говорит, что это бесперспективный проект.

Кстати о Lua: у меня такое подозрение, что именно из-за Lua русская сборка тормознее аглицкой. Если уж делать плагины, то на Сях (а лучше на D ).
Автор: mozers, Отправлено:15:00 08-09-2010
ruruboard
Ошибается Ваш "пятый элемент".
Проект весьма активно развивается (не всегда, правда, в ту сторону в которую мне бы хотелось) но модификация идет полным ходом! Туча редакторов построены на движке Scintilla и их авторы тормошат Нейла постоянно. Так что перспектива - есть и еще какая. А будет ли это будущее совпадать с Вашими пожеланиями зависит от Вашего участия в проекте

Цитата:
Кстати о Lua: у меня такое подозрение, что именно из-за Lua русская сборка тормознее аглицкой. Если уж делать плагины, то на Сях (а лучше на D ).
Во первых в SciTE нет плагинов. Есть подключаемые скрипты, которые могут (при определенных условиях) довольно сильно замедлить работу SciTE. Дело тут чаще не в Lua (это - один из самых быстрых скриптовых языков), а в недоработках создателей скриптов. Так тут все просто: тормозит - отключи или поправь код
Автор: ruruboard, Отправлено:15:42 08-09-2010
mozers
Вы путаете понятия "активно улучшающийся" и "грамотно спроектированный" проект. Ярчайшая иллюстрация - Линукс, за который Торвальдса надо закидать ссаными тряпками, однако ж развиваемый тысячами людей. Так вот: Линукс - бесперспективен.


Цитата:
Во первых в SciTE нет плагинов. Есть подключаемые скрипты

Не вижу смысла в данном терминологическом снобстве.


Цитата:
Дело тут чаще не в Lua (это - один из самых быстрых скриптовых языков), а в недоработках создателей скриптов.


Ровно наоборот. Скрипты пишут не дебилы ведь, правда? Тем более, что особой алгоритмической фантазии не требуется - дёрнул пару API, обработал, дёрнул ещё раз. Ежу понятно, что обработка каждого чиха через десятки скрипто-функций задавит любой проц. Я это наблюдал вживую на простом 12-меговом SQL файле: Lua-сборка редактировала со скоростью 1 символ в секунду, аглицкая - так же быстро, как я печатаю. Я превращаюсь в К.О., вещающем в 4 классе, не?

Для меня остаётся загадкой современная тенденция скриптомудачества: если ты прогер, ты спокойно напишешь функцию на Сях. Если ламер, такого даже к конфигам допускать нельзя. Вопрос: ну и какой смысл прикручивать сбоку то, что можно встроить внутрь?
Автор: demOOnk, Отправлено:22:12 09-09-2010
Пара вопросов:
1. как подключить язык из юзерпрефов? (import home/xxx не работает, только в глобальном файле настроек)
2. можно ли динамически в api добавляться? (python например)
Автор: Orion_76, Отправлено:22:48 09-09-2010
demOOnk

Цитата:
2. можно ли динамически в api добавляться? (python например)

Встроенными функциями вроде нельзя...
А было бы здорово...
Впринципе вроде не особенно сложно, чем то вроде stags выдергивать из исходников функции..и скриптиком вставлять их в в api-файлы...
Автор: demOOnk, Отправлено:02:08 10-09-2010
со 2-м вроде идеи есть как сделать. Только придется наверное папку для новых нэймспэйсов сделать - и туда кэшировать несуществующие еще библиотеки. А в api подгружать отпарсеное из текущего документа.

еще вопросик появилсо можно ли опцию

properties.directory.enable сделать чтобы она не до упора вверх иерархии шла а только на n ступеней?
Автор: UR4LTZ, Отправлено:09:26 10-09-2010
Благодаря новому механизму подключения внешних лексеров в Scintilla 2.20 Mitchell переписал свой проект Scintillua.
Теперь его лексер LexLPeg состоит всего из одной LexLPeg.dll и сильно не затрагивает остального кода редактора (только чтение настроек из properties)!
Скачать новую версию с исходным кодом можно здесь или по прямой ссылке scintillua221-1.zip
Автор: lleming, Отправлено:16:11 11-09-2010
есть ли версия scite под линукс?
Я имею ввиду полнофункциональную версию а не тот обрезок что по дефолту идет.
Странно но scite под линукс это notpad нет ни код фолдинга ни автозакрытия скобок ни автодополнения.
Только подсветка кода.
Пробовал все версии scite от официальной в репозитории до разных версий с code.google.com и пару других


в чем фишка



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