From efbfad46bb98d8f2884747c241cd2b17a085244c Mon Sep 17 00:00:00 2001 From: Kyle Meyer Date: Tue, 19 Apr 2016 22:01:02 -0400 Subject: Add snakemake-graph-this-file command --- NEWS | 10 ++++++++++ snakemake.el | 53 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 63 insertions(+) diff --git a/NEWS b/NEWS index f29cadb..5198ccd 100644 --- a/NEWS +++ b/NEWS @@ -1,5 +1,15 @@ NEWS -- history of user-visible changes -*- mode: org; -*- +* v0.5.0 (unreleased) + +** New features + +- New command ~snakemake-graph-this-file~ displays the graph for the + first rule of the current file. Similar functionality is available + from ~snakemake-graph~, which supports graphing any target in the + file, but you may find the new command useful if your workflow + involves frequently using Snakemake's ~--snakefile~ option. + * v0.4.0 ** New features diff --git a/snakemake.el b/snakemake.el index 7a01613..6f9059b 100644 --- a/snakemake.el +++ b/snakemake.el @@ -421,6 +421,59 @@ $ snakemake --{dag,rulegraph} -- RULES | display" (setq snakemake-graph-rule (mapconcat #'file-name-nondirectory rules "-")) (pop-to-buffer (current-buffer))))) +;;;###autoload +(defun snakemake-graph-this-file (&optional rule-graph directory) + "Display graph of DAG for the first rule of the current file. + +The graph will be displayed with `image-mode'. From this buffer, +you can call \\\\[snakemake-graph-save] \ +to save the graph. + +If RULE-GRAPH is non-nil, pass --rulegraph instead of --dag to +the Snakemake call. Snakemake is called from DIRECTORY or, if +DIRECTORY is nil, from the current file's directory. + +Interactively, \\[universal-argument] indicates to use \ +--rulegraph instead of --dag, +whereas \\[universal-argument] \\[universal-argument] signals to \ +prompt user for a directory from which +to call Snakemake. With any other non-nil prefix value, both of the +above actions are performed. + +$ snakemake -s --{dag,rulegraph} | display" + (interactive + (let ((read-dir (lambda () + (read-directory-name "Call from directory: " + nil nil t)))) + (cond ((equal current-prefix-arg '(4)) + (list t nil)) + ((equal current-prefix-arg '(16)) + (list nil (funcall read-dir))) + (current-prefix-arg + (list t (funcall read-dir))) + (t + (list nil nil))))) + (unless (derived-mode-p 'snakemake-mode) + (user-error "Current buffer is not in Snakemake mode")) + (let* ((file (or (buffer-file-name (buffer-base-buffer)) + (user-error "Buffer is not visiting a file"))) + (dir (or directory (file-name-directory file))) + ret-val) + (with-current-buffer (get-buffer-create "*Snakemake graph*") + (setq default-directory dir) + (let ((inhibit-read-only t)) + (erase-buffer) + (setq ret-val (call-process snakemake-program nil t nil + (if rule-graph "--rulegraph" "--dag") + "--snakefile" file))) + (if (= 0 ret-val) + (progn (image-mode) + (snakemake-graph-mode) + (setq snakemake-graph-rule file)) + (goto-char (point-min)) + (insert (format "Error in snakemake call from %s:\n\n" dir))) + (pop-to-buffer (current-buffer))))) + (defun snakemake-graph-save () "Save graph in current buffer to file. The graph will be processed by `snakemake-dot-program'. The -- cgit v1.2.3