Pracuję z dużą liczbą plików, które trzymam w katalogu. Za każdym razem Tab, gdy wchodzę do tego katalogu i przez przypadkowe dwukrotne naciśnięcie , wyświetlenie plików pasujących do wzorca trwa zbyt długo (może to potrwać ponad minutę), a ja jestem zirytowany tym zachowaniem.
Na przykład moja struktura katalogów to:
my-project/
├── docs/
├── data/ <---- contains around 200k files.
└── analyser/
Ponieważ nadal uwielbiam ukończenie, czy w ogóle można wyłączyć tę funkcję tylko w data/
katalogu? Jak ustawiony limit czasu na 5 sekund lub skrypt, który automatycznie wyłącza zakończenie, gdy znajduje się w określonym katalogu?
bash
autocomplete
neizod
źródło
źródło
Odpowiedzi:
To nie jest idealne, ale z drugiej strony ukończenie bashu jest dość trudne ...
Najprostszy sposób jest oparty na poleceniach, jest nieco bardziej elastyczny niż
FIGNORE
możesz:To instruuje autouzupełnianie, że uzupełnianie
vi
dotyczy plików i usuwania wzorców pasujących do-X
filtra. Minusem jest to, że wzorzec nie jest znormalizowany, więc../data
odmiany nie będą pasować.Kolejną najlepszą rzeczą może być
PROMPT_COMMAND
funkcja niestandardowa :To zakończenie wyłącza (całkowicie), gdy jesteś w katalogu, ale nie wyłącza go to dla każdej ścieżki tylko pliki znajdujące się w tym katalogu.
Bardziej ogólnie przydałoby się selektywne wyłączanie tego dla zdefiniowanych ścieżek, ale uważam, że jedynym sposobem jest użycie domyślnej funkcji uzupełniania (bash-4.1 i później z
complete -D
) i dużo bałaganu.To powinno pracować dla Ciebie, ale może mieć niezamierzone efekty uboczne (czyli zmiany w przewidywanym zakończeniu w niektórych przypadkach):
Działa to do zakończenia
vi
, w razie potrzeby można dodać inne polecenia. Powinno to zatrzymać uzupełnianie plików w nazwanych katalogach niezależnie od ścieżki lub katalogu roboczego.Uważam, że ogólne podejście
complete -D
polega na dynamicznym dodawaniu funkcji uzupełniania dla każdego polecenia, jakie napotka. Konieczne może być również dodaniecomplete -E
(uzupełnienie nazwy polecenia, gdy bufor wejściowy jest pusty).Aktualizacja Oto hybrydowa wersja
PROMPT_COMMAND
rozwiązań funkcji uzupełniania i jest nieco łatwiejsza do zrozumienia i zhakowania, jak sądzę:Ta funkcja pytania ustawia
nocomplete
zmienną po wejściu do jednego ze skonfigurowanych katalogów. Zmodyfikowane zachowanie uzupełniania włącza się tylko wtedy, gdy zmienna nie jest pusta i tylko wtedy, gdy próbujesz uzupełnić z pustego łańcucha, umożliwiając w ten sposób uzupełnienie częściowych nazw (usuń-z "$cur"
warunek, aby całkowicie nie dopełnić). Skomentuj dwieprintf
linie dla cichej pracy.Inne opcje obejmują
.noautocomplete
plik flag dla katalogu, który możnatouch
w razie potrzeby w katalogu; i zgadywanie rozmiaru katalogu za pomocą GNUstat
. Możesz użyć jednej lub wszystkich tych trzech opcji.(
stat
Metoda jest tylko zgadywaniem , zgłaszany rozmiar katalogu rośnie wraz z jego zawartością, jest to „wysoki znak wodny”, który zwykle nie zmniejsza się, gdy pliki są usuwane bez interwencji administracyjnej. Jest to tańsze niż określenie rzeczywistej zawartości potencjalnie dużej katalog. Precyzyjne zachowanie i przyrost na plik zależy od bazowego systemu plików. Uważam, że jest to wiarygodny wskaźnik przynajmniej w systemach Linux ext2 / 3/4).bash dodaje dodatkową spację nawet po zwróceniu pustego zakończenia (dzieje się tak tylko po zakończeniu na końcu linii). Możesz dodać
-o nospace
docomplete
polecenia, aby temu zapobiec.Pozostałym problemem jest to, że jeśli cofniesz kursor na początek tokena i klikniesz kartę, domyślne zakończenie zostanie ponownie uruchomione. Rozważ to jako funkcję ;-)
(Lub możesz przeskakiwać,
${COMP_LINE:$COMP_POINT-1:1}
jeśli lubisz nadmierną inżynierię, ale uważam, że sam bash nie ustawia niezawodnie zmiennych zakończenia podczas tworzenia kopii zapasowej i próby ukończenia w środku polecenia.)źródło
Jeśli twój
data
katalog zawiera pliki z określonym sufiksem, np..out
Możesz ustawić swojąbash
zmiennąFIGNORE
na".out"
i zostaną one zignorowane. Chociaż można również używać nazw katalogów, nie pomaga to w nazwach bieżących katalogów roboczych.Przykład:
Twórz tysiące plików testowych 100 KB na fizycznym hoście za pomocą dysków twardych RAID 1:
Ustaw
bash
zmienną:$ FIGNORE=".json"
Utwórz plik testowy:
$ touch test.out
Przetestuj przy 5000 plików:
Nie pojawia się opóźnienie między vi a singlem
tab
przedtemtest.out
.Przetestuj przy 50 000 plików:
Pojedyncza karta tworzy ułamek sekundy opóźnienia przed
test.out
pojawieniem się.Przetestuj przy 200 000 plików:
Pojawia się opóźnienie 1 sekundy między vi a singlem
tab
przedtest.out
.Bibliografia:
Wyciągnij rękę od faceta
źródło
$ vi <tab><tab>
, to i tak zajmuje dużo czasu. : \.json
plików i jeden plik tekstowy o nazwiefoo.txt
. włączamFIGNORE='.json'
, piszę$ vi <tab>
i wciąż muszę czekać pół minuty, żeby mnie dopełnić$ vi foo.txt
. --- prawdziwy scenariusz Nie będę edytować ani mieszać typów plików w tym katalogu, ale jeśli włączęFIGNORE
i (przypadkowo) naciśniesz kartę, moja klawiatura będzie zawieszona na długi czas bez cienia podobnegoDisplay all 188275 possibilities? (y or n)
, co mi mówi że mogę odzyskać klawiaturę.Zgadnij, czego chcesz (pożyczyłem trochę kodu od @ mr.spuratic)
Pamiętaj, że nie uniemożliwia to naciśnięcia klawisza TAB przy użyciu pełnej ścieżki (np
vim /directory/contains/lots/files<tab><tab>
źródło
pushd
/popd
. Ponieważ używa tylko zwykłej tablicy, a nie tablicy asocjacyjnej, będzie działać również w wersji bash 3.x.