¿Existe un modo de coincidencia difusa para el shell zsh?

22

Recientemente me he enamorado de los sistemas eficientes de finalización de texto. Uno de mis tipos de finalización favoritos es la denominada finalización difusa. Este es un modo en el que el programa completará la entrada del usuario basándose solo en un par de caracteres que pueden aparecer 'en cualquier lugar' (casi) en el nombre o la ruta del archivo. Esta característica existe al menos para estos programas:

Ejemplo de uso de este modo en un editor de texto:

El usuario está intentando completar la palabra longWordNameThatTheyDontWantToWriteByHand, y puede hacerlo escribiendo, por ejemplo, la primera letra y algunas mayúsculas. Por lo tanto, escribir lwnt podría completar la palabra completa.

Mi pregunta es: ¿hay algún modo o algo similar que pueda usar con el shell zsh?

sp3ctum
fuente

Respuestas:

27

Tengo esto en mi .zshrc

# 0 -- vanilla completion (abc => abc)
# 1 -- smart case completion (abc => Abc)
# 2 -- word flex completion (abc => A-big-Car)
# 3 -- full flex completion (abc => ABraCadabra)
zstyle ':completion:*' matcher-list '' \
  'm:{a-z\-}={A-Z\_}' \
  'r:[^[:alpha:]]||[[:alpha:]]=** r:|=* m:{a-z\-}={A-Z\_}' \
  'r:|?=** m:{a-z\-}={A-Z\_}'

Agrega una coincidencia totalmente difusa al zshmotor de finalización. Carece de la súper inteligencia del texto sublime, pero sí, se completará lwnt -> longWordNameThatTheyDontWantToWriteByHand.

PythonNut
fuente
1
Acabo de encontrar un error: no funciona para nombres de archivo con espacios, dado que está escribiendo algo después del espacio ☹ Es decir, stack install && vlc ~/Music/erfno se completa stack install && vlc ~/Music/FGFC820\ -\ Perfect\ War.mp3.
Hi-Angel
55
@ Hola, hola Ángel, gracias por toparte con esto. De hecho, lo uso 'r:|?=** m:{a-z\-}={A-Z\_}'ahora, que es mucho más simple y no sufre el problema que usted describe.
PythonNut
¡Eso es genial! Tal vez podrías hacer un complemento con este código. Solo para que sea más fácil de encontrar.
Julien__
15

Mira mi proyecto fzf .

Es un buscador difuso de propósito general escrito en Golang que se puede usar con cualquier lista de cosas: archivos, procesos, historial de comandos, ramas git, etc.

Para zsh, proporciona las siguientes asociaciones de teclas:

  • CTRL-T - Pegue la ruta del archivo seleccionado en la línea de comando
  • CTRL-R - Pegue el comando seleccionado del historial en la línea de comando
  • ALT-C - cd en el directorio seleccionado

y modo de finalización difusa:

# Files under current directory
# - You can select multiple items with TAB key
vim **<TAB>

# Files under parent directory
vim ../**<TAB>

# Files under parent directory that match `fzf`
vim ../fzf**<TAB>

# Files under your home directory
vim ~/**<TAB>

# Directories under current directory (single-selection)
cd **<TAB>

# Directories under ~/github that match `fzf`
cd ~/github/fzf**<TAB>

# Process IDs. Can select multiple processes with TAB or Shift-TAB
kill -9 <TAB>

# Host names
ssh **<TAB>
telnet **<TAB>

# Environment variables / aliases
unset **<TAB>
export **<TAB>
unalias **<TAB>
Junegunn Choi
fuente
44
¿Cómo puedo completar la pestaña con esto de forma predeterminada? Sin tener que escribir**
theonlygusti