Buộc Bash hoàn thành tab bình thường nếu hoàn thành thông minh thất bại


10

Kể từ khi hoàn thành tab đã trở thành một tính năng tiêu chuẩn trong shell, tôi đã rất hài lòng với nó. Tôi thậm chí thích hoàn thành thông minh của Bash (nơi nó chỉ tìm kiếm các tệp PDF, nếu tôi gõ evince foo <TAB>) - miễn là nó đoán chính xác.

Nó phá hỏng một ngày hạnh phúc khác khi Bash sử dụng sự hoàn thành thông minh của mình để từ chối hoàn thành.

Hôm nay tôi muốn:

tar xvf centos5.8_x86_1.ova

Vì vậy, tôi đã nhập:

tar xvf cent<TAB>

và Bash từ chối hoàn thành đường dẫn vì các tệp .ova không phải là thứ bạn thường sử dụng với tar.

Tôi biết tôi có thể gỡ cài đặt gói bash-hoàn thành để loại bỏ hoàn thành thông minh. Nhưng tôi có thể có bánh của tôi và ăn nó không?

Tôi có thể yêu cầu bash sử dụng hoàn thành thông minh trước không, và nếu thất bại, sau đó sử dụng hoàn thành không thông minh?


1
<spam> Zsh có thể làm điều đó. </ spam>
Gilles 'SO- ngừng trở nên xấu xa'

Câu trả lời:


9

Sau đây sẽ bật hoàn thành bash bình thường sau khi tất cả các lần hoàn thành 'thông minh' đã thất bại đối với các chương trình tar, vim và emacs:

compopt -o bashdefault tar vim emacs

xem thêm trang có liên quan trong hướng dẫn bash trực tuyến.

Hãy cẩn thận: bạn có được hành vi bình thường cho loại hoàn thành (lệnh / tên tệp / tên người dùng, v.v.) được xác định bởi hoàn thành thông minh cho lệnh trong tay, ví dụ, việc hoàn thành servicesẽ không hoàn thành tên tệp ngay cả khi bạn gọi complete -o bashdefault service.

Trong này và các trường hợp khác, nơi các autocompletion minh thất bại, bạn luôn có thể bấm Alt-/(hoặc M-/trong ký hiệu hướng dẫn của bash) để hoàn thành tên tập tin gần như trong cùng một cách mà TAB hoạt động nếu hoàn thành thông minh bị vô hiệu hóa (gần như cùng một cách theo nghĩa là M-/không làm hoàn thành các mẫu như *.txt). Xem ở đây để biết các chuỗi chính cho các loại hoàn thành khác như lệnh và tên người dùng.


2
Cảm ơn Alt- / đề cập, tôi không có ý tưởng nào ở đó
Michael Speer

1

bash xong là một phần mở rộng của hoàn thành tiêu chuẩn của bash và bản thân nó là một chương trình bash. Vì vậy, nếu bạn muốn thay đổi cách chương trình hoạt động, chỉ cần thay đổi nó. Đây là phần mềm miễn phí, bạn có thể tự do làm điều đó. Đối với trường hợp cụ thể của tarlệnh, tệp là /usr/share/bash-completion/completions/tar. Để tartự động hoàn tất một tệp có phần mở rộng ova, chỉ cần thêm nó vào dòng

local tars='@(@(tar|gem|spkg)?(.@(Z|[gx]z|bz?(2)|lzma))|t@([glx]z|bz?(2)))'

vì vậy nó nói

local tars='@(@(tar|gem|spkg|ova)?(.@(Z|[gx]z|bz?(2)|lzma))|t@([glx]z|bz?(2)))'

Lưu ý rằng đây là đường dẫn và mã hiện có cho Debian Wheezy (phiên bản ổn định hiện tại). Một bản phân phối hoặc phiên bản khác nhau có thể có một mã khác nhau nhưng ý tưởng là như nhau. Mở mã và điều chỉnh nó để làm những gì bạn muốn nó làm.

Chỉnh sửa: Tôi chỉ nhận thấy rằng câu hỏi là về mỗi lần nó không tìm thấy kết quả khớp và không chỉ trường hợp cụ thể thêm ovavào tar. Có lẽ nó vẫn có thể hữu ích cho ai đó, để biết nơi họ có thể tìm kiếm nguồn.


4
Sửa đổi các tệp trong / usr do người quản lý gói sở hữu là một cách tốt để gây ra một cú sốc khó chịu khi nâng cấp. Tốt hơn: ghi đè lên cấu hình đóng gói.
Chris Down

1
@ChrisDown và bạn sẽ làm điều đó như thế nào? Tôi vẫn đang tìm kiếm giải pháp .bashrc sạch.
Clayton Stanley
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.