Destacando texto em buffers / janelas abertos (exibidos) - procurando texto de um buffer em outro

8

No momento, tenho meu quadro do Emacs dividido verticalmente e estou olhando para dois buffers diferentes nas duas janelas.

Gostaria de ir a uma palavra em um buffer, pressionar algumas teclas e ter as ocorrências dessa palavra (se houver) destacadas no outro buffer, rolando para ela, se necessário.

Existe uma maneira de fazer isso?

Captura de tela para explicar

Na captura de tela acima, com o cursor logo antes de "bar" no buffer esquerdo, eu gostaria de poder <fazer alguma coisa> e ver rapidamente onde "bar" está no buffer direito.


Nota: Isso está relacionado a Como encontro texto em vários buffers abertos? no sentido de que, se eu pudesse fazer uma pesquisa através do "outro" buffer, faria o que eu queria. Mas nenhuma das respostas é exatamente o que eu quero:

  • As occursoluções baseadas abrem uma nova janela que mostra as linhas correspondentes, enquanto eu gostaria de manter minhas duas janelas ainda exibidas - na verdade, procurarei no outro buffer o contexto em torno da partida, mostrando apenas a linha correspondente não é muito útil.
  • multi-isearch-buffersexige que eu especifique a lista de buffers toda vez que desejar fazer essa pesquisa (várias vezes), em vez de buscá-la automaticamente como os dois buffers exibidos. Mais importante, quando inicio uma janela e executo a pesquisa, quando encontra a correspondência no outro buffer, ele exibe esse buffer nessa janela, para que ambas as janelas exibam o mesmo (outro) buffer. Então Cg coloca tudo de volta e não consigo mais ver a palavra destacada no outro buffer.
  • icicle-search possui tantos recursos que um deles pode fazer isso, mas eu não consegui encontrar nada depois de uma análise superficial da documentação.
ShreevatsaR
fonte
No momento, o que eu faço é Cs Cw Cs (para fazer a pesquisa neste buffer), alternar para o outro buffer, fazer Cs Cs (para repetir a mesma pesquisa lá) e depois voltar. São sete pressionamentos de tecla, que eu poderia gravar como uma macro, eu acho. Deixe-me fazer isso. Ainda assim, estou interessado em saber se existem outras soluções.
ShreevatsaR
FWIW: C-s C-w C-x o C-s C-snão parece tão ruim para mim. (Você não precisa de um C-slogo após o C-w.)
de Drew
@ Drew: Obrigado, a idéia de usar uma macro só ocorreu depois que eu postei a pergunta; agora uma macro que C-s C-w C-x o C-s C-s C-x orealmente parece boa.
ShreevatsaR

Respostas:

5

Você pode usar um pacote chamado highlight-globalque está disponível no github, mas não no Melpa (como foi escrito).

A highlight-frame-togglefunção definida neste pacakge destacará a palavra no ponto ou a região selecionada em qualquer lugar do quadro (em todos os buffers). Isso, no entanto, não faria a rolagem automática para a palavra destacada necessária. Ele escolhe uma cor de destaque diferente à medida que você destaca mais palavras sem limpar os destaques anteriores.

Aqui está uma captura de tela da aparência:

insira a descrição da imagem aqui Clique para ver melhor a captura de tela

Kaushal Modi
fonte
0

helm possui interfaces que podem atingir esse objetivo, gravei um Gifcast para demonstrar o pacote helm-swoop :

Depois de iniciar a helm-swooppesquisa, posso reduzir para menos candidatos inserindo outros tokens separados por espaço ou pressionar C-pe C-nalternar para o próximo e rolar no buffer de destino ao mesmo tempo.

wasamasa
fonte
Como eu disse na pergunta, as soluções baseadas em ocorrências não são o que eu quero, porque elas listam linhas correspondentes (e eu preciso ir mais além e interagir com a lista) em vez de manter o outro buffer intacto e destacar o texto nele .
ShreevatsaR
Hmm, o outro buffer é mantido intacto e pode mostrar o contexto, mas se os destaques são o que você procura , o helm-swoop pode ser mais uma coisa sua.
wasamasa
OK, editei para demonstrar helm-swoop.
wasamasa
Eu gostaria de poder me esclarecer. Durante todo o processo, eu não quero que a outra janela para sempre qualquer coisa de exibição outro o que está exibindo no momento. Tudo o que eu quero é pressionar uma tecla e ver na outra janela, como é, a (primeira, digamos) ocorrência da palavra atual no outro buffer. (Na minha captura de tela, quando meu cursor está em "bar" no buffer esquerdo, desejo pressionar uma tecla e poder ver onde "bar" ocorre no buffer direito, com o direito ainda sendo exibido da mesma forma.) Equivalente a bater C-s C-w C-x o C-s C-s C-x o(que é o que estou usando agora e parece bom, na verdade).
ShreevatsaR
Se o leme puder destacar todas as ocorrências no outro buffer (enquanto ainda estiver rolando para que o primeiro fique visível na tela), isso o tornaria melhor do que a macro vinculada à sequência desses oito pressionamentos de tecla. :-)
ShreevatsaR
0

Que tal usar highlight-regexppara destacar o símbolo atual (ou palavra, região etc.) na outra janela?

Aqui estão algumas funções que podem funcionar. O primeiro encontrará o símbolo no ponto, pule para a outra janela e destaque-o. O segundo pula para a outra janela e remove os destaques.

 (require 'thingatpt)

 (defun highlight-other-window ()
   (interactive)
   (let ((match (thing-at-point 'symbol t)))
     (when match
       (save-excursion
         (other-window 1)
         (highlight-regexp (regexp-quote match))
         (other-window 1)))))

 (defun unhighlight-other-window ()
   (interactive)
   (save-excursion
     (other-window 1)
     (unhighlight-regexp t) 
     (other-window 1)))

Nos dois casos, isso retrocede e a janela atual permanece ativa no final. Não tenho certeza se é isso que você deseja; caso contrário, interrompa a other-windowchamada final .

Essas funções também podem ser aprimoradas verificando e correspondendo à região ativa; lidar com o caso em que não há outra janela visível; etc.

glucas
fonte
O highlight-frame-togglecomando mencionado em outra resposta parece ser uma versão mais refinada disso, então acho que você não precisa fazer o seu próprio.
glucas