2013-04-17 9 views
6

W powłoce Basha mogę używać uzupełniania kart, aby użyć sugerowanych plików i nazw katalogów. Jak mogę to osiągnąć dzięki nodejs i readline?Jak zasugerować pliki z uzupełnianiem kart za pomocą readline?

Przykłady:

  • /<Tab> powinien zaproponować /root/, /bin/ itp
  • /et<Tab> powinna zakończyć się /etc/.
  • fo<Tab> należy uzupełnić do foobar zakładając, że taki plik istnieje w bieżącym katalogu.

Myślałem o użyciu globowania (wzór search_term.replace(/[?*]/g, "\\$&") + "*"), ale czy jest tam może biblioteka, którą przeoczyłem?

To jest moje obecne podejście używając glob, jest on uszkodzony podczas korzystania //<Tab> jak zwraca też w postaci imienia i ma ewentualnie jakieś inne osobliwości:

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

Odpowiedz

0

Może mógłbyś spojrzeć na readdir: https://www.npmjs.com/package/readdir

Wystarczy przeczytać katalog, w którym użytkownik tworzy zakładkę, a następnie porównać dane wejściowe użytkownika z początkiem każdego pliku w katalogu i jeśli nazwa pliku jest zgodna, wyświetlić je użytkownikowi. Coś takiego:

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]); 
}); 
Powiązane problemy