git.fiddlerwoaroof.com
emacs.d/lisp/utils.el
6b10f3e8
 ;;; utils -- Summary
 ;;; Commentary:
 
4ae7c492
 (require 'cl)
 
6b10f3e8
 ;;; Code:
 
 (defun fwoar/doc-for-resource-type (resource-type)
   (cl-format nil
              "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/~{~a~^-~}"
              (list* "aws" "resource"
                     (cdr (s-split "::" (s-downcase resource-type))))))
 (defun fwoar/document-cf (min max)
   "Jump to AWS Cloudformation docs for a resource type.
 
 MIN: the point in the buffer where the resource type starts
 MAX: the point in the buffer where the resource type ends
 
 This uses (interactive \"r\") to automagically populate the arguments
 from the selected region."
   (interactive "r")
   (browse-url
    (fwoar/doc-for-resource-type
     (buffer-substring min max))))
 
89e0093e
 (defun read-sexps-in-buffer (buffer)
   (with-temp-buffer
     (save-excursion
       (insert "(")
       (insert-buffer buffer)
       (goto-char (point-max))
       (insert "\n)"))
     (read (current-buffer))))
 
4db36da5
 (defun read-sexps-in-file (fn)
   (with-temp-buffer
     (save-excursion
       (insert "(")
       (insert-file fn)
       (goto-char (point-max))
       (insert "\n)"))
     (read (current-buffer))))
 
f2db89b7
 (defun read-strings-in-file (fn)
   (with-temp-buffer
     (insert-file fn)
     (mark-whole-buffer)
     (flush-lines "^[[:space:]]*$")
     (goto-char (point-min))
     (remove "" (s-lines (buffer-string)))))
 
4ae7c492
 (defun op--collect-args (body)
   (cl-flet ((walker (body &optional args)
4db36da5
                     (if (null body)
                         args
                       (if (symbolp body)
                           (when (eql ?\_ (elt (symbol-name body) 0))
                             (cons body args))
                         (if (listp body)
                             (append (op--collect-args (car body))
                                     (op--collect-args (cdr body))
                                     ))))))
4ae7c492
     (sort (walker body)
           (lambda (a b)
             (< (string-to-number (subseq (symbol-name a) 1))
                (string-to-number (subseq (symbol-name b) 1)))))))
 
 (defmacro op (&rest body)
   `(lambda ,(op--collect-args body)
      ,@body))
 
 (defun blank-line-p ()
   (= (current-indentation)
      (- (line-end-position) (line-beginning-position))))
 
 (defun helm-generate-lisp-skeleton ()
   (interactive)
   (let ((skeletons '(("defunction" . skel-defun)
                      ("defmacro" . skel-defmacro)
                      ("defsystem" . skel-defsystem)
                      ("defpackage" . skel-defpackage)
                      ("defparameter" . skel-defparameter)
                      ("defvar" . skel-defvar))))
     (funcall (helm-comp-read "code template: " skeletons))
     (evil-insert 1)))
 
 (defun create-system-files ()
eb65d556
   (interactive)
   (save-excursion
87a5d549
     (mark-defun)
4ae7c492
     (mapcar (lambda (it) (save-buffer (find-file (format "%s.lisp" (cadr it)))))
             (getf (cddar (read-from-string
                           (buffer-substring (point)
                                             (mark))))
87a5d549
                   :components)))
   (pop-mark))
4ae7c492
 
37e85dec
 (defmacro comment (&rest _))
4ae7c492
 
37e85dec
 (comment
  (defun paredit-wiggle-back ()
    (paredit-forward)
    (paredit-backward))
 
  (defmacro defparedit-wrapper (name invoked-wrapper)
    `(defun ,name ()
       (interactive)
       (paredit-wiggle-back)
       (,invoked-wrapper))))
4ae7c492
 
 (defun set-exec-path-from-shell-PATH ()
   "Set up Emacs' `exec-path' and PATH environment variable to match
89e0093e
   that used by the user's shell.
4ae7c492
 
   This is particularly useful under Mac OSX, where GUI apps are not
89e0093e
   started from a shell."
4ae7c492
   (interactive)
   (let ((path-from-shell
4db36da5
          (replace-regexp-in-string
           "[ \t\n]*$" ""
           (shell-command-to-string
            (concat "zsh -c '"
                    "  source ~/.zsh.d/dependencies/utils.zsh;"
                    "  source ~/.zsh.d/dependencies/path-setup.zsh;"
                    "  echo $PATH"
                    "'")))))
4ae7c492
     (setenv "PATH" path-from-shell)
     (setq exec-path (split-string path-from-shell path-separator))))
37e85dec
 
 (defmacro ensure-use-packages (&rest packages)
   (list* 'progn
          (mapcar (lambda (pck)
                    `(use-package ,(car pck)
                       :ensure t
                       ,@(cdr pck)))
                  packages)))
9bb117c4
 
6b10f3e8
 (defmacro fwoar/defvaralias! (var val-var)
   `(progn
      (setq ,var ,val-var)
      (defvaralias ',var ',val-var)))
 
e5c62efb
 (defun setup-indentation ()
   (setq-default indent-tabs-mode nil
                 tab-width 2)
6b10f3e8
   (fwoar/defvaralias! c-basic-offset tab-width)
   (fwoar/defvaralias! sh-basic-offset tab-width)
   (fwoar/defvaralias! js2-basic-offset tab-width)
   (fwoar/defvaralias! sgml-basic-offset tab-width)
   (fwoar/defvaralias! cperl-indent-level tab-width)
e5c62efb
   nil)
 
 (defun start-server ()
9bb117c4
   (unless (fboundp 'server-running-p)
     (require 'server))
   (let ((server-name (if fwoar.is-ordinary
                          server-name
                        "notes")))
     (unless (server-running-p)
e5c62efb
       (server-start))))
 
 (defun post-init ()
e84ac872
   ;;(centaur-tabs-mode 1)
e5c62efb
   (evil-mode 1)
 
   (setup-indentation)
   (start-server)
 
   (if (version<= "26.0.50" emacs-version)
4db36da5
       (global-display-line-numbers-mode)
e5c62efb
     (setq linum-format "%5d\u2502")
4db36da5
     (global-linum-mode))
89e0093e
   (set-exec-path-from-shell-PATH)
9bb117c4
   ;; NOTE: this must be here...
385192ac
   (global-company-mode 1))
9bb117c4
 
6b10f3e8
 (defvar fwoar.is-ordinary)
 
9bb117c4
 (defun cold-boot ()
6b10f3e8
   ""
652edce5
   (run-with-idle-timer 5 t 'garbage-collect)
9bb117c4
   (setq fwoar.is-ordinary (not (string= invocation-name "EmacsNotes")))
   (add-hook 'after-init-hook 'post-init)
50a341bf
   (electric-indent-mode -1)
e5c62efb
   (comment
    (electric-pair-mode -1))
422891ca
   (add-hook 'before-save-hook 'delete-trailing-whitespace)
eab1159a
 
6b10f3e8
   (comment
    (when-let ((ls-executable (executable-find "gls")))
      (setq insert-directory-program ls-executable)))
9bb117c4
 
   (setq default-directory "~/emacs-home/")
   (make-directory default-directory t)
 
   (setq vc-follow-symlinks t)
 
   (require 'package)
 
   (setq package-archives '(("gnu" . "http://elpa.gnu.org/packages/")
2c64c4f9
                            ("nongnu" . "https://elpa.nongnu.org/nongnu/")
9bb117c4
                            ("melpa" . "https://melpa.org/packages/")
                            ("melpa-stable" . "http://stable.melpa.org/packages/"))
         package-archive-priorities '(("melpa-stable" . 1)
                                      ("gnu" . 0)
                                      ("melpa" . 2)
2c64c4f9
                                      ("nongnu" . 3)))
9bb117c4
 
6b10f3e8
   (package-initialize 'no-activate)
9bb117c4
   (when (not (package-installed-p 'use-package))
     (package-refresh-contents)
     (package-install 'use-package))
 
a57603e4
   (setq browse-url-browser-function 'browse-url-default-browser
         history-delete-duplicates t)
9bb117c4
 
   (require 'use-package))