โดยทางโปรแกรม / สคริปต์เปลี่ยนการตั้งค่า Open-With เป็นค่าเริ่มต้น


8

มีวิธีในการเปลี่ยนแอพที่เปิดชนิดไฟล์โดยทางโปรแกรม / ด้วยสคริปต์หรือไม่?

โดยทั่วไปบางครั้งฉันทำงานบนเว็บไซต์และฉันต้องการตั้งค่าไฟล์เว็บทั้งหมดให้เปิดด้วยโปรแกรมแก้ไขข้อความ (* .php, * .html, * .htm, ฯลฯ ... )

อย่างไรก็ตามในบางครั้งฉันต้องการเพียงแค่ดูไฟล์ดังนั้นฉันต้องการให้พวกเขาเปิดด้วยเบราว์เซอร์

ตอนนี้ฉันกำลังลากรายการลงบนไอคอน dock ซึ่งใช้งานได้ แต่ช้าโดยเฉพาะเมื่อฉันต้องผ่านไฟล์จำนวนมากด้วยคีย์บอร์ดเท่านั้น

โดยพื้นฐานแล้วสิ่งที่ฉันต้องการคือ applescript ขนาดเล็ก / สิ่งที่เปลี่ยนแปลงการตั้งค่าแบบเปิดทั้งหมด
ด้วยวิธีนี้ฉันสามารถมีหนึ่งสคริปต์สำหรับแต่ละโปรแกรมที่เปิดด้วยและเปลี่ยนไปมา

ขอบคุณ

คำตอบ:


10

สิ่งนี้ทำได้ แต่อาจไม่ตรงไปตรงมาอย่างที่คุณคิด คุณจะต้องทำความคุ้นเคยกับตัวระบุประเภทเครื่องแบบ ดูหน้าตัวระบุประเภทเครื่องแบบของวิกิพีเดีย

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

RCDefault scriptable หรือไม่ ฉันดูไซต์ของพวกเขาและมันก็ไม่เหมือน
ชื่อปลอม

ไม่เป็นไรฉันมีการประกาศประเภทสำหรับไฟล์ทุกประเภทที่ฉันสนใจ
Fake Name

เขียนบทความยอดเยี่ยม เท่าที่LSHandlerRoleViewerฉันสงสัยว่ามันอาจเกี่ยวข้องกับการเป็นค่าเริ่มต้นสำหรับการดูเมื่อเทียบกับการแก้ไข ( apple.stackexchange.com/a/49998/206073ทำให้ฉันอยู่ในบรรทัดเหล่านั้น) ผมไม่ทราบว่าสิ่งที่บริบทหนึ่งสามารถระบุได้ว่าใครจะเปิดดูหรือแก้ไขอย่างไร ... (ปิดหัวข้อCFBundleTypeRoleดูเหมือนว่ามันยอมรับค่าที่คล้ายกัน)
เบร็ท Zamir

นอกจากนี้ก็ดูเหมือนว่าcom.apple.LaunchServices/com.apple.launchservices.secureอาจจะเป็นโดเมนในระบบ MacOS ต่อมา ...
เบร็ท Zamir

2

ทางเลือกหนึ่งคือการแก้ไข~/Library/Preferences/.GlobalPreferences.plist:

defaults write com.apple.LaunchServices LSHandlers -array-add '{LSHandlerContentType=com.adobe.pdf;LSHandlerRoleAll=net.sourceforge.skim-app.skim;}'

คุณสามารถใช้ PlistBuddy เพื่อตรวจสอบว่ามีรายการอยู่แล้วแต่ฉันไม่พบวิธีที่จะใช้การเปลี่ยนแปลงใด ๆ โดยไม่ต้องรีสตาร์ทหรือสร้างฐานข้อมูล Launch Services ขึ้นใหม่

ใช้dutiคุณสามารถเรียกใช้duti ~/.dutiหลังจากบันทึกเป็น~/.duti:

net.sourceforge.skim-app.skim .pdf all

1

มันไม่ได้ตอบคำถามของคุณ แต่อาจเป็นทางออก

ตัวตรวจสอบในตัวค้นหานำเสนอข้อมูลสำหรับไฟล์ที่เลือกในปัจจุบันหรือไฟล์:

+ +I

ส่วนตัว Summaryหน้าต่าง Finder เป็นประโยชน์เมื่อหลายไฟล์จะถูกเลือก:

^+ +I

หากคุณเลือกหลายไฟล์ในประเภทเดียวกันวิธีใดวิธีหนึ่งข้างต้นจะช่วยให้คุณสลับคุณสมบัติOpen with:สำหรับไฟล์เหล่านั้นได้อย่างง่ายดาย


0

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

ตัวอย่างเช่นเปิดไฟล์ html ทั้งหมดในไดเรกทอรีปัจจุบัน

> open -a 'Google Chrome' *.html

เปิด index.html และไฟล์ควบคุม javascript ในตัวแก้ไขข้อความ Atom:

> open -a 'atom' index.html js/controllers/*.js

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

นี่คือตัวอย่าง Automator AppleScript ที่รับไฟล์เป็นอินพุตและเปิดไฟล์ที่เลือกใน Chrome:

on run {input, parameters}
set openFiles to "open -a 'Google Chrome' " --note the trailing space
set filePaths to {}

--covert the filePaths to posix style
repeat with i from 1 to count of input
    set aFile to input's item i as alias
    set aFile to quoted form of POSIX path of aFile
    set filePaths's end to aFile
end repeat

--convert filePaths list to a string delimited by spaces
set tid to text item delimiters
set text item delimiters to " "
set filePaths to filePaths as text
set text item delimiters to tid

--Open files via commandline
do shell script openFiles & filePaths
return input

สิ้นสุดวิ่ง

เห็นได้ชัดว่าคุณสามารถเปลี่ยนโปรแกรมแก้ไขข้อความชื่อ "Sublime" บันทึกเป็นบริการอื่นและกำหนดให้ทั้งสองปุ่มทางลัด

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