2013-04-17 3 views
6

Bash 쉘에서 탭 완성을 사용하여 파일 및 디렉토리 이름 제안을 사용할 수 있습니다. nodejs 및 readline을 사용하여 어떻게 이것을 수행 할 수 있습니까?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]); 
}); 
관련 문제