From 5320577ebe0e4527289d531364476daf18ba040a Mon Sep 17 00:00:00 2001 From: SalOrak <99770300+SalOrak@users.noreply.github.com> Date: Sun, 24 Nov 2024 17:33:43 +0100 Subject: [PATCH] feat(aliases): added aliases for better readability --- whaler.el | 88 +++++++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 69 insertions(+), 19 deletions(-) diff --git a/whaler.el b/whaler.el index a908993..74b23c5 100644 --- a/whaler.el +++ b/whaler.el @@ -4,7 +4,7 @@ ;; Maintainer: Hector "Salorak" Alarcon ;; URL: https://github.com/salorak/whaler.el ;; Version: 0.0.1 -;; Package-Requires: ((emacs "25.1") ( f "0.20.0") ) +;; Package-Requires: ((emacs "25.1") ( f "0.20.0") (dash "2.19.1") ) ;; Keywords: tools ;; This file is free software; you can redistribute it and/or modify @@ -29,9 +29,9 @@ ;; work with repositories / directories / projects. ;; `Whaler' provides functions to easily create a pool of projects as -;; well as interact with these projects. For example, with `Whaler' you +;; well as interact with these projects. For example, with `Whaler' you ;; can call `compile' in a project chosen from the minibuffer without -;; changing the current project. But not only you can call `compile', but +;; changing the current project. But not only you can call `compile', but ;; any function or custom function you want, interacting either in your ;; current working project or another project selected from the minibuffer. @@ -41,6 +41,7 @@ (require 'cl-lib)) (require 'f) +(require 'dash) ;;* Customization (defgroup whaler nil @@ -90,19 +91,29 @@ DO NOT MODIFY IT MANUALLY, instead modify the `whaler-directories-alist' and `whaler-oneoff-directories-alist' lists and then run `whaler-populate-projects-directories' to automatically update this list.") +(defvar whaler--hash-project-aliases (make-hash-table :test 'equal) + "Hash table containing the directory paths and its aliases. +DO NOT MODIFY IT MANUALLY." + ) +(defvar whaler--project-keys '() + "List of KEYS for the `whaler--hash-project-aliases'. +List used to be display in the `completing-read' function instead of the +absolute PATH. It improves readability." + ) + ;; Functions (defun whaler-current-working-directory () - "Returns the current working directory if set, otherwise the default directory. + "Return the current working directory if set, otherwise the default directory. Fallbacks to the $HOME directory if neither is a valid path." (cond ((and (stringp whaler-current-working-directory) (f-dir-p whaler-current-working-directory) (not (string-empty-p whaler-current-working-directory))) - whaler-current-working-directory) + whaler-current-working-directory) ((and (stringp whaler-default-working-directory) (f-dir-p whaler-default-working-directory) (not (string-empty-p whaler-default-working-directory))) - whaler-default-working-directory) + whaler-default-working-directory) ((f-dir-p (getenv "HOME")) (getenv "HOME")))) @@ -118,13 +129,13 @@ By default is t. It accepts a string parameter, specifically the current whaler directory." (interactive) (let ((default-directory (whaler-current-working-directory))) - (if (null action-arg) - (funcall action) - (funcall action default-directory)))) + (if (null action-arg) + (funcall action) + (funcall action default-directory)))) (defun whaler--directory-exists (dir) - "Checks whether the directory path exists or not. + "Check whether the directory path exists or not. If DIR does not exist, prints it as an error message but doesn't raise an error." (if (not (f-dir-p dir)) (progn @@ -138,10 +149,10 @@ It search inside each directory in LIST argument and appends every subdirectory in the `whaler--project-directories'. LIST corresponds to the list of directories to search in. HIDDEN is used to indicate whether to append hidden directories or not." - (dolist (value list) - (when (whaler--directory-exists value) - (dolist (el (f-directories (f-long value) (lambda (x) (or (not (f-hidden-p x 'last)) hidden)) nil)) - (add-to-list 'whaler--project-directories el))))) + (dolist (value list) + (when (whaler--directory-exists value) + (dolist (el (f-directories (f-long value) (lambda (x) (or (not (f-hidden-p x 'last)) hidden)) nil)) + (add-to-list 'whaler--project-directories el))))) (defun whaler--add-oneoff-directories () "Append the oneoff directories directly to the projects list." @@ -150,6 +161,43 @@ HIDDEN is used to indicate whether to append hidden directories or not." (add-to-list 'whaler--project-directories x))) whaler-oneoff-directories-alist)) + +(defun whaler--format-path (path) + "Return the PATH string formatted to be improve readability in the UI. +The format is as follows: [ PARENT-DIRECTORY ] FINAL-DIRECTORY where +PARENT-DIRECTORY is the parent directory of the PATH. +FINAL-DIRECTORY is the directory pointing to. + +Example: +Given the PATH '/home/user/programming/whaler' +The PARENT-DIRECTORY is 'programming' and +the FINAL-DIRECTORY is 'whaler'. +The functions then returns '[ programming ] whaler' string." + (cond + (( not (f-root-p path)) + (let ( + (parent (car (last (f-split (f-parent path))))) + (final (cadr (last (f-split path) 2)))) + (format "[ %s ] %s" parent final))) + (t + (format "[ root ] /") + ))) + +(defun whaler--update-hash-table () + "Update the projects hash table. +The hash table contains the ALIAS as KEY and PATH as VALUE" + (setq whaler--hash-project-aliases (make-hash-table :test 'equal)) + (setq whaler--project-keys '()) + (mapcar #'(lambda (path) + (progn + (let ((fp (whaler--format-path path))) + (puthash fp path whaler--hash-project-aliases) + (add-to-list 'whaler--project-keys fp) + ) + )) + whaler--project-directories) + ) + (defun whaler-populate-projects-directories () "Populate the projects list `whaler--project-directories' and delete duplicates." (interactive) @@ -157,8 +205,10 @@ HIDDEN is used to indicate whether to append hidden directories or not." (whaler--generate-subdirectories whaler-directories-alist) (whaler--add-oneoff-directories) (delete-dups whaler--project-directories) + (whaler--update-hash-table) (message "[Whaler] Projects have been repopulated.")) + (cl-defun whaler ( &key (action 'dired) (action-arg t)(change-cwd-auto t)) "Change or move between directories blazingly fast. Apply an ACTION in the selected directory. @@ -171,17 +221,17 @@ ACTION-ARG determines whether the ACTION function should receive the selected directory or not. By default is t. CHANGE-CWD-AUTO is a boolean indicating whether whaler should -set the selected candidate as its current working directory or not. Default t" +set the selected candidate as its current working directory or not. Default t" (interactive) (let ((chosen-directory "")) - (setq chosen-directory (completing-read "[ Whaler ] >> " whaler--project-directories nil t)) + (setq chosen-key (completing-read "[ Whaler ] >> " whaler--project-keys nil t)) + (setq chosen-directory (gethash chosen-key whaler--hash-project-aliases)) (when change-cwd-auto (setq whaler-current-working-directory (f-slash chosen-directory))) (let ((default-directory chosen-directory)) (if (null action-arg) - (funcall action) - (funcall action chosen-directory))))) - + (funcall action) + (funcall action chosen-directory))))) (provide 'whaler)