Finalización de tabulación tipo Zsh de rutas parciales

11

Relacionado con Bash como tabulación parcial completa para nombres de archivo en Vim

Una de las características realmente fantásticas zshes que puede escribir, por ejemplo ls /u/s/m/m/who.1, presionar Taby completarlo ls /usr/share/man/man1/who.1.gz. Una vez que te acostumbras, es realmente molesto volver /u<tab>/s<tab>/m<tab>/m<tab>..., especialmente cuando toda la ruta parcial solo puede resolverse en una ruta real, pero cada componente individual puede tener múltiples finalizaciones. ¿Se puede lograr esto en Vim, por ejemplo, cuando se usa :eo :cd?

Hay otras características útiles relacionadas con la ruta en zsh, como usar cd foo barpara moverse a una ruta equivalente con fooreemplazado por bar(es decir, se /blah/foo/baz/yadaconvierte /blah/bar/baz/yada). Si hay una solución que también los incorpore (esencialmente entregando tareas relacionadas con shell a un shell que las haga muy bien), sería genial.

muru
fuente
1
No conozco nada que logre exactamente lo que está pidiendo, pero hay varios buscadores de archivos borrosos que le permiten abrir archivos de manera similar. Estoy a favor de CtrlP, pero también está Command-T y estoy seguro de que hay otros de los que olvido el nombre.
Rico
1
@Rich Mientras no tenga que machacar a Tab una docena de veces, sería feliz.
muru
Ya hay una pregunta similar sobre SO.
romainl

Respuestas:

6

Solía ​​usar CtrlP y otros complementos relacionados mucho antes hasta que realmente descubrí los poderes nativos de vim. Permítanme explicar algunas formas de hacerlo sin requerir un complemento externo:

  1. :e, lo bueno de: e es que puedes hacer algo como :e /u*/s*/m*/m*/<Tab>y vim lo expandirá automáticamente para que lo hagas :e /usr/share/man/man. Eso es mucho más corto y simple que lo que publicaste, pero una forma aún mejor es hacerlo :e /usr/**/man<Tab>, de esa manera se verá recursivamente debajo /usry enumerará todas las rutas coincidentes, aunque esto puede tomar tiempo, dependiendo de qué tan grande sea el conjunto, pero en un proyecte que esto funciona de maravilla porque puede hacer algo así :e ap**/jav**/user<Tab>y completará todas las rutas incompletas y le dará una lista de rutas coincidentes y funciona de maravilla.
  2. :b, Para abrir buffers existentes. Esto es realmente poderoso porque acepta parciales de forma predeterminada, por lo que puede hacer algo así :b usr*man<Tab>y completará el nombre del archivo si ya se ha cargado en la lista de búfer. Esto es especialmente bueno porque es casi instantáneo y muy rápido. También uso mucho las sesiones de vim, con la ayuda de tpope / vim-obsession y dhruvasagar / vim-prosession , que mantiene todos los archivos que abro en la lista de búfer y están disponibles incluso si existo vim y vuelvo a él desde el directorio del proyecto
Dhruva Sagar
fuente
1
/u*/s*/m*/m*/<Tab>así es como solía trabajar alrededor de bash. No es un sustituto de zsh por una milla. /usr/**/man<Tab>es terriblemente lento cuando tiene todo el sistema de archivos abierto, pero puede ser útil para proyectos pequeños. A menos que malinterprete :b, no es para abrir nuevos archivos.
muru
@muru tienes razón, no es un sustituto de zsh, pero aún así es mejor que tener que escribir todo tú mismo, se trata de hacerlo más fácil, **es realmente lento, pero funciona bien para proyectos regulares. :bes para el búfer abierto existente, por eso es útil usar sesiones.
Dhruva Sagar
5

vim-zsh-path-complete pretende hacer exactamente lo que está pidiendo (la primera parte, al menos), pero nunca lo he intentado. (Ni siquiera había oído hablar de él hasta que romainl vinculó a una respuesta SO de su autor , aunque su documentación también menciona varias limitaciones.

Además de esto, hay varios buscadores de archivos difusos que logran algo similar para abrir archivos.

Mi complemento favorito para esto es CtrlP . Cuando se usa para abrir archivos, busca cualquier archivo cuyas rutas completas contengan los caracteres que escribe en el orden correcto; no tiene que escribir partes de cada componente de la ruta (y todos los separadores de ruta) a medida que tienes en tu ejemplo, pero funciona perfectamente bien si lo haces. También usa la misma interfaz para abrir archivos usados ​​recientemente y buffers abiertos actualmente, y más.

Por defecto, se asigna <c-p>en modo normal para abrir el indicador CtrlP. La solicitud muestra una lista de archivos, que se reduce a medida que escribe caracteres. Puede presionar Enteren cualquier punto para abrir el archivo seleccionado actualmente, o usar <c-k>y <c-j>para mover la selección hacia arriba y hacia abajo a través de la lista de archivos coincidentes actualmente.

Otra alternativa popular es Command-T , pero estoy a favor de CtrlP porque está implementado en VimScript; Command-T tiene un componente Ruby.

Rico
fuente