Hoàn thành tab không hoạt động cho các lệnh


50

Tôi đang cố gắng sử dụng hoàn thành tab cho các lệnh trong Ubuntu 11.04 Beta 1, chạy tất cả các bản cập nhật mới nhất, nhưng dường như nó không hoạt động. (Mặc dù gói hoàn thành bash được cài đặt)

Hoàn thành tab chỉ hoạt động chính xác cho các thư mục hoặc tập tin.

Có ý tưởng nào để đào?


Tôi đã giải quyết vấn đề này bằng cách sử dụng giải pháp được đưa ra tại askubfox.com/questions/325807/ cấp
DB

Câu trả lời:


67

Kiểm tra xem bạn có đoạn sau trong .bashrc không (nên có ở đó theo mặc định)

# enable programmable completion features (you don't need to enable
# this, if it's already enabled in /etc/bash.bashrc and /etc/profile
# sources /etc/bash.bashrc).
if [ -f /etc/bash_completion ] && ! shopt -oq posix; then
    . /etc/bash_completion
fi

Cảm ơn! Tôi đã thay thế .bashrc bằng chính tôi và do đó không thể tìm ra vấn đề đang xảy ra. Hoạt động hoàn hảo ngay bây giờ.
Screatch

điều này cũng đã sửa lỗi tự động git bash của tôi tại xubfox 12.04, cảm ơn rất nhiều.
palmic

Làm thế nào về tự động hoàn thành cho chuyển đổi và tùy chọn của dòng lệnh apt-get? tức là khi bạn nhập apt-get in và sau đó nhấn tab để tự động hoàn thành nó.
Reza Ghodsi

3
Tôi muốn thêm rằng gói bash-completionlà cần thiết để làm việc này. Thật kỳ lạ, bản cài đặt tiêu chuẩn của công ty tôi không có gói này.
Edgar

13

Tôi nghĩ rằng tôi cũng sẽ thêm lời giải thích bổ sung sau đây cho sự thất bại của việc hoàn thành bash - quá dài cho một nhận xét và có thể hữu ích cho ai đó có vấn đề với việc hoàn thành bash, vì có lẽ đây là câu hỏi kinh điển 'chung' tất cả các bản sao được giới thiệu.

Ngay cả khi bạn có dòng thích hợp trong .bashrc(như trong câu trả lời ở trên) và bash-completiongói được cài đặt, việc hoàn thành bash vẫn có thể gặp trục trặc nếu bạn có shopt -s nullglobhoặc shopt -s failglobtrong .bashrchoặc .bash_aliases.

Các kịch bản sau đây đã được thử nghiệm với tất cả các tùy chỉnh của người dùng .bashrcvà được .bash_aliasesgỡ bỏ để đưa ra một thử nghiệm công bằng, với dòng hoàn thành bash thích hợp .bashrchiện tại và bash-completionđược cài đặt.

1) Kịch bản đầu tiên là khi bạn có shopt -s failglobtrong .bashrchoặc .bash_aliases.

Khi cố gắng hoàn thành các thư mục và tệp tương ứng, các lỗi này sẽ xảy ra:

cd Dbash: no match: "${COMP_WORDS[@]}"  
cat pabash: no match: words[0]=${!ref}${COMP_WORDS[i]}

Tuy nhiên, các lệnh vẫn sẽ hoàn thành thành công.

2) Khi shopt -s nullglobđược bật, cố gắng hoàn thành tab một thư mục hoặc tệp sẽ dẫn đến mọi thứ được liệt kê mà không hoàn thành:

cd Do
.adobe/                  .gimp-2.6/               Podcasts/
.aptitude/               .gnome2/                 Public/
.audacity-data/          .gnome2_private/         .pulse/
............

Tôi đã cắt ngắn danh sách ở đây, vì nó rất dài và không cần thiết phải sao chép tất cả.

Một lần nữa, hoàn thành lệnh sẽ vẫn hoạt động.

Vì vậy, chỉ cần loại bỏ shopt -s failglobhoặc shopt -s nullglobcũng có thể giải quyết vấn đề lỗi khi hoàn thành bash, giả sử rằng bạn có dòng thích hợp trong .bashrcbash-completionđược cài đặt.


1
Giải thích hay, nó đã giải quyết vấn đề của tôi khi tôi đang thử hoàn thành tab và xảy ra lỗi >> words [0] = $ {! Ref} $ {COMP_WORDS [i]}
bagustris

Mặc dù nó hoạt động như một cách giải quyết, nhưng thật khó cho bất kỳ lập trình viên hoàn thành nào. Vì nullglob (tốt hơn nhiều so với nhiều người) và có thể được đặt, nên bất kỳ mã hoàn thành nào yêu cầu ngữ nghĩa cũ (ký tự đại diện không có kết quả trùng khớp trong chính ký tự đại diện) sẽ lưu cài đặt toàn cầu hiện tại, đặt mã họ cần và khôi phục thiết lập toàn cầu cũ sau đó, giống như IFS thường được sử dụng.
Alex North-Keys

10

Ngoài sửa đổi /etc/bash.bashrctập tin (se câu trả lời khác), bạn có thể cần phải cài đặt bash-completiongói.

Kiểm tra, nếu /etc/bash_completiontập tin thoát. Nếu không:

sudo apt-get install bash-completion

(Trong phiên bản Debian 7 của tôi, nó không được cài đặt ban đầu)


7

Cơ bản như nó có vẻ chắc chắn rằng bash là vỏ hoạt động của bạn

echo $SHELL

Tôi mới nâng cấp lên Ubuntu 14.04.1 LTS và không có tab tự động hoàn thành, ngay cả sau khi làm theo lời khuyên trên bài đăng này, chỉ để nhận ra trình bao của tôi đã được đặt /bin/shvà không /bin/bash.


2

Cập nhật lên Ubuntu 14.04.01

Kiểm tra xem bạn có đoạn sau trong .bashrc không (nên có ở đó theo mặc định)

sudo vim /etc/bash.bashrc (gõ "i" để chỉnh sửa tệp)

    # enable bash completion in interactive shells
    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

7 dòng trên

Lưu tệp "esc + w + q + enter"

Khởi động lại bash

thực hiện bash


1
Điều này sẽ làm gì? Đây không phải là như thế này theo mặc định?
Tim

Giống như @Tim nói, cấu hình đó được cung cấp theo cấu hình mặc định.
ssoto

Điều này làm việc cho tôi
Thamaraiselvam

Câu trả lời này hoạt động như một lá bùa, và nó có phiếu bầu tiêu cực ???
greuze
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.