Zsh tự động hoàn thành đề xuất các chức năng hoàn chỉnh (_git _vim, v.v.)


9

Tôi có một phiền toái nhỏ với cách zshthực hiện các đề xuất hoàn chỉnh cho các lệnh của tôi.

Nếu tôi gõ phần đầu của lệnh mà tôi chưa cài đặt và nhấn tabnó sẽ gợi ý chức năng hoàn thành đã được cài đặt.

Hãy nói rằng tôi muốn thực thi vimnhưng nó không được cài đặt _vim.

Có cách nào để tắt thứ này không? Hoặc tôi đã làm điều gì sai trong thiết lập của tôi?

Tất cả các dotfiles của tôi là công khai tại github.com/henrikbjorn/castle.


Tôi đã thấy hành vi này trước đây, nhưng trong thiết lập hiện tại của tôi dường như không có mặt. Đáng buồn thay, tôi không có manh mối, cài đặt nào của tôi đã thay đổi hành vi đó.
Tùy biến

Câu trả lời:


8

Theo mặc định, công cụ hoàn thành của zsh chỉ cố gắng thêm một cái gì đó vào những gì bạn nhập. Bạn đã cấu hình nó để thử thêm tiền tố. Công cụ cấu hình hoàn thành tương tác đơn giản ( compinstall) cung cấp điều này trong điều khiển kết hợp của → → hoàn thành chuỗi con. Điều này chèn một dòng như thế này trong của bạn .zshrc:

zstyle ':completion:*' matcher-list '' 'l:|=* r:|=*'

Các zstylecài đặt hoàn thành (chủ yếu) cài đặt hoàn thành. Các matcher-listphong cách hoàn thành là một danh sách các cách thử liên tiếp, dừng lại khi có ít nhất một trận đấu. Chuỗi rỗng có nghĩa là hoàn thành mặc định (chỉ có hậu tố). Câu thần chú điều khiển phù hợpl:|=* r:|=* có nghĩa là thử kết hợp tiền tố *và kết hợp hậu tố *, tức là bất kỳ tiền tố và hậu tố.

Bạn có thể cấm các tiền tố bắt đầu bằng _hoàn toàn. Điều này vẫn cho phép hoàn thành các từ bắt đầu _và hoàn thành bằng cách thêm tiền tố, nhưng tiền tố có thể không bắt đầu bằng _.

zstyle ':completion:*' matcher-list '' 'l:|=[^_]* r:|=*'

Điều này áp dụng cho tất cả các lần hoàn thành, không chỉ hoàn thành tên lệnh. Tôi không biết làm thế nào để hạn chế điều này với tên lệnh.

Cần có một cách để loại trừ chính xác hơn các tên lệnh bắt đầu _, nhưng tôi không biết làm thế nào. Một khởi đầu đầu tiên là với ignored-patternsphong cách hoàn thành.

zstyle ':completion:*:*:-command-:*:*' ignored-patterns '_*'       

Điều này không bao gồm các trận đấu bắt đầu bằng _; tuy nhiên, nếu không có kết quả khớp, thì zsh sẽ thử lại mà không bỏ qua các quy tắc. Điểm hay của việc này là nếu lệnh bắt đầu bằng dấu gạch dưới ở vị trí đầu tiên, nó sẽ được hoàn thành trong lần chuyển thứ hai này. Phần xấu là zsh do đó sẽ cố gắng thêm một dấu gạch dưới anyway nếu không có trận đấu, vì vậy nếu bạn có viviewnhưng không phải vimsau đó nhấn Tabsau visẽ cung cấp viviewnhưng không _vim, nhưng nếu bạn gõ vimsau đó hoàn thành sẽ cung cấp _vim.


Cảm ơn dường như làm việc bằng cách thực hiện một trong những giải pháp bạn đã chỉ định, tôi cũng đã học được một loạt về cách thức hoạt động.
Henrik Bjørnskov

2
Giải pháp với ignore-patternscông việc chỉ tốt cho tôi, ngay cả khi không có trận đấu. Chỉ cần đảm bảo rằng completernó không chứa _ignored.
Adaephon
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.