Completar palabras en la pantalla como en VIM (Bash o Tmux)

10

¿Cómo puedo configurar Bash, Zsh o Tmux para completar el último identificador coincidente en la pantalla ? Considere este escenario común:

$ git fetch
remote: Counting objects: 16, done.
remote: Compressing objects: 100% (9/9), done.
remote: Total 9 (delta 4), reused 0 (delta 0)
Unpacking objects: 100% (9/9), done.
From /opt/git/thunder
 * [new branch]      issue540   -> origin/issue547314
   e9204cf..4d42c3f  v2.1       -> origin/v2.1

¿Cómo puedo hacer que Bash / Zsh / Tmux se complete issue547fácilmente en la CLI? Cuando presiono Tabdespués de que $ git checkout isGit completa útilmente issue, pero debo completar los dígitos por mí mismo porque todos los dígitos anteriores coinciden de hecho con las ramas existentes de Git .

En VIM, presionar Ctrl+ Ppara omnicomplete se completará como la coincidencia anterior, por lo que en este caso issue547314se completará. ¿Cómo puedo obtener este comportamiento en Bash, en Zsh o en Tmux ?

Actualmente estoy usando Bash 4.2 y Tmux 1.10 en Ubuntu Server (generalmente 12.04 LTS). Puedo actualizar al último Ubuntu Server LTS (14.04) si es necesario.

EDITAR : No me importaría ninguna solución que use Bash, Zsh o Tmux siempre que no sea difícil de usar. Entonces, Tabo Ctrl+ Po algún otro atajo estaría bien, pero no Alt+ Meta+ Super+ Shift+ א.

dotancohen
fuente
Estoy bastante seguro de que esto requeriría una revisión bastante grande de la fuente bash.
Kevin
@ Kevin: Me lo imaginé, pero espero que el increíble zsh pueda manejarlo, o tal vez tmux.
dotancohen

Respuestas:

4

Creo que la función que está buscando OP se llama dabbrev-expand en el mundo de Emacs:

Expanda la palabra en el búfer antes del punto como una abreviatura dinámica, buscando en el búfer palabras que comiencen con esa abreviatura (v-expand).

xtermTambién tiene dabbrev-expandcaracterísticas, pero es un poco menos inteligente que la contraparte de Emacs, pero es muy útil para mí y una de las razones por las que me cambié xterm. Dentro de la xtermventana se puede usar una combinación de teclas personalizada especificada ~/.Xresourcespara invocar dabbrev-expanden una cadena dada. Por ejemplo, tengo la siguiente entrada en mi ~/.Xresources(yo uso uxterm, una versión Unicode de xterm):

UXTerm*VT100.Translations: #override \n\
     Meta <Key>/:dabbrev-expand() \n\

Dentro de la xtermventana puedo usar M-/( ALT + /) para invocar dabbrev-expand. xtermbuscará todas las cadenas visibles en la pantalla que comienzan con las letras que escribí. Ejemplo:

$ echo a_very_long_string bye by
$ a_v

Si presionara M-/ahora xtermse expandiría a_va a_very_long_string. Desafortunadamente, como dije, xtermno es tan inteligente y su dabbrev-expandfunción solo funcionará en cadenas completas. Entonces, en su caso isse expandiría issue540y no issue547314porque issue547314es parte de origin/issue547314(piense en ello como \ben las expresiones regulares, es un poco similar, aunque la mayoría de los motores de expresiones regulares captarían ambas ocurrencias de issuecadenas \bissue.+\b). Pero , puede escribir ory luego pres M-/. xtermprimero se expandirá ora origin/v2.1, esto no es lo que queremos, así que presione M-/nuevamente y xtermlo ampliará a origin/issue547314. Ahora, si usas Bash puedes hacerlo M-b,C-wy C-epara quitar origin/parte. En resumen, el dabbrev-expandinterior xtermno es tan bueno como en Emacs (y Vim, supongo), pero sigue siendo más rápido que reescribir largas cadenas a mano y menos propenso a los errores tipográficos. Y en la mayoría de los casos se expandirá directamente a la cadena deseada sin necesidad de eliminar partes redundantes. Solo necesita acostumbrarse a él: mire la cadena que desea tener en el cursor y vea si no está precedida por otra cosa, y si es una parte anterior y elimínela después de la expansión.

Tenga en cuenta que xtermno se compila con la dabbrev-expandfunción de forma predeterminada y debe habilitarla explícitamente. Sin embargo, la versión de los xtermrepositorios de Ubuntu está compilada dabbrev-expandy puede usarla de inmediato.

Arkadiusz Drabczyk
fuente
Gracias Arkadiusz, esto parece estar lo suficientemente cerca de lo que necesito. Tenga en cuenta que no puedo hacer que funcione! Quizás mi xtermy uxtermno están compilados para dabbrev-expand, no pude encontrar ninguna mención de la función en -help. ¿Cómo puedo ver los indicadores de compilación (como con vim --version)? Tenga en cuenta que también probé la línea de configuración en la ~/.Xresourcesque Meta <KeyPress> /: dabbrev-expand() \n\ como se encuentra aquí , pero eso no ayuda, tampoco.
dotancohen 01 de
Puede ser que su xterm haya sido compilado sin dabbrev-expand. ¿Cómo instalaste xterm? Después de modificar ~ / .Xresources hacer xrdb -merge .Xresourcesen xterm.
Arkadiusz Drabczyk
¡Eso ciertamente lo hizo, Arkadiusz! ¡Gracias!
dotancohen 01 de
Voy a dar la pregunta unas horas más hasta que termine el período de recompensa, pero estoy bastante seguro de que eres un zapato. El único problema es el requisito de xterm, ¡lo cual es terrible! Pero ahora que sé el nombre correcto de la función, puedo buscarlo en Google para otras aplicaciones . ¡Gracias!
dotancohen 01 de
¡Gracias Arkadiusz! Aunque no voy a usar la solución xterm, ciertamente me has señalado en la dirección correcta. Aparentemente zshtiene esta facilidad.
dotancohen 01 de
1

Bash como una instalación similar llamada finalización de bash. Puede usarlo Tabpresionando la tecla al proporcionar argumentos a los comandos cuando los está escribiendo.

Ejemplo

Si empiezo escribiendo lsy luego presionando Tabdos veces, obtendrá Bash para proporcionar una lista de archivos coincidentes (y modificadores de línea de comandos) a cualquier comando que intente usar:

$ ls <---- hit Tab x 2
Display all 232 possibilities? (y or n)

Y aquí está el ejemplo con interruptores:

$ ls -- <---- hit Tab x 2
--all                 --format=                                  --quote-name
--almost-all          --group-directories-first
....
....

¿Preparar?

Mi instalación ya incluía una regla para git:

/etc/bash_completion.d/git

La instalación de este archivo se realizó cuando instalé el gitpaquete. Estoy en Fedora 19, pero otras distribuciones también deberían estar haciendo esto.

$ rpm -qf /etc/bash_completion.d/git
git-1.8.3.1-1.fc19.x86_64

Mirando el archivo de reglas, explica que facilitará la finalización automática en las siguientes situaciones:

# The contained completion routines provide support for completing:
#
#    *) local and remote branch names
#    *) local and remote tag names
#    *) .git/remotes file names
#    *) git 'subcommands'
#    *) tree paths within 'ref:path/to/file' expressions
#    *) file paths within current working directory and index
#    *) common --long-options
#

Entonces esto debería "funcionar" para usted.

slm
fuente
2
La finalización de Bash y el trabajo de finalización de Git (como menciono en el OP). El cambio que me gustaría realizar es que se complete en la primera pestaña, presione el último valor legal que se muestra en la pantalla. Así es como funciona VIM Omnicompletion.
dotancohen
@dotancohen: ahora no veo que eso sea posible más allá de lo que he descrito.
slm
1

Puedes hacer algo como esto con extrakto :

  • presione tmux prefix + tabpara iniciar extrakto
  • difuso encontrar el texto / ruta / url
  • prensa
    • tab para insertarlo en el panel actual,
    • enter copiarlo al portapapeles
    • ctrl-o para abrir la ruta / url o
    • ctrl-e para editar con $EDITOR
laktak
fuente