Архив 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) |
Автор: 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
Цитата:
| Про кривую фолдинг архитектуру вообще молчу |

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

Цитата:
| Кстати о Lua: у меня такое подозрение, что именно из-за Lua русская сборка тормознее аглицкой. Если уж делать плагины, то на Сях (а лучше на D ). |
Автор: 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 /

