Не знаете как писать на Lua - жмите ШифтПробел:
Code: Select all
<?xml version="1.0" encoding="UTF-8" ?>
<farconfig>
<macros>
<keymacros>
<macro area="Editor" key="ShiftSpace" flags="DisableOutput" description="Список завершения MacroLua. © SimSU">
<text>
<![CDATA[
--[[1]]--Список завершения MacroLua. © SimSU
-- Назначается, например, на ShiftSpace в редакторе.
Letters="ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz1234567890"
IsLetter=function(Str,I)
return Letters:find(I>0 and I<=Str:len() and Str:sub(I,I) or " ",1,true) -- s:find("",1,true) виснет/зацикливается при ""
end
--------------------------------------------------------------------------
Editor.Undo(0)
InitPos=Editor.RealPos
s=Editor.Value
i=InitPos while IsLetter(s,i) do i=i+1 end End=i -- Ищем конец слова c курсором.
i=InitPos while IsLetter(s,i-1) do i=i-1 end Beg=i -- Ищем начало слова c курсором.
-- Выделяем найденое слово, если слово не нашли, то выделение просто снимется из-за равенства Beg и End.
Editor.Pos(1,2,Beg) Editor.Sel(2,0)
Editor.Pos(1,2,End) Editor.Sel(2,1)
Editor.Pos(1,2,InitPos)
-- Если перед словом стоит точка, будем искать таблицы.
Table={}
while s:sub(i-1,i-1)=="." and IsLetter(s,i-2) do -- Собираем цепочку таблиц Типа _G._G. ... APanel.
EndTable=i i=i-1
while IsLetter(s,i-1) do i=i-1 end
if i~=EndTable then
Table[#Table+1]=s:sub(i,EndTable-2)
end
end
-- Ищем таблицу
CurTable=_G
for i=#Table,1,-1 do
ExistProp=false; for k in pairs(CurTable) do if k==Table[i] then ExistProp=true end end -- type(Area.["dd"]) вызывает ошибку вместо возвращения "nil".
if ExistProp and type(CurTable[Table[i]])=="table" then
CurTable=CurTable[Table[i]]
else
CurTable=nil
end
end
-- Строим список вариантов.
Items={}
if type(CurTable)=="table" then
for k in pairs(CurTable) do
local t=type(CurTable[k])
if t=="table" then Items[#Items+1]=k.."."
elseif t=="function" then Items[#Items+1]=k.."()"
else Items[#Items+1]=k
end
end
if CurTable==_G then
Items[#Items+1]="if then elseif then else end"
Items[#Items+1]="for in do end"
Items[#Items+1]="while do end"
Items[#Items+1]="repeat until "
end
if type(CurTable.properties)=="table" then
for k in pairs(CurTable.properties) do
Items[#Items+1]=k
end
end
end
Items=table.concat(Items,"\n")
-- Выводим меню
Flags=0x3+0x20+0x100
Selected=Menu.Show(Items,"\nEnter-выбор",Flags,Editor.SelValue)
-- Обрабатываем выбор
if Selected~="" then
Keys("CtrlD") print(Selected)
else
Editor.Sel(4)
end
Editor.Undo(1)
]]>
</text>
</macro>
</keymacros>
</macros>
</farconfig>
упростил=минимизировал код, как просили (избавился от ";" применил сокращения-свёртки): скорость работы практически не изменилась, но читабельность, имхо, упала.
расширил=усложнил - теперь макрос понимает вложенные таблицы нескольких уровней: a.a.a....