2013-04-17 28 views
6

Trong trình bao Bash, tôi có thể sử dụng hoàn thành tab để sử dụng tên tệp và thư mục đề xuất. Làm thế nào tôi có thể đạt được điều này với nodejs và readline?Cách đề xuất tệp có hoàn thành tab bằng cách sử dụng readline?

Ví dụ:

  • /<Tab> nên đề nghị /root/, /bin/ vv
  • /et<Tab> nên hoàn thành để /etc/.
  • fo<Tab> phải hoàn tất thành foobar giả sử tệp như vậy tồn tại trong thư mục hiện tại.

Tôi đã nghĩ đến việc sử dụng globbing (pattern search_term.replace(/[?*]/g, "\\$&") + "*"), nhưng có thể có thư viện mà tôi đã bỏ qua không?

Đây là cách tiếp cận hiện tại của tôi sử dụng glob, nó bị phá vỡ khi sử dụng //<Tab> vì nó trả về tên canonicalized và có thể một số oddities khác:

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

Trả lời

0

Có lẽ bạn có thể có một cái nhìn vào readdir: https://www.npmjs.com/package/readdir

Chỉ cần đọc thư mục mà người dùng đang tạo tab, sau đó so sánh đầu vào của người dùng với đầu mỗi tệp trên thư mục và nếu trùng khớp tên tệp, hãy hiển thị nó cho người dùng. Một cái gì đó như:

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]); 
}); 
Các vấn đề liên quan