From c2f97577f700d3ac89a6192e5bf394ee1b141a81 Mon Sep 17 00:00:00 2001 From: Vincent Ambo Date: Thu, 19 Dec 2019 01:39:22 +0000 Subject: feat(emacs-pkgs): Introduce nix-util helper library Adds an Emacs library with so far a grand total of one helper function that can prefetch and insert a git repository at point. This is very useful for the various Go repo imports I am doing at the moment. --- tools/emacs-pkgs/nix-util/default.nix | 7 ++++ tools/emacs-pkgs/nix-util/nix-util.el | 67 +++++++++++++++++++++++++++++++++++ tools/emacs/default.nix | 8 +++-- 3 files changed, 80 insertions(+), 2 deletions(-) create mode 100644 tools/emacs-pkgs/nix-util/default.nix create mode 100644 tools/emacs-pkgs/nix-util/nix-util.el diff --git a/tools/emacs-pkgs/nix-util/default.nix b/tools/emacs-pkgs/nix-util/default.nix new file mode 100644 index 000000000000..0e314ae71966 --- /dev/null +++ b/tools/emacs-pkgs/nix-util/default.nix @@ -0,0 +1,7 @@ +{ pkgs, ... }: + +pkgs.third_party.emacsPackagesNg.trivialBuild rec { + pname = "nix-util"; + version = "1.0"; + src = ./nix-util.el; +} diff --git a/tools/emacs-pkgs/nix-util/nix-util.el b/tools/emacs-pkgs/nix-util/nix-util.el new file mode 100644 index 000000000000..f37cdcc7103a --- /dev/null +++ b/tools/emacs-pkgs/nix-util/nix-util.el @@ -0,0 +1,67 @@ +;;; nix-util.el --- Utilities for dealing with Nix code. -*- lexical-binding: true; -*- +;; +;; Copyright (C) 2019 Google Inc. +;; +;; Author: Vincent Ambo +;; Version: 1.0 +;; Package-Requires: (json map) +;; +;;; Commentary: +;; +;; This package adds some functionality that I find useful when +;; working in Nix buffers. + +(require 'json) +(require 'map) + +(defun nix/prefetch-github (owner repo) ; TODO(tazjin): support different branches + "Fetch the master branch of a GitHub repository and insert the + call to `fetchFromGitHub' at point." + + (interactive "sOwner: \nsRepository: ") + + (let* (;; Keep these vars around for output insertion + (point (point)) + (buffer (current-buffer)) + (name (concat "github-fetcher/" owner "/" repo)) + (outbuf (format "*%s*" name)) + (errbuf (get-buffer-create "*github-fetcher/errors*")) + (cleanup (lambda () + (kill-buffer outbuf) + (kill-buffer errbuf) + (with-current-buffer buffer + (read-only-mode -1)))) + (prefetch-handler + (lambda (_process event) + (unwind-protect + (pcase event + ("finished\n" + (let* ((json-string (with-current-buffer outbuf + (buffer-string))) + (result (json-parse-string json-string))) + (with-current-buffer buffer + (goto-char point) + (map-let (("rev" rev) ("sha256" sha256)) result + (read-only-mode -1) + (insert (format "fetchFromGitHub { + owner = \"%s\"; + repo = \"%s\"; + rev = \"%s\"; + sha256 = \"%s\"; +};" owner repo rev sha256)) + (indent-region point (point)))))) + (_ (with-current-buffer errbuf + (error "Failed to prefetch %s/%s: %s" + owner repo (buffer-string))))) + (funcall cleanup))))) + + ;; Fetching happens asynchronously, but we'd like to make sure the + ;; point stays in place while that happens. + (read-only-mode) + (make-process :name name + :buffer outbuf + :command `("nix-prefetch-github" ,owner ,repo) + :stderr errbuf + :sentinel prefetch-handler))) + +(provide 'nix-util) diff --git a/tools/emacs/default.nix b/tools/emacs/default.nix index 9573a888cb2a..c44403e6d692 100644 --- a/tools/emacs/default.nix +++ b/tools/emacs/default.nix @@ -83,8 +83,12 @@ let ]) ++ # Custom packages - [ carp-mode localPackages.dottime localPackages.term-switcher ] - ))); + (with localPackages; [ + carp-mode + dottime + nix-util + term-switcher + ])))); in lib.fix(self: l: f: third_party.writeShellScriptBin "tazjins-emacs" '' exec ${tazjinsEmacs f}/bin/emacs \ --debug-init \ -- cgit 1.4.1