Completamento delle parole sullo schermo come in VIM (Bash o Tmux)


10

Come posso configurare Bash, Zsh o Tmux per completare l' ultimo identificatore corrispondente sullo schermo ? Considera questo scenario comune:

$ 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

Come posso ottenere facilmente Bash / Zsh / Tmux da completare issue547sulla CLI? Quando premo Tabdopo che $ git checkout isGit lo completa utilmente issue, ma devo completare le cifre da solo perché tutte le cifre precedenti corrispondono effettivamente ai rami Git esistenti .

In VIM, premendo Ctrl+ Pper omnicomplete verrà completato come il match precedente, quindi in questo caso issue547314verrà effettivamente completato. Come posso ottenere questo comportamento in Bash, in Zsh o in Tmux ?

Attualmente sto usando Bash 4.2 e Tmux 1.10 su Ubuntu Server (di solito 12.04 LTS). Posso aggiornare all'ultimo Ubuntu Server LTS (14.04) se necessario.

EDIT : Non mi dispiacerebbe alcuna soluzione che utilizza Bash, Zsh o Tmux purché non sia difficile da usare. Quindi Tabo Ctrl+ Po qualche altra scorciatoia del genere andrebbe bene, ma non Alt+ Meta+ Super+ Shift+ א.


Abbastanza sicuro, ciò richiederebbe una revisione abbastanza ampia della fonte bash.
Kevin,

@Kevin: ho pensato tanto, ma spero che lo straordinario zsh riesca a gestirlo, o forse tmux.
dotancohen,

Risposte:


4

Penso che quella caratteristica che OP sta cercando si chiama dabbrev-expand nel mondo Emacs:

Espandere la parola nel buffer prima del punto come abbrevia dinamico, cercando nel buffer parole che iniziano con quell'abbreviazione (v-expand).

xtermha anche dabbrev-expandfunzionalità, ma è un po 'meno intelligente della controparte Emacs ma è molto utile per me e uno dei motivi per cui sono passato xterm. All'interno della xtermfinestra si può usare un keybinding personalizzato specificato in ~/.Xresourcesper invocare dabbrev-expanduna data stringa. Ad esempio, ho la seguente voce nel mio ~/.Xresources(uso uxtermuna versione Unicode di xterm):

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

Nella xtermfinestra posso usare M-/( ALT + /) per invocare dabbrev-expand. xtermcercherà tutte le stringhe visibili sullo schermo che iniziano con le lettere che ho digitato. Esempio:

$ echo a_very_long_string bye by
$ a_v

Se ho premuto M-/ora xtermsi espanderebbe a_va a_very_long_string. Sfortunatamente, come ho detto, xtermnon è così intelligente e la sua dabbrev-expandfunzionalità funzionerà solo su stringhe complete. Quindi, nel tuo caso isverrebbe ampliato issue540e non issue547314perché issue547314fa parte di origin/issue547314(pensaci come \bnelle espressioni regolari, è un po 'simile anche se la maggior parte dei motori di espressioni regolari catturerebbe entrambe le occorrenze di issuestringhe \bissue.+\b). Ma puoi digitare ore quindi pres M-/. xtermsi espanderà prima ora origin/v2.1, non è quello che vogliamo, quindi premere di M-/nuovo e xtermlo espanderemo a origin/issue547314. Ora, se usi Bash puoi farlo M-b,C-we C-eper rimuovere la origin/parte. Per riassumere, dabbrev-expandinside xtermnon è buono come in Emacs (e Vim immagino) ma è ancora più veloce che riscrivere a mano stringhe lunghe e meno incline all'errore di battitura. E nella maggior parte dei casi si espanderà direttamente nella stringa desiderata senza la necessità di rimuovere parti ridondanti. Devi solo abituarti - guarda la stringa che vuoi avere al cursore e vedi se non è preceduta da qualcos'altro, e se è una parte precedente e rimuovila dopo l'espansione.

Si noti che xtermnon è compilato con dabbrev-expandfunzionalità per impostazione predefinita e è necessario abilitarlo esplicitamente. Tuttavia, la versione di xtermrepository Ubuntu è compilata dabbrev-expande puoi usarla subito.


Grazie Arkadiusz, questo sembra essere abbastanza vicino a ciò di cui ho bisogno. Nota che non riesco a farlo funzionare! Forse i miei xterme uxtermnon sono stati compilati per dabbrev-expand, non ho trovato alcun riferimento alla funzionalità in -help. Come posso vedere i flag di compilazione (come con vim --version)? Si noti che ho provato anche la linea di configurazione in ~/.Xresourcesquanto Meta <KeyPress> /: dabbrev-expand() \n\ come si trova qui , ma questo non ha aiutato, neanche.
dotancohen,

È possibile che il tuo xterm sia stato compilato senza dabbrev-expand. Come hai installato xterm? Dopo aver modificato ~ / .Xresources fare xrdb -merge .Xresourcesin xterm.
Arkadiusz Drabczyk,

Lo ha sicuramente fatto, Arkadiusz! Grazie!
dotancohen

Darò la domanda ancora qualche ora fino al termine del periodo di ricompensa, ma sono abbastanza sicuro che tu sia una scarpa. L'unico problema è il requisito per xterm, che è terribile! Ma ora che conosco il nome corretto per la funzione, posso cercarlo su Google per altre applicazioni . Grazie!
dotancohen,

Grazie Arkadiusz! Anche se non userò la soluzione xterm, mi hai sicuramente indicato la giusta direzione. Apparentemente zshha questa possibilità.
dotancohen,

1

Bash come una struttura simile chiamata completamento bash. Puoi usarlo premendo il Tabtasto quando fornisci argomenti ai comandi quando li scrivi.

Esempio

Se comincio digitando lse poi premendo Tabdue volte, otterrai Bash per fornire un elenco di file corrispondenti (e opzioni della riga di comando) a qualunque comando tu stia tentando di usare:

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

Ed ecco l'esempio con gli switch:

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

Impostare?

La mia installazione ha già incluso una regola per git:

/etc/bash_completion.d/git

L'installazione di questo file è stata eseguita quando ho installato il gitpacchetto. Sono su Fedora 19, ma anche altre distro dovrebbero farlo.

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

Guardando il file delle regole, spiega che faciliterà il completamento automatico nelle seguenti situazioni:

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

Quindi questo dovrebbe "funzionare" per te.


2
Il completamento di Bash e il completamento di Git funzionano (come menziono nel PO). La modifica che vorrei eseguire è di averlo completato nella prima scheda, premere l'ultimo valore legale visualizzato sullo schermo. Ecco come funziona VIM Omnicompletion.
dotancohen

@dotancohen - Non vedo ora che sarebbe possibile al di là di quello che ho descritto.
slm

1

Puoi fare qualcosa del genere con extrakto :

  • premere tmux prefix + tabper avviare extrakto
  • fuzzy trova il testo / percorso / url
  • stampa
    • tab per inserirlo nel riquadro corrente,
    • enter per copiarlo negli appunti,
    • ctrl-o per aprire il percorso / url o
    • ctrl-e per modificare con $EDITOR
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.