diff options
-rw-r--r-- | core/events.lua | 214 | ||||
-rw-r--r-- | core/gui.lua | 211 |
2 files changed, 211 insertions, 214 deletions
diff --git a/core/events.lua b/core/events.lua index 80003bf9..953ea276 100644 --- a/core/events.lua +++ b/core/events.lua @@ -183,9 +183,6 @@ function emit(event, ...) end end -local connect = connect -local emit = emit - --- Map of Scintilla notifications to their handlers. local c = _SCINTILLA.constants local scnnotifications = { @@ -213,214 +210,3 @@ function notification(n) return emit(f[1], unpack(args)) end end - --- Default handlers to follow. - -connect('view_new', - function() -- sets default properties for a Scintilla window - local buffer = buffer - local c = _SCINTILLA.constants - - -- Allow redefinitions of these Scintilla key commands. - local ctrl_keys = { - '[', ']', '/', '\\', 'Z', 'Y', 'X', 'C', 'V', 'A', 'L', 'T', 'D', 'U' - } - local ctrl_shift_keys = { 'L', 'T', 'U' } - for _, key in ipairs(ctrl_keys) do - buffer:clear_cmd_key(string.byte(key), c.SCMOD_CTRL) - end - for _, key in ipairs(ctrl_shift_keys) do - buffer:clear_cmd_key(string.byte(key), c.SCMOD_CTRL + c.SCMOD_SHIFT) - end - - if _THEME and #_THEME > 0 then - local ok, err = pcall(dofile, _THEME..'/view.lua') - if ok then return end - io.stderr:write(err) - end - end) - -local SETDIRECTFUNCTION = _SCINTILLA.properties.direct_function[1] -local SETDIRECTPOINTER = _SCINTILLA.properties.doc_pointer[2] -local SETLEXERLANGUAGE = _SCINTILLA.functions.set_lexer_language[1] -connect('buffer_new', - function() -- sets default properties for a Scintilla document - local function run() - local buffer = buffer - - -- Lexer. - buffer:set_lexer_language('lpeg') - buffer:private_lexer_call(SETDIRECTFUNCTION, buffer.direct_function) - buffer:private_lexer_call(SETDIRECTPOINTER, buffer.direct_pointer) - buffer:private_lexer_call(SETLEXERLANGUAGE, 'container') - buffer.style_bits = 8 - - -- Properties. - buffer.property['textadept.home'] = _HOME - buffer.property['lexer.lpeg.home'] = _LEXERPATH - buffer.property['lexer.lpeg.script'] = _HOME..'/lexers/lexer.lua' - if _THEME and #_THEME > 0 then - buffer.property['lexer.lpeg.color.theme'] = _THEME..'/lexer.lua' - end - - -- Buffer. - buffer.code_page = _SCINTILLA.constants.SC_CP_UTF8 - - if _THEME and #_THEME > 0 then - local ok, err = pcall(dofile, _THEME..'/buffer.lua') - if ok then return end - io.stderr:write(err) - end - end - -- Normally when an error occurs, a new buffer is created with the error - -- message, but if an error occurs here, this event would be called again - -- and again, erroring each time resulting in an infinite loop; print error - -- to stderr instead. - local ok, err = pcall(run) - if not ok then io.stderr:write(err) end - end) - --- Sets the title of the Textadept window to the buffer's filename. --- @param buffer The currently focused buffer. -local function set_title(buffer) - local buffer = buffer - local filename = buffer.filename or buffer._type or L('Untitled') - local dirty = buffer.dirty and '*' or '-' - gui.title = string.format('%s %s Textadept (%s)', filename:match('[^/\\]+$'), - dirty, filename) -end - -connect('save_point_reached', - function() -- changes Textadept title to show 'clean' buffer - buffer.dirty = false - set_title(buffer) - end) - -connect('save_point_left', - function() -- changes Textadept title to show 'dirty' buffer - buffer.dirty = true - set_title(buffer) - end) - -connect('uri_dropped', - function(utf8_uris) -- open uri(s) - for utf8_uri in utf8_uris:gmatch('[^\r\n]+') do - if utf8_uri:find('^file://') then - utf8_uri = utf8_uri:match('^file://([^\r\n]+)') - utf8_uri = utf8_uri:gsub('%%(%x%x)', - function(hex) return string.char(tonumber(hex, 16)) end) - if WIN32 then utf8_uri = utf8_uri:sub(2, -1) end -- ignore leading '/' - local uri = utf8_uri:iconv(_CHARSET, 'UTF-8') - if lfs.attributes(uri).mode ~= 'directory' then - io.open_file(utf8_uri) - end - end - end - end) - -local string_format = string.format -local EOLs = { L('CRLF'), L('CR'), L('LF') } -local GETLEXERLANGUAGE = _SCINTILLA.functions.get_lexer_language[1] -connect('update_ui', - function() -- sets docstatusbar text - local buffer = buffer - local pos = buffer.current_pos - local line, max = buffer:line_from_position(pos) + 1, buffer.line_count - local col = buffer.column[pos] + 1 - local lexer = buffer:private_lexer_call(GETLEXERLANGUAGE) - local eol = EOLs[buffer.eol_mode + 1] - local tabs = string_format('%s %d', buffer.use_tabs and L('Tabs:') or - L('Spaces:'), buffer.indent) - local enc = buffer.encoding or '' - gui.docstatusbar_text = - string_format('%s %d/%d %s %d %s %s %s %s', L('Line:'), - line, max, L('Col:'), col, lexer, eol, tabs, enc) - end) - -connect('margin_click', - function(margin, modifiers, position) -- toggles folding - buffer:toggle_fold(buffer:line_from_position(position)) - end) - -connect('buffer_new', function() set_title(buffer) end) - -connect('buffer_before_switch', - function() -- save buffer properties - local buffer = buffer - -- Save view state. - buffer._anchor = buffer.anchor - buffer._current_pos = buffer.current_pos - buffer._first_visible_line = buffer.first_visible_line - -- Save fold state. - buffer._folds = {} - local folds = buffer._folds - local i = buffer:contracted_fold_next(0) - while i >= 0 do - folds[#folds + 1] = i - i = buffer:contracted_fold_next(i + 1) - end - end) - -connect('buffer_after_switch', - function() -- restore buffer properties - local buffer = buffer - if not buffer._folds then return end - -- Restore fold state. - for _, i in ipairs(buffer._folds) do buffer:toggle_fold(i) end - -- Restore view state. - buffer:set_sel(buffer._anchor, buffer._current_pos) - buffer:line_scroll(0, - buffer:visible_from_doc_line(buffer._first_visible_line) - - buffer.first_visible_line) - end) - -connect('buffer_after_switch', - function() -- updates titlebar and statusbar - set_title(buffer) - emit('update_ui') - end) - -connect('view_after_switch', - function() -- updates titlebar and statusbar - set_title(buffer) - emit('update_ui') - end) - -connect('reset_after', function() gui.statusbar_text = 'Lua reset' end) - -connect('quit', - function() -- prompts for confirmation if any buffers are dirty - local list = {} - for _, buffer in ipairs(_BUFFERS) do - if buffer.dirty then - list[#list + 1] = buffer.filename or buffer._type or L('Untitled') - end - end - if #list > 0 and - gui.dialog('msgbox', - '--title', L('Quit without saving?'), - '--text', L('The following buffers are unsaved:'), - '--informative-text', - string.format('%s', table.concat(list, '\n')), - '--button1', 'gtk-cancel', - '--button2', L('Quit _without saving'), - '--no-newline') ~= '2' then - return false - end - return true - end) - -if OSX then - connect('appleevent_odoc', - function(uri) return emit('uri_dropped', 'file://'..uri) end) - - connect('buffer_new', - function() -- GTK-OSX has clipboard problems - buffer.paste = function() - local clipboard_text = gui.clipboard_text - if #clipboard_text > 0 then buffer:replace_sel(clipboard_text) end - end - end) -end - -connect('error', function(...) gui._print(L('[Error Buffer]'), ...) end) diff --git a/core/gui.lua b/core/gui.lua index 2e184beb..4f4ee670 100644 --- a/core/gui.lua +++ b/core/gui.lua @@ -70,3 +70,214 @@ function gui.switch_buffer() local ok, i = response:match('(%-?%d+)\n(%d+)$') if ok == '1' then view:goto_buffer(tonumber(i) + 1, true) end end + +local connect = _G.events.connect + +connect('view_new', + function() -- sets default properties for a Scintilla window + local buffer = buffer + local c = _SCINTILLA.constants + + -- Allow redefinitions of these Scintilla key commands. + local ctrl_keys = { + '[', ']', '/', '\\', 'Z', 'Y', 'X', 'C', 'V', 'A', 'L', 'T', 'D', 'U' + } + local ctrl_shift_keys = { 'L', 'T', 'U' } + for _, key in ipairs(ctrl_keys) do + buffer:clear_cmd_key(string.byte(key), c.SCMOD_CTRL) + end + for _, key in ipairs(ctrl_shift_keys) do + buffer:clear_cmd_key(string.byte(key), c.SCMOD_CTRL + c.SCMOD_SHIFT) + end + + if _THEME and #_THEME > 0 then + local ok, err = pcall(dofile, _THEME..'/view.lua') + if ok then return end + io.stderr:write(err) + end + end) + +local SETDIRECTFUNCTION = _SCINTILLA.properties.direct_function[1] +local SETDIRECTPOINTER = _SCINTILLA.properties.doc_pointer[2] +local SETLEXERLANGUAGE = _SCINTILLA.functions.set_lexer_language[1] +connect('buffer_new', + function() -- sets default properties for a Scintilla document + local function run() + local buffer = buffer + + -- Lexer. + buffer:set_lexer_language('lpeg') + buffer:private_lexer_call(SETDIRECTFUNCTION, buffer.direct_function) + buffer:private_lexer_call(SETDIRECTPOINTER, buffer.direct_pointer) + buffer:private_lexer_call(SETLEXERLANGUAGE, 'container') + buffer.style_bits = 8 + + -- Properties. + buffer.property['textadept.home'] = _HOME + buffer.property['lexer.lpeg.home'] = _LEXERPATH + buffer.property['lexer.lpeg.script'] = _HOME..'/lexers/lexer.lua' + if _THEME and #_THEME > 0 then + buffer.property['lexer.lpeg.color.theme'] = _THEME..'/lexer.lua' + end + + -- Buffer. + buffer.code_page = _SCINTILLA.constants.SC_CP_UTF8 + + if _THEME and #_THEME > 0 then + local ok, err = pcall(dofile, _THEME..'/buffer.lua') + if ok then return end + io.stderr:write(err) + end + end + -- Normally when an error occurs, a new buffer is created with the error + -- message, but if an error occurs here, this event would be called again + -- and again, erroring each time resulting in an infinite loop; print error + -- to stderr instead. + local ok, err = pcall(run) + if not ok then io.stderr:write(err) end + end) + +-- Sets the title of the Textadept window to the buffer's filename. +-- @param buffer The currently focused buffer. +local function set_title(buffer) + local buffer = buffer + local filename = buffer.filename or buffer._type or L('Untitled') + local dirty = buffer.dirty and '*' or '-' + gui.title = string.format('%s %s Textadept (%s)', filename:match('[^/\\]+$'), + dirty, filename) +end + +connect('save_point_reached', + function() -- changes Textadept title to show 'clean' buffer + buffer.dirty = false + set_title(buffer) + end) + +connect('save_point_left', + function() -- changes Textadept title to show 'dirty' buffer + buffer.dirty = true + set_title(buffer) + end) + +connect('uri_dropped', + function(utf8_uris) -- open uri(s) + for utf8_uri in utf8_uris:gmatch('[^\r\n]+') do + if utf8_uri:find('^file://') then + utf8_uri = utf8_uri:match('^file://([^\r\n]+)') + utf8_uri = utf8_uri:gsub('%%(%x%x)', + function(hex) return string.char(tonumber(hex, 16)) end) + if WIN32 then utf8_uri = utf8_uri:sub(2, -1) end -- ignore leading '/' + local uri = utf8_uri:iconv(_CHARSET, 'UTF-8') + if lfs.attributes(uri).mode ~= 'directory' then + io.open_file(utf8_uri) + end + end + end + end) + +local string_format = string.format +local EOLs = { L('CRLF'), L('CR'), L('LF') } +local GETLEXERLANGUAGE = _SCINTILLA.functions.get_lexer_language[1] +connect('update_ui', + function() -- sets docstatusbar text + local buffer = buffer + local pos = buffer.current_pos + local line, max = buffer:line_from_position(pos) + 1, buffer.line_count + local col = buffer.column[pos] + 1 + local lexer = buffer:private_lexer_call(GETLEXERLANGUAGE) + local eol = EOLs[buffer.eol_mode + 1] + local tabs = string_format('%s %d', buffer.use_tabs and L('Tabs:') or + L('Spaces:'), buffer.indent) + local enc = buffer.encoding or '' + gui.docstatusbar_text = + string_format('%s %d/%d %s %d %s %s %s %s', L('Line:'), + line, max, L('Col:'), col, lexer, eol, tabs, enc) + end) + +connect('margin_click', + function(margin, modifiers, position) -- toggles folding + buffer:toggle_fold(buffer:line_from_position(position)) + end) + +connect('buffer_new', function() set_title(buffer) end) + +connect('buffer_before_switch', + function() -- save buffer properties + local buffer = buffer + -- Save view state. + buffer._anchor = buffer.anchor + buffer._current_pos = buffer.current_pos + buffer._first_visible_line = buffer.first_visible_line + -- Save fold state. + buffer._folds = {} + local folds = buffer._folds + local i = buffer:contracted_fold_next(0) + while i >= 0 do + folds[#folds + 1] = i + i = buffer:contracted_fold_next(i + 1) + end + end) + +connect('buffer_after_switch', + function() -- restore buffer properties + local buffer = buffer + if not buffer._folds then return end + -- Restore fold state. + for _, i in ipairs(buffer._folds) do buffer:toggle_fold(i) end + -- Restore view state. + buffer:set_sel(buffer._anchor, buffer._current_pos) + buffer:line_scroll(0, + buffer:visible_from_doc_line(buffer._first_visible_line) - + buffer.first_visible_line) + end) + +connect('buffer_after_switch', + function() -- updates titlebar and statusbar + set_title(buffer) + events.emit('update_ui') + end) + +connect('view_after_switch', + function() -- updates titlebar and statusbar + set_title(buffer) + events.emit('update_ui') + end) + +connect('reset_after', function() gui.statusbar_text = 'Lua reset' end) + +connect('quit', + function() -- prompts for confirmation if any buffers are dirty + local list = {} + for _, buffer in ipairs(_BUFFERS) do + if buffer.dirty then + list[#list + 1] = buffer.filename or buffer._type or L('Untitled') + end + end + if #list > 0 and + gui.dialog('msgbox', + '--title', L('Quit without saving?'), + '--text', L('The following buffers are unsaved:'), + '--informative-text', + string.format('%s', table.concat(list, '\n')), + '--button1', 'gtk-cancel', + '--button2', L('Quit _without saving'), + '--no-newline') ~= '2' then + return false + end + return true + end) + +if OSX then + connect('appleevent_odoc', + function(uri) return events.emit('uri_dropped', 'file://'..uri) end) + + connect('buffer_new', + function() -- GTK-OSX has clipboard problems + buffer.paste = function() + local clipboard_text = gui.clipboard_text + if #clipboard_text > 0 then buffer:replace_sel(clipboard_text) end + end + end) +end + +connect('error', function(...) gui._print(L('[Error Buffer]'), ...) end) |