From ed3149f690c8ff2d2227fd437b67654c8ed0cd87 Mon Sep 17 00:00:00 2001 From: Tom Willemse Date: Fri, 1 Apr 2022 18:43:25 -0700 Subject: [PATCH] [oni-groovy] Add defun-based navigation properties MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit With this also comes the ability to call ‘narrow-to-defun’ and have it show only the current function. --- oni-groovy.el | 35 ++++++++++++++++++++++++++++++++++- 1 file changed, 34 insertions(+), 1 deletion(-) diff --git a/oni-groovy.el b/oni-groovy.el index 5684d95..f48ee84 100644 --- a/oni-groovy.el +++ b/oni-groovy.el @@ -4,7 +4,7 @@ ;; Author: Tom Willemse ;; Keywords: local -;; Version: 2021.1123.002828 +;; Version: 2022.0401.184320 ;; Package-Requires: (groovy-mode oni-embrace groovy-imports rainbow-delimiters jenkinsfile-mode) ;; This program is free software; you can redistribute it and/or modify @@ -34,8 +34,41 @@ (setq-local comment-auto-fill-only-comments t) (auto-fill-mode)) +(defconst oni-groovy--regex-defun-start + (rx line-start + (minimal-match (zero-or-more space)) + "def " + (minimal-match (one-or-more alnum)) + (minimal-match (zero-or-more space)) + "(")) + +(defun oni-groovy-beginning-of-defun () + (interactive) + (when (not (region-active-p)) + (push-mark)) + (let ((case-fold-search t)) + (when (re-search-backward oni-groovy--regex-defun-start nil t) + t))) + +(defun oni-groovy-end-of-defun () + (interactive) + (when (not (region-active-p)) + (push-mark)) + (let ((case-fold-search t)) + (when (or (looking-at oni-groovy--regex-defun-start) + (re-search-backward oni-groovy--regex-defun-start nil t)) + (search-forward "{") + (forward-char -1) + (forward-sexp) + (forward-line)))) + +(defun oni-groovy-setup-defun-navigation () + (setq-local beginning-of-defun-function #'oni-groovy-beginning-of-defun + end-of-defun-function #'oni-groovy-end-of-defun)) + (define-key groovy-mode-map (kbd "M-I") 'groovy-imports-add-import-dwim) +(add-hook 'groovy-mode-hook #'oni-groovy-setup-defun-navigation) (add-hook 'groovy-mode-hook 'display-fill-column-indicator-mode) (add-hook 'groovy-mode-hook 'electric-indent-local-mode) (add-hook 'groovy-mode-hook 'electric-pair-local-mode)