diff options
author | 2013-04-29 16:13:59 -0400 | |
---|---|---|
committer | 2013-04-29 16:13:59 -0400 | |
commit | 78990df4f114c45adc7fd2678ffaedf0c4124d95 (patch) | |
tree | 9e79e8f93aa07ee9384b5ddd8cc548dc3c8ea20f /modules | |
parent | 8407377bbe3800dbc4706f584285b7a7858efabc (diff) | |
download | textadept-78990df4f114c45adc7fd2678ffaedf0c4124d95.tar.gz textadept-78990df4f114c45adc7fd2678ffaedf0c4124d95.zip |
More code cleanup.
"local buffer = buffer" and similar optimizations are not needed since lexing
the buffer is much more expensive and reaction time is limited by how fast the
keyboard can submit key presses.
Diffstat (limited to 'modules')
-rw-r--r-- | modules/cpp/init.lua | 14 | ||||
-rw-r--r-- | modules/lua/adeptsensedoc.lua | 4 | ||||
-rw-r--r-- | modules/lua/init.lua | 12 | ||||
-rw-r--r-- | modules/textadept/adeptsense.lua | 4 | ||||
-rw-r--r-- | modules/textadept/bookmarks.lua | 2 | ||||
-rw-r--r-- | modules/textadept/command_entry.lua | 8 | ||||
-rw-r--r-- | modules/textadept/editing.lua | 59 | ||||
-rw-r--r-- | modules/textadept/find.lua | 135 | ||||
-rw-r--r-- | modules/textadept/init.lua | 22 | ||||
-rw-r--r-- | modules/textadept/keys.lua | 101 | ||||
-rw-r--r-- | modules/textadept/menu.lua | 103 | ||||
-rw-r--r-- | modules/textadept/mime_types.lua | 13 | ||||
-rw-r--r-- | modules/textadept/run.lua | 1 | ||||
-rw-r--r-- | modules/textadept/session.lua | 17 | ||||
-rw-r--r-- | modules/textadept/snippets.lua | 26 |
15 files changed, 236 insertions, 285 deletions
diff --git a/modules/cpp/init.lua b/modules/cpp/init.lua index 5d62691a..0adf61cb 100644 --- a/modules/cpp/init.lua +++ b/modules/cpp/init.lua @@ -23,17 +23,17 @@ local M = {} -- from *`_USERHOME`/modules/cpp/api*. module('_M.cpp')]] -local m_editing, m_run = _M.textadept.editing, _M.textadept.run -- Comment string tables use lexer names. -m_editing.comment_string.cpp = '//' +_M.textadept.editing.comment_string.cpp = '//' + -- Compile and Run command tables use file extensions. -m_run.compile_command.c = +_M.textadept.run.compile_command.c = 'gcc -pedantic -Os -o "%(filename_noext)" %(filename)' -m_run.compile_command.cpp = +_M.textadept.run.compile_command.cpp = 'g++ -pedantic -Os -o "%(filename_noext)" %(filename)' -m_run.run_command.c = '%(filedir)%(filename_noext)' -m_run.run_command.cpp = '%(filedir)%(filename_noext)' -m_run.error_detail.c = { +_M.textadept.run.run_command.c = '%(filedir)%(filename_noext)' +_M.textadept.run.run_command.cpp = '%(filedir)%(filename_noext)' +_M.textadept.run.error_detail.c = { pattern = '^(.-):(%d+): (.+)$', filename = 1, line = 2, message = 3 } diff --git a/modules/lua/adeptsensedoc.lua b/modules/lua/adeptsensedoc.lua index 3edebe13..f0bf42f3 100644 --- a/modules/lua/adeptsensedoc.lua +++ b/modules/lua/adeptsensedoc.lua @@ -117,8 +117,8 @@ end -- Called by LuaDoc to process a doc object. -- @param doc The LuaDoc doc object. function M.start(doc) --- require 'luarocks.require' --- local profiler = require 'profiler' +-- require('luarocks.require') +-- local profiler = require('profiler') -- profiler.start() local modules, files = doc.modules, doc.files diff --git a/modules/lua/init.lua b/modules/lua/init.lua index 9abe2277..de9c7450 100644 --- a/modules/lua/init.lua +++ b/modules/lua/init.lua @@ -24,13 +24,13 @@ local M = {} -- from *`_USERHOME`/modules/lua/api*. module('_M.lua')]] -local m_editing, m_run = _M.textadept.editing, _M.textadept.run -- Comment string tables use lexer names. -m_editing.comment_string.lua = '--' +_M.textadept.editing.comment_string.lua = '--' + -- Compile and Run command tables use file extensions. -m_run.compile_command.lua = 'luac %(filename)' -m_run.run_command.lua = 'lua %(filename)' -m_run.error_detail.lua = { +_M.textadept.run.compile_command.lua = 'luac %(filename)' +_M.textadept.run.run_command.lua = 'lua %(filename)' +_M.textadept.run.error_detail.lua = { pattern = '^lua: (.-):(%d+): (.+)$', filename = 1, line = 2, message = 3 } @@ -109,7 +109,6 @@ local control_structure_patterns = { -- @see control_structure_patterns -- @name try_to_autocomplete_end function M.try_to_autocomplete_end() - local buffer = buffer local line_num = buffer:line_from_position(buffer.current_pos) local line = buffer:get_line(line_num) local line_indentation = buffer.line_indentation @@ -133,7 +132,6 @@ end -- Show syntax errors as annotations. events.connect(events.FILE_AFTER_SAVE, function() if buffer:get_lexer() ~= 'lua' then return end - local buffer = buffer buffer:annotation_clear_all() local text = buffer:get_text():gsub('^#![^\n]+', '') -- ignore shebang line local f, err = load(text) diff --git a/modules/textadept/adeptsense.lua b/modules/textadept/adeptsense.lua index 74998977..6d58ff41 100644 --- a/modules/textadept/adeptsense.lua +++ b/modules/textadept/adeptsense.lua @@ -323,7 +323,7 @@ local M = {} -- contain: -- -- -- Load CSS Adeptsense. --- if not _M.css then _M.css = require 'css' end +-- if not _M.css then _M.css = require('css') end -- -- You will have to do something similar if you are writing an Adeptsense for a -- child lexer language. @@ -577,7 +577,6 @@ end -- @see get_completions -- @name complete function M.complete(sense, only_fields, only_functions) - local buffer = buffer sense = sense or (_M[buffer:get_lexer(true)] or {}).sense if not sense then return end local symbol, part = sense:get_symbol() @@ -672,7 +671,6 @@ local apidocs = nil -- @see get_apidoc -- @name show_apidoc function M.show_apidoc(sense) - local buffer = buffer if buffer:call_tip_active() then events.emit(events.CALL_TIP_CLICK) return end sense = sense or (_M[buffer:get_lexer(true)] or {}).sense if not sense then return end diff --git a/modules/textadept/bookmarks.lua b/modules/textadept/bookmarks.lua index 449626d7..3f383a56 100644 --- a/modules/textadept/bookmarks.lua +++ b/modules/textadept/bookmarks.lua @@ -20,7 +20,6 @@ local MARK_BOOKMARK = _SCINTILLA.next_marker_number() -- current line. The default value is `nil`, toggling a bookmark. -- @name toggle function M.toggle(on) - local buffer = buffer local line = buffer:line_from_position(buffer.current_pos) local f = on and buffer.marker_add or buffer.marker_delete if on == nil then -- toggle @@ -45,7 +44,6 @@ end -- @param start `0` when going to the next mark, `buffer.line_count` when going -- to the previous mark. local function goto_mark(f, increment, wrap_start) - local buffer = buffer local current_line = buffer:line_from_position(buffer.current_pos) local line = f(buffer, current_line + increment, 2^MARK_BOOKMARK) if line == -1 then line = f(buffer, wrap_start, 2^MARK_BOOKMARK) end diff --git a/modules/textadept/command_entry.lua b/modules/textadept/command_entry.lua index c4ab7b7a..a22b10c6 100644 --- a/modules/textadept/command_entry.lua +++ b/modules/textadept/command_entry.lua @@ -120,7 +120,7 @@ function M.complete_lua(code) local substring = (code or M.entry_text):match('[%w_.:]+$') or '' local path, op, prefix = substring:match('^([%w_.:]-)([.:]?)([%w_]*)$') local f, err = load('return ('..path..')', nil, 'bt', env) - local ok, tbl = pcall(f) + local ok, result = pcall(f) local cmpls = {} prefix = '^'..prefix if not ok then -- shorthand notation @@ -136,8 +136,8 @@ function M.complete_lua(code) if p:find(prefix) then cmpls[#cmpls + 1] = p end end else - if type(tbl) ~= 'table' then return end - for k in pairs(tbl) do + if type(result) ~= 'table' then return end + for k in pairs(result) do if type(k) == 'string' and k:find(prefix) then cmpls[#cmpls + 1] = k end end if path == 'buffer' and op == ':' then @@ -152,10 +152,8 @@ function M.complete_lua(code) end table.sort(cmpls) M.show_completions(cmpls) - return true end -local events = events -- Pass command entry keys to the default keypress handler. -- Since the command entry is designed to be modal, command entry key bindings -- should stay separate from editor key bindings. diff --git a/modules/textadept/editing.lua b/modules/textadept/editing.lua index 59799709..baaa09ff 100644 --- a/modules/textadept/editing.lua +++ b/modules/textadept/editing.lua @@ -92,31 +92,26 @@ M.typeover_chars = {[41] = 1, [93] = 1, [125] = 1, [39] = 1, [34] = 1} -- @name current_call_tip local current_call_tip = {} -local events, events_connect = events, events.connect -local K = keys.KEYSYMS - -- Matches characters specified in char_matches. -events_connect(events.CHAR_ADDED, function(c) +events.connect(events.CHAR_ADDED, function(c) if not M.AUTOPAIR then return end - local buffer = buffer local match = (M.char_matches[buffer:get_lexer(true)] or M.char_matches)[c] if match and buffer.selections == 1 then buffer:insert_text(-1, match) end end) -- Removes matched chars on backspace. -events_connect(events.KEYPRESS, function(code) - if not M.AUTOPAIR or K[code] ~= '\b' or buffer.selections ~= 1 then return end - local buffer = buffer - local pos = buffer.current_pos - local c = buffer.char_at[pos - 1] - local match = (M.char_matches[buffer:get_lexer(true)] or M.char_matches)[c] +events.connect(events.KEYPRESS, function(code) + if not M.AUTOPAIR or keys.KEYSYMS[code] ~= '\b' or buffer.selections ~= 1 then + return + end + local pos, char = buffer.current_pos, buffer.char_at[buffer.current_pos - 1] + local match = (M.char_matches[buffer:get_lexer(true)] or M.char_matches)[char] if match and buffer.char_at[pos] == string.byte(match) then buffer:clear() end end) -- Highlights matching braces. -events_connect(events.UPDATE_UI, function() +events.connect(events.UPDATE_UI, function() if not M.HIGHLIGHT_BRACES then return end - local buffer = buffer local pos = buffer.current_pos if (M.braces[buffer:get_lexer(true)] or M.braces)[buffer.char_at[pos]] then local match = buffer:brace_match(pos) @@ -131,9 +126,8 @@ events_connect(events.UPDATE_UI, function() end) -- Moves over typeover characters when typed. -events_connect(events.KEYPRESS, function(code) +events.connect(events.KEYPRESS, function(code) if not M.TYPEOVER_CHARS then return end - local buffer = buffer if M.typeover_chars[code] and buffer.char_at[buffer.current_pos] == code then buffer:char_right() return true @@ -141,7 +135,7 @@ events_connect(events.KEYPRESS, function(code) end) -- Auto-indent on return. -events_connect(events.CHAR_ADDED, function(char) +events.connect(events.CHAR_ADDED, function(char) if not M.AUTOINDENT or char ~= 10 then return end local buffer = buffer local pos = buffer.current_pos @@ -155,7 +149,7 @@ events_connect(events.CHAR_ADDED, function(char) end) -- Autocomplete multiple selections. -events_connect(events.AUTO_C_SELECTION, function(text, position) +events.connect(events.AUTO_C_SELECTION, function(text, position) local buffer = buffer local pos = buffer.selection_n_caret[buffer.main_selection] buffer:begin_undo_action() @@ -171,7 +165,7 @@ events_connect(events.AUTO_C_SELECTION, function(text, position) end) -- Prepares the buffer for saving to a file. -events_connect(events.FILE_BEFORE_SAVE, function() +events.connect(events.FILE_BEFORE_SAVE, function() if not M.STRIP_WHITESPACE_ON_SAVE then return end local buffer = buffer buffer:begin_undo_action() @@ -189,7 +183,7 @@ events_connect(events.FILE_BEFORE_SAVE, function() end -- Ensure ending newline. local e = buffer:position_from_line(lines) - if lines == 1 or lines > 1 and e > buffer:position_from_line(lines - 1) then + if lines == 1 or e > buffer:position_from_line(lines - 1) then buffer:insert_text(e, '\n') end -- Convert non-consistent EOLs @@ -204,7 +198,6 @@ end) -- between matching braces. The default value is `false`. -- @name match_brace function M.match_brace(select) - local buffer = buffer local pos = buffer.current_pos local match_pos = buffer:brace_match(pos) if match_pos == -1 then return end @@ -232,7 +225,7 @@ function M.autocomplete_word(default_words) local buffer = buffer local pos, length = buffer.current_pos, buffer.length local completions, c_list = {}, {} - local buffer_text = buffer:get_text(buffer.length) + local buffer_text = buffer:get_text() local root = buffer_text:sub(1, pos):match('['..buffer.word_chars..']+$') if not root or root == '' then return end for _, word in ipairs(default_words or {}) do @@ -288,10 +281,8 @@ end -- @name block_comment function M.block_comment(prefix) local buffer = buffer - if not prefix then - prefix = M.comment_string[buffer:get_lexer(true)] - if not prefix then return end - end + prefix = prefix or M.comment_string[buffer:get_lexer(true)] + if not prefix then return end local anchor, pos = buffer.selection_start, buffer.selection_end local s = buffer:line_from_position(anchor) local e = buffer:line_from_position(pos) @@ -338,9 +329,8 @@ end -- transposed. Otherwise, the characters to the left and right are. -- @name transpose_chars function M.transpose_chars() - local buffer = buffer - local pos, c = buffer.current_pos, buffer.char_at[buffer.current_pos] - local eol = c == 10 or c == 13 or pos == buffer.length + local pos, char = buffer.current_pos, buffer.char_at[buffer.current_pos] + local eol = char == 10 or char == 13 or pos == buffer.length if eol then pos = pos - 1 end buffer.target_start, buffer.target_end = pos - 1, pos + 1 buffer:replace_target(buffer:text_range(pos - 1, pos + 1):reverse()) @@ -354,7 +344,6 @@ end -- joining. -- @name join_lines function M.join_lines() - local buffer = buffer buffer:target_from_selection() buffer:line_end() local line = buffer:line_from_position(buffer.target_start) @@ -371,7 +360,6 @@ end -- @param right The right part of the enclosure. -- @name enclose function M.enclose(left, right) - local buffer = buffer buffer:target_from_selection() local s, e = buffer.target_start, buffer.target_end if s == e then buffer.target_start = buffer:word_start_position(s, true) end @@ -387,7 +375,6 @@ end -- @param right The right part of the enclosure. -- @name select_enclosed function M.select_enclosed(left, right) - local buffer = buffer local anchor, pos = buffer.anchor, buffer.current_pos if anchor ~= pos then buffer:goto_pos(pos - #right) end buffer:search_anchor() @@ -403,7 +390,6 @@ end -- @see buffer.word_chars -- @name select_word function M.select_word() - local buffer = buffer buffer:set_sel(buffer:word_start_position(buffer.current_pos, true), buffer:word_end_position(buffer.current_pos, true)) end @@ -485,12 +471,11 @@ local INDIC_HIGHLIGHT = _SCINTILLA.next_indic_number() -- Clears highlighted word indicators and markers. local function clear_highlighted_words() - local buffer = buffer buffer.indicator_current = INDIC_HIGHLIGHT buffer:indicator_clear_range(0, buffer.length) end -events_connect(events.KEYPRESS, function(code) - if K[code] == 'esc' then clear_highlighted_words() end +events.connect(events.KEYPRESS, function(code) + if keys.KEYSYMS[code] == 'esc' then clear_highlighted_words() end end) --- @@ -519,14 +504,13 @@ end -- Sets view properties for highlighted word indicators and markers. local function set_highlight_properties() - local buffer = buffer buffer.indic_fore[INDIC_HIGHLIGHT] = M.INDIC_HIGHLIGHT_BACK buffer.indic_style[INDIC_HIGHLIGHT] = _SCINTILLA.constants.INDIC_ROUNDBOX buffer.indic_alpha[INDIC_HIGHLIGHT] = 255 if not CURSES then buffer.indic_under[INDIC_HIGHLIGHT] = true end end if buffer then set_highlight_properties() end -events_connect(events.VIEW_NEW, set_highlight_properties) +events.connect(events.VIEW_NEW, set_highlight_properties) --- -- Passes selected or all buffer text to string shell command *cmd* as standard @@ -545,7 +529,6 @@ events_connect(events.VIEW_NEW, set_highlight_properties) -- through. -- @name filter_through function M.filter_through(cmd) - local buffer = buffer local s, e = buffer.selection_start, buffer.selection_end local input if s ~= e then -- use selected lines as input diff --git a/modules/textadept/find.lua b/modules/textadept/find.lua index 5b0adae8..4b93d57f 100644 --- a/modules/textadept/find.lua +++ b/modules/textadept/find.lua @@ -73,7 +73,6 @@ M.lua_pattern_label_text = not CURSES and _L['_Lua pattern'] or M.in_files_label_text = not CURSES and _L['_In files'] or _L['Files(F4)'] -- Events. -local events, events_connect = events, events.connect events.FIND_WRAPPED = 'find_wrapped' local preferred_view @@ -102,49 +101,6 @@ local escapes = { ['\\r'] = '\r', ['\\t'] = '\t', ['\\v'] = '\v', ['\\\\'] = '\\' } ---- --- Searches the *utf8_dir* or user-specified directory for files that match --- search text and options and prints the results to a buffer. --- Use the `find_text`, `match_case`, `whole_word`, and `lua` fields to set the --- search text and option flags, respectively. Use `FILTER` to set the search --- filter. --- @param utf8_dir Optional UTF-8-encoded directory path to search. If `nil`, --- the user is prompted for one. --- @see FILTER --- @name find_in_files -function M.find_in_files(utf8_dir) - if not utf8_dir then - utf8_dir = gui.dialog('fileselect', - '--title', _L['Find in Files'], - '--select-only-directories', - '--with-directory', - (buffer.filename or ''):match('^.+[/\\]') or '', - '--no-newline') - end - if utf8_dir == '' then return end - - local text = M.find_entry_text - if not M.lua then text = text:gsub('([().*+?^$%%[%]-])', '%%%1') end - if not M.match_case then text = text:lower() end - if M.whole_word then text = '%f[%w_]'..text..'%f[^%w_]' end - local matches = {_L['Find:']..' '..text} - lfs.dir_foreach(utf8_dir, function(file) - local match_case = M.match_case - local line_num = 1 - for line in io.lines(file) do - if (match_case and line or line:lower()):find(text) then - file = file:iconv('UTF-8', _CHARSET) - matches[#matches + 1] = ('%s:%s:%s'):format(file, line_num, line) - end - line_num = line_num + 1 - end - end, M.FILTER, true) - if #matches == 1 then matches[2] = _L['No results found'] end - matches[#matches + 1] = '' - if buffer._type ~= _L['[Files Found Buffer]'] then preferred_view = view end - gui._print(_L['[Files Found Buffer]'], table.concat(matches, '\n')) -end - local c = _SCINTILLA.constants -- Finds and selects text in the current buffer. @@ -218,7 +174,7 @@ local function find_(text, next, flags, nowrap, wrapped) return result end -events_connect(events.FIND, find_) +events.connect(events.FIND, find_) -- Finds and selects text incrementally in the current buffer from a starting -- position. @@ -257,26 +213,47 @@ function M.find_incremental(text, next, anchor) gui.command_entry.enter_mode('find_incremental') end --- Optimize for speed. -local load, pcall = load, pcall - --- Runs the given code. --- This function is passed to `string.gsub()` in the `replace()` function. --- @param code The code to run. -local function run(code) - local ok, val = pcall(load('return '..code)) - if not ok then - gui.dialog('ok-msgbox', - '--title', _L['Error'], - '--text', _L['An error occured:'], - '--informative-text', val:gsub('"', '\\"'), - '--icon', 'gtk-dialog-error', - '--button1', _L['_OK'], - '--button2', _L['_Cancel'], - '--no-cancel') - error() +--- +-- Searches the *utf8_dir* or user-specified directory for files that match +-- search text and options and prints the results to a buffer. +-- Use the `find_text`, `match_case`, `whole_word`, and `lua` fields to set the +-- search text and option flags, respectively. Use `FILTER` to set the search +-- filter. +-- @param utf8_dir Optional UTF-8-encoded directory path to search. If `nil`, +-- the user is prompted for one. +-- @see FILTER +-- @name find_in_files +function M.find_in_files(utf8_dir) + if not utf8_dir then + utf8_dir = gui.dialog('fileselect', + '--title', _L['Find in Files'], + '--select-only-directories', + '--with-directory', + (buffer.filename or ''):match('^.+[/\\]') or '', + '--no-newline') end - return val + if utf8_dir == '' then return end + + local text = M.find_entry_text + if not M.lua then text = text:gsub('([().*+?^$%%[%]-])', '%%%1') end + if not M.match_case then text = text:lower() end + if M.whole_word then text = '%f[%w_]'..text..'%f[^%w_]' end + local matches = {_L['Find:']..' '..text} + lfs.dir_foreach(utf8_dir, function(file) + local match_case = M.match_case + local line_num = 1 + for line in io.lines(file) do + if (match_case and line or line:lower()):find(text) then + file = file:iconv('UTF-8', _CHARSET) + matches[#matches + 1] = ('%s:%s:%s'):format(file, line_num, line) + end + line_num = line_num + 1 + end + end, M.FILTER, true) + if #matches == 1 then matches[2] = _L['No results found'] end + matches[#matches + 1] = '' + if buffer._type ~= _L['[Files Found Buffer]'] then preferred_view = view end + gui._print(_L['[Files Found Buffer]'], table.concat(matches, '\n')) end -- Replaces found text. @@ -290,27 +267,38 @@ end local function replace(rtext) if buffer:get_sel_text() == '' then return end if M.in_files then M.in_files = false end - local buffer = buffer buffer:target_from_selection() rtext = rtext:gsub('%%%%', '\\037') -- escape '%%' - local captures = M.captures - if captures then - for i = 1, #captures do - rtext = rtext:gsub('%%'..i, (captures[i]:gsub('%%', '%%%%'))) + if M.captures then + for i = 1, #M.captures do + rtext = rtext:gsub('%%'..i, (M.captures[i]:gsub('%%', '%%%%'))) end end - local ok, rtext = pcall(rtext.gsub, rtext, '%%(%b())', run) + local ok, rtext = pcall(rtext.gsub, rtext, '%%(%b())', function(code) + local ok, result = pcall(load('return '..code)) + if not ok then error(result) end + return result + end) if ok then rtext = rtext:gsub('\\037', '%%') -- unescape '%' buffer:replace_target(rtext:gsub('\\[abfnrtv\\]', escapes)) buffer:goto_pos(buffer.target_end) -- 'find' text after this replacement else + gui.dialog('ok-msgbox', + '--title', _L['Error'], + '--text', _L['An error occured:'], + '--informative-text', + rtext:match(':1:(.+)$') or rtext:match(':%d+:(.+)$'), + '--icon', 'gtk-dialog-error', + '--button1', _L['_OK'], + '--button2', _L['_Cancel'], + '--no-cancel') -- Since find is called after replace returns, have it 'find' the current -- text again, rather than the next occurance so the user can fix the error. buffer:goto_pos(buffer.current_pos) end end -events_connect(events.REPLACE, replace) +events.connect(events.REPLACE, replace) local MARK_FIND = _SCINTILLA.next_marker_number() -- Replaces all found text. @@ -356,7 +344,7 @@ local function replace_all(ftext, rtext) gui.statusbar_text = ("%d %s"):format(count, _L['replacement(s) made']) buffer:end_undo_action() end -events_connect(events.REPLACE_ALL, replace_all) +events.connect(events.REPLACE_ALL, replace_all) -- Returns whether or not the given buffer is a files found buffer. local function is_ff_buf(buf) return buf._type == _L['[Files Found Buffer]'] end @@ -382,7 +370,6 @@ function M.goto_file_found(line, next) -- If not line was given, find the next search result. if not line and next ~= nil then - local buffer = buffer if next then buffer:line_end() else buffer:home() end buffer:search_anchor() local f = buffer['search_'..(next and 'next' or 'prev')] @@ -404,7 +391,7 @@ function M.goto_file_found(line, next) gui.goto_file(file, true, preferred_view) _M.textadept.editing.goto_line(line_num) end -events_connect(events.DOUBLE_CLICK, +events.connect(events.DOUBLE_CLICK, function(pos, line) M.goto_file_found(line) end) --[[ The functions below are Lua C functions. diff --git a/modules/textadept/init.lua b/modules/textadept/init.lua index c751eef6..c34a7055 100644 --- a/modules/textadept/init.lua +++ b/modules/textadept/init.lua @@ -9,18 +9,18 @@ _M.textadept = M -- It provides utilities for editing text in Textadept. module('_M.textadept')]] -M.adeptsense = require 'textadept.adeptsense' -M.bookmarks = require 'textadept.bookmarks' -require 'textadept.command_entry' -M.editing = require 'textadept.editing' -require 'textadept.find' -M.mime_types = require 'textadept.mime_types' -M.run = require 'textadept.run' -M.session = require 'textadept.session' -M.snippets = require 'textadept.snippets' +M.adeptsense = require('textadept.adeptsense') +M.bookmarks = require('textadept.bookmarks') +require('textadept.command_entry') +M.editing = require('textadept.editing') +require('textadept.find') +M.mime_types = require('textadept.mime_types') +M.run = require('textadept.run') +M.session = require('textadept.session') +M.snippets = require('textadept.snippets') -- These need to be loaded last. -M.keys = require 'textadept.keys' -M.menu = require 'textadept.menu' +M.keys = require('textadept.keys') +M.menu = require('textadept.menu') return M diff --git a/modules/textadept/keys.lua b/modules/textadept/keys.lua index e88bbb6e..2c2f1b43 100644 --- a/modules/textadept/keys.lua +++ b/modules/textadept/keys.lua @@ -215,7 +215,6 @@ M.utils = { end, enclose_as_xml_tags = function() _M.textadept.editing.enclose('<', '>') - local buffer = buffer local pos = buffer.current_pos while buffer.char_at[pos - 1] ~= 60 do pos = pos - 1 end -- '<' buffer:insert_text(-1, '</'..buffer:text_range(pos, buffer.current_pos)) @@ -229,7 +228,6 @@ M.utils = { if buffer.filename then io.snapopen(buffer.filename:match('^(.+)[/\\]')) end end, show_style = function() - local buffer = buffer local style = buffer.style_at[buffer.current_pos] local text = string.format("%s %s\n%s %s (%d)", _L['Lexer'], buffer:get_lexer(true), _L['Style'], @@ -245,7 +243,7 @@ M.utils = { if type(state) == 'boolean' then buffer[property] = not state elseif type(state) == 'number' then - buffer[property] = buffer[property] == 0 and (i or 1) or 0 + buffer[property] = state == 0 and (i or 1) or 0 end events.emit(events.UPDATE_UI) -- for updating statusbar end, @@ -262,26 +260,23 @@ M.utils = { grow = function() if view.size then view.size = view.size + 10 end end, shrink = function() if view.size then view.size = view.size - 10 end end, toggle_current_fold = function() - local buffer = buffer buffer:toggle_fold(buffer:line_from_position(buffer.current_pos)) end, reset_zoom = function() buffer.zoom = 0 end, open_webpage = function(url) - local cmd if WIN32 then - cmd = string.format('start "" "%s"', url) - local p = io.popen(cmd) + local p = io.popen(string.format('start "" "%s"', url)) if not p then error(_L['Error loading webpage:']..url) end p:close() else - cmd = string.format(OSX and 'open "file://%s"' or 'xdg-open "%s" &', url) - local _, _, code = os.execute(cmd) + local _, _, code = os.execute(string.format(OSX and 'open "file://%s"' or + 'xdg-open "%s" &', url)) if code ~= 0 then error(_L['Error loading webpage:']..url) end end end, cut_to_eol = function() - _G.buffer:line_end_extend() - _G.buffer:cut() + buffer:line_end_extend() + buffer:cut() end } -- The following buffer functions need to be constantized in order for menu @@ -299,13 +294,9 @@ events.connect(events.BUFFER_NEW, constantize_menu_buffer_functions) -- Scintilla's first buffer does not have this. if not RESETTING then constantize_menu_buffer_functions() end -local keys = keys -local io, gui, gui_find, gui_ce = io, gui, gui.find, gui.command_entry -local buffer, view = buffer, view -local m_textadept, m_editing = _M.textadept, _M.textadept.editing -local m_bookmarks, m_snippets = m_textadept.bookmarks, m_textadept.snippets -local OSX, c = OSX, _SCINTILLA.constants -local utils = M.utils +local _M, keys, buffer, view = _M, keys, buffer, view +local m_editing, utils = _M.textadept.editing, M.utils +local OSX, CURSES, c = OSX, CURSES, _SCINTILLA.constants -- Windows and Linux key bindings. -- @@ -372,8 +363,8 @@ keys[not OSX and 'cs' or 'ms'] = buffer.save keys[not OSX and (not CURSES and 'cS' or 'cms') or 'mS'] = buffer.save_as keys[not OSX and 'cw' or 'mw'] = buffer.close keys[not OSX and (not CURSES and 'cW' or 'cmw') or 'mW'] = io.close_all --- TODO: m_textadept.sessions.load --- TODO: m_textadept.sessions.save +-- TODO: _M.textadept.sessions.load +-- TODO: _M.textadept.sessions.save keys[not OSX and 'cq' or 'mq'] = quit -- Edit. @@ -399,7 +390,7 @@ keys[not OSX and not CURSES and 'c/' or 'm/'] = m_editing.block_comment keys.ct = m_editing.transpose_chars keys[not OSX and (not CURSES and 'cJ' or 'mj') or 'cj'] = m_editing.join_lines keys[not OSX and (not CURSES and 'c|' or 'c\\') - or 'm|'] = {gui_ce.enter_mode, 'filter_through'} + or 'm|'] = {gui.command_entry.enter_mode, 'filter_through'} -- Select. keys[not CURSES and 'cM' or 'mM'] = {m_editing.match_brace, 'select'} keys[not OSX and not CURSES and 'c<' @@ -441,55 +432,58 @@ keys.csup = buffer.move_selected_lines_up keys.csdown = buffer.move_selected_lines_down -- Search. -keys[not OSX and not CURSES and 'cf' or 'mf'] = gui_find.focus +keys[not OSX and not CURSES and 'cf' or 'mf'] = gui.find.focus if CURSES then keys.mF = keys.mf end -- in case mf is used by GUI terminals -keys[not OSX and not CURSES and 'cg' or 'mg'] = gui_find.find_next +keys[not OSX and not CURSES and 'cg' or 'mg'] = gui.find.find_next if not OSX and not CURSES then keys.f3 = keys.cg end -keys[not OSX and not CURSES and 'cG' or 'mG'] = gui_find.find_prev +keys[not OSX and not CURSES and 'cG' or 'mG'] = gui.find.find_prev if not OSX and not CURSES then keys.sf3 = keys.cG end -keys[not OSX and (not CURSES and 'car' or 'mr') or 'cr'] = gui_find.replace -keys[not OSX and (not CURSES and 'caR' or 'mR') or 'cR'] = gui_find.replace_all +keys[not OSX and (not CURSES and 'car' or 'mr') or 'cr'] = gui.find.replace +keys[not OSX and (not CURSES and 'caR' or 'mR') or 'cR'] = gui.find.replace_all -- Find Next is an when find pane is focused in GUI. -- Find Prev is ap when find pane is focused in GUI. -- Replace is ar when find pane is focused in GUI. -- Replace All is aa when find pane is focused in GUI. -keys[not OSX and not CURSES and 'caf' or 'cmf'] = gui_find.find_incremental +keys[not OSX and not CURSES and 'caf' or 'cmf'] = gui.find.find_incremental if not CURSES then keys[not OSX and 'cF' or 'mF'] = utils.find_in_files end -- Find in Files is ai when find pane is focused in GUI. if not CURSES then - keys[not OSX and 'cag' or 'cmg'] = {gui_find.goto_file_found, false, true} - keys[not OSX and 'caG' or 'cmG'] = {gui_find.goto_file_found, false, false} + keys[not OSX and 'cag' or 'cmg'] = {gui.find.goto_file_found, false, true} + keys[not OSX and 'caG' or 'cmG'] = {gui.find.goto_file_found, false, false} end keys[not OSX and 'cj' or 'mj'] = m_editing.goto_line -- Tools. keys[not OSX and (not CURSES and 'ce' or 'mc') - or 'me'] = {gui_ce.enter_mode, 'lua_command'} + or 'me'] = {gui.command_entry.enter_mode, 'lua_command'} keys[not OSX and (not CURSES and 'cE' or 'mC') or 'mE'] = utils.select_command -keys[not OSX and 'cr' or 'mr'] = m_textadept.run.run +keys[not OSX and 'cr' or 'mr'] = _M.textadept.run.run keys[not OSX and (not CURSES and 'cR' or 'cmr') - or 'mR'] = m_textadept.run.compile + or 'mR'] = _M.textadept.run.compile keys[not OSX and (not CURSES and 'cae' or 'mx') - or 'cme'] = {m_textadept.run.goto_error, false, true} + or 'cme'] = {_M.textadept.run.goto_error, false, true} keys[not OSX and (not CURSES and 'caE' or 'mX') - or 'cmE'] = {m_textadept.run.goto_error, false, false} + or 'cmE'] = {_M.textadept.run.goto_error, false, false} -- Adeptsense. keys[not OSX and ((not CURSES or WIN32) and 'c ' or 'c@') - or 'aesc'] = m_textadept.adeptsense.complete -keys[not CURSES and 'ch' or 'mh'] = m_textadept.adeptsense.show_apidoc + or 'aesc'] = _M.textadept.adeptsense.complete +keys[not CURSES and 'ch' or 'mh'] = _M.textadept.adeptsense.show_apidoc if CURSES then keys.mH = keys.mh end -- in case mh is used by GUI terminals -- Snippets. -keys[not OSX and (not CURSES and 'ck' or 'mk') or 'a\t'] = m_snippets._select -keys['\t'] = m_snippets._insert -keys['s\t'] = m_snippets._previous +keys[not OSX and (not CURSES and 'ck' or 'mk') + or 'a\t'] = _M.textadept.snippets._select +keys['\t'] = _M.textadept.snippets._insert +keys['s\t'] = _M.textadept.snippets._previous keys[not OSX and (not CURSES and 'cK' or 'mK') - or 'as\t'] = m_snippets._cancel_current + or 'as\t'] = _M.textadept.snippets._cancel_current -- Bookmark. -keys[not OSX and (not CURSES and 'cf2' or 'f1') or 'mf2'] = m_bookmarks.toggle -keys[not OSX and (not CURSES and 'csf2' or 'f6') or 'msf2'] = m_bookmarks.clear -keys.f2 = m_bookmarks.goto_next -keys[not CURSES and 'sf2' or 'f3'] = m_bookmarks.goto_prev -keys[not CURSES and 'af2' or 'f4'] = m_bookmarks.goto_bookmark +keys[not OSX and (not CURSES and 'cf2' or 'f1') + or 'mf2'] = _M.textadept.bookmarks.toggle +keys[not OSX and (not CURSES and 'csf2' or 'f6') + or 'msf2'] = _M.textadept.bookmarks.clear +keys.f2 = _M.textadept.bookmarks.goto_next +keys[not CURSES and 'sf2' or 'f3'] = _M.textadept.bookmarks.goto_prev +keys[not CURSES and 'af2' or 'f4'] = _M.textadept.bookmarks.goto_bookmark -- Snapopen. keys[not OSX and 'cu' or 'mu'] = {io.snapopen, _USERHOME} -- TODO: {io.snapopen, _HOME} @@ -523,7 +517,7 @@ keys[not OSX and (not CURSES and 'cai' or 'mi') -- TODO: {utils.set_encoding, 'MacRoman'} -- TODO: {utils.set_encoding, 'UTF-16LE'} keys[not OSX and not CURSES and 'cL' - or 'mL'] = m_textadept.mime_types.select_lexer + or 'mL'] = _M.textadept.mime_types.select_lexer keys.f5 = {buffer.colourise, buffer, 0, -1} if CURSES then keys.cl = keys.f5 end @@ -594,27 +588,28 @@ end -- Modes. keys.lua_command = { - ['\t'] = gui_ce.complete_lua, - ['\n'] = {gui_ce.finish_mode, gui_ce.execute_lua} + ['\t'] = gui.command_entry.complete_lua, + ['\n'] = {gui.command_entry.finish_mode, gui.command_entry.execute_lua} } keys.filter_through = { - ['\n'] = {gui_ce.finish_mode, m_editing.filter_through}, + ['\n'] = {gui.command_entry.finish_mode, m_editing.filter_through}, } keys.find_incremental = { ['\n'] = function() - gui_find.find_incremental(gui_ce.entry_text, true, true) + gui.find.find_incremental(gui.command_entry.entry_text, true, true) end, ['cr'] = function() - gui_find.find_incremental(gui_ce.entry_text, false, true) + gui.find.find_incremental(gui.command_entry.entry_text, false, true) end, ['\b'] = function() - gui_find.find_incremental(gui_ce.entry_text:sub(1, -2), true) + gui.find.find_incremental(gui.command_entry.entry_text:sub(1, -2), true) return false -- propagate end } +-- Add the character for any key pressed without modifiers to incremental find. setmetatable(keys.find_incremental, {__index = function(t, k) if #k > 1 and k:find('^[cams]*.+$') then return end - gui_find.find_incremental(gui_ce.entry_text..k, true) + gui.find.find_incremental(gui.command_entry.entry_text..k, true) end}) return M diff --git a/modules/textadept/menu.lua b/modules/textadept/menu.lua index 3115bdea..67436b1d 100644 --- a/modules/textadept/menu.lua +++ b/modules/textadept/menu.lua @@ -24,10 +24,8 @@ local function get_id(f) return id end -local _L, io, gui, gui_find, buffer, view = _L, io, gui, gui.find, buffer, view -local m_textadept, m_editing = _M.textadept, _M.textadept.editing -local m_bookmarks, Msnippets = m_textadept.bookmarks, m_textadept.snippets -local utils = m_textadept.keys.utils +local _L, _M, buffer, view = _L, _M, buffer, view +local m_editing, utils = _M.textadept.editing, _M.textadept.keys.utils local SEPARATOR, c = {''}, _SCINTILLA.constants -- The default main menubar. @@ -43,8 +41,8 @@ local menubar = { {_L['_Close'], buffer.close}, {_L['Close All'], io.close_all}, SEPARATOR, - {_L['Loa_d Session...'], m_textadept.session.load}, - {_L['Sav_e Session...'], m_textadept.session.save}, + {_L['Loa_d Session...'], _M.textadept.session.load}, + {_L['Sav_e Session...'], _M.textadept.session.save}, SEPARATOR, {_L['_Quit'], quit}, }, @@ -98,16 +96,16 @@ local menubar = { }, }, { title = _L['_Search'], - {_L['_Find'], gui_find.focus}, - {_L['Find _Next'], gui_find.find_next}, - {_L['Find _Previous'], gui_find.find_prev}, - {_L['_Replace'], gui_find.replace}, - {_L['Replace _All'], gui_find.replace_all}, - {_L['Find _Incremental'], gui_find.find_incremental}, + {_L['_Find'], gui.find.focus}, + {_L['Find _Next'], gui.find.find_next}, + {_L['Find _Previous'], gui.find.find_prev}, + {_L['_Replace'], gui.find.replace}, + {_L['Replace _All'], gui.find.replace_all}, + {_L['Find _Incremental'], gui.find.find_incremental}, SEPARATOR, {_L['Find in Fi_les'], utils.find_in_files}, - {_L['Goto Nex_t File Found'], {gui_find.goto_file_found, false, true}}, - {_L['Goto Previou_s File Found'], {gui_find.goto_file_found, false, false}}, + {_L['Goto Nex_t File Found'], {gui.find.goto_file_found, false, true}}, + {_L['Goto Previou_s File Found'], {gui.find.goto_file_found, false, false}}, SEPARATOR, {_L['_Jump to'], m_editing.goto_line}, }, @@ -115,21 +113,21 @@ local menubar = { {_L['Command _Entry'], {gui.command_entry.enter_mode, 'lua_command'}}, {_L['Select Co_mmand'], utils.select_command}, SEPARATOR, - {_L['_Run'], m_textadept.run.run}, - {_L['_Compile'], m_textadept.run.compile}, - {_L['_Next Error'], {m_textadept.run.goto_error, false, true}}, - {_L['_Previous Error'], {m_textadept.run.goto_error, false, false}}, + {_L['_Run'], _M.textadept.run.run}, + {_L['_Compile'], _M.textadept.run.compile}, + {_L['_Next Error'], {_M.textadept.run.goto_error, false, true}}, + {_L['_Previous Error'], {_M.textadept.run.goto_error, false, false}}, SEPARATOR, { title = _L['_Adeptsense'], - {_L['_Complete Symbol'], m_textadept.adeptsense.complete}, - {_L['Show _Documentation'], m_textadept.adeptsense.show_apidoc}, + {_L['_Complete Symbol'], _M.textadept.adeptsense.complete}, + {_L['Show _Documentation'], _M.textadept.adeptsense.show_apidoc}, }, { title = _L['_Bookmark'], - {_L['_Toggle Bookmark'], m_bookmarks.toggle}, - {_L['_Clear Bookmarks'], m_bookmarks.clear}, - {_L['_Next Bookmark'], m_bookmarks.goto_next}, - {_L['_Previous Bookmark'], m_bookmarks.goto_prev}, - {_L['_Goto Bookmark...'], m_bookmarks.goto_bookmark}, + {_L['_Toggle Bookmark'], _M.textadept.bookmarks.toggle}, + {_L['_Clear Bookmarks'], _M.textadept.bookmarks.clear}, + {_L['_Next Bookmark'], _M.textadept.bookmarks.goto_next}, + {_L['_Previous Bookmark'], _M.textadept.bookmarks.goto_prev}, + {_L['_Goto Bookmark...'], _M.textadept.bookmarks.goto_bookmark}, }, { title = _L['Snap_open'], {_L['Snapopen _User Home'], {io.snapopen, _USERHOME}}, @@ -137,10 +135,10 @@ local menubar = { {_L['Snapopen _Current Directory'], utils.snapopen_filedir}, }, { title = _L['_Snippets'], - {_L['_Insert Snippet...'], Msnippets._select}, - {_L['_Expand Snippet/Next Placeholder'], Msnippets._insert}, - {_L['_Previous Snippet Placeholder'], Msnippets._previous}, - {_L['_Cancel Snippet'], Msnippets._cancel_current}, + {_L['_Insert Snippet...'], _M.textadept.snippets._select}, + {_L['_Expand Snippet/Next Placeholder'], _M.textadept.snippets._insert}, + {_L['_Previous Snippet Placeholder'], _M.textadept.snippets._previous}, + {_L['_Cancel Snippet'], _M.textadept.snippets._cancel_current}, }, SEPARATOR, {_L['Show St_yle'], utils.show_style}, @@ -172,7 +170,7 @@ local menubar = { {_L['UTF-1_6 Encoding'], {utils.set_encoding, 'UTF-16LE'}}, }, SEPARATOR, - {_L['Select _Lexer...'], m_textadept.mime_types.select_lexer}, + {_L['Select _Lexer...'], _M.textadept.mime_types.select_lexer}, {_L['_Refresh Syntax Highlighting'], {buffer.colourise, buffer, 0, -1}}, }, { title = _L['_View'], @@ -228,8 +226,27 @@ local context_menu = { {_L['Select _All'], buffer.select_all} } -local key_shortcuts = {} -local menu_actions, contextmenu_actions = {}, {} +-- Returns the GDK integer keycode and modifier mask for a key sequence. +-- This is used for creating menu accelerators. +-- @param key_seq The string key sequence. +-- @return keycode and modifier mask +local function get_gdk_key(key_seq) + if not key_seq then return nil end + local mods, key = key_seq:match('^([cams]*)(.+)$') + if not mods or not key then return nil end + local modifiers = ((mods:find('s') or key:lower() ~= key) and 1 or 0) + + (mods:find('c') and 4 or 0) + (mods:find('a') and 8 or 0) + + (mods:find('m') and 268435456 or 0) + local byte = string.byte(key) + if #key > 1 or byte < 32 then + for i, s in pairs(keys.KEYSYMS) do + if s == key and i > 0xFE20 then byte = i break end + end + end + return byte, modifiers +end + +local key_shortcuts, menu_actions, contextmenu_actions -- Creates a menu suitable for `gui.menu()` from the menu table format. -- Also assigns key commands. @@ -248,7 +265,7 @@ local function read_menu_table(menu, contextmenu) local label, f = menuitem[1], menuitem[2] local menu_id = not contextmenu and #menu_actions + 1 or #contextmenu_actions + 1000 + 1 - local key, mods = keys.get_gdk_key(key_shortcuts[get_id(f)]) + local key, mods = get_gdk_key(key_shortcuts[get_id(f)]) gtkmenu[#gtkmenu + 1] = {label, menu_id, key, mods} if f then local actions = not contextmenu and menu_actions or contextmenu_actions @@ -259,8 +276,6 @@ local function read_menu_table(menu, contextmenu) return gtkmenu end -local items, commands - -- Builds the item and commands tables for the filtered list dialog. -- @param menu The menu to read from. -- @param title The title of the menu. @@ -280,6 +295,8 @@ local function build_command_tables(menu, title, items, commands) end end +local items, commands + --- -- Sets `gui.menubar` from *menubar*, a table of menus. -- Each menu is an ordered list of menu items and has a `title` key for the @@ -321,19 +338,17 @@ function M.set_contextmenu(menu) end if not CURSES then M.set_contextmenu(context_menu) end -local columns = {_L['Command'], _L['Key Command']} --- -- Prompts the user to select a menu command to run. -- @name select_command function M.select_command() - local i = gui.filteredlist(_L['Run Command'], columns, items, true, + local i = gui.filteredlist(_L['Run Command'], + {_L['Command'], _L['Key Command']}, items, true, CURSES and {'--width', gui.size[1] - 2} or '') if i then keys.run_command(commands[i + 1], type(commands[i + 1])) end end -local events, events_connect = events, events.connect - -events_connect(events.MENU_CLICKED, function(menu_id) +events.connect(events.MENU_CLICKED, function(menu_id) local actions = menu_id < 1000 and menu_actions or contextmenu_actions local action = actions[menu_id < 1000 and menu_id or menu_id - 1000] if type(action) ~= 'function' and type(action) ~= 'table' then @@ -348,10 +363,10 @@ if not CURSES then local lang = _G.buffer:get_lexer(true) M.set_contextmenu(_M[lang] and _M[lang].context_menu or context_menu) end - events_connect(events.LANGUAGE_MODULE_LOADED, set_language_contextmenu) - events_connect(events.BUFFER_AFTER_SWITCH, set_language_contextmenu) - events_connect(events.VIEW_AFTER_SWITCH, set_language_contextmenu) - events_connect(events.BUFFER_NEW, set_lang_contextmenu) + events.connect(events.LANGUAGE_MODULE_LOADED, set_language_contextmenu) + events.connect(events.BUFFER_AFTER_SWITCH, set_language_contextmenu) + events.connect(events.VIEW_AFTER_SWITCH, set_language_contextmenu) + events.connect(events.BUFFER_NEW, set_lang_contextmenu) end return M diff --git a/modules/textadept/mime_types.lua b/modules/textadept/mime_types.lua index 0baa6a8a..90924fb3 100644 --- a/modules/textadept/mime_types.lua +++ b/modules/textadept/mime_types.lua @@ -15,7 +15,6 @@ local M = {} module('_M.textadept.mime_types')]] -- Events. -local events, events_connect = events, events.connect events.LANGUAGE_MODULE_LOADED = 'language_module_loaded' --- @@ -112,19 +111,19 @@ local function set_lexer_functions() buffer.get_lexer, buffer.set_lexer = get_lexer, set_lexer buffer.get_style_name = get_style_name end -events_connect(events.BUFFER_NEW, set_lexer_functions, 1) +events.connect(events.BUFFER_NEW, set_lexer_functions, 1) -- Scintilla's first buffer does not have these. if not RESETTING then set_lexer_functions() end -- Auto-detect lexer on file open or save as. -events_connect(events.FILE_OPENED, function() buffer:set_lexer() end) -events_connect(events.FILE_SAVED_AS, function() buffer:set_lexer() end) +events.connect(events.FILE_OPENED, function() buffer:set_lexer() end) +events.connect(events.FILE_SAVED_AS, function() buffer:set_lexer() end) -- Restores the buffer's lexer. local function restore_lexer() buffer:set_lexer(buffer._lexer) end -events_connect(events.BUFFER_AFTER_SWITCH, restore_lexer) -events_connect(events.VIEW_NEW, restore_lexer) -events_connect(events.RESET_AFTER, restore_lexer) +events.connect(events.BUFFER_AFTER_SWITCH, restore_lexer) +events.connect(events.VIEW_NEW, restore_lexer) +events.connect(events.RESET_AFTER, restore_lexer) --- -- Prompts the user to select a lexer for the current buffer. diff --git a/modules/textadept/run.lua b/modules/textadept/run.lua index e5965fde..91c8a522 100644 --- a/modules/textadept/run.lua +++ b/modules/textadept/run.lua @@ -218,7 +218,6 @@ function M.goto_error(line, next) -- If no line was given, find the next error marker. if not line and next ~= nil then - local buffer = buffer local f = buffer['marker_'..(next and 'next' or 'previous')] line = f(buffer, buffer:line_from_position(buffer.current_pos) + (next and 1 or -1), 2^MARK_ERROR) diff --git a/modules/textadept/session.lua b/modules/textadept/session.lua index e6a9063e..a7cd6dae 100644 --- a/modules/textadept/session.lua +++ b/modules/textadept/session.lua @@ -71,11 +71,9 @@ function M.load(filename) local anchor = tonumber(anchor) or 0 local current_pos = tonumber(current_pos) or 0 local first_visible_line = tonumber(first_visible_line) or 0 - local buffer = buffer buffer._anchor, buffer._current_pos = anchor, current_pos buffer._first_visible_line = first_visible_line - buffer:line_scroll(0, - buffer:visible_from_doc_line(first_visible_line)) + buffer:line_scroll(0, buffer:visible_from_doc_line(first_visible_line)) buffer:set_sel(anchor, current_pos) elseif line:find('^%s*split%d:') then local level, num, type, size = line:match('^(%s*)split(%d): (%S+) (%d+)') @@ -97,10 +95,7 @@ function M.load(filename) local filename = line:match('^recent: (.+)$') local recent, exists = io.recent_files, false for i, file in ipairs(recent) do - if filename == file then - exists = true - break - end + if filename == file then exists = true break end end if not exists then recent[#recent + 1] = filename end end @@ -186,9 +181,9 @@ function M.save(filename) -- Write out other things. local size = gui.size session[#session + 1] = ("size: %d %d"):format(size[1], size[2]) - for i, filename in ipairs(io.recent_files) do + for i = 1, #io.recent_files do if i > M.MAX_RECENT_FILES then break end - session[#session + 1] = ("recent: %s"):format(filename) + session[#session + 1] = ("recent: %s"):format(io.recent_files[i]) end -- Write the session. local f = io.open(filename, 'wb') @@ -203,8 +198,8 @@ events.connect(events.QUIT, function() end, 1) -- Does not save session on quit. -local function no_session() M.SAVE_ON_QUIT = false end -args.register('-n', '--nosession', 0, no_session, 'No session functionality') +args.register('-n', '--nosession', 0, + function() M.SAVE_ON_QUIT = false end, 'No session functionality') -- Loads the given session on startup. args.register('-s', '--session', 1, function(name) if lfs.attributes(name) then M.load(name) return end diff --git a/modules/textadept/snippets.lua b/modules/textadept/snippets.lua index 5917f41c..05324a25 100644 --- a/modules/textadept/snippets.lua +++ b/modules/textadept/snippets.lua @@ -79,19 +79,13 @@ module('_M.textadept.snippets')]=] -- The stack of currently running snippets. local snippet_stack = {} --- Contains newline sequences for `buffer.eol_mode`. --- This table is used by `new_snippet()`. --- @class table --- @name newlines -local newlines = {[0] = '\r\n', '\r', '\n'} - local INDIC_SNIPPET = _SCINTILLA.next_indic_number() +local newlines = {[0] = '\r\n', '\r', '\n'} -- Inserts a new snippet. -- @param text The new snippet to insert. -- @param trigger The trigger text used to expand the snippet, if any. local function new_snippet(text, trigger) - local buffer = buffer local snippet = setmetatable({ trigger = trigger, original_sel_text = buffer:get_sel_text(), @@ -140,7 +134,6 @@ end -- @see buffer.word_chars -- @name _insert function M._insert(text) - local buffer = buffer local trigger if not text then local lexer = buffer:get_lexer(true) @@ -179,7 +172,7 @@ end -- language-specific snippets. -- @name _select function M._select() - local list = {} + local list, t = {}, {} local type = type for trigger, text in pairs(snippets) do if type(text) == 'string' then list[#list + 1] = trigger..'\0 \0'..text end @@ -191,7 +184,6 @@ function M._select() end end table.sort(list) - local t = {} for i = 1, #list do t[#t + 1], t[#t + 2], t[#t + 3] = list[i]:match('^(%Z+)%z(%Z+)%z(%Z+)$') end @@ -238,7 +230,6 @@ M._snippet_mt = { -- @param snippet The snippet returned by `new_snippet()`. -- @param text The snippet's text. set_text = function(snippet, text) - local buffer = buffer buffer.target_start = snippet.start_position buffer.target_end = snippet:get_end_position() buffer:replace_target(text) @@ -341,19 +332,15 @@ M._snippet_mt = { -- Goes to the previous placeholder in a snippet. -- @param snippet The snippet returned by `new_snippet()`. previous = function(snippet) - if snippet.index > 2 then - snippet:set_text(snippet.snapshots[snippet.index - 2]) - snippet.index = snippet.index - 2 - snippet:next() - else - snippet:cancel() - end + if snippet.index <= 2 then snippet:cancel() return end + snippet:set_text(snippet.snapshots[snippet.index - 2]) + snippet.index = snippet.index - 2 + snippet:next() end, -- Cancels a snippet. -- @param snippet The snippet returned by `new_snippet()`. cancel = function(snippet) - local buffer = buffer buffer:set_sel(snippet.start_position, snippet:get_end_position()) buffer:replace_sel(snippet.trigger or snippet.original_sel_text) buffer.indicator_current = INDIC_SNIPPET @@ -364,7 +351,6 @@ M._snippet_mt = { -- Finishes a snippet by going to its "%0" placeholder and cleaning up. -- @param snippet The snippet returned by `new_snippet()`. finish = function(snippet) - local buffer = buffer snippet:set_text(snippet.unescape_text(snippet:get_text(), true)) local s, e = snippet:get_text():find('%%0') if s and e then |