diff --git a/elisp/eshell-starship.el b/elisp/eshell-starship.el index 17c3df8..16976f3 100644 --- a/elisp/eshell-starship.el +++ b/elisp/eshell-starship.el @@ -7,6 +7,61 @@ (require 'eshell) (require 'cl-lib) +(defun eshell-starship--file-names-present-p (&rest names) + "Test if any of NAMES (wildcards supported) exist in default directory." + (catch 'found + (dolist (name names) + (when (seq-filter #'(lambda (name) + (not (string-prefix-p "." name))) + (file-expand-wildcards name)) + (throw 'found t))))) + +(cl-defmacro eshell-starship-defmodule (name &body body + &key files + icon color allow-remote) + "Define a starship module called NAME. +FILES s used to detect weather to call the module. It is a list of wildcard +expressions. SYMBOL and COLOR control the output of the module. BODY should +return the string for the module, or nil if it could not be found." + (declare (indent defun)) + `(defun ,(intern (format "eshell-starship--module-%s-func" + name)) () + ,(format "Module function for eshell-starship module %s." name) + (or (when (and ,(if allow-remote t + '(not (file-remote-p default-directory))) + (eshell-starship--file-names-present-p ,files)) + (if-let (res (progn ,body)) + (concat " via " (propertize (concat ,icon " " res) + 'face (:foreground + ,color))))) + ""))) + +(eshell-starship-defmodule cc + :files '("*.c" "*.h") + :icon "C" + :color "green yellow") + +(defun eshell-starship--cc-status () + "Return the current CC version if C files exist in `default-directory'. +Returns an empty string if no C .c or .h files exist or if current dir is +remote." + (or (unless (file-remote-p default-directory) + (when (eshell-starship--file-names-exist-p "*.h" "*.c") + (with-temp-buffer + (when (zerop (process-file "cc" nil t nil "-v")) + (goto-char (point-min)) + (when (re-search-forward + "^\\([-a-zA-Z]+\\) version \\([0-9]+\\.[0-9]+\\.[0-9]+\\)" + nil t) + (concat " via " + (propertize (concat "C v" + (match-string 2) + "-" + (match-string 1)) + 'face + '(:foreground "green yellow"))) + ))))) "")) + (defun eshell-starship--replace-home-with-tilda (path) "If PATH beings with $HOME (the environment variable), replace it with ~." (let ((home (getenv "HOME"))) @@ -226,6 +281,7 @@ END-TIME is the time when the command finished executing." (unless (file-writable-p dir) " ") (eshell-starship--vc-status) + (eshell-starship--cc-status) (eshell-starship--last-command-time end-time) (propertize "\n" 'read-only t 'rear-nonsticky t) (propertize diff --git a/init.el b/init.el index e858bd0..77f5b89 100644 --- a/init.el +++ b/init.el @@ -344,6 +344,7 @@ visual states." ("C-x c b" . consult-bookmark) ("C-x c d" . consult-fd) ("C-x c g" . consult-ripgrep) + ("C-x c y" . consult-yank-from-kill-ring) ("M-g i" . consult-imenu) ("M-g I" . consult-imenu-multi) ("M-g r" . consult-imenu-multi)