@node Emacs Interface @section Emacs Interface @cindex Emacs GNU Guix comes with a visual user interface for GNU@tie{}Emacs, known as ``guix.el''. It can be used for routine package management tasks, pretty much like the @command{guix package} command (@pxref{Invoking guix package}). Specifically, ``guix.el'' makes it easy to: @itemize @item browse and display packages and generations; @item search, install, upgrade and remove packages; @item display packages from previous generations; @item do some other useful things. @end itemize @menu * Initial Setup: Emacs Initial Setup. Preparing @file{~/.emacs}. * Usage: Emacs Usage. Using the interface. * Configuration: Emacs Configuration. Configuring the interface. * Prettify Mode: Emacs Prettify. Abbreviating @file{/gnu/store/@dots{}} file names. @end menu @node Emacs Initial Setup @subsection Initial Setup On the Guix System Distribution (@pxref{GNU Distribution}), ``guix.el'' is ready to use, provided Guix is installed system-wide, which is the case by default. So if that is what you're using, you can happily skip this section and read about the fun stuff. If you're not yet a happy user of GSD, a little bit of setup is needed. To be able to use ``guix.el'', you need to install the following packages: @itemize @item @uref{http://www.gnu.org/software/emacs/, GNU Emacs}, version 24.3 or later; @item @uref{http://nongnu.org/geiser/, Geiser}, version 0.3 or later: it is used for interacting with the Guile process. @end itemize When it is done, add the following into your init file (@pxref{Init File,,, emacs, The GNU Emacs Manual}): @example (require 'guix-init nil t) @end example However there is a chance that @code{load-path} of your Emacs does not contain a directory with ``guix.el'' (usually it is @file{/usr/share/emacs/site-lisp/}). In that case you need to add it before requiring (@pxref{Lisp Libraries,,, emacs, The GNU Emacs Manual}): @example (add-to-list 'load-path "/path/to
;;; GNU Guix --- Functional package management for GNU
;;; Copyright © 2016 Danny Milosavljevic <dannym@scratchpost.org>
;;; Copyright © 2016, 2017 Ricardo Wurmus <rekado@elephly.net>
;;; Copyright © 2016 Hartmut Goebel <h.goebel@crazy-compilers.com>
;;; Copyright © 2017-2023 Efraim Flashner <efraim@flashner.co.il>
;;; Copyright © 2018–2021 Tobias Geerinckx-Rice <me@tobias.gr>
;;; Copyright © 2018-2024 Nicolas Goaziou <mail@nicolasgoaziou.fr>
;;; Copyright © 2020 Robert Smith <robertsmith@posteo.net>
;;; Copyright © 2020 Guy Fleury Iteriteka <gfleury@disroot.org>
;;; Copyright © 2020 Jakub Kądziołka <kuba@kadziolka.net>
;;; Copyright © 2020 Prafulla Giri <pratheblackdiamond@gmail.com>
;;; Copyright © 2021 Nicolò Balzarotti <nicolo@nixo.xyz>
;;; Copyright © 2022 Luis Felipe López Acevedo <luis.felipe.la@protonmail.com>
;;; Copyright © 2023 Maxim Cournoyer <maxim.cournoyer@gmail.com>
;;; Copyright © 2024 Luis Higino <luishenriquegh2701@gmail.com>
;;;
;;; This file is part of GNU Guix.
;;;
;;; GNU Guix 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; either version 3 of the License, or (at
;;; your option) any later version.
;;;
;;; GNU Guix 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 GNU Guix.  If not, see <http://www.gnu.org/licenses/>.

(define-module (gnu packages education)
  #:use-module (ice-9 regex)
  #:use-module (gnu packages)
  #:use-module (gnu packages audio)
  #:use-module (gnu packages base)
  #:use-module (gnu packages bash)
  #:use-module (gnu packages compression)
  #:use-module (gnu packages curl)
  #:use-module (gnu packages databases)
  #:use-module (gnu packages django)
  #:use-module (gnu packages flex)
  #:use-module (gnu packages fonts)
  #:use-module (gnu packages fontutils)
  #:use-module (gnu packages freedesktop)
  #:use-module (gnu packages game-development)
  #:use-module (gnu packages gettext)
  #:use-module (gnu packages glib)
  #:use-module (gnu packages gnome)
  #:use-module (gnu packages golang)
  #:use-module (gnu packages golang-build)
  #:use-module (gnu packages golang-check)
  #:use-module (gnu packages golang-web)
  #:use-module (gnu packages golang-xyz)
  #:use-module (gnu packages gtk)
  #:use-module (gnu packages gstreamer)
  #:use-module (gnu packages image)
  #:use-module (gnu packages javascript)
  #:use-module (gnu packages kde)
  #:use-module (gnu packages kde-frameworks) ; extra-cmake-modules
  #:use-module (gnu packages linux)
  #:use-module (gnu packages mp3)
  #:use-module (gnu packages ncurses)
  #:use-module (gnu packages pdf)
  #:use-module (gnu packages perl)
  #:use-module (gnu packages pkg-config)
  #:use-module (gnu packages python)
  #:use-module (gnu packages python-web)
  #:use-module (gnu packages python-xyz)
  #:use-module (gnu packages qt)
  #:use-module (gnu packages readline)
  #:use-module (gnu packages sdl)
  #:use-module (gnu packages sqlite)
  #:use-module (gnu packages texinfo)
  #:use-module (gnu packages tls)
  #:use-module (gnu packages video)
  #:use-module (gnu packages xiph)
  #:use-module (gnu packages xorg)
  #:use-module (gnu packages xml)
  #:use-module (guix gexp)
  #:use-module ((guix licenses) #:prefix license:)
  #:use-module (guix packages)
  #:use-module (guix download)
  #:use-module (guix git-download)
  #:use-module (guix svn-download)
  #:use-module (guix utils)
  #:use-module (guix build-system cmake)
  #:use-module (guix build-system gnu)
  #:use-module (guix build-system go)
  #:use-module (guix build-system python)
  #:use-module (guix build-system qt)
  #:use-module (guix build-system trivial)
  #:use-module (srfi srfi-1))

(define-public cf-tool
  (package
    (name "cf-tool")
    (version "1.0.0")
    (source
     (origin
       (method git-fetch)
       (uri (git-reference
             (url "https://github.com/xalanq/cf-tool")
             (commit (string-append "v" version))))
       (file-name (git-file-name name version))
       (sha256
        (base32 "0ad2mljjg4pr8jjk9i1asnld16xi1wdfnh25drngm3c590cmrnfj"))
       (patches (search-patches "cf-tool-add-languages.patch"))
       (modules '((guix build utils)))
       ;; Remove assets and vendorized dependencies from checkout
       (snippet '(begin
                   (delete-file-recursively "assets")
                   (delete-file-recursively "vendor")))))
    (build-system go-build-system)
    (arguments
     (list
      #:install-source? #f
      #:import-path "github.com/xalanq/cf-tool"
      #:phases
      #~(modify-phases %standard-phases
          (add-after 'install 'add-alternate-name
            (lambda* _
              (let ((bin (string-append #$output "/bin")))
                (symlink (string-append bin "/cf-tool")
                         (string-append bin "/cf"))))))))
    (native-inputs
     (list go-github-com-docopt-docopt-go
           go-github-com-fatih-color
           go-github-com-k0kubun-go-ansi
           go-github-com-mitchellh-go-homedir
           go-github-com-olekukonko-tablewriter
           go-github-com-puerkitobio-goquery
           go-github-com-sergi-go-diff
           go-github-com-shirou-gopsutil
           go-github-com-skratchdot-open-golang
           go-golang-org-x-crypto
           go-golang-org-x-term))
    (home-page "https://github.com/xalanq/cf-tool")
    (synopsis
     "Command-line interface tool for @url{https://codeforces.com, Codeforces}")
    (description
     "Codeforces Tool is a command-line interface tool for
@url{https://codeforces.com,Codeforces}.  Its features include:
@itemize
@item support Contests, Gym, Groups and acmsguru
@item support all programming languages in Codeforces
@item submit codes
@item watch submissions' status dynamically
@item fetch problems' samples
@item compile and test locally
@item clone all codes of someone
@item generate codes from the specified template (including timestamp, author, etc.)
@item list problems' stats of one contest
@item use default web browser to open problems' pages, standings' page, etc.
@item setup a network proxy and  setup a mirror host
@end itemize")
    (license license:expat)))

(define-public gcompris
  (package
    (name "gcompris")
    (version "17.05")
    (source (origin
              (method url-fetch)
              (uri (string-append "http://gcompris.net/download/gtk/src/gcompris-"
                                  version ".tar.bz2"))
              (sha256
               (base32
                "18y483alb4r4vfmh80nnl0pah5gv0b8frcm6l1drb9njn5xlcpgc"))))
    (build-system gnu-build-system)
    (arguments
     `(#:configure-flags
       ;; Use SDL mixer because otherwise GCompris would need an old version
       ;; of Gstreamer.
       (list "--enable-sdlmixer"
             "LDFLAGS=-lgmodule-2.0")
       #:make-flags
       (list "CFLAGS=-fcommon")
       #:phases
       (modify-phases %standard-phases
         (add-after 'set-paths 'set-sdl-paths
           (lambda* (#:key inputs #:allow-other-keys)
             (setenv "CPATH"
                     (string-append
                      (search-input-directory inputs "include/SDL")
                      ":" (or (getenv "CPATH") ""))))))))
    (inputs
     `(("gtk+" ,gtk+-2)
       ("librsvg" ,(librsvg-for-system))
       ("libxml2" ,libxml2)
       ("sdl-mixer" ,sdl-mixer)
       ("sqlite" ,sqlite)
       ("glib:bin" ,glib)
       ("python" ,python)))
    (native-inputs
     `(("intltool" ,intltool)
       ("texinfo" ,texinfo)
       ("texi2html" ,texi2html)
       ("glib:bin" ,glib "bin")
       ("pkg-config" ,pkg-config)))
    (home-page "https://gcompris.net")
    (synopsis "Educational software suite")
    (description "GCompris is an educational software suite comprising of
numerous activities for children aged 2 to 10.  Some of the activities are
game orientated, but nonetheless still educational.  Below you can find a list
of categories with some of the activities available in that category.

@enumerate
@item computer discovery: keyboard, mouse, different mouse gestures, ...
@item arithmetic: table memory, enumeration, double entry table, mirror image, ...
@item science: the canal lock, the water cycle, the submarine, electric simulation ...
@item geography: place the country on the map
@item games: chess, memory, connect 4, oware, sudoku ...
@item reading: reading practice
@item other: learn to tell time, puzzle of famous paintings, vector drawing, cartoon making, ...
@end enumerate
")
    (license license:gpl3+)))

(define-public gcompris-qt
  (package
    (name "gcompris-qt")
    (version "4.1")
    (source
     (origin
       (method url-fetch)
       (uri (string-append
             "mirror://kde/stable/gcompris/qt/src/gcompris-qt-"
             version ".tar.xz"))
       (sha256
        (base32 "1186ba3vn59fqdpgbvnvxqm8a3b7ginmw1sb3m5fr2az40xiqg9z"))))
    (build-system qt-build-system)
    (arguments
     `(#:phases
       (modify-phases %standard-phases
         (add-before 'check 'start-xorg-server
           (lambda* (#:key inputs #:allow-other-keys)
             ;; The test suite requires a running X server.
             (system "Xvfb :1 &")
             (setenv "DISPLAY" ":1")
             ;; The test suite wants to write to /homeless-shelter
             (setenv "HOME" (getcwd)))))
       #:configure-flags (list "-DQML_BOX2D_MODULE=disabled"
                               "-DBUILD_TESTING=TRUE")))
    (native-inputs
     (list extra-cmake-modules
           gettext-minimal
           kdoctools
           perl
           qttools-5
           xorg-server-for-tests))
    (inputs
     (list openssl
           python-wrapper
           qtbase-5
           qtcharts
           qtdeclarative-5
           qtgraphicaleffects
           qtmultimedia-5
           qtquickcontrols2-5
           qtsensors-5
           qtsvg-5))
    (home-page "https://gcompris.net/index-en.html")
    (synopsis "Educational games for small children")
    (description
     "Gcompris offers a large collection of educational games for small
children, designed to be a unified interface to integrate more educational
games.  Language-oriented games contain vocabulary, sounds, and voices for
many different languages.
Currently available boards include:
@enumerate
@item learning how to use a mouse and keyboard
@item learning simple arithmetic
@item learning how to read an analog clock
@item recognize letters after hearing their names
@item reading practice
@item small games (memory games, jigsaw puzzles, ...)
@end enumerate")
    (license (list license:silofl1.1    ; bundled fonts
                   license:agpl3+))))

(define-public gotypist
  (let ((revision "0")
        (commit "03f8618f8e23acdaa94cda3bcf197da520db8dd4"))
    (package
      (name "gotypist")
      (version (git-version "0.0.0" revision commit))
      (source
       (origin
         (method git-fetch)
         (uri (git-reference
               (url "https://github.com/KappaDistributive/gotypist")
               (commit commit)))
         (file-name (git-file-name name version))
         (sha256
          (base32 "0sjndaspqfzffjxz388m384wqz5lzbiw4cwpi688k5aq7n05jh0f"))))
      (build-system go-build-system)
      (arguments
       `(#:unpack-path "github.com/KappaDistributive/gotypist"
         #:import-path "github.com/KappaDistributive/gotypist/v1"
         #:install-source? #f
         #:phases
         (modify-phases %standard-phases