diff --git a/modules/home/users/msyds/emacs/lisp/syd/keymaps.el b/modules/home/users/msyds/emacs/lisp/syd/keymaps.el index 02fd6bb..89dfd31 100755 --- a/modules/home/users/msyds/emacs/lisp/syd/keymaps.el +++ b/modules/home/users/msyds/emacs/lisp/syd/keymaps.el @@ -69,7 +69,8 @@ (general-def :prefix-map 'syd-leader-insert-map "u" #'insert-char - "e" #'emoji-insert) + "e" #'emoji-insert + "p" #'syd-insert-file-name) ;; This is necessary to properly rebind `universal-argument'. ;; `universal-argument-more' is a command that provides additional prefixes diff --git a/modules/home/users/msyds/emacs/lisp/syd/prelude.el b/modules/home/users/msyds/emacs/lisp/syd/prelude.el index a8451ed..b3a4c08 100755 --- a/modules/home/users/msyds/emacs/lisp/syd/prelude.el +++ b/modules/home/users/msyds/emacs/lisp/syd/prelude.el @@ -193,4 +193,38 @@ form." (cons mode (intern (concat (match-string 1 s) "-ts-mode")))) (error "Symbol `%c' is not a mode." mode)))) +(defun syd--insert-file-name-annotation (x) + (concat + " " + (propertize " " 'display `(space :align-to (- right ,(+ 1 (length x))))) + x)) + +(defun syd-insert-file-name () + (interactive) + (let* ((path (read-file-name "Path: " nil nil 'confirm)) + (proj-root (project-root (project-current))) + (alts + `((,(file-relative-name path proj-root) . "Project-relative") + (,(file-relative-name path default-directory) . "File-relative") + (,path . "Absolute") + ("... (choose a dir)"))) + (choice + (completing-read + "Variant: " + (lambda (s p flag) + (pcase flag + ('metadata + `(metadata + (annotation-function + . ,(lambda (s) + (when-let* ((desc (cdr (assoc s alts)))) + (syd--insert-file-name-annotation + desc)))))) + (_ (all-completions s (mapcar #'car alts) p))))))) + (if (equal choice "... (choose a root)") + (insert (file-relative-name + path (read-file-name "Relative to: " nil nil + 'confirm))) + (insert choice)))) + (provide 'syd/prelude)