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',

Attachment: 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

Reply via email to