aboutsummaryrefslogtreecommitdiff
path: root/.emacs.d/lisp/g.el
diff options
context:
space:
mode:
authorMiquel Sabaté Solà <msabate@suse.com>2019-08-22 18:30:24 +0200
committerMiquel Sabaté Solà <msabate@suse.com>2019-08-22 18:30:24 +0200
commit4ead9be4468d8d58c027bf6e6616e3b4d6e727eb (patch)
tree18ab19fd5213c9d302b165eafa46a6f1f8902e75 /.emacs.d/lisp/g.el
parent04f4a7df197ce327f36b666869a1ca2f09934e58 (diff)
downloaddotfiles-4ead9be4468d8d58c027bf6e6616e3b4d6e727eb.tar.gz
dotfiles-4ead9be4468d8d58c027bf6e6616e3b4d6e727eb.zip
Complete re-structuring so it's easier to install
Signed-off-by: Miquel Sabaté Solà <msabate@suse.com>
Diffstat (limited to '.emacs.d/lisp/g.el')
-rw-r--r--.emacs.d/lisp/g.el134
1 files changed, 134 insertions, 0 deletions
diff --git a/.emacs.d/lisp/g.el b/.emacs.d/lisp/g.el
new file mode 100644
index 0000000..3a4660a
--- /dev/null
+++ b/.emacs.d/lisp/g.el
@@ -0,0 +1,134 @@
+;;; g.el --- Adding shortcuts to GNU Emacs
+
+;; Copyright (C) 2016-2019 Miquel Sabaté Solà <mikisabate@gmail.com>
+;;
+;; This program is free software: you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+;;
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+;;
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+;; Author: Miquel Sabaté Solà <mikisabate@gmail.com>
+;; Version: 0.1
+;; URL: https://github.com/mssola/dotfiles/emacs/site-lisp/g.el
+
+;;; Commentary:
+;;
+;; This is a GNU Emacs port of my g.sh bash script that can be found here:
+;; https://github.com/mssola/g. This package can be seen as useless given the
+;; fantastic Helm + Projectile combo, but it still comes in handy when you want
+;; to edit:
+;; - A file which is in a project unknown to Projectile.
+;; - A file that does not really belong to a real project.
+
+;;; Code:
+
+(defvar g-file "~/.gfile"
+ "The path to the gfile.")
+
+;; Utils
+
+(defun g-read-file (file)
+ "Read the given FILE and return it as a list of lines."
+
+ (if (file-exists-p file)
+ (with-temp-buffer
+ (insert-file-contents file)
+ (split-string (buffer-string) "\n" t))
+ ""))
+
+(defun g-write (shortcuts)
+ "Write the given SHORTCUTS into the gfile."
+
+ (let ((output ""))
+ (maphash (lambda (key value)
+ (setq output
+ (concat output (format "%s\n%s\n" key value))))
+ shortcuts)
+ (write-region output nil g-file)))
+
+(defun g-read ()
+ "Read all the shortcuts as defined by the gfile.
+The returned object is a hash table."
+
+ (let ((shortcuts (make-hash-table :test 'equal))
+ (list (g-read-file g-file)))
+
+ ; The format of the file is a bit special because it was meant to be easily
+ ; parseable by Bash. It consists of pairs of lines, where n is the key, and
+ ; n+1 is the value.
+ (dotimes (i (/ (length list) 2))
+ (let ((n (* i 2)))
+ (puthash
+ (nth n list)
+ (nth (+ n 1) list)
+ shortcuts)))
+ shortcuts))
+
+;; Interactive functions
+
+(defun g ()
+ "Go to the given directory with the supplied alias."
+
+ (interactive)
+
+ (if (file-exists-p g-file)
+ (progn
+ (let* ((shortcuts (g-read))
+ (alias (completing-read
+ "Give me the name: " shortcuts nil t)))
+ (find-file (gethash alias shortcuts))))
+ (message "Add a shortcut first!")))
+
+(defun g-list ()
+ "List all the available shortcuts."
+
+ (interactive)
+
+ (let ((output ""))
+ (maphash (lambda (key value)
+ (setq output
+ (concat output (format "%s => %s\n" key value))))
+ (g-read))
+ (message output)))
+
+(defun g-add ()
+ "Add a new shortcut."
+
+ (interactive)
+
+ (let ((shortcuts (g-read))
+ (to-create (read-string "Shortcut to create: ")))
+ (if (gethash to-create shortcuts)
+ (message "Error: shortcut already exists.")
+ (let ((path (read-file-name "Path: " nil nil t)))
+ (if (file-exists-p path)
+ (progn
+ (puthash to-create (file-truename path) shortcuts)
+ (g-write shortcuts))
+ (message "Error: given path does not exist."))))))
+
+(defun g-remove ()
+ "Remove an existing shortcut."
+
+ (interactive)
+
+ (if (file-exists-p g-file)
+ (progn
+ (let* ((shortcuts (g-read))
+ (alias (completing-read
+ "Give me the shortcut to remove: " shortcuts nil t)))
+ (remhash alias shortcuts)
+ (g-write shortcuts)))
+ (message "There are no shortcuts!")))
+
+(provide 'g)
+
+;;; g.el ends here