2013-04-17 7 views
6

Bashシェル内では、タブ補完を使用して、推奨ファイル名とディレクトリ名を使用できます。 nodejsと​​でこれをどのように達成できますか?readlineを使用してタブ補完のあるファイルを提案するには?

例:

  • /<Tab>を示唆すべきは/root//bin/など
  • /et<Tab>/etc/に完了する必要があります。
  • fo<Tab>は、このようなファイルがカレントディレクトリに存在すると仮定して、foobarに完了する必要があります。

globbing(パターンsearch_term.replace(/[?*]/g, "\\$&") + "*")を使用することを考えていましたが、私が見落としているライブラリがありますか?

//<Tab>を使用している場合、それは正規化された名前を返し、おそらく他のいくつかの奇妙を持っているので、これはグロブを使用して私の現在のアプローチは、それが壊れているされています

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

答えて

0

たぶん、あなたはREADDIRの表情を取ることができる:https://www.npmjs.com/package/readdir

ユーザーがタブを作成しているディレクトリを読み取ってから、ディレクトリ上の各ファイルの先頭とユーザー入力を比較し、ファイル名が一致する場合はユーザーに表示します。次のようなもの:

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