From d28eec7d8f962eb5463bf849f281f41743249251 Mon Sep 17 00:00:00 2001 From: Blaise Thompson Date: Sun, 15 Sep 2019 21:29:34 -0500 Subject: 2019-09-15 21:29 --- emacs/init.el | 11 ++-- emacs/shift-text.el | 182 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 186 insertions(+), 7 deletions(-) create mode 100644 emacs/shift-text.el diff --git a/emacs/init.el b/emacs/init.el index 88b6833..0464931 100644 --- a/emacs/init.el +++ b/emacs/init.el @@ -15,7 +15,7 @@ ("/home/blaise/org/agenda.org" "/home/blaise/org/anniversaries.org" "/home/blaise/org/repeat.org" "/home/blaise/org/todo.org" "/home/blaise/org/clocked.org"))) '(package-selected-packages (quote - (helm-flyspell flycheck which-key helm-swoop evil-leader helm spaceline evil use-package)))) + (treemacs-evil treemacs avy move-text es-lib helm-flyspell flycheck which-key helm-swoop evil-leader helm spaceline evil use-package)))) (custom-set-faces ;; custom-set-faces was added by Custom. ;; If you edit it by hand, you could mess it up, so be careful. @@ -25,7 +25,9 @@ ;; Bootstrap `use-package' (require 'package) -(add-to-list 'package-archives '("melpa" . "http://melpa.org/packages/")) +(setq package-archives '(("gnu" . "https://elpa.gnu.org/packages/") + ("melpa" . "https://melpa.org/packages/"))) +;;(add-to-list 'package-archives '("melpa" . "http://melpa.org/packages/")) (package-initialize) (unless (package-installed-p 'use-package) (package-refresh-contents) @@ -46,11 +48,6 @@ :ensure t ) -;; csv -(use-package csv - :ensure t - ) - ;; evil (use-package evil-leader :ensure t diff --git a/emacs/shift-text.el b/emacs/shift-text.el new file mode 100644 index 0000000..df989a1 --- /dev/null +++ b/emacs/shift-text.el @@ -0,0 +1,182 @@ +;;; shift-text.el --- Move the region in 4 directions, in a way similar to Eclipse's +;;; Version: 0.3 +;;; Author: sabof +;;; URL: https://github.com/sabof/shift-text +;;; Package-Requires: ((cl-lib "1.0") (es-lib "0.3")) + +;;; Commentary: + +;; The project is hosted at https://github.com/sabof/shift-text +;; The latest version, and all the relevant information can be found there. + +;;; License: + +;; 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 2, 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 ; see the file COPYING. If not, write to +;; the Free Software Foundation, Inc., 59 Temple Place - Suite 330, +;; Boston, MA 02111-1307, USA. + +;;; Code: + +(require 'cl-lib) +(require 'es-lib) + +(defvar st-indent-step + (lambda () + (cond + ( (eq major-mode 'js-mode) + js-indent-level) + ( (eq major-mode 'css-mode) + css-indent-offset) + ( (memq major-mode + '(emacs-lisp-mode + lisp-mode + lisp-interaction-mode + scheme-mode)) + 2) + ( t tab-width) + )) + "How much to indent when shifting horizontally. + +You can set it for specific modes in their mode-hooks with `setq-local'. +For example \(setq-local st-indent-step 2\). + +Can also be a function called without arguments and evaluting to a number.") + +(defun st--section-marking-end-of-line (&optional pos using-region) + (save-excursion + (when pos + (goto-char pos)) + (if (and using-region (equal (current-column) 0)) + (point) + (min (point-max) (1+ (es-total-line-end-position)))))) + +(defun st--normalize-pos (pos) + (min (point-max) (max (point-min) pos))) + +(defun st--shift-text-internal (arg) + (let* (( was-active (use-region-p)) + ( first-line-was-folded + (save-excursion + (when was-active + (goto-char (region-beginning))) + (es-line-folded-p))) + ( initial-column (current-column)) + ( start (es-total-line-beginning-position + (if was-active + (region-beginning) + (point)))) + ( end (st--section-marking-end-of-line + (if was-active + (region-end) + (point)) + was-active)) + ( virtual-overlays + (mapcar 'es-preserve-overlay (overlays-in start end))) + ( text (delete-and-extract-region start end)) + new-start + difference) + (es-total-forward-line arg) + (unless (zerop (current-column)) + (insert ?\n )) + (setq new-start (point) + difference (- new-start start)) + (insert text) + (unless (equal (aref text (1- (length text))) + ?\n ) + (insert ?\n )) + (cl-dolist (ov virtual-overlays) + (setf (nth 1 ov) (st--normalize-pos (+ (nth 1 ov) difference))) + (setf (nth 2 ov) (st--normalize-pos (+ (nth 2 ov) difference)))) + (mapc 'es-restore-overlay virtual-overlays) + (set-mark new-start) + (exchange-point-and-mark) + (if (or was-active first-line-was-folded) + (setq deactivate-mark nil + cua--explicit-region-start nil) + (progn (move-to-column initial-column t) + (deactivate-mark))))) + +(defun st--indent-rigidly-internal (arg) + (let* (( indent-step (if (functionp st-indent-step) + (funcall st-indent-step) + st-indent-step)) + ( indentation-ammout + (* arg indent-step)) + ( old-indentation + (save-excursion + (when (use-region-p) + (goto-char (region-beginning))) + (current-indentation))) + ( old-indentation-adujusted + (* indent-step + (/ old-indentation + indent-step))) + ( desired-indentation + (+ old-indentation-adujusted + indentation-ammout)) + ( new-ammount + (- desired-indentation old-indentation))) + (cond ( (use-region-p) + (let (( start + (es-total-line-beginning-position + (region-beginning))) + ( end + (st--section-marking-end-of-line + (region-end) + t))) + (set-mark end) + (goto-char start) + (indent-rigidly start end new-ammount) + (setq deactivate-mark nil))) + ( (es-line-empty-p) + (if (> desired-indentation old-indentation) + (indent-to desired-indentation) + (goto-char (max (line-beginning-position) + (+ desired-indentation + (line-beginning-position)))) + (delete-region (point) (line-end-position)) + )) + ( t (indent-rigidly + (es-total-line-beginning-position (point)) + (st--section-marking-end-of-line (point)) + new-ammount))))) + +;;;###autoload +(defun shift-text-down () + "Move region or the current line down." + (interactive) + (st--shift-text-internal 1)) + +;;;###autoload +(defun shift-text-up () + "Move region or the current line up." + (interactive) + (st--shift-text-internal -1)) + +;;;###autoload +(defun shift-text-left () + "Move region or the current line left." + (interactive) + (st--indent-rigidly-internal -1)) + +;;;###autoload +(defun shift-text-right () + "Move region or the current line right." + (interactive) + (st--indent-rigidly-internal 1)) + +(provide 'shift-text) +;;; shift-text.el ends here -- cgit v1.2.3