218 lines
6.0 KiB
Nix
218 lines
6.0 KiB
Nix
# 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/>.
|
|
{ lib, stdenv, elispPkgs, srcDir, emacsPackagesFor, ourPackages, direnv
|
|
, makeDesktopItem, nix
|
|
|
|
, nil, # nix lsp server
|
|
|
|
# python deps
|
|
python311, python3Packages,
|
|
# This is a set of system tools required for FG42
|
|
# to work.
|
|
pyright, emacs, ripgrep, git, texinfo, vazir-fonts, 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;
|
|
let
|
|
version = "4.0.0";
|
|
getPkg = epkgs: pkg:
|
|
if hasAttr pkg epkgs then getAttr pkg epkgs else getAttr pkg ourPackages;
|
|
|
|
emacsBundle = (emacsPackagesFor emacs).withPackages (epkgs:
|
|
(map (x: getPkg epkgs x) elispPkgs)
|
|
++ [ epkgs.treesit-grammars.with-all-grammars ]);
|
|
|
|
maintainers = import ./maintainers.nix;
|
|
|
|
dicts = aspellWithDicts (dicts: with dicts; [ en en-computers en-science ]);
|
|
|
|
runtimeBins = [
|
|
ripgrep git tree-sitter direnv nix nil dicts fd
|
|
]
|
|
++ (lib.optional (!stdenv.buildPlatform.isRiscV) [
|
|
# Not supported on Risc-V
|
|
ltex-ls
|
|
])
|
|
++ (lib.optional supportPython [
|
|
python311
|
|
# Python deps
|
|
python311
|
|
pyright
|
|
|
|
python3Packages.black
|
|
python3Packages.pylint
|
|
python3Packages.flake8
|
|
]) ++ (lib.optional supportVerilog [ svls ])
|
|
++ (lib.optional (supportVerilog && stdenv.isLinux) [
|
|
# SystemC is required by verilator that at the
|
|
# moment is only available on Linux
|
|
verilator
|
|
]) ++ (lib.optional (supportWM && stdenv.isLinux) [
|
|
# Window manager supports works on Linux only
|
|
xorg.xhost
|
|
slock
|
|
]);
|
|
|
|
paths = map (x: "${x}/bin/") (lib.lists.flatten runtimeBins);
|
|
pathsStr = lib.strings.concatStrings (lib.strings.intersperse ":" paths);
|
|
|
|
mimes = import ./mimes.nix;
|
|
|
|
in stdenv.mkDerivation (final: rec {
|
|
inherit version;
|
|
pname = "fg42";
|
|
|
|
desktop = makeDesktopItem {
|
|
name = "FG42";
|
|
desktopName = "FG42";
|
|
exec = "${placeholder "out"}/bin/fg42 %F";
|
|
comment = "Emacs Editor for advance users";
|
|
};
|
|
|
|
src = srcDir;
|
|
outputs = [ "out" ];
|
|
|
|
buildPhase = ''
|
|
LISPDIR=$out/share/fg42/
|
|
mkdir -p $out/bin
|
|
mkdir -p $out/share/applications/
|
|
install -d $LISPDIR
|
|
|
|
cp -rv ${src}/lisp/ $LISPDIR
|
|
cp -rv ${src}/share $out/
|
|
cp -rv ${src}/snippets $LISPDIR/snippets
|
|
|
|
cat >> $out/share/applications/FG42.desktop << EOF
|
|
[Desktop Entry]
|
|
Encoding=UTF-8
|
|
Name=FG42
|
|
GenericName=FG42
|
|
Comment=The nix base Emacs bundle for advance users
|
|
MimeType=${mimes.mimeTypes}
|
|
Type=Application
|
|
Terminal=false
|
|
Categories=Development;TextEditor;
|
|
StartupWMClass=FG42
|
|
Exec=${placeholder "out"}/bin/fg42
|
|
Icon=fg42
|
|
Version=${version}
|
|
EOF
|
|
|
|
runHook preBuild
|
|
|
|
cd $LISPDIR
|
|
emacs -L . --batch -f batch-byte-compile *.el
|
|
cd -
|
|
|
|
cat >> $out/bin/fg42 << EOF
|
|
#!${stdenv.shell}
|
|
|
|
export FG42_HOME=${placeholder "out"}/share/fg42/
|
|
export FG42_EMACSD=~/.fg42/v4/emacs.d
|
|
export FG42_USE_NIX=true;
|
|
export PATH=${pathsStr}:$PATH
|
|
|
|
LIBRARY_PATH="\$(${stdenv.cc}/bin/cc -print-file-name=libgccjit.so):\$LIBRARY_PATH" \
|
|
FG42_WM=fales ${emacsBundle}/bin/emacs \
|
|
--name FG42 \
|
|
-q --no-splash --title FG42 \
|
|
-l \$FG42_HOME/lisp/fg42/init.el "\$@"
|
|
EOF
|
|
chmod +x $out/bin/fg42
|
|
runHook postBuild
|
|
|
|
cat >> $out/bin/fg42-wm << EOF
|
|
#!${stdenv.shell}
|
|
|
|
export FG42_HOME=${placeholder "out"}/share/fg42/
|
|
export FG42_EMACSD=~/.fg42/v4/emacs.d
|
|
export FG42_USE_NIX=true;
|
|
export PATH=${pathsStr}:\$PATH
|
|
|
|
# Disable access control for the current user.
|
|
${xorg.xhost}/bin/xhost +SI:localuser:\$USER
|
|
|
|
# Make Java applications aware this is a non-reparenting window manager.
|
|
export _JAVA_AWT_WM_NONREPARENTING=1
|
|
|
|
# Set default cursor.
|
|
xsetroot -cursor_name left_ptr
|
|
|
|
# Set keyboard repeat rate.
|
|
xset r rate 400 30
|
|
|
|
# Uncomment the following block to use the exwm-xim module.
|
|
# export XMODIFIERS=@im=exwm-xim
|
|
# export GTK_IM_MODULE=xim
|
|
# export QT_IM_MODULE=xim
|
|
# export CLUTTER_IM_MODULE=xim
|
|
|
|
LIBRARY_PATH="\$(${stdenv.cc}/bin/cc -print-file-name=libgccjit.so):\$LIBRARY_PATH" \
|
|
FG42_WM=true ${emacsBundle}/bin/emacs \
|
|
--name FG42 \
|
|
-q --no-splash --title FG42 \
|
|
-l \$FG42_HOME/lisp/fg42/init.el "\$@"
|
|
EOF
|
|
chmod +x $out/bin/fg42-wm
|
|
|
|
cat >> $out/share/runtiem_deps << EOF
|
|
${vazir-fonts}
|
|
${fira-code}
|
|
${fira-mono}
|
|
${nerdfonts}
|
|
${noto-fonts}
|
|
${lib.strings.concatLines paths}
|
|
${desktop}/share/applications/FG42.desktop
|
|
EOF
|
|
|
|
runHook postBuild
|
|
'';
|
|
|
|
installPhase = ''
|
|
runHook preInstall
|
|
|
|
#LISPDIR=$out/share/fg42/lisp/
|
|
#emacs --batch -l package --eval "(package-generate-autoloads \"${pname}\" \"$LISPDIR\")"
|
|
|
|
runHook postInstall
|
|
'';
|
|
|
|
buildInputs = [ emacs emacsBundle git texinfo gcc bash ];
|
|
|
|
addEmacsNativeLoadPath = true;
|
|
|
|
meta = {
|
|
broken = false;
|
|
platforms = emacs.meta.platforms;
|
|
homepage = "https://fg42.org/";
|
|
maintainers = [ maintainers.lxsameer ];
|
|
description = "The mighty editor for the emacsians";
|
|
longDescription = ''
|
|
FG42 is a framework to create and editor and window manager based on GNU/Emacs.
|
|
It has a pre-defined setup as well which can be installed out of the box. But the
|
|
goal of this project is to provide the API necessary to create an integrated editor.
|
|
|
|
So you need to know about Emacs in advance.
|
|
'';
|
|
license = lib.licenses.gpl3Plus;
|
|
};
|
|
|
|
})
|