git.fiddlerwoaroof.com
Raw Blame History
;;; utils -- Summary
;;; Commentary:

(require 'cl)

;;; 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))))

(defun read-sexps-in-buffer (buffer)
  (with-temp-buffer
    (save-excursion
      (insert "(")
      (insert-buffer buffer)
      (goto-char (point-max))
      (insert "\n)"))
    (read (current-buffer))))

(defun read-sexps-in-file (fn)
  (with-temp-buffer
    (save-excursion
      (insert "(")
      (insert-file fn)
      (goto-char (point-max))
      (insert "\n)"))
    (read (current-buffer))))

(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)))))

(defun op--collect-args (body)
  (cl-flet ((walker (body &optional args)
                    (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))
                                    ))))))
    (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 ()
  (interactive)
  (save-excursion
    (mark-defun)
    (mapcar (lambda (it) (save-buffer (find-file (format "%s.lisp" (cadr it)))))
            (getf (cddar (read-from-string
                          (buffer-substring (point)
                                            (mark))))
                  :components)))
  (pop-mark))

(defmacro comment (&rest _))

(comment
 (defun paredit-wiggle-back ()
   (paredit-forward)
   (paredit-backward))

 (defmacro defparedit-wrapper (name invoked-wrapper)
   `(defun ,name ()
      (interactive)
      (paredit-wiggle-back)
      (,invoked-wrapper))))

(defun set-exec-path-from-shell-PATH ()
  "Set up Emacs' `exec-path' and PATH environment variable to match
  that used by the user's shell.

  This is particularly useful under Mac OSX, where GUI apps are not
  started from a shell."
  (interactive)
  (let ((path-from-shell
         (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"
                   "'")))))
    (setenv "PATH" path-from-shell)
    (setq exec-path (split-string path-from-shell path-separator))))

(defmacro ensure-use-packages (&rest packages)
  (list* 'progn
         (mapcar (lambda (pck)
                   `(use-package ,(car pck)
                      :ensure t
                      ,@(cdr pck)))
                 packages)))

(defmacro fwoar/defvaralias! (var val-var)
  `(progn
     (setq ,var ,val-var)
     (defvaralias ',var ',val-var)))

(defun setup-indentation ()
  (setq-default indent-tabs-mode nil
                tab-width 2)
  (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)
  nil)

(defun start-server ()
  (unless (fboundp 'server-running-p)
    (require 'server))
  (let ((server-name (if fwoar.is-ordinary
                         server-name
                       "notes")))
    (unless (server-running-p)
      (server-start))))

(defun post-init ()
  ;;(centaur-tabs-mode 1)
  (evil-mode 1)

  (setup-indentation)
  (start-server)

  (if (version<= "26.0.50" emacs-version)
      (global-display-line-numbers-mode)
    (setq linum-format "%5d\u2502")
    (global-linum-mode))
  (set-exec-path-from-shell-PATH)
  ;; NOTE: this must be here...
  (global-company-mode 1))

(defvar fwoar.is-ordinary)

(defun cold-boot ()
  ""
  (run-with-idle-timer 5 t 'garbage-collect)
  (setq fwoar.is-ordinary (not (string= invocation-name "EmacsNotes")))
  (add-hook 'after-init-hook 'post-init)
  (electric-indent-mode -1)
  (comment
   (electric-pair-mode -1))
  (add-hook 'before-save-hook 'delete-trailing-whitespace)

  (comment
   (when-let ((ls-executable (executable-find "gls")))
     (setq insert-directory-program ls-executable)))

  (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/")
                           ("nongnu" . "https://elpa.nongnu.org/nongnu/")
                           ("melpa" . "https://melpa.org/packages/")
                           ("melpa-stable" . "http://stable.melpa.org/packages/"))
        package-archive-priorities '(("melpa-stable" . 1)
                                     ("gnu" . 0)
                                     ("melpa" . 2)
                                     ("nongnu" . 3)))

  (package-initialize 'no-activate)
  (when (not (package-installed-p 'use-package))
    (package-refresh-contents)
    (package-install 'use-package))

  (setq browse-url-browser-function 'browse-url-default-browser
        history-delete-duplicates t)

  (require 'use-package))