Lua 提示 |
|
luaprompt 特色
作為提示模組的 luaprompt 和作為獨立直譯器的 luap,都可以透過 LuaRocks 使用以下命令來安裝:
luarocks install luaprompt
這樣將會安裝模組和直譯器,並套用預設組態,但您也可以自訂 luaprompt 的行為。請參閱 [luaprompt 的 GitHub 頁面],以取得關於如何建置和使用提示模組的進一步資訊。
作為獨立的直譯器,luaprompt 會盡量模擬標準的 Lua 直譯器(目前僅不支援 -E 旗標),同時提供如上所述的額外功能集。以下是 luaprompt 工作階段的幾個片段,旨在說明 luaprompt 提供的功能。
Tab 鍵完成大部分都像您預期的那樣運作。它會試著完成表格鍵(以及因此而來的全域變數),保留的關鍵字和檔案名稱。在以下範例的工作階段中,[tab]
代表按下 Tab 鍵。出現在 [tab]
之後的字元都是由補齊器所提供。
> band =
[tab][tab]
_G coroutine error in math package rawset table until _VERSION debug false io module pairs repeat then while and do for ipairs next pcall require tonumber xpcall assert dofile function load nil print return tostring bit32 else getmetatable loadfile not rawequal select true break elseif goto loadstring or rawget setmetatable type collectgarbage end if local os rawlen string unpack
> band = bi
[tab]
t32
[tab]
.
[tab][tab]
bit32.arshift bit32.bnot bit32.btest bit32.extract bit32.lshift bit32.rrotate bit32.band bit32.bor bit32.bxor bit32.lrotate bit32.replace bit32.rshift
基本上,luaprompt 盡可能完成所有的提示,但並不會在你進行提示時預測你的需求。在完成 bit32
表格時,它不會立即加上一個點號,因為如果你想要將 bit32
用為函式參數時可能會讓你感到挫折。因此你必須再按一次 tab 鍵。luaprompt 會根據表格的鍵新增一個開啟方括弧來取代點號,或什麼都不新增。
> array = {1, 2, 3
}
> a = ar
[tab]
ray
[tab]
[
[tab]
[tab]
array[1] array[2] array[3]
> a = array[1
[tab]
]
對於函式值而言,情況也類似,在一個已經完成的函式名稱上按另一個 tab 後會新增一個開啟括弧。
如果 luaprompt 無法完成表格鍵或關鍵字,它會尋找檔案名稱。
> loadfile("./
[tab]
ChangeLog Makefile README luap luap.c patch prompt.c prompt.h
你可以透過輸入任何表達式來顯示其值,輸入方式就如同官方的直譯器一樣,但你不需要在程式碼行的開頭加上等號。
> 1 + 2 3 > _VERSION "Lua 5.2"
如同官方的直譯器一樣,它會遵循值的 __tostring
元方法。
> io.stdin file (0x7f3d0aeb2240)
當一個值被顯示時,luaprompt 會盡力使用最好的格式來顯示,讓它保持在最容易閱讀的狀態。會使用一個複雜的邏輯來達成這一點,但請見以下幾個範例來說明基本的功能。(很可惜的是 wiki 在格式化方面的彈性並不佳,因此難以傳達 luaprompt 所使用的字體顏色和粗細。)
陣列會使用線性方式列印
> a = {1, 2, 3, 4, 5} > a { 1, 2, 3, 4, 5, }
如果它們變得太大,無法放到一行中,則會將輸出拆成多行
> for i = 1, 100 do a[i] = i end > a { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, }
使用字串作為鍵的表格會針對每個鍵格式化在獨立的行中
> coroutine { yield = <function: 0x7f98dd0956e0>, status = <function: 0x7f98dd095820>, create = <function: 0x7f98dd095970>, wrap = <function: 0x7f98dd0959d0>, resume = <function: 0x7f98dd095aa0>, running = <function: 0x7f98dd095950>, }
混合的表格處理方式,就像大家預期的那樣。以下範例說明了 luaprompt 如何處理混合和巢狀表格(還有多行語句)。
> function recurse(n) >> if n == 1 then return "foo" else >> local a = {} >> for i = 1, n do a[i] = i end >> a.down = recurse(n - 1) >> return a >> end >> end > recurse(2) { 1, 2, down = "foo", }
當然,如果 n = 2,那很單純,但是 luaprompt 會盡量優雅地處理病態的案例。如果表格的巢狀層級太深,luaprompt 會在一段時間後放棄並試著在表格結構中傳達儘可能多的資訊,並且避免顯示格式化不良的輸出。
下方是 n = 30 時的輸出。設定 n = 500 也可以,但輸出會更長。
> recurse(30) { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, down = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, down = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, down = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, down = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, down = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, down = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, down = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, down = { ... }, }, }, }, }, }, }, }, }
最後,當顯示包含它們自己的表格時,luaprompt 會避免無限遞迴,它會印出巢狀層級,而不是實際的表格內容。在下方的範例中,使用鍵 b
的巢狀表格有一個鍵名叫 self
,其值為
> recursive = {a = {1, 2, 3}, b = coroutine} > recursive.b.self = recursive.b > recursive.b.parent = recursive > recursive { a = { 1, 2, 3, }, b = { wrap = <function: 0x7fec9b79f9d0>, yield = <function: 0x7fec9b79f6e0>, self = { [-1]... }, parent = { [-2]... }, running = <function: 0x7fec9b79f950>, create = <function: 0x7fec9b79f970>, status = <function: 0x7fec9b79f820>, resume = <function: 0x7fec9b79faa0>, }, }
一個包含上面所有功能的表格範例就是全域表格 _G
。luaprompt 可以預期地處理它,但輸出太長,無法在此引用。
luaprompt 的原始碼使用 MIT/X11 授權條款釋出。你可以在 [它的 GitHub 專案頁面] 取得。