Completamento automatico Bash con comando vim


13

In bash, il completamento automatico dei percorsi ha recentemente smesso di funzionare durante l'emissione di vimcomandi in cui il percorso è più profondo di due directory (continua a funzionare come previsto con altri comandi, come lse cd).

Ad esempio, se digito ls .config/btsync/bte quindi premo TAB, si espande in ls .config/btsync/btsync.conf.

Se digito vim .config/bte quindi premo TAB, si espande in vim .config/btsync/.

Tuttavia, se scrivo vim .config/btsync/bte quindi premo TAB, non accade nulla (mi aspetto che si espanda a vim .config/btsync/btsync.conf, come lsnell'esempio sopra.

Ottengo lo stesso problema quando eseguo il mio utente e quando eseguo come su.

Ho letto questo post che menzionava un problema con le versioni precedenti di bash-completamento ma sto eseguendo 2.1-5.

AGGIORNAMENTO: Dopo alcuni test aggiuntivi, ho scoperto che il problema principale è che bash completerà solo i nomi delle directory, non i nomi dei file.

AGGIORNAMENTO: Si è scoperto che bash-completionera la causa generale. Vedi il mio secondo commento sulla risposta accettata.

Eventuali suggerimenti sulla potenziale causa di questo comportamento saranno ricevuti con gratitudine!


Pubblica il tuo .bashrc!
Gilles 'SO- smetti di essere malvagio' il

Link al mio .bashrcpostato, come richiesto.
TheRogueWolf

Rimossi i collegamenti a .bashrc, .aliases e .functions come non pertinenti al problema ora che la causa è stata scoperta.
TheRogueWolf,

stesso problema su Debian 9, alcune installazioni ma non tutte: $
Philippe Gachoud,

Risposte:


10

Ho fatto qualche ricerca in più per te ed ecco quello che ho trovato: la chiave per il completamento automatico è il bashcomando complete. È possibile stampare le regole per l' vimutilizzo di:

complete -p vim

Allo stesso modo è possibile rimuovere queste regole specifiche con:

complete -r vim

Questo comando ripristina i valori predefiniti: i soliti percorsi e il completamento dei nomi dei file senza alcuna logica aggiuntiva. Questo è probabilmente quello che vuoi.

Per maggiori informazioni, controlla help completeo man bashcerca la sezione relativa al completecomando (è un built-in bash, quindi è documentato nella manpage bash).

Un ultimo punto: le modifiche di cui sopra hanno effetto solo sulla bashsessione corrente , se si desidera rimuovere le regole di vim dopo ogni accesso messo complete -r vimal proprio ~/.bashrc.

Spero possa aiutare :)


Quello l'ha fatto. Molte molte grazie. È stato complete -p vimrestituito il comando complete -F _filedir_xspec vimche è stato rimosso dal complete -r vimcomando, risolvendo il problema. Leggerò il completecomando e le informazioni restituite dall'opzione -p. Leggermente perplesso il motivo per cui questo comportamento è cambiato, quindi indagherò anche quello.
TheRogueWolf,

3
Dopo tutto, sembra che il colpevole sia stato il colpevole. La _filedir_xspecfunzione /usr/share/bash-completion/bash_completioncompleta solo le directory. Ho disinstallato bash-completion, rimosso la complete -r vimlinea dal mio .bashrce riavviato e vimora si comporta come previsto.
TheRogueWolf,

3

Bash di default completa automaticamente solo i nomi di percorso e file. Tuttavia, il meccanismo è estensibile e si può insegnare a bash a eseguire diversi completamenti automatici per programmi diversi. Ad esempio pergit , può completare automaticamente i nomi dei comandi secondari (clone, commit) e le revisioni anziché solo i nomi dei percorsi. A volte è utile, a volte abbastanza fastidioso, ad esempio quando si gzip -drifiuta di completare automaticamente i nomi di file che non hanno l' .gzestensione.

Il completamento di Bash è generalmente configurato in /etc/bash_completion.d - probabilmente troverai un file chiamato vimlì. Questo è il file che contiene le regole di completamento automatico per la vimriga di comando.

Ora hai due opzioni:

  1. Correggi il file in modo da completare automaticamente i percorsi come probabilmente gli utenti si aspettano comunque.
  2. Rimuovere il file per disabilitare le vimregole speciali ed eseguire solo il completamento automatico del percorso predefinito.

E ovviamente presentare una segnalazione di bug che delinei il problema in modo che venga risolto nelle versioni future :)


Mille grazie per l'ottima spiegazione :) Ho dato un'occhiata /etc/bash_completion.de c'è solo un hgfile presente (per Mercurial). Molto strano.
TheRogueWolf il

1
Quindi deve essere altrove. Prova /usr/share/bash-completion/o elenca tutti i file dal vimpacchetto o da basho bash-completionpacchetti (non sei sicuro di come venga chiamato su ArchLinux). Sarà lì da qualche parte.
MLu,

1
Elencare i file dagli bash-completionspettacoli dei pacchetti /usr/share/bash-completion/completionscontiene regole per molti programmi, ma non vim. La lista dei file installati con il vimpacchetto non mostra alcun file relativo al completamento e la ricerca in tutto il sistema utilizzando find / -name vimnon mostra alcun file relativo al completamento.
TheRogueWolf il

2

Forse potresti reinstallare bash-completamento: apt-get install --reinstall bash-completion

E dai un'occhiata al file /etc/bash.bashrc: nano /etc/bash.bashrc

E verifica che la seguente riga sia senza commenti:

if ! shopt -oq posix; then
if [ -f /usr/share/bash-completion/bash_completion ]; then
. /usr/share/bash-completion/bash_completion
elif [ -f /etc/bash_completion ]; then
. /etc/bash_completion
fi
fi

Quindi, riavvia la sessione del terminale


Ho provato a rimuovere bash-completion, testare il vimcomportamento, quindi reinstallare bash-completione testare ma ho ancora riscontrato lo stesso problema in entrambe le circostanze. Le linee che hai elencato non sono presenti /etc/bash.bashrc. Questa linea è, tuttavia[ -r /usr/share/bash-completion/bash_completion ] && . /usr/share/bash-completion/bash_completion
TheRogueWolf il
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.