yes thats what i did, i adapted the lex from scintilla and configured the colors the best i thougt it to be. ok so here it comes.
On Mon, Oct 4, 2010 at 11:16 AM, Nick Treleaven < [email protected]> wrote: > Hi, > > On Mon, 4 Oct 2010 10:30:46 +0100 > Mário Silva <[email protected]> wrote: > > > Hi there i made a patch to implement the highlighter to the lisp > language, i > > would like to know how i can send it for checking and implementing. > > There's already a Lisp lexer in the Scintilla project - > src/LexLisp.cxx. Maybe you would like to adapt your patch to use it? > > Also see: > http://geany.org/manual/dev/hacking.html#adding-a-filetype > > You can attach patches and submit them here. > > Regards, > Nick > _______________________________________________ > Geany-devel mailing list > [email protected] > http://lists.uvena.de/cgi-bin/mailman/listinfo/geany-devel >
Index: scintilla/include/SciLexer.h
===================================================================
--- scintilla/include/SciLexer.h (revisão 5267)
+++ scintilla/include/SciLexer.h (cópia de trabalho)
@@ -519,16 +519,19 @@
#define SCE_BAAN_WORD2 10
#define SCE_LISP_DEFAULT 0
#define SCE_LISP_COMMENT 1
-#define SCE_LISP_NUMBER 2
-#define SCE_LISP_KEYWORD 3
-#define SCE_LISP_KEYWORD_KW 4
-#define SCE_LISP_SYMBOL 5
-#define SCE_LISP_STRING 6
-#define SCE_LISP_STRINGEOL 8
-#define SCE_LISP_IDENTIFIER 9
-#define SCE_LISP_OPERATOR 10
-#define SCE_LISP_SPECIAL 11
-#define SCE_LISP_MULTI_COMMENT 12
+#define SCE_LISP_MULTI_COMMENT 2
+#define SCE_LISP_NUMBER 3
+#define SCE_LISP_KEYWORD 4
+#define SCE_LISP_SPECIAL_KEYWORD 5
+#define SCE_LISP_SYMBOL 6
+#define SCE_LISP_CHARACTER 7
+#define SCE_LISP_STRING 8
+#define SCE_LISP_STRINGEOL 9
+#define SCE_LISP_IDENTIFIER 10
+#define SCE_LISP_OPERATOR 11
+#define SCE_LISP_SPECIAL 12
+#define SCE_LISP_MACRO 13
+#define SCE_LISP_MACRO_DISPATCH 14
#define SCE_EIFFEL_DEFAULT 0
#define SCE_EIFFEL_COMMENTLINE 1
#define SCE_EIFFEL_NUMBER 2
Index: scintilla/KeyWords.cxx
===================================================================
--- scintilla/KeyWords.cxx (revisão 5267)
+++ scintilla/KeyWords.cxx (cópia de trabalho)
@@ -337,6 +337,7 @@
LINK_LEXER(lmCss);
LINK_LEXER(lmD);
LINK_LEXER(lmDiff);
+ LINK_LEXER(lmLisp);
LINK_LEXER(lmF77);
LINK_LEXER(lmForth);
LINK_LEXER(lmFortran);
Index: scintilla/Makefile.am
===================================================================
--- scintilla/Makefile.am (revisão 5267)
+++ scintilla/Makefile.am (cópia de trabalho)
@@ -19,6 +19,7 @@
LexFortran.cxx \
LexHaskell.cxx \
LexHTML.cxx \
+LexLisp.cxx \
LexLua.cxx \
LexMarkdown.cxx \
LexMatlab.cxx \
Index: src/highlighting.c
===================================================================
--- src/highlighting.c (revisão 5267)
+++ src/highlighting.c (cópia de trabalho)
@@ -1075,7 +1075,58 @@
set_sci_style(sci, SCE_DIFF_CHANGED, ft_id, 7);
}
+static void styleset_lisp_init(gint ft_id, GKeyFile *config, GKeyFile *config_home)
+{
+ new_styleset(ft_id, 15);
+ get_keyfile_style(config, config_home, "default", &style_sets[ft_id].styling[0]);
+ get_keyfile_style(config, config_home, "comment", &style_sets[ft_id].styling[1]);
+ get_keyfile_style(config, config_home, "multicomment", &style_sets[ft_id].styling[2]);
+ get_keyfile_style(config, config_home, "number", &style_sets[ft_id].styling[3]);
+ get_keyfile_style(config, config_home, "keyword", &style_sets[ft_id].styling[4]);
+ get_keyfile_style(config, config_home, "special_keyword", &style_sets[ft_id].styling[5]);
+ get_keyfile_style(config, config_home, "symbol", &style_sets[ft_id].styling[6]);
+ get_keyfile_style(config, config_home, "string", &style_sets[ft_id].styling[7]);
+ get_keyfile_style(config, config_home, "stringeol", &style_sets[ft_id].styling[8]);
+ get_keyfile_style(config, config_home, "identifier", &style_sets[ft_id].styling[9]);
+ get_keyfile_style(config, config_home, "operator", &style_sets[ft_id].styling[10]);
+ get_keyfile_style(config, config_home, "special", &style_sets[ft_id].styling[11]);
+ get_keyfile_style(config, config_home, "character", &style_sets[ft_id].styling[12]);
+ get_keyfile_style(config, config_home, "macro", &style_sets[ft_id].styling[13]);
+ get_keyfile_style(config, config_home, "macrodispatch", &style_sets[ft_id].styling[14]);
+
+ style_sets[ft_id].keywords = g_new(gchar*, 3);
+ get_keyfile_keywords(config, config_home, "keywords", ft_id, 0);
+ get_keyfile_keywords(config, config_home, "special_keywords", ft_id, 1);
+ style_sets[ft_id].keywords[2] = NULL;
+}
+
+static void styleset_lisp(ScintillaObject *sci, gint ft_id)
+{
+ apply_filetype_properties(sci, SCLEX_LISP, ft_id);
+
+ sci_set_keywords(sci, 0, style_sets[ft_id].keywords[0]);
+ sci_set_keywords(sci, 1, style_sets[ft_id].keywords[1]);
+
+ set_sci_style(sci, STYLE_DEFAULT, ft_id, 0);
+ set_sci_style(sci, SCE_LISP_DEFAULT, ft_id, 0);
+ set_sci_style(sci, SCE_LISP_COMMENT, ft_id, 1);
+ set_sci_style(sci, SCE_LISP_MULTI_COMMENT, ft_id, 2);
+ set_sci_style(sci, SCE_LISP_NUMBER, ft_id, 3);
+ set_sci_style(sci, SCE_LISP_KEYWORD, ft_id, 4);
+ set_sci_style(sci, SCE_LISP_SPECIAL_KEYWORD, ft_id, 5);
+ set_sci_style(sci, SCE_LISP_SYMBOL, ft_id, 6);
+ set_sci_style(sci, SCE_LISP_STRING, ft_id, 7);
+ set_sci_style(sci, SCE_LISP_STRINGEOL, ft_id, 8);
+ set_sci_style(sci, SCE_LISP_IDENTIFIER, ft_id, 9);
+ set_sci_style(sci, SCE_LISP_OPERATOR, ft_id, 10);
+ set_sci_style(sci, SCE_LISP_SPECIAL, ft_id, 11);
+ set_sci_style(sci, SCE_LISP_CHARACTER, ft_id, 12);
+ set_sci_style(sci, SCE_LISP_MACRO, ft_id, 13);
+ set_sci_style(sci, SCE_LISP_MACRO_DISPATCH, ft_id, 14);
+}
+
+
static void styleset_latex_init(gint ft_id, GKeyFile *config, GKeyFile *config_home)
{
new_styleset(ft_id, 5);
@@ -3276,6 +3327,7 @@
init_styleset_case(GEANY_FILETYPES_CSS, styleset_css_init);
init_styleset_case(GEANY_FILETYPES_D, styleset_d_init);
init_styleset_case(GEANY_FILETYPES_DIFF, styleset_diff_init);
+ init_styleset_case(GEANY_FILETYPES_LISP, styleset_lisp_init);
init_styleset_case(GEANY_FILETYPES_DOCBOOK, styleset_docbook_init);
init_styleset_case(GEANY_FILETYPES_FERITE, styleset_ferite_init);
init_styleset_case(GEANY_FILETYPES_F77, styleset_f77_init);
@@ -3346,6 +3398,7 @@
styleset_case(GEANY_FILETYPES_CSS, styleset_css);
styleset_case(GEANY_FILETYPES_D, styleset_d);
styleset_case(GEANY_FILETYPES_DIFF, styleset_diff);
+ styleset_case(GEANY_FILETYPES_LISP, styleset_lisp);
styleset_case(GEANY_FILETYPES_DOCBOOK, styleset_docbook);
styleset_case(GEANY_FILETYPES_FERITE, styleset_ferite);
styleset_case(GEANY_FILETYPES_F77, styleset_f77);
Index: src/filetypes.c
===================================================================
--- src/filetypes.c (revisão 5267)
+++ src/filetypes.c (cópia de trabalho)
@@ -506,6 +506,17 @@
ft->comment_close = NULL;
ft->group = GEANY_FILETYPE_GROUP_MISC;
+#define LISP
+ ft = filetypes[GEANY_FILETYPES_LISP];
+ ft->lang = -2;
+ ft->name = g_strdup("Lisp");
+ filetype_make_title(ft, TITLE_FILE);
+ ft->extension = g_strdup("lisp");
+ ft->pattern = utils_strv_new("*.lisp", NULL);
+ ft->comment_open = g_strdup(";");
+ ft->comment_close = NULL;
+ ft->group = GEANY_FILETYPE_GROUP_SCRIPT;
+
#define CONF
ft = filetypes[GEANY_FILETYPES_CONF];
ft->lang = 10;
Index: src/filetypes.h
===================================================================
--- src/filetypes.h (revisão 5267)
+++ src/filetypes.h (cópia de trabalho)
@@ -59,6 +59,7 @@
GEANY_FILETYPES_AS,
GEANY_FILETYPES_R,
GEANY_FILETYPES_DIFF,
+ GEANY_FILETYPES_LISP,
GEANY_FILETYPES_HTML,
GEANY_FILETYPES_PYTHON,
GEANY_FILETYPES_CS,
Index: data/filetype_extensions.conf
===================================================================
--- data/filetype_extensions.conf (revisão 5267)
+++ data/filetype_extensions.conf (cópia de trabalho)
@@ -43,6 +43,7 @@
CMake=CMakeLists.txt;*.cmake;*.ctest;
Conf=*.conf;*.ini;config;*rc;*.cfg;*.desktop;
Diff=*.diff;*.patch;*.rej;
+Lisp=*.lisp;
NSIS=*.nsi;*.nsh;
Po=*.po;*.pot;
LaTeX=*.tex;*.sty;*.idx;*.ltx;
Index: wscript
===================================================================
--- wscript (revisão 5267)
+++ wscript (cópia de trabalho)
@@ -88,7 +88,7 @@
'scintilla/LexAda.cxx', 'scintilla/LexAsm.cxx', 'scintilla/LexBash.cxx',
'scintilla/LexBasic.cxx', 'scintilla/LexCaml.cxx', 'scintilla/LexCmake.cxx', 'scintilla/LexCPP.cxx',
'scintilla/LexCSS.cxx', 'scintilla/LexD.cxx', 'scintilla/LexForth.cxx',
- 'scintilla/LexFortran.cxx', 'scintilla/LexHaskell.cxx', 'scintilla/LexHTML.cxx',
+ 'scintilla/LexFortran.cxx', 'scintilla/LexHaskell.cxx', 'scintilla/LexHTML.cxx', 'scintilla/LexLisp.cxx'
'scintilla/LexLua.cxx', 'scintilla/LexMarkdown.cxx', 'scintilla/LexMatlab.cxx',
'scintilla/LexNsis.cxx', 'scintilla/LexOthers.cxx',
'scintilla/LexPascal.cxx', 'scintilla/LexPerl.cxx', 'scintilla/LexPython.cxx',
filetypes.lisp
Description: Binary data
// Scintilla source code edit control /** @file LexLisp.cxx ** Lexer for Lisp. ** Written by Alexey Yutkin. **/ // Copyright 1998-2001 by Neil Hodgson <[email protected]> // The License.txt file describes the conditions under which this software may be distributed. #include <stdlib.h> #include <string.h> #include <ctype.h> #include <stdarg.h> #include <stdio.h> #include <assert.h> #include "Platform.h" #include "PropSet.h" #include "Accessor.h" #include "StyleContext.h" #include "KeyWords.h" #include "Scintilla.h" #include "SciLexer.h" #include "CharacterSet.h" #ifdef SCI_NAMESPACE using namespace Scintilla; #endif static inline bool isLispoperator(char ch) { if (isascii(ch) && isalnum(ch)) return false; if (ch == '\'' || ch == '`' || ch == '(' || ch == ')' || ch == '[' || ch == ']' || ch == '{' || ch == '}') return true; return false; } static inline bool isLispwordstart(char ch) { return isascii(ch) && ch != ';' && !isspacechar(ch) && !isLispoperator(ch) && ch != '\n' && ch != '\r' && ch != '\"'; } static void classifyWordLisp(unsigned int start, unsigned int end, WordList &keywords, WordList &sp_keywords, Accessor &styler) { assert(end >= start); char s[100]; unsigned int i; bool digit_flag = true; for (i = 0; (i < end - start + 1) && (i < 99); i++) { s[i] = styler[start + i]; s[i + 1] = '\0'; if (!isdigit(s[i]) && (s[i] != '.')) digit_flag = false; } char chAttr = SCE_LISP_IDENTIFIER; if(digit_flag) chAttr = SCE_LISP_NUMBER; else { if (keywords.InList(s)) { chAttr = SCE_LISP_KEYWORD; } else if (sp_keywords.InList(s)) { chAttr = SCE_LISP_SPECIAL_KEYWORD; } else if ((s[0] == '*' && s[i-1] == '*') || (s[0] == '+' && s[i-1] == '+')) { chAttr = SCE_LISP_SPECIAL; } } styler.ColourTo(end, chAttr); return; } static void ColouriseLispDoc(unsigned int startPos, int length, int initStyle, WordList *keywordlists[], Accessor &styler) { WordList &keywords = *keywordlists[0]; WordList &sp_keywords = *keywordlists[1]; styler.StartAt(startPos); int state = initStyle, radix = -1; char chNext = styler[startPos]; unsigned int lengthDoc = startPos + length; styler.StartSegment(startPos); for (unsigned int i = startPos; i < lengthDoc; i++) { char ch = chNext; chNext = styler.SafeGetCharAt(i + 1); bool atEOL = (ch == '\r' && chNext != '\n') || (ch == '\n'); if (styler.IsLeadByte(ch)) { chNext = styler.SafeGetCharAt(i + 2); i += 1; continue; } if (state == SCE_LISP_DEFAULT) { if (ch == '#') { styler.ColourTo(i - 1, state); radix = -1; state = SCE_LISP_MACRO_DISPATCH; } else if (ch == ':' && isLispwordstart(chNext)) { styler.ColourTo(i - 1, state); state = SCE_LISP_SYMBOL; } else if (isLispwordstart(ch)) { styler.ColourTo(i - 1, state); state = SCE_LISP_IDENTIFIER; } else if (ch == ';') { styler.ColourTo(i - 1, state); state = SCE_LISP_COMMENT; } else if (isLispoperator(ch) || ch=='\'') { styler.ColourTo(i - 1, state); styler.ColourTo(i, SCE_LISP_OPERATOR); if (ch=='\'' && isLispwordstart(chNext)) { state = SCE_LISP_SYMBOL; } } else if (ch == '\"') { styler.ColourTo(i - 1, state); state = SCE_LISP_STRING; } } else if (state == SCE_LISP_IDENTIFIER || state == SCE_LISP_SYMBOL) { if (!isLispwordstart(ch)) { if (state == SCE_LISP_IDENTIFIER) { classifyWordLisp(styler.GetStartSegment(), i - 1, keywords, sp_keywords, styler); } else { styler.ColourTo(i - 1, state); } state = SCE_LISP_DEFAULT; } /*else*/ if (isLispoperator(ch) || ch=='\'') { styler.ColourTo(i - 1, state); styler.ColourTo(i, SCE_LISP_OPERATOR); if (ch=='\'' && isLispwordstart(chNext)) { state = SCE_LISP_SYMBOL; } } } else if (state == SCE_LISP_MACRO_DISPATCH) { if (!(isascii(ch) && isdigit(ch))) { if (ch != 'r' && ch != 'R' && (i - styler.GetStartSegment()) > 1) { state = SCE_LISP_DEFAULT; } else { switch (ch) { case '|': state = SCE_LISP_MULTI_COMMENT; break; case 'o': case 'O': radix = 8; state = SCE_LISP_MACRO; break; case 'x': case 'X': radix = 16; state = SCE_LISP_MACRO; break; case 'b': case 'B': radix = 2; state = SCE_LISP_MACRO; break; case '\\': state = SCE_LISP_CHARACTER; break; case ':': case '-': case '+': state = SCE_LISP_MACRO; break; case '\'': if (isLispwordstart(chNext)) { state = SCE_LISP_SPECIAL; } else { styler.ColourTo(i - 1, SCE_LISP_DEFAULT); styler.ColourTo(i, SCE_LISP_OPERATOR); state = SCE_LISP_DEFAULT; } break; default: if (isLispoperator(ch)) { styler.ColourTo(i - 1, SCE_LISP_DEFAULT); styler.ColourTo(i, SCE_LISP_OPERATOR); } state = SCE_LISP_DEFAULT; break; } } } } else if (state == SCE_LISP_MACRO) { if (isLispwordstart(ch) && (radix == -1 || IsADigit(ch, radix))) { state = SCE_LISP_SPECIAL; } else { state = SCE_LISP_DEFAULT; } } else if (state == SCE_LISP_CHARACTER) { if (isLispoperator(ch)) { styler.ColourTo(i, SCE_LISP_SPECIAL); state = SCE_LISP_DEFAULT; } else if (isLispwordstart(ch)) { styler.ColourTo(i, SCE_LISP_SPECIAL); state = SCE_LISP_SPECIAL; } else { state = SCE_LISP_DEFAULT; } } else if (state == SCE_LISP_SPECIAL) { if (!isLispwordstart(ch) || (radix != -1 && !IsADigit(ch, radix))) { styler.ColourTo(i - 1, state); state = SCE_LISP_DEFAULT; } if (isLispoperator(ch) || ch=='\'') { styler.ColourTo(i - 1, state); styler.ColourTo(i, SCE_LISP_OPERATOR); if (ch=='\'' && isLispwordstart(chNext)) { state = SCE_LISP_SYMBOL; } } } else { if (state == SCE_LISP_COMMENT) { if (atEOL) { styler.ColourTo(i - 1, state); state = SCE_LISP_DEFAULT; } } else if (state == SCE_LISP_MULTI_COMMENT) { if (ch == '|' && chNext == '#') { i++; chNext = styler.SafeGetCharAt(i + 1); styler.ColourTo(i, state); state = SCE_LISP_DEFAULT; } } else if (state == SCE_LISP_STRING) { if (ch == '\\') { if (chNext == '\"' || chNext == '\'' || chNext == '\\') { i++; chNext = styler.SafeGetCharAt(i + 1); } } else if (ch == '\"') { styler.ColourTo(i, state); state = SCE_LISP_DEFAULT; } } } } styler.ColourTo(lengthDoc - 1, state); } static void FoldLispDoc(unsigned int startPos, int length, int /* initStyle */, WordList *[], Accessor &styler) { unsigned int lengthDoc = startPos + length; int visibleChars = 0; int lineCurrent = styler.GetLine(startPos); int levelPrev = styler.LevelAt(lineCurrent) & SC_FOLDLEVELNUMBERMASK; int levelCurrent = levelPrev; char chNext = styler[startPos]; int styleNext = styler.StyleAt(startPos); for (unsigned int i = startPos; i < lengthDoc; i++) { char ch = chNext; chNext = styler.SafeGetCharAt(i + 1); int style = styleNext; styleNext = styler.StyleAt(i + 1); bool atEOL = (ch == '\r' && chNext != '\n') || (ch == '\n'); if (style == SCE_LISP_OPERATOR) { if (ch == '(' || ch == '[' || ch == '{') { levelCurrent++; } else if (ch == ')' || ch == ']' || ch == '}') { levelCurrent--; } } if (atEOL) { int lev = levelPrev; if (visibleChars == 0) lev |= SC_FOLDLEVELWHITEFLAG; if ((levelCurrent > levelPrev) && (visibleChars > 0)) lev |= SC_FOLDLEVELHEADERFLAG; if (lev != styler.LevelAt(lineCurrent)) { styler.SetLevel(lineCurrent, lev); } lineCurrent++; levelPrev = levelCurrent; visibleChars = 0; } if (!isspacechar(ch)) visibleChars++; } // Fill in the real level of the next line, keeping the current flags as they will be filled in later int flagsNext = styler.LevelAt(lineCurrent) & ~SC_FOLDLEVELNUMBERMASK; styler.SetLevel(lineCurrent, levelPrev | flagsNext); } static const char * const lispWordListDesc[] = { "Keywords", "Functions and special operators", 0 }; LexerModule lmLisp(SCLEX_LISP, ColouriseLispDoc, "lisp", FoldLispDoc, lispWordListDesc);
_______________________________________________ Geany-devel mailing list [email protected] http://lists.uvena.de/cgi-bin/mailman/listinfo/geany-devel
