Reformat all the nix files using nixpkgs-fmt
This commit is contained in:
parent
7659a028f7
commit
38986f37da
11
nix/deps.nix
11
nix/deps.nix
|
@ -13,14 +13,15 @@
|
||||||
#
|
#
|
||||||
# You should have received a copy of the GNU General Public License
|
# You should have received a copy of the GNU General Public License
|
||||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
{ pkgs, lib, elispDepsFile }:
|
{ pkgs, lib, elispDepsFile }:
|
||||||
with builtins;
|
with builtins;
|
||||||
let
|
let
|
||||||
reader = import ./elisp_reader.nix { inherit lib; };
|
reader = import ./elisp_reader.nix { inherit lib; };
|
||||||
elispAst = reader.fromElisp (builtins.readFile elispDepsFile);
|
elispAst = reader.fromElisp (builtins.readFile elispDepsFile);
|
||||||
dependsOnForm = filter (x: head x == "depends-on") elispAst;
|
dependsOnForm = filter (x: head x == "depends-on") elispAst;
|
||||||
elispPkgs = if length dependsOnForm == 0
|
elispPkgs =
|
||||||
then throw "Can't find the form 'depends-on' on 'deps.el'"
|
if length dependsOnForm == 0
|
||||||
else tail (head dependsOnForm);
|
then throw "Can't find the form 'depends-on' on 'deps.el'"
|
||||||
in elispPkgs
|
else tail (head dependsOnForm);
|
||||||
|
in
|
||||||
|
elispPkgs
|
||||||
|
|
|
@ -1,33 +0,0 @@
|
||||||
# Fg42 - Emacs Editor for advance users
|
|
||||||
#
|
|
||||||
# Copyright (c) 2010-2024 Sameer Rahmani <lxsameer@gnu.org>
|
|
||||||
#
|
|
||||||
# This program is free software; you can redistribute it and/or modify
|
|
||||||
# it under the terms of the GNU General Public License as published by
|
|
||||||
# the Free Software Foundation, version 2.
|
|
||||||
#
|
|
||||||
# This program is distributed in the hope that it will be useful,
|
|
||||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
# GNU General Public License for more details.
|
|
||||||
#
|
|
||||||
# You should have received a copy of the GNU General Public License
|
|
||||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
{ pkgs, fg42, version }:
|
|
||||||
{
|
|
||||||
desktop = pkgs.writeText "FG42.desktop" ''
|
|
||||||
[Desktop Entry]
|
|
||||||
Encoding=UTF-8
|
|
||||||
Name=FG42
|
|
||||||
GenericName=FG42
|
|
||||||
Comment=Emacs Editor for advance users
|
|
||||||
MimeType=text/x-makefile;text/x-c++hdr;text/x-c++src;text/x-java;application/x-shellscript;text/x-c;text/x-c++;text/x-ruby;text/x-python;text/x-clojure;text/css;text/html;text/x-javascript;
|
|
||||||
Type=Application
|
|
||||||
Terminal=false
|
|
||||||
Categories=Development;TextEditor;
|
|
||||||
StartupWMClass=FG42
|
|
||||||
Exec=${fg42} %F
|
|
||||||
Icon=fg42
|
|
||||||
Version=${version}
|
|
||||||
'';
|
|
||||||
}
|
|
|
@ -25,18 +25,18 @@ let
|
||||||
# but only as far in as specified by maxLength.
|
# but only as far in as specified by maxLength.
|
||||||
mkMatcher = regex: maxLength:
|
mkMatcher = regex: maxLength:
|
||||||
string:
|
string:
|
||||||
let
|
let
|
||||||
substr = substring 0 maxLength string;
|
substr = substring 0 maxLength string;
|
||||||
matched = match regex substr;
|
matched = match regex substr;
|
||||||
in
|
in
|
||||||
if matched != null then head matched else null;
|
if matched != null then head matched else null;
|
||||||
|
|
||||||
removeStrings = stringsToRemove: string:
|
removeStrings = stringsToRemove: string:
|
||||||
let
|
let
|
||||||
len = length stringsToRemove;
|
len = length stringsToRemove;
|
||||||
listOfNullStrings = genList (const "") len;
|
listOfNullStrings = genList (const "") len;
|
||||||
in
|
in
|
||||||
replaceStrings stringsToRemove listOfNullStrings string;
|
replaceStrings stringsToRemove listOfNullStrings string;
|
||||||
|
|
||||||
# Split a string of elisp into individual tokens and add useful
|
# Split a string of elisp into individual tokens and add useful
|
||||||
# metadata.
|
# metadata.
|
||||||
|
@ -73,7 +73,8 @@ let
|
||||||
matchSymbol =
|
matchSymbol =
|
||||||
let
|
let
|
||||||
symbolChar = ''([^${notInSymbol}]|\\.)'';
|
symbolChar = ''([^${notInSymbol}]|\\.)'';
|
||||||
in mkMatcher ''(${symbolChar}+)([${notInSymbol}]|$).*'' symbolMaxLength;
|
in
|
||||||
|
mkMatcher ''(${symbolChar}+)([${notInSymbol}]|$).*'' symbolMaxLength;
|
||||||
|
|
||||||
maxTokenLength = foldl' max 0 [
|
maxTokenLength = foldl' max 0 [
|
||||||
commentMaxLength
|
commentMaxLength
|
||||||
|
@ -125,173 +126,174 @@ let
|
||||||
dot = matchDot rest;
|
dot = matchDot rest;
|
||||||
symbol = matchSymbol rest;
|
symbol = matchSymbol rest;
|
||||||
in
|
in
|
||||||
if state.skip > 0 then
|
if state.skip > 0 then
|
||||||
state // {
|
state // {
|
||||||
|
pos = state.pos + 1;
|
||||||
|
skip = state.skip - 1;
|
||||||
|
line = if char == "\n" then state.line + 1 else state.line;
|
||||||
|
}
|
||||||
|
else if char == "\n" then
|
||||||
|
let
|
||||||
|
mod = state.line / 1000;
|
||||||
|
newState = {
|
||||||
pos = state.pos + 1;
|
pos = state.pos + 1;
|
||||||
skip = state.skip - 1;
|
line = state.line + 1;
|
||||||
line = if char == "\n" then state.line + 1 else state.line;
|
inherit mod;
|
||||||
}
|
};
|
||||||
else if char == "\n" then
|
in
|
||||||
let
|
state // (
|
||||||
mod = state.line / 1000;
|
# Force evaluation of old state every 1000 lines. Nix
|
||||||
newState = {
|
# doesn't have a modulo builtin, so we have to save
|
||||||
pos = state.pos + 1;
|
# the result of an integer division and compare
|
||||||
line = state.line + 1;
|
# between runs.
|
||||||
inherit mod;
|
if mod > state.mod then
|
||||||
};
|
seq state.acc newState
|
||||||
in
|
|
||||||
state // (
|
|
||||||
# Force evaluation of old state every 1000 lines. Nix
|
|
||||||
# doesn't have a modulo builtin, so we have to save
|
|
||||||
# the result of an integer division and compare
|
|
||||||
# between runs.
|
|
||||||
if mod > state.mod then
|
|
||||||
seq state.acc newState
|
|
||||||
else
|
|
||||||
newState
|
|
||||||
)
|
|
||||||
else if elem char [ " " "\t" "\r" ] then
|
|
||||||
state // {
|
|
||||||
pos = state.pos + 1;
|
|
||||||
inherit (state) line;
|
|
||||||
}
|
|
||||||
else if char == ";" then
|
|
||||||
if comment != null then
|
|
||||||
state // {
|
|
||||||
pos = state.pos + 1;
|
|
||||||
skip = (stringLength comment) - 1;
|
|
||||||
}
|
|
||||||
else throw "Unrecognized token on line ${toString state.line}: ${rest}"
|
|
||||||
else if char == "(" then
|
|
||||||
state // {
|
|
||||||
acc = state.acc ++ [{ type = "openParen"; value = "("; inherit (state) line; }];
|
|
||||||
pos = state.pos + 1;
|
|
||||||
}
|
|
||||||
else if char == ")" then
|
|
||||||
state // {
|
|
||||||
acc = state.acc ++ [{ type = "closeParen"; value = ")"; inherit (state) line; }];
|
|
||||||
pos = state.pos + 1;
|
|
||||||
}
|
|
||||||
else if char == "[" then
|
|
||||||
state // {
|
|
||||||
acc = state.acc ++ [{ type = "openBracket"; value = "["; inherit (state) line; }];
|
|
||||||
pos = state.pos + 1;
|
|
||||||
}
|
|
||||||
else if char == "]" then
|
|
||||||
state // {
|
|
||||||
acc = state.acc ++ [{ type = "closeBracket"; value = "]"; inherit (state) line; }];
|
|
||||||
pos = state.pos + 1;
|
|
||||||
}
|
|
||||||
else if char == "'" then
|
|
||||||
state // {
|
|
||||||
acc = state.acc ++ [{ type = "quote"; value = "'"; inherit (state) line; }];
|
|
||||||
pos = state.pos + 1;
|
|
||||||
}
|
|
||||||
else if char == ''"'' then
|
|
||||||
if string != null then
|
|
||||||
state // {
|
|
||||||
acc = state.acc ++ [{ type = "string"; value = string; inherit (state) line; }];
|
|
||||||
pos = state.pos + 1;
|
|
||||||
skip = (stringLength string) - 1;
|
|
||||||
}
|
|
||||||
else throw "Unrecognized token on line ${toString state.line}: ${rest}"
|
|
||||||
else if char == "#" then
|
|
||||||
let nextChar = substring 1 1 rest;
|
|
||||||
in
|
|
||||||
if nextChar == "'" then
|
|
||||||
state // {
|
|
||||||
acc = state.acc ++ [{ type = "function"; value = "#'"; inherit (state) line; }];
|
|
||||||
pos = state.pos + 1;
|
|
||||||
skip = 1;
|
|
||||||
}
|
|
||||||
else if nextChar == "&" then
|
|
||||||
if boolVector != null then
|
|
||||||
state // {
|
|
||||||
acc = state.acc ++ [{ type = "boolVector"; value = boolVector; inherit (state) line; }];
|
|
||||||
pos = state.pos + 1;
|
|
||||||
skip = (stringLength boolVector) - 1;
|
|
||||||
}
|
|
||||||
else throw "Unrecognized token on line ${toString state.line}: ${rest}"
|
|
||||||
else if nextChar == "s" then
|
|
||||||
if substring 2 1 rest == "(" then
|
|
||||||
state // {
|
|
||||||
acc = state.acc ++ [{ type = "record"; value = "#s"; inherit (state) line; }];
|
|
||||||
pos = state.pos + 1;
|
|
||||||
skip = 1;
|
|
||||||
}
|
|
||||||
else throw "List must follow #s in record on line ${toString state.line}: ${rest}"
|
|
||||||
else if nextChar == "[" then
|
|
||||||
state // {
|
|
||||||
acc = state.acc ++ [{ type = "byteCode"; value = "#"; inherit (state) line; }];
|
|
||||||
pos = state.pos + 1;
|
|
||||||
}
|
|
||||||
else if nonBase10Integer != null then
|
|
||||||
state // {
|
|
||||||
acc = state.acc ++ [{ type = "nonBase10Integer"; value = nonBase10Integer; inherit (state) line; }];
|
|
||||||
pos = state.pos + 1;
|
|
||||||
skip = (stringLength nonBase10Integer) - 1;
|
|
||||||
}
|
|
||||||
else throw "Unrecognized token on line ${toString state.line}: ${rest}"
|
|
||||||
else if elem char [ "+" "-" "." "0" "1" "2" "3" "4" "5" "6" "7" "8" "9" ] then
|
|
||||||
if integer != null then
|
|
||||||
state // {
|
|
||||||
acc = state.acc ++ [{ type = "integer"; value = integer; inherit (state) line; }];
|
|
||||||
pos = state.pos + 1;
|
|
||||||
skip = (stringLength integer) - 1;
|
|
||||||
}
|
|
||||||
else if float != null then
|
|
||||||
state // {
|
|
||||||
acc = state.acc ++ [{ type = "float"; value = float; inherit (state) line; }];
|
|
||||||
pos = state.pos + 1;
|
|
||||||
skip = (stringLength float) - 1;
|
|
||||||
}
|
|
||||||
else if dot != null then
|
|
||||||
state // {
|
|
||||||
acc = state.acc ++ [{ type = "dot"; value = dot; inherit (state) line; }];
|
|
||||||
pos = state.pos + 1;
|
|
||||||
skip = (stringLength dot) - 1;
|
|
||||||
}
|
|
||||||
else if symbol != null then
|
|
||||||
state // {
|
|
||||||
acc = state.acc ++ [{ type = "symbol"; value = symbol; inherit (state) line; }];
|
|
||||||
pos = state.pos + 1;
|
|
||||||
skip = (stringLength symbol) - 1;
|
|
||||||
}
|
|
||||||
else throw "Unrecognized token on line ${toString state.line}: ${rest}"
|
|
||||||
else if char == "?" then
|
|
||||||
if character != null then
|
|
||||||
state // {
|
|
||||||
acc = state.acc ++ [{ type = "character"; value = character; inherit (state) line; }];
|
|
||||||
pos = state.pos + 1;
|
|
||||||
skip = (stringLength character) - 1;
|
|
||||||
}
|
|
||||||
else throw "Unrecognized token on line ${toString state.line}: ${rest}"
|
|
||||||
else if char == "`" then
|
|
||||||
state // {
|
|
||||||
acc = state.acc ++ [{ type = "backquote"; value = "`"; inherit (state) line; }];
|
|
||||||
pos = state.pos + 1;
|
|
||||||
}
|
|
||||||
else if char == "," then
|
|
||||||
if substring 1 1 rest == "@" then
|
|
||||||
state // {
|
|
||||||
acc = state.acc ++ [{ type = "slice"; value = ",@"; inherit (state) line; }];
|
|
||||||
skip = 1;
|
|
||||||
pos = state.pos + 1;
|
|
||||||
}
|
|
||||||
else
|
else
|
||||||
|
newState
|
||||||
|
)
|
||||||
|
else if elem char [ " " "\t" "\r" ] then
|
||||||
|
state // {
|
||||||
|
pos = state.pos + 1;
|
||||||
|
inherit (state) line;
|
||||||
|
}
|
||||||
|
else if char == ";" then
|
||||||
|
if comment != null then
|
||||||
|
state // {
|
||||||
|
pos = state.pos + 1;
|
||||||
|
skip = (stringLength comment) - 1;
|
||||||
|
}
|
||||||
|
else throw "Unrecognized token on line ${toString state.line}: ${rest}"
|
||||||
|
else if char == "(" then
|
||||||
|
state // {
|
||||||
|
acc = state.acc ++ [{ type = "openParen"; value = "("; inherit (state) line; }];
|
||||||
|
pos = state.pos + 1;
|
||||||
|
}
|
||||||
|
else if char == ")" then
|
||||||
|
state // {
|
||||||
|
acc = state.acc ++ [{ type = "closeParen"; value = ")"; inherit (state) line; }];
|
||||||
|
pos = state.pos + 1;
|
||||||
|
}
|
||||||
|
else if char == "[" then
|
||||||
|
state // {
|
||||||
|
acc = state.acc ++ [{ type = "openBracket"; value = "["; inherit (state) line; }];
|
||||||
|
pos = state.pos + 1;
|
||||||
|
}
|
||||||
|
else if char == "]" then
|
||||||
|
state // {
|
||||||
|
acc = state.acc ++ [{ type = "closeBracket"; value = "]"; inherit (state) line; }];
|
||||||
|
pos = state.pos + 1;
|
||||||
|
}
|
||||||
|
else if char == "'" then
|
||||||
|
state // {
|
||||||
|
acc = state.acc ++ [{ type = "quote"; value = "'"; inherit (state) line; }];
|
||||||
|
pos = state.pos + 1;
|
||||||
|
}
|
||||||
|
else if char == ''"'' then
|
||||||
|
if string != null then
|
||||||
|
state // {
|
||||||
|
acc = state.acc ++ [{ type = "string"; value = string; inherit (state) line; }];
|
||||||
|
pos = state.pos + 1;
|
||||||
|
skip = (stringLength string) - 1;
|
||||||
|
}
|
||||||
|
else throw "Unrecognized token on line ${toString state.line}: ${rest}"
|
||||||
|
else if char == "#" then
|
||||||
|
let nextChar = substring 1 1 rest;
|
||||||
|
in
|
||||||
|
if nextChar == "'" then
|
||||||
|
state // {
|
||||||
|
acc = state.acc ++ [{ type = "function"; value = "#'"; inherit (state) line; }];
|
||||||
|
pos = state.pos + 1;
|
||||||
|
skip = 1;
|
||||||
|
}
|
||||||
|
else if nextChar == "&" then
|
||||||
|
if boolVector != null then
|
||||||
state // {
|
state // {
|
||||||
acc = state.acc ++ [{ type = "expand"; value = ","; inherit (state) line; }];
|
acc = state.acc ++ [{ type = "boolVector"; value = boolVector; inherit (state) line; }];
|
||||||
pos = state.pos + 1;
|
pos = state.pos + 1;
|
||||||
|
skip = (stringLength boolVector) - 1;
|
||||||
}
|
}
|
||||||
|
else throw "Unrecognized token on line ${toString state.line}: ${rest}"
|
||||||
|
else if nextChar == "s" then
|
||||||
|
if substring 2 1 rest == "(" then
|
||||||
|
state // {
|
||||||
|
acc = state.acc ++ [{ type = "record"; value = "#s"; inherit (state) line; }];
|
||||||
|
pos = state.pos + 1;
|
||||||
|
skip = 1;
|
||||||
|
}
|
||||||
|
else throw "List must follow #s in record on line ${toString state.line}: ${rest}"
|
||||||
|
else if nextChar == "[" then
|
||||||
|
state // {
|
||||||
|
acc = state.acc ++ [{ type = "byteCode"; value = "#"; inherit (state) line; }];
|
||||||
|
pos = state.pos + 1;
|
||||||
|
}
|
||||||
|
else if nonBase10Integer != null then
|
||||||
|
state // {
|
||||||
|
acc = state.acc ++ [{ type = "nonBase10Integer"; value = nonBase10Integer; inherit (state) line; }];
|
||||||
|
pos = state.pos + 1;
|
||||||
|
skip = (stringLength nonBase10Integer) - 1;
|
||||||
|
}
|
||||||
|
else throw "Unrecognized token on line ${toString state.line}: ${rest}"
|
||||||
|
else if elem char [ "+" "-" "." "0" "1" "2" "3" "4" "5" "6" "7" "8" "9" ] then
|
||||||
|
if integer != null then
|
||||||
|
state // {
|
||||||
|
acc = state.acc ++ [{ type = "integer"; value = integer; inherit (state) line; }];
|
||||||
|
pos = state.pos + 1;
|
||||||
|
skip = (stringLength integer) - 1;
|
||||||
|
}
|
||||||
|
else if float != null then
|
||||||
|
state // {
|
||||||
|
acc = state.acc ++ [{ type = "float"; value = float; inherit (state) line; }];
|
||||||
|
pos = state.pos + 1;
|
||||||
|
skip = (stringLength float) - 1;
|
||||||
|
}
|
||||||
|
else if dot != null then
|
||||||
|
state // {
|
||||||
|
acc = state.acc ++ [{ type = "dot"; value = dot; inherit (state) line; }];
|
||||||
|
pos = state.pos + 1;
|
||||||
|
skip = (stringLength dot) - 1;
|
||||||
|
}
|
||||||
else if symbol != null then
|
else if symbol != null then
|
||||||
state // {
|
state // {
|
||||||
acc = state.acc ++ [{ type = "symbol"; value = symbol; inherit (state) line; }];
|
acc = state.acc ++ [{ type = "symbol"; value = symbol; inherit (state) line; }];
|
||||||
pos = state.pos + 1;
|
pos = state.pos + 1;
|
||||||
skip = (stringLength symbol) - 1;
|
skip = (stringLength symbol) - 1;
|
||||||
}
|
}
|
||||||
|
else throw "Unrecognized token on line ${toString state.line}: ${rest}"
|
||||||
|
else if char == "?" then
|
||||||
|
if character != null then
|
||||||
|
state // {
|
||||||
|
acc = state.acc ++ [{ type = "character"; value = character; inherit (state) line; }];
|
||||||
|
pos = state.pos + 1;
|
||||||
|
skip = (stringLength character) - 1;
|
||||||
|
}
|
||||||
|
else throw "Unrecognized token on line ${toString state.line}: ${rest}"
|
||||||
|
else if char == "`" then
|
||||||
|
state // {
|
||||||
|
acc = state.acc ++ [{ type = "backquote"; value = "`"; inherit (state) line; }];
|
||||||
|
pos = state.pos + 1;
|
||||||
|
}
|
||||||
|
else if char == "," then
|
||||||
|
if substring 1 1 rest == "@" then
|
||||||
|
state // {
|
||||||
|
acc = state.acc ++ [{ type = "slice"; value = ",@"; inherit (state) line; }];
|
||||||
|
skip = 1;
|
||||||
|
pos = state.pos + 1;
|
||||||
|
}
|
||||||
else
|
else
|
||||||
throw "Unrecognized token on line ${toString state.line}: ${rest}";
|
state // {
|
||||||
in (builtins.foldl' readToken { acc = []; pos = 0; skip = 0; line = startLineNumber; mod = 0; } (stringToCharacters elisp)).acc;
|
acc = state.acc ++ [{ type = "expand"; value = ","; inherit (state) line; }];
|
||||||
|
pos = state.pos + 1;
|
||||||
|
}
|
||||||
|
else if symbol != null then
|
||||||
|
state // {
|
||||||
|
acc = state.acc ++ [{ type = "symbol"; value = symbol; inherit (state) line; }];
|
||||||
|
pos = state.pos + 1;
|
||||||
|
skip = (stringLength symbol) - 1;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
throw "Unrecognized token on line ${toString state.line}: ${rest}";
|
||||||
|
in
|
||||||
|
(builtins.foldl' readToken { acc = [ ]; pos = 0; skip = 0; line = startLineNumber; mod = 0; } (stringToCharacters elisp)).acc;
|
||||||
|
|
||||||
tokenizeElisp = elisp:
|
tokenizeElisp = elisp:
|
||||||
tokenizeElisp' { inherit elisp; };
|
tokenizeElisp' { inherit elisp; };
|
||||||
|
@ -302,41 +304,43 @@ let
|
||||||
# Convert literal value tokens in a flat list to their
|
# Convert literal value tokens in a flat list to their
|
||||||
# corresponding nix representation.
|
# corresponding nix representation.
|
||||||
parseValues = tokens:
|
parseValues = tokens:
|
||||||
map (token:
|
map
|
||||||
if token.type == "string" then
|
(token:
|
||||||
token // {
|
if token.type == "string" then
|
||||||
value = substring 1 (stringLength token.value - 2) token.value;
|
token // {
|
||||||
}
|
value = substring 1 (stringLength token.value - 2) token.value;
|
||||||
else if token.type == "integer" then
|
}
|
||||||
token // {
|
else if token.type == "integer" then
|
||||||
value = fromJSON (removeStrings ["+" "."] token.value);
|
token // {
|
||||||
}
|
value = fromJSON (removeStrings [ "+" "." ] token.value);
|
||||||
else if token.type == "symbol" && token.value == "t" then
|
}
|
||||||
token // {
|
else if token.type == "symbol" && token.value == "t" then
|
||||||
value = true;
|
token // {
|
||||||
}
|
value = true;
|
||||||
else if token.type == "float" then
|
}
|
||||||
let
|
else if token.type == "float" then
|
||||||
initial = head (match "([+-]?([[:digit:]]*[.])?[[:digit:]]+(e([+-]?[[:digit:]]+|[+](INF|NaN)))?)" token.value);
|
let
|
||||||
isSpecial = (match "(.+(e[+](INF|NaN)))" initial) != null;
|
initial = head (match "([+-]?([[:digit:]]*[.])?[[:digit:]]+(e([+-]?[[:digit:]]+|[+](INF|NaN)))?)" token.value);
|
||||||
withoutPlus = removeStrings ["+"] initial;
|
isSpecial = (match "(.+(e[+](INF|NaN)))" initial) != null;
|
||||||
withPrefix =
|
withoutPlus = removeStrings [ "+" ] initial;
|
||||||
if substring 0 1 withoutPlus == "." then
|
withPrefix =
|
||||||
"0" + withoutPlus
|
if substring 0 1 withoutPlus == "." then
|
||||||
else if substring 0 2 withoutPlus == "-." then
|
"0" + withoutPlus
|
||||||
"-0" + removeStrings ["-"] withoutPlus
|
else if substring 0 2 withoutPlus == "-." then
|
||||||
else
|
"-0" + removeStrings [ "-" ] withoutPlus
|
||||||
withoutPlus;
|
else
|
||||||
in
|
withoutPlus;
|
||||||
|
in
|
||||||
if !isSpecial && withPrefix != null then
|
if !isSpecial && withPrefix != null then
|
||||||
token // {
|
token // {
|
||||||
value = fromJSON withPrefix;
|
value = fromJSON withPrefix;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
token
|
token
|
||||||
else
|
else
|
||||||
token
|
token
|
||||||
) tokens;
|
)
|
||||||
|
tokens;
|
||||||
|
|
||||||
# Convert pairs of opening and closing tokens to their
|
# Convert pairs of opening and closing tokens to their
|
||||||
# respective collection types, i.e. lists and vectors. Also,
|
# respective collection types, i.e. lists and vectors. Also,
|
||||||
|
@ -363,52 +367,52 @@ let
|
||||||
openColl = if token.type == "openParen" then "list" else if token.type == "openBracket" then "vector" else null;
|
openColl = if token.type == "openParen" then "list" else if token.type == "openBracket" then "vector" else null;
|
||||||
closeColl = if token.type == "closeParen" then "list" else if token.type == "closeBracket" then "vector" else null;
|
closeColl = if token.type == "closeParen" then "list" else if token.type == "closeBracket" then "vector" else null;
|
||||||
in
|
in
|
||||||
if openColl != null then
|
if openColl != null then
|
||||||
state // {
|
state // {
|
||||||
acc = [ [] ] ++ seq (head state.acc) state.acc;
|
acc = [ [ ] ] ++ seq (head state.acc) state.acc;
|
||||||
inColl = [ openColl ] ++ state.inColl;
|
inColl = [ openColl ] ++ state.inColl;
|
||||||
depth = state.depth + 1;
|
depth = state.depth + 1;
|
||||||
line = [ token.line ] ++ state.line;
|
line = [ token.line ] ++ state.line;
|
||||||
}
|
}
|
||||||
else if closeColl != null then
|
else if closeColl != null then
|
||||||
if (head state.inColl) == closeColl then
|
if (head state.inColl) == closeColl then
|
||||||
let
|
|
||||||
outerColl = elemAt state.acc 1;
|
|
||||||
currColl = {
|
|
||||||
type = closeColl;
|
|
||||||
value = head state.acc;
|
|
||||||
line = head state.line;
|
|
||||||
inherit (state) depth;
|
|
||||||
};
|
|
||||||
rest = tail (tail state.acc);
|
|
||||||
in
|
|
||||||
state // seq state.acc {
|
|
||||||
acc = [ (outerColl ++ [ currColl ]) ] ++ rest;
|
|
||||||
inColl = tail state.inColl;
|
|
||||||
depth = state.depth - 1;
|
|
||||||
line = tail state.line;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
throw "Unmatched ${token.type} on line ${toString token.line}"
|
|
||||||
else if token.type == "symbol" && token.value == "nil" then
|
|
||||||
let
|
let
|
||||||
currColl = head state.acc;
|
outerColl = elemAt state.acc 1;
|
||||||
rest = tail state.acc;
|
currColl = {
|
||||||
emptyList = {
|
type = closeColl;
|
||||||
type = "list";
|
value = head state.acc;
|
||||||
depth = state.depth + 1;
|
line = head state.line;
|
||||||
value = [];
|
inherit (state) depth;
|
||||||
};
|
};
|
||||||
|
rest = tail (tail state.acc);
|
||||||
in
|
in
|
||||||
state // seq currColl { acc = [ (currColl ++ [ emptyList ]) ] ++ rest; }
|
state // seq state.acc {
|
||||||
|
acc = [ (outerColl ++ [ currColl ]) ] ++ rest;
|
||||||
|
inColl = tail state.inColl;
|
||||||
|
depth = state.depth - 1;
|
||||||
|
line = tail state.line;
|
||||||
|
}
|
||||||
else
|
else
|
||||||
let
|
throw "Unmatched ${token.type} on line ${toString token.line}"
|
||||||
currColl = head state.acc;
|
else if token.type == "symbol" && token.value == "nil" then
|
||||||
rest = tail state.acc;
|
let
|
||||||
in
|
currColl = head state.acc;
|
||||||
state // seq currColl { acc = [ (currColl ++ [ token ]) ] ++ rest; };
|
rest = tail state.acc;
|
||||||
|
emptyList = {
|
||||||
|
type = "list";
|
||||||
|
depth = state.depth + 1;
|
||||||
|
value = [ ];
|
||||||
|
};
|
||||||
|
in
|
||||||
|
state // seq currColl { acc = [ (currColl ++ [ emptyList ]) ] ++ rest; }
|
||||||
|
else
|
||||||
|
let
|
||||||
|
currColl = head state.acc;
|
||||||
|
rest = tail state.acc;
|
||||||
|
in
|
||||||
|
state // seq currColl { acc = [ (currColl ++ [ token ]) ] ++ rest; };
|
||||||
in
|
in
|
||||||
head (builtins.foldl' parseToken { acc = [ [] ]; inColl = [ null ]; depth = -1; line = []; } tokens).acc;
|
head (builtins.foldl' parseToken { acc = [ [ ] ]; inColl = [ null ]; depth = -1; line = [ ]; } tokens).acc;
|
||||||
|
|
||||||
# Handle dotted pair notation, a syntax where the car and cdr
|
# Handle dotted pair notation, a syntax where the car and cdr
|
||||||
# are represented explicitly. See
|
# are represented explicitly. See
|
||||||
|
@ -434,33 +438,35 @@ let
|
||||||
throw ''"Dotted pair notation"-dot outside list on line ${toString token.line}''
|
throw ''"Dotted pair notation"-dot outside list on line ${toString token.line}''
|
||||||
else if isList token.value then
|
else if isList token.value then
|
||||||
let
|
let
|
||||||
collectionContents = foldl' parseToken {
|
collectionContents = foldl' parseToken
|
||||||
acc = [];
|
{
|
||||||
dotted = false;
|
acc = [ ];
|
||||||
inList = token.type == "list";
|
dotted = false;
|
||||||
inherit (state) depthReduction;
|
inList = token.type == "list";
|
||||||
} token.value;
|
inherit (state) depthReduction;
|
||||||
|
}
|
||||||
|
token.value;
|
||||||
in
|
in
|
||||||
state // {
|
state // {
|
||||||
acc = state.acc ++ (
|
acc = state.acc ++ (
|
||||||
if state.dotted then
|
if state.dotted then
|
||||||
collectionContents.acc
|
collectionContents.acc
|
||||||
else
|
else
|
||||||
[
|
[
|
||||||
(token // {
|
(token // {
|
||||||
value = collectionContents.acc;
|
value = collectionContents.acc;
|
||||||
depth = token.depth - state.depthReduction;
|
depth = token.depth - state.depthReduction;
|
||||||
})
|
})
|
||||||
]
|
]
|
||||||
);
|
);
|
||||||
dotted = false;
|
dotted = false;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
state // {
|
state // {
|
||||||
acc = state.acc ++ [token];
|
acc = state.acc ++ [ token ];
|
||||||
};
|
};
|
||||||
in
|
in
|
||||||
(foldl' parseToken { acc = []; dotted = false; inList = false; depthReduction = 0; } tokens).acc;
|
(foldl' parseToken { acc = [ ]; dotted = false; inList = false; depthReduction = 0; } tokens).acc;
|
||||||
|
|
||||||
parseQuotes = tokens:
|
parseQuotes = tokens:
|
||||||
let
|
let
|
||||||
|
@ -469,35 +475,35 @@ let
|
||||||
token =
|
token =
|
||||||
if isList token'.value then
|
if isList token'.value then
|
||||||
token' // {
|
token' // {
|
||||||
value = (foldl' parseToken { acc = []; quotes = []; } token'.value).acc;
|
value = (foldl' parseToken { acc = [ ]; quotes = [ ]; } token'.value).acc;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
token';
|
token';
|
||||||
in
|
in
|
||||||
if elem token.type [ "quote" "expand" "slice" "backquote" "function" "record" "byteCode" ] then
|
if elem token.type [ "quote" "expand" "slice" "backquote" "function" "record" "byteCode" ] then
|
||||||
state // {
|
state // {
|
||||||
quotes = [ token ] ++ state.quotes;
|
quotes = [ token ] ++ state.quotes;
|
||||||
}
|
}
|
||||||
else if state.quotes != [] then
|
else if state.quotes != [ ] then
|
||||||
let
|
let
|
||||||
quote = value: token:
|
quote = value: token:
|
||||||
token // {
|
token // {
|
||||||
inherit value;
|
inherit value;
|
||||||
};
|
};
|
||||||
quotedValue = foldl' quote token state.quotes;
|
quotedValue = foldl' quote token state.quotes;
|
||||||
in
|
in
|
||||||
state // {
|
state // {
|
||||||
acc = state.acc ++ [ quotedValue ];
|
acc = state.acc ++ [ quotedValue ];
|
||||||
quotes = [];
|
quotes = [ ];
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
state // {
|
state // {
|
||||||
acc = state.acc ++ [ token ];
|
acc = state.acc ++ [ token ];
|
||||||
};
|
};
|
||||||
in
|
in
|
||||||
(foldl' parseToken { acc = []; quotes = []; } tokens).acc;
|
(foldl' parseToken { acc = [ ]; quotes = [ ]; } tokens).acc;
|
||||||
in
|
in
|
||||||
parseQuotes (parseDots (parseCollections (parseValues tokens)));
|
parseQuotes (parseDots (parseCollections (parseValues tokens)));
|
||||||
|
|
||||||
parseElisp = elisp:
|
parseElisp = elisp:
|
||||||
parseElisp' (tokenizeElisp elisp);
|
parseElisp' (tokenizeElisp elisp);
|
||||||
|
@ -508,23 +514,23 @@ let
|
||||||
if isList object.value then
|
if isList object.value then
|
||||||
map readObject object.value
|
map readObject object.value
|
||||||
else if object.type == "quote" then
|
else if object.type == "quote" then
|
||||||
["quote" (readObject object.value)]
|
[ "quote" (readObject object.value) ]
|
||||||
else if object.type == "backquote" then
|
else if object.type == "backquote" then
|
||||||
["`" (readObject object.value)]
|
[ "`" (readObject object.value) ]
|
||||||
else if object.type == "expand" then
|
else if object.type == "expand" then
|
||||||
["," (readObject object.value)]
|
[ "," (readObject object.value) ]
|
||||||
else if object.type == "slice" then
|
else if object.type == "slice" then
|
||||||
[",@" (readObject object.value)]
|
[ ",@" (readObject object.value) ]
|
||||||
else if object.type == "function" then
|
else if object.type == "function" then
|
||||||
["#'" (readObject object.value)]
|
[ "#'" (readObject object.value) ]
|
||||||
else if object.type == "byteCode" then
|
else if object.type == "byteCode" then
|
||||||
["#"] ++ (readObject object.value)
|
[ "#" ] ++ (readObject object.value)
|
||||||
else if object.type == "record" then
|
else if object.type == "record" then
|
||||||
["#s"] ++ (readObject object.value)
|
[ "#s" ] ++ (readObject object.value)
|
||||||
else
|
else
|
||||||
object.value;
|
object.value;
|
||||||
in
|
in
|
||||||
map readObject ast;
|
map readObject ast;
|
||||||
|
|
||||||
fromElisp = elisp:
|
fromElisp = elisp:
|
||||||
fromElisp' (parseElisp elisp);
|
fromElisp' (parseElisp elisp);
|
||||||
|
@ -570,135 +576,137 @@ let
|
||||||
|
|
||||||
force = expr: seq state.pos (seq state.line expr);
|
force = expr: seq state.pos (seq state.line expr);
|
||||||
in
|
in
|
||||||
if state.skip > 0 then
|
if state.skip > 0 then
|
||||||
state // force {
|
state // force {
|
||||||
pos = state.pos + 1;
|
pos = state.pos + 1;
|
||||||
skip = state.skip - 1;
|
skip = state.skip - 1;
|
||||||
line = if char == "\n" then state.line + 1 else state.line;
|
line = if char == "\n" then state.line + 1 else state.line;
|
||||||
leadingWhitespace = char == "\n" || (state.leadingWhitespace && elem char [ " " "\t" "\r" ]);
|
leadingWhitespace = char == "\n" || (state.leadingWhitespace && elem char [ " " "\t" "\r" ]);
|
||||||
}
|
}
|
||||||
else if char == "#" && state.leadingWhitespace && !state.readBody && beginCodeBlock != null then
|
else if char == "#" && state.leadingWhitespace && !state.readBody && beginCodeBlock != null then
|
||||||
|
state // {
|
||||||
|
pos = state.pos + 1;
|
||||||
|
skip = (stringLength beginCodeBlock) - 1;
|
||||||
|
leadingWhitespace = false;
|
||||||
|
readLanguage = true;
|
||||||
|
}
|
||||||
|
else if char == "#" && state.leadingWhitespace && !state.readBody && header != null then
|
||||||
|
state // {
|
||||||
|
pos = state.pos + 1;
|
||||||
|
skip = (stringLength header) - 1;
|
||||||
|
leadingWhitespace = false;
|
||||||
|
readFlags = true;
|
||||||
|
}
|
||||||
|
else if state.readLanguage then
|
||||||
|
if language != null then
|
||||||
state // {
|
state // {
|
||||||
|
block = state.block // {
|
||||||
|
language = elemAt language 1;
|
||||||
|
};
|
||||||
pos = state.pos + 1;
|
pos = state.pos + 1;
|
||||||
skip = (stringLength beginCodeBlock) - 1;
|
skip = (foldl' (total: string: total + (stringLength string)) 0 language) - 1;
|
||||||
leadingWhitespace = false;
|
|
||||||
readLanguage = true;
|
|
||||||
}
|
|
||||||
else if char == "#" && state.leadingWhitespace && !state.readBody && header != null then
|
|
||||||
state // {
|
|
||||||
pos = state.pos + 1;
|
|
||||||
skip = (stringLength header) - 1;
|
|
||||||
leadingWhitespace = false;
|
leadingWhitespace = false;
|
||||||
|
readLanguage = false;
|
||||||
readFlags = true;
|
readFlags = true;
|
||||||
|
readBody = true;
|
||||||
}
|
}
|
||||||
else if state.readLanguage then
|
else throw "Language missing or invalid for code block on line ${toString state.line}!"
|
||||||
if language != null then
|
else if state.readFlags then
|
||||||
state // {
|
if flags != null then
|
||||||
block = state.block // {
|
let
|
||||||
language = elemAt language 1;
|
parseFlag = state: item:
|
||||||
};
|
let
|
||||||
pos = state.pos + 1;
|
prefix = if isString item then substring 0 1 item else null;
|
||||||
skip = (foldl' (total: string: total + (stringLength string)) 0 language) - 1;
|
in
|
||||||
leadingWhitespace = false;
|
if elem prefix [ ":" "-" "+" ] then
|
||||||
readLanguage = false;
|
state // {
|
||||||
readFlags = true;
|
acc = state.acc // { ${item} = true; };
|
||||||
readBody = true;
|
flag = item;
|
||||||
}
|
}
|
||||||
else throw "Language missing or invalid for code block on line ${toString state.line}!"
|
else if state.flag != null then
|
||||||
else if state.readFlags then
|
state // {
|
||||||
if flags != null then
|
acc = state.acc // { ${state.flag} = item; };
|
||||||
let
|
flag = null;
|
||||||
parseFlag = state: item:
|
}
|
||||||
let
|
else
|
||||||
prefix = if isString item then substring 0 1 item else null;
|
state;
|
||||||
in
|
in
|
||||||
if elem prefix [ ":" "-" "+" ] then
|
|
||||||
state // {
|
|
||||||
acc = state.acc // { ${item} = true; };
|
|
||||||
flag = item;
|
|
||||||
}
|
|
||||||
else if state.flag != null then
|
|
||||||
state // {
|
|
||||||
acc = state.acc // { ${state.flag} = item; };
|
|
||||||
flag = null;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
state;
|
|
||||||
in
|
|
||||||
state // {
|
|
||||||
block = state.block // {
|
|
||||||
flags =
|
|
||||||
(foldl'
|
|
||||||
parseFlag
|
|
||||||
{ acc = state.block.flags;
|
|
||||||
flag = null;
|
|
||||||
inherit (state) line;
|
|
||||||
}
|
|
||||||
(fromElisp flags)).acc;
|
|
||||||
startLineNumber = state.line + 1;
|
|
||||||
};
|
|
||||||
pos = state.pos + 1;
|
|
||||||
skip = (stringLength flags) - 1;
|
|
||||||
line = if char == "\n" then state.line + 1 else state.line;
|
|
||||||
leadingWhitespace = char == "\n";
|
|
||||||
readFlags = false;
|
|
||||||
}
|
|
||||||
else throw "Arguments malformed for code block on line ${toString state.line}!"
|
|
||||||
else if char == "#" && state.leadingWhitespace && endCodeBlock != null then
|
|
||||||
state // {
|
state // {
|
||||||
acc = state.acc ++ [ state.block ];
|
block = state.block // {
|
||||||
block = {
|
flags =
|
||||||
language = null;
|
(foldl'
|
||||||
body = "";
|
parseFlag
|
||||||
flags = {};
|
{
|
||||||
|
acc = state.block.flags;
|
||||||
|
flag = null;
|
||||||
|
inherit (state) line;
|
||||||
|
}
|
||||||
|
(fromElisp flags)).acc;
|
||||||
|
startLineNumber = state.line + 1;
|
||||||
};
|
};
|
||||||
pos = state.pos + 1;
|
pos = state.pos + 1;
|
||||||
skip = (stringLength endCodeBlock) - 1;
|
skip = (stringLength flags) - 1;
|
||||||
leadingWhitespace = false;
|
line = if char == "\n" then state.line + 1 else state.line;
|
||||||
readBody = false;
|
leadingWhitespace = char == "\n";
|
||||||
|
readFlags = false;
|
||||||
}
|
}
|
||||||
else if state.readBody then
|
else throw "Arguments malformed for code block on line ${toString state.line}!"
|
||||||
let
|
else if char == "#" && state.leadingWhitespace && endCodeBlock != null then
|
||||||
mod = state.pos / 100;
|
state // {
|
||||||
newState = {
|
acc = state.acc ++ [ state.block ];
|
||||||
block = state.block // {
|
block = {
|
||||||
body = state.block.body + char;
|
language = null;
|
||||||
};
|
body = "";
|
||||||
inherit mod;
|
flags = { };
|
||||||
pos = state.pos + 1;
|
};
|
||||||
line = if char == "\n" then state.line + 1 else state.line;
|
pos = state.pos + 1;
|
||||||
leadingWhitespace = char == "\n" || (state.leadingWhitespace && elem char [ " " "\t" "\r" ]);
|
skip = (stringLength endCodeBlock) - 1;
|
||||||
|
leadingWhitespace = false;
|
||||||
|
readBody = false;
|
||||||
|
}
|
||||||
|
else if state.readBody then
|
||||||
|
let
|
||||||
|
mod = state.pos / 100;
|
||||||
|
newState = {
|
||||||
|
block = state.block // {
|
||||||
|
body = state.block.body + char;
|
||||||
};
|
};
|
||||||
in
|
inherit mod;
|
||||||
if mod > state.mod then
|
|
||||||
state // seq state.block.body (force newState)
|
|
||||||
else
|
|
||||||
state // newState
|
|
||||||
else
|
|
||||||
state // force {
|
|
||||||
pos = state.pos + 1;
|
pos = state.pos + 1;
|
||||||
line = if char == "\n" then state.line + 1 else state.line;
|
line = if char == "\n" then state.line + 1 else state.line;
|
||||||
leadingWhitespace = char == "\n" || (state.leadingWhitespace && elem char [ " " "\t" "\r" ]);
|
leadingWhitespace = char == "\n" || (state.leadingWhitespace && elem char [ " " "\t" "\r" ]);
|
||||||
};
|
};
|
||||||
in
|
in
|
||||||
(foldl'
|
if mod > state.mod then
|
||||||
parseToken
|
state // seq state.block.body (force newState)
|
||||||
{ acc = [];
|
else
|
||||||
mod = 0;
|
state // newState
|
||||||
pos = 0;
|
else
|
||||||
skip = 0;
|
state // force {
|
||||||
line = 1;
|
pos = state.pos + 1;
|
||||||
block = {
|
line = if char == "\n" then state.line + 1 else state.line;
|
||||||
language = null;
|
leadingWhitespace = char == "\n" || (state.leadingWhitespace && elem char [ " " "\t" "\r" ]);
|
||||||
body = "";
|
|
||||||
flags = {};
|
|
||||||
};
|
};
|
||||||
leadingWhitespace = true;
|
in
|
||||||
readLanguage = false;
|
(foldl'
|
||||||
readFlags = false;
|
parseToken
|
||||||
readBody = false;
|
{
|
||||||
}
|
acc = [ ];
|
||||||
(stringToCharacters text)).acc;
|
mod = 0;
|
||||||
|
pos = 0;
|
||||||
|
skip = 0;
|
||||||
|
line = 1;
|
||||||
|
block = {
|
||||||
|
language = null;
|
||||||
|
body = "";
|
||||||
|
flags = { };
|
||||||
|
};
|
||||||
|
leadingWhitespace = true;
|
||||||
|
readLanguage = false;
|
||||||
|
readFlags = false;
|
||||||
|
readBody = false;
|
||||||
|
}
|
||||||
|
(stringToCharacters text)).acc;
|
||||||
|
|
||||||
# Run tokenizeElisp' on all Elisp code blocks (with `:tangle yes`
|
# Run tokenizeElisp' on all Elisp code blocks (with `:tangle yes`
|
||||||
# set) from an Org mode babel text. If the block doesn't have a
|
# set) from an Org mode babel text. If the block doesn't have a
|
||||||
|
@ -712,19 +720,19 @@ let
|
||||||
tangle = toLower (block.flags.":tangle" or defaultArgs.":tangle" or "no");
|
tangle = toLower (block.flags.":tangle" or defaultArgs.":tangle" or "no");
|
||||||
language = toLower block.language;
|
language = toLower block.language;
|
||||||
in
|
in
|
||||||
elem language [ "elisp" "emacs-lisp" ]
|
elem language [ "elisp" "emacs-lisp" ]
|
||||||
&& elem tangle [ "yes" ''"yes"'' ])
|
&& elem tangle [ "yes" ''"yes"'' ])
|
||||||
(parseOrgModeBabel text);
|
(parseOrgModeBabel text);
|
||||||
in
|
in
|
||||||
foldl'
|
foldl'
|
||||||
(result: codeBlock:
|
(result: codeBlock:
|
||||||
result ++ (tokenizeElisp' {
|
result ++ (tokenizeElisp' {
|
||||||
elisp = codeBlock.body;
|
elisp = codeBlock.body;
|
||||||
inherit (codeBlock) startLineNumber;
|
inherit (codeBlock) startLineNumber;
|
||||||
})
|
})
|
||||||
)
|
)
|
||||||
[]
|
[ ]
|
||||||
codeBlocks;
|
codeBlocks;
|
||||||
|
|
||||||
tokenizeOrgModeBabelElisp =
|
tokenizeOrgModeBabelElisp =
|
||||||
tokenizeOrgModeBabelElisp' {
|
tokenizeOrgModeBabelElisp' {
|
||||||
|
|
|
@ -13,10 +13,15 @@
|
||||||
#
|
#
|
||||||
# You should have received a copy of the GNU General Public License
|
# You should have received a copy of the GNU General Public License
|
||||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
{ lib, stdenv, emacs29, callPackage, writeShellApplication, noether
|
{ lib
|
||||||
, emacsParams ? {},
|
, stdenv
|
||||||
fg42Params ? {}
|
, emacs29
|
||||||
} :
|
, callPackage
|
||||||
|
, writeShellApplication
|
||||||
|
, noether
|
||||||
|
, emacsParams ? { }
|
||||||
|
, fg42Params ? { }
|
||||||
|
}:
|
||||||
let
|
let
|
||||||
lemacs = emacs29.override ({
|
lemacs = emacs29.override ({
|
||||||
withTreeSitter = true;
|
withTreeSitter = true;
|
||||||
|
@ -44,7 +49,8 @@ let
|
||||||
runtimeInputs = [ fg42 ];
|
runtimeInputs = [ fg42 ];
|
||||||
|
|
||||||
text = ''
|
text = ''
|
||||||
DISPLAY=:1 ${fg42}/bin/fg42-wm
|
DISPLAY=:1 ${fg42}/bin/fg42-wm
|
||||||
'';
|
'';
|
||||||
};
|
};
|
||||||
in { inherit fg42 run-test-wm; }
|
in
|
||||||
|
{ inherit fg42 run-test-wm; }
|
||||||
|
|
65
nix/fg42.nix
65
nix/fg42.nix
|
@ -13,21 +13,49 @@
|
||||||
#
|
#
|
||||||
# You should have received a copy of the GNU General Public License
|
# You should have received a copy of the GNU General Public License
|
||||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
{ lib, stdenv, elispPkgs, srcDir, emacsPackagesFor, ourPackages, direnv
|
{ lib
|
||||||
, makeFontsConf, nix, nixpkgs-fmt
|
, stdenv
|
||||||
, nil, # nix lsp server
|
, elispPkgs
|
||||||
|
, srcDir
|
||||||
|
, emacsPackagesFor
|
||||||
|
, ourPackages
|
||||||
|
, direnv
|
||||||
|
, makeFontsConf
|
||||||
|
, nix
|
||||||
|
, nixpkgs-fmt
|
||||||
|
, nil
|
||||||
|
, # nix lsp server
|
||||||
|
|
||||||
# python deps
|
# python deps
|
||||||
python311, python3Packages,
|
python311
|
||||||
# This is a set of system tools required for FG42
|
, python3Packages
|
||||||
|
, # This is a set of system tools required for FG42
|
||||||
# to work.
|
# to work.
|
||||||
pyright, emacs, ripgrep, git, texinfo, vazir-fonts, fira-code, nerdfonts
|
pyright
|
||||||
, fira-mono, noto-fonts, gcc, ltex-ls, bash, tree-sitter, fd
|
, emacs
|
||||||
, aspellWithDicts,
|
, ripgrep
|
||||||
|
, git
|
||||||
supportWM ? true, xorg, slock,
|
, texinfo
|
||||||
|
, vazir-fonts
|
||||||
supportPython ? true, supportVerilog ? true, svls, verilator, }:
|
, fira-code
|
||||||
|
, nerdfonts
|
||||||
|
, fira-mono
|
||||||
|
, noto-fonts
|
||||||
|
, gcc
|
||||||
|
, ltex-ls
|
||||||
|
, bash
|
||||||
|
, tree-sitter
|
||||||
|
, fd
|
||||||
|
, aspellWithDicts
|
||||||
|
, supportWM ? true
|
||||||
|
, xorg
|
||||||
|
, slock
|
||||||
|
, supportPython ? true
|
||||||
|
, supportVerilog ? true
|
||||||
|
, svls
|
||||||
|
, verilator
|
||||||
|
,
|
||||||
|
}:
|
||||||
with builtins;
|
with builtins;
|
||||||
let
|
let
|
||||||
version = "4.0.0";
|
version = "4.0.0";
|
||||||
|
@ -43,7 +71,15 @@ let
|
||||||
dicts = aspellWithDicts (dicts: with dicts; [ en en-computers en-science ]);
|
dicts = aspellWithDicts (dicts: with dicts; [ en en-computers en-science ]);
|
||||||
|
|
||||||
runtimeBins = [
|
runtimeBins = [
|
||||||
ripgrep git tree-sitter direnv nix nil dicts fd nixpkgs-fmt
|
ripgrep
|
||||||
|
git
|
||||||
|
tree-sitter
|
||||||
|
direnv
|
||||||
|
nix
|
||||||
|
nil
|
||||||
|
dicts
|
||||||
|
fd
|
||||||
|
nixpkgs-fmt
|
||||||
]
|
]
|
||||||
++ (lib.optional (!stdenv.buildPlatform.isRiscV) [
|
++ (lib.optional (!stdenv.buildPlatform.isRiscV) [
|
||||||
# Not supported on Risc-V
|
# Not supported on Risc-V
|
||||||
|
@ -83,7 +119,8 @@ let
|
||||||
];
|
];
|
||||||
};
|
};
|
||||||
|
|
||||||
in stdenv.mkDerivation (final: rec {
|
in
|
||||||
|
stdenv.mkDerivation (final: rec {
|
||||||
inherit version;
|
inherit version;
|
||||||
pname = "fg42";
|
pname = "fg42";
|
||||||
src = srcDir;
|
src = srcDir;
|
||||||
|
|
|
@ -18,7 +18,7 @@
|
||||||
lxsameer = {
|
lxsameer = {
|
||||||
email = "lxsameer@lxsameer.com";
|
email = "lxsameer@lxsameer.com";
|
||||||
github = "lxsameer";
|
github = "lxsameer";
|
||||||
git = "lxsameer";
|
git = "lxsameer";
|
||||||
matrix = "@lxsameer:matrix.org";
|
matrix = "@lxsameer:matrix.org";
|
||||||
name = "Sameer Rahmani";
|
name = "Sameer Rahmani";
|
||||||
keys = [{
|
keys = [{
|
||||||
|
|
133
nix/parse.nix
133
nix/parse.nix
|
@ -22,76 +22,77 @@ let
|
||||||
(x: builtins.typeOf x == "string")
|
(x: builtins.typeOf x == "string")
|
||||||
(builtins.split _sep _s);
|
(builtins.split _sep _s);
|
||||||
|
|
||||||
in {
|
in
|
||||||
elispStr
|
{ elispStr
|
||||||
, alwaysEnsure ? false
|
, alwaysEnsure ? false
|
||||||
}:
|
}:
|
||||||
let
|
let
|
||||||
inherit (import ./elisp_reader.nix { inherit lib; }) fromElisp;
|
inherit (import ./elisp_reader.nix { inherit lib; }) fromElisp;
|
||||||
|
|
||||||
readFunction = fromElisp;
|
readFunction = fromElisp;
|
||||||
find = item: list:
|
find = item: list:
|
||||||
if list == [] then [] else
|
if list == [ ] then [ ] else
|
||||||
if builtins.head list == item then
|
if builtins.head list == item then
|
||||||
list
|
list
|
||||||
else
|
else
|
||||||
find item (builtins.tail list);
|
find item (builtins.tail list);
|
||||||
|
|
||||||
getKeywordValue = keyword: list:
|
getKeywordValue = keyword: list:
|
||||||
|
let
|
||||||
|
keywordList = find keyword list;
|
||||||
|
in
|
||||||
|
if keywordList != [ ] then
|
||||||
let
|
let
|
||||||
keywordList = find keyword list;
|
keywordValue = builtins.tail keywordList;
|
||||||
in
|
in
|
||||||
if keywordList != [] then
|
if keywordValue != [ ] then
|
||||||
let
|
builtins.head keywordValue
|
||||||
keywordValue = builtins.tail keywordList;
|
|
||||||
in
|
|
||||||
if keywordValue != [] then
|
|
||||||
builtins.head keywordValue
|
|
||||||
else
|
|
||||||
true
|
|
||||||
else
|
|
||||||
null;
|
|
||||||
|
|
||||||
isDisabled = item:
|
|
||||||
let
|
|
||||||
disabledValue = getKeywordValue ":disabled" item;
|
|
||||||
in
|
|
||||||
if disabledValue == [] then
|
|
||||||
false
|
|
||||||
else if builtins.isBool disabledValue then
|
|
||||||
disabledValue
|
|
||||||
else if builtins.isString disabledValue then
|
|
||||||
true
|
|
||||||
else
|
|
||||||
false;
|
|
||||||
|
|
||||||
getName = item:
|
|
||||||
let
|
|
||||||
ensureValue = getKeywordValue ":ensure" item;
|
|
||||||
usePackageName = builtins.head (builtins.tail item);
|
|
||||||
in
|
|
||||||
if builtins.isString ensureValue then
|
|
||||||
if lib.hasPrefix ":" ensureValue then
|
|
||||||
usePackageName
|
|
||||||
else
|
|
||||||
ensureValue
|
|
||||||
else if ensureValue == true || (ensureValue == null && alwaysEnsure) then
|
|
||||||
usePackageName
|
|
||||||
else
|
|
||||||
[];
|
|
||||||
|
|
||||||
recurse = item:
|
|
||||||
if builtins.isList item && item != [] then
|
|
||||||
let
|
|
||||||
packageManager = builtins.head item;
|
|
||||||
in
|
|
||||||
if builtins.elem packageManager [ "depends-on" ] then
|
|
||||||
if !(isDisabled item) then
|
|
||||||
[ packageManager (getName item) ] ++ map recurse item
|
|
||||||
else
|
|
||||||
[]
|
|
||||||
else
|
|
||||||
map recurse item
|
|
||||||
else
|
else
|
||||||
[];
|
true
|
||||||
in lib.flatten (map recurse (readFunction elispStr))
|
else
|
||||||
|
null;
|
||||||
|
|
||||||
|
isDisabled = item:
|
||||||
|
let
|
||||||
|
disabledValue = getKeywordValue ":disabled" item;
|
||||||
|
in
|
||||||
|
if disabledValue == [ ] then
|
||||||
|
false
|
||||||
|
else if builtins.isBool disabledValue then
|
||||||
|
disabledValue
|
||||||
|
else if builtins.isString disabledValue then
|
||||||
|
true
|
||||||
|
else
|
||||||
|
false;
|
||||||
|
|
||||||
|
getName = item:
|
||||||
|
let
|
||||||
|
ensureValue = getKeywordValue ":ensure" item;
|
||||||
|
usePackageName = builtins.head (builtins.tail item);
|
||||||
|
in
|
||||||
|
if builtins.isString ensureValue then
|
||||||
|
if lib.hasPrefix ":" ensureValue then
|
||||||
|
usePackageName
|
||||||
|
else
|
||||||
|
ensureValue
|
||||||
|
else if ensureValue == true || (ensureValue == null && alwaysEnsure) then
|
||||||
|
usePackageName
|
||||||
|
else
|
||||||
|
[ ];
|
||||||
|
|
||||||
|
recurse = item:
|
||||||
|
if builtins.isList item && item != [ ] then
|
||||||
|
let
|
||||||
|
packageManager = builtins.head item;
|
||||||
|
in
|
||||||
|
if builtins.elem packageManager [ "depends-on" ] then
|
||||||
|
if !(isDisabled item) then
|
||||||
|
[ packageManager (getName item) ] ++ map recurse item
|
||||||
|
else
|
||||||
|
[ ]
|
||||||
|
else
|
||||||
|
map recurse item
|
||||||
|
else
|
||||||
|
[ ];
|
||||||
|
in
|
||||||
|
lib.flatten (map recurse (readFunction elispStr))
|
||||||
|
|
Loading…
Reference in New Issue