doomemacs/core/autoload/system.el
Henrik Lissner c7254e7bdc
Major optimization refactor, across the board
+ enable lexical-scope everywhere (lexical-binding = t): ~5-10% faster
  startup; ~5-20% general boost
+ reduce consing, function calls & garbage collection by preferring
  cl-loop & dolist over lambda closures (for mapc[ar], add-hook, and
  various cl-lib filter/map/reduce functions) -- where possible
+ prefer functions with dedicated opcodes, like assq (see byte-defop's
  in bytecomp.el for more)
+ prefer pcase & cond (faster) over cl-case
+ general refactor for code readability
+ ensure naming & style conventions are adhered to
+ appease byte-compiler by marking unused variables with underscore
+ defer minor mode activation to after-init, emacs-startup or
  window-setup hooks; a customization opportunity for users + ensures
  custom functionality won't interfere with startup.
2017-06-09 00:47:45 +02:00

69 lines
2.9 KiB
EmacsLisp

;;; core/autoload/system.el -*- lexical-binding: t; -*-
;;;###autoload
(defun doom-system-os (&optional os)
"Returns the OS: arch, debian, macos, general linux, cygwin or windows. If OS
is given, returns t if it matches the current system, and nil otherwise."
(let* ((gnu-linux-p (eq system-type 'gnu/linux))
(type (cond ((and gnu-linux-p (file-exists-p "/etc/arch-release"))
'arch)
((and gnu-linux-p (file-exists-p "/etc/debian_version"))
'debian)
(gnu-linux-p
'linux)
((eq system-type 'darwin)
'macos)
((memq system-type '(windows-nt cygwin))
'windows)
(t (error "Unknown OS: %s" system-type)))))
(or (and os (eq os type))
type)))
;;;###autoload
(defun doom-sh (command &rest args)
"Runs a shell command and prints any output to the DOOM buffer."
(let ((cmd-list (split-string command " ")))
(cond ((equal (car cmd-list) "sudo")
(apply #'doom-sudo (string-join (cdr cmd-list) " ") args))
((let ((bin (executable-find "npm")))
(and (file-exists-p bin)
(not (file-writable-p bin))))
(apply #'doom-sudo (string-join cmd-list " ") args))
(t
(princ (shell-command-to-string (apply #'format command args)))))))
(defvar tramp-verbose)
;;;###autoload
(defun doom-sudo (command &rest args)
"Like `doom-sh', but runs as root (prompts for password)."
(let ((tramp-verbose 2))
(with-current-buffer (get-buffer-create "*doom-sudo*")
(unless (string-prefix-p "/sudo::/" default-directory)
(cd "/sudo::/"))
(princ (shell-command-to-string (apply #'format command args))))))
;;;###autoload
(defun doom-fetch (fetcher location dest)
"Clone a remote version-controlled repo at REPO-URL to PATH, if it exists.
Requires the corresponding client, e.g. git for git repos, hg for mercurial,
etc."
(let* ((command (pcase fetcher
(:github "git clone --depth 1 --recursive https://github.com/%s.git")
(:git "git clone --depth 1 --recursive %s")
(:gist "git clone https://gist.github.com/%s.git")
;; TODO Add hg
(_ (error "%s is not a valid fetcher" fetcher))))
(argv (split-string command " " t))
(args (format (string-join (cdr argv) " ") location))
(bin (executable-find (car argv)))
(dest (expand-file-name dest)))
(unless bin
(error "%s couldn't be found" command))
(unless (file-directory-p dest)
(funcall (if noninteractive
(lambda (&rest args) (princ (shell-command-to-string args)))
#'async-shell-command)
(format "%s %s %s" bin args (shell-quote-argument dest)))
(message! "Cloning %s -> %s" location dest))))