Xây dựng lại chỉ mục tự động hoàn thành (hoặc bất cứ thứ gì nó được gọi) và các tệp nhị phân trong bộ đệm $ PATH trong zsh


75

Sau khi cài đặt phần mềm mới, thiết bị đầu cuối đã được mở với zsh sẽ không biết về các lệnh mới và không thể tạo tự động hoàn tất cho các lệnh đó. Rõ ràng việc mở một thiết bị đầu cuối mới khắc phục vấn đề, nhưng chỉ mục (hoặc bất cứ điều gì bạn gọi nó) có thể được xây dựng lại để tự động hoàn thành sẽ hoạt động trên thiết bị đầu cuối cũ không?

Tôi đã cố gắng compinitnhưng điều đó không giúp được gì. Ngoài ra, có cách nào không phụ thuộc vào vỏ? Thật tuyệt khi có một cách để xác minh câu trả lời là tốt (ngoại trừ việc gỡ cài đặt một cái gì đó và cài đặt lại nó).

Ý tôi là sau khi gõ một vài ký tự của tên lệnh, tôi có thể nhấn Tabzshnên làm phần còn lại để lấy tên đầy đủ.


1
Có hai loại hoàn thành tự động mà bạn có thể có nghĩa là khi bạn nói rằng một shell hiện tại có thể tạo ra tự động hoàn thành cho [các lệnh mới] Lệnh: Hoàn thành lệnh của Lệnh EDTryrying để lấy vỏ để gợi ý tên lệnh mới khi hoàn thành ở vị trí lệnh và hoàn thành đối số trong bộ phận thống kê, sắp xếp để lấy shell để đề xuất các tùy chọn / đối số cho lệnh mới khi bạn đã gõ tên của nó. Đó là cho bạn vấn đề?
Chris Johnsen

1
Câu hỏi hay! Tôi luôn luôn cho rằng nó không thể được thực hiện, tôi không nghĩ sẽ kiểm tra
Michael Mrozek

1
offtopic - mọi người rất hay thay đổi 4 người được yêu thích nhưng chỉ có 2 upvote ... Tôi thấy thật kỳ lạ khi có rất ít người upvote mọi thứ.
xenoterracide

@Chris Ý tôi là sau khi nhập một vài ký tự của tên lệnh và nhấn tab, zsh sẽ làm phần còn lại và kéo lên tên đầy đủ.
phunehehe

@xeno Tôi cũng nhận thấy điều đó; Thật là bất thường khi yêu thích một cái gì đó nhưng không ủng hộ nó
Michael Mrozek

Câu trả lời:


76

Để xây dựng lại bộ đệm của các lệnh thực thi, sử dụng rehashhoặc hash -rf.

Hãy chắc chắn rằng bạn chưa hủy hash_list_alltùy chọn (nó gây ra ít truy cập đĩa hơn nhưng làm cho việc cập nhật bộ đệm ít thường xuyên hơn).

Nếu bạn không muốn phải nhập lệnh, bạn có thể yêu cầu zsh không tin vào bộ đệm của nó khi hoàn thành bằng cách đặt dòng sau vào ~/.zshrc¹:

zstyle ":completion:*:commands" rehash 1

Có một chi phí hiệu suất, nhưng nó không đáng kể trên một thiết lập máy tính để bàn điển hình hiện nay. (Không phải là nếu bạn có $PATHtrên NFS hoặc hệ thống bị thiếu RAM.)

Các zstylelệnh riêng của mình được diễn tả trong zshmoduletrang người đàn ông. Các giá trị kiểu được ghi lại trong các trang zshcompsyszshcompwidman hoặc bạn có thể đọc nguồn (ở đây, của _command_nameshàm). Nếu bạn muốn một số tài liệu có thể đọc được nếu bạn tìm thấy một số, hãy cho tôi biết!

¹ đòi hỏi zsh≥4.3.3, nhờ Chris Johnsen


3
Việc khởi động lại câu thần chú sẽ cho phép hoàn thành tên lệnh của các lệnh mới của Wap trong các shell đã được băm đầy đủ trước đó. Đặt PATH (hoặc đường dẫn) cũng sẽ gây ra sự khởi động lại; do đó PATH="$PATH"cũng sẽ làm công việc. HASH_LIST_ALLđược hiển thị như một mặc định trong tài liệu của tôi.
Chris Johnsen

Đó là câu trả lời cho tôi.
BaiJiFeiLong

13

Nếu bạn đang gặp vấn đề khi hoàn thành đối số trong bộ điều khiển, thì làm việc với các lệnh mới thì compinit có thể là lệnh bạn cần, tuy nhiên nó có một cơ chế lưu trữ có thể gây ra sự cố cho bạn.

Tài liệu cho phiên bản của tôi (4.3.10) nói rằng compinit sử dụng tệp kết xuất bộ nhớ cache được lưu trong bộ nhớ cache .zcompdump, để lưu trữ các hàm hoàn thành được biên dịch để tăng tốc các yêu cầu tiếp theo. Nó chỉ làm mất hiệu lực tệp kết xuất khi thông báo thay đổi số lượng tệp hoàn thành ( fpathtệp phần tử bắt đầu bằng #compdef …hoặc #autoload …). Có lẽ việc cài đặt phần mềm mới sẽ thay đổi số lượng tệp hoàn thành như vậy (giả sử rằng nó cũng đã cài đặt các tệp tự động hoàn thành zsh của nó ở đúng nơi), vì vậy tôi mong đợi một compinitcông việc đơn giản sẽ hoạt động. Nếu bạn đang ở trong một tình huống không hoạt động, bạn có thể cần phải bỏ qua hoặc vô hiệu hóa thủ công tệp kết xuất.

Để bỏ qua việc sử dụng tệp kết xuất, sử dụng compinit -D; Điều này sẽ chỉ ảnh hưởng đến vỏ hiện tại.

Để xây dựng lại tệp kết xuất, hãy xóa nó và chạy lại compinit:

rm -i ${ZDOTDIR:-${HOME:?No ZDOTDIR or HOME}}/.zcompdump &&
compinit

Điều này sẽ ảnh hưởng đến lớp vỏ hiện tại, lớp vỏ hiện có chạy trơn tru compinitvà bất kỳ lớp vỏ nào trong tương lai.


Một số khung zsh như zimcho phép sử dụng tệp kết xuất trên mỗi máy chủ. Trong trường hợp đó, cũng loại bỏ $zcompdump_filecùng với .zcompdump.
sebastian
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.