zstyle
có vẻ như nó chỉ là một nơi trung tâm để lưu trữ và truy xuất dữ liệu, giống như một export
tham số vỏ thay thế . Điều đó có đúng không, hay có nhiều hơn thế?
zstyle
có vẻ như nó chỉ là một nơi trung tâm để lưu trữ và truy xuất dữ liệu, giống như một export
tham số vỏ thay thế . Điều đó có đúng không, hay có nhiều hơn thế?
Câu trả lời:
zstyle
xử lý điều khiển kiểu rõ ràng cho hệ thống hoàn thành, nhưng nó dường như bao gồm nhiều hơn thế. Ví dụ, vcs_info
mô-đun dựa vào nó để hiển thị trạng thái git trong lời nhắc của bạn. Bạn có thể bắt đầu bằng cách xem một vài đoạn giải thích man zshmodules
trong zstyle
phần này.
Bạn có thể chỉ cần gọi nó để xem cài đặt nào có hiệu lực. Điều này có thể được hướng dẫn.
Các Zsh Sách có một chương điều trị tốt đẹp trên zstyle
, cũng có, giải thích một cách chi tiết các lĩnh vực khác nhau của nó.
Bạn có thể grep xung quanh trong .../Completion/
thư mục trên hệ thống của bạn để xem một số tệp đó sử dụng như thế nào zstyle
. Một vị trí phổ biến là gần /usr/share/zsh/functions/Completion/*
. Tôi thấy nó được sử dụng trong hơn 100 tệp trên hệ thống của tôi ở đó. Người dùng cũng thường zstyle
rắc xung quanh họ ~/.zshrc
. Dưới đây là một số cái đẹp để thêm một số màu sắc và mô tả để hoàn thành của bạn:
# Do menu-driven completion.
zstyle ':completion:*' menu select
# Color completion for some things.
# http://linuxshellaccount.blogspot.com/2008/12/color-completion-using-zsh-modules-on.html
zstyle ':completion:*' list-colors ${(s.:.)LS_COLORS}
# formatting and messages
# http://www.masterzen.fr/2009/04/19/in-love-with-zsh-part-one/
zstyle ':completion:*' verbose yes
zstyle ':completion:*:descriptions' format "$fg[yellow]%B--- %d%b"
zstyle ':completion:*:messages' format '%d'
zstyle ':completion:*:warnings' format "$fg[red]No matches for:$reset_color %d"
zstyle ':completion:*:corrections' format '%B%d (errors: %e)%b'
zstyle ':completion:*' group-name ''
# Completers for my own scripts
zstyle ':completion:*:*:sstrans*:*' file-patterns '*.(lst|clst)'
zstyle ':completion:*:*:ssnorm*:*' file-patterns '*.tsv'
# ...
Hệ thống hoàn thành làm cho hầu hết các trường rõ ràng nếu bạn chơi xung quanh nó. Hãy thử gõ zstyle :«tab»
và bạn thấy một số tùy chọn. Hoàn thành tab cho dấu hai chấm tiếp theo và bạn sẽ thấy bộ tùy chọn tiếp theo, v.v.
Để hiểu đúng cách zstyle
hoạt động, trước tiên bạn cần hiểu rằng zsh là một chương trình mô-đun. Từman zshmodules
Một số phần tùy chọn của zsh nằm trong các mô-đun, tách biệt với lõi của vỏ. Mỗi mô-đun này có thể được liên kết với vỏ trong thời gian xây dựng hoặc có thể được liên kết động trong khi vỏ đang chạy nếu cài đặt hỗ trợ tính năng này. [...]
Về vấn đề này, zsh giống như một trình thông dịch như PHP trong đó các lệnh dựng sẵn chính được xác định trong mô-đun "lõi", nhưng các lệnh dựng sẵn khác được chứa trong "mô-đun".
Ok tuyệt vời, vậy "zstyle" là gì?
zsh, giống như các shell khác có các lệnh dựng sẵn, chẳng hạn như source
, cd
hoặc declare
- zstyle
chỉ là một trong những "nội dung" khác.
nội dung và các tùy chọn shell thường là "toàn cầu" theo nghĩa là chúng thường (nhưng không phải luôn luôn) có thể áp dụng / sử dụng bất cứ lúc nào hoặc trong bối cảnh trong quá trình shell, hay nói cách khác, chúng thường áp dụng cho zsh và tất cả các hệ thống phụ (mô-đun). Lưu ý điều này áp dụng cho dù shell được gọi là trình thông dịch tương tác hay không tương tác.
Vì vậy, ví dụ, bạn có thể sử dụng tùy chọn dựng sẵn source
hoặc cd
tùy chọn shell "globalstar" sẽ hợp lệ cho dù tại dấu nhắc lệnh hoặc trong case
câu lệnh trong tập lệnh không tương tác hoặc trong một hàm trong cùng tập lệnh đó.
Trái ngược với một câu trả lời khác ở trên, zstyle
không phải là một nội dung cụ thể dành cho mô-đun "compsys" (hệ thống hoàn thành), zstyle
là một nội dung "toàn cầu".
zstyle
được định nghĩa bởi zsh/util
mô-đun, điều này đơn giản có nghĩa là mã xác định cách phân tích cú pháp và "do" zstyle
được xác định trong zsh/zutil
mô-đun.
Bạn cũng có thể quên đi sự thật này, tức là bash không yêu cầu bạn phải biết rằng mã cho eval
nội dung được chứa trong tệp eval.c
, nhưng để được trợ giúp zstyle
, điều đó giúp biết rằng đó zstyle
là một nội dung được xác định trong zsh/zutil
mô-đun và tài liệu cho zsh/zutil
mô-đun có thể được truy cập bằng cách chạy man zshmodules
.
Vì vậy, các tùy chọn shell truyền thống thường là "toàn cầu", nhưng theo mô tả từ man zshmodules
, Một số phần tùy chọn của zsh nằm trong các mô-đun , và cũng có rất nhiều zsh
chức năng đã được viết trong các hàm shell. (tương tự như rất nhiều chức năng cốt lõi và tùy chọn của vim đã được viết bằng vimscript).
Vì vậy, nếu bạn muốn có thể chỉ định các tùy chọn chỉ áp dụng cho các mô-đun hoặc chức năng này, bạn sẽ làm thế nào?
Vâng, đó là những gì zstyle
, cung cấp cho bạn khả năng "nhắm mục tiêu" các tùy chọn ở mức độ tốt hơn nhiều so với các tùy chọn vỏ "toàn cầu" truyền thống.
zstyle
đạt được điều này thông qua lập luận"pattern"
Một lệnh ví dụ cấu hình một số hành vi tùy chọn cụ thể cho "compsys":
zstyle ':completion::complete:lsof:*' menu yes select
và định cấu hình một số hành vi tùy chọn cụ thể cho "vcs_info":
zstyle ':vcs_info:*' actionformats \
'%F{5}(%f%s%F{5})%F{3}-%F{5}[%F{2}%b%F{3}|%F{1}%a%F{5}]%f '
Nhưng nó không dừng lại ở đó, zstyles
khả năng nhắm mục tiêu bối cảnh là vô cùng mạnh mẽ, ví dụ, giả sử bạn muốn xác định một số hành vi / tùy chọn cho vcs_info
tính năng, khi bạn là một .git
kho lưu trữ, trái với svn
repo, sau đó bạn có thể sửa đổi mô hình bối cảnh
:vcs_info:<svn_or_whatever_SCM_system>:* <style>
Điều gì về hành vi tùy chọn cho một dự án cụ thể, với một svn
repo? sau đó
:vcs_info:<svn_or_whatever_SCM_system>:*:repo-root-name <style>
Mô tả mơ hồ duy nhất có ý nghĩa mơ hồ về phong cách "(z) ngu ngốc được đặt tên một cách ngu ngốc" mà tôi đã tìm thấy - xuất phát từ thuật ngữ của Từ Bash đến The Z Shell
style
Trong đó
zsh
, cơ chế kiểu là một cách linh hoạt để cấu hình các tiện ích shell sử dụng các chức năng, chẳng hạn như hệ thống hoàn thành và các tiện ích soạn thảo. Không giống như các biến chúng có thể khác nhau trong các bối cảnh khác nhau và không giống như các tùy chọn shell, chúng có thể lấy các giá trị. Cơ chế dựa trên kiểu lệnh.
Ngoài ra, trong phần "Kiểu xử lý", tác giả xây dựng thêm ...
Với các hàm hoàn thành tinh vi hơn, bạn có thể muốn cho phép các khía cạnh của hành vi của chức năng được định cấu hình bằng cách sử dụng
style
.... Nhiều chức năng của trình trợ giúp tìm kiếm các kiểu cho bạn để chức năng của bạn sẽ phản ứng với nhiều kiểu mà không cần chức năng của bạn phải làm gì đặc biệt. Để có ý tưởng về các kiểu được tra cứu trong một tình huống cụ thể, hãy gọi hàm _complete_help bằng một đối số số. Thông thường, bạn có thể làm điều này bằng cách nhấn Esc2theo sau Ctrl
-
x h. Điều này chủ yếu hữu ích khi định cấu hình hoàn thành vì nó cho phép bạn xem những kiểu nào được tìm kiếm và bối cảnh liên quan.
Một trong những điều khó chịu nhất về ZSH là tìm ra nơi để tìm các lệnh khác nhau của nó trong các trang man. Trong trường hợp này, tài liệu cho zstyle có thể được tìm thấy trong man zshmodules
hoặc ở đây trực tuyến .
Lệnh dựng sẵn này được sử dụng để xác định và tra cứu các kiểu. Kiểu là cặp tên và giá trị, trong đó các giá trị bao gồm bất kỳ số chuỗi nào. Chúng được lưu trữ cùng với các mẫu và tra cứu được thực hiện bằng cách đưa ra một chuỗi, được gọi là "bối cảnh", được so sánh với các mẫu. Định nghĩa được lưu trữ cho mẫu phù hợp đầu tiên sẽ được trả về.
Thiếu rất nhiều ví dụ hay trong không gian zsh và tài liệu này rất khó hiểu. Tôi đã dành một chút thời gian để xem cách Prezto sử dụng zstyle, cũng như đọc các tài liệu và thử một số thứ. zstyle dường như chủ yếu được sử dụng để hoàn thành, nhưng thực sự tốt cho việc lưu trữ dữ liệu theo cách tinh vi hơn các biến môi trường cũ.
Ý chính này cho thấy cách bạn có thể sử dụng zstyle để lưu trữ và truy xuất thông tin:
# reference: http://zsh.sourceforge.net/Doc/Release/Zsh-Modules.html#The-zsh_002fzutil-Module
# list all zstyle settings
zstyle -L
# set a string value
zstyle :example:favorites fruit apple
# set an explicit string value
zstyle -s ':example:favorites' 'computer' 'apple'
# assign new $fav variable with -g
zstyle -g fav ':example:favorites' fruit && echo $fav
# be explicit about the assignment data type:
# -a: array, -b: boolean, -s: string
zstyle -b ':example:favorites:vegtable' 'broccoli' no
# test with -t
if zstyle -t ':example:favorites' 'fruit' 'apple'; then
echo "an apple a day keeps the dr. away"
fi
if ! zstyle -t ':example:favorites:vegtable' 'broccoli' 'no'; then
echo "Broccoli is the deadliest plant on Earth - why, it tries to warn you itself with its terrible taste"
fi
# delete a value with -d
zstyle -d ':example:favorites' 'computer'
# list only zstyle settings for a certain pattern
zstyle -L ':example:favorites*'