Kaydet (Commit) b109889e authored tarafından Nick Treleaven's avatar Nick Treleaven

Add Lisp filetype (patch by Mário Silva, thanks).

Note: Lisp lexer was taken from Scintilla instead.



git-svn-id: https://geany.svn.sourceforge.net/svnroot/geany/trunk@5286 ea778897-0a13-0410-b9d1-a72fbfd435f5
üst d01434b0
......@@ -5,6 +5,12 @@
* src/dialogs.c, src/about.c, THANKS:
Group Open dialog encoding options by submenus (patch by Adam Ples,
thanks; #3047717).
* scintilla/LexLisp.cxx, scintilla/makefile.win32,
scintilla/KeyWords.cxx, scintilla/Makefile.am, src/highlighting.c,
src/about.c, src/filetypes.c, src/filetypes.h, THANKS,
data/filetype_extensions.conf, data/filetypes.lisp, wscript:
Add Lisp filetype (patch by Mário Silva, thanks).
Note: Lisp lexer was taken from Scintilla instead.
2010-10-06 Frank Lanitz <frank(at)frank(dot)uvena(dot)de>
......
......@@ -84,6 +84,7 @@ Jiří Techet <techet(at)gmail(dot)com> - Various patches
Erik de Castro Lopo <mle+tools(at)mega-nerd(dot)com> - Various patches
Thomas Huth <th(dot)huth(at)googlemail(dot)com> - Forth filetype
Adam Ples <adamples(at)users(dot)sourceforge(dot)net> - Group encodings in open dialog
Mário Silva <sharelider(at)gmail(dot)com> - Lisp filetype
Translators:
------------
......
......@@ -43,6 +43,7 @@ XML=*.xml;*.sgml;*.xsl;*.xslt;*.xsd;*.xhtml;
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;
......
This diff is collapsed.
......@@ -344,6 +344,7 @@ int Scintilla_LinkLexers() {
LINK_LEXER(lmHaskell);
LINK_LEXER(lmHTML);
LINK_LEXER(lmLatex);
LINK_LEXER(lmLISP);
LINK_LEXER(lmLua);
LINK_LEXER(lmMake);
LINK_LEXER(lmMarkdown);
......
// Scintilla source code edit control
/** @file LexLisp.cxx
** Lexer for Lisp.
** Written by Alexey Yutkin.
**/
// Copyright 1998-2001 by Neil Hodgson <neilh@scintilla.org>
// The License.txt file describes the conditions under which this software may be distributed.
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <stdio.h>
#include <stdarg.h>
#include "Platform.h"
#include "PropSet.h"
#include "Accessor.h"
#include "KeyWords.h"
#include "Scintilla.h"
#include "SciLexer.h"
#include "StyleContext.h"
#ifdef SCI_NAMESPACE
using namespace Scintilla;
#endif
#define SCE_LISP_CHARACTER 29
#define SCE_LISP_MACRO 30
#define SCE_LISP_MACRO_DISPATCH 31
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 &keywords_kw, Accessor &styler) {
PLATFORM_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 (keywords_kw.InList(s)) {
chAttr = SCE_LISP_KEYWORD_KW;
} 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 &keywords_kw = *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, keywords_kw, 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[] = {
"Functions and special operators",
"Keywords",
0
};
LexerModule lmLISP(SCLEX_LISP, ColouriseLispDoc, "lisp", FoldLispDoc, lispWordListDesc);
......@@ -19,6 +19,7 @@ LexForth.cxx \
LexFortran.cxx \
LexHaskell.cxx \
LexHTML.cxx \
LexLisp.cxx \
LexLua.cxx \
LexMarkdown.cxx \
LexMatlab.cxx \
......
......@@ -64,7 +64,7 @@ LexAda.o LexBash.o LexAsm.o LexCSS.o LexCPP.o LexHTML.o LexOthers.o LexPascal.o
LexPerl.o LexPython.o LexSQL.o LexCaml.o LexTCL.o LexTxt2tags.o LexRuby.o \
LexForth.o LexFortran.o LexVHDL.o LexVerilog.o \
LexMarkdown.o LexMatlab.o \
LexD.o LexLua.o LexHaskell.o LexBasic.o LexR.o LexYAML.o LexCmake.o LexNsis.o
LexD.o LexLisp.o LexLua.o LexHaskell.o LexBasic.o LexR.o LexYAML.o LexCmake.o LexNsis.o
#--Autogenerated -- end of automatically generated section
all: $(COMPLIB)
......
......@@ -94,7 +94,8 @@ static const gchar *contributors =
"Giuseppe Torelli, Guillaume de Rorthais, Guillaume Hoffmann, Herbert Voss, Jason Oster, "
"Jean-François Wauthy, Jeff Pohlmeyer, Jesse Mayes, Jiří Techet, "
"John Gabriele, Jon Senior, Jon Strait, Josef Whiter, "
"Jörn Reder, Kelvin Gardiner, Kevin Ellwood, Kristoffer A. Tjernås, Lex Trotman, Marko Peric, Matti Mårds, "
"Jörn Reder, Kelvin Gardiner, Kevin Ellwood, Kristoffer A. Tjernås, Lex Trotman, "
"Mário Silva, Marko Peric, Matti Mårds, "
"Moritz Barsnick, Ondrej Donek, Peter Strand, Philipp Gildein, Pierre Joye, Rob van der Linde, "
"Robert McGinley, Roland Baudin, Ross McKay, S Jagannathan, Saleem Abdulrasool, "
"Sebastian Kraft, Shiv, Slava Semushin, Stefan Oltmanns, Tamim, Thomas Huth, Thomas Martitz, Tomás Vírseda, "
......
......@@ -506,6 +506,17 @@ static void init_builtin_filetypes(void)
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_SOURCE_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;
......
......@@ -33,6 +33,7 @@
#endif
/* Do not change the order, only append. */
typedef enum
{
GEANY_FILETYPES_NONE = 0, /* first filetype is always None & must be 0 */
......@@ -85,6 +86,7 @@ typedef enum
GEANY_FILETYPES_ABC,
GEANY_FILETYPES_VERILOG,
GEANY_FILETYPES_FORTH,
GEANY_FILETYPES_LISP,
/* ^ append items here */
GEANY_MAX_BUILT_IN_FILETYPES /* Don't use this, use filetypes_array->len instead */
}
......
......@@ -1076,6 +1076,62 @@ static void styleset_diff(ScintillaObject *sci, gint ft_id)
}
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);
......@@ -3264,6 +3320,7 @@ void highlighting_init_styles(gint filetype_idx, GKeyFile *config, GKeyFile *con
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);
......@@ -3334,6 +3391,7 @@ void highlighting_set_styles(ScintillaObject *sci, GeanyFiletype *ft)
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);
......
......@@ -88,7 +88,7 @@ scintilla_sources = [
'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',
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment