Partagez
Aller en bas

CC read() et autocompletion

le 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 ?)

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.
Revenir en haut
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum