2013-04-17 6 views
6

बैश खोल के भीतर, मैं सुझाव फ़ाइल और निर्देशिका नामों का उपयोग करने के लिए टैब-पूर्णता का उपयोग कर सकता हूं। मैं इसे नोडज और readline के साथ कैसे प्राप्त कर सकता हूं?रीडलाइन का उपयोग कर टैब पूर्ण होने के साथ फ़ाइलों का सुझाव कैसे दें?

उदाहरण:

  • /<Tab> सुझाव देने चाहिए /root/, /bin/, आदि
  • /et<Tab>/etc/ को पूरा करना चाहिए।
  • fo<Tab>foobar को पूरा करना चाहिए मान लें कि ऐसी फ़ाइल वर्तमान निर्देशिका में मौजूद है।

मैं ग्लोबिंग (पैटर्न search_term.replace(/[?*]/g, "\\$&") + "*") का उपयोग करने के बारे में सोच रहा था, लेकिन क्या शायद ऐसी लाइब्रेरी है जिसे मैंने अनदेखा किया है?

यह मेरा वर्तमान दृष्टिकोण ग्लोब का उपयोग कर, यह जब //<Tab> का उपयोग कर के रूप में यह canonicalized नाम देता है और संभवतः कुछ अन्य विषमताएं है टूट गया है:

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]); 
}); 
संबंधित मुद्दे