Skip to content

Commit

Permalink
Merge pull request #4 from SalOrak/reduce-path-names-dict
Browse files Browse the repository at this point in the history
feat(aliases): added aliases for better readability
  • Loading branch information
SalOrak authored Nov 24, 2024
2 parents 8be0454 + 5320577 commit 8de8518
Showing 1 changed file with 69 additions and 19 deletions.
88 changes: 69 additions & 19 deletions whaler.el
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
;; Maintainer: Hector "Salorak" Alarcon <[email protected]>
;; 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
Expand All @@ -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.

Expand All @@ -41,6 +41,7 @@
(require 'cl-lib))

(require 'f)
(require 'dash)

;;* Customization
(defgroup whaler nil
Expand Down Expand Up @@ -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"))))

Expand All @@ -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
Expand All @@ -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."
Expand All @@ -150,15 +161,54 @@ 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)
(setq whaler--project-directories '())
(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.
Expand All @@ -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)
Expand Down

0 comments on commit 8de8518

Please sign in to comment.