about summary refs log tree commit diff
path: root/configs/shared/emacs/.emacs.d/elpa/haskell-mode-20180601.143/haskell-collapse.el
diff options
context:
space:
mode:
Diffstat (limited to 'configs/shared/emacs/.emacs.d/elpa/haskell-mode-20180601.143/haskell-collapse.el')
-rw-r--r--configs/shared/emacs/.emacs.d/elpa/haskell-mode-20180601.143/haskell-collapse.el114
1 files changed, 114 insertions, 0 deletions
diff --git a/configs/shared/emacs/.emacs.d/elpa/haskell-mode-20180601.143/haskell-collapse.el b/configs/shared/emacs/.emacs.d/elpa/haskell-mode-20180601.143/haskell-collapse.el
new file mode 100644
index 000000000000..8a73fa3887fc
--- /dev/null
+++ b/configs/shared/emacs/.emacs.d/elpa/haskell-mode-20180601.143/haskell-collapse.el
@@ -0,0 +1,114 @@
+;;; haskell-collapse.el --- Collapse expressions -*- lexical-binding: t -*-
+
+;; Copyright (c) 2014 Chris Done. All rights reserved.
+;; Copyright (c) 2017 Vasantha Ganesh Kanniappan <vasanthaganesh.k@tuta.io>.
+
+;; This file 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, or (at your option)
+;; any later version.
+
+;; This file 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/>.
+
+;;; Code:
+
+(require 'hideshow)
+
+;;; TODO:
+;;; -> Make it work for braces
+
+(defun haskell-hide-toggle ()
+  "Toggle visibility of existing forms at point. "
+  (interactive)
+  (hs-minor-mode 1)
+  (save-excursion
+    (let* ((modified (buffer-modified-p))
+           (inhibit-read-only t)
+           (position (haskell-indented-block))
+           (beg (car position))
+           (end (cdr position)))
+      (if (and beg end)
+          (if (overlays-in beg end)
+              (hs-discard-overlays beg end)
+            (hs-make-overlay beg end 'code)))
+      (set-buffer-modified-p modified))))
+
+(defun haskell-blank-line-p ()
+  "Returns `t' if line is empty or composed only of whitespace."
+  (save-excursion
+    (beginning-of-line)
+    (= (point-at-eol)
+       (progn (skip-chars-forward "[:blank:]") (point)))))
+
+(defun haskell-indented-block ()
+  "return (start-of-indentation . end-of-indentation)"
+  (let ((cur-indent (current-indentation))
+        (nxt-line-indent (haskell-next-line-indentation 1))
+        (prev-line-indent (haskell-next-line-indentation -1))
+        (beg-of-line (save-excursion (end-of-line)
+                                     (point))))
+    (cond ((and (= cur-indent 0)
+                (= nxt-line-indent 0)) nil)
+          ((haskell-blank-line-p) nil)
+          ((> nxt-line-indent cur-indent)
+           (cons beg-of-line
+                 (haskell-find-line-with-indentation '> 1)))
+          ((or (= nxt-line-indent cur-indent)
+               (<= prev-line-indent cur-indent))
+           (cons (haskell-find-line-with-indentation '>= -1)
+                 (haskell-find-line-with-indentation '>= 1)))
+          (t nil))))
+
+(defun haskell-next-line-indentation (dir)
+  "returns (integer) indentation of the next if dir=1, previous line
+indentation if dir=-1"
+  (save-excursion
+    (progn
+      (while (and (zerop (forward-line dir))
+                  (haskell-blank-line-p)))
+      (current-indentation))))
+
+(defun haskell-find-line-with-indentation (comparison direction)
+  "comparison is >= or >, direction if 1 finds forward, if -1 finds backward"
+  (save-excursion
+    (let ((start-indent (current-indentation)))
+      (progn
+        (while (and (zerop (forward-line direction))
+                    (or (haskell-blank-line-p)
+                        (funcall comparison (current-indentation) start-indent))))
+        (when (= direction 1) (forward-line -1))
+        (end-of-line)
+        (point)))))
+
+(defun haskell-hide-toggle-all ()
+  "hides all top level functions"
+  (interactive)
+  (save-excursion
+    (goto-char (point-max))
+    (while (zerop (forward-line -1))
+      (goto-char (point-at-bol))
+      (when (= (current-indentation) 0) (haskell-hide-toggle)))))
+
+(defvar haskell-collapse-mode-map
+  (let ((map (make-sparse-keymap)))
+    (define-key map (kbd "C-c @ C-c") 'haskell-hide-toggle)
+    (define-key map (kbd "C-c @ C-M-c") 'haskell-hide-toggle-all)
+    (define-key map (kbd "C-c @ C-M-s") 'haskell-hide-toggle-all)
+    (define-key map (kbd "C-c @ C-M-h") 'haskell-hide-toggle-all)
+    map)
+  "Keymap for using `haskell-collapse-mode'.")
+
+;;;###autoload
+(define-minor-mode haskell-collapse-mode
+  "Minor mode to collapse and expand haskell expressions"
+  :init-value nil
+  :lighter " Haskell-Collapse"
+  :keymap haskell-collapse-mode-map)
+
+(provide 'haskell-collapse)