From 6da48163dfd086c5f4be2371ba241bbf370310be Mon Sep 17 00:00:00 2001 From: Daniel Borchmann Date: Sun, 5 Aug 2018 16:19:52 +0200 Subject: [PATCH] [Projects] Add simple project management library --- init.el | 3 ++ site-lisp/db-projects.el | 70 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 73 insertions(+) create mode 100644 site-lisp/db-projects.el diff --git a/init.el b/init.el index 36f2d8f..b196080 100644 --- a/init.el +++ b/init.el @@ -1261,6 +1261,9 @@ are assumed to be of the form *.crt." crux-cleanup-buffer-or-region crux-delete-buffer-and-file)) +(use-package db-projects + :commands (projects-add-project projects-archive-project)) + (use-package define-word :commands (define-word-at-point define-word)) diff --git a/site-lisp/db-projects.el b/site-lisp/db-projects.el new file mode 100644 index 0000000..c7839aa --- /dev/null +++ b/site-lisp/db-projects.el @@ -0,0 +1,70 @@ +;;; db-projects.el -- Simple Directory-Based Project Management -*- lexical-binding: t -*- + +;;; Commentary: + +;; XXX: add projectile integration + +;;; Code: + +(defgroup projects nil + "Simple directory-based project management" + :tag "Project Management" + :group 'projects) + +(defcustom projects-main-project-directory "~/Documents/projects/" + "Main directory to host projects." + :group 'projects) + +(defcustom projects-archive-directory "~/Documents/projects/.archive" + "Directory to archive projects into" + :group 'projects) + +(defun projects-project-exists-p (short-name) + "Check whether a project named SHORT-NAME already exists" + (file-exists-p (expand-file-name ".projectile" + (expand-file-name short-name + projects-main-project-directory)))) + +(defun projects-existing-projects () + "Return list of all short-names of existing projects" + (cl-remove-if-not (lambda (name) + (file-exists-p (expand-file-name ".projectile" + (expand-file-name name projects-main-project-directory)))) + (directory-files projects-main-project-directory))) + +(defun projects-add-project (short-name long-name) + "Add new project." + (interactive "sShort Name: \nsLong Name: ") + (when (projects-project-exists-p short-name) + (user-error "Project %s already exists, existing" short-name)) + (let ((project-directory (expand-file-name short-name + projects-main-project-directory))) + (make-directory project-directory) + (make-directory (expand-file-name "scripts" project-directory)) + (make-directory (expand-file-name "data" project-directory)) + (with-temp-buffer + (insert (format "#+title: %s\n" long-name)) + (insert (format "#+created: %s\n\n" + (format-time-string "[%Y-%m-%d %a %H:%M]" (current-time)))) + (write-file (expand-file-name "projekttagebuch.org" project-directory)) + (bookmark-set (format "Projekttagebuch %s" short-name))) + (with-temp-buffer + (insert (format "%s" long-name)) + (write-file (expand-file-name ".projectile" project-directory))))) + +(defun projects-archive-project (short-name) + "Archive existing project." + (interactive (list + (completing-read "Short Name: " (projects-existing-projects) nil t))) + (unless (projects/project-exists-p short-name) + (user-error "Project %s does not exist, exiting" short-name)) + (unless (file-exists-p projects-archive-directory) + (make-directory projects-archive-directory)) + (rename-file (expand-file-name short-name projects-main-project-directory) + (expand-file-name short-name projects-archive-directory) + nil) + (bookmark-delete (format "Projekttagebuch %s" short-name))) + +(provide 'db-projects) + +;;; db-projects.el ends here