【问题标题】:Creating new space/desktop in OSX with applescript?用applescript在OSX中创建新的空间/桌面?
【发布时间】:2014-01-31 23:47:00
【问题描述】:

由于 OSX 似乎缺少创建新空间/桌面的键盘快捷键,我想知道这是否可以通过创建一个 applescript 并将其绑定到键盘快捷键来完成。

在谷歌上查了很多,但什么都找不到。很惊讶以前没有人问过这个问题……似乎很多人会觉得这很有用。

【问题讨论】:

    标签: macos applescript keyboard-shortcuts hotkeys spaces


    【解决方案1】:

    这是我在网上找到的 AppleScript Spaces 例程列表::

    --my get_spaces_enabled()
    --my set_spaces_enabled(enable_spaces)
    --my toggle_spaces_enabled()
    --my get_spaces_rows()
    --my set_spaces_rows(row_count)
    --my get_spaces_columns()
    --my set_spaces_columns(column_count)
    --my get_spaces_count()
    --my show_all_spaces()
    --my get_spaces_application_bindings()
    --my set_spaces_application_bindings(new_bindings)
    --my collect_application_in_current_space(application_bundle_id)
    --my set_spaces_application_binding_for_application(application_bundle_id, chosen_space)
    --my get_space_binding_for_application(application_bundle_id)
    --my choose_space_for_current_application()
    --my choose_space_for_application(application_bundle_id)
    --my remove_spaces_application_binding(application_bundle_id)
    --my get_spaces_arrow_key_modifiers()
    --my get_spaces_numbers_key_modifiers()
    --my switch_to_space(space_number)
    --my open_spaces_preferences()
    --my display_spaces_not_enabled_error()
    
    on get_spaces_enabled()
       tell application "System Events" to tell spaces preferences of expose preferences to return (get spaces enabled)
    end get_spaces_enabled
    
    on set_spaces_enabled(enable_spaces)
       tell application "System Events" to tell spaces preferences of expose preferences to set spaces enabled to enable_spaces
    end set_spaces_enabled
    
    on toggle_spaces_enabled()
       my set_spaces_enabled(not (my get_spaces_enabled()))
    end toggle_spaces_enabled
    
    on get_spaces_rows()
       tell application "System Events" to tell spaces preferences of expose preferences to return (get spaces rows)
    end get_spaces_rows
    
    on set_spaces_rows(row_count)
       tell application "System Events" to tell spaces preferences of expose preferences to set spaces rows to row_count
    end set_spaces_rows
    
    on get_spaces_columns()
       tell application "System Events" to tell spaces preferences of expose preferences to return (get spaces columns)
    end get_spaces_columns
    
    on set_spaces_columns(column_count)
       tell application "System Events" to tell spaces preferences of expose preferences to set spaces columns to column_count
    end set_spaces_columns
    
    on get_spaces_count()
       return ((my get_spaces_rows()) * (my get_spaces_columns()))
    end get_spaces_count
    
    on show_all_spaces()
       try
           tell application "Finder" to set spaces_app_path to (application file id "com.apple.spaceslauncher") as string
           do shell script "open " & quoted form of POSIX path of spaces_app_path
       end try
    end show_all_spaces
    
    on get_spaces_application_bindings()
       tell application "System Events" to tell spaces preferences of expose preferences to return (get application bindings)
    end get_spaces_application_bindings
    
    on set_spaces_application_bindings(new_bindings)
       tell application "System Events" to tell spaces preferences of expose preferences to set application bindings to new_bindings
    end set_spaces_application_bindings
    
    on collect_application_in_current_space(application_bundle_id)
       set application_bundle_id to my make_lowercase(application_bundle_id)
       set app_bindings to my get_spaces_application_bindings()
       my set_spaces_application_bindings((run script "{|" & application_bundle_id & "|:65544}") & app_bindings)
       my set_spaces_application_bindings(app_bindings)
    end collect_application_in_current_space
    
    on set_spaces_application_binding_for_application(application_bundle_id, chosen_space)
       set application_bundle_id to my make_lowercase(application_bundle_id)
       if chosen_space is in {0, "None"} then
           my remove_spaces_application_binding(application_bundle_id)
       else
           if chosen_space = "All" then set chosen_space to 65544
           my set_spaces_application_bindings((run script "{|" & application_bundle_id & "|: " & chosen_space & "}") & (my get_spaces_application_bindings()))
       end if
    end set_spaces_application_binding_for_application
    
    on get_space_binding_for_application(application_bundle_id)
       set application_bundle_id to my make_lowercase(application_bundle_id)
       set app_bindings to my get_spaces_application_bindings()
       try
           get app_bindings as string
       on error error_string
           set app_bindings to my string_to_list(text 13 thru -20 of error_string, ", ")
       end try
       repeat with i from 1 to (count app_bindings)
           if item i of app_bindings starts with ("|" & application_bundle_id & "|:") then return (item 2 of (my string_to_list(item i of app_bindings, ":"))) as number
       end repeat
       return 0
    end get_space_binding_for_application
    
    on choose_space_for_current_application()
       return my choose_space_for_application(bundle identifier of (info for (path to frontmost application)))
    end choose_space_for_current_application
    
    on choose_space_for_application(application_bundle_id)
       set application_bundle_id to my make_lowercase(application_bundle_id)
       if (not my get_spaces_enabled()) then if (not my display_spaces_not_enabled_error()) then return false
       try
           tell application "Finder" to set app_path to (application file id application_bundle_id) as string
           set app_name to short name of (info for (app_path as alias))
           set the_choices to {"None", "All"}
           repeat with i from 1 to (my get_spaces_count())
               set end of the_choices to i
           end repeat
           set default_space to my get_space_binding_for_application(application_bundle_id)
           if default_space = 0 then
               set default_space to "None"
           else if default_space = 65544 then
               set default_space to "All"
           end if
           set chosen_space to (choose from list the_choices default items {default_space} with title "Spaces Assigner" with prompt "Assign " & app_name & " to Space:" OK button name "Assign" without multiple selections allowed and empty selection allowed)
           if chosen_space = false then return false
           my set_spaces_application_binding_for_application(application_bundle_id, item 1 of chosen_space)
           return true
       on error e number n
           log "choose_space_for_application (" & application_bundle_id & ") Error (" & n & "): " & e
           return false
       end try
    end choose_space_for_application
    
    on remove_spaces_application_binding(application_bundle_id)
       set application_bundle_id to my make_lowercase(application_bundle_id)
       set app_bindings to my get_spaces_application_bindings()
       try
           get app_bindings as string
       on error error_string
           set app_bindings to my string_to_list(text 13 thru -20 of error_string, ", ")
       end try
       set new_bindings to {}
       repeat with i in app_bindings
           set i to contents of i
           if i does not start with "|" & application_bundle_id & "|:" then set end of new_bindings to i
       end repeat
       my set_spaces_application_bindings(run script "{" & (my list_to_string(new_bindings, ", ")) & "}")
    end remove_spaces_application_binding
    
    on get_spaces_arrow_key_modifiers()
       tell application "System Events" to tell spaces preferences of expose preferences to return (get key modifiers of (get properties of arrow key modifiers))
    end get_spaces_arrow_key_modifiers
    
    on get_spaces_numbers_key_modifiers()
       tell application "System Events" to tell spaces preferences of expose preferences to return (get key modifiers of (get properties of numbers key modifiers))
    end get_spaces_numbers_key_modifiers
    
    on switch_to_space(space_number)
       if not my gui_scripting_check() then return
       set key_modifiers to my get_spaces_numbers_key_modifiers()
       tell application "System Events"
           set key_modifier_list to {}
           if key_modifiers contains command then set end of key_modifier_list to "command down"
           if key_modifiers contains control then set end of key_modifier_list to "control down"
           if key_modifiers contains option then set end of key_modifier_list to "option down"
           if key_modifiers contains shift then set end of key_modifier_list to "shift down"
           set key_modifier_list to my list_to_string(key_modifier_list, ", ")
           if key_modifier_list ≠ "" then set key_modifier_list to " using {" & key_modifier_list & "}"
       end tell
       run script ("tell application \"System Events\" to keystroke \"" & space_number & "\"" & key_modifier_list)
    end switch_to_space
    
    on open_spaces_preferences()
       tell application "System Preferences"
           activate
           tell pane id "com.apple.preference.expose" to reveal anchor "Spaces"
       end tell
    end open_spaces_preferences
    
    on display_spaces_not_enabled_error()
       beep
       activate
       if ((button returned of (display dialog "Spaces is not enabled. Would You like to enable it now?" with title "Spaces Error" buttons {"Keep Disabled", "Enable"} default button 2 with icon 0)) = "Keep Disabled") then return false
       my set_spaces_enabled(true)
       return true
    end display_spaces_not_enabled_error
    
    on list_to_string(l, d)
       tell (a reference to my text item delimiters)
           set {o, contents} to {contents, d}
           set {l, contents} to {"" & l, o}
       end tell
       return l as Unicode text
    end list_to_string
    
    on string_to_list(s, d)
       tell (a reference to my text item delimiters)
           set {o, contents} to {contents, d}
           set {s, contents} to {s's text items, o}
       end tell
       return s
    end string_to_list
    
    on gui_scripting_check()
       tell application "System Events" to set gui_scripting_enabled to UI elements enabled
       if not gui_scripting_enabled then
           tell application "System Preferences"
               activate
               set current pane to pane "com.apple.preference.universalaccess"
               display dialog "This application utilizes the built-in Graphic User Interface Scripting architecture of Mac OS X which is currently disabled." & return & return & "You can activate GUI Scripting by selecting the checkbox \"Enable access for assistive devices\" in the Universal Access preference pane." with icon 2 buttons {"OK"} default button 1
           end tell
       end if
       return gui_scripting_enabled
    end gui_scripting_check
    
    on make_lowercase(the_string)
       return do shell script "echo " & quoted form of the_string & " | /usr/bin/perl -pe 'use encoding utf8; s/(\\w)/\\L$1/gi'"
    end make_lowercase
    

    您可以使用这些来制作您的代码:)

    链接到例程站点 :: MacScripter - Applescript Spaces Routine

    【讨论】:

    • 这本来很棒,但不幸的是,在最新版本的 OSX 中不再存在“空格”,因此这些子例程不起作用。
    猜你喜欢
    • 2023-03-14
    • 2016-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-26
    相关资源
    最近更新 更多