diff options
-rw-r--r-- | snakemake-mode.el | 45 | ||||
-rw-r--r-- | snakemake-test.el | 70 | ||||
-rw-r--r-- | snakemake.el | 2 |
3 files changed, 34 insertions, 83 deletions
diff --git a/snakemake-mode.el b/snakemake-mode.el index cd8a421..853f356 100644 --- a/snakemake-mode.el +++ b/snakemake-mode.el @@ -132,6 +132,33 @@ "Regexp matching a call to a builtin Snakemake function.") +;;; Info and navigation + +(defun snakemake-block-bounds () + "Return bounds of rule or subworkflow block at point." + (save-excursion + (save-restriction + (prog-widen) + (let ((pos (point))) + (end-of-line) + (and (re-search-backward snakemake-rule-or-subworkflow-re nil t) + (let ((rule-start (or (match-beginning 1) + (match-beginning 3))) + (rule-indent (current-indentation)) + rule-end) + (beginning-of-line) + (forward-line) + (while (and (or (< rule-indent (current-indentation)) + (looking-at-p "^\\s-*$")) + (or (not (eobp)) + (progn (setq rule-end (point-max)) + nil))) + (setq rule-end (line-end-position)) + (forward-line)) + (when (<= rule-start pos rule-end) + (cons rule-start rule-end)))))))) + + ;;; Indentation (defun snakemake--calculate-indentation (&optional previous) @@ -224,24 +251,6 @@ returned." (and (memq this-command python-indent-trigger-commands) (eq last-command this-command)))) -(defun snakemake-in-rule-or-subworkflow-block-p () - "Return non-nil if point is in block or on first blank line following one." - (let ((blank-p (lambda nil - (and (looking-at-p "^\\s-*$") - ;; Ignore newlines in docstrings. - (not (nth 3 (syntax-ppss))))))) - (save-excursion - (beginning-of-line) - (when (funcall blank-p) - (forward-line -1)) - (catch 'in-block - (while (not (funcall blank-p)) - (cond ((looking-at-p snakemake-rule-or-subworkflow-re) - (throw 'in-block t)) - ((bobp) - (throw 'in-block nil))) - (forward-line -1)))))) - ;;; Imenu diff --git a/snakemake-test.el b/snakemake-test.el index 034350c..d6f3d81 100644 --- a/snakemake-test.el +++ b/snakemake-test.el @@ -565,73 +565,15 @@ x = [1, (indent-region (point) (point-max)) (buffer-string))))) -;;;; Other +;;;; Info and navigation -(ert-deftest snakemake-test-in-rule-or-subworkflow-block-p () - ;; At top of block - (snakemake-with-temp-text - " -<point>rule abc: - output: 'file'" - (should (snakemake-in-rule-or-subworkflow-block-p))) - - ;; Body of block - (snakemake-with-temp-text - " -rule abc: - output: <point>'file'" - (should (snakemake-in-rule-or-subworkflow-block-p))) - - ;; First blank line after - (snakemake-with-temp-text - " -rule abc: - output: 'file' -<point>" - (should (snakemake-in-rule-or-subworkflow-block-p))) - - ;; Second blank line after - (snakemake-with-temp-text - " -rule abc: - output: 'file' - -<point>" - (should-not (snakemake-in-rule-or-subworkflow-block-p))) - - - ;; Blank line in docstring - (snakemake-with-temp-text - " -rule abc: - \"\"\"docstring header - - docstring line - \"\"\" - output: 'file'<point>" - (should (snakemake-in-rule-or-subworkflow-block-p))) - - ;; Before - (snakemake-with-temp-text - "<point> +(ert-deftest snakemake-test-block-bounds () + (should-not + (snakemake-with-temp-text + " rule abc: output: 'file'" - (should-not (snakemake-in-rule-or-subworkflow-block-p))) - - ;; At beginning of buffer - (snakemake-with-temp-text - "\ -rule abc: - output: 'file'<point>" - (should (snakemake-in-rule-or-subworkflow-block-p))) - - ;; Subworkflow - (snakemake-with-temp-text - " -subworkflow otherworkflow: -<point> workdir: '../path/to/otherworkflow' - snakefile: '../path/to/otherworkflow/Snakefile'" - (should (snakemake-in-rule-or-subworkflow-block-p)))) + (snakemake-block-bounds)))) ;;; snakemake.el diff --git a/snakemake.el b/snakemake.el index ce07712..47df68d 100644 --- a/snakemake.el +++ b/snakemake.el @@ -329,7 +329,7 @@ This function returns a list for consistency with other target-returning functions, but any non-nil return value is currently limited to a single-item list." (when (and (derived-mode-p 'snakemake-mode) - (snakemake-in-rule-or-subworkflow-block-p)) + (snakemake-block-bounds)) (save-excursion (end-of-line) (re-search-backward snakemake-rule-or-subworkflow-re) |