62 lines
1.8 KiB
Lua
62 lines
1.8 KiB
Lua
-- lite-xl 1.16
|
|
|
|
local core = require "core"
|
|
local command = require "core.command"
|
|
local keymap = require "core.keymap"
|
|
|
|
-- Takes the following pattern: /pattern/replace/
|
|
-- Capture groupings can be replaced using \1 through \9
|
|
local function regex_replace_file(pattern)
|
|
local doc = core.active_view.doc
|
|
|
|
local start_pattern = 2;
|
|
local end_pattern = 2
|
|
repeat
|
|
end_pattern = string.find(pattern, "/", end_pattern)
|
|
until end_pattern == nil or pattern[end_pattern-1] ~= "\\"
|
|
if end_pattern == nil then
|
|
core.log("Can't find end to pattern.")
|
|
return
|
|
end
|
|
end_pattern = end_pattern - 1
|
|
local start_replacement = end_pattern+2;
|
|
local end_replacement = end_pattern+2;
|
|
repeat
|
|
end_replacement = string.find(pattern, "/", end_replacement)
|
|
until end_replacement == nil or pattern[end_replacement-1] ~= "\\"
|
|
if end_replacement == nil then
|
|
core.log("Can't find end to replacement.")
|
|
return
|
|
end
|
|
end_replacement = end_replacement - 1
|
|
|
|
local re = regex.compile(pattern:sub(start_pattern, end_pattern))
|
|
local replacement = pattern:sub(start_replacement, end_replacement)
|
|
for i=1,#doc.lines do
|
|
local old_length = #doc.lines[i]
|
|
local old_text = doc:get_text(i, 1, i, old_length)
|
|
local new_text = regex.gsub(re, old_text, replacement)
|
|
if old_text ~= new_text then
|
|
doc:insert(i, old_length, new_text)
|
|
doc:remove(i, 1, i, old_length)
|
|
end
|
|
end
|
|
end
|
|
|
|
local initial_regex_replace = "/"
|
|
command.add("core.docview", {
|
|
["regex:find-replace"] = function()
|
|
core.command_view:set_text(initial_regex_replace)
|
|
core.command_view:enter(
|
|
"Regex Replace (enter pattern as /old/new/)",
|
|
function(pattern)
|
|
regex_replace_file(pattern)
|
|
initial_regex_replace = pattern
|
|
end
|
|
)
|
|
end
|
|
})
|
|
|
|
|
|
keymap.add { ["ctrl+shift+r"] = "regex:find-replace" }
|