สิ่งนี้ทำได้ แต่อาจไม่ตรงไปตรงมาอย่างที่คุณคิด คุณจะต้องทำความคุ้นเคยกับตัวระบุประเภทเครื่องแบบ ดูหน้าตัวระบุประเภทเครื่องแบบของวิกิพีเดีย
OS X com.apple.LaunchServices.plist
เก็บข้อมูลเกี่ยวกับความสัมพันธ์ของแฟ้มที่ต้องการในไฟล์การตั้งค่าที่มีชื่อ ก่อนที่คุณจะลองค้นหาและแก้ไขไฟล์นั้นฉันขอแนะนำให้คุณทำความคุ้นเคยกับลำดับชั้นโดเมนของ OS X สำหรับค่าเริ่มต้น (aka "การตั้งค่า") บทความที่ดีเกี่ยวกับเรื่องนี้สามารถพบได้ที่นี่ (ข้อจำกัดความรับผิดชอบ: ดูเหมือนว่าพวกเขากำลังขายบางอย่างบนไซต์นั้นฉันไม่รู้ว่ามันคืออะไรและไม่มีความเกี่ยวข้องกับพวกเขาคำอธิบายนั้นดีมาก)
ตอนนี้คุณรู้ทุกอย่างเกี่ยวกับค่าเริ่มต้นและ UTIs แล้ว (ตอนนี้ไม่ใช่แบบทางการแพทย์) ตอนนี้เราสามารถพูดคุยเกี่ยวกับการตั้งค่าความสัมพันธ์ของไฟล์จากสคริปต์ / บรรทัดคำสั่ง
ก่อนอื่นคุณจะต้องรู้วิธีที่เหมาะสมในการระบุไฟล์ที่คุณต้องการสร้างการเชื่อมโยง
โปรดจำไว้ว่าฉันพูดว่า UTIs มีความสำคัญอย่างไร มีหลายวิธีในการระบุไฟล์ ขึ้นอยู่กับว่าประเภทได้รับการประกาศอย่างเป็นทางการในระบบของคุณหรือไม่ ตัวอย่างเช่นโปรแกรมแก้ไขข้อความที่ดีเช่น TextMate หรือ TextWrangler จะเพิ่มการประกาศประเภทจำนวนเล็กน้อยในลำดับชั้นของประเภทเมื่อคุณใช้สิ่งเหล่านี้ในระบบของคุณ อย่างไรก็ตามหากคุณไม่มีแอปพลิเคชันเหล่านั้นคุณอาจไม่ได้ประกาศประเภทเหล่านั้น
ตกลงพอพูด ตัวอย่าง:
รับ UTI สำหรับไฟล์:
$ mdls myFile.xml
...
kMDItemContentType = "public.xml"
kMDItemContentTypeTree = (
"public.xml",
"public.text",
"public.data",
"public.item",
"public.content"
)
...
โอเคดี. ประเภทเนื้อหาที่ชัดเจนที่เราสามารถใช้ได้ เขียนลงที่ใดที่หนึ่ง
$ mdls myFile.myExtn
...
kMDItemContentType = "dyn.ah62d4rv4ge8048pftb4g6"
kMDItemContentTypeTree = (
"public.data",
"public.item"
)
...
อุ่ย OS X ไม่รู้เกี่ยวกับไฟล์ ".myExtn" ดังนั้นมันสร้าง UTI แบบไดนามิกที่เราไม่สามารถใช้เพื่ออะไรได้ และประเภทผู้ปกครองนั้นกว้างเกินไปที่จะเป็นประโยชน์
ตอนนี้เรารู้แล้วว่าไฟล์ของเราคืออะไรให้ดูที่ไฟล์ LaunchServices.plist แล้วดูว่าเราสามารถทำอะไรได้บ้าง:
$defaults read com.apple.LaunchServices
{
...
LSHandlers = (
{
LSHandlerContentType = "public.html";
LSHandlerRoleAll = "com.apple.safari";
LSHandlerRoleViewer = "com.google.chrome";
},
...
{
LSHandlerContentTag = myExtn;
LSHandlerContentTagClass = "public.filename-extension";
LSHandlerRoleAll = "com.macromates.textmate";
},
...
);
...
}
ดังนั้นเมื่อคุณมีประเภทเนื้อหา "ดี" ที่จะใช้โครงสร้างแรกจะดีกว่า มิฉะนั้นโครงสร้างอื่น ๆ หมายเหตุมีโครงสร้างอื่น ๆ ในไฟล์นั้น แต่ไม่เกี่ยวข้องกับสิ่งที่คุณถาม เพิ่งรู้ว่าพวกเขาอยู่ที่นั่นเมื่อคุณดูผลลัพธ์
อย่างที่คุณเห็นคุณจะต้องค้นหา UTI สำหรับแอปพลิเคชันที่คุณต้องการใช้ UTIs สำหรับ Safar และ TextMate อยู่ในตัวอย่างด้านบนของฉัน แต่เพื่อค้นหา UTI โดยทั่วไปสำหรับแอปพลิเคชัน:
$ cd /Applications/MyApp.app/Contents
$ less Info.plist
...
<key>CFBundleIdentifier</key>
<string>com.apple.Safari</string>
...
หมายเหตุ: ฉันมีไม่มีความคิดสิ่งที่ถือว่าเป็นความแตกต่างระหว่าง LSHandlerRoleAll และ LSHandlerRoleViewer ฉันไม่สามารถหาเอกสารเกี่ยวกับที่ใดก็ได้ สิ่งที่ฉันทำเห็นว่า 99% ของเวลา LSHandlerRoleAll เป็นเพียงชุดเดียว (คือไม่มี LSHandlerRoleViewer ที่ทั้งหมด) และว่ามันถูกกำหนดให้เป็น UTI สำหรับโปรแกรมที่คุณต้องการที่จะเชื่อมโยงกับประเภท
เมื่อนำคุณมาไกลขนาดนี้ฉันจะออกจากวิธีการตั้งค่าที่คุณต้องการเป็นแบบฝึกหัดสำหรับผู้อ่าน การล้อเล่นกับสิ่งเหล่านี้อาจเป็นอันตรายได้ เป็นไปได้ทั้งหมดที่คุณจะไขไฟล์และไม่มีการเชื่อมโยงไฟล์ใด ๆ ทำงาน จากนั้นคุณต้องทิ้งไฟล์และเริ่มต้นใหม่
คำแนะนำบางอย่าง:
- อ่านบน
defaults write
และไวยากรณ์ของมัน
PlistBuddy
ลองดูที่ man PlistBuddy
และ/usr/libexec/PlistBuddy -h
- ข้ามเรื่องไร้สาระทั้งหมดนี้ไปพร้อมกันและใช้RCDefaultApp