`Zstyle` làm gì?


23

zstylecó 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 exporttham số vỏ thay thế . Điều đó có đúng không, hay có nhiều hơn thế?


6
Nâng cao q vì hai lý do; a) Google vẫn gửi cho tôi ở đây; b) zstyle dường như có rất nhiều thứ cho nó mà dường như không liên quan gì đến "phong cách" hoặc tự động hoàn thành. Một trong những câu trả lời ở đây thậm chí còn nhận xét về cách tính năng này được đặt tên khủng khiếp.
zaTricky

Câu trả lời:


19

zstylexử 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_infomô-đ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 zshmodulestrong zstylephầ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 zstylerắ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.


2
Cảm ơn liên kết đến sách Zsh và mẹo về thư mục Hoàn thành. Hướng dẫn sử dụng Zsh nặng về chức năng và rất nhẹ về các trường hợp sử dụng và ví dụ
Shadowtalker

"... nặng về chức năng và rất nhẹ về các trường hợp sử dụng và ví dụ" - thật không may là trường hợp đối với hầu hết các tài liệu được viết bởi các lập trình viên.
aaaaaa

9

Để hiểu đúng cách zstylehoạ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, cdhoặc declare- zstylechỉ là một trong những "nội dung" khác.

Phạm vi của nội dung và tùy chọn shell

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 sourcehoặc cdtùy chọn shell "globalstar" sẽ hợp lệ cho dù tại dấu nhắc lệnh hoặc trong casecâ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, zstylekhông phải là một nội dung cụ thể dành cho mô-đun "compsys" (hệ thống hoàn thành), zstylelà một nội dung "toàn cầu".

zstyleđược định nghĩa bởi zsh/utilmô-đ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/zutilmô-đ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 evalnộ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 đó zstylelà một nội dung được xác định trong zsh/zutilmô-đun và tài liệu cho zsh/zutilmô-đun có thể được truy cập bằng cách chạy man zshmodules.

Cài đặt tùy chọn dành riêng cho mô-đun hoặc chức năng hệ vỏ

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 zshchứ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 ở đó, zstyleskhả 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_infotính năng, khi bạn là một .gitkho lưu trữ, trái với svnrepo, 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 svnrepo? sau đó

:vcs_info:<svn_or_whatever_SCM_system>:*:repo-root-name <style>

8

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.


2

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 zshmoduleshoặ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ề.


Đây là câu trả lời tốt nhất vì nó liên kết đến các tài liệu. Tôi cần điều đó để học cách đọc từ zstyle. Các câu trả lời khác chỉ có kiểu thiết lập địa chỉ.
cbarrick

1

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*'
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.