- SukaiPoppuGo
CC read() et autocompletion
Mar 14 Aoû - 20:10
Je m'étais déjà servi de cette fonctionnalité il y a longtemps, et me souvenait que c'était pas si compliqué à mettre en place. Enfin j'avais oublié comment faire et je trouve que c'est très mal documenté..Rien qu'un simple exemple, histoire de... (faut tout faire soi même sur ce net ?)
replacement : typiquement c'est pour entrer un mot de passe en évitant de l'afficher directement sur l'écran (si vous mettez "*" par exemple)
Pour ce tuto, c'est pas ce qu'on veut, donc on mettra nil
history : c'est une table, qui sera utilisé pour compléter si l'utilisateur pourra faire défiler. Typiquement il s'agit des entrées précédentes.
Pour ce tuto, c'est pas vraiment ce qu'on veut, donc on mettra nil
auto complete : ça c'est ce qu'on veut, et alors que la plupart des gens conseillent d'aller voir textutils.complete(), fs.complete(), shell.complete(), shell.setCompletionFunction(), shell.completeProgram(), help.completeTopic(), le code source de rom/program/edit.lua et débrouillez vous avec... Ben moi je suis pas comme ça, je vais vous le dire ci-dessous.
Mais pour se faciliter la tâche on peut faire comme ceci :
Bref à vous de voir.
Notez que l'auto-complétion est une proposition, elle n’empêchera pas l'utilisateur d'écrire autre chose que ce qui est présent dans votre liste. Mais ça c'est une autre histoire.
La fonction read()
Elle peut prendre 3 paramètres (tous optionnels) :http://www.computercraft.info/wiki/Read a écrit:
- Code:
read([ char replacement [, table history [, function auto complete ]] ])
replacement : typiquement c'est pour entrer un mot de passe en évitant de l'afficher directement sur l'écran (si vous mettez "*" par exemple)
Pour ce tuto, c'est pas ce qu'on veut, donc on mettra nil
history : c'est une table, qui sera utilisé pour compléter si l'utilisateur pourra faire défiler. Typiquement il s'agit des entrées précédentes.
Pour ce tuto, c'est pas vraiment ce qu'on veut, donc on mettra nil
auto complete : ça c'est ce qu'on veut, et alors que la plupart des gens conseillent d'aller voir textutils.complete(), fs.complete(), shell.complete(), shell.setCompletionFunction(), shell.completeProgram(), help.completeTopic(), le code source de rom/program/edit.lua et débrouillez vous avec... Ben moi je suis pas comme ça, je vais vous le dire ci-dessous.
Lister
Dans un premier temps il s'agit de dresser une table des mots qui seront proposé en complétion. Note que les mots devraient être en index et non en valeur. Comme ceci :- Code:
local mots = {
["mot_1"] = true,
["mot_2"] = true,
["mot_3"] = true,
["mot_4"] = true,
}
Mais pour se faciliter la tâche on peut faire comme ceci :
- Code:
local mots = {}
for i,mot in ipairs({"mot_1", "mot_2", "mot_3", "mot_4"}) do
mots[ mot ] = true
end
Bref à vous de voir.
Créer la fonction de complétion
Vous devez créer une fonction qui prendrait en argument le texte que l'utilisateur a déjà tapé, transmettre ça à la fonction textutils.complete() avec en second argument votre liste de mots. Sauf cas particuliers c'est ça :- Code:
local function completeLeMot(sText)
return textutils.complete(sText, mots)
end
Para métrer read()
En résumé du premier paragraphe, voici le code :- Code:
local input = read(nil, nil, completeLeMot)
Exemple complet
Il s'agit là de proposer à l'utilisateur d'inscrire le nom d'un mob, parmi une liste établie.- Code:
local mobList = {
"creeper",
"seleton",
"spider",
"villager",
"zombie",
}
-- Ne pas oublier de permuter la table pour mettre les valeurs en index
local mobNames= {}
for i, name in ipairs(mobList) do
mobNames[ name ] = true
end
-- Préparer la fonction de completion
local function completeMobName(sText)
return textutils.complete(sText, mobNames)
end
-- Maintenant inviter l'utilisateur à inscrire le nom d'un mob
print("Pouvez vous désigner votre agresseur ?")
local suspect = read(nil, nil, completeMobName )
-- Ensuite faites ce que vous voulez
-- Là par exemple, j'envoie l'avis de recherche à tous les chasseurs de prime
modem.transmit(MercenaireChannel, PoliceChannel, "$5000 pour la capture de "..suspect.." mort ou vif")
Notez que l'auto-complétion est une proposition, elle n’empêchera pas l'utilisateur d'écrire autre chose que ce qui est présent dans votre liste. Mais ça c'est une autre histoire.
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum