¿Cómo buscar / grep interactivamente con VIM?

12

¿Hay alguna forma de configurar VIM para buscar interactivamente dentro de cada archivo un proyecto completo?

Por interactivo , me refiero a actualizar cada pulsación de tecla.

Algo así como Emacs Counsel-git-grep , ver: ejemplo de demostración .

ideasman42
fuente
No lo uso personalmente, así que no estoy 100% seguro, pero creo que ctrl-plo que estás buscando es un complemento similar. Tenga en cuenta que unite.vimtambién debería poder hacerlo, pero no lo recomendaría porque, en mi opinión , es un complemento bastante pesado y que crea errores.
statox
¿ ctrl-pTiene alguna forma de buscar interactivamente el contenido del archivo? Solo lo he usado para buscar interactivamente archivos basados ​​en sus nombres.
ideasman42
Creo que es posible, pero como dije, no lo uso, así que tal vez me equivoque
statox

Respuestas:

14

No estoy seguro de que esto sea lo que estás buscando, pero tal vez podrías probar fzf y fzf.vim .

Si usa vim-plug como administrador de complementos, todo lo que debe hacer para instalarlos es agregar estas líneas en su vimrc:

Plug 'junegunn/fzf', { 'dir': '~/.fzf', 'do': './install --all' }
Plug 'junegunn/fzf.vim'

... en algún lugar entre las líneas:

call plug#begin('~/.vim/plugged')

y:

call plug#end()

Entonces ejecuta :PlugInstall.


Entre los diversos comandos y asignaciones proporcionados por fzf.vim(cuyo único propósito parece ser instalar asignaciones y comandos que solicitan fzfla búsqueda difusa a través de fuentes predefinidas), está el comando :Ag.

Para poder usarlo, debe instalar el comando de shell ag . En distribuciones basadas en Debian, se puede hacer con el siguiente comando:

apt-get install silversearcher-ag

El proyecto en github explica cómo instalarlo en MacOS:

brew install the_silver_searcher

:Ages una envoltura $ agy le permite buscar difusamente un patrón en los archivos del directorio actual (el que se muestra cuando escribe :pwd). Las coincidencias se actualizan después de cada pulsación de tecla.

Usted puede:

  • avanzar y retroceder por los partidos con C-nyC-p
  • selecciona el partido actual y pasa al siguiente / anterior con Tab/S-Tab
  • seleccionar o anular la selección de todas las coincidencias con M-aoM-d

Si selecciona una o varias coincidencias, después de presionar Intro, completarán la lista de soluciones rápidas. Desde allí, podrá navegar a través de ellos con los comandos / asignaciones de Vim predeterminados, como :cnexty :cprevious.

ingrese la descripción de la imagen aquí

Si desea agregar un prefijo a todos los comandos instalados por fzf.vim, y evitar anular los comandos existentes, puede agregar esto en su vimrc:

let g:fzf_command_prefix = 'your_prefix'

Lo uso Fzfcomo prefijo, por eso no escribí :Agpero :FzfAg.


Si prefiere usar en git greplugar de ag, parece que podría instalar su propio envoltorio personalizado alrededor :GGrep, de esta manera:

command! -bang -nargs=* GGrep
  \ call fzf#vim#grep('git grep --line-number '.shellescape(<q-args>), 0, <bang>0)

Se explica en :h fzf-vim-customization.

Además, si fzfse abre un panel en tmux, y que preferirían que se necesita toda la pantalla en su lugar, puede anexar un golpe a todos los comandos ( :Ag!, :GGrep!, ...).


Como dijiste en tu último comentario , por defecto fzfcambia la configuración de tu shell. Por ejemplo, si usa bash, agregará la siguiente línea en su ~/.bashrc:

[ -f ~/.fzf.bash ] && source ~/.fzf.bash

Esto generará el archivo ~/.fzf.bash. Este último contiene algún código:

# Setup fzf
# ---------
if [[ ! "$PATH" == */home/user/.fzf/bin* ]]; then
  export PATH="$PATH:/home/user/.fzf/bin"
fi

# Auto-completion
# ---------------
[[ $- == *i* ]] && source "/home/user/.fzf/shell/completion.bash" 2> /dev/null

# Key bindings
# ------------
source "/home/user/.fzf/shell/key-bindings.bash"

Este código añade una ruta a la variable de entorno $PATH: /home/user/.fzf/bin; cual es la carpeta que contiene el fzfprograma.

También genera otros 2 archivos:

/home/user/.fzf/shell/completion.bash
/home/user/.fzf/shell/key-bindings.bash

El primero parece definir las funciones de finalización, mientras que el segundo instala las asociaciones de teclas.

Desafortunadamente, las combinaciones de teclas pueden anular las readlinefunciones predeterminadas .
Por ejemplo, fzfvincula la función fzf-file-widgeta C-t. Readline suele utilizar esta tecla para ejecutar la transpose-charsfunción.

Si no desea esto, una posible solución sería restaurar las asociaciones de teclas dentro de su ~/.bashrc, después de fzfhaber obtenido su configuración. Por ejemplo, si desea C-tmantener su comportamiento anterior, eso es transponer los 2 caracteres alrededor del cursor y vincular fzf-file-widgeta otra tecla, digamos C-x C-t, podría agregar estas líneas al final de ~/.bashrc:

bind -x '"\C-x\C-t": fzf-file-widget'
bind '"\C-t": transpose-chars'

Lo mismo se aplica al zshshell, pero la sintaxis para instalar un enlace de teclas es un poco diferente:

bindkey '^X^T' fzf-file-widget
bindkey '^T' transpose-chars

Si uno de los enlaces de teclas de shell al que estaba acostumbrado ha sido anulado fzf, desea restaurarlo, pero no sabe cuál es el nombre exacto de la función que se ejecutó, puede intentar lo siguiente.

Primero, dentro de tu ~/.bashrc, comenta temporalmente la línea que origina la fzfconfiguración. Luego, vuelva a abrir un terminal y eche un vistazo a la salida del bind -Pcomando, que puede leer en un búfer de Vim:

bind -P | vim -R -

No estoy seguro, pero creo que debería mostrar la mayoría o todas las readlineasociaciones de teclas. Si está buscando el nombre de la función readline vinculada a la C-ttecla, en el búfer Vim, buscaría \\C-t. Y si estaba buscando el que está vinculado a M-c(tecla meta / alt), buscaría \\ec( \erepresenta la tecla de escape y parece que M-cproduce los mismos códigos de tecla que escape + c).

Puede hacer lo mismo zshmirando la salida del bindkeycomando. Pero esta vez, ^[representa la tecla modificadora meta / alt, mientras que un solo carácter caret ( ^) representa la tecla de control.


Actualmente, encontré 4 enlaces de teclas que ejecutan funciones que contienen la fzfpalabra clave en su nombre. Usan las secuencias de teclas C-i(igual que Tab) C-r, C-ty M-c. Están vinculados a las siguientes funciones:

C-i    fzf-completion
C-r    fzf-history-widget
C-t    fzf-file-widget
M-c    fzf-cd-widget

En mi sistema, originalmente readline(la biblioteca utilizada bashpara editar la línea de comando) vinculaba esas teclas a estas funciones:

C-i     complete
C-r     reverse-search-history
C-t     transpose-chars
M-c     capitalize-word

Y zle(el editor de línea utilizado por zsh), los unió a:

C-i     expand-or-complete
C-r     history-incremental-search-backward
C-t     transpose-chars
M-c     capitalize-word
usuario9433424
fuente
1
¿Se agnecesita instalar un complemento / herramienta separado?
ideasman42
@ ideasman42 Sí, lo siento, olvidé que el comando de shell agtambién era necesario. Actualicé la respuesta.
user9433424
1
Probablemente valga la pena señalar que estas herramientas son bastante intrusivas, ya que reemplazan las configuraciones de bash y zsh de forma predeterminada.
ideasman42
@ ideasman42 Tienes razón, actualicé la respuesta para mencionar este problema.
user9433424