do -- Abbreviatiions Simple - expand command name abbreviations -- returns the table of space delimited words in s local function getWords( s : string ) : table local t, cmds, w = s, {}, s while t:contains( " " ) do w, t = t:partition( " " ) if w != "" then cmds[ # cmds + 1 ] = w end end if t != "" then cmds[ # cmds + 1 ] = t end return cmds end local commandStrings = "add 1 alter 3 backup 2 bottom 1 Cappend 2 change 1 Schange Cinsert 2 Clast 3" .. " compress 4 copy 2 count 3 Coverlay 3 cursor 3 delete 3 Cdelete 2 down 1 duplicate" .. " 3 xEdit 1 expand 3 extract 3 find 1 Nfind 2 Nfindup 6 NfUP 3 Cfind 2 findUP 3 fUP 2" .. " forward 2 get help 1 hexType 4 input 1 powerInput 3 join 1 split 2 spltJOIN load" .. " locate 1 Clocate 2 lowerCase 3 upperCase 3 Lprefix 2 macro merge 2 modify 3 move 2" .. " msg next 1 overlay 1 parse preserve 4 purge 3 put putD query 1 quit read recover 3" .. " refresh renum 3 repeat 3 replace 1 Creplace 2 reset 3 restore 4 rgtLEFT right 2 left" .. " 2 save set shift 2 si sort sos stack 3 status 4 top transfer 3 type 1 up 1" local function expandEasyAbbreviations( cmds : string, input : string ) : table local cmdTable, inputTable, outputTable = getWords( cmds ), getWords( input ), {} local function isCommand( cmd : string, word : string ) : boolean local result, uCmd, uWord = false, cmd:upper(), word:upper() if # cmd >= # word then -- word is not longer than the command if uCmd == uWord then -- the word is the command result = true else -- word is shorter than the command local ab = cmd:gsub( "%l", "" ) -- remove lowercase if # ab <= # word then -- the minimum abbreviation isn't longer than the word result = uWord == uCmd:sub( 1, # word ) end end end return result end for i = 1, # inputTable do local w, u = inputTable[ i ], "*error*" for c = 1, # cmdTable do if isCommand( cmdTable[ c ], w ) then u = cmdTable[ c ]:upper() break end end outputTable[ # outputTable + 1 ] = u end return { inputTable, outputTable } end local function printExpansion( expansion : table ) local fmt, input, output = {}, expansion[ 1 ], expansion[ 2 ] for i, v in ipairs( output ) do fmt[ i ] = " %" .. # v .. "s" end io.write( "Input: " ) for i, v in ipairs( input ) do io.write( string.format( fmt[ i ], v ) ) end io.write( "\nOutput:" ) for i, v in ipairs( output ) do io.write( string.format( fmt[ i ], v ) ) end io.write( "\n" ) end -- maps a "simple" format command list to "easy" format local function simpleToEasyFormat( cmds : string ) : string local words = getWords( cmds ) local wPos, wMax, easy = 1, # words, "" while wPos <= wMax do local w = words[ wPos ] local lenStr = if wPos == wMax then "" else words[ wPos + 1 ] end if not lenStr:match( "^%d+$" ) then easy ..= " " .. w:upper() else -- have a minimum length local len = tonumber( lenStr ) easy ..= " " .. w:sub( 1, len ):upper() if len < # w then easy ..= w:sub( len + 1, -1 ):lower() end ++ wPos end ++ wPos end return easy end printExpansion( expandEasyAbbreviations( simpleToEasyFormat( commandStrings ) , ( "riG rePEAT copies put mo rest " .. "types fup. 6 poweRin" ) ) ) end