#function #lua #command-prompt
#функция #lua #командная строка
Вопрос:
Я могу установить приглашение с _PROMPT = "> "
помощью , но могу ли я обновлять приглашение каждый раз?
Я пробовал это, но это не работает:
i = 0
function inc()
i = i 1
return i
end
_PROMPT = inc
Это показывает _PROMPT
, но ничего не связано:
for k, v in pairs(_G) do
print(k)
end
Комментарии:
1. К сожалению, единственная причина
_PROMPT
, по которой она была включена в выводfor k, v in pairs(_G) do print(k) end
, заключается в том, что я сам ее установил. Таким образом, я не могу найти какую-либо специальную переменную с помощью этого метода.2. lua -i -e «_PROMPT = ‘A > ‘ ; _PROMPT2 = ‘B >> ‘»
Ответ №1:
Основным приглашением является значение глобальной переменной _PROMPT, если это значение является строкой; в противном случае используется приглашение по умолчанию.
https://www.lua.org/manual/5.1/lua.html
Вы назначили функцию _PROMPT
.
Я пытался
_PROMPT = {no = 0}; setmetatable (_PROMPT, {__tostring = function (self) self.no = self.no 1; return tostring (self.no) .. ' >' end})
, но не повезло, хотя _PROMPT
увеличивался каждый раз, когда я печатал = _PROMPT
.
UPD И все же это можно сделать! В списке рассылки Lua мне посоветовали использовать
setmetatable(_ENV, {__index = function(t, k) if k == '_PROMPT' then t._N = (t._N or 0) 1; return t._N .. ' >' end end})
Это работает. Это эффективный способ переопределить любой глобальный в более глубоком смысле, чем просто присвоить ему новое значение или сделать набор глобальных переменных фактически бесконечным.
Вы можете запустить Lua в интерактивном режиме с помощью однострочного:
lua -i -e "setmetatable(_ENV, {__index = function(t, k) if k == '_PROMPT' then t._N = (t._N or 0) 1; return t._N .. ' >' end end})"
Ответ №2:
Я нашел метод с debug.sethook()
помощью .
Это звучит немного странно, но это действительно просто 😉
Поехали…
# /usr/bin/lua -i
Lua 5.3.5 Copyright (C) 1994-2018 Lua.org, PUC-Rio
> debug.sethook(function(...) _PROMPT=os.date('%H:%M:%S # ') end,'r')
10:49:42 # -- Hiting ENTER some times
10:51:00 #
10:51:01 #
10:51:05 #
(Сделано с Lua 5.3.5 и протестировано 5.4 — должно работать с 5.1, но не протестировано)
'r'
Средство: срабатывает при каждом возврате
ОТРЕДАКТИРУЙТЕ
другим способом непосредственно с _PROMPT
помощью and _PROMPT2
…
-- Simple method for changing and/or time logging the prompts
_PROMPT=setmetatable({},{__index=table})
_PROMPT2=setmetatable({},{__index=table})
getmetatable(_PROMPT).__tostring=function()
_PROMPT:insert(os.date('%H:%M:%S',os.time())..'> ')
return string.format('%s',_PROMPT:concat(#_PROMPT,#_PROMPT))
end
getmetatable(_PROMPT2).__tostring=function()
_PROMPT2:insert(os.date('%H:%M:%S',os.time())..'>> ')
return string.format('%s',_PROMPT2:concat(#_PROMPT2,#_PROMPT2))
end
…использование __tostring и __index имеет table
метаметоды.
… много веселья и будьте здоровы.