diff options
Diffstat (limited to '.config/emacs/lisp/expand-region/expand-region.el')
| -rw-r--r-- | .config/emacs/lisp/expand-region/expand-region.el | 198 |
1 files changed, 198 insertions, 0 deletions
diff --git a/.config/emacs/lisp/expand-region/expand-region.el b/.config/emacs/lisp/expand-region/expand-region.el new file mode 100644 index 0000000..9f63d51 --- /dev/null +++ b/.config/emacs/lisp/expand-region/expand-region.el @@ -0,0 +1,198 @@ +;;; expand-region.el --- Increase selected region by semantic units. -*- lexical-binding: t; -*- + +;; Copyright (C) 2011-2023 Free Software Foundation, Inc + +;; Author: Magnar Sveen <magnars@gmail.com> +;; Keywords: marking region +;; URL: https://github.com/magnars/expand-region.el +;; Version: 1.0.0 +;; Package-Requires: ((emacs "24.4")) + +;; 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: + +;; Expand region increases the selected region by semantic units. Just keep +;; pressing the key until it selects what you want. + +;; An example: + +;; (setq alphabet-start "abc def") + +;; With the cursor at the `c`, it starts by marking the entire word `abc`, then +;; expand to the contents of the quotes `abc def`, then to the entire quote +;; `"abc def"`, then to the contents of the sexp `setq alphabet-start "abc def"` +;; and finally to the entire sexp. + +;; You can set it up like this: + +;; (require 'expand-region) +;; (global-set-key (kbd "C-=") 'er/expand-region) + +;; There's also `er/contract-region` if you expand too far. + +;; ## Video + +;; You can [watch an intro to expand-region at Emacs Rocks](http://emacsrocks.com/e09.html). + +;; ## Language support + +;; Expand region works fairly well with most languages, due to the general +;; nature of the basic expansions: + +;; er/mark-word +;; er/mark-symbol +;; er/mark-method-call +;; er/mark-inside-quotes +;; er/mark-outside-quotes +;; er/mark-inside-pairs +;; er/mark-outside-pairs + +;; However, most languages also will benefit from some specially crafted +;; expansions. For instance, expand-region comes with these extra expansions for +;; html-mode: + +;; er/mark-html-attribute +;; er/mark-inner-tag +;; er/mark-outer-tag + +;; You can add your own expansions to the languages of your choice simply by +;; creating a function that looks around point to see if it's inside or looking +;; at the construct you want to mark, and if so - mark it. + +;; There's plenty of examples to look at in these files. + +;; After you make your function, add it to a buffer-local version of +;; the `er/try-expand-list`. + +;; **Example:** + +;; Let's say you want expand-region to also mark paragraphs and pages in +;; text-mode. Incidentally Emacs already comes with `mark-paragraph` and +;; `mark-page`. To add it to the try-list, do this: + +;; (defun er/add-text-mode-expansions () +;; (setq-local er/try-expand-list (append +;; er/try-expand-list +;; '(mark-paragraph +;; mark-page)))) + +;; (er/enable-mode-expansions 'text-mode #'er/add-text-mode-expansions) + +;; Add that to its own file, and require it at the bottom of this one, +;; where it says "Mode-specific expansions" + +;; **Warning:** Badly written expansions might slow down expand-region +;; dramatically. Remember to exit quickly before you start traversing +;; the entire document looking for constructs to mark. + +;; ## Contribute + +;; If you make some nice expansions for your favorite mode, it would be +;; great if you opened a pull-request. The repo is at: + +;; https://github.com/magnars/expand-region.el + +;; Changes to `expand-region-core` itself must be accompanied by feature tests. +;; They are written in [Ecukes](http://ecukes.info), a Cucumber for Emacs. + +;; To fetch the test dependencies: + +;; $ cd /path/to/expand-region +;; $ git submodule init +;; $ git submodule update + +;; Run the tests with: + +;; $ ./util/ecukes/ecukes features + +;; If you want to add feature-tests for your mode-specific expansions as well, +;; that is utterly excellent. + +;; ## Contributors + +;; * [Josh Johnston](https://github.com/joshwnj) contributed `er/contract-region` +;; * [Le Wang](https://github.com/lewang) contributed consistent handling of the mark ring, expanding into pairs/quotes just left of the cursor, and general code clean-up. +;; * [Matt Briggs](https://github.com/mbriggs) contributed expansions for ruby-mode. +;; * [Ivan Andrus](https://github.com/gvol) contributed expansions for python-mode, text-mode, LaTeX-mode and nxml-mode. +;; * [Raimon Grau](https://github.com/kidd) added support for when transient-mark-mode is off. +;; * [Gleb Peregud](https://github.com/gleber) contributed expansions for erlang-mode. +;; * [fgeller](https://github.com/fgeller) and [edmccard](https://github.com/edmccard) contributed better support for python and its multiple modes. +;; * [François Févotte](https://github.com/ffevotte) contributed expansions for C and C++. +;; * [Roland Walker](https://github.com/rolandwalker) added option to copy the contents of the most recent action to a register, and some fixes. +;; * [Damien Cassou](https://github.com/DamienCassou) added option to continue expanding/contracting with fast keys after initial expand. + +;; Thanks! + +;;; Code: + +(require 'expand-region-core) +(require 'expand-region-custom) +(require 'er-basic-expansions) + +;;;###autoload +(defun er/expand-region (arg) + "Increase selected region by semantic units. + +With prefix argument expands the region that many times. +If prefix argument is negative calls `er/contract-region'. +If prefix argument is 0 it resets point and mark to their state +before calling `er/expand-region' for the first time." + (interactive "p") + (if (< arg 1) + (er/contract-region (- arg)) + (er--prepare-expanding) + (while (>= arg 1) + (setq arg (- arg 1)) + (when (eq 'early-exit (er--expand-region-1)) + (setq arg 0))) + (when (and expand-region-fast-keys-enabled + (not (memq last-command '(er/expand-region er/contract-region)))) + (er/prepare-for-more-expansions)))) + +;; (eval-after-load 'clojure-mode '(require 'clojure-mode-expansions)) +;; (eval-after-load 'erlang-mode '(require 'erlang-mode-expansions)) +;; (eval-after-load 'feature-mode '(require 'feature-mode-expansions)) +;; (eval-after-load 'sgml-mode '(require 'html-mode-expansions)) ;; html-mode is defined in sgml-mode.el +;; (eval-after-load 'rhtml-mode '(require 'html-mode-expansions)) +;; (eval-after-load 'nxhtml-mode '(require 'html-mode-expansions)) +;; (eval-after-load 'web-mode '(require 'web-mode-expansions)) +;; (eval-after-load 'js '(require 'js-mode-expansions)) +;; (eval-after-load 'js2-mode '(require 'js-mode-expansions)) +;; (eval-after-load 'js2-mode '(require 'js2-mode-expansions)) +;; (eval-after-load 'js3-mode '(require 'js-mode-expansions)) +;; (eval-after-load 'latex '(require 'latex-mode-expansions)) +;; (eval-after-load 'nxml-mode '(require 'nxml-mode-expansions)) +;; (eval-after-load 'octave-mod '(require 'octave-expansions)) +;; (eval-after-load 'octave '(require 'octave-expansions)) +;; (eval-after-load 'python '(progn +;; (when expand-region-guess-python-mode +;; (expand-region-guess-python-mode)) +;; (if (eq 'python expand-region-preferred-python-mode) +;; (require 'python-el-expansions) +;; (require 'python-el-fgallina-expansions)))) +;; (eval-after-load 'python-mode '(require 'python-mode-expansions)) +;; (eval-after-load 'ruby-mode '(require 'ruby-mode-expansions)) +;; (eval-after-load 'org '(require 'the-org-mode-expansions)) +(eval-after-load 'cc-mode '(require 'cc-mode-expansions)) +;; (eval-after-load 'text-mode '(require 'text-mode-expansions)) +;; (eval-after-load 'cperl-mode '(require 'cperl-mode-expansions)) +;; (eval-after-load 'sml-mode '(require 'sml-mode-expansions)) +;; (eval-after-load 'enh-ruby-mode '(require 'enh-ruby-mode-expansions)) +;; (eval-after-load 'subword '(require 'subword-mode-expansions)) +;; (eval-after-load 'yaml-mode '(require 'yaml-mode-expansions)) + +(provide 'expand-region) + +;;; expand-region.el ends here |
