-
Notifications
You must be signed in to change notification settings - Fork 4
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
0 parents
commit 87a9621
Showing
26 changed files
with
2,065 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,11 @@ | ||
.nrepl-port | ||
|
||
obj | ||
bin | ||
|
||
*.suo | ||
|
||
fs-src/ltfsclient/log.txt | ||
|
||
target | ||
|
Large diffs are not rendered by default.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,33 @@ | ||
## F# plugin for Light Table | ||
|
||
This plugin is an alpha implementation of a F# plugin for the [Light Table](http://www.lighttable.com) IDE. It can evaluate the contents of a fsharp file selection. | ||
|
||
## Installation and Usage | ||
|
||
1. From LightTable's plugin manager, choose the available tab and double-click the "F#" plugin to install it. | ||
2. fsi (fsharp interactive) should be in your PATH | ||
4. Open up a fsharp file, select some code and use `ctrl/cmd-enter` to eval it. | ||
|
||
## Requirements | ||
|
||
You'll need .NET Framework 4 and FSharp 3.0 installed | ||
|
||
## Acknowledgements | ||
|
||
The clojurescript / lighttable side started by using the Python plugin as a template. | ||
|
||
The CodeMirror file is from [CodeMirror](https://github.com/marijnh/CodeMirror) | ||
|
||
## Changelog | ||
|
||
##### 0.0.1 | ||
|
||
Initial release with eval of selections | ||
|
||
###License | ||
|
||
Copyright (C) 2014 Enrico Sada | ||
|
||
Distributed under the GPLv3, see LICENSE.md for the full text. | ||
|
||
CodeMirror file 'codemirror/fsharp.js' is under [CodeMirror license](https://github.com/marijnh/CodeMirror/blob/master/LICENSE) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,180 @@ | ||
// copied from: https://github.com/marijnh/CodeMirror/blob/master/mode/mllike/mllike.js | ||
// under license: https://github.com/marijnh/CodeMirror/blob/master/LICENSE | ||
|
||
CodeMirror.defineMode('mllike', function(_config, parserConfig) { | ||
|
||
var words = { | ||
'let': 'keyword', | ||
'rec': 'keyword', | ||
'in': 'keyword', | ||
'of': 'keyword', | ||
'and': 'keyword', | ||
'if': 'keyword', | ||
'then': 'keyword', | ||
'else': 'keyword', | ||
'for': 'keyword', | ||
'to': 'keyword', | ||
'while': 'keyword', | ||
'do': 'keyword', | ||
'done': 'keyword', | ||
'fun': 'keyword', | ||
'function': 'keyword', | ||
'val': 'keyword', | ||
'type': 'keyword', | ||
'mutable': 'keyword', | ||
'match': 'keyword', | ||
'with': 'keyword', | ||
'try': 'keyword', | ||
'open': 'builtin', | ||
'ignore': 'builtin', | ||
'begin': 'keyword', | ||
'end': 'keyword' | ||
}; | ||
|
||
var extraWords = parserConfig.extraWords || {}; | ||
for (var prop in extraWords) { | ||
if (extraWords.hasOwnProperty(prop)) { | ||
words[prop] = parserConfig.extraWords[prop]; | ||
} | ||
} | ||
|
||
function tokenBase(stream, state) { | ||
var ch = stream.next(); | ||
|
||
if (ch === '"') { | ||
state.tokenize = tokenString; | ||
return state.tokenize(stream, state); | ||
} | ||
if (ch === '(') { | ||
if (stream.eat('*')) { | ||
state.commentLevel++; | ||
state.tokenize = tokenComment; | ||
return state.tokenize(stream, state); | ||
} | ||
} | ||
if (ch === '~') { | ||
stream.eatWhile(/\w/); | ||
return 'variable-2'; | ||
} | ||
if (ch === '`') { | ||
stream.eatWhile(/\w/); | ||
return 'quote'; | ||
} | ||
if (ch === '/' && parserConfig.slashComments && stream.eat('/')) { | ||
stream.skipToEnd(); | ||
return 'comment'; | ||
} | ||
if (/\d/.test(ch)) { | ||
stream.eatWhile(/[\d]/); | ||
if (stream.eat('.')) { | ||
stream.eatWhile(/[\d]/); | ||
} | ||
return 'number'; | ||
} | ||
if ( /[+\-*&%=<>!?|]/.test(ch)) { | ||
return 'operator'; | ||
} | ||
stream.eatWhile(/\w/); | ||
var cur = stream.current(); | ||
return words[cur] || 'variable'; | ||
} | ||
|
||
function tokenString(stream, state) { | ||
var next, end = false, escaped = false; | ||
while ((next = stream.next()) != null) { | ||
if (next === '"' && !escaped) { | ||
end = true; | ||
break; | ||
} | ||
escaped = !escaped && next === '\\'; | ||
} | ||
if (end && !escaped) { | ||
state.tokenize = tokenBase; | ||
} | ||
return 'string'; | ||
}; | ||
|
||
function tokenComment(stream, state) { | ||
var prev, next; | ||
while(state.commentLevel > 0 && (next = stream.next()) != null) { | ||
if (prev === '(' && next === '*') state.commentLevel++; | ||
if (prev === '*' && next === ')') state.commentLevel--; | ||
prev = next; | ||
} | ||
if (state.commentLevel <= 0) { | ||
state.tokenize = tokenBase; | ||
} | ||
return 'comment'; | ||
} | ||
|
||
return { | ||
startState: function() {return {tokenize: tokenBase, commentLevel: 0};}, | ||
token: function(stream, state) { | ||
if (stream.eatSpace()) return null; | ||
return state.tokenize(stream, state); | ||
}, | ||
|
||
blockCommentStart: "(*", | ||
blockCommentEnd: "*)", | ||
lineComment: parserConfig.slashComments ? "//" : null | ||
}; | ||
}); | ||
|
||
CodeMirror.defineMIME('text/x-fsharp', { | ||
name: 'mllike', | ||
extraWords: { | ||
'abstract': 'keyword', | ||
'as': 'keyword', | ||
'assert': 'keyword', | ||
'base': 'keyword', | ||
'class': 'keyword', | ||
'default': 'keyword', | ||
'delegate': 'keyword', | ||
'downcast': 'keyword', | ||
'downto': 'keyword', | ||
'elif': 'keyword', | ||
'exception': 'keyword', | ||
'extern': 'keyword', | ||
'finally': 'keyword', | ||
'global': 'keyword', | ||
'inherit': 'keyword', | ||
'inline': 'keyword', | ||
'interface': 'keyword', | ||
'internal': 'keyword', | ||
'lazy': 'keyword', | ||
'let!': 'keyword', | ||
'member' : 'keyword', | ||
'module': 'keyword', | ||
'namespace': 'keyword', | ||
'new': 'keyword', | ||
'null': 'keyword', | ||
'override': 'keyword', | ||
'private': 'keyword', | ||
'public': 'keyword', | ||
'return': 'keyword', | ||
'return!': 'keyword', | ||
'select': 'keyword', | ||
'static': 'keyword', | ||
'struct': 'keyword', | ||
'upcast': 'keyword', | ||
'use': 'keyword', | ||
'use!': 'keyword', | ||
'val': 'keyword', | ||
'when': 'keyword', | ||
'yield': 'keyword', | ||
'yield!': 'keyword', | ||
|
||
'List': 'builtin', | ||
'Seq': 'builtin', | ||
'Map': 'builtin', | ||
'Set': 'builtin', | ||
'int': 'builtin', | ||
'string': 'builtin', | ||
'raise': 'builtin', | ||
'failwith': 'builtin', | ||
'not': 'builtin', | ||
'true': 'builtin', | ||
'false': 'builtin' | ||
}, | ||
slashComments: true | ||
}); |
Oops, something went wrong.