You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
130 lines
4.5 KiB
130 lines
4.5 KiB
;;; haskell-move-nested.el --- Change the column of text nested below a line -*- lexical-binding: t -*- |
|
|
|
;; Copyright (C) 2010 Chris Done |
|
|
|
;; Author: Chris Done <chrisdone@gmail.com> |
|
|
|
;; This file is not part of GNU Emacs. |
|
|
|
;; This program 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 of |
|
;; the License, or (at your option) any later version. |
|
|
|
;; This program 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/>. |
|
|
|
;;; Commentary: |
|
|
|
;; This module is intended for Haskell mode users, but is |
|
;; independent of Haskell mode. |
|
|
|
;; Example usage: |
|
|
|
;; (define-key haskell-mode-map (kbd "C-,") 'haskell-move-nested-left) |
|
;; (define-key haskell-mode-map (kbd "C-.") 'haskell-move-nested-right) |
|
|
|
;;; Code: |
|
|
|
;;;###autoload |
|
(defun haskell-move-nested (cols) |
|
"Shift the nested off-side-rule block adjacent to point by COLS columns to the right. |
|
|
|
In Transient Mark mode, if the mark is active, operate on the contents |
|
of the region instead. |
|
" |
|
(save-excursion |
|
(if (and transient-mark-mode mark-active) |
|
(progn |
|
(indent-rigidly (region-beginning) (region-end) cols) |
|
(setq deactivate-mark nil)) |
|
(let ((region (haskell-move-nested-region))) |
|
(when region |
|
(indent-rigidly (car region) (cdr region) cols)))))) |
|
|
|
;;;###autoload |
|
(defun haskell-move-nested-right (cols) |
|
"Increase indentation of the following off-side-rule block adjacent to point. |
|
|
|
Use a numeric prefix argument to indicate amount of indentation to apply. |
|
|
|
In Transient Mark mode, if the mark is active, operate on the contents |
|
of the region instead." |
|
(interactive "p") |
|
(haskell-move-nested cols) |
|
) |
|
|
|
;;;###autoload |
|
(defun haskell-move-nested-left (cols) |
|
"Decrease indentation of the following off-side-rule block adjacent to point. |
|
|
|
Use a numeric prefix argument to indicate amount of indentation to apply. |
|
|
|
In Transient Mark mode, if the mark is active, operate on the contents |
|
of the region instead." |
|
(interactive "p") |
|
(haskell-move-nested (- cols)) |
|
) |
|
|
|
(defun haskell-move-nested-region () |
|
"Infer region off-side-rule block adjacent to point. |
|
Used by `haskell-move-nested'. |
|
" |
|
(save-excursion |
|
(let ((starting-level (current-column))) |
|
(forward-line) |
|
(let ((current-level (haskell-move-nested-indent-level))) |
|
(let ((start-point (line-beginning-position)) |
|
(start-end-point (line-end-position)) |
|
(end-point nil) |
|
(last-line 0)) |
|
(forward-line) |
|
(while (and (not (= (line-beginning-position) last-line)) |
|
(or (> (haskell-move-nested-indent-level) starting-level) |
|
(and (> current-level starting-level) |
|
(>= (haskell-move-nested-indent-level) current-level)))) |
|
(setq last-line (line-beginning-position)) |
|
(setq end-point (line-end-position)) |
|
(forward-line)) |
|
(cons start-point (or end-point |
|
start-end-point))))))) |
|
|
|
(defun haskell-move-nested-indent-level () |
|
(max |
|
0 |
|
(1- (length |
|
(buffer-substring-no-properties |
|
(line-beginning-position) |
|
(or (save-excursion (goto-char (line-beginning-position)) |
|
(search-forward-regexp "[^ ]" (line-end-position) t 1)) |
|
(line-beginning-position))))))) |
|
|
|
(defun haskell-kill-nested () |
|
"Kill the nested region after point." |
|
(interactive) |
|
(let ((start (point)) |
|
(reg (save-excursion |
|
(search-backward-regexp "^[ ]+" (line-beginning-position) t 1) |
|
(search-forward-regexp "[^ ]" (line-end-position) t 1) |
|
(haskell-move-nested-region)))) |
|
(kill-region start (cdr reg)))) |
|
|
|
(defun haskell-delete-nested () |
|
"Kill the nested region after point." |
|
(interactive) |
|
(let ((start (point)) |
|
(reg (save-excursion |
|
(search-backward-regexp "^[ ]+" (line-beginning-position) t 1) |
|
(search-forward-regexp "[^ ]" (line-end-position) t 1) |
|
(haskell-move-nested-region)))) |
|
(delete-region start (cdr reg)))) |
|
|
|
(provide 'haskell-move-nested) |
|
|
|
;;; haskell-move-nested.el ends here
|
|
|