2017-10-12 9 views
9

मैं reverse interactive searchNodeJSCtrl + rbash या irb में reverse interactive search का उपयोग करना चाहता हूं।नोडजेएस आरईपीएल में "रिवर्स इंटरैक्टिव सर्च" का उपयोग कैसे करें?

Ctrl + r इंटरैक्टिव खोज को ट्रिगर नहीं किया। क्या नोडजेस आरईपीएल में फ़ंक्शन का उपयोग करने का कोई तरीका है?

मै मैकोज़ सिएरा का उपयोग कर रहा हूं और नोडजेएस का संस्करण v8.5.0 है।

उत्तर

1

यह सवाल हाल ही में एक I pity the foo() ब्लॉग पोस्ट में जवाब था ...

रिवर्स खोज कर सकते हैं आदेशों के इतिहास में नोड के आरईपीएल अंदर इस्तेमाल किया जा?

वर्तमान में ऐसा लगता है कि यह संभव नहीं है। नोड आरईपीएल इतिहास को एक फाइल में जारी रखने की अनुमति देता है और बाद में इसे लोड करता है, लेकिन इसे रिवर्स-सर्च करने की अनुमति नहीं देता है।

तो ऐसा लगता है कि रिवर्स इतिहास खोज मूल रूप से आरईपीएल द्वारा समर्थित नहीं है।

हालांकि आप rlwrap उपयोगिता स्थापित कर सकते हैं और इसे समान कार्यक्षमता प्रदान करने के लिए नोड आरईपीएल के शीर्ष पर चला सकते हैं। REPL documentation साइट पर आपको उठने और चलाने के लिए कुछ बुनियादी निर्देश हैं। मैं थोड़ा उत्सुक था कि दृश्यों के पीछे क्या चल रहा था, इसलिए थोड़ा और गूगलिंग Learning Node: Moving to the Server Side से इस अनुभाग को चालू कर दिया जो rlwrap का उपयोग कर जुड़े ट्रेडऑफ पर अधिक जानकारी देता है। उदाहरण के लिए ...

rlwrap के रूप में सहायक होने के नाते, हम तब भी अपरिभाषित होते हैं जब हम अभिव्यक्ति में टाइप करते हैं जो मूल्य वापस नहीं करता है। हालांकि, हम अपने स्वयं के कस्टम आरईपीएल बनाकर, इस पर चर्चा की, और अन्य कार्यक्षमता को समायोजित कर सकते हैं।

1

मुझे लगता है कि बक्षीस जल्द खत्म हो रहा है ... क्या मैं इसे प्राप्त कर सकता हूं? अगर मैंने आपको बताया:

पर जाएं अनुभाग यदि आप इतिहास खोज से परिचित हैं और इसे वैकल्पिक रूप से उपयोग करना चाहते हैं।

क्या आप zsh की इतिहास खोज से परिचित हैं? यह लगभग विपरीत खोज की तरह है, इस तथ्य को छोड़कर कि आप कमांड लाइन पर कुछ दर्ज करने और up तीर कुंजी दबाकर खोजना शुरू कर सकते हैं। मुझे लगता है कि यह रिवर्स सर्च की तुलना में एक त्वरित विकल्प है और इसे अधिक बार उपयोग करता है। डाउनसाइड (जो मेरी राय में मामूली है) यह है कि आप अपने मूल खोज क्वेरी के बाद खोज क्वेरी को अपडेट नहीं कर सकते हैं जब तक आप इसे "वापस जाने" से वापस नहीं लौटते।उदाहरण के लिए:

इतिहास (ऊपर से नीचे)

foo 
bar 
foo-ish 
fubar 
... 

अपने शीघ्र पर:

> fo 

प्रेस up

> foo 

प्रेस up

> foo-ish 

प्रेस down

> foo 

प्रेस down

> fo 

नोट: जैसे ही आप एक खोज परिणामों को बदलने और up फिर से हिट के रूप में, बदल पाठ अपने नए क्वेरी हो जाता है।

कोड

const PROMPT = '> '; 

// history search 
let input = ''; 
let searchInput = input; 
let searchResults = []; 
let searchResultIndex = 0; 
process.stdin.on('keypress', (_, key) => { 
    // update 'input' on changes, excluding history 
    if (input !== server.line && !['up', 'down'].includes(key.name)) { 
    input = server.line; 
    } 
    // search is initiated if a user presses the 'up' key after having inputted 
    if (input !== '' && (
    key.name === 'up' || 
    (key.name === 'down' && searchResultIndex > 0) 
)) { 
    // reset on fresh search or if user changed input during search 
    if (searchInput !== input) { 
     searchResultIndex = 0; 
     // first search result is always user's input 
     searchResults = [input, ...server.history.filter(item => item.includes(input))]; 
     searchInput = input; 
    } 
    const increment = key.name === 'up' ? 1 : -1; 
    searchResultIndex = Math.min(searchResultIndex + increment, searchResults.length - 1); 
    server.historyIndex = -1; 
    server.line = ''; 
    process.stdout.clearLine(); 
    process.stdout.cursorTo(0); 
    const result = searchResults[searchResultIndex]; 
    process.stdout.write(PROMPT + result); 
    server.cursor = result.length; 
    server.line = result; 
    } 
}); 

बोनस - लगातार इतिहास को लागू करने के लिए:

const HISTSIZE = 100; 

const server = repl.start({ 
    prompt: PROMPT, 
    historySize: HISTSIZE, 
    removeHistoryDuplicates: true, 
}); 

// load history or create file 
historyFile = path.join(path.dirname(require.main.filename), 
'.repl_history'); 
try { 
    fs.statSync(historyFile); 
    fs.readFileSync(historyFile, 'utf8') 
    .split('\n') 
    .filter(line => line.trim()) 
    .map(line => server.history.push(line)); 
} 
catch (e) { 
    console.log(e); 
    fs.closeSync(fs.openSync(historyFile, 'w')); 
} 

server.on('exit',() => { 
    // save history 
    fs.writeFileSync(historyFile, server.history.slice(0, HISTSIZE).join('\n')); 
    console.log('Thank you. Come again.'); 
    process.exit(); 
}); 
संबंधित मुद्दे