Lập trình / Script-atally thay đổi cài đặt Open-With mặc định


8

Có cách nào để thay đổi ứng dụng mở loại tệp theo chương trình / với tập lệnh không?

Về cơ bản, đôi khi tôi đang làm việc trên một trang web và tôi muốn đặt tất cả các tệp web để mở bằng trình chỉnh sửa văn bản (* .php, * .html, * .htm, v.v ...).

Tuy nhiên, những lần khác, tôi chỉ muốn xem các tập tin, vì vậy tôi muốn chúng mở bằng trình duyệt.

Ngay bây giờ, tôi đang kéo các mục vào biểu tượng dock, hoạt động nhưng chậm, đặc biệt là khi tôi chỉ trải qua một số lượng lớn tệp bằng bàn phím.

Về cơ bản, những gì tôi muốn là một applescript nhỏ / bất cứ điều gì thay đổi tất cả các cài đặt mở.
Bằng cách đó, tôi có thể có một tập lệnh cho mỗi chương trình mở và thay đổi qua lại.

Cảm ơn.

Câu trả lời:


10

Điều này là có thể làm được, nhưng có lẽ không đơn giản như bạn nghĩ. Bạn sẽ cần phải làm quen với Định danh loại thống nhất. Nhìn vào trang Định danh loại thống nhất của Wikipedia .

OS X lưu trữ thông tin về các liên kết tệp ưa thích trong một tệp ưu tiên có tên com.apple.LaunchServices.plist. Trước khi bạn cố gắng tìm và sửa đổi tệp đó, tôi khuyên bạn nên tự làm quen với hệ thống phân cấp miền của OS X để mặc định (còn gọi là "cài đặt"). Một bài viết tốt về điều này có thể được tìm thấy ở đây . (Tuyên bố miễn trừ trách nhiệm: họ dường như đang bán thứ gì đó trên trang web đó. Tôi không biết đó là gì và không có mối liên hệ nào với họ, lời giải thích chỉ là một điều tốt.)

Bây giờ bạn đã biết tất cả về mặc định và UTI (er, không phải loại y tế), bây giờ chúng ta có thể nói về việc thiết lập các liên kết tệp từ một dòng lệnh / tập lệnh.

Trước tiên, bạn sẽ cần biết cách thích hợp để xác định các tệp mà bạn muốn tạo liên kết.

Hãy nhớ làm thế nào tôi nói UTI là quan trọng? Có nhiều cách để xác định một tập tin. Nó phụ thuộc vào việc loại đã được chính thức khai báo trên hệ thống của bạn hay chưa. Ví dụ, các trình soạn thảo văn bản đàng hoàng như TextMate hoặc TextWrangler sẽ thêm khá nhiều khai báo kiểu vào hệ thống phân cấp kiểu khi bạn sử dụng chúng trên hệ thống của mình. Tuy nhiên, nếu bạn không có các ứng dụng đó, bạn có thể không khai báo các loại đó.

OK, nói đủ rồi. Ví dụ:

Lấy UTI cho một tệp:

$ mdls myFile.xml
...
kMDItemContentType             = "public.xml"
kMDItemContentTypeTree         = (
    "public.xml",
    "public.text",
    "public.data",
    "public.item",
    "public.content"
)
...

Ok, tuyệt Một loại nội dung rõ ràng chúng ta có thể sử dụng. Viết nó xuống một nơi nào đó.

$ mdls myFile.myExtn
...
kMDItemContentType             = "dyn.ah62d4rv4ge8048pftb4g6"
kMDItemContentTypeTree         = (
    "public.data",
    "public.item"
)
...

Giáo sư. OS X không biết về các tệp ".myExtn". Vì vậy, nó đã tạo ra một UTI động mà chúng ta không thể sử dụng cho bất cứ điều gì. Và các loại cha mẹ quá chung chung là hữu ích.

Bây giờ chúng ta đã biết các tệp của mình là gì, hãy xem tệp LaunchService.plist và xem những gì chúng ta có thể làm:

$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";
        },
    ...
    );
    ...
}

Vì vậy, khi bạn có loại nội dung "tốt" để sử dụng, cấu trúc đầu tiên sẽ tốt hơn. Nếu không thì xây dựng khác. Lưu ý, có các cấu trúc khác trong tệp đó, nhưng chúng không liên quan đến những gì bạn đã hỏi. Chỉ cần biết họ ở đó khi bạn nhìn qua đầu ra.

Như bạn có thể thấy, bạn sẽ cần tìm UTI cho ứng dụng bạn muốn sử dụng. Các UTI cho Safar và TextMate nằm trong ví dụ của tôi ở trên, nhưng để tìm UTI chung cho một ứng dụng:

$ cd /Applications/MyApp.app/Contents
$ less Info.plist
...
        <key>CFBundleIdentifier</key>
        <string>com.apple.Safari</string>
...

LƯU Ý: Tôi không biết điều gì tạo nên sự khác biệt giữa LSHandlerRole ALL và LSHandlerRoleViewer. Tôi không thể tìm thấy tài liệu về bất cứ nơi nào. Những gì tôi làm thấy là 99% thời gian LSHandlerRoleAll là chỉ có một bộ (tức là không có LSHandlerRoleViewer tại tất cả) và rằng nó được thiết lập để UTI cho ứng dụng mà bạn mong muốn để kết hợp các loại với.

Đã đưa bạn đến nay, tôi sẽ rời khỏi CÁCH để thiết lập các giá trị bạn muốn làm bài tập cho người đọc. Lộn xộn với những điều này có thể hơi nguy hiểm. Bạn hoàn toàn có thể làm hỏng một tập tin và không có bất kỳ hiệp hội tập tin nào của bạn hoạt động. Sau đó, bạn phải vứt bỏ các tập tin và bắt đầu lại.

Một số gợi ý:

  • Đọc lên defaults writevà cú pháp của nó
  • Hãy nhìn vào PlistBuddy. man PlistBuddy/usr/libexec/PlistBuddy -h
  • Bỏ qua tất cả những điều vô nghĩa này và sử dụng RCDefaultApp

Là RCDefault scriptable? Tôi đã xem qua trang web của họ và nó không giống như vậy.
Tên giả

Không bao giờ, tôi có khai báo kiểu cho tất cả các loại tệp mà tôi quan tâm.
Tên giả

Tuyệt vời viết lên. Theo như LSHandlerRoleViewertôi tự hỏi liệu nó có liên quan đến việc mặc định để xem trái ngược với chỉnh sửa hay không ( apple.stackexchange.com/a/49998/206073 đưa tôi đến những dòng đó). Tôi không biết mặc dù trong bối cảnh nào, người ta có thể xác định xem một người đang mở để xem hoặc chỉnh sửa, tuy nhiên ... (ngoài chủ đề, có CFBundleTypeRolevẻ như nó chấp nhận các giá trị tương tự)
Brett Zamir

Ngoài ra, nó có vẻ com.apple.LaunchServices/com.apple.launchservices.securelà miền trong các hệ thống MacOS sau này ...
Brett Zamir

2

Một tùy chọn là chỉnh sửa ~/Library/Preferences/.GlobalPreferences.plist:

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

Bạn có thể sử dụng PlistBuddy để kiểm tra xem các mục đã tồn tại chưa , nhưng tôi chưa tìm thấy cách nào để áp dụng các thay đổi mà không cần khởi động lại hoặc xây dựng lại cơ sở dữ liệu Launch Services.

Sử dụng duti , bạn có thể chạy duti ~/.dutisau khi lưu cái này dưới dạng ~/.duti:

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

1

Nó không thực sự trả lời câu hỏi của bạn, nhưng có thể là một giải pháp.

Các thanh tra trong Finder trình bày thông tin cho các hiện đang được chọn tập tin, hoặc các tập tin:

+ +I

Các Thông tin Tóm tắt cửa sổ của Finder rất hữu ích khi nhiều file được chọn:

^+ +I

Nếu bạn chọn nhiều tệp cùng loại, thì một trong hai phương pháp trên sẽ cho phép bạn dễ dàng chuyển đổi thuộc tính Mở bằng: cho các tệp đó.


0

Không phải là một câu trả lời cho câu hỏi chính xác của bạn, nhưng một giải pháp có thể khác. Bạn có thể mở một tài liệu với một ứng dụng cụ thể từ dòng lệnh với đối số -a để mở.

Ví dụ: mở tất cả các tệp html trong thư mục hiện tại.

> open -a 'Google Chrome' *.html

Mở index.html và các tệp trình điều khiển javascript trong trình soạn thảo văn bản Atom:

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

Tùy thuộc vào nhu cầu của bạn, bạn có thể sửa đổi điều này thành dịch vụ Automator có thể được gán một phím tắt, lấy các đường dẫn tệp đã chọn làm đối số.

Dưới đây là ví dụ Trình tự động AppleScript nhận tệp dưới dạng đầu vào và mở các tệp đã chọn trong 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

Kết thúc

Rõ ràng, bạn có thể thay đổi trình soạn thảo văn bản tên "Sublime", lưu nó dưới dạng dịch vụ khác và gán cho chúng cả hai phím tắt.

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.