guía

FZF - EL buscador *nix.

por Lógico (@logico_ar)

PUBLICADO 11:30 AM
13.6.2019

Si, el título está bien escrito, FZF es EL buscador en la terminal en Linux/Unix.

FZF es una herramienta que uno no sabia que necesitaba sino hasta haberla utilizada. Para entrar en tema, FZF es un buscador difuso (fuzzy finder) que corre en la terminal. Basicamente es un filtro interactivo que puede buscar en cualquier tipo de lista que se le dé cómo entrada: archvos, historial de comandos, procesos, etc. Lo genial de este programa es la velocidad de las búsquedas y la capacidad de trabajar con otros programas.

Instalación.

Si bien hay varias maneras de instalarlo en Linux, la mejor es utilizar git para clonar el repositorio ya que hace la instalación y además se integra el shell.

git clone --depth 1 https://github.com/junegunn/fzf.git ~/.fzf
~/.fzf/install

Para instalarlo en Mac vamos a usar al siempre bueno de Homebrew 🍺.

brew install fzf

Para instalar los atajos de teclado del shell hay que ejecutar:

$(brew --prefix)/opt/fzf/install

Usos básicos.

El primer uso que le vamos a dar es la búsqueda de archivos. Es sumamente fácil y veloz, podemos ingresar por ejemplo el nombre del programa y luego presionar CTRL+T para comenzar con la magia. Es a partír de acá que ingresando una parte del nombre de archivo, FZF busca en todos los subdirectorios por los archivos que se llaman con las palabra buscada.

Otra de las funciones básicas es la búsqueda en el historial. Con el atajo CTRL+R, FZF inicia ahora en el modo historial. Nuevamente, ingresamos parte de lo que queremos encontrar y/o seleccionamos con las flechas o CTRL+P/CTRL+N para volver a ejecutar el comando recordado del historial.

Finalmente podemos activar el completado de archivos y directorios en bash y zsh. Para esto basta ingresar parte del comando con ** y presionar TAB para iniciar FZF. Solamente hay que ingresar parte del archivo o directorio que queremos interactuar y este gran programa se encarga del resto.

Búsqueda de contenido dentro de archivos.

Exactamente cómo lo leiste. FZF se puede integrar con ripgrep para buscar y encontrar cadenas dentro de los archivos. ¿Qué más se puede pedir?. Sólo tenemos que instalar ripgrep y agregar la siguente función en .bashrc o .zshrc

fif() {
  if [ ! "$#" -gt 1 ]; then echo "Need a string to search for!"; return 1; fi
  rg --files-with-matches --no-messages $1 | fzf --preview "highlight -O ansi -l {} 2> /dev/null | rg --colors 'match:bg:yellow' --ignore-case --pretty --context 10 $1 || rg --ignore-case --pretty --context 10 $1 {}"
}

El uso es simple:

fif buscarCadena

Search and Destroy: búscar y matar procesos.

Otra excelente función es la de buscar procesos y poder matarlos. Generalmente esta operación la hacemos con el comando

ps aux | grep -i nombreProceso

Pero con la siguiente función podemos simplificarlo

	fkill() {
			local pid 
			if [ "$UID" != "0" ]; then
					pid=$(ps -f -u $UID | sed 1d | fzf -m | awk '{print $2}')
			else
					pid=$(ps -ef | sed 1d | fzf -m | awk '{print $2}')
			fi  

			if [ "x$pid" != "x" ]
			then
					echo $pid | xargs kill -${1:-9}
			fi  
	}

Luego, ingresando fkill en la terminal buscamos el proceso a matar.

FZF ⨯ VIM: la combinación perfecta.

Cómo si FZF no fuera suficiente, el desarrollador también creo un plugin para VIM y nos habilita a usar el fuzzy finder en distintas funciones de VIM.

Instalación con vim-plug.
	Plug '/usr/local/opt/fzf'
	Plug 'junegunn/fzf.vim'
Instalación con pathogen.
	cd ~/.vim/bundle
	git clone https://github.com/junegunn/fzf.vim.git
Activación y configuración.

Nuestra configuración base hace que FZF se habra en una ventana a la izquierda cada vez que sea invocado. Para esto, agregamos estas líneas al archivo .vimrc

	set rtp+=~/.fzf
	let g:fzf_layout = { 'left': '~30%'}

Funciones.

A continuación te dejamos una lista con las funciones más útiles de éste plugin que a su vez podemos mapearlas para tener un rápido acceso a ellas. Por ejemplo, nosotros usamos la tecla F2 para buscar y abrir archivos y F3 para buscar buffers abiertos.

	#Agregar a .vimrc
	nmap <F2> :call fzf#run(fzf#wrap({'source': 'git ls-files --exclude-standard --others --cached'}))<Enter>
	nmap <F3> :Buffers<Enter>
Comando Descripción
Files [PATH] Archivos (similar a :FZF)
Buffers Buscar buffers
Colors Buscar colorschemes
Lines [BUSQUEDA] Buscar líneas en buffers abiertos
BLines [BUSQUEDA] Buscar líneas en el buffer actual
Tags [BUSQUEDA] Buscar Tags en el proyecto (ctags -R)
BTags [BUSQUEDA] Buscar Tags en el buffer actual
Marks Buscar marcas
Windows Buscar ventanas
History: Buscar en el historial de comandos
History/ Buscar en el historial de búsqueda
BCommits Buscar Git commits del buffer actual
Commands Buscar comandos


Comentarios desactivados en la versión móvil.