aboutsummaryrefslogtreecommitdiff
path: root/modules
diff options
context:
space:
mode:
Diffstat (limited to 'modules')
-rw-r--r--modules/textadept/adeptsense.lua14
-rw-r--r--modules/textadept/command_entry.lua105
-rw-r--r--modules/textadept/editing.lua134
-rw-r--r--modules/textadept/filter_through.lua80
-rw-r--r--modules/textadept/find.lua68
-rw-r--r--modules/textadept/keys.lua4
-rw-r--r--modules/textadept/menu.lua52
-rw-r--r--modules/textadept/mime_types.lua2
-rw-r--r--modules/textadept/session.lua4
-rw-r--r--modules/textadept/snippets.lua61
10 files changed, 253 insertions, 271 deletions
diff --git a/modules/textadept/adeptsense.lua b/modules/textadept/adeptsense.lua
index 132875d3..e12b9d55 100644
--- a/modules/textadept/adeptsense.lua
+++ b/modules/textadept/adeptsense.lua
@@ -201,13 +201,13 @@ function show_apidoc(sense)
apidocs[i] = doc
end
buffer:call_tip_show(buffer.current_pos, apidocs[apidocs.pos or 1])
- local event_id = events.connect('call_tip_click',
- function(position) -- cycle through calltips
- apidocs.pos = apidocs.pos + (position == 1 and -1 or 1)
- if apidocs.pos > #apidocs then apidocs.pos = 1 end
- if apidocs.pos < 1 then apidocs.pos = #apidocs end
- buffer:call_tip_show(buffer.current_pos, apidocs[apidocs.pos])
- end)
+ -- Cycle through calltips.
+ local event_id = events.connect('call_tip_click', function(position)
+ apidocs.pos = apidocs.pos + (position == 1 and -1 or 1)
+ if apidocs.pos > #apidocs then apidocs.pos = 1 end
+ if apidocs.pos < 1 then apidocs.pos = #apidocs end
+ buffer:call_tip_show(buffer.current_pos, apidocs[apidocs.pos])
+ end)
_G.timeout(1, function()
if buffer:call_tip_active() then return true end
events.disconnect('call_tip_click', event_id)
diff --git a/modules/textadept/command_entry.lua b/modules/textadept/command_entry.lua
index c2a20d92..eac4c99e 100644
--- a/modules/textadept/command_entry.lua
+++ b/modules/textadept/command_entry.lua
@@ -27,66 +27,63 @@ local env = setmetatable({}, {
end,
})
-events.connect('command_entry_command',
- function(command) -- execute a Lua command
- local f, err = loadstring(command)
- if err then error(err) end
- gui.command_entry.focus() -- toggle focus to hide
- setfenv(f, env)
- f()
- events.emit('update_ui')
- end)
+-- Execute a Lua command.
+events.connect('command_entry_command', function(command)
+ local f, err = loadstring(command)
+ if err then error(err) end
+ gui.command_entry.focus() -- toggle focus to hide
+ setfenv(f, env)
+ f()
+ events.emit('update_ui')
+end)
-events.connect('command_entry_keypress',
- function(code)
- local ce = gui.command_entry
- local KEYSYMS = keys.KEYSYMS
- if KEYSYMS[code] == 'esc' then
- ce.focus() -- toggle focus to hide
- return true
- elseif KEYSYMS[code] == '\t' then
- local substring = ce.entry_text:match('[%w_.:]+$') or ''
- local path, o, prefix = substring:match('^([%w_.:]-)([.:]?)([%w_]*)$')
- local f, err = loadstring('return ('..path..')')
- if type(f) == "function" then setfenv(f, env) end
- local ok, tbl = pcall(f)
- local cmpls = {}
- prefix = '^'..prefix
- if not ok then -- shorthand notation
- for _, t in ipairs{ buffer, view, gui, _G } do
- for k in pairs(t) do
- if type(k) == 'string' and k:find(prefix) then
- cmpls[#cmpls + 1] = k
- end
- end
- end
- for f in pairs(_SCINTILLA.functions) do
- if f:find(prefix) then cmpls[#cmpls + 1] = f end
- end
- for p in pairs(_SCINTILLA.properties) do
- 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
+events.connect('command_entry_keypress', function(code)
+ local ce = gui.command_entry
+ local KEYSYMS = keys.KEYSYMS
+ if KEYSYMS[code] == 'esc' then
+ ce.focus() -- toggle focus to hide
+ return true
+ elseif KEYSYMS[code] == '\t' then
+ local substring = ce.entry_text:match('[%w_.:]+$') or ''
+ local path, o, prefix = substring:match('^([%w_.:]-)([.:]?)([%w_]*)$')
+ local f, err = loadstring('return ('..path..')')
+ if type(f) == "function" then setfenv(f, env) end
+ local ok, tbl = pcall(f)
+ local cmpls = {}
+ prefix = '^'..prefix
+ if not ok then -- shorthand notation
+ for _, t in ipairs{ buffer, view, gui, _G } do
+ for k in pairs(t) do
if type(k) == 'string' and k:find(prefix) then
cmpls[#cmpls + 1] = k
end
end
- if path == 'buffer' then
- if o == ':' then
- for f in pairs(_SCINTILLA.functions) do
- if f:find(prefix) then cmpls[#cmpls + 1] = f end
- end
- else
- for p in pairs(_SCINTILLA.properties) do
- if p:find(prefix) then cmpls[#cmpls + 1] = p end
- end
+ end
+ for f in pairs(_SCINTILLA.functions) do
+ if f:find(prefix) then cmpls[#cmpls + 1] = f end
+ end
+ for p in pairs(_SCINTILLA.properties) do
+ 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(k) == 'string' and k:find(prefix) then cmpls[#cmpls + 1] = k end
+ end
+ if path == 'buffer' then
+ if o == ':' then
+ for f in pairs(_SCINTILLA.functions) do
+ if f:find(prefix) then cmpls[#cmpls + 1] = f end
+ end
+ else
+ for p in pairs(_SCINTILLA.properties) do
+ if p:find(prefix) then cmpls[#cmpls + 1] = p end
end
end
end
- table.sort(cmpls)
- ce.show_completions(cmpls)
- return true
end
- end)
+ table.sort(cmpls)
+ ce.show_completions(cmpls)
+ return true
+ end
+end)
diff --git a/modules/textadept/editing.lua b/modules/textadept/editing.lua
index df3b1951..c26ed082 100644
--- a/modules/textadept/editing.lua
+++ b/modules/textadept/editing.lua
@@ -58,8 +58,7 @@ comment_string = {}
-- @class table
-- @name char_matches
local char_matches = {
- [40] = ')', [91] = ']', [123] = '}',
- [39] = "'", [34] = '"'
+ [40] = ')', [91] = ']', [123] = '}', [39] = "'", [34] = '"'
}
-- Brace characters.
@@ -77,67 +76,67 @@ local braces = { -- () [] {} <>
-- @name current_call_tip
local current_call_tip = {}
-events.connect('char_added',
- function(c) -- matches characters specified in char_matches
- if AUTOPAIR and char_matches[c] and buffer.selections == 1 then
- buffer:insert_text(-1, char_matches[c])
- end
- end)
+-- Matches characters specified in char_matches.
+events.connect('char_added', function(c)
+ if AUTOPAIR and char_matches[c] and buffer.selections == 1 then
+ buffer:insert_text(-1, char_matches[c])
+ end
+end)
-events.connect('keypress',
- function(code, shift, control, alt) -- removes matched chars on backspace
- if not AUTOPAIR or K[code] ~= '\b' or buffer.selections ~= 1 then return end
- local buffer = buffer
- local current_pos = buffer.current_pos
- local c = buffer.char_at[current_pos - 1]
- if char_matches[c] and
- buffer.char_at[current_pos] == string.byte(char_matches[c]) then
- buffer:clear()
- end
- end)
+-- Removes matched chars on backspace.
+events.connect('keypress', function(code, shift, control, alt)
+ if not AUTOPAIR or K[code] ~= '\b' or buffer.selections ~= 1 then return end
+ local buffer = buffer
+ local current_pos = buffer.current_pos
+ local c = buffer.char_at[current_pos - 1]
+ if char_matches[c] and
+ buffer.char_at[current_pos] == string.byte(char_matches[c]) then
+ buffer:clear()
+ end
+end)
-events.connect('update_ui',
- function() -- highlights matching braces
- if not HIGHLIGHT_BRACES then return end
- local buffer = buffer
- local current_pos = buffer.current_pos
- if braces[buffer.char_at[current_pos]] and
- buffer:get_style_name(buffer.style_at[current_pos]) == 'operator' then
- local pos = buffer:brace_match(current_pos)
- if pos ~= -1 then
- buffer:brace_highlight(current_pos, pos)
- else
- buffer:brace_bad_light(current_pos)
- end
+-- Highlights matching braces.
+events.connect('update_ui', function()
+ if not HIGHLIGHT_BRACES then return end
+ local buffer = buffer
+ local current_pos = buffer.current_pos
+ if braces[buffer.char_at[current_pos]] and
+ buffer:get_style_name(buffer.style_at[current_pos]) == 'operator' then
+ local pos = buffer:brace_match(current_pos)
+ if pos ~= -1 then
+ buffer:brace_highlight(current_pos, pos)
else
- buffer:brace_bad_light(-1)
+ buffer:brace_bad_light(current_pos)
end
- end)
+ else
+ buffer:brace_bad_light(-1)
+ end
+end)
-events.connect('char_added',
- function(char) -- auto-indent on return
- if not AUTOINDENT or char ~= 10 then return end
- local buffer = buffer
- local anchor, caret = buffer.anchor, buffer.current_pos
- local line = buffer:line_from_position(caret)
- local pline = line - 1
- while pline >= 0 and #buffer:get_line(pline) == 1 do pline = pline - 1 end
- if pline >= 0 then
- local indentation = buffer.line_indentation[pline]
- local s = buffer.line_indent_position[line]
- buffer.line_indentation[line] = indentation
- local e = buffer.line_indent_position[line]
- local diff = e - s
- if e > s then -- move selection on
- if anchor >= s then anchor = anchor + diff end
- if caret >= s then caret = caret + diff end
- elseif e < s then -- move selection back
- if anchor >= e then anchor = anchor >= s and anchor + diff or e end
- if caret >= e then caret = caret >= s and caret + diff or e end
- end
- buffer:set_sel(anchor, caret)
+-- Auto-indent on return.
+events.connect('char_added', function(char)
+ if not AUTOINDENT or char ~= 10 then return end
+ local buffer = buffer
+ local anchor, caret = buffer.anchor, buffer.current_pos
+ local line = buffer:line_from_position(caret)
+ local pline = line - 1
+ while pline >= 0 and #buffer:get_line(pline) == 1 do pline = pline - 1 end
+ if pline >= 0 then
+ local indentation = buffer.line_indentation[pline]
+ local s = buffer.line_indent_position[line]
+ buffer.line_indentation[line] = indentation
+ local e = buffer.line_indent_position[line]
+ local diff = e - s
+ if e > s then -- move selection on
+ if anchor >= s then anchor = anchor + diff end
+ if caret >= s then caret = caret + diff end
+ elseif e < s then -- move selection back
+ if anchor >= e then anchor = anchor >= s and anchor + diff or e end
+ if caret >= e then caret = caret >= s and caret + diff or e end
end
- end)
+ buffer:set_sel(anchor, caret)
+ end
+end)
---
-- Goes to a matching brace position, selecting the text inside if specified.
@@ -226,12 +225,11 @@ end
-- @param line Optional line number to go to.
function goto_line(line)
if not line then
- line = gui.dialog('standard-inputbox',
- '--title', L('Go To'),
- '--text', L('Line Number:'),
- '--no-newline')
- line = tonumber(line:match('%-?%d+$'))
- if not line or line < 0 then return end
+ line = tonumber(gui.dialog('standard-inputbox',
+ '--title', L('Go To'),
+ '--text', L('Line Number:'),
+ '--no-newline'):match('%-?%d+$'))
+ if not line then return end
end
buffer:ensure_visible_enforce_policy(line - 1)
buffer:goto_line(line - 1)
@@ -264,7 +262,7 @@ function prepare_for_save()
-- 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
+ lines > 1 and e > buffer:position_from_line(lines - 1) then
buffer:insert_text(e, '\n')
end
-- Convert non-consistent EOLs
@@ -384,15 +382,14 @@ function select_indented_block()
if indent < 0 then return end
if buffer:get_sel_text() ~= '' then
if buffer.line_indentation[s - 1] == indent and
- buffer.line_indentation[e + 1] == indent then
+ buffer.line_indentation[e + 1] == indent then
s, e = s - 1, e + 1
indent = indent + buffer.indent -- do not run while loops
end
end
while buffer.line_indentation[s - 1] > indent do s = s - 1 end
while buffer.line_indentation[e + 1] > indent do e = e + 1 end
- s = buffer:position_from_line(s)
- e = buffer.line_end_position[e]
+ s, e = buffer:position_from_line(s), buffer.line_end_position[e]
buffer:set_sel(s, e)
end
@@ -426,8 +423,7 @@ function convert_indentation()
new_indentation = (' '):rep(indent)
end
if current_indentation ~= new_indentation then
- buffer.target_start = s
- buffer.target_end = indent_pos
+ buffer.target_start, buffer.target_end = s, indent_pos
buffer:replace_target(new_indentation)
end
end
diff --git a/modules/textadept/filter_through.lua b/modules/textadept/filter_through.lua
index a3094c0c..6861166f 100644
--- a/modules/textadept/filter_through.lua
+++ b/modules/textadept/filter_through.lua
@@ -26,47 +26,45 @@ function filter_through()
gui.command_entry.focus()
end
-events.connect('command_entry_keypress',
- function(code)
- if filter_through_active and code == 0xff1b then -- escape
- filter_through_active = false
- end
- end, 1) -- place before command_entry.lua's handler (if necessary)
+events.connect('command_entry_keypress', function(code)
+ if filter_through_active and code == 0xff1b then -- escape
+ filter_through_active = false
+ end
+end, 1) -- place before command_entry.lua's handler (if necessary)
-events.connect('command_entry_command',
- function(text) -- filter through
- if filter_through_active then
- local buffer = buffer
- local s, e = buffer.selection_start, buffer.selection_end
- local input
- if s ~= e then -- use selected lines as input
- local i, j = buffer:line_from_position(s), buffer:line_from_position(e)
- if i < j then
- s = buffer:position_from_line(i)
- if buffer.column[e] > 0 then e = buffer:position_from_line(j + 1) end
- end
- input = buffer:text_range(s, e)
- else -- use whole buffer as input
- input = buffer:get_text()
- end
- local f = io.open(tmpfile, 'wb')
- f:write(input)
- f:close()
- local cmd = table.concat({ cat, '"'..tmpfile..'"', '|', text }, ' ')
- if WIN32 then cmd = cmd:gsub('/', '\\') end
- local p = io.popen(cmd)
- if s ~= e then
- buffer.target_start, buffer.target_end = s, e
- buffer:replace_target(p:read('*all'))
- buffer:set_sel(buffer.target_start, buffer.target_end)
- else
- buffer:set_text(p:read('*all'))
- buffer:goto_pos(s)
+-- Filter through.
+events.connect('command_entry_command', function(text)
+ if filter_through_active then
+ local buffer = buffer
+ local s, e = buffer.selection_start, buffer.selection_end
+ local input
+ if s ~= e then -- use selected lines as input
+ local i, j = buffer:line_from_position(s), buffer:line_from_position(e)
+ if i < j then
+ s = buffer:position_from_line(i)
+ if buffer.column[e] > 0 then e = buffer:position_from_line(j + 1) end
end
- p:close()
- os.remove(tmpfile)
- filter_through_active = false
- return true
+ input = buffer:text_range(s, e)
+ else -- use whole buffer as input
+ input = buffer:get_text()
end
- end, 1) -- place before command_entry.lua's handler (if necessary)
-
+ local f = io.open(tmpfile, 'wb')
+ f:write(input)
+ f:close()
+ local cmd = table.concat({ cat, '"'..tmpfile..'"', '|', text }, ' ')
+ if WIN32 then cmd = cmd:gsub('/', '\\') end
+ local p = io.popen(cmd)
+ if s ~= e then
+ buffer.target_start, buffer.target_end = s, e
+ buffer:replace_target(p:read('*all'))
+ buffer:set_sel(buffer.target_start, buffer.target_end)
+ else
+ buffer:set_text(p:read('*all'))
+ buffer:goto_pos(s)
+ end
+ p:close()
+ os.remove(tmpfile)
+ filter_through_active = false
+ return true
+ end
+end, 1) -- place before command_entry.lua's handler (if necessary)
diff --git a/modules/textadept/find.lua b/modules/textadept/find.lua
index 68fcfaf7..e4b1d967 100644
--- a/modules/textadept/find.lua
+++ b/modules/textadept/find.lua
@@ -166,31 +166,30 @@ function find.find_incremental()
gui.command_entry.focus()
end
-events.connect('command_entry_keypress',
- function(code)
- local K = _G.keys.KEYSYMS
- if find.incremental then
- if K[code] == 'esc' then
- find.incremental = nil
- elseif code < 256 or K[code] == '\b' then
- local text = gui.command_entry.entry_text
- if K[code] == '\b' then
- find_incremental(text:sub(1, -2))
- else
- find_incremental(text..string.char(code))
- end
+events.connect('command_entry_keypress', function(code)
+ local K = _G.keys.KEYSYMS
+ if find.incremental then
+ if K[code] == 'esc' then
+ find.incremental = nil
+ elseif code < 256 or K[code] == '\b' then
+ local text = gui.command_entry.entry_text
+ if K[code] == '\b' then
+ find_incremental(text:sub(1, -2))
+ else
+ find_incremental(text..string.char(code))
end
end
- end, 1) -- place before command_entry.lua's handler (if necessary)
+ end
+end, 1) -- place before command_entry.lua's handler (if necessary)
-events.connect('command_entry_command',
- function(text) -- 'find next' for incremental search
- if find.incremental then
- find.incremental_start = buffer.current_pos + 1
- find_incremental(text)
- return true
- end
- end, 1) -- place before command_entry.lua's handler (if necessary)
+-- 'Find next' for incremental search.
+events.connect('command_entry_command', function(text)
+ if find.incremental then
+ find.incremental_start = buffer.current_pos + 1
+ find_incremental(text)
+ return true
+ end
+end, 1) -- place before command_entry.lua's handler (if necessary)
-- Replaces found text.
-- 'find_' is called first, to select any found text. The selected text is then
@@ -212,19 +211,18 @@ local function replace(rtext)
rtext = rtext:gsub('%%'..i, v)
end
end
- local ok, rtext = pcall(rtext.gsub, rtext, '%%(%b())',
- function(code)
- local ok, val = pcall(loadstring('return '..code))
- if not ok then
- gui.dialog('ok-msgbox',
- '--title', L('Error'),
- '--text', L('An error occured:'),
- '--informative-text', val:gsub('"', '\\"'),
- '--no-cancel')
- error()
- end
- return val
- end)
+ local ok, rtext = pcall(rtext.gsub, rtext, '%%(%b())', function(code)
+ local ok, val = pcall(loadstring('return '..code))
+ if not ok then
+ gui.dialog('ok-msgbox',
+ '--title', L('Error'),
+ '--text', L('An error occured:'),
+ '--informative-text', val:gsub('"', '\\"'),
+ '--no-cancel')
+ error()
+ end
+ return val
+ end)
if ok then
rtext = rtext:gsub('\\037', '%%') -- unescape '%'
buffer:replace_target(rtext:gsub('\\[abfnrtv\\]', escapes))
diff --git a/modules/textadept/keys.lua b/modules/textadept/keys.lua
index 584f37f0..257b6842 100644
--- a/modules/textadept/keys.lua
+++ b/modules/textadept/keys.lua
@@ -36,9 +36,7 @@ local function toggle_setting(setting, i)
end
local RECENT_FILES = 1
events.connect('user_list_selection',
- function(type, text)
- if type == RECENT_FILES then io.open_file(text) end
- end)
+ function(type, text) if type == RECENT_FILES then io.open_file(text) end end)
local function show_recent_file_list()
local buffer = buffer
local files = {}
diff --git a/modules/textadept/menu.lua b/modules/textadept/menu.lua
index e3ef2576..a914cb83 100644
--- a/modules/textadept/menu.lua
+++ b/modules/textadept/menu.lua
@@ -366,32 +366,30 @@ set_menubar(menubar)
set_contextmenu(context_menu)
-- Most of this handling code comes from keys.lua.
-events.connect('menu_clicked',
- function(menu_id)
- local active_table
- if menu_id > 1000 then
- active_table = context_actions[menu_id - 1000]
- else
- active_table = menu_actions[menu_id]
- end
- local f, args
- if active_table and #active_table > 0 then
- local func = active_table[1]
- if type(func) == 'function' then
- f, args = func, { unpack(active_table, 2) }
- elseif type(func) == 'string' then
- local object = active_table[2]
- if object == 'buffer' then
- f, args = buffer[func], { buffer, unpack(active_table, 3) }
- elseif object == 'view' then
- f, args = view[func], { view, unpack(active_table, 3) }
- end
- end
- if f and args then
- local ret, retval = pcall(f, unpack(args))
- if not ret then error(retval) end
- else
- error(L('Unknown command:')..' '..tostring(func))
+events.connect('menu_clicked', function(menu_id)
+ local active_table
+ if menu_id > 1000 then
+ active_table = context_actions[menu_id - 1000]
+ else
+ active_table = menu_actions[menu_id]
+ end
+ local f, args
+ if active_table and #active_table > 0 then
+ local func = active_table[1]
+ if type(func) == 'function' then
+ f, args = func, { unpack(active_table, 2) }
+ elseif type(func) == 'string' then
+ local object = active_table[2]
+ if object == 'buffer' or object == 'view' then
+ local v = _G[object]
+ f, args = v[func], { v, unpack(active_table, 3) }
end
end
- end)
+ if f and args then
+ local ret, retval = pcall(f, unpack(args))
+ if not ret then error(retval) end
+ else
+ error(L('Unknown command:')..' '..tostring(func))
+ end
+ end
+end)
diff --git a/modules/textadept/mime_types.lua b/modules/textadept/mime_types.lua
index eaa4302a..534b2fcd 100644
--- a/modules/textadept/mime_types.lua
+++ b/modules/textadept/mime_types.lua
@@ -151,7 +151,7 @@ events.connect('buffer_new', function()
buffer.set_lexer, buffer.get_lexer = set_lexer, get_lexer
buffer.get_style_name = get_style_name
end)
--- Scintilla's first buffer doesn't have these
+-- Scintilla's first buffer doesn't have these.
if not RESETTING then
buffer.set_lexer, buffer.get_lexer = set_lexer, get_lexer
buffer.get_style_name = get_style_name
diff --git a/modules/textadept/session.lua b/modules/textadept/session.lua
index 6127c779..503ee248 100644
--- a/modules/textadept/session.lua
+++ b/modules/textadept/session.lua
@@ -93,8 +93,8 @@ function load(filename)
end
return true
end
-events.connect('arg_none', -- load session when no args are present
- function() if SAVE_ON_QUIT then load() end end)
+-- Load session when no args are present.
+events.connect('arg_none', function() if SAVE_ON_QUIT then load() end end)
---
-- Saves a Textadept session to a file.
diff --git a/modules/textadept/snippets.lua b/modules/textadept/snippets.lua
index 4ee3d85f..648909e4 100644
--- a/modules/textadept/snippets.lua
+++ b/modules/textadept/snippets.lua
@@ -140,7 +140,7 @@ local snippet_stack = {}
-- @return string with escapes handled.
local function handle_escapes(s)
return s:gsub('%%([%%`%)|#])',
- function(char) return ("\\%03d"):format(char:byte()) end)
+ function(char) return ("\\%03d"):format(char:byte()) end)
end
-- Replaces octal characters with their escaped equivalents in a given string.
@@ -203,26 +203,25 @@ local function next_tab_stop()
local function transform_mirror(mirror)
local pattern, replacement = mirror:match('^%(([^|]+)|(.+)%)$')
if not pattern and not replacement then return ph_text end
- return ph_text:gsub(unhandle_escapes(pattern),
- function(...)
- local arg = {...}
- local repl = replacement:gsub('%%(%d+)',
- function(i) return arg[tonumber(i)] or '' end)
- return repl:gsub('#(%b())', run_lua_code)
- end, 1)
+ return ph_text:gsub(unhandle_escapes(pattern), function(...)
+ local arg = {...}
+ local repl = replacement:gsub('%%(%d+)', function(i)
+ return arg[tonumber(i)] or ''
+ end)
+ return repl:gsub('#(%b())', run_lua_code)
+ end, 1)
end
s_text = s_text:gsub('%%'..index..'(%b())', transform_mirror)
-- Regular mirror.
- s_text = s_text:gsub('()%%'..index,
- function(pos)
- for mirror, e in s_text:gmatch('%%%d+(%b())()') do
- local s = mirror:find('|')
- -- If inside transform, do not do anything.
- if s and pos > s and pos < e then return nil end
- end
- return ph_text
- end)
+ s_text = s_text:gsub('()%%'..index, function(pos)
+ for mirror, e in s_text:gmatch('%%%d+(%b())()') do
+ local s = mirror:find('|')
+ -- If inside transform, do not do anything.
+ if s and pos > s and pos < e then return nil end
+ end
+ return ph_text
+ end)
buffer:set_sel(s_start, s_end)
buffer:replace_sel(s_text)
@@ -269,14 +268,13 @@ local function next_tab_stop()
end
-- Place additional carets at mirrors.
local _, _, text = snippet_info()
- text = text:gsub('(%%%d+%b())',
- function(mirror)
- -- Lua code in replacement mirrors may contain '%'
- -- sequences; do not treat as mirrors
- if mirror:find('|') then
- return string.rep('_', #mirror)
- end
- end)
+ text = text:gsub('(%%%d+%b())', function(mirror)
+ -- Lua code in replacement mirrors may contain '%'
+ -- sequences; do not treat as mirrors
+ if mirror:find('|') then
+ return string.rep('_', #mirror)
+ end
+ end)
for s, e in text:gmatch('()%%'..index..'()[^(]') do
buffer:add_selection(s_start + s - 1, s_start + e - 1)
end
@@ -345,13 +343,12 @@ function _insert(s_text)
-- Execute Lua and shell code.
s_text = s_text:gsub('%%(%b())', run_lua_code)
- s_text = s_text:gsub('`([^`]+)`',
- function(code)
- local p = io.popen(code)
- local out = p:read('*all'):sub(1, -2)
- p:close()
- return out
- end)
+ s_text = s_text:gsub('`([^`]+)`', function(code)
+ local p = io.popen(code)
+ local out = p:read('*all'):sub(1, -2)
+ p:close()
+ return out
+ end)
-- Initialize the new snippet. If one is running, push it onto the stack.
if snippet.index then snippet_stack[#snippet_stack + 1] = snippet end