Возможно ли, чтобы файл AppleScript .scpt сохранил пользовательский значок даже после внесения изменений в код?


3

Файл:

Я создал файл AppleScript .scpt в Script Debugger.app.

Вот как я назначил пользовательский значок этому файлу .scpt:

  • Я загрузил уникальную иконку (в формате "512px PNG") с IconArchive.com .

  • Я открыл .png файл с помощью Preview.app. В Preview я нажал EditCopy, чтобы поместить это изображение в буфер обмена.

  • Я открыл Get Infoокно .scpt файла в Finder. Я щелкнул левой кнопкой мыши на значке по умолчанию, найденном в верхнем левом углу Get Infoокна. Затем вокруг значка по умолчанию появился синий контур, отражающий, что значок был выбран.

  • Наконец, я вставил пользовательский значок поверх значка по умолчанию с помощью сочетания клавиш ⌘ command+ V. Пользовательский значок был установлен сразу. Я закрылся из Get Infoокна.


Баг:

Когда я открываю файл .scpt в отладчике сценариев, редактирую код и затем сохраняю файл .scpt, пользовательский значок исчезает.

При сохранении следующий значок немедленно заменяет пользовательский значок:

(Это значок OS X по умолчанию для файлов .scpt.)

Конечно, необходимость проходить процедуру установки пользовательского значка каждый раз, когда я сохраняю (то есть редактирую) файл, является неудобством.

Но есть и вторая ошибка: каждый раз, когда я снова добавляю пользовательский значок в Get Infoокно, размер файла .scpt кумулятивно увеличивается. Другими словами, когда Script Debugger удаляет пользовательский значок файла, размер файла значка все равно включается как часть общего размера файла .scpt.

Показательный пример: размер файла .scpt на данный момент составляет 12,6 МБ. Файл не должен быть больше, чем .5 МБ.


Вопрос:

Я понимаю, как установить пользовательский значок файла для файла AppleScript .app , чтобы этот пользовательский значок оставался на месте после редактирования , но мне любопытно, можно ли сделать то же самое для файла .scpt.

Есть ли способ, чтобы мой собственный значок сценария оставался на месте, даже после изменения файла .scpt в Script Debugger?

Это файл .scpt, который запускается через раскрывающееся меню строки меню FastScripts.app. (Файл .scpt находится в /Users/Me/Library/Scripts.) В раскрывающемся меню FastScripts на самом деле отображаются значки файлов сценариев , что является хорошей функцией. По этой причине я хочу установить пользовательский значок для файла .scpt (т. Е. Чтобы я мог наблюдать соответствующий значок в контекстном меню FastScripts).

Нет, нет ничего сложного в том, чтобы просто преобразовать файлы AppleScript .scpt, для которых я хочу иметь пользовательский значок файла, в файлы AppleScript .app. Я задаю этот вопрос, просто чтобы посмотреть, есть ли что-то, что я здесь упускаю или пропускаю


А как насчет редактора скриптов ?

Похоже, что эта ошибка является уникальной для Script Debugger .

Когда я выполняю те же действия в собственной программе редактирования AppleScript, Script Editor.app , значок файла .scpt остается неизменным при сохранении. Тем не менее, я мог бы поклясться, что на самом деле я столкнулся с этой проблемой в Редакторе сценариев в прошлом.

Например, я вспоминаю, что однажды Редактор сценариев отказался сохранить отредактированный файл .scpt; смутный диалог ошибок был представлен при сохранении. Чтобы успешно сохранить файл, мне пришлось либо удалить пользовательский значок из Get Infoокна Finder , либо скопировать текст кода и вставить его в новый файл .scpt (который, конечно, обязательно будет иметь значок файла по умолчанию .scpt).

Но в настоящее время я больше не могу воспроизвести ошибку в редакторе сценариев.

Во всяком случае, я стараюсь больше не использовать редактор сценариев для редактирования моих AppleScripts больше. Это происходит потому , что редактор сценариев является лагом , потенциально сбой при использовании библиотеки сценариев третьей стороны , и может быть темпераментным , когда дело доходит до открытия и сохранения файлов.

По моему опыту, до сих пор Script Debugger не имел ни одной из этих проблем.

Конечно, Script Debugger имеет хотя бы одну проблему (то есть проблему, подробно описанную в этом посте).


OS X El Capitan, версия 10.11.6.



«Конечно, необходимость проходить через процесс установки пользовательского значка каждый раз, когда я сохраняю (то есть редактирую) файл, создает неудобства». Вы можете написать сценарий, чтобы сделать это для вас. Как вы говорите, Script Editor хранит пользовательские значки между сохранениями файлов .scpt.
Wayfaring Незнакомец

Вы написали: «Как вы говорите, Script Editor хранит пользовательские значки между сохранениями файлов .scpt». Но я не понимаю, насколько это хорошо или полезно? Я имею в виду, как мне получить доступ к пользовательскому значку после сохранения? Я считаю это поведение плохим, потому что оно продолжает увеличивать размер файла .scpt, бесконечно, с нулевой выгодой или целью. Если я сделаю то, что вы предлагаете, и создадите выделенный AppleScript, который устанавливает значок файла .scpt в качестве пользовательского значка, размер файла .scpt будет по-прежнему увеличиваться и увеличиваться, каждый раз, когда пользовательский значок установлено.
сфера Рубика

Если он сохраняет старый пользовательский значок, вы можете вырезать вырезку в буфер обмена.
Wayfaring Незнакомец

Я до сих пор не понимаю ваше предложение. После сохранения файла .scpt пользовательский значок сразу исчезает. Как вы можете вырезать пользовательский значок в буфер обмена, после того как он уже перезаписан значком файла по умолчанию?
сфера Рубика

Ответы:


3

Вообще говоря, когда пользователь назначает пользовательский значок для файла, копируя и вставляя файл изображения в значок, в верхнем левом углу на листе получения информации о файле, файл изображения сохраняется как com.apple.ResourceFork расширенный атрибут файла, в котором он находится. применяется к терминалу, и его можно увидеть в терминале, ls -l@ filename.extкоторый показывает, что файл имеет расширенные атрибуты . Чтобы манипулировать расширенными атрибутами , используйте xattrутилиту в терминале. Обратите внимание, что термин « файл изображения» в этом контакте - это любой действительный источник, скопированный в буфер обмена и вставленный в лист «Информация».

Необходимость повторного применения файла значков после сохранения файла .scpt в отладчике сценариев приводит к тому, что com.apple.ResourceFork расширенный атрибут продолжает увеличиваться в размере, в то же время, возможно, теряя доступ к накопленным файлам значков, я не могу сказать наверняка, поскольку я не сделал достаточно тестирование. К сожалению, хотя редактор сценариев сохраняет файл пользовательских значков, тем не менее он, похоже, также увеличивает размер com.apple.ResourceFork расширенного атрибута .

Чтобы уменьшить размер файла, удалив специально com.apple.ResourceFork расширенные атрибуты , используйте следующий синтаксис команды в Терминале:

xattr -d com.apple.ResourceFork filename.ext

Затем повторно примените пользовательский значок к файлу.

Взгляните на справочную страницу для xattrтерминала в терминале, набрав, xattrа затем щелкните правой кнопкой мыши по ней, выбрав « Открыть справочную страницу» в контекстном меню.

Вероятно, проблему со сбросом Script Debugger к значку по умолчанию придется решать разработчику, или использовать обходной путь, предложенный в ответе wch1zpink.

Поскольку com.apple.ResourceFork расширенный атрибут растет независимо от того, какое приложение вы используете, Script Editor или Script Debugger, это проблема, которую Apple должна решить.

Я знаю, что вы используете OS X El Capitan 10.11.6, однако я протестировал это под macOS Sierra 10.12.5, и поведение, по-видимому, такое же, вероятно, не имеет значения, что я протестировал это в более позднем выпуске ОС. Я использовал Script Debugger 6.0.4.

Из-за повторяемости того, что вы делаете, решение с использованием сценариев позволяет уменьшить усилия, необходимые для поддержания небольшого размера файла, включая расширенные атрибуты , и настраиваемого значка.


Обновить:

Пройдя тем же путем, в OS X 10.8.5, с программной установкой значка файла и протестировав почти все решения, представленные в разделе Как я могу изменить значок файла или папки с помощью терминала , я решил использовать setfileicon из этого ответа : как это было сформулировано лучше всего для моих нужд в то время.

Следующий код AppleScript является примером кода, который может программно удалить com.apple.ResourceFork расширенный атрибут целевого файла, чтобы уменьшить его накопительный размер и сбросить значок целевого файла. Он написан вокруг использования обходного пути, предложенного в ответе wch1zpink, ссылающегося на блокировку файла, чтобы сохранить иконку неповрежденной во время сохранения в Script Debugger.

Основная цель этого примера кода - показать, как удалить com.apple.ResourceFork расширенный атрибут целевого файла и программно сбросить его пользовательский значок. Я добавил код, чтобы разблокировать / заблокировать целевой файл, если вы решите использовать этот метод, чтобы сохранить иконку без изменений между сохранениями, если нет, то ее можно удалить. Я думаю, это зависит только от того, как часто вы хотите сбросить размер com.apple.ResourceFork расширенного атрибута целевого файла .

tell current application

    set theTargetFilename to "filename.scpt" as string
    set theHomeFolderPath to (path to home folder) as string
    set theScriptsFolder to (path to scripts folder) as string
    set theTargetFilePathname to theScriptsFolder & theTargetFilename as alias
    set theTargetIcon to quoted form of (POSIX path of (theHomeFolderPath & "bin:icon.icns") as string)
    set theTargetExecutable to quoted form of (POSIX path of (theHomeFolderPath & "bin:setfileicon") as string)

    tell application "Finder" to set locked of theTargetFilePathname to false
    do shell script "xattr -d com.apple.ResourceFork " & quoted form of (POSIX path of theTargetFilePathname) & "; exit 0"
    do shell script theTargetExecutable & " " & theTargetIcon & " " & quoted form of (POSIX path of theTargetFilePathname)
    tell application "Finder" to set locked of theTargetFilePathname to true

end tell

Примечания:

Для целей данного примера кода я поместил setfileiconутилиту командной строки и целевые icon.icnsфайлы в папку bin в корне моей домашней папки. Этот icon.icnsфайл является файлом .icns того, который указан в вашем вопросе. Вы можете использовать файл PNG , однако я считаю, что файл .icns создает лучшее изображение.

Сценарий может быть более жестким и не слишком подробным, однако я закодировал его таким образом по нескольким причинам, из которых я не буду вдаваться в подробности, если вам не понадобится его объяснение. Не стесняйтесь использовать пример кода для реализации рабочего решения по мере необходимости / необходимости в вашей среде.

Это было протестировано под macOS Sierra 10.12.5, однако оно также должно работать под OS X El Capitan 10.11.6.


Brilliant. Особенно "набор заблокирован" ;-)
wch1zpink

1
@ wch1zpink, кредит для блокировки файла, чтобы сохранить пользовательский значок без изменений при сохранении с помощью Script Debugger, в качестве обходного пути, все ваше (и мне нужно +1 ваш ответ для этого)! Но какая неприятная проблема с расширенным атрибутом com.apple.ResourceFork, который продолжает расти! По крайней мере, между нашими ответами есть обходной путь для решения обеих проблем.
user3439894

1
Я просто был на страницах справочника по xattr и немного изучал и читал. Я писал сценарии только около восьми месяцев, но до этого у меня не было навыков программирования. Так много учиться. Честно говоря, ваши ответы и ответы научили меня очень многому. Спасибо, чувак
wch1zpink

Также читал справочную страницу iconset, проверяя, есть ли какие-нибудь команды, которые мы могли бы использовать. Интересные вещи
wch1zpink

1
Мастерски сделано. Ваш код безупречно устраняет обе ошибки. Спасибо за вашу изобретательность! Спасибо, @ wch1zpink! Этот ответ - произведение искусства.
сфера Рубика

3

На самом деле есть решение. Я скачал файл .icns по указанной вами ссылке. Затем я перетащил весь файл .icns из окна Finder в изображение значка в окне «Информация» скрипта, который я создал в приложении Script Debugger. После того, как новый значок был установлен, я выбрал опцию «заблокировать файл» в окне «Информация».

введите описание изображения здесь

После этого я снова открыл этот скрипт в приложении Script Debugger и внес несколько изменений в скрипт, перекомпилировал скрипт и заново сохранил его. Когда я попытался сохранить его снова, я получил это окно сообщения.

введите описание изображения здесь

Я выбрал опцию «Сохранить Ayway» и БИНГО! Изменения были сохранены, но пользовательский значок остался без изменений.


Вот предположение, что, возможно, кто-то может схватить мяч и бежать с ним. Вместо того чтобы сохранять его как файл сценария в отладчике сценария, сохраните его как пакет сценариев (.scptd). После этого нажмите Ctrl + клик по этому файлу в Finder и выберите «Показать содержимое пакета». Добавьте ваш собственный файл .icns в папку «Ресурсы». Вы также заметите файл info.plist. Откройте файл info.plist в Xcode. Если вы нажмете кнопку «+» в строке списка свойств информации, вы сможете добавить файлы значков.

введите описание изображения здесь

Это выходит за рамки моих знаний, но, возможно, каким-то образом здесь можно установить файл пользовательских значков.


Это интересный обходной путь для отладчика сценариев, не сбрасывающего пользовательский значок, но, к сожалению, com.apple.ResourceFork расширенный атрибут файла продолжает расти при каждом сохранении. Поэтому периодически com.apple.ResourceFork расширенный атрибут необходимо будет удалять, а значок сбрасывать. Файл должен быть разблокирован, чтобы сделать это, так как даже использование sudoне будет обходить блокировку.
user3439894

Я не верю, что пакет документов поддерживает свойство файла Icon в Info.plist, но пакеты приложений поддерживают это.
user3439894

Я считаю, что вы правы в этом наблюдении, потому что я внес необходимые изменения в файл plist, в пакете документов, но они не сохранили пользовательский значок, если я снова открою .scptd в отладчике сценариев и внесу и сохраню изменения.
wch1zpink
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.