From 653d52352d4ae16178d2236d911c7fca3f9875fa Mon Sep 17 00:00:00 2001 From: lexa Date: Mon, 4 Aug 2014 23:33:05 +0400 Subject: [PATCH] Added mc-hide-unmatched-lines mode This minor mode when enabled hides all lines where no cursors (and also hum/lines-to-expand below and above) To make use of this mode press "C-'" while multiple-cursor-mode is active. You can still edit lines while you are in mc-hide-unmatched-lines mode. To leave this mode press "" or "C-g" --- mc-hide-unmatched-lines-mode.el | 119 ++++++++++++++++++++++++++++++++ multiple-cursors-core.el | 3 + multiple-cursors.el | 1 + 3 files changed, 123 insertions(+) create mode 100644 mc-hide-unmatched-lines-mode.el diff --git a/mc-hide-unmatched-lines-mode.el b/mc-hide-unmatched-lines-mode.el new file mode 100644 index 0000000..67375bf --- /dev/null +++ b/mc-hide-unmatched-lines-mode.el @@ -0,0 +1,119 @@ +;;; mc-hide-unmatched-lines.el + +;; Copyright (C) 2014 Aleksey Fedotov + +;; Author: Aleksey Fedotov +;; Keywords: editing cursors + +;; 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 . + +;;; Commentary: + +;; This minor mode when enabled hides all lines where no cursors (and +;; also hum/lines-to-expand below and above) To make use of this mode +;; press "C-'" while multiple-cursor-mode is active. You can still +;; edit lines while you are in mc-hide-unmatched-lines mode. To leave +;; this mode press "" or "C-g" +;; + +;;; Code: + + +(require 'multiple-cursors-core) + +(defvar hum/hide-unmatched-lines-mode-map (make-sparse-keymap) + "Keymap for hide unmatched lines is mainly for rebinding C-g") + +(define-key hum/hide-unmatched-lines-mode-map (kbd "C-g") 'hum/keyboard-quit) +(define-key hum/hide-unmatched-lines-mode-map (kbd "") 'hum/keyboard-quit) + +(defun hum/keyboard-quit () + "Leave hide-unmatched-lines mode" + (interactive) + (mc-hide-unmatched-lines-mode 0)) + +;; used only in in multiple-cursors-mode-disabled-hook +(defun hum/disable-hum-mode () + (mc-hide-unmatched-lines-mode 0) +) + +(define-minor-mode mc-hide-unmatched-lines-mode + "Minor mode when enabled hides all lines where no cursos (and +also hum/lines-to-expand below and above) To make use of this +mode press \"C-'\" while multiple-cursor-mode is active. You can +still edit lines while you are in mc-hide-unmatched-lines +mode. To leave this mode press or \"C-g\"" + nil " hu" + hum/hide-unmatched-lines-mode-map + (if mc-hide-unmatched-lines-mode + ;;just in case if mc mode will be disabled while hide-unmatched-lines is active + (progn + (hum/hide-unmatched-lines) + (add-hook 'multiple-cursors-mode-disabled-hook 'hum/disable-hum-mode t t)) + (progn + (hum/unhide-unmatched-lines) + (remove-hook 'multiple-cursors-mode-disabled-hook 'hum/disable-hum-mode)) + ) +) + +(defconst hum/invisible-overlay-name 'hum/invisible-overlay-name) + +(defcustom hum/lines-to-expand 2 + "How many lines below and above cursor to show" + :type '(integer) + :group 'multiple-cursors) + +(defcustom hum/placeholder "..." + "Placeholder which will be placed insted of hiden text" + :type '(string) + :group 'multiple-cursors +) + +(defun hum/add-invisible-overlay (begin end) + (let ((overlay (make-overlay begin + end + (current-buffer) + t + nil + ))) + (overlay-put overlay hum/invisible-overlay-name t) + (overlay-put overlay 'invisible t) + (overlay-put overlay 'intangible t) + (overlay-put overlay 'evaporate t) + (overlay-put overlay 'after-string hum/placeholder) + ) + ) + + +(defun hum/hide-unmatched-lines () + (let ((begin (point-min))) + (mc/for-each-cursor-ordered + (save-excursion + (goto-char (mc/cursor-beg cursor)) + (if (< begin (line-beginning-position (- hum/lines-to-expand))) + (hum/add-invisible-overlay begin (line-end-position (- hum/lines-to-expand))) + ) + (setq begin (line-beginning-position (+ 2 hum/lines-to-expand))) + ) + ) + (hum/add-invisible-overlay begin (point-max)) + ) + ) + +(defun hum/unhide-unmatched-lines () + (remove-overlays nil nil hum/invisible-overlay-name t) + ) + +(provide 'mc-hide-unmatched-lines-mode) +(define-key mc/keymap (kbd "C-'") 'mc-hide-unmatched-lines-mode) diff --git a/multiple-cursors-core.el b/multiple-cursors-core.el index 974b1b8..bc8a279 100644 --- a/multiple-cursors-core.el +++ b/multiple-cursors-core.el @@ -596,6 +596,9 @@ for running commands with multiple cursors.") mc/skip-to-next-like-this mc/skip-to-previous-like-this rrm/switch-to-multiple-cursors + mc-hide-unmatched-lines-mode + hum/keyboard-quit + hum/unhide-invisible-overlays save-buffer ido-exit-minibuffer exit-minibuffer diff --git a/multiple-cursors.el b/multiple-cursors.el index 9c847ee..9c44db9 100644 --- a/multiple-cursors.el +++ b/multiple-cursors.el @@ -185,6 +185,7 @@ (require 'mc-mark-pop) (require 'rectangular-region-mode) (require 'mc-separate-operations) +(require 'mc-hide-unmatched-lines-mode) (provide 'multiple-cursors)