Como pesquiso nos resultados da pesquisa

8

Quando eu C-sposso pesquisar. Como devo executar uma função que eu poderia vincular, por exemplo, à C-rqual me permitiria pesquisar nos resultados de alguma consulta de pesquisa predefinida?

Como o conteúdo da janela seria:

function xyz(a, b)
  return a + b
end

Eu posso C-M-scom function.*como uma consulta e o resultado será function xyz(a, b).

Quero ter uma função em que possa inserir uma consulta e pesquisar nesses resultados (que seriam gerados automaticamente pelos meus olhos).

ATUALIZAR

Obrigado a todos pelas soluções. occur, helm-occurtambém funciona muito bem, mas aceitei a resposta de Jordon Biondo porque ele forneceu o código que eu precisava para responder completamente à minha pergunta.

lukas.pukenis
fonte
Estou um pouco confuso sobre seu objetivo: parece que você deseja implementar algum recurso específico para Lua helm-swoop, mas sua pergunta (e especialmente o título) não é muito clara sobre isso. Talvez eu não tenha entendido sua pergunta porque não estou familiarizado com o leme.
Paprika
@paprika ver pergunta atualizada :)
lukas.pukenis
não é exatamente isso que o helm-swoop já faz?
21414 Jordânia Biondo
@JordonBiondo Eu posso ver a função na lista helm-swoop. Mas imenufuncionou muito bem para mim! Exceto que eu procuro uma solução genérica para minha pergunta
lukas.pukenis
Basta saber se você considerou "Cx ci" executa o comando "helm-semântico-ou-imenu", como você já está usando o helm.
rimero

Respostas:

5

A abordagem simples seria usar apenas o rgrep.

use M-xrgrepe especifique a pesquisa por "função" no arquivo atual no diretório atual. Você pode agrupar isso em um comando para não precisar especificar as opções sempre:

(defun rgrep-lua-functions ()
  "run `rgrep` searching for 'function' in the current file."
  (interactive)
  (rgrep "function" (file-name-nondirectory (buffer-file-name)) "."))

Isso produzirá um buffer pesquisável com as assinaturas de função e você poderá pular para as definições, se desejar.

Jordon Biondo
fonte
grep, rgrep, occur, E similares pesquisa só linha por linha . Ou seja, os contextos de pesquisa são linhas únicas. Eu pensei que o OP estava pedindo para procurar definições de função. Mas, como essa resposta foi aceita, acho que a pergunta apresentada não é realmente o que se queria.
Drew
na pergunta, ele especifica que deseja linhas como as function xyz(a, b)que, se sua lua estiver formatada corretamente, é exatamente o que você obterá.
21413 Jordon Biondo
Não está claro para mim. Sim, ele diz que ficaria satisfeito se essas linhas fossem encontradas, para serem pesquisadas. Mas em seu exemplo, ele mostra toda a definição de função como o " conteúdo da janela " que ele gostaria de poder pesquisar. Os contextos de linha única não apresentam esse conteúdo a ser pesquisado (seja em uma "janela" ou de outra forma). Eles apresentá-lo com apenas o uma linha: function xyz(a, b).
Drew
7

Iria occurtrabalhar para você?

M-x occurou, em M-s oseguida, inserir sua consulta fornecerá uma lista de linhas correspondentes a essa expressão regular. Em seguida, você pode usar C-spara pesquisar no buffer Ocorrer para refinar sua pesquisa nas linhas correspondentes.

Jonathan Leech-Pepin
fonte
Opa Passei tanto tempo escrevendo minha resposta que não percebi que alguém me deu um soco.
Nispio 24/10
4

O Emacs tem um comando chamado occurque é muito adequado para esse tipo de tarefa. Se você tiver o Helm instalado, poderá usá-lo helm-occur.


Ocorrer

O occurcomando faz parte do vanilla emacs e está vinculado M-s opor padrão. Occur solicitará uma regexp para procurar e, em seguida, abrirá uma nova janela mostrando todas as linhas no buffer atual que contêm uma correspondência. O *Occur*buffer resultante pode ser pesquisado usando isearch( C-s).

  • M-s o function RET para mostrar todas as linhas correspondentes à "função"
  • C-x opara mover o foco para o *Occur*buffer
  • C-s para iniciar uma pesquisa nos resultados da pesquisa

Elmo Ocorre

Se você tiver o leme instalado, poderá helm-occurfazer algo semelhante. Nesse caso, o *Helm Occur*buffer não será diretamente pesquisável com C-s. No Helm, você pode procurar por vários termos de pesquisa apenas separando-os com um espaço.

  • M-x helm-occur RET abrir uma janela Helm Occur
  • function para mostrar todas as linhas que contêm "function"
  • SPC foo para restringir os resultados a linhas que também contêm foo

Em qualquer um desses modos, selecionar a correspondência no buffer de ocorrência e pressionar Enter o levará para essa linha no código.

nispio
fonte
3

Se você usar os Sincelos da biblioteca , poderá fazer esse tipo de coisa facilmente. O que você está pedindo (se bem entendi) é pesquisar apenas em determinados contextos de pesquisa .

Por exemplo, como neste caso, você pode querer pesquisar apenas nas definições de função - os contextos de pesquisa são definições de função. No Lisp, isso seria coisas como defuns.

Sincelos tem vários comandos predefinidos de pesquisa de Sincelos para pesquisar definições como esta. Estes são chamados coletivamente de comandos Icicles Imenu .

Para procurar apenas definições de comando, você pode usar o comando icicle-imenu-command-full. Para procurar definições de função único não-interativas, comando uso icicle-imenu-non-interactive-function-full.

Além da pesquisa de definições, você pode definir facilmente qualquer tipo de contexto a ser pesquisado. A maneira mais simples é fornecer uma regexp. O comando icicle-searchsolicita a regexp de definição de contexto de pesquisa. Como alternativa, você pode usar uma função para definir os contextos de pesquisa.

Outras possibilidades incluem:

  • Pesquisando o texto de diferentes tipos de COISAS (por exemplo, sexps, frases, listas, seqüências de caracteres, comentários, elementos XML, ...), ou seja, ignorando outros textos fora das COISAS.

  • Pesquisando zonas de texto que forneceram propriedades de texto ou sobreposição, ou seja, ignorando outro texto.


NOTA:

Outras respostas aqui mencionadas occure similares ( helm-occur) fornecem um tipo limitado de pesquisa de contexto: os contextos de pesquisa são apenas as linhas de um buffer.

Isso é muito mais limitado que, digamos, pesquisando dentro de definições de funções inteiras, que é o que eu acho que você está pedindo. Com Sincelos , o comando icicle-occur(vinculado a C-c ') permite pesquisar dentro de linhas como contextos de pesquisa.

Desenhou
fonte
1

Com o Isearch + :

  1. C-M-s .+function.+, para pesquisar linhas inteiras que contêm function.

  2. C-z .seguido de uma regexp para algo que você deseja procurar nas linhas que contêm function.

(Opcional) Repita o item 2 com outros padrões (regexps) para corresponder na mesma linha. As correspondências podem estar em qualquer ordem dentro da linha.

Em vez da etapa 1, você pode começar C-M-s .+ C-z . function. O objetivo é pesquisar linhas inteiras que contenham functionoutros padrões que você desejar.

Como C-z .funciona: solicita que um padrão embutido corresponda (por exemplo function). Ele envolve isso .*de cada lado, para obter um padrão de linha completa (por exemplo .*function.*). Ele adiciona um predicado de filtro que exige que sua string de pesquisa atual ( .+) também corresponda a esse padrão (por exemplo .*function.*).

Consulte Filtragem dinâmica de pesquisa para obter mais informações.

Desenhou
fonte