When a command is performed with parameters, those are now passed to the predicate. The predicate can then return, after the validity boolean, any other value that will then be passed to the actual command. If the predicate only returns the validity boolean, the original parameters are passed through to the actual command. This allows predicates to manipulate the received parameters, and allows them to pass the result of an expensive computation to the actual command, which won't have to recalculate it. String and table predicates will now also return `core.active_view`.
38 lines
886 B
Lua
38 lines
886 B
Lua
-- mod-version:3
|
|
local core = require "core"
|
|
local command = require "core.command"
|
|
local Doc = require "core.doc"
|
|
|
|
|
|
local function trim_trailing_whitespace(doc)
|
|
local cline, ccol = doc:get_selection()
|
|
for i = 1, #doc.lines do
|
|
local old_text = doc:get_text(i, 1, i, math.huge)
|
|
local new_text = old_text:gsub("%s*$", "")
|
|
|
|
-- don't remove whitespace which would cause the caret to reposition
|
|
if cline == i and ccol > #new_text then
|
|
new_text = old_text:sub(1, ccol - 1)
|
|
end
|
|
|
|
if old_text ~= new_text then
|
|
doc:insert(i, 1, new_text)
|
|
doc:remove(i, #new_text + 1, i, math.huge)
|
|
end
|
|
end
|
|
end
|
|
|
|
|
|
command.add("core.docview", {
|
|
["trim-whitespace:trim-trailing-whitespace"] = function(dv)
|
|
trim_trailing_whitespace(dv.doc)
|
|
end,
|
|
})
|
|
|
|
|
|
local save = Doc.save
|
|
Doc.save = function(self, ...)
|
|
trim_trailing_whitespace(self)
|
|
save(self, ...)
|
|
end
|