2013-04-17 21 views
6

Bash kabuğunda, dosya ve dizin adlarını önermek için sekme tamamlamasını kullanabilirim. Bunu nodejs ve readline ile nasıl yapabilirim?Ok dizisini kullanarak sekme tamamlandığında dosyalar nasıl önerilir?

Örnekler:

  • /<Tab> düşünülmesi gerektiği /root/, /bin/ vb
  • /et<Tab>/etc/ için tamamlamalıdır. Geçerli dizinde bu tür bir dosya varsayarak foobar numaralı
  • belirtilmelidir.

Globbing kullanmayı düşünüyordum (pattern search_term.replace(/[?*]/g, "\\$&") + "*"), fakat gözden kaçan bir kütüphane var mı?

Bu canonicalized adını döndürür ve muhtemelen diğer bazı tuhaflıklar olduğu gibi //<Tab> kullanırken, bu bozuldu topak kullanarak benim şimdiki yaklaşımdır:

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(); 

cevap

0

Belki readdir bir göz sürebilir: https://www.npmjs.com/package/readdir

Sadece kullanıcının bir sekme yaptığı dizini okuyun, ardından kullanıcı girişini dizindeki her dosyanın başlangıcıyla karşılaştırın ve bir dosya adı eşleştiğinde, kullanıcıya gösterin. Bir şey gibi:

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]); 
});