Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Is there any way I can fold all methods in Xcode project?

Xcode provides method folding option for the current file. But is there any way to apply this to all the .m files in the project ?

enter image description here

p.s: I tried Xcode run scripts & Xcode plugin development, but failed to comeup with a proper solution

like image 374
Thilina Chamath Hewagama Avatar asked Nov 27 '14 07:11

Thilina Chamath Hewagama


1 Answers

Here's an AppleScript for the purpose. Caveat:

  • System Events is required.
  • The script probably needs changes if you have multiple workspaces open or your workspace contains multiple projects.
  • You may need to have something else than an .m file selected in the project navigator.
    -- Collect all Objective-C file references from the given group.
    on handleGroup(theGroup, codeRefs)
        tell application "Xcode"
            set fileRefs to theGroup's file references
            repeat with x in fileRefs
                if x's file kind is equal to "sourcecode.c.objc" then
                    copy x to end of codeRefs
                end if
            end repeat

            set subgroups to theGroup's groups
            repeat with x in subgroups
                my handleGroup(x, codeRefs)
            end repeat
        end tell
    end handleGroup


    on moveFocusToProjectNavigator()
        tell application "System Events"
            tell process "Xcode"
                set frontmost to true
                tell menu bar item "Navigate" of menu bar 1
                    tell menu 1
                        click menu item "Reveal in Project navigator"
                    end tell
                end tell
            end tell
        end tell
    end moveFocusToProjectNavigator


    on moveFocusToNextArea()
        tell application "System Events"
            tell process "Xcode"
                set frontmost to true
                tell menu bar item "Navigate" of menu bar 1
                    tell menu 1
                        click menu item "Move Focus to Next Area"
                    end tell
                end tell
            end tell
        end tell
    end moveFocusToNextArea


    -- Simulate pressing the up arrow.
    on selectNextItem()
        tell application "System Events"
            tell process "Xcode"
                key code 126
            end tell
        end tell
    end selectNextItem


    on fold(shouldFold)
        set theCommand to "Fold Methods & Functions"
        if shouldFold is equal to 0 then
            set theCommand to "Unfold All"
        end if

        -- Fold the code by using the menu item.
        tell application "System Events"
            tell process "Xcode"
                set frontmost to true

                tell menu bar item "Editor" of menu bar 1
                    tell menu 1
                        tell menu item "Code Folding"
                            tell menu 1
                                click menu item theCommand
                            end tell
                        end tell
                    end tell
                end tell
            end tell
        end tell
    end fold


    on run
        -- Set to one to fold, zero to unfold.
        set shouldFold to 1

        tell application "Xcode"
            set ws to every workspace document
            set theWorkspace to item 1 of ws
            tell theWorkspace
                set pr to item 1 of projects
                set codeRefs to {}
                my handleGroup(pr, codeRefs)

                -- Open each document and fold the code.
                set thePaths to {}
                repeat with x in codeRefs
                    copy x's full path to the end of thePaths
                end repeat
            end tell

            -- If we only have one path, a new workspace won't be opened.
            if 1 is equal to (count of thePaths) then
                open item 1 of thePaths
                my moveFocusToNextArea()
                my fold(shouldFold)
            else
                open thePaths

                set ws to every workspace document
                set theWorkspace to item 1 of ws
                my fold(shouldFold)
                repeat (count of theWorkspace's file references) - 1 times
                    my moveFocusToProjectNavigator()
                    my selectNextItem()
                    my moveFocusToNextArea()
                    my fold(shouldFold)
                end repeat

                -- If we don't wait before closing the window, the last document
                -- won't be folded.
                tell application "System Events" to delay 3

                tell theWorkspace to close
            end if
        end tell
    end run

For the sake of completeness, here's an earlier attempt. It is quite slow since it needs to open one document by URL at a time.

    -- Collect all Objective-C file references from the given group.
    on handleGroup(theGroup, codeRefs)
        tell application "Xcode"
            set fileRefs to theGroup's file references
            repeat with x in fileRefs
                if x's file kind is equal to "sourcecode.c.objc" then
                    copy x to end of codeRefs
                end if
            end repeat

            set subgroups to theGroup's groups
            repeat with x in subgroups
                my handleGroup(x, codeRefs)
            end repeat
        end tell
    end handleGroup

    on run
        tell application "Xcode"
            set ws to every workspace document
            tell item 1 of ws
                set pr to item 1 of projects
                set codeRefs to {}
                my handleGroup(pr, codeRefs)

                -- Open each document and fold the code.
                repeat with x in codeRefs
                    set thePath to x's full path
                    set doc to open thePath

                    tell doc
                        activate
                    end tell

                    -- Fold the code by using the menu item.
                    tell application "System Events"
                        tell process "Xcode"
                            set frontmost to true

                            tell menu bar item "Editor" of menu bar 1
                                tell menu 1
                                    tell menu item "Code Folding"
                                        tell menu 1
                                            click menu item "Fold Methods & Functions"
                                        end tell
                                    end tell
                                end tell
                            end tell
                        end tell
                    end tell

                end repeat
            end tell
        end tell
    end run
like image 127
tsnorri Avatar answered Sep 23 '22 04:09

tsnorri