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