2013-04-17 13 views
6

All'interno della shell Bash, posso usare tab-completion per utilizzare i nomi di file e directory suggeriti. Come posso ottenere questo risultato con nodejs e readline?Come suggerire i file con completamento della tabulazione usando readline?

Esempi:

  • /<Tab> dovrebbe suggerire /root/, /bin/, ecc
  • /et<Tab> dovrebbero completare a /etc/.
  • fo<Tab> deve essere compilato a foobar presupponendo che tale file esista nella directory corrente.

Stavo pensando di usare il globbing (modello search_term.replace(/[?*]/g, "\\$&") + "*"), ma forse c'è una libreria che ho trascurato?

Questo è il mio approccio corrente utilizzando glob, si è rotto quando si utilizza //<Tab> in quanto restituisce il nome canonicalized e ha forse alcune altre stranezze:

function command_completion(line) { 
    var hits; 
    // likely broken, one does not simply escape a glob char 
    var pat = line.replace(/[?*]/g, "\\$&") + "*"; 
    // depends: glob >= 3.0 
    var glob = require("glob").sync; 
    hits = glob(pat, { 
     silent: true, 
     nobrace: true, 
     noglobstar: true, 
     noext: true, 
     nocomment: true, 
     nonegate: true 
    }); 

    return [hits, line]; 
} 

var readline = require("readline"); 
rl = readline.createInterface({ 
    input: process.stdin, 
    output: process.stdout, 
    completer: command_completion 
}); 
rl.prompt(); 

risposta

0

Forse si potrebbe dare un'occhiata su readdir: https://www.npmjs.com/package/readdir

Basta leggere la directory su cui l'utente sta creando una scheda, quindi confrontare l'input dell'utente con l'inizio di ogni file nella directory e se un nome file corrisponde, visualizzarlo all'utente. Qualcosa di simile:

var readDir = require('readdir'); 

function strncmp(str1, str2, lgth) { 
    var s1 = (str1 + '') 
    .substr(0, lgth); 
    var s2 = (str2 + '') 
    .substr(0, lgth); 

    return ((s1 == s2) ? 0 : ((s1 > s2) ? 1 : -1)); 
} 

var userInput = // get user input; 
var path = // get the path; 
readDir.read(path, [*], function(err, files) { 
    for (var i = 0; i < files.length; i++) 
     if (strncmp(files[i], userInput, userInput.length) == 0) 
      console.log(files[i]); 
}); 
Problemi correlati