mirror of
https://github.com/zyedidia/micro.git
synced 2026-03-10 06:40:24 +09:00
The plugin adds an option `autoclose` to configure whether or not you would like quotes, brackets etc... to be automatically closed. The option is enabled by default. Closes #176
79 lines
2.2 KiB
Lua
79 lines
2.2 KiB
Lua
getmetatable('').__index = function(str,i) return string.sub(str,i,i) end
|
|
|
|
if GetOption("autoclose") == nil then
|
|
AddOption("autoclose", true)
|
|
end
|
|
|
|
local autoclosePairs = {"\"\"", "''", "()", "{}", "[]"}
|
|
local autoNewlinePairs = {"()", "{}", "[]"}
|
|
|
|
function onRune(r)
|
|
if not GetOption("autoclose") then
|
|
return
|
|
end
|
|
|
|
local v = CurView()
|
|
for i = 1, #autoclosePairs do
|
|
if r == autoclosePairs[i][2] then
|
|
local curLine = v.Buf:Line(v.Cursor.Y)
|
|
|
|
if curLine[v.Cursor.X+1] == autoclosePairs[i][2] then
|
|
v:Backspace()
|
|
v:CursorRight()
|
|
break
|
|
end
|
|
|
|
if v.Cursor.X > 1 and (IsWordChar(curLine[v.Cursor.X-1]) or curLine[v.Cursor.X-1] == autoclosePairs[i][1]) then
|
|
break
|
|
end
|
|
end
|
|
if r == autoclosePairs[i][1] then
|
|
local curLine = v.Buf:Line(v.Cursor.Y)
|
|
|
|
if v.Cursor.X == #curLine or not IsWordChar(curLine[v.Cursor.X+1]) then
|
|
-- the '-' here is to derefence the pointer to v.Cursor.Loc which is automatically made
|
|
-- when converting go structs to lua
|
|
-- It needs to be dereferenced because the function expects a non pointer struct
|
|
v.Buf:Insert(-v.Cursor.Loc, autoclosePairs[i][2])
|
|
break
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
function onInsertEnter()
|
|
if not GetOption("autoclose") then
|
|
return
|
|
end
|
|
|
|
local v = CurView()
|
|
local curLine = v.Buf:Line(v.Cursor.Y)
|
|
local lastLine = v.Buf:Line(v.Cursor.Y-1)
|
|
local curRune = lastLine[#lastLine]
|
|
local nextRune = curLine[1]
|
|
|
|
for i = 1, #autoNewlinePairs do
|
|
if curRune == autoNewlinePairs[i][1] then
|
|
if nextRune == autoNewlinePairs[i][2] then
|
|
v:InsertTab()
|
|
v.Buf:Insert(-v.Cursor.Loc, "\n")
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
function onBackspace()
|
|
if not GetOption("autoclose") then
|
|
return
|
|
end
|
|
|
|
local v = CurView()
|
|
|
|
for i = 1, #autoclosePairs do
|
|
local curLine = v.Buf:Line(v.Cursor.Y)
|
|
if curLine[v.Cursor.X+1] == autoclosePairs[i][2] then
|
|
v:Delete()
|
|
end
|
|
end
|
|
end
|