`zstyle 'ทำอะไร


23

zstyleดูเหมือนว่ามันเป็นเพียงศูนย์กลางในการจัดเก็บและดึงข้อมูลเช่นทางเลือกในการexportเชลล์พารามิเตอร์ มันเป็นเรื่องจริงหรือมีมากกว่านั้น?


6
ลงคะแนนคิวด้วยเหตุผลสองประการ ก) Google ส่งฉันมาที่นี่แล้ว b) zstyle ดูเหมือนจะมีอะไรมากมายที่ทำให้มันดูเหมือนว่าจะไม่มีอะไรเกี่ยวข้องกับ "สไตล์" หรือการทำให้สมบูรณ์อัตโนมัติ หนึ่งในคำตอบที่นี่แม้แต่ความคิดเห็นเกี่ยวกับวิธีการตั้งชื่อคุณสมบัติชะมัด
zaTricky

คำตอบ:


19

zstyleจัดการกับการควบคุมสไตล์ที่ชัดเจนสำหรับระบบที่เสร็จสมบูรณ์ แต่ดูเหมือนจะครอบคลุมมากกว่านั้น เช่นvcs_infoโมดูลอาศัยเพื่อแสดงสถานะ git ในการแจ้งของคุณ คุณสามารถเริ่มต้นโดยดูที่วรรคอธิบายไม่กี่แห่งในman zshmodulesในzstyleส่วน

คุณสามารถเรียกใช้เพื่อดูการตั้งค่าที่มีผล นี้สามารถให้คำแนะนำ

zsh หนังสือมีการรักษาที่ดีบทzstyleยังอธิบายในรายละเอียดด้านต่างๆของ

คุณสามารถ grep ไปรอบ ๆ ใน.../Completion/ไดเรกทอรีบนระบบของคุณเพื่อดูว่าไฟล์เหล่านั้นมีประโยชน์zstyleอย่างไร /usr/share/zsh/functions/Completion/*สถานที่ที่พบบ่อยคือใกล้ ฉันเห็นมันใช้ในไฟล์มากกว่า 100 ไฟล์ในระบบของฉัน ผู้ใช้มักจะzstyleโรยรอบตัว~/.zshrcเองเช่นกัน ต่อไปนี้เป็นสิ่งที่ดีในการเพิ่มสีและคำอธิบายเพื่อเติมเต็มของคุณ:

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

ระบบเสร็จสมบูรณ์ทำให้ฟิลด์ส่วนใหญ่ชัดเจนถ้าคุณเล่นกับมัน ลองพิมพ์zstyle :«tab»แล้วคุณจะเห็นตัวเลือกบางอย่าง แท็บเติมให้กับโคลอนถัดไปและคุณจะเห็นตัวเลือกชุดถัดไปเป็นต้น


2
ขอบคุณสำหรับลิงก์ไปยังหนังสือ Zsh และเคล็ดลับเกี่ยวกับไดเรกทอรีเสร็จสมบูรณ์ คู่มือ Zsh นั้นหนักในฟังก์ชั่นการใช้งานและเบามากในกรณีและตัวอย่างการใช้งาน
shadowtalker

"... มีฟังก์ชั่นการใช้งานที่หนักหน่วงและมีตัวอย่างและการใช้งานที่เบา" - น่าเสียดายที่เนื้อหาส่วนใหญ่เขียนโดยโปรแกรมเมอร์
aaaaaa

9

เพื่อให้เข้าใจถึงวิธีการzstyleทำงานอย่างถูกต้องคุณต้องเข้าใจว่า zsh เป็นโปรแกรมแบบแยกส่วน จากman zshmodules

บางส่วนเป็นทางเลือกของ zsh อยู่ในโมดูลแยกออกจากแกนกลางของเปลือก แต่ละโมดูลเหล่านี้อาจเชื่อมโยงกับเชลล์ในเวลาที่สร้างหรือสามารถลิงก์แบบไดนามิกในขณะที่เชลล์กำลังทำงานหากการติดตั้งรองรับคุณสมบัตินี้ [ ... ]

ในเรื่องนี้ zsh เป็นเหมือนล่ามเช่น PHP ที่คำสั่ง builtin หลักถูกกำหนดไว้ในโมดูล "คอร์" แต่คำสั่ง builtin อื่น ๆ ที่มีอยู่ใน "โมดูล"
เยี่ยมมากแล้ว "zstyle" คืออะไร?
zsh เช่นเปลือกหอยอื่น ๆ ที่มีในตัวคำสั่งเช่นsource, cdหรือdeclare- zstyleเป็นเพียงหนึ่งในเหล่านี้ "builtins" อีก

ขอบเขตของ builtins และตัวเลือกเชลล์

builtins และตัวเลือกเชลล์มักจะ "ทั่วโลก" ในแง่ที่ว่าโดยทั่วไป (แต่ไม่เสมอไป) ใช้ได้ / ใช้งานได้ตลอดเวลาหรือบริบทตลอดกระบวนการเชลล์หรือในคำอื่น ๆ พวกเขามักใช้กับ zsh และระบบย่อยทั้งหมด (โมดูล) หมายเหตุสิ่งนี้ใช้ว่าเชลล์ถูกเรียกใช้ในฐานะล่ามแบบโต้ตอบหรือไม่โต้ตอบ
ตัวอย่างเช่นคุณสามารถใช้ builtin sourceหรือcdหรือตัวเลือกเชลล์ "globstar" จะถูกต้องไม่ว่าจะเป็นคำสั่งที่พร้อมรับคำสั่งหรือในcaseคำสั่งในสคริปต์ที่ไม่โต้ตอบหรือในฟังก์ชันในสคริปต์เดียวกันนั้น
ตรงกันข้ามกับคำตอบอื่น ๆ ข้างต้นzstyleไม่ใช่บิวอินที่เฉพาะเจาะจงกับโมดูล "compsys" (ระบบความสมบูรณ์) zstyleคือบิวอิน"ทั่วโลก"

zstyleถูกกำหนดโดยzsh/utilโมดูลนี่ก็หมายความว่ารหัสที่กำหนดวิธีการแยกวิเคราะห์และ "ทำ" zstyleถูกกำหนดในzsh/zutilโมดูล
คุณอาจลืมความจริงนี้ได้เช่น bash ไม่ต้องการให้คุณรู้ว่าโค้ดสำหรับevalbuiltin มีอยู่ในไฟล์eval.cแต่เพื่อขอความช่วยเหลือzstyleจะช่วยให้ทราบว่าzstyleเป็น builtin ที่กำหนดไว้ในzsh/zutilโมดูลและ เอกสารสำหรับโมดูลสามารถเข้าถึงได้โดยการทำงาน zsh/zutilman zshmodules

การตั้งค่าตัวเลือกที่เฉพาะเจาะจงกับโมดูลหรือฟังก์ชั่นเปลือก

ดังนั้นประเพณีตัวเลือกเปลือกได้รับโดยทั่วไป "ทั่วโลก" แต่เป็นคำอธิบายต่อจากman zshmodules, บางส่วนที่ไม่จำเป็นของ zsh อยู่ในโมดูลและยังมีจำนวนมากของzshการทำงานที่ได้รับการเขียนฟังก์ชั่นในเปลือก (คล้ายกับจำนวนแกนหลักและฟังก์ชันเสริมของ vim ที่ถูกเขียนด้วย vimscript)
ดังนั้นถ้าคุณต้องการระบุตัวเลือกที่ใช้กับโมดูลหรือฟังก์ชั่นเหล่านี้คุณจะทำอย่างไร
นั่นคือสิ่งที่zstyleทำให้คุณมีความสามารถในการ "กำหนดเป้าหมาย" ตัวเลือกในระดับที่ดีกว่าตัวเลือกเชลล์ "ทั่วโลก" แบบดั้งเดิม
zstyleประสบความสำเร็จในเรื่องนี้ผ่านการโต้แย้ง"pattern"

ตัวอย่างคำสั่งที่กำหนดค่าพฤติกรรมที่เป็นตัวเลือกบางอย่างที่เฉพาะเจาะจงกับ "compsys":

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

และการกำหนดค่าพฤติกรรมที่เป็นตัวเลือกบางอย่างสำหรับ "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 '

แต่มันไม่ได้หยุดเพียงแค่นั้นzstylesความสามารถในการกำหนดเป้าหมายบริบทมีประสิทธิภาพอย่างเหลือเชื่อตัวอย่างเช่นคุณต้องการกำหนดพฤติกรรม / ตัวเลือกบางอย่างสำหรับvcs_infoคุณสมบัติเมื่อคุณเป็น.gitพื้นที่เก็บข้อมูลเมื่อเทียบกับsvnrepo คุณสามารถแก้ไข รูปแบบบริบท

:vcs_info:<svn_or_whatever_SCM_system>:* <style>

สิ่งที่เกี่ยวกับพฤติกรรมที่ไม่จำเป็นสำหรับโครงการที่เฉพาะเจาะจงด้วยsvnrepo? แล้วก็

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

8

คำอธิบายที่มีความหมายอย่างชัดเจนเพียงอย่างเดียวของชื่อที่โง่เขลาและเอกสารที่ไม่ดี "(z)" ที่ฉันได้พบ - มาจากอภิธานศัพท์ของFrom Bash To The Z Shell

style

ในzshกลไกรูปแบบเป็นวิธีที่ยืดหยุ่นในการกำหนดค่าส่วนเสริมของเชลล์ที่ใช้ฟังก์ชั่นเช่นระบบเสร็จและวิดเจ็ตตัวแก้ไข แตกต่างจากตัวแปรพวกเขาสามารถแตกต่างกันในบริบทที่แตกต่างกันและแตกต่างจากตัวเลือกเชลล์พวกเขาสามารถใช้ค่า กลไกจะขึ้นอยู่กับรูปแบบคำสั่ง

นอกจากนี้ในส่วน "การจัดการรูปแบบ" ผู้แต่งยังอธิบายเพิ่มเติม ...

ด้วยฟังก์ชันการทำให้สมบูรณ์ที่ซับซ้อนมากขึ้นคุณอาจต้องการอนุญาตให้ใช้คุณลักษณะต่างๆของฟังก์ชันที่สามารถกำหนดค่าstyleได้

... ฟังก์ชั่นตัวช่วยมากมายค้นหาสไตล์ให้คุณดังนั้นฟังก์ชั่นของคุณจะตอบสนองต่อสไตล์ต่างๆโดยที่ฟังก์ชั่นของคุณไม่ต้องทำอะไรเป็นพิเศษ หากต้องการทราบแนวคิดของสไตล์ที่ค้นหาในบางสถานการณ์ให้เรียกใช้ฟังก์ชัน _complete_help ด้วยอาร์กิวเมนต์ตัวเลข ปกติคุณสามารถทำเช่นนี้ได้โดยการกดตามด้วยEsc2 Ctrl-x hสิ่งนี้มีประโยชน์หลักเมื่อกำหนดค่าการทำให้เสร็จสมบูรณ์เพราะช่วยให้คุณเห็นลักษณะที่ค้นหาและบริบทที่เกี่ยวข้อง


2

หนึ่งในสิ่งที่น่าหงุดหงิดที่สุดเกี่ยวกับ ZSH คือการหาว่าจะหาคำสั่งต่าง ๆ ได้ที่ไหนในหน้า man ในกรณีนี้เอกสารzstyleสามารถพบได้ในman zshmodulesหรือนี่ออนไลน์

คำสั่ง builtin นี้ใช้เพื่อกำหนดและค้นหาสไตล์ ลักษณะคือคู่ของชื่อและค่าที่ค่าประกอบด้วยสตริงจำนวนเท่าใดก็ได้ พวกเขาจะถูกเก็บไว้พร้อมกับรูปแบบและการค้นหาจะทำโดยให้สตริงที่เรียกว่า 'บริบท' ซึ่งเปรียบเทียบกับรูปแบบ คำจำกัดความที่เก็บไว้สำหรับรูปแบบการจับคู่แรกจะถูกส่งคืน


นี่คือคำตอบที่ดีที่สุดเพราะลิงก์ไปยังเอกสาร ฉันต้องการที่จะเรียนรู้วิธีการอ่านจาก zstyle คำตอบอื่น ๆ มีเพียงรูปแบบการตั้งค่าที่อยู่
cbarrick

1

มีการขาดตัวอย่างที่ดีในพื้นที่ zsh เป็นอย่างมากและเอกสารประกอบนั้นป้าน ฉันใช้เวลาดูว่าPreztoใช้ zstyle อย่างไรรวมถึงการอ่านเอกสารและลองทำบางสิ่ง zstyle ดูเหมือนจะใช้เป็นหลักในการทำให้สำเร็จ แต่จริงๆแล้วดีสำหรับการจัดเก็บข้อมูลในแบบที่ซับซ้อนกว่าตัวแปรสภาพแวดล้อมแบบเก่า

ส่วนสำคัญนี้แสดงวิธีที่คุณอาจใช้ zstyle ในการจัดเก็บและเรียกข้อมูล

# 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*'
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.