Apa yang dilakukan `zstyle`?

23

zstyleSepertinya itu hanya tempat sentral untuk menyimpan dan mengambil data, seperti alternatif untuk exportparameter shell. Apakah itu benar, atau ada yang lebih dari itu?

shadowtalker
sumber
6
Diperbaharui q karena dua alasan; a) Google tetap mengirim saya ke sini; b) zstyle tampaknya memiliki banyak hal untuk itu yang tampaknya tidak ada hubungannya dengan "gaya" atau pelengkapan otomatis. Salah satu jawaban di sini bahkan berkomentar tentang bagaimana fitur tersebut dinamai sangat.
zaTricky

Jawaban:

19

zstylemenangani kontrol gaya yang jelas untuk sistem penyelesaian, tetapi tampaknya mencakup lebih dari itu. Misalnya, vcs_infomodul bergantung padanya untuk menampilkan status git di prompt Anda. Anda dapat mulai dengan melihat beberapa paragraf penjelasan di man zshmodulesdalam zstylebagian ini.

Anda cukup memohonnya untuk melihat pengaturan apa yang sedang berlaku. Ini bisa menjadi pelajaran.

The Zsh Buku memiliki perawatan bab bagus di zstyle, juga, menjelaskan secara rinci berbagai bidang nya.

Anda dapat .../Completion/melihat-lihat di direktori pada sistem Anda untuk melihat bagaimana beberapa file tersebut digunakan zstyle. Lokasi umum dekat /usr/share/zsh/functions/Completion/*. Saya melihatnya digunakan dalam 100+ file di sistem saya di sana. Pengguna sering zstylemenaburkan di sekitar mereka ~/.zshrcjuga. Berikut adalah beberapa yang bagus untuk menambahkan beberapa warna dan deskripsi ke dalam penyelesaian Anda:

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

Sistem penyelesaian membuat sebagian besar bidang jelas jika Anda bermain dengannya. Coba ketikkan zstyle :«tab»dan Anda melihat beberapa opsi. Tab-lengkapi ke titik dua berikutnya dan Anda akan melihat set opsi berikutnya, dll.

Micah Elliott
sumber
2
Terima kasih atas tautan ke buku Zsh, dan tip tentang direktori Penyelesaian. Manual
Zsh
"... berat pada fungsionalitas dan sangat ringan pada kasus penggunaan dan contoh" - sayangnya kasus untuk sebagian besar materi yang ditulis oleh programmer.
aaaaaa
9

Untuk memahami cara zstylekerjanya, Anda harus terlebih dahulu memahami bahwa zsh adalah program modular. Dariman zshmodules

Beberapa bagian opsional zsh ada dalam modul, terpisah dari inti shell. Masing-masing modul ini dapat dihubungkan ke shell pada waktu build, atau dapat dihubungkan secara dinamis ketika shell sedang berjalan jika instalasi mendukung fitur ini. [...]

Dalam hal ini zsh lebih seperti seorang juru bahasa seperti PHP di mana perintah-perintah bawaan utama didefinisikan dalam modul "inti", tetapi perintah-perintah bawaan lainnya terkandung dalam "modul-modul".
Ok bagus, jadi apa itu "zstyle"?
zsh, seperti shell lain memiliki perintah builtin, seperti source, cdatau declare- zstylehanyalah salah satu dari "builtin" ini.

Lingkup opsi bawaan dan shell

opsi builtin dan shell biasanya "global" dalam arti bahwa mereka umumnya (tetapi tidak selalu) dapat digunakan / digunakan setiap saat atau konteks sepanjang proses shell, atau dengan kata lain, mereka umumnya berlaku untuk zsh dan semua sub-sistem (modul). Perhatikan ini berlaku apakah shell dipanggil sebagai interpreter interaktif atau non-interaktif.
Jadi, misalnya Anda dapat menggunakan opsi builtin sourceatau cdatau shell "globstar" akan valid baik pada prompt perintah atau dalam casepernyataan dalam skrip non-interaktif atau dalam fungsi dalam skrip yang sama.
Bertentangan dengan jawaban lain di atas, zstylebukan builtin yang khusus untuk modul "compsys" (sistem penyelesaian), zstyleadalah builtin "global".

zstyledidefinisikan oleh zsh/utilmodul, ini hanya berarti bahwa kode yang mendefinisikan cara mengurai, dan "lakukan" zstyledidefinisikan dalam zsh/zutilmodul.
Anda bisa saja melupakan fakta ini, yaitu bash tidak mengharuskan Anda untuk mengetahui bahwa kode untuk evalbuiltin terkandung dalam file eval.c, tetapi untuk mendapatkan bantuan zstyle, perlu diketahui bahwa itu zstyleadalah builtin yang ditentukan dalam zsh/zutilmodul, dan dokumentasi untuk zsh/zutilmodul dapat diakses dengan menjalankan man zshmodules.

Opsi pengaturan yang khusus untuk fungsi modul atau shell

Jadi secara tradisional opsi shell umumnya bersifat "global", tetapi sesuai deskripsi dari man zshmodules, Beberapa bagian opsional zsh ada dalam modul , dan juga, banyak zshfungsi yang ditulis dalam fungsi shell. (Mirip dengan bagaimana banyak fungsi inti dan opsional vim telah ditulis dalam vimscript).
Jadi jika Anda ingin dapat menentukan opsi yang hanya berlaku untuk modul atau fungsi ini, bagaimana Anda melakukannya?
Nah itulah yang zstyleterjadi, memberi Anda kemampuan untuk "menargetkan" opsi pada tingkat yang jauh lebih baik daripada opsi shell "global" tradisional.
zstylemencapai ini melalui argumen"pattern"

Contoh perintah yang mengonfigurasi beberapa perilaku opsional khusus untuk "compsys":

zstyle ':completion::complete:lsof:*' menu yes select

dan mengonfigurasi beberapa perilaku opsional khusus untuk "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 '

Tapi itu tidak berhenti di situ, zstyleskemampuan untuk menargetkan konteks sangat kuat, misalnya, katakan Anda ingin mendefinisikan beberapa perilaku / opsi untuk vcs_infofitur, ketika Anda adalah .gitrepositori, bukan svnrepo, maka Anda dapat memodifikasi pola konteks

:vcs_info:<svn_or_whatever_SCM_system>:* <style>

Bagaimana dengan perilaku opsional untuk proyek tertentu, dengan svnrepo? kemudian

:vcs_info:<svn_or_whatever_SCM_system>:*:repo-root-name <style>
the_velour_fog
sumber
8

Satu-satunya deskripsi yang samar-samar bermakna dari gaya "(z) yang disebutkan bodoh, dan tidak terdokumentasi" yang saya temukan - berasal dari glosarium From Bash To The Z Shell

style

Dalam zsh, mekanisme gaya adalah cara yang fleksibel untuk mengkonfigurasi add-on shell yang menggunakan fungsi, seperti sistem penyelesaian dan widget editor. Tidak seperti variabel, mereka dapat berbeda dalam konteks yang berbeda dan tidak seperti opsi shell, mereka dapat mengambil nilai. Mekanisme ini didasarkan pada gaya perintah.

juga, di bagian "Gaya Penanganan", penulis selanjutnya menguraikan ...

Dengan fungsi penyelesaian yang lebih canggih, Anda mungkin ingin memungkinkan aspek perilaku fungsi dapat dikonfigurasi menggunakan style.

... banyak fungsi pembantu mencari gaya untuk Anda sehingga fungsi Anda akan bereaksi terhadap banyak gaya tanpa fungsi Anda harus melakukan apa pun secara khusus. Untuk mendapatkan gambaran tentang gaya yang dicari dalam situasi tertentu, aktifkan fungsi _complete_help dengan argumen numerik. Biasanya, Anda bisa melakukan ini dengan menekan Esc2diikuti oleh Ctrl-x h. Ini terutama berguna ketika mengkonfigurasi penyelesaian karena memungkinkan Anda untuk melihat gaya apa yang dicari dan konteks terkait.

alex grey
sumber
2

Salah satu hal yang paling membuat frustrasi tentang ZSH adalah mencari tahu di mana menemukan berbagai perintahnya di halaman manual. Dalam hal ini, dokumentasi untuk zstyle dapat ditemukan di man zshmodulesatau di sini online .

Perintah bawaan ini digunakan untuk mendefinisikan dan mencari gaya. Gaya adalah pasangan nama dan nilai, di mana nilainya terdiri dari sejumlah string. Mereka disimpan bersama dengan pola dan pencarian dilakukan dengan memberikan string, yang disebut 'konteks', yang dibandingkan dengan pola. Definisi yang disimpan untuk pola pencocokan pertama akan dikembalikan.

Caleb
sumber
Ini adalah jawaban terbaik karena ini terhubung ke dokumen. Saya membutuhkannya untuk belajar membaca dari zstyle. Jawaban lainnya hanya membahas gaya pengaturan.
cbarrick
1

Ada sangat sedikit contoh yang baik di ruang zsh, dan dokumentasinya tumpul. Saya meluangkan waktu untuk melihat bagaimana Prezto menggunakan zstyle, serta membaca dokumen dan mencoba beberapa hal. zstyle tampaknya terutama digunakan dalam penyelesaian, tetapi sebenarnya sangat bagus untuk menyimpan data dengan cara yang lebih canggih daripada variabel lingkungan biasa.

Intisari ini menunjukkan bagaimana Anda dapat menggunakan zstyle untuk menyimpan dan mengambil informasi:

# 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*'
mattmc3
sumber