Skip to content

Instantly share code, notes, and snippets.

@zph
Last active March 30, 2017 16:29

Revisions

  1. zph revised this gist Mar 30, 2015. 1 changed file with 3 additions and 3 deletions.
    6 changes: 3 additions & 3 deletions direnv.el
    Original file line number Diff line number Diff line change
    @@ -6,7 +6,7 @@
    (let ((cmd (concat "$SHELL -i -c '" "cd " dir " && direnv export bash'")))
    (shell-command-to-string cmd)))

    (direnv-data "~/src/direnv")
    ;;(direnv-data "~/src/direnv")
    (defun commands-from-direnv (text)
    (cl-remove-if 's-blank?
    (split-string (first (last (split-string text "\n"))) ";")))
    @@ -56,5 +56,5 @@
    (pairs (commands->list data)))
    (mapcar 'setenv-pair pairs)))

    (getenv "TEST_ENV")
    (set-env-from-direnv "~/src/direnv")
    ;;(getenv "TEST_ENV")
    ;;(set-env-from-direnv "~/src/direnv")
  2. zph renamed this gist Mar 30, 2015. 1 changed file with 0 additions and 0 deletions.
    File renamed without changes.
  3. zph created this gist Mar 30, 2015.
    60 changes: 60 additions & 0 deletions emacs.el
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,60 @@
    (require 'cl-lib)
    ;; Depends on s.el

    (defun direnv-data (dir)
    ;; TODO: use dir for folder or smart current-project-dir variable
    (let ((cmd (concat "$SHELL -i -c '" "cd " dir " && direnv export bash'")))
    (shell-command-to-string cmd)))

    (direnv-data "~/src/direnv")
    (defun commands-from-direnv (text)
    (cl-remove-if 's-blank?
    (split-string (first (last (split-string text "\n"))) ";")))

    (defun line->pair (line)
    (split-string (string-join (rest (split-string line " ")) " ") "="))

    (defun remove-$-and-quotes (val)
    (s-with val
    (s-chop-prefix "$")
    (s-chop-prefix "'")
    (s-chop-suffix "'")
    (s-chop-prefix "\"")
    (s-chop-suffix "\"")))

    (defun line->kv (line)
    (let* ((pair (line->pair line))
    (key (first pair))
    (value (remove-$-and-quotes (first (last pair)))))
    (list key value)))

    (defun is-export? (str)
    (s-starts-with? "export" str))

    (defun is-ignored-key? (ls)
    (let ((key (first ls)))
    (or
    (s-starts-with? "DIRENV" key)
    (s-starts-with? "PATH" key))))

    (defun extract-exports (cmds)
    (mapcar 'line->kv
    (cl-remove-if-not 'is-export?
    (commands-from-direnv cmds))))

    (defun commands->list (cmds)
    (let ((exports (extract-exports cmds)))
    (cl-remove-if 'is-ignored-key? exports)))

    (defun setenv-pair (pair)
    (let* ((k (first pair))
    (v (first (last pair))))
    (setenv k v)))

    (defun set-env-from-direnv (dir)
    (let* ((data (direnv-data dir))
    (pairs (commands->list data)))
    (mapcar 'setenv-pair pairs)))

    (getenv "TEST_ENV")
    (set-env-from-direnv "~/src/direnv")