Skip to content

Instantly share code, notes, and snippets.

@samuell
Created December 28, 2010 23:08
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save samuell/757880 to your computer and use it in GitHub Desktop.
Save samuell/757880 to your computer and use it in GitHub Desktop.
Add Operator Highligting to PyDev for Eclipse
diff --git a/org.python.pydev/src/org/python/pydev/editor/PyCodeScanner.java b/org.python.pydev/src/org/python/pydev/editor/PyCodeScanner.java
index 3e527cb..a4bb900 100644
--- a/org.python.pydev/src/org/python/pydev/editor/PyCodeScanner.java
+++ b/org.python.pydev/src/org/python/pydev/editor/PyCodeScanner.java
@@ -47,6 +47,7 @@ public class PyCodeScanner extends RuleBasedScanner {
private IToken numberToken ;
private IToken classNameToken;
private IToken funcNameToken ;
+ private IToken operatorToken ;
private String[] keywords;
@@ -99,6 +100,24 @@ public class PyCodeScanner extends RuleBasedScanner {
}
+ static private class OperatorDetector implements IWordDetector{
+
+ /**
+ * @see org.eclipse.jface.text.rules.IWordDetector#isWordStart(char)
+ */
+ public boolean isWordStart(char c) {
+ return c == '(' || c == ')' || c == '+' || c == '-' || c == '*' || c == '%' || c == '=';
+ }
+
+ /**
+ * @see org.eclipse.jface.text.rules.IWordDetector#isWordPart(char)
+ */
+ public boolean isWordPart(char c) {
+ return c == '=';
+ }
+
+ }
+
static public class NumberDetector implements IWordDetector{
/**
@@ -183,6 +202,8 @@ public class PyCodeScanner extends RuleBasedScanner {
funcNameToken = new Token( colorCache.getFuncNameTextAttribute() );
+ operatorToken = new Token( colorCache.getOperatorTextAttribute() );
+
setDefaultReturnToken(defaultToken);
List<IRule> rules = new ArrayList<IRule>();
@@ -206,7 +227,7 @@ public class PyCodeScanner extends RuleBasedScanner {
}
rules.add(wordRule);
-
+ rules.add(new WordRule(new OperatorDetector(), operatorToken));
rules.add(new WordRule(new DecoratorDetector(), decoratorToken));
rules.add(new WordRule(new NumberDetector(), numberToken));
diff --git a/org.python.pydev/src/org/python/pydev/editor/preferences/PydevEditorPrefs.java b/org.python.pydev/src/org/python/pydev/editor/preferences/PydevEditorPrefs.java
index 1dba717..4fc6ddf 100644
--- a/org.python.pydev/src/org/python/pydev/editor/preferences/PydevEditorPrefs.java
+++ b/org.python.pydev/src/org/python/pydev/editor/preferences/PydevEditorPrefs.java
@@ -290,6 +290,7 @@ public class PydevEditorPrefs extends AbstractPydevPrefs {
localStore.setValue(STRING_COLOR, fOverlayStore.getString(STRING_COLOR));
localStore.setValue(COMMENT_COLOR, fOverlayStore.getString(COMMENT_COLOR));
localStore.setValue(BACKQUOTES_COLOR, fOverlayStore.getString(BACKQUOTES_COLOR));
+ localStore.setValue(OPERATOR_COLOR, fOverlayStore.getString(OPERATOR_COLOR));
localStore.setValue(KEYWORD_STYLE, fOverlayStore.getInt(KEYWORD_STYLE));
@@ -302,7 +303,7 @@ public class PydevEditorPrefs extends AbstractPydevPrefs {
localStore.setValue(STRING_STYLE, fOverlayStore.getInt(STRING_STYLE));
localStore.setValue(COMMENT_STYLE, fOverlayStore.getInt(COMMENT_STYLE));
localStore.setValue(BACKQUOTES_STYLE, fOverlayStore.getInt(BACKQUOTES_STYLE));
-
+ localStore.setValue(OPERATOR_STYLE, fOverlayStore.getInt(OPERATOR_STYLE));
this.updateLabelExample(PyFormatStd.getFormat(), localStore);
}
diff --git a/org.python.pydev/src/org/python/pydev/plugin/preferences/AbstractPydevPrefs.java b/org.python.pydev/src/org/python/pydev/plugin/preferences/AbstractPydevPrefs.java
index 76cc65c..e129ec9 100644
--- a/org.python.pydev/src/org/python/pydev/plugin/preferences/AbstractPydevPrefs.java
+++ b/org.python.pydev/src/org/python/pydev/plugin/preferences/AbstractPydevPrefs.java
@@ -164,6 +164,9 @@ public abstract class AbstractPydevPrefs extends PreferencePage implements IWork
public static final String FUNC_NAME_COLOR = "FUNC_NAME_COLOR";
public static final RGB DEFAULT_FUNC_NAME_COLOR = new RGB(0, 0, 0);
+ public static final String OPERATOR_COLOR = "OPERATOR_COLOR";
+ public static final RGB DEFAULT_OPERATOR_COLOR = new RGB(255, 0, 0);
+
//see initializeDefaultColors for selection defaults
public static final String CONNECT_TIMEOUT = "CONNECT_TIMEOUT";
public static final int DEFAULT_CONNECT_TIMEOUT = 20000;
@@ -199,6 +202,9 @@ public abstract class AbstractPydevPrefs extends PreferencePage implements IWork
public static final String FUNC_NAME_STYLE = "FUNC_NAME_STYLE";
public static final int DEFAULT_FUNC_NAME_STYLE = SWT.BOLD;
+ public static final String OPERATOR_STYLE = "OPERATOR_STYLE";
+ public static final int DEFAULT_OPERATOR_STYLE = SWT.NORMAL;
+
/**
* Defaults
@@ -215,6 +221,7 @@ public abstract class AbstractPydevPrefs extends PreferencePage implements IWork
{"Backquotes", BACKQUOTES_COLOR, null},
{"Class Name", CLASS_NAME_COLOR, null},
{"Function Name", FUNC_NAME_COLOR, null},
+ {"Operators", OPERATOR_COLOR, null},
};
protected final String[][] fAppearanceFontListModel= new String[][] {
@@ -229,6 +236,7 @@ public abstract class AbstractPydevPrefs extends PreferencePage implements IWork
{"Backquotes", BACKQUOTES_STYLE, null},
{"Class Name", CLASS_NAME_STYLE, null},
{"Function Name", FUNC_NAME_STYLE, null},
+ {"Operators", OPERATOR_STYLE, null},
};
protected OverlayPreferenceStore fOverlayStore;
@@ -336,6 +344,7 @@ public abstract class AbstractPydevPrefs extends PreferencePage implements IWork
overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.STRING, BACKQUOTES_COLOR));
overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.STRING, CLASS_NAME_COLOR));
overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.STRING, FUNC_NAME_COLOR));
+ overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.STRING, OPERATOR_COLOR));
//font style
overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.INT, CODE_STYLE));
@@ -348,6 +357,7 @@ public abstract class AbstractPydevPrefs extends PreferencePage implements IWork
overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.INT, BACKQUOTES_STYLE));
overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.INT, CLASS_NAME_STYLE));
overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.INT, FUNC_NAME_STYLE));
+ overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.INT, OPERATOR_STYLE));
OverlayPreferenceStore.OverlayKey[] keys= new OverlayPreferenceStore.OverlayKey[overlayKeys.size()];
overlayKeys.toArray(keys);
diff --git a/org.python.pydev/src/org/python/pydev/plugin/preferences/IPydevPreferencesProvider.java b/org.python.pydev/src/org/python/pydev/plugin/preferences/IPydevPreferencesProvider.java
index 2a47543..44c0049 100644
--- a/org.python.pydev/src/org/python/pydev/plugin/preferences/IPydevPreferencesProvider.java
+++ b/org.python.pydev/src/org/python/pydev/plugin/preferences/IPydevPreferencesProvider.java
@@ -38,7 +38,8 @@ public interface IPydevPreferencesProvider {
TextAttribute getConsolePromptTextAttribute();
- RGB getConsoleBackgroundRGB();
+ TextAttribute getOperatorTextAttribute();
+ RGB getConsoleBackgroundRGB();
}
diff --git a/org.python.pydev/src/org/python/pydev/plugin/preferences/PydevPrefsInitializer.java b/org.python.pydev/src/org/python/pydev/plugin/preferences/PydevPrefsInitializer.java
index f2e3722..b3562c2 100644
--- a/org.python.pydev/src/org/python/pydev/plugin/preferences/PydevPrefsInitializer.java
+++ b/org.python.pydev/src/org/python/pydev/plugin/preferences/PydevPrefsInitializer.java
@@ -73,6 +73,7 @@ public class PydevPrefsInitializer extends AbstractPreferenceInitializer{
node.put(PydevEditorPrefs.BACKQUOTES_COLOR,StringConverter.asString(PydevEditorPrefs.DEFAULT_BACKQUOTES_COLOR));
node.put(PydevEditorPrefs.CLASS_NAME_COLOR, StringConverter.asString(PydevEditorPrefs.DEFAULT_CLASS_NAME_COLOR));
node.put(PydevEditorPrefs.FUNC_NAME_COLOR, StringConverter.asString(PydevEditorPrefs.DEFAULT_FUNC_NAME_COLOR));
+ node.put(PydevEditorPrefs.OPERATOR_COLOR, StringConverter.asString(PydevEditorPrefs.DEFAULT_OPERATOR_COLOR));
//for selection colors see initializeDefaultColors()
//font style
@@ -86,6 +87,7 @@ public class PydevPrefsInitializer extends AbstractPreferenceInitializer{
node.putInt(PydevEditorPrefs.BACKQUOTES_STYLE, PydevEditorPrefs.DEFAULT_BACKQUOTES_STYLE);
node.putInt(PydevEditorPrefs.CLASS_NAME_STYLE, PydevEditorPrefs.DEFAULT_CLASS_NAME_STYLE);
node.putInt(PydevEditorPrefs.FUNC_NAME_STYLE, PydevEditorPrefs.DEFAULT_FUNC_NAME_STYLE);
+ node.putInt(PydevEditorPrefs.OPERATOR_STYLE, PydevEditorPrefs.DEFAULT_OPERATOR_STYLE);
//no UI
node.putInt(PydevEditorPrefs.CONNECT_TIMEOUT, PydevEditorPrefs.DEFAULT_CONNECT_TIMEOUT);
diff --git a/org.python.pydev/src/org/python/pydev/ui/ColorAndStyleCache.java b/org.python.pydev/src/org/python/pydev/ui/ColorAndStyleCache.java
index 651e652..227b99a 100644
--- a/org.python.pydev/src/org/python/pydev/ui/ColorAndStyleCache.java
+++ b/org.python.pydev/src/org/python/pydev/ui/ColorAndStyleCache.java
@@ -137,6 +137,19 @@ public class ColorAndStyleCache extends ColorCache{
return new TextAttribute(getNamedColor(
PydevEditorPrefs.FUNC_NAME_COLOR), null, preferences.getInt(PydevEditorPrefs.FUNC_NAME_STYLE));
}
+
+ @SuppressWarnings("unchecked")
+ public TextAttribute getOperatorTextAttribute() {
+ List<IPydevPreferencesProvider> participants = ExtensionHelper.getParticipants(ExtensionHelper.PYDEV_PREFERENCES_PROVIDER);
+ for (IPydevPreferencesProvider iPydevPreferencesProvider : participants) {
+ TextAttribute textAttribute = iPydevPreferencesProvider.getOperatorTextAttribute();
+ if(textAttribute != null){
+ return textAttribute;
+ }
+ }
+ return new TextAttribute(getNamedColor(
+ PydevEditorPrefs.OPERATOR_COLOR), null, preferences.getInt(PydevEditorPrefs.OPERATOR_STYLE));
+ }
@SuppressWarnings("unchecked")
public TextAttribute getCommentTextAttribute() {
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment