Как перезагрузить файлы в Mac Preview 10.7? - PullRequest
5 голосов
/ 19 декабря 2011

Я хочу перезагрузить файлы (.png, .pdf) в Preview, после того как они были обновлены.Как это можно сделать?

В OS X 10.5 и 10.6 это было так же просто, как переключиться в режим предварительного просмотра - он автоматически перезагрузил бы новый файл.Кроме того, вы можете использовать open -a Preview *.png или что-то подобное.В 10.7 автоматическая перезагрузка не работает (см. в этом посте ).

Моя первая попытка - это сценарий appleScript, запускаемый из командной строки:

/usr/bin/osascript -e 'tell application "Preview.app" to activate
    tell application "Preview.app" to open "'$PWD/$*'"' 

Это работает для одного файла, но не работает с несколькими файлами по очевидным причинам.Я провел немного больше исследований и попытался использовать более сложный яблочный скрипт, включающий set и список, но это приводит к ошибкам прав доступа:

errors seen when using advanced script

Вот скрипт, который я использовал (мои навыки написания скриптов на bash были не в состоянии разбирать строки):

#!/usr/bin/env python

import optparse
import os

parser=optparse.OptionParser()
options,args = parser.parse_args()

pwd = os.getcwd()

cmd = '/usr/bin/osascript -e '
scriptcmd = "tell application \"Preview.app\" to activate\n" 

flist = [ fn  if fn[0]=='/' else pwd+"/"+fn  for fn in args]

scriptcmd += "set myList to {\"%s\"}\n" % ( '","'.join(flist) )

scriptcmd += "tell application \"Preview.app\" to open myList"

print("%s \'%s\'" % (cmd,scriptcmd))

os.system("%s \'%s\'" % (cmd,scriptcmd))

Я даже не уверен, что этот скрипт решит мою первоначальную проблему - перезагрузка изображений без просмотра серого экрана - но я 'Хотелось бы узнать, есть ли способ просто открыть список файлов с помощью osascript вместо open.

РЕДАКТИРОВАТЬ: Попытка исправить appleScript, но этот код получает ошибки «пропущенного значения»:

tell application "Preview.app" to activate
set myListOfImages to {":Users:adam:work:code:test.png"} 
tell application "Preview.app" to open myListOfImages

Ответы [ 2 ]

1 голос
/ 20 апреля 2015

С декабря 2011 года системные сценарии OS X эволюционировали так, что существует другая опция. OS X теперь включает JavaScript для автоматизации (JXA) с мостом ObjC.

(предостережение: для использования JXA потребуется обновить OS X 10.7 от 2011 г. до 10.10)

Несмотря на то, что я не проводил измерения производительности, мост ObjC в этом случае реагирует быстрее, чем мост AppleScript Apple Events.

#!/usr/bin/env osascript -l JavaScript
ObjC.import('AppKit');

var urls = getSelectedFiles();

// withAppBundleIdentifier:(NSString *)appBundleIdentifier
var appBundleIdentifier = $.NSString.alloc.initWithUTF8String('com.apple.Preview');

// options:(NSWorkspaceLaunchOptions)options
var options = $.NSWorkspaceLaunchWithoutActivation | $.NSWorkspaceLaunchWithErrorPresentation;

// additionalEventParamDescriptor:(NSAppleEventDescriptor *)descriptor
var nilDescriptor = $(); // bridged nil

// launchIdentifiers:(NSArray **)identifiers ... not used
var nilIdentifiers = $(); // bridged nil

// $.NSWorkspace.openURLs:withAppBundleIdentifier:options:additionalEventParamDescriptor:launchIdentifiers()
var ws = $.NSWorkspace.sharedWorkspace;
ws.openURLsWithAppBundleIdentifierOptionsAdditionalEventParamDescriptorLaunchIdentifiers(
  urls,
  appBundleIdentifier,
  options,
  nilDescriptor,
  nilIdentifiers
);

function getSelectedFiles() {
    var appFinder = Application("Finder");
    var selection = [].slice.call(appFinder.selection());

    var list = $.NSMutableArray.alloc.initWithCapacity(selection.length);
    for (key in selection) {
        var path = decodeURI(selection[key].url());
        path = path.replace(/file:\/\//,"");
        var nsurl = $.NSURL.fileURLWithPath(path);
        list.addObject(nsurl);
    }

    return $.NSArray.alloc.initWithArray(list);
}

Подход JXA без моста Objective-C также может использоваться:

var appPreview = Application("Preview");
var appFinder = Application("Finder");

var selection = [].slice.call(appFinder.selection());

var paths = new Array(0);
for (key in selection) {
    paths.push(decodeURI(selection[key].url()));
}

appPreview.activate();
for (key in paths) {
    console.log(paths[key]);
    appPreview.open(Path(paths[key]));
}
1 голос
/ 29 декабря 2011

Вот простой яблочный скрипт, который работает для меня в 10.7.

set picsFolder to (choose folder with prompt "Choose the folder to search...") as text

tell application "Finder"
    set theImages to (files of folder picsFolder whose name extension is "jpg") as alias list
end tell

tell application "Preview"
    activate
    open theImages
end tell

Я вижу несколько ошибок в команде osascript, перечисленных в вашем посте. Сначала команда osascript сформирована неправильно. Во-вторых, вы пытаетесь использовать пути в стиле posix (например, с разделителями-косыми чертами) в команде applecript. Для Applescript требуются пути в стиле appleScript (например, разделенные двоеточием). Есть и другие проблемы. В любом случае, вот osascript, который вы можете запустить из командной строки, и он работает, выполняя поиск в текущем рабочем каталоге, как вы пытались сделать ...

/usr/bin/osascript -e 'set posix_picsFolder to do shell script "PWD"' -e 'set picsFolder to (POSIX file posix_picsFolder) as text' -e 'if picsFolder does not end with ":" then set picsFolder to picsFolder & ":"' -e 'tell application "Finder" to set theImages to (files of folder picsFolder whose name extension is "jpg") as alias list' -e 'tell application "Preview"' -e 'activate' -e 'open theImages' -e 'end tell'

ПРИМЕЧАНИЕ: мой код ищет файлы jpg, поэтому просто измените jpg на png или любое другое расширение файла.

РЕДАКТИРОВАТЬ: ответить на ваши дополнительные вопросы из комментариев

Если вы хотите искать несколько расширений, вы можете использовать "или", как это ...

tell application "Finder"
    set theImages to (files of folder picsFolder whose name extension is "jpg" or name extension is "png") as alias list
end tell

Чтобы найти правильный путь с разделителями ":", вот короткий яблочный скрипт, который покажет их вам. Если вам нужен путь «папка» вместо «файл», просто измените слова в коде. Вы заметите, что эти стили всегда начинаются с имени вашего жесткого диска.

set colonDelimitedPath to (choose file) as text

И если у вас есть путь в стиле posix, который вы хотите преобразовать в путь в стиле appleScript, используйте это.

set posixPath to "/Applications/"
set macPath to (POSIX file posixPath) as text
...