Bash tự động hoàn thành với lệnh vim


13

Trong bash, tự động hoàn thành các đường dẫn gần đây đã ngừng hoạt động khi ban hành vimcác lệnh trong đó đường dẫn sâu hơn hai thư mục (nó tiếp tục hoạt động như mong đợi với các lệnh khác, chẳng hạn như lscd).

Ví dụ: nếu tôi gõ ls .config/btsync/btvà sau đó nhấn TAB, nó sẽ mở rộng thành ls .config/btsync/btsync.conf.

Nếu tôi gõ vim .config/btvà sau đó nhấn TAB, nó sẽ mở rộng thành vim .config/btsync/.

Tuy nhiên, nếu tôi gõ vim .config/btsync/btvà sau đó nhấn TAB, sẽ không có gì xảy ra (tôi sẽ mong đợi nó sẽ mở rộng sang vim .config/btsync/btsync.conf, như trong lsví dụ ở trên.

Tôi gặp vấn đề tương tự khi chạy như người dùng của chính tôi và khi chạy như su.

Tôi đã đọc bài đăng này trong đó đề cập đến một vấn đề với các phiên bản cũ hơn của hoàn thành bash nhưng tôi đang chạy 2.1-5.

CẬP NHẬT: Sau một số thử nghiệm bổ sung, tôi thấy rằng vấn đề gốc là bash sẽ chỉ hoàn thành tên thư mục, không phải tên tệp.

CẬP NHẬT: Hóa ra đó bash-completionlà nguyên nhân tổng thể. Xem bình luận thứ hai của tôi về câu trả lời được chấp nhận.

Bất kỳ đề xuất nào về nguyên nhân tiềm năng của hành vi này sẽ được biết ơn!


Đăng của bạn .bashrc!
Gilles 'SO- ngừng trở nên xấu xa'

Liên kết đến .bashrcbài viết của tôi , như yêu cầu.
TheRogueWolf

Đã xóa các liên kết đến .bashrc, .aliases và .fifts vì không liên quan đến vấn đề hiện nay mà nguyên nhân đã được phát hiện.
TheRogueWolf

cùng một vấn đề trên Debian 9, một số cài đặt nhưng không phải tất cả: $
Philippe Gachoud

Câu trả lời:


10

Tôi đã thực hiện một số nghiên cứu thêm cho bạn và đây là những gì tôi tìm thấy - chìa khóa để tự động hoàn thành là bashlệnh complete. Bạn có thể in các quy tắc để vimsử dụng:

complete -p vim

Tương tự như vậy, bạn có thể loại bỏ các quy tắc cụ thể này với:

complete -r vim

Lệnh này đặt lại nó về mặc định - hoàn thành các đường dẫn và tên tệp thông thường mà không cần thêm logic. Đó có lẽ là những gì bạn muốn.

Để biết thêm thông tin, hãy kiểm tra help completehoặc man bashtìm phần về completelệnh (đó là một bash tích hợp, do đó nó được ghi lại trong trang bash).

Một điểm cuối cùng - những thay đổi ở trên chỉ ảnh hưởng đến bashphiên hiện tại , nếu bạn muốn xóa quy tắc vim sau mỗi lần đăng nhập, hãy đặt nó complete -r vimvào ~/.bashrc.

Mong rằng sẽ giúp :)


Điều đó đã làm nó. Rất rất cảm ơn. Các complete -p vimlệnh quay trở lại complete -F _filedir_xspec vimmà đã được gỡ bỏ bởi complete -r vimlệnh, giải quyết vấn đề. Tôi sẽ đọc một số completelệnh và thông tin được trả về bởi công tắc -p. Hơi bối rối tại sao hành vi này thay đổi vì vậy cũng sẽ điều tra điều đó.
TheRogueWolf

3
Dường như bash-hoàn thành là thủ phạm sau tất cả. Các _filedir_xspecchức năng /usr/share/bash-completion/bash_completionchỉ hoàn thành các thư mục. Tôi đã gỡ cài đặt bash-completion, xóa complete -r vimdòng khỏi tôi .bashrcvà khởi động lại và vimbây giờ hoạt động như mong đợi.
TheRogueWolf

3

Bash bằng cách mặc định tự động hoàn thành chỉ tên đường dẫn và tên tệp. Tuy nhiên, cơ chế có thể mở rộng và bash có thể được dạy để thực hiện tự động hoàn thành khác nhau cho các chương trình khác nhau. Ví dụ, gitnó có thể tự động hoàn thành các tên lệnh phụ (clone, commit) và sửa đổi thay vì chỉ tên đường dẫn. Đôi khi, nó rất tiện dụng, đôi khi khá khó chịu - ví dụ như khi gzip -dtừ chối tự động điền tên tệp không có .gzphần mở rộng.

Hoàn thành Bash thường được cấu hình trong /etc/bash_completion.d- bạn có thể sẽ tìm thấy một tệp được gọi vimtrong đó. Đó là tệp chứa các quy tắc tự động hoàn thành cho vimdòng lệnh.

Bây giờ bạn đã có hai tùy chọn:

  1. Hoặc sửa tệp thành đường dẫn tự động hoàn thành như người dùng có thể mong đợi.
  2. Xóa tệp để vô hiệu hóa các vimquy tắc đặc biệt và chỉ thực hiện tự động hoàn thành đường dẫn mặc định.

Và tất nhiên nộp một báo cáo lỗi phác thảo vấn đề để nó được sửa trong các phiên bản trong tương lai :)


Rất cám ơn về lời giải thích tuyệt vời :) Tôi đã xem qua /etc/bash_completion.dvà chỉ có một hgtệp hiện tại (cho Mercurial). Rất lạ.
TheRogueWolf

1
Sau đó, nó phải ở nơi khác. Hãy thử /usr/share/bash-completion/hoặc liệt kê tất cả các tệp từ vimgói hoặc từ bashhoặc bash-completiongói (không chắc nó được gọi như thế nào trên ArchLinux). Nó sẽ ở đó đâu đó.
MLu

1
Các tệp liệt kê từ bash-completiongói hiển thị /usr/share/bash-completion/completionskhông chứa các quy tắc cho nhiều chương trình, nhưng không vim. Các tệp liệt kê được cài đặt với vimgói không hiển thị bất kỳ tệp nào liên quan đến hoàn thành và tìm kiếm toàn bộ hệ thống bằng cách sử dụng find / -name vimcũng không hiển thị các tệp liên quan đến hoàn thành.
TheRogueWolf

2

Có lẽ bạn có thể cài đặt lại bash-hoàn thành: apt-get install --reinstall bash-completion

Và hãy xem tập tin /etc/bash.bashrc: nano /etc/bash.bashrc

Và xác minh rằng dòng sau đây không bị lỗi:

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

Sau đó, khởi động lại phiên cuối của bạn


Tôi đã thử gỡ bỏ bash-completion, kiểm tra vimhành vi và sau đó cài đặt lại bash-completionvà kiểm tra nhưng tôi vẫn gặp vấn đề tương tự trong cả hai trường hợp. Các dòng bạn đã liệt kê không có trong /etc/bash.bashrc. Tuy nhiên, dòng này là[ -r /usr/share/bash-completion/bash_completion ] && . /usr/share/bash-completion/bash_completion
TheRogueWolf
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.