doc: Migration to Libera Chat.
[mes.git] / .dir-locals.el
1 ;;; GNU Mes --- Maxwell Equations of Software
2 ;;; Copyright © 2018,2019 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
3 ;;;
4 ;;; This file is part of GNU Mes.
5 ;;;
6 ;;; GNU Mes is free software; you can redistribute it and/or modify it
7 ;;; under the terms of the GNU General Public License as published by
8 ;;; the Free Software Foundation; either version 3 of the License, or (at
9 ;;; your option) any later version.
10 ;;;
11 ;;; GNU Mes is distributed in the hope that it will be useful, but
12 ;;; WITHOUT ANY WARRANTY; without even the implied warranty of
13 ;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14 ;;; GNU General Public License for more details.
15 ;;;
16 ;;; You should have received a copy of the GNU General Public License
17 ;;; along with GNU Mes.  If not, see <http://www.gnu.org/licenses/>.
18
19 ;; The GNU project defaults.  These are also the GNU Emacs defaults.
20 ;; Re-asserting theme here, however, as a courtesy for setups that use
21 ;; a global override.
22 (
23  ;; For writing GNU C code, see
24  ;; https://www.gnu.org/prep/standards/html_node/Writing-C.html
25  (c-mode . ((c-file-style . "gnu")
26             (indent-tabs-mode . nil)))
27
28  (makefile-mode . ((indent-tabs-mode . t)))
29  (asm-mode . ((indent-tabs-mode . t)))
30
31  (nil . ((indent-tabs-mode . nil)
32          (fill-column . 72)))
33
34  (scheme-mode
35   .
36   ((geiser-active-implementations . (guile))
37
38    ;; Guix package
39    (eval . (put 'package 'scheme-indent-function 0))
40    (eval . (put 'origin 'scheme-indent-function 0))
41
42    ;; Guix 'modify-phases' and its keywords.
43    (eval . (put 'modify-phases 'scheme-indent-function 1))
44    (eval . (put 'replace 'scheme-indent-function 1))
45    (eval . (put 'add-before 'scheme-indent-function 2))
46    (eval . (put 'add-after 'scheme-indent-function 2))
47
48    ;; Guix utils
49    (eval . (put 'substitute* 'scheme-indent-function 1))
50
51    (eval
52     .
53     (progn
54       (defun prefix-dir-locals-dir (elt)
55         (concat (locate-dominating-file buffer-file-name ".dir-locals.el") elt))
56       (mapcar
57        (lambda (dir) (add-to-list 'geiser-guile-load-path dir))
58        (mapcar
59         #'prefix-dir-locals-dir
60         '("scripts" "module")))))))
61
62  (texinfo-mode    . ((indent-tabs-mode . nil)
63                      (fill-column . 72)))
64  (nil .
65       ((eval
66         .
67         (progn
68           (let ((top (locate-dominating-file default-directory ".dir-locals.el"))))
69
70           (defun guile--manual-look-up (id mod)
71             (message "guile--manual-look-up id=%s => %s mod=%s" id (symbol-name id) mod)
72             (let ((info-lookup-other-window-flag
73                    geiser-guile-manual-lookup-other-window-p))
74               (info-lookup-symbol (symbol-name id) 'scheme-mode))
75             (when geiser-guile-manual-lookup-other-window-p
76               (switch-to-buffer-other-window "*info*"))
77             (search-forward (format "%s" id) nil t))
78
79           (add-hook 'before-save-hook 'delete-trailing-whitespace nil t)
80
81           (defun guix-switch-profile (&optional profile)
82             "reset Emacs' environment by snarfing PROFILE/etc/profile"
83
84             (defun matches-in-string (regexp string)
85               "return a list of matches of REGEXP in STRING."
86               (let ((matches))
87                 (save-match-data
88                   (string-match "^" "")
89                   (while (string-match regexp string (match-end 0))
90                     (push (or (match-string 1 string) (match-string 0 string)) matches)))
91                 matches))
92
93             (interactive "fprofile: ")
94             (let* ((output (shell-command-to-string (concat "GUIX_PROFILE= /bin/sh -x " profile "/etc/profile")))
95                    (exports (matches-in-string "^[+] export \\(.*\\)" output)))
96               (mapcar (lambda (line) (apply #'setenv (split-string line "="))) exports )))
97
98           (defun shell-args-to-string (&rest args)
99             (shell-command-to-string (mapconcat 'identity args " ")))
100
101           (defun as (string &optional arch)
102             (let* ((arch (or arch "--64"))
103                    (asm (subst-char-in-string ?_ ?\s string))
104                    (foo (message "asm:%S" asm))
105                    (result (shell-args-to-string "as" arch (concat "<(echo '" asm "')")))
106                    (disassembly (shell-args-to-string "objdump" "-d" "a.out"))
107                    (foo (message "disassembly: %S" disassembly))
108                    (match (string-match "^   0:[\t]\\([^\t]*\\)" disassembly))
109                    (code (match-string 1 disassembly))
110                    (code (apply 'concat (split-string code " " t))))
111               (insert " ")
112               (insert code)))
113
114           (defun as-32 (point mark)
115             (interactive "r")
116             (let* ((string (buffer-substring point mark))
117                    (code (as string "--32")))
118               (insert " ")
119               (insert code)))
120
121           (defun as-64 (point mark)
122             (interactive "r")
123             (let* ((string (buffer-substring point mark))
124                    (code (as string "--64")))
125               (insert " ")
126               (insert code))))))))