Como usar a “pesquisa interativa reversa” no NodeJS REPL?

9

Eu quero usar reverse interactive search em NodeJS REPL por Ctrl + r , como em bash ou irb .

Ctrl + r não acionou a pesquisa interativa. Existe uma maneira de usar a função no Nodejs REPL?

Estou usando o MacOS Sierra e a versão do NodeJS é v8.5.0 .

    
por ironsand 12.10.2017 в 18:12
fonte

2 respostas

1

Esta questão foi respondida em um recente I pena que o foo () post no blog ...

  

A pesquisa reversa no histórico de comandos pode ser usada dentro do REPL do Node?

     

Atualmente, parece que não é possível. O Node REPL permite persistir o histórico em um arquivo e, posteriormente, carregá-lo, mas não permite pesquisa reversa.

Portanto, parece que a pesquisa reversa de histórico não é suportada nativamente pelo REPL.

No entanto, você pode instalar o utilitário rlwrap e executá-lo na parte superior do Node REPL para fornecer funcionalidade semelhante. O site REPL documentation tem algumas instruções básicas para você estar pronto e em funcionamento. Eu estava um pouco curioso sobre o que estava acontecendo nos bastidores, então um pouco mais de Google pesquisou esta seção em Nó de Aprendizado: Movendo para o Lado do Servidor , que entra em mais detalhes sobre as compensações associadas ao uso de rlwrap . Por exemplo ...

  

Por mais útil que o rlwrap seja, ainda terminamos indefinidos sempre que digitamos uma expressão que não retorna um valor. No entanto, podemos ajustar isso e outras funcionalidades, apenas criando nosso próprio REPL personalizado, discutido a seguir.

    
por v1bri 31.10.2017 / 14:37
fonte
1

Eu vejo que a recompensa está acabando em breve ... posso ter isso? E se eu te dissesse:

Pule para a seção O código se você estiver familiarizado com a pesquisa de histórico e quiser usá-lo como uma alternativa.

Você está familiarizado com a pesquisa de histórico do zsh? É quase como uma pesquisa inversa, exceto pelo fato de que você pode começar a pesquisar depois de digitar algo na linha de comando e pressionar a tecla de seta up . Acho que é uma alternativa mais rápida do que inverter a pesquisa e usá-la com mais frequência. A desvantagem (que é menor na minha opinião) é que você não pode atualizar sua consulta de pesquisa original após a pesquisa, a menos que você retorne a ela "descendo". Por exemplo:

histórico (de cima para baixo)

foo
bar
foo-ish
fubar
...

no seu prompt:

> fo

pressione up

> foo

pressione up

> foo-ish

pressione down

> foo

pressione down

> fo

OBSERVAÇÃO: assim que você alterar um resultado da pesquisa e atingir up novamente, o texto alterado se tornará sua nova consulta.

O código

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

BONUS - Para implementar um histórico persistente:

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();
});
    
por Palisand 01.11.2017 / 03:11
fonte