2018-07-23 17:10:34 +00:00
|
|
|
;;; GNU Mes --- Maxwell Equations of Software
|
2020-12-30 10:47:32 +00:00
|
|
|
;;; Copyright © 2018,2019,2020 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
|
2018-07-23 17:10:34 +00:00
|
|
|
;;;
|
|
|
|
;;; This file is part of GNU Mes.
|
|
|
|
;;;
|
|
|
|
;;; GNU Mes 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 Mes 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 Mes. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
|
2019-03-27 12:20:26 +00:00
|
|
|
;; The GNU project defaults. These are also the GNU Emacs defaults.
|
|
|
|
;; Re-asserting theme here, however, as a courtesy for setups that use
|
|
|
|
;; a global override.
|
|
|
|
(
|
|
|
|
;; For writing GNU C code, see
|
|
|
|
;; https://www.gnu.org/prep/standards/html_node/Writing-C.html
|
|
|
|
(c-mode . ((c-file-style . "gnu")
|
|
|
|
(indent-tabs-mode . nil)))
|
2018-09-16 09:07:39 +00:00
|
|
|
|
2019-03-27 12:20:26 +00:00
|
|
|
(makefile-mode . ((indent-tabs-mode . t)))
|
2019-06-13 12:19:59 +00:00
|
|
|
(asm-mode . ((indent-tabs-mode . t)))
|
2018-09-16 09:07:39 +00:00
|
|
|
|
2019-03-27 12:20:26 +00:00
|
|
|
(nil . ((indent-tabs-mode . nil)
|
|
|
|
(fill-column . 72)))
|
2018-09-16 09:07:39 +00:00
|
|
|
|
2018-05-26 18:54:51 +00:00
|
|
|
(scheme-mode
|
|
|
|
.
|
|
|
|
((geiser-active-implementations . (guile))
|
2020-06-10 13:30:04 +00:00
|
|
|
|
2020-12-30 10:47:32 +00:00
|
|
|
;; Guile syntax
|
|
|
|
(eval . (put 'pass-if 'scheme-indent-function 1))
|
|
|
|
(eval . (put 'pass-if-not 'scheme-indent-function 1))
|
|
|
|
(eval . (put 'pass-if-eq 'scheme-indent-function 2))
|
|
|
|
(eval . (put 'pass-if-equal 'scheme-indent-function 2))
|
|
|
|
(eval . (put 'expect-fail 'scheme-indent-function 2))
|
|
|
|
(eval . (put 'pass-if-timeout 'scheme-indent-function 2))
|
|
|
|
|
2020-06-10 13:30:04 +00:00
|
|
|
;; Guix package
|
|
|
|
(eval . (put 'package 'scheme-indent-function 0))
|
|
|
|
(eval . (put 'origin 'scheme-indent-function 0))
|
|
|
|
|
|
|
|
;; Guix 'modify-phases' and its keywords.
|
|
|
|
(eval . (put 'modify-phases 'scheme-indent-function 1))
|
|
|
|
(eval . (put 'replace 'scheme-indent-function 1))
|
|
|
|
(eval . (put 'add-before 'scheme-indent-function 2))
|
|
|
|
(eval . (put 'add-after 'scheme-indent-function 2))
|
|
|
|
|
|
|
|
;; Guix utils
|
|
|
|
(eval . (put 'substitute* 'scheme-indent-function 1))
|
|
|
|
|
2018-05-26 18:54:51 +00:00
|
|
|
(eval
|
|
|
|
.
|
2020-12-30 10:47:32 +00:00
|
|
|
|
2018-05-26 18:54:51 +00:00
|
|
|
(progn
|
|
|
|
(defun prefix-dir-locals-dir (elt)
|
|
|
|
(concat (locate-dominating-file buffer-file-name ".dir-locals.el") elt))
|
|
|
|
(mapcar
|
|
|
|
(lambda (dir) (add-to-list 'geiser-guile-load-path dir))
|
|
|
|
(mapcar
|
|
|
|
#'prefix-dir-locals-dir
|
2018-08-14 21:02:55 +00:00
|
|
|
'("scripts" "module")))))))
|
2019-03-27 12:20:26 +00:00
|
|
|
|
2018-09-16 09:07:39 +00:00
|
|
|
(texinfo-mode . ((indent-tabs-mode . nil)
|
2019-03-27 12:20:26 +00:00
|
|
|
(fill-column . 72)))
|
|
|
|
(nil .
|
|
|
|
((eval
|
|
|
|
.
|
|
|
|
(progn
|
|
|
|
(let ((top (locate-dominating-file default-directory ".dir-locals.el"))))
|
|
|
|
|
|
|
|
(defun guile--manual-look-up (id mod)
|
|
|
|
(message "guile--manual-look-up id=%s => %s mod=%s" id (symbol-name id) mod)
|
|
|
|
(let ((info-lookup-other-window-flag
|
|
|
|
geiser-guile-manual-lookup-other-window-p))
|
|
|
|
(info-lookup-symbol (symbol-name id) 'scheme-mode))
|
|
|
|
(when geiser-guile-manual-lookup-other-window-p
|
|
|
|
(switch-to-buffer-other-window "*info*"))
|
|
|
|
(search-forward (format "%s" id) nil t))
|
|
|
|
|
|
|
|
(add-hook 'before-save-hook 'delete-trailing-whitespace nil t)
|
|
|
|
|
|
|
|
(defun guix-switch-profile (&optional profile)
|
|
|
|
"reset Emacs' environment by snarfing PROFILE/etc/profile"
|
|
|
|
|
|
|
|
(defun matches-in-string (regexp string)
|
|
|
|
"return a list of matches of REGEXP in STRING."
|
|
|
|
(let ((matches))
|
|
|
|
(save-match-data
|
|
|
|
(string-match "^" "")
|
|
|
|
(while (string-match regexp string (match-end 0))
|
|
|
|
(push (or (match-string 1 string) (match-string 0 string)) matches)))
|
|
|
|
matches))
|
|
|
|
|
|
|
|
(interactive "fprofile: ")
|
|
|
|
(let* ((output (shell-command-to-string (concat "GUIX_PROFILE= /bin/sh -x " profile "/etc/profile")))
|
|
|
|
(exports (matches-in-string "^[+] export \\(.*\\)" output)))
|
|
|
|
(mapcar (lambda (line) (apply #'setenv (split-string line "="))) exports )))
|
|
|
|
|
|
|
|
(defun shell-args-to-string (&rest args)
|
|
|
|
(shell-command-to-string (mapconcat 'identity args " ")))
|
|
|
|
|
|
|
|
(defun as (string &optional arch)
|
|
|
|
(let* ((arch (or arch "--64"))
|
|
|
|
(asm (subst-char-in-string ?_ ?\s string))
|
|
|
|
(foo (message "asm:%S" asm))
|
|
|
|
(result (shell-args-to-string "as" arch (concat "<(echo '" asm "')")))
|
|
|
|
(disassembly (shell-args-to-string "objdump" "-d" "a.out"))
|
|
|
|
(foo (message "disassembly: %S" disassembly))
|
|
|
|
(match (string-match "^ 0:[\t]\\([^\t]*\\)" disassembly))
|
|
|
|
(code (match-string 1 disassembly))
|
|
|
|
(code (apply 'concat (split-string code " " t))))
|
|
|
|
(insert " ")
|
|
|
|
(insert code)))
|
|
|
|
|
|
|
|
(defun as-32 (point mark)
|
|
|
|
(interactive "r")
|
|
|
|
(let* ((string (buffer-substring point mark))
|
|
|
|
(code (as string "--32")))
|
|
|
|
(insert " ")
|
|
|
|
(insert code)))
|
|
|
|
|
|
|
|
(defun as-64 (point mark)
|
|
|
|
(interactive "r")
|
|
|
|
(let* ((string (buffer-substring point mark))
|
|
|
|
(code (as string "--64")))
|
|
|
|
(insert " ")
|
|
|
|
(insert code))))))))
|