Complétion des mots à l'écran comme dans VIM (Bash ou Tmux)

10

Comment puis-je configurer Bash, Zsh ou Tmux pour compléter le dernier identifiant correspondant à l'écran ? Considérez ce scénario courant:

$ 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

Comment puis-je obtenir issue547facilement Bash / Zsh / Tmux sur la CLI? Lorsque j'appuie Tabaprès que $ git checkout isGit se termine utilement issue, mais je dois compléter les chiffres par moi-même car tous les chiffres précédents correspondent en fait aux branches Git existantes .

Dans VIM, appuyer sur Ctrl+ Ppour omnicomplete se terminera comme le match précédent, donc dans ce cas issue547314sera en fait terminé. Comment puis-je obtenir ce comportement dans Bash, dans Zsh ou dans Tmux ?

J'utilise actuellement Bash 4.2 et Tmux 1.10 sur Ubuntu Server (généralement 12.04 LTS). Je peux mettre à jour vers le dernier Ubuntu Server LTS (14.04) si nécessaire.

EDIT : Cela ne me dérangerait pas une solution qui utilise Bash, Zsh ou Tmux tant qu'elle n'est pas difficile à utiliser. Donc, Tabou Ctrl+ Pou un autre raccourci de ce type serait bien, mais pas Alt+ Meta+ Super+ Shift+ א.

dotancohen
la source
Je suis sûr que cela nécessiterait une révision assez importante de la source bash.
Kevin
@Kevin: J'en ai pensé autant, mais j'espère que l'incroyable zsh peut le gérer, ou peut-être tmux.
dotancohen

Réponses:

4

Je pense que cette fonctionnalité que OP recherche est appelée dabbrev-expand dans le monde Emacs:

Développez le mot dans le tampon avant le point comme une abréviation dynamique, en recherchant dans le tampon les mots commençant par cette abréviation (v-expand).

xterma également des dabbrev-expandfonctionnalités, mais il est un peu moins intelligent que son homologue Emacs, mais il est très utile pour moi et l'une des raisons pour lesquelles je suis passé xterm. Dans la xtermfenêtre, on peut utiliser une liaison de touches personnalisée spécifiée dans ~/.Xresourcespour invoquer dabbrev-expandune chaîne donnée. Par exemple, j'ai l'entrée suivante dans mon ~/.Xresources(j'utilise uxterm, une version Unicode de xterm):

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

Dans la xtermfenêtre intérieure , je peux utiliser M-/( ALT + /) pour invoquer dabbrev-expand. xtermrecherchera toutes les chaînes visibles à l'écran qui commencent par les lettres que j'ai tapées. Exemple:

$ echo a_very_long_string bye by
$ a_v

Si je pressais M-/maintenant xtermélargirait a_và a_very_long_string. Malheureusement, comme je l'ai dit, ce xtermn'est pas si intelligent et sa dabbrev-expandfonctionnalité ne fonctionnera que sur des chaînes complètes. Donc, dans votre cas, isserait étendu à issue540et non issue547314parce qu'il issue547314fait partie de origin/issue547314(pensez-y comme \bdans les expressions régulières, c'est un peu similaire, bien que la plupart des moteurs d'expressions régulières capturent les deux occurrences de issuechaînes \bissue.+\b). Mais , vous pouvez taper orpuis pressez M-/. xtermva d'abord s'étendre orà origin/v2.1, ce n'est pas ce que nous voulons, alors appuyez à M-/nouveau et xtermdéveloppez-le origin/issue547314. Maintenant, si vous utilisez Bash, vous pouvez le faire M-b,C-wet C-epour retirer une origin/partie. Pour résumer, l' dabbrev-expandintérieur xtermn'est pas aussi bon que dans Emacs (et Vim je suppose) mais c'est toujours plus rapide que de réécrire de longues cordes à la main et moins sujette aux fautes de frappe. Et dans la plupart des cas, il s'étendra directement à la chaîne souhaitée sans avoir à supprimer les parties redondantes. Vous avez juste besoin de vous y habituer - regardez la chaîne que vous voulez avoir au curseur et voyez si elle n'est pas précédée par quelque chose d'autre, et si c'est tapez une partie précédente et supprimez-la après l'expansion.

Notez que ce xtermn'est pas compilé avec la dabbrev-expandfonctionnalité par défaut et vous devez l'activer explicitement. Cependant, la version de xtermdans les référentiels Ubuntu est compilée avec dabbrev-expandet vous pouvez l'utiliser immédiatement.

Arkadiusz Drabczyk
la source
Merci Arkadiusz, cela semble assez proche de ce dont j'ai besoin. Notez que je ne peux pas le faire fonctionner! Peut-être que mon xtermet uxtermne sont pas compilés pour dabbrev-expand, je n'ai trouvé aucune mention de la fonctionnalité dans -help. Comment puis-je voir les drapeaux de compilation (comme avec vim --version)? Notez que j'ai aussi essayé la ligne de configuration en ~/.Xresourcestant Meta <KeyPress> /: dabbrev-expand() \n\ que l'on trouve ici , mais cela n'a pas aidé non plus .
dotancohen
Il se peut que votre xterm ait été compilé sans dabbrev-expand. Comment avez-vous installé xterm? Après avoir modifié ~ / .Xresources faire xrdb -merge .Xresourcesdans xterm.
Arkadiusz Drabczyk du
Cela l'a certainement fait, Arkadiusz! Je vous remercie!
dotancohen
Je vais donner à la question quelques heures de plus jusqu'à la fin de la période de primes, mais je suis presque sûr que vous êtes un remplaçant. Le seul problème est l'exigence de xterm, ce qui est terrible! Mais maintenant que je connais le nom correct de la fonctionnalité, je peux la rechercher sur Google pour d' autres applications . Merci!
dotancohen
Merci Arkadiusz! Bien que je n'utilise pas la solution xterm, vous m'avez certainement orienté dans la bonne direction. Apparemment, zsha cette facilité.
dotancohen
1

Bash comme une installation similaire appelée bash achèvement. Vous pouvez l'utiliser en appuyant sur la Tabtouche lorsque vous fournissez des arguments aux commandes lorsque vous les tapez.

Exemple

Si je commence par taper lspuis appuyer Tabdeux fois, vous obtiendrez Bash pour fournir une liste des fichiers correspondants (et des commutateurs de ligne de commande) à la commande que vous essayez d'utiliser:

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

Et voici l'exemple avec les commutateurs:

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

Installer?

Mon installation incluait déjà une règle pour git:

/etc/bash_completion.d/git

L'installation de ce fichier a été effectuée lorsque j'ai installé le gitpackage. Je suis sur Fedora 19, mais d'autres distributions devraient également le faire.

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

En regardant le fichier de règles, il explique qu'il facilitera l'auto-complétion dans les situations suivantes:

# 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
#

Donc, cela devrait "fonctionner" pour vous.

slm
la source
2
Travaux de complétion Bash et Git (comme je le mentionne dans le PO). Le changement que je voudrais effectuer est de le faire terminer sur le premier onglet, appuyez sur la dernière valeur légale affichée à l'écran. C'est ainsi que VIM Omnicompletion fonctionne.
dotancohen
@dotancohen - Je ne vois pas maintenant que ce serait possible au-delà de ce que j'ai décrit.
slm
1

Vous pouvez faire quelque chose comme ça avec extrakto :

  • appuyez sur tmux prefix + tabpour démarrer extrakto
  • trouver flou le texte / chemin / url
  • presse
    • tab pour l'insérer dans le volet courant,
    • enter pour le copier dans le presse-papiers,
    • ctrl-o pour ouvrir le chemin / l'URL ou
    • ctrl-e éditer avec $EDITOR
laktak
la source