]> Cypherpunks repositories - gostls13.git/commitdiff
Xcode: Example install of language specification for Xcode 4.x.
authorEmil Hessman <c.emil.hessman@gmail.com>
Mon, 5 Mar 2012 23:11:08 +0000 (15:11 -0800)
committerRobert Griesemer <gri@golang.org>
Mon, 5 Mar 2012 23:11:08 +0000 (15:11 -0800)
go.xclangspec is identical to the one in misc/xcode/3/, except for the heading.

Partial workaround for issue 2401.

R=gri
CC=golang-dev
https://golang.org/cl/5732051

misc/xcode/4/README [new file with mode: 0644]
misc/xcode/4/go.xclangspec [new file with mode: 0644]
misc/xcode/4/go4xcode.sh [new file with mode: 0755]

diff --git a/misc/xcode/4/README b/misc/xcode/4/README
new file mode 100644 (file)
index 0000000..44a4565
--- /dev/null
@@ -0,0 +1,2 @@
+This directory contains files for Go syntax highlighting in Xcode 4.x.
+For installation; read, edit and run go4xcode.sh
diff --git a/misc/xcode/4/go.xclangspec b/misc/xcode/4/go.xclangspec
new file mode 100644 (file)
index 0000000..96edc80
--- /dev/null
@@ -0,0 +1,290 @@
+/*
+       Copyright 2012 The Go Authors. All rights reserved.
+       Use of this source code is governed by a BSD-style
+       license that can be found in the LICENSE file.
+
+       go.xclangspec
+       Go language specification for Xcode 4.x.
+
+       This is a preliminary version that supports basic syntax coloring
+       (such as keywords, literals, and comments) and an attempt to provide
+       some structure information (incomplete).
+
+       There is not much documentation available regarding the format
+       of .xclangspec files. As a starting point, see for instance the
+       outdated documentation at:
+
+               http://maxao.free.fr/xcode-plugin-interface/specifications.html
+
+*/
+
+(
+
+// ----------------------------------------------------------------------------
+// Keywords
+
+// TODO How do we get general Unicode identifiers?
+
+       {
+               Identifier = "xcode.lang.go.identifier";
+               Syntax = {
+                       StartChars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_";
+                       Chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_";
+                       Words = (
+                               "break",
+                               "case",
+                               "chan",
+                               "const",
+                               "continue",
+
+                               "default",
+                               "defer",
+                               "else",
+                               "fallthrough",
+                               "for",
+
+                               "func",
+                               "go",
+                               "goto",
+                               "if",
+                               "import",
+
+                               "interface",
+                               "map",
+                               "package",
+                               "range",
+                               "return",
+
+                               "select",
+                               "struct",
+                               "switch",
+                               "type",
+                               "var",
+                       );
+                       Type = "xcode.syntax.keyword";
+                       AltType = "xcode.syntax.identifier";  // non-keywords are identifiers
+               };
+       },
+
+// TODO decide what should go here, if anything
+       {
+               Identifier = "xcode.lang.go.interestingOperators";
+               Syntax = {
+                       Words = (
+                               "...",
+                               ".",
+                               "*",
+                               ",",
+                               ":",
+                       );
+                       Type = "xcode.syntax.plain";
+               };
+       },
+
+       {
+               Identifier = "xcode.lang.go.rawstring";
+               Syntax = {
+                       Start = "`";
+                       End = "`";
+                       Type = "xcode.syntax.string";
+               };
+       },
+
+// ----------------------------------------------------------------------------
+// Syntax Coloring
+
+       {
+               Identifier = "xcode.lang.go";
+               Description = "Go Coloring";
+               BasedOn = "xcode.lang.simpleColoring";
+               IncludeInMenu = YES;
+               Name = "Go";
+               Syntax = {
+                       Tokenizer = "xcode.lang.go.lexer.toplevel";
+                       IncludeRules = (
+                               "xcode.lang.go.block",
+                               "xcode.lang.go.bracketexpr",
+                               "xcode.lang.go.parenexpr",
+                       );
+                       Type = "xcode.syntax.plain";
+               };
+       },
+
+       // The following rule returns tokens to the other rules
+       {
+               Identifier = "xcode.lang.go.lexer";
+               Syntax = {
+                       IncludeRules = (
+                               "xcode.lang.go.comment",
+                               "xcode.lang.go.comment.singleline",
+                               "xcode.lang.string",
+                               "xcode.lang.character",
+                               "xcode.lang.go.rawstring",
+                               "xcode.lang.go.identifier",
+                               "xcode.lang.number",
+                               "xcode.lang.go.interestingOperators",
+                       );
+               };
+       },
+
+       {
+               Identifier = "xcode.lang.go.lexer.toplevel";
+               Syntax = {
+                       IncludeRules = (
+                               "xcode.lang.go.comment",
+                               "xcode.lang.go.comment.singleline",
+                               "xcode.lang.string",
+                               "xcode.lang.character",
+                               "xcode.lang.go.rawstring",
+                               "xcode.lang.go.type.declaration",
+                               "xcode.lang.go.method.declaration",
+                               "xcode.lang.go.function.declaration",
+                               "xcode.lang.go.identifier",
+                               "xcode.lang.number",
+                       );
+               };
+       },
+
+       {
+               Identifier = "xcode.lang.go.method.declaration";
+               Syntax = {
+                       Tokenizer = "xcode.lang.go.lexer";
+                       Rules = (
+                               "func",
+                               "xcode.lang.go.parenexpr",
+                               "xcode.lang.go.identifier",
+                               "xcode.lang.go.parenexpr",
+                       );
+                       Type = "xcode.syntax.declaration.method";
+               };
+       },
+
+       {
+               Identifier = "xcode.lang.go.type.declaration";
+               Syntax = {
+                       Tokenizer = "xcode.lang.go.lexer";
+                       Rules = (
+                               "type",
+                               "xcode.lang.go.identifier",
+                       );
+                       Type = "xcode.syntax.typedef";
+               };
+       },
+
+       {
+               Identifier = "xcode.lang.go.function.declaration";
+               Syntax = {
+                       Tokenizer = "xcode.lang.go.lexer";
+                       Rules = (
+                               "func",
+                               "xcode.lang.go.identifier",
+                               "xcode.lang.go.parenexpr",
+                       );
+                       Type = "xcode.syntax.declaration.function";
+               };
+       },
+
+// ----------------------------------------------------------------------------
+// Blocks
+
+       {
+               Identifier = "xcode.lang.go.block";
+               Syntax = {
+                       Tokenizer = "xcode.lang.go.lexer";
+                       Start = "{";
+                       End = "}";
+                       Foldable = YES;
+                       Recursive = YES;
+                       IncludeRules = (
+                               "xcode.lang.go.bracketexpr",
+                               "xcode.lang.go.parenexpr",
+                       );
+               };
+       },
+
+       {
+               Identifier = "xcode.lang.go.parenexpr";
+               Syntax = {
+                       Tokenizer = "xcode.lang.go.lexer";
+                       Start = "(";
+                       End = ")";
+                       Recursive = YES;
+                       IncludeRules = (
+                               "xcode.lang.go.bracketexpr",
+                               "xcode.lang.go.block",
+                       );
+               };
+       },
+
+       {
+               Identifier = "xcode.lang.go.bracketexpr";
+               Syntax = {
+                       Tokenizer = "xcode.lang.go.lexer";
+                       Start = "[";
+                       End = "]";
+                       Recursive = YES;
+                       IncludeRules = (
+                               "xcode.lang.go.parenexpr",
+                       );
+               };
+       },
+
+       {
+               Identifier = "xcode.lang.go.comment";
+               Syntax = {
+                       Start = "/*";
+                       End = "*/";
+                       Foldable = YES;
+                       IncludeRules = (
+                               "xcode.lang.url",
+                               "xcode.lang.url.mail",
+                               "xcode.lang.comment.mark",
+                       );
+                       Type = "xcode.syntax.comment";
+               };
+       },
+
+       {
+               Identifier = "xcode.lang.go.comment.singleline";
+               Syntax = {
+                       Start = "//";
+                       End = "\n";
+                       IncludeRules = (
+                               "xcode.lang.url",
+                               "xcode.lang.url.mail",
+                               "xcode.lang.comment.mark",
+                       );
+                       Type = "xcode.syntax.comment";
+               };
+       },
+
+       // This rule recognizes special comments markers and adds them
+       // to the list of file markers at the top of the editor window.
+       // This overrides the markers specified in
+       // /Developer/Library/PrivateFrameworks/XcodeEdit.framework/Versions/A/Resources/BaseSupport.xclangspec
+       // and appears to apply them to all languages. Thus, for now
+       // "inherit" the existing markers here for backward-compatibility.
+       {
+               Identifier = "xcode.lang.comment.mark";
+               Syntax = {
+                       StartChars = "BMTF!?";
+                       Match = (
+                               // Go-specific markers
+                               "^\(BUG.*$\)$",                 // include "BUG" in the markers list
+                               "^\(TODO.*$\)$",                // include "TODO" in the markers list
+                               // inherited markers
+                               "^MARK:[ \t]+\(.*\)$",
+                               "^\(TODO:[ \t]+.*\)$",          // include "TODO: " in the markers list
+                               "^\(FIXME:[ \t]+.*\)$",         // include "FIXME: " in the markers list
+                               "^\(!!!:.*\)$",                 // include "!!!:" in the markers list
+                               "^\(\\?\\?\\?:.*\)$"            // include "???:" in the markers list
+                       );
+                       // This is the order of captures. All of the match strings above need the same order.
+                       CaptureTypes = (
+                               "xcode.syntax.mark"
+                       );
+                       Type = "xcode.syntax.comment";
+               };
+       },
+
+)
diff --git a/misc/xcode/4/go4xcode.sh b/misc/xcode/4/go4xcode.sh
new file mode 100755 (executable)
index 0000000..fbdd0cf
--- /dev/null
@@ -0,0 +1,100 @@
+#!/usr/bin/env bash
+# Copyright 2012 The Go Authors.  All rights reserved.
+# Use of this source code is governed by a BSD-style
+# license that can be found in the LICENSE file.
+
+# Illustrates how a Go language specification can be installed for Xcode 4.x.,
+# to enable syntax coloring, by adding an entry to a plugindata file.
+#
+# FIXME: Write a decent Xcode plugin to handle the file type association and
+# language specification properly instead of altering Xcode library files.
+
+set -e
+
+# Assumes Xcode 4+.
+XCODE_MAJOR_VERSION=`xcodebuild -version | awk 'NR == 1 {print substr($2,1,1)}'`
+if [ "$XCODE_MAJOR_VERSION" -lt "4" ]; then
+       echo "Xcode 4.x not found."
+       exit 1
+fi
+
+# DVTFOUNDATION_DIR may vary depending on Xcode setup. Change it to reflect
+# your current Xcode setup. Find suitable path with e.g.:
+#
+#      find / -type f -name 'DVTFoundation.xcplugindata' 2> /dev/null
+#
+# Example of DVTFOUNDATION_DIR's from "default" Xcode 4.x setups;
+#
+#      Xcode 4.1: /Developer/Library/PrivateFrameworks/DVTFoundation.framework/Versions/A/Resources/
+#      Xcode 4.3: /Applications/Xcode.app/Contents/SharedFrameworks/DVTFoundation.framework/Versions/A/Resources/
+#
+DVTFOUNDATION_DIR="/Applications/Xcode.app/Contents/SharedFrameworks/DVTFoundation.framework/Versions/A/Resources/"
+PLUGINDATA_FILE="DVTFoundation.xcplugindata"
+
+PLISTBUDDY=/usr/libexec/PlistBuddy
+PLIST_FILE=tmp.plist
+
+# Provide means of deleting the Go entry from the plugindata file.
+if [ "$1" = "--delete-entry" ]; then
+       echo "Removing Go language specification entry."
+       $PLISTBUDDY -c "Delete :plug-in:extensions:Xcode.SourceCodeLanguage.Go" $DVTFOUNDATION_DIR/$PLUGINDATA_FILE
+       echo "Run 'sudo rm -rf /var/folders/*' and restart Xcode to update change immediately."
+       exit 0
+fi
+
+GO_VERSION="`go version`"
+
+GO_LANG_ENTRY="
+       <?xml version=\"1.0\" encoding=\"UTF-8\"?>
+       <!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">
+       <plist version=\"1.0\">
+               <dict>
+                       <key>Xcode.SourceCodeLanguage.Go</key>
+                       <dict>
+                               <key>conformsTo</key>
+                               <array>
+                                       <dict>
+                                               <key>identifier</key>
+                                               <string>Xcode.SourceCodeLanguage.Generic</string>
+                                       </dict>
+                               </array>
+                               <key>documentationAbbreviation</key>
+                               <string>go</string>
+                               <key>fileDataType</key>
+                               <array>
+                                       <dict>
+                                               <key>identifier</key>
+                                               <string>com.apple.xcode.go-source</string>
+                                       </dict>
+                               </array>
+                               <key>id</key>
+                               <string>Xcode.SourceCodeLanguage.Go</string>
+                               <key>languageName</key>
+                               <string>Go</string>
+                               <key>languageSpecification</key>
+                               <string>xcode.lang.go</string>
+                               <key>name</key>
+                               <string>The Go Programming Language</string>
+                               <key>point</key>
+                               <string>Xcode.SourceCodeLanguage</string>
+                               <key>version</key>
+                               <string>$GO_VERSION</string>
+                       </dict>
+               </dict>
+       </plist>
+"
+
+echo "Backing up plugindata file."
+cp $DVTFOUNDATION_DIR/$PLUGINDATA_FILE $DVTFOUNDATION_DIR/$PLUGINDATA_FILE.bak
+
+echo "Adding Go language specification entry."
+echo $GO_LANG_ENTRY > $PLIST_FILE
+$PLISTBUDDY -c "Merge $PLIST_FILE plug-in:extensions" $DVTFOUNDATION_DIR/$PLUGINDATA_FILE
+
+rm -f $PLIST_FILE
+
+echo "Installing Go language specification file for Xcode."
+cp $GOROOT/misc/xcode/4/go.xclangspec $DVTFOUNDATION_DIR
+
+echo "Run 'sudo rm -rf /var/folders/*' and restart Xcode to update change immediately."
+echo "Syntax coloring must be manually selected from the Editor - Syntax Coloring menu in Xcode."