Delete obsolete elpa packages
This commit is contained in:
parent
02b05ff28f
commit
ecd038a9a4
|
@ -1,99 +0,0 @@
|
|||
;;; hydra-autoloads.el --- automatically extracted autoloads
|
||||
;;
|
||||
;;; Code:
|
||||
|
||||
(add-to-list 'load-path (directory-file-name
|
||||
(or (file-name-directory #$) (car load-path))))
|
||||
|
||||
|
||||
;;;### (autoloads nil "hydra" "hydra.el" (0 0 0 0))
|
||||
;;; Generated autoloads from hydra.el
|
||||
|
||||
(autoload 'defhydra "hydra" "\
|
||||
Create a Hydra - a family of functions with prefix NAME.
|
||||
|
||||
NAME should be a symbol, it will be the prefix of all functions
|
||||
defined here.
|
||||
|
||||
BODY has the format:
|
||||
|
||||
(BODY-MAP BODY-KEY &rest BODY-PLIST)
|
||||
|
||||
DOCSTRING will be displayed in the echo area to identify the
|
||||
Hydra. When DOCSTRING starts with a newline, special Ruby-style
|
||||
substitution will be performed by `hydra--format'.
|
||||
|
||||
Functions are created on basis of HEADS, each of which has the
|
||||
format:
|
||||
|
||||
(KEY CMD &optional HINT &rest PLIST)
|
||||
|
||||
BODY-MAP is a keymap; `global-map' is used quite often. Each
|
||||
function generated from HEADS will be bound in BODY-MAP to
|
||||
BODY-KEY + KEY (both are strings passed to `kbd'), and will set
|
||||
the transient map so that all following heads can be called
|
||||
though KEY only. BODY-KEY can be an empty string.
|
||||
|
||||
CMD is a callable expression: either an interactive function
|
||||
name, or an interactive lambda, or a single sexp (it will be
|
||||
wrapped in an interactive lambda).
|
||||
|
||||
HINT is a short string that identifies its head. It will be
|
||||
printed beside KEY in the echo erea if `hydra-is-helpful' is not
|
||||
nil. If you don't even want the KEY to be printed, set HINT
|
||||
explicitly to nil.
|
||||
|
||||
The heads inherit their PLIST from BODY-PLIST and are allowed to
|
||||
override some keys. The keys recognized are :exit, :bind, and :column.
|
||||
:exit can be:
|
||||
|
||||
- nil (default): this head will continue the Hydra state.
|
||||
- t: this head will stop the Hydra state.
|
||||
|
||||
:bind can be:
|
||||
- nil: this head will not be bound in BODY-MAP.
|
||||
- a lambda taking KEY and CMD used to bind a head.
|
||||
|
||||
:column is a string that sets the column for all subsequent heads.
|
||||
|
||||
It is possible to omit both BODY-MAP and BODY-KEY if you don't
|
||||
want to bind anything. In that case, typically you will bind the
|
||||
generated NAME/body command. This command is also the return
|
||||
result of `defhydra'.
|
||||
|
||||
\(fn NAME BODY &optional DOCSTRING &rest HEADS)" nil t)
|
||||
|
||||
(function-put 'defhydra 'lisp-indent-function 'defun)
|
||||
|
||||
(function-put 'defhydra 'doc-string-elt '3)
|
||||
|
||||
(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "hydra" '("hydra-" "defhydra")))
|
||||
|
||||
;;;***
|
||||
|
||||
;;;### (autoloads nil "hydra-examples" "hydra-examples.el" (0 0 0
|
||||
;;;;;; 0))
|
||||
;;; Generated autoloads from hydra-examples.el
|
||||
|
||||
(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "hydra-examples" '("hydra-" "org-agenda-cts" "whitespace-mode")))
|
||||
|
||||
;;;***
|
||||
|
||||
;;;### (autoloads nil "hydra-ox" "hydra-ox.el" (0 0 0 0))
|
||||
;;; Generated autoloads from hydra-ox.el
|
||||
|
||||
(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "hydra-ox" '("hydra-ox")))
|
||||
|
||||
;;;***
|
||||
|
||||
;;;### (autoloads nil nil ("hydra-pkg.el") (0 0 0 0))
|
||||
|
||||
;;;***
|
||||
|
||||
;; Local Variables:
|
||||
;; version-control: never
|
||||
;; no-byte-compile: t
|
||||
;; no-update-autoloads: t
|
||||
;; coding: utf-8
|
||||
;; End:
|
||||
;;; hydra-autoloads.el ends here
|
|
@ -1,393 +0,0 @@
|
|||
;;; hydra-examples.el --- Some applications for Hydra
|
||||
|
||||
;; Copyright (C) 2015 Free Software Foundation, Inc.
|
||||
|
||||
;; Author: Oleh Krehel
|
||||
|
||||
;; This file is part of GNU Emacs.
|
||||
|
||||
;; GNU Emacs 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.
|
||||
|
||||
;; GNU Emacs 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 GNU Emacs. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
;;; Commentary:
|
||||
;;
|
||||
;; These are the sample Hydras.
|
||||
;;
|
||||
;; If you want to use them plainly, set `hydra-examples-verbatim' to t
|
||||
;; before requiring this file. But it's probably better to only look
|
||||
;; at them and use them as templates for building your own.
|
||||
|
||||
;;; Code:
|
||||
|
||||
(require 'hydra)
|
||||
|
||||
;;* Examples
|
||||
;;** Example 1: text scale
|
||||
(when (bound-and-true-p hydra-examples-verbatim)
|
||||
(defhydra hydra-zoom (global-map "<f2>")
|
||||
"zoom"
|
||||
("g" text-scale-increase "in")
|
||||
("l" text-scale-decrease "out")))
|
||||
|
||||
;; This example generates three commands:
|
||||
;;
|
||||
;; `hydra-zoom/text-scale-increase'
|
||||
;; `hydra-zoom/text-scale-decrease'
|
||||
;; `hydra-zoom/body'
|
||||
;;
|
||||
;; In addition, two of them are bound like this:
|
||||
;;
|
||||
;; (global-set-key (kbd "<f2> g") 'hydra-zoom/text-scale-increase)
|
||||
;; (global-set-key (kbd "<f2> l") 'hydra-zoom/text-scale-decrease)
|
||||
;;
|
||||
;; Note that you can substitute `global-map' with e.g. `emacs-lisp-mode-map' if you need.
|
||||
;; The functions generated will be the same, except the binding code will change to:
|
||||
;;
|
||||
;; (define-key emacs-lisp-mode-map [f2 103]
|
||||
;; (function hydra-zoom/text-scale-increase))
|
||||
;; (define-key emacs-lisp-mode-map [f2 108]
|
||||
;; (function hydra-zoom/text-scale-decrease))
|
||||
|
||||
;;** Example 2: move window splitter
|
||||
(when (bound-and-true-p hydra-examples-verbatim)
|
||||
(defhydra hydra-splitter (global-map "C-M-s")
|
||||
"splitter"
|
||||
("h" hydra-move-splitter-left)
|
||||
("j" hydra-move-splitter-down)
|
||||
("k" hydra-move-splitter-up)
|
||||
("l" hydra-move-splitter-right)))
|
||||
|
||||
;;** Example 3: jump to error
|
||||
(when (bound-and-true-p hydra-examples-verbatim)
|
||||
(defhydra hydra-error (global-map "M-g")
|
||||
"goto-error"
|
||||
("h" first-error "first")
|
||||
("j" next-error "next")
|
||||
("k" previous-error "prev")
|
||||
("v" recenter-top-bottom "recenter")
|
||||
("q" nil "quit")))
|
||||
|
||||
;; This example introduces only one new thing: since the command
|
||||
;; passed to the "q" head is nil, it will quit the Hydra without doing
|
||||
;; anything. Heads that quit the Hydra instead of continuing are
|
||||
;; referred to as having blue :color. All the other heads have red
|
||||
;; :color, unless other is specified.
|
||||
|
||||
;;** Example 4: toggle rarely used modes
|
||||
(when (bound-and-true-p hydra-examples-verbatim)
|
||||
(defvar whitespace-mode nil)
|
||||
(global-set-key
|
||||
(kbd "C-c C-v")
|
||||
(defhydra hydra-toggle-simple (:color blue)
|
||||
"toggle"
|
||||
("a" abbrev-mode "abbrev")
|
||||
("d" toggle-debug-on-error "debug")
|
||||
("f" auto-fill-mode "fill")
|
||||
("t" toggle-truncate-lines "truncate")
|
||||
("w" whitespace-mode "whitespace")
|
||||
("q" nil "cancel"))))
|
||||
|
||||
;; Note that in this case, `defhydra' returns the `hydra-toggle-simple/body'
|
||||
;; symbol, which is then passed to `global-set-key'.
|
||||
;;
|
||||
;; Another new thing is that both the keymap and the body prefix are
|
||||
;; skipped. This means that `defhydra' will bind nothing - that's why
|
||||
;; `global-set-key' is necessary.
|
||||
;;
|
||||
;; One more new thing is that you can assign a :color to the body. All
|
||||
;; heads will inherit this color. The code above is very much equivalent to:
|
||||
;;
|
||||
;; (global-set-key (kbd "C-c C-v a") 'abbrev-mode)
|
||||
;; (global-set-key (kbd "C-c C-v d") 'toggle-debug-on-error)
|
||||
;;
|
||||
;; The differences are:
|
||||
;;
|
||||
;; * You get a hint immediately after "C-c C-v"
|
||||
;; * You can cancel and call a command immediately, e.g. "C-c C-v C-n"
|
||||
;; is equivalent to "C-n" with Hydra approach, while it will error
|
||||
;; that "C-c C-v C-n" isn't bound with the usual approach.
|
||||
|
||||
;;** Example 5: mini-vi
|
||||
(defun hydra-vi/pre ()
|
||||
(set-cursor-color "#e52b50"))
|
||||
|
||||
(defun hydra-vi/post ()
|
||||
(set-cursor-color "#ffffff"))
|
||||
|
||||
(when (bound-and-true-p hydra-examples-verbatim)
|
||||
(global-set-key
|
||||
(kbd "C-z")
|
||||
(defhydra hydra-vi (:pre hydra-vi/pre :post hydra-vi/post :color amaranth)
|
||||
"vi"
|
||||
("l" forward-char)
|
||||
("h" backward-char)
|
||||
("j" next-line)
|
||||
("k" previous-line)
|
||||
("m" set-mark-command "mark")
|
||||
("a" move-beginning-of-line "beg")
|
||||
("e" move-end-of-line "end")
|
||||
("d" delete-region "del" :color blue)
|
||||
("y" kill-ring-save "yank" :color blue)
|
||||
("q" nil "quit")))
|
||||
(hydra-set-property 'hydra-vi :verbosity 1))
|
||||
|
||||
;; This example introduces :color amaranth. It's similar to red,
|
||||
;; except while you can quit red with any binding which isn't a Hydra
|
||||
;; head, you can quit amaranth only with a blue head. So you can quit
|
||||
;; this mode only with "d", "y", "q" or "C-g".
|
||||
;;
|
||||
;; Another novelty are the :pre and :post handlers. :pre will be
|
||||
;; called before each command, while :post will be called when the
|
||||
;; Hydra quits. In this case, they're used to override the cursor
|
||||
;; color while Hydra is active.
|
||||
|
||||
;;** Example 6: selective global bind
|
||||
(when (bound-and-true-p hydra-examples-verbatim)
|
||||
(defhydra hydra-next-error (global-map "C-x")
|
||||
"next-error"
|
||||
("`" next-error "next")
|
||||
("j" next-error "next" :bind nil)
|
||||
("k" previous-error "previous" :bind nil)))
|
||||
|
||||
;; This example will bind "C-x `" in `global-map', but it will not
|
||||
;; bind "C-x j" and "C-x k".
|
||||
;; You can still "C-x `jjk" though.
|
||||
|
||||
;;** Example 7: toggle with Ruby-style docstring
|
||||
(defvar whitespace-mode nil)
|
||||
(defhydra hydra-toggle (:color pink)
|
||||
"
|
||||
_a_ abbrev-mode: %`abbrev-mode
|
||||
_d_ debug-on-error: %`debug-on-error
|
||||
_f_ auto-fill-mode: %`auto-fill-function
|
||||
_t_ truncate-lines: %`truncate-lines
|
||||
_w_ whitespace-mode: %`whitespace-mode
|
||||
|
||||
"
|
||||
("a" abbrev-mode nil)
|
||||
("d" toggle-debug-on-error nil)
|
||||
("f" auto-fill-mode nil)
|
||||
("t" toggle-truncate-lines nil)
|
||||
("w" whitespace-mode nil)
|
||||
("q" nil "quit"))
|
||||
;; Recommended binding:
|
||||
;; (global-set-key (kbd "C-c C-v") 'hydra-toggle/body)
|
||||
|
||||
;; Here, using e.g. "_a_" translates to "a" with proper face.
|
||||
;; More interestingly:
|
||||
;;
|
||||
;; "foobar %`abbrev-mode" means roughly (format "foobar %S" abbrev-mode)
|
||||
;;
|
||||
;; This means that you actually see the state of the mode that you're changing.
|
||||
|
||||
;;** Example 8: the whole menu for `Buffer-menu-mode'
|
||||
(defhydra hydra-buffer-menu (:color pink
|
||||
:hint nil)
|
||||
"
|
||||
^Mark^ ^Unmark^ ^Actions^ ^Search
|
||||
^^^^^^^^----------------------------------------------------------------- (__)
|
||||
_m_: mark _u_: unmark _x_: execute _R_: re-isearch (oo)
|
||||
_s_: save _U_: unmark up _b_: bury _I_: isearch /------\\/
|
||||
_d_: delete ^ ^ _g_: refresh _O_: multi-occur / | ||
|
||||
_D_: delete up ^ ^ _T_: files only: % -28`Buffer-menu-files-only^^ * /\\---/\\
|
||||
_~_: modified ^ ^ ^ ^ ^^ ~~ ~~
|
||||
"
|
||||
("m" Buffer-menu-mark)
|
||||
("u" Buffer-menu-unmark)
|
||||
("U" Buffer-menu-backup-unmark)
|
||||
("d" Buffer-menu-delete)
|
||||
("D" Buffer-menu-delete-backwards)
|
||||
("s" Buffer-menu-save)
|
||||
("~" Buffer-menu-not-modified)
|
||||
("x" Buffer-menu-execute)
|
||||
("b" Buffer-menu-bury)
|
||||
("g" revert-buffer)
|
||||
("T" Buffer-menu-toggle-files-only)
|
||||
("O" Buffer-menu-multi-occur :color blue)
|
||||
("I" Buffer-menu-isearch-buffers :color blue)
|
||||
("R" Buffer-menu-isearch-buffers-regexp :color blue)
|
||||
("c" nil "cancel")
|
||||
("v" Buffer-menu-select "select" :color blue)
|
||||
("o" Buffer-menu-other-window "other-window" :color blue)
|
||||
("q" quit-window "quit" :color blue))
|
||||
;; Recommended binding:
|
||||
;; (define-key Buffer-menu-mode-map "." 'hydra-buffer-menu/body)
|
||||
|
||||
;;** Example 9: s-expressions in the docstring
|
||||
;; You can inline s-expresssions into the docstring like this:
|
||||
(defvar dired-mode-map)
|
||||
(declare-function dired-mark "dired")
|
||||
(when (bound-and-true-p hydra-examples-verbatim)
|
||||
(require 'dired)
|
||||
(defhydra hydra-marked-items (dired-mode-map "")
|
||||
"
|
||||
Number of marked items: %(length (dired-get-marked-files))
|
||||
"
|
||||
("m" dired-mark "mark")))
|
||||
|
||||
;; This results in the following dynamic docstring:
|
||||
;;
|
||||
;; (format "Number of marked items: %S\n"
|
||||
;; (length (dired-get-marked-files)))
|
||||
;;
|
||||
;; You can use `format'-style width specs, e.g. % 10(length nil).
|
||||
|
||||
;;** Example 10: apropos family
|
||||
(defhydra hydra-apropos (:color blue
|
||||
:hint nil)
|
||||
"
|
||||
_a_propos _c_ommand
|
||||
_d_ocumentation _l_ibrary
|
||||
_v_ariable _u_ser-option
|
||||
^ ^ valu_e_"
|
||||
("a" apropos)
|
||||
("d" apropos-documentation)
|
||||
("v" apropos-variable)
|
||||
("c" apropos-command)
|
||||
("l" apropos-library)
|
||||
("u" apropos-user-option)
|
||||
("e" apropos-value))
|
||||
;; Recommended binding:
|
||||
;; (global-set-key (kbd "C-c h") 'hydra-apropos/body)
|
||||
|
||||
;;** Example 11: rectangle-mark-mode
|
||||
(require 'rect)
|
||||
(defhydra hydra-rectangle (:body-pre (rectangle-mark-mode 1)
|
||||
:color pink
|
||||
:post (deactivate-mark))
|
||||
"
|
||||
^_k_^ _d_elete _s_tring
|
||||
_h_ _l_ _o_k _y_ank
|
||||
^_j_^ _n_ew-copy _r_eset
|
||||
^^^^ _e_xchange _u_ndo
|
||||
^^^^ ^ ^ _x_kill
|
||||
"
|
||||
("h" rectangle-backward-char nil)
|
||||
("l" rectangle-forward-char nil)
|
||||
("k" rectangle-previous-line nil)
|
||||
("j" rectangle-next-line nil)
|
||||
("e" hydra-ex-point-mark nil)
|
||||
("n" copy-rectangle-as-kill nil)
|
||||
("d" delete-rectangle nil)
|
||||
("r" (if (region-active-p)
|
||||
(deactivate-mark)
|
||||
(rectangle-mark-mode 1)) nil)
|
||||
("y" yank-rectangle nil)
|
||||
("u" undo nil)
|
||||
("s" string-rectangle nil)
|
||||
("x" kill-rectangle nil)
|
||||
("o" nil nil))
|
||||
|
||||
;; Recommended binding:
|
||||
;; (global-set-key (kbd "C-x SPC") 'hydra-rectangle/body)
|
||||
|
||||
;;** Example 12: org-agenda-view
|
||||
(defun org-agenda-cts ()
|
||||
(and (eq major-mode 'org-agenda-mode)
|
||||
(let ((args (get-text-property
|
||||
(min (1- (point-max)) (point))
|
||||
'org-last-args)))
|
||||
(nth 2 args))))
|
||||
|
||||
(defhydra hydra-org-agenda-view (:hint none)
|
||||
"
|
||||
_d_: ?d? day _g_: time grid=?g? _a_: arch-trees
|
||||
_w_: ?w? week _[_: inactive _A_: arch-files
|
||||
_t_: ?t? fortnight _f_: follow=?f? _r_: clock report=?r?
|
||||
_m_: ?m? month _e_: entry text=?e? _D_: include diary=?D?
|
||||
_y_: ?y? year _q_: quit _L__l__c_: log = ?l?"
|
||||
("SPC" org-agenda-reset-view)
|
||||
("d" org-agenda-day-view (if (eq 'day (org-agenda-cts)) "[x]" "[ ]"))
|
||||
("w" org-agenda-week-view (if (eq 'week (org-agenda-cts)) "[x]" "[ ]"))
|
||||
("t" org-agenda-fortnight-view (if (eq 'fortnight (org-agenda-cts)) "[x]" "[ ]"))
|
||||
("m" org-agenda-month-view (if (eq 'month (org-agenda-cts)) "[x]" "[ ]"))
|
||||
("y" org-agenda-year-view (if (eq 'year (org-agenda-cts)) "[x]" "[ ]"))
|
||||
("l" org-agenda-log-mode (format "% -3S" org-agenda-show-log))
|
||||
("L" (org-agenda-log-mode '(4)))
|
||||
("c" (org-agenda-log-mode 'clockcheck))
|
||||
("f" org-agenda-follow-mode (format "% -3S" org-agenda-follow-mode))
|
||||
("a" org-agenda-archives-mode)
|
||||
("A" (org-agenda-archives-mode 'files))
|
||||
("r" org-agenda-clockreport-mode (format "% -3S" org-agenda-clockreport-mode))
|
||||
("e" org-agenda-entry-text-mode (format "% -3S" org-agenda-entry-text-mode))
|
||||
("g" org-agenda-toggle-time-grid (format "% -3S" org-agenda-use-time-grid))
|
||||
("D" org-agenda-toggle-diary (format "% -3S" org-agenda-include-diary))
|
||||
("!" org-agenda-toggle-deadlines)
|
||||
("[" (let ((org-agenda-include-inactive-timestamps t))
|
||||
(org-agenda-check-type t 'timeline 'agenda)
|
||||
(org-agenda-redo)
|
||||
(message "Display now includes inactive timestamps as well")))
|
||||
("q" (message "Abort") :exit t)
|
||||
("v" nil))
|
||||
|
||||
;; Recommended binding:
|
||||
;; (define-key org-agenda-mode-map "v" 'hydra-org-agenda-view/body)
|
||||
|
||||
;;** Example 13: automatic columns
|
||||
(defhydra hydra-movement ()
|
||||
("j" next-line "down" :column "Vertical")
|
||||
("k" previous-line "up")
|
||||
("l" forward-char "forward" :column "Horizontal")
|
||||
("h" backward-char "back"))
|
||||
|
||||
;;* Helpers
|
||||
(require 'windmove)
|
||||
|
||||
(defun hydra-move-splitter-left (arg)
|
||||
"Move window splitter left."
|
||||
(interactive "p")
|
||||
(if (let ((windmove-wrap-around))
|
||||
(windmove-find-other-window 'right))
|
||||
(shrink-window-horizontally arg)
|
||||
(enlarge-window-horizontally arg)))
|
||||
|
||||
(defun hydra-move-splitter-right (arg)
|
||||
"Move window splitter right."
|
||||
(interactive "p")
|
||||
(if (let ((windmove-wrap-around))
|
||||
(windmove-find-other-window 'right))
|
||||
(enlarge-window-horizontally arg)
|
||||
(shrink-window-horizontally arg)))
|
||||
|
||||
(defun hydra-move-splitter-up (arg)
|
||||
"Move window splitter up."
|
||||
(interactive "p")
|
||||
(if (let ((windmove-wrap-around))
|
||||
(windmove-find-other-window 'up))
|
||||
(enlarge-window arg)
|
||||
(shrink-window arg)))
|
||||
|
||||
(defun hydra-move-splitter-down (arg)
|
||||
"Move window splitter down."
|
||||
(interactive "p")
|
||||
(if (let ((windmove-wrap-around))
|
||||
(windmove-find-other-window 'up))
|
||||
(shrink-window arg)
|
||||
(enlarge-window arg)))
|
||||
|
||||
(defvar rectangle-mark-mode)
|
||||
(defun hydra-ex-point-mark ()
|
||||
"Exchange point and mark."
|
||||
(interactive)
|
||||
(if rectangle-mark-mode
|
||||
(rectangle-exchange-point-and-mark)
|
||||
(let ((mk (mark)))
|
||||
(rectangle-mark-mode 1)
|
||||
(goto-char mk))))
|
||||
|
||||
(provide 'hydra-examples)
|
||||
|
||||
;; Local Variables:
|
||||
;; no-byte-compile: t
|
||||
;; End:
|
||||
;;; hydra-examples.el ends here
|
|
@ -1,127 +0,0 @@
|
|||
;;; hydra-ox.el --- Org mode export widget implemented in Hydra
|
||||
|
||||
;; Copyright (C) 2015 Free Software Foundation, Inc.
|
||||
|
||||
;; Author: Oleh Krehel
|
||||
|
||||
;; This file is part of GNU Emacs.
|
||||
|
||||
;; GNU Emacs 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.
|
||||
|
||||
;; GNU Emacs 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 GNU Emacs. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
;;; Commentary:
|
||||
;;
|
||||
;; This shows how a complex dispatch menu can be built with Hydra.
|
||||
|
||||
;;; Code:
|
||||
|
||||
(require 'hydra)
|
||||
(require 'org)
|
||||
(declare-function org-html-export-as-html 'ox-html)
|
||||
(declare-function org-html-export-to-html 'ox-html)
|
||||
(declare-function org-latex-export-as-latex 'ox-latex)
|
||||
(declare-function org-latex-export-to-latex 'ox-latex)
|
||||
(declare-function org-latex-export-to-pdf 'ox-latex)
|
||||
(declare-function org-ascii-export-as-ascii 'ox-ascii)
|
||||
(declare-function org-ascii-export-to-ascii 'ox-ascii)
|
||||
|
||||
(defhydradio hydra-ox ()
|
||||
(body-only "Export only the body.")
|
||||
(export-scope "Export scope." [buffer subtree])
|
||||
(async-export "When non-nil, export async.")
|
||||
(visible-only "When non-nil, export visible only")
|
||||
(force-publishing "Toggle force publishing"))
|
||||
|
||||
(defhydra hydra-ox-html (:color blue)
|
||||
"ox-html"
|
||||
("H" (org-html-export-as-html
|
||||
hydra-ox/async-export
|
||||
(eq hydra-ox/export-scope 'subtree)
|
||||
hydra-ox/visible-only
|
||||
hydra-ox/body-only)
|
||||
"As HTML buffer")
|
||||
("h" (org-html-export-to-html
|
||||
hydra-ox/async-export
|
||||
(eq hydra-ox/export-scope 'subtree)
|
||||
hydra-ox/visible-only
|
||||
hydra-ox/body-only) "As HTML file")
|
||||
("o" (org-open-file
|
||||
(org-html-export-to-html
|
||||
hydra-ox/async-export
|
||||
(eq hydra-ox/export-scope 'subtree)
|
||||
hydra-ox/visible-only
|
||||
hydra-ox/body-only)) "As HTML file and open")
|
||||
("b" hydra-ox/body "back")
|
||||
("q" nil "quit"))
|
||||
|
||||
(defhydra hydra-ox-latex (:color blue)
|
||||
"ox-latex"
|
||||
("L" org-latex-export-as-latex "As LaTeX buffer")
|
||||
("l" org-latex-export-to-latex "As LaTeX file")
|
||||
("p" org-latex-export-to-pdf "As PDF file")
|
||||
("o" (org-open-file (org-latex-export-to-pdf)) "As PDF file and open")
|
||||
("b" hydra-ox/body "back")
|
||||
("q" nil "quit"))
|
||||
|
||||
(defhydra hydra-ox-text (:color blue)
|
||||
"ox-text"
|
||||
("A" (org-ascii-export-as-ascii
|
||||
nil nil nil nil
|
||||
'(:ascii-charset ascii))
|
||||
"As ASCII buffer")
|
||||
|
||||
("a" (org-ascii-export-to-ascii
|
||||
nil nil nil nil
|
||||
'(:ascii-charset ascii))
|
||||
"As ASCII file")
|
||||
("L" (org-ascii-export-as-ascii
|
||||
nil nil nil nil
|
||||
'(:ascii-charset latin1))
|
||||
"As Latin1 buffer")
|
||||
("l" (org-ascii-export-to-ascii
|
||||
nil nil nil nil
|
||||
'(:ascii-charset latin1))
|
||||
"As Latin1 file")
|
||||
("U" (org-ascii-export-as-ascii
|
||||
nil nil nil nil
|
||||
'(:ascii-charset utf-8))
|
||||
"As UTF-8 buffer")
|
||||
("u" (org-ascii-export-to-ascii
|
||||
nil nil nil nil
|
||||
'(:ascii-charset utf-8))
|
||||
"As UTF-8 file")
|
||||
("b" hydra-ox/body "back")
|
||||
("q" nil "quit"))
|
||||
|
||||
(defhydra hydra-ox ()
|
||||
"
|
||||
_C-b_ Body only: % -15`hydra-ox/body-only^^^ _C-v_ Visible only: %`hydra-ox/visible-only
|
||||
_C-s_ Export scope: % -15`hydra-ox/export-scope _C-f_ Force publishing: %`hydra-ox/force-publishing
|
||||
_C-a_ Async export: %`hydra-ox/async-export
|
||||
|
||||
"
|
||||
("C-b" (hydra-ox/body-only) nil)
|
||||
("C-v" (hydra-ox/visible-only) nil)
|
||||
("C-s" (hydra-ox/export-scope) nil)
|
||||
("C-f" (hydra-ox/force-publishing) nil)
|
||||
("C-a" (hydra-ox/async-export) nil)
|
||||
("h" hydra-ox-html/body "Export to HTML" :exit t)
|
||||
("l" hydra-ox-latex/body "Export to LaTeX" :exit t)
|
||||
("t" hydra-ox-text/body "Export to Plain Text" :exit t)
|
||||
("q" nil "quit"))
|
||||
|
||||
(define-key org-mode-map (kbd "C-c C-,") 'hydra-ox/body)
|
||||
|
||||
(provide 'hydra-ox)
|
||||
|
||||
;;; hydra-ox.el ends here
|
|
@ -1,13 +0,0 @@
|
|||
(define-package "hydra" "20190821.939" "Make bindings that stick around."
|
||||
'((cl-lib "0.5")
|
||||
(lv "0"))
|
||||
:keywords
|
||||
'("bindings")
|
||||
:authors
|
||||
'(("Oleh Krehel" . "ohwoeowho@gmail.com"))
|
||||
:maintainer
|
||||
'("Oleh Krehel" . "ohwoeowho@gmail.com")
|
||||
:url "https://github.com/abo-abo/hydra")
|
||||
;; Local Variables:
|
||||
;; no-byte-compile: t
|
||||
;; End:
|
File diff suppressed because it is too large
Load Diff
|
@ -1,22 +0,0 @@
|
|||
;;; lv-autoloads.el --- automatically extracted autoloads
|
||||
;;
|
||||
;;; Code:
|
||||
|
||||
(add-to-list 'load-path (directory-file-name
|
||||
(or (file-name-directory #$) (car load-path))))
|
||||
|
||||
|
||||
;;;### (autoloads nil "lv" "lv.el" (0 0 0 0))
|
||||
;;; Generated autoloads from lv.el
|
||||
|
||||
(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "lv" '("lv-")))
|
||||
|
||||
;;;***
|
||||
|
||||
;; Local Variables:
|
||||
;; version-control: never
|
||||
;; no-byte-compile: t
|
||||
;; no-update-autoloads: t
|
||||
;; coding: utf-8
|
||||
;; End:
|
||||
;;; lv-autoloads.el ends here
|
|
@ -1,2 +0,0 @@
|
|||
;;; -*- no-byte-compile: t -*-
|
||||
(define-package "lv" "20190821.947" "Other echo area" 'nil :commit "435c55e9f75a8cf3ae6a4ba0c7725e3dc4e5963f" :authors '(("Oleh Krehel")) :maintainer '("Oleh Krehel"))
|
|
@ -1,124 +0,0 @@
|
|||
;;; lv.el --- Other echo area
|
||||
;; Package-Version: 20190821.947
|
||||
|
||||
;; Copyright (C) 2015 Free Software Foundation, Inc.
|
||||
|
||||
;; Author: Oleh Krehel
|
||||
|
||||
;; This file is part of GNU Emacs.
|
||||
|
||||
;; GNU Emacs 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.
|
||||
|
||||
;; GNU Emacs 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 GNU Emacs. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
;;; Commentary:
|
||||
;;
|
||||
;; This package provides `lv-message' intended to be used in place of
|
||||
;; `message' when semi-permanent hints are needed, in order to not
|
||||
;; interfere with Echo Area.
|
||||
;;
|
||||
;; "Я тихо-тихо пiдглядаю,
|
||||
;; І тiшуся собi, як бачу то,
|
||||
;; Шо страшить i не пiдпускає,
|
||||
;; А iншi п’ють тебе, як воду пiсок."
|
||||
;; -- Андрій Кузьменко, L.V.
|
||||
|
||||
;;; Code:
|
||||
|
||||
(defgroup lv nil
|
||||
"The other echo area."
|
||||
:group 'minibuffer
|
||||
:group 'hydra)
|
||||
|
||||
(defcustom lv-use-separator nil
|
||||
"Whether to draw a line between the LV window and the Echo Area."
|
||||
:group 'lv
|
||||
:type 'boolean)
|
||||
|
||||
(defface lv-separator
|
||||
'((((class color) (background light)) :background "grey80")
|
||||
(((class color) (background dark)) :background "grey30"))
|
||||
"Face used to draw line between the lv window and the echo area.
|
||||
This is only used if option `lv-use-separator' is non-nil.
|
||||
Only the background color is significant."
|
||||
:group 'lv)
|
||||
|
||||
(defvar lv-wnd nil
|
||||
"Holds the current LV window.")
|
||||
|
||||
(defvar display-line-numbers)
|
||||
(defvar display-fill-column-indicator)
|
||||
|
||||
(defun lv-window ()
|
||||
"Ensure that LV window is live and return it."
|
||||
(if (window-live-p lv-wnd)
|
||||
lv-wnd
|
||||
(let ((ori (selected-window))
|
||||
buf)
|
||||
(prog1 (setq lv-wnd
|
||||
(select-window
|
||||
(let ((ignore-window-parameters t))
|
||||
(split-window
|
||||
(frame-root-window) -1 'below))))
|
||||
(if (setq buf (get-buffer " *LV*"))
|
||||
(switch-to-buffer buf)
|
||||
(switch-to-buffer " *LV*")
|
||||
(set-window-hscroll lv-wnd 0)
|
||||
(setq window-size-fixed t)
|
||||
(setq mode-line-format nil)
|
||||
(setq header-line-format nil)
|
||||
(setq cursor-type nil)
|
||||
(setq display-line-numbers nil)
|
||||
(setq display-fill-column-indicator nil)
|
||||
(set-window-dedicated-p lv-wnd t)
|
||||
(set-window-parameter lv-wnd 'no-other-window t))
|
||||
(select-window ori)))))
|
||||
|
||||
(defvar golden-ratio-mode)
|
||||
|
||||
(defvar lv-force-update nil
|
||||
"When non-nil, `lv-message' will refresh even for the same string.")
|
||||
|
||||
(defun lv-message (format-string &rest args)
|
||||
"Set LV window contents to (`format' FORMAT-STRING ARGS)."
|
||||
(let* ((str (apply #'format format-string args))
|
||||
(n-lines (cl-count ?\n str))
|
||||
deactivate-mark
|
||||
golden-ratio-mode)
|
||||
(with-selected-window (lv-window)
|
||||
(unless (and (string= (buffer-string) str)
|
||||
(null lv-force-update))
|
||||
(delete-region (point-min) (point-max))
|
||||
(insert str)
|
||||
(when (and (window-system) lv-use-separator)
|
||||
(unless (looking-back "\n" nil)
|
||||
(insert "\n"))
|
||||
(insert
|
||||
(propertize "__" 'face 'lv-separator 'display '(space :height (1)))
|
||||
(propertize "\n" 'face 'lv-separator 'line-height t)))
|
||||
(set (make-local-variable 'window-min-height) n-lines)
|
||||
(setq truncate-lines (> n-lines 1))
|
||||
(let ((window-resize-pixelwise t)
|
||||
(window-size-fixed nil))
|
||||
(fit-window-to-buffer nil nil 1)))
|
||||
(goto-char (point-min)))))
|
||||
|
||||
(defun lv-delete-window ()
|
||||
"Delete LV window and kill its buffer."
|
||||
(when (window-live-p lv-wnd)
|
||||
(let ((buf (window-buffer lv-wnd)))
|
||||
(delete-window lv-wnd)
|
||||
(kill-buffer buf))))
|
||||
|
||||
(provide 'lv)
|
||||
|
||||
;;; lv.el ends here
|
|
@ -1,119 +0,0 @@
|
|||
;;; mc-cycle-cursors.el
|
||||
|
||||
;; Copyright (C) 2012-2016 Magnar Sveen
|
||||
|
||||
;; Author: Magnar Sveen <magnars@gmail.com>
|
||||
;; 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 <http://www.gnu.org/licenses/>.
|
||||
|
||||
;;; Commentary:
|
||||
|
||||
;; This scrolls the buffer to center each cursor in turn.
|
||||
;; Scroll down with C-v, scroll up with M-v
|
||||
;; This is nice when you have cursors that's outside of your view.
|
||||
|
||||
;;; Code:
|
||||
|
||||
(require 'multiple-cursors-core)
|
||||
|
||||
(defun mc/next-fake-cursor-after-point ()
|
||||
(let ((pos (point))
|
||||
(next-pos (1+ (point-max)))
|
||||
next)
|
||||
(mc/for-each-fake-cursor
|
||||
(let ((cursor-pos (overlay-get cursor 'point)))
|
||||
(when (and (< pos cursor-pos)
|
||||
(< cursor-pos next-pos))
|
||||
(setq next-pos cursor-pos)
|
||||
(setq next cursor))))
|
||||
next))
|
||||
|
||||
(defun mc/prev-fake-cursor-before-point ()
|
||||
(let ((pos (point))
|
||||
(prev-pos (1- (point-min)))
|
||||
prev)
|
||||
(mc/for-each-fake-cursor
|
||||
(let ((cursor-pos (overlay-get cursor 'point)))
|
||||
(when (and (> pos cursor-pos)
|
||||
(> cursor-pos prev-pos))
|
||||
(setq prev-pos cursor-pos)
|
||||
(setq prev cursor))))
|
||||
prev))
|
||||
|
||||
(defcustom mc/cycle-looping-behaviour 'continue
|
||||
"What to do if asked to cycle beyond the last cursor or before the first cursor."
|
||||
:type '(radio (const :tag "Loop around to beginning/end of document." continue)
|
||||
(const :tag "Warn and then loop around." warn)
|
||||
(const :tag "Signal an error." error)
|
||||
(const :tag "Don't loop." stop))
|
||||
:group 'multiple-cursors)
|
||||
|
||||
(defun mc/handle-loop-condition (error-message)
|
||||
(cl-ecase mc/cycle-looping-behaviour
|
||||
(error (error error-message))
|
||||
(warn (message error-message))
|
||||
(continue 'continue)
|
||||
(stop 'stop)))
|
||||
|
||||
(defun mc/first-fake-cursor-after (point)
|
||||
"Very similar to mc/furthest-cursor-before-point, but ignores (mark) and (point)."
|
||||
(let* ((cursors (mc/all-fake-cursors))
|
||||
(cursors-after-point (cl-remove-if (lambda (cursor)
|
||||
(< (mc/cursor-beg cursor) point))
|
||||
cursors))
|
||||
(cursors-in-order (cl-sort cursors-after-point '< :key 'mc/cursor-beg)))
|
||||
(car cursors-in-order)))
|
||||
|
||||
(defun mc/last-fake-cursor-before (point)
|
||||
"Very similar to mc/furthest-cursor-before-point, but ignores (mark) and (point)."
|
||||
(let* ((cursors (mc/all-fake-cursors))
|
||||
(cursors-before-point (cl-remove-if (lambda (cursor)
|
||||
(> (mc/cursor-end cursor) point))
|
||||
cursors))
|
||||
(cursors-in-order (cl-sort cursors-before-point '> :key 'mc/cursor-end)))
|
||||
(car cursors-in-order)))
|
||||
|
||||
(cl-defun mc/cycle (next-cursor fallback-cursor loop-message)
|
||||
(when (null next-cursor)
|
||||
(when (eql 'stop (mc/handle-loop-condition loop-message))
|
||||
(return-from mc/cycle nil))
|
||||
(setf next-cursor fallback-cursor))
|
||||
(mc/create-fake-cursor-at-point)
|
||||
(mc/pop-state-from-overlay next-cursor)
|
||||
(recenter))
|
||||
|
||||
(defun mc/cycle-forward ()
|
||||
(interactive)
|
||||
(mc/cycle (mc/next-fake-cursor-after-point)
|
||||
(mc/first-fake-cursor-after (point-min))
|
||||
"We're already at the last cursor."))
|
||||
|
||||
(defun mc/cycle-backward ()
|
||||
(interactive)
|
||||
(mc/cycle (mc/prev-fake-cursor-before-point)
|
||||
(mc/last-fake-cursor-before (point-max))
|
||||
"We're already at the last cursor"))
|
||||
|
||||
(define-key mc/keymap (kbd "C-v") 'mc/cycle-forward)
|
||||
(define-key mc/keymap (kbd "M-v") 'mc/cycle-backward)
|
||||
|
||||
(provide 'mc-cycle-cursors)
|
||||
|
||||
|
||||
;; Local Variables:
|
||||
;; coding: utf-8
|
||||
;; End:
|
||||
|
||||
;;; mc-cycle-cursors.el ends here
|
|
@ -1,110 +0,0 @@
|
|||
;;; mc-edit-lines.el
|
||||
|
||||
;; Copyright (C) 2012-2016 Magnar Sveen
|
||||
|
||||
;; Author: Magnar Sveen <magnars@gmail.com>
|
||||
;; 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 <http://www.gnu.org/licenses/>.
|
||||
|
||||
;;; Commentary:
|
||||
|
||||
;; This file contains functions to add multiple cursors to consecutive lines
|
||||
;; given an active region.
|
||||
|
||||
;; Please see multiple-cursors.el for more commentary.
|
||||
|
||||
;;; Code:
|
||||
|
||||
(require 'multiple-cursors-core)
|
||||
|
||||
(defcustom mc/edit-lines-empty-lines nil
|
||||
"What should be done by `mc/edit-lines' when a line is not long enough."
|
||||
:type '(radio (const :tag "Pad the line with spaces." pad)
|
||||
(const :tag "Ignore the line." ignore)
|
||||
(const :tag "Signal an error." error)
|
||||
(const :tag "Nothing. Cursor is at end of line." nil))
|
||||
:group 'multiple-cursors)
|
||||
|
||||
;;;###autoload
|
||||
(defun mc/edit-lines (&optional arg)
|
||||
"Add one cursor to each line of the active region.
|
||||
Starts from mark and moves in straight down or up towards the
|
||||
line point is on.
|
||||
|
||||
What is done with lines which are not long enough is governed by
|
||||
`mc/edit-lines-empty-lines'. The prefix argument ARG can be used
|
||||
to override this. If ARG is a symbol (when called from Lisp),
|
||||
that symbol is used instead of `mc/edit-lines-empty-lines'.
|
||||
Otherwise, if ARG negative, short lines will be ignored. Any
|
||||
other non-nil value will cause short lines to be padded."
|
||||
(interactive "P")
|
||||
(when (not (and mark-active (/= (point) (mark))))
|
||||
(error "Mark a set of lines first"))
|
||||
(mc/remove-fake-cursors)
|
||||
(let* ((col (current-column))
|
||||
(point-line (mc/line-number-at-pos))
|
||||
(mark-line (progn (exchange-point-and-mark) (mc/line-number-at-pos)))
|
||||
(direction (if (< point-line mark-line) :up :down))
|
||||
(style (cond
|
||||
;; called from lisp
|
||||
((and arg (symbolp arg))
|
||||
arg)
|
||||
;; negative argument
|
||||
((< (prefix-numeric-value arg) 0)
|
||||
'ignore)
|
||||
(arg 'pad)
|
||||
(t mc/edit-lines-empty-lines))))
|
||||
(deactivate-mark)
|
||||
(when (and (eq direction :up) (bolp))
|
||||
(previous-logical-line 1 nil)
|
||||
(move-to-column col))
|
||||
;; Add the cursors
|
||||
(while (not (eq (mc/line-number-at-pos) point-line))
|
||||
;; Pad the line
|
||||
(when (eq style 'pad)
|
||||
(while (< (current-column) col)
|
||||
(insert " ")))
|
||||
;; Error
|
||||
(when (and (eq style 'error)
|
||||
(not (equal col (current-column))))
|
||||
(error "Short line encountered in `mc/edit-lines'"))
|
||||
;; create the cursor
|
||||
(unless (and (eq style 'ignore)
|
||||
(not (equal col (current-column))))
|
||||
(mc/create-fake-cursor-at-point))
|
||||
;; proceed to next
|
||||
(if (eq direction :up)
|
||||
(previous-logical-line 1 nil)
|
||||
(next-logical-line 1 nil))
|
||||
(move-to-column col))
|
||||
(multiple-cursors-mode)))
|
||||
|
||||
;;;###autoload
|
||||
(defun mc/edit-ends-of-lines ()
|
||||
"Add one cursor to the end of each line in the active region."
|
||||
(interactive)
|
||||
(mc/edit-lines)
|
||||
(mc/execute-command-for-all-cursors 'end-of-line))
|
||||
|
||||
;;;###autoload
|
||||
(defun mc/edit-beginnings-of-lines ()
|
||||
"Add one cursor to the beginning of each line in the active region."
|
||||
(interactive)
|
||||
(mc/edit-lines)
|
||||
(mc/execute-command-for-all-cursors 'beginning-of-line))
|
||||
|
||||
(provide 'mc-edit-lines)
|
||||
|
||||
;;; mc-edit-lines.el ends here
|
|
@ -1,107 +0,0 @@
|
|||
;;; mc-hide-unmatched-lines.el
|
||||
|
||||
;; Copyright (C) 2014 Aleksey Fedotov
|
||||
|
||||
;; Author: Aleksey Fedotov <lexa@cfotr.com>
|
||||
;; 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 <http://www.gnu.org/licenses/>.
|
||||
|
||||
;;; 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 "<return>" or "C-g"
|
||||
;;
|
||||
|
||||
;;; Code:
|
||||
|
||||
(require 'multiple-cursors-core)
|
||||
(require 'mc-mark-more)
|
||||
|
||||
(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 "<return>") '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))
|
||||
|
||||
;;;###autoload
|
||||
(define-minor-mode mc-hide-unmatched-lines-mode
|
||||
"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 <return> 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)
|
|
@ -1,709 +0,0 @@
|
|||
;;; mc-mark-more.el
|
||||
|
||||
;; Copyright (C) 2012-2016 Magnar Sveen
|
||||
|
||||
;; Author: Magnar Sveen <magnars@gmail.com>
|
||||
;; 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 <http://www.gnu.org/licenses/>.
|
||||
|
||||
;;; Commentary:
|
||||
|
||||
;; This file contains functions to mark more parts of the buffer.
|
||||
;; See ./features/mark-more.feature for examples.
|
||||
|
||||
;; Please see multiple-cursors.el for more commentary.
|
||||
|
||||
;;; Code:
|
||||
|
||||
(require 'multiple-cursors-core)
|
||||
(require 'thingatpt)
|
||||
|
||||
(defun mc/cursor-end (cursor)
|
||||
(if (overlay-get cursor 'mark-active)
|
||||
(max (overlay-get cursor 'point)
|
||||
(overlay-get cursor 'mark))
|
||||
(overlay-get cursor 'point)))
|
||||
|
||||
(defun mc/cursor-beg (cursor)
|
||||
(if (overlay-get cursor 'mark-active)
|
||||
(min (overlay-get cursor 'point)
|
||||
(overlay-get cursor 'mark))
|
||||
(overlay-get cursor 'point)))
|
||||
|
||||
(defun mc/furthest-region-end ()
|
||||
(let ((end (max (mark) (point))))
|
||||
(mc/for-each-fake-cursor
|
||||
(setq end (max end (mc/cursor-end cursor))))
|
||||
end))
|
||||
|
||||
(defun mc/first-region-start ()
|
||||
(let ((beg (min (mark) (point))))
|
||||
(mc/for-each-fake-cursor
|
||||
(setq beg (min beg (mc/cursor-beg cursor))))
|
||||
beg))
|
||||
|
||||
(defun mc/furthest-cursor-before-point ()
|
||||
(let ((beg (if mark-active (min (mark) (point)) (point)))
|
||||
furthest)
|
||||
(mc/for-each-fake-cursor
|
||||
(when (< (mc/cursor-beg cursor) beg)
|
||||
(setq beg (mc/cursor-beg cursor))
|
||||
(setq furthest cursor)))
|
||||
furthest))
|
||||
|
||||
(defun mc/furthest-cursor-after-point ()
|
||||
(let ((end (if mark-active (max (mark) (point)) (point)))
|
||||
furthest)
|
||||
(mc/for-each-fake-cursor
|
||||
(when (> (mc/cursor-end cursor) end)
|
||||
(setq end (mc/cursor-end cursor))
|
||||
(setq furthest cursor)))
|
||||
furthest))
|
||||
|
||||
(defun mc/fake-cursor-at-point (&optional point)
|
||||
"Return the fake cursor with its point right at POINT (defaults
|
||||
to (point)), or nil."
|
||||
(setq point (or point (point)))
|
||||
(let ((cursors (mc/all-fake-cursors))
|
||||
(c nil))
|
||||
(catch 'found
|
||||
(while (setq c (pop cursors))
|
||||
(when (eq (marker-position (overlay-get c 'point))
|
||||
point)
|
||||
(throw 'found c))))))
|
||||
|
||||
(defun mc/region-strings ()
|
||||
(let ((strings (list (buffer-substring-no-properties (point) (mark)))))
|
||||
(mc/for-each-fake-cursor
|
||||
(add-to-list 'strings (buffer-substring-no-properties
|
||||
(mc/cursor-beg cursor)
|
||||
(mc/cursor-end cursor))))
|
||||
strings))
|
||||
|
||||
(defvar mc/enclose-search-term nil
|
||||
"How should mc/mark-more-* search for more matches?
|
||||
|
||||
Match everything: nil
|
||||
Match only whole words: 'words
|
||||
Match only whole symbols: 'symbols
|
||||
|
||||
Use like case-fold-search, don't recommend setting it globally.")
|
||||
|
||||
(defun mc/mark-more-like-this (skip-last direction)
|
||||
(let ((case-fold-search nil)
|
||||
(re (regexp-opt (mc/region-strings) mc/enclose-search-term))
|
||||
(point-out-of-order (cl-ecase direction
|
||||
(forwards (< (point) (mark)))
|
||||
(backwards (not (< (point) (mark))))))
|
||||
(furthest-cursor (cl-ecase direction
|
||||
(forwards (mc/furthest-cursor-after-point))
|
||||
(backwards (mc/furthest-cursor-before-point))))
|
||||
(start-char (cl-ecase direction
|
||||
(forwards (mc/furthest-region-end))
|
||||
(backwards (mc/first-region-start))))
|
||||
(search-function (cl-ecase direction
|
||||
(forwards 'search-forward-regexp)
|
||||
(backwards 'search-backward-regexp)))
|
||||
(match-point-getter (cl-ecase direction
|
||||
(forwards 'match-beginning)
|
||||
(backwards 'match-end))))
|
||||
(if (and skip-last (not furthest-cursor))
|
||||
(error "No cursors to be skipped")
|
||||
(mc/save-excursion
|
||||
(goto-char start-char)
|
||||
(when skip-last
|
||||
(mc/remove-fake-cursor furthest-cursor))
|
||||
(if (funcall search-function re nil t)
|
||||
(progn
|
||||
(push-mark (funcall match-point-getter 0))
|
||||
(when point-out-of-order
|
||||
(exchange-point-and-mark))
|
||||
(mc/create-fake-cursor-at-point))
|
||||
(user-error "no more matches found."))))))
|
||||
|
||||
;;;###autoload
|
||||
(defun mc/mark-next-like-this (arg)
|
||||
"Find and mark the next part of the buffer matching the currently active region
|
||||
If no region is active add a cursor on the next line
|
||||
With negative ARG, delete the last one instead.
|
||||
With zero ARG, skip the last one and mark next."
|
||||
(interactive "p")
|
||||
(if (< arg 0)
|
||||
(let ((cursor (mc/furthest-cursor-after-point)))
|
||||
(if cursor
|
||||
(mc/remove-fake-cursor cursor)
|
||||
(error "No cursors to be unmarked")))
|
||||
(if (region-active-p)
|
||||
(mc/mark-more-like-this (= arg 0) 'forwards)
|
||||
(mc/mark-lines arg 'forwards)))
|
||||
(mc/maybe-multiple-cursors-mode))
|
||||
|
||||
;;;###autoload
|
||||
(defun mc/mark-next-like-this-word (arg)
|
||||
"Find and mark the next part of the buffer matching the currently active region
|
||||
If no region is active, mark the word at the point and find the next match
|
||||
With negative ARG, delete the last one instead.
|
||||
With zero ARG, skip the last one and mark next."
|
||||
(interactive "p")
|
||||
(if (< arg 0)
|
||||
(let ((cursor (mc/furthest-cursor-after-point)))
|
||||
(if cursor
|
||||
(mc/remove-fake-cursor cursor)
|
||||
(error "No cursors to be unmarked")))
|
||||
(if (region-active-p)
|
||||
(mc/mark-more-like-this (= arg 0) 'forwards)
|
||||
(mc--select-thing-at-point 'word)
|
||||
(mc/mark-more-like-this (= arg 0) 'forwards)))
|
||||
(mc/maybe-multiple-cursors-mode))
|
||||
|
||||
(defun mc/mark-next-like-this-symbol (arg)
|
||||
"Find and mark the next part of the buffer matching the currently active region
|
||||
If no region is active, mark the symbol at the point and find the next match
|
||||
With negative ARG, delete the last one instead.
|
||||
With zero ARG, skip the last one and mark next."
|
||||
(interactive "p")
|
||||
(if (< arg 0)
|
||||
(let ((cursor (mc/furthest-cursor-after-point)))
|
||||
(if cursor
|
||||
(mc/remove-fake-cursor cursor)
|
||||
(error "No cursors to be unmarked")))
|
||||
(if (region-active-p)
|
||||
(mc/mark-more-like-this (= arg 0) 'forwards)
|
||||
(mc--select-thing-at-point 'symbol)
|
||||
(mc/mark-more-like-this (= arg 0) 'forwards)))
|
||||
(mc/maybe-multiple-cursors-mode))
|
||||
|
||||
|
||||
;;;###autoload
|
||||
(defun mc/mark-next-word-like-this (arg)
|
||||
"Find and mark the next word of the buffer matching the currently active region
|
||||
The matching region must be a whole word to be a match
|
||||
If no region is active, mark the symbol at the point and find the next match
|
||||
With negative ARG, delete the last one instead.
|
||||
With zero ARG, skip the last one and mark next."
|
||||
(interactive "p")
|
||||
(let ((mc/enclose-search-term 'words))
|
||||
(mc/mark-next-like-this arg)))
|
||||
|
||||
;;;###autoload
|
||||
(defun mc/mark-next-symbol-like-this (arg)
|
||||
"Find and mark the next symbol of the buffer matching the currently active region
|
||||
The matching region must be a whole symbol to be a match
|
||||
If no region is active, mark the symbol at the point and find the next match
|
||||
With negative ARG, delete the last one instead.
|
||||
With zero ARG, skip the last one and mark next."
|
||||
(interactive "p")
|
||||
(let ((mc/enclose-search-term 'symbols))
|
||||
(mc/mark-next-like-this arg)))
|
||||
|
||||
;;;###autoload
|
||||
(defun mc/mark-previous-like-this (arg)
|
||||
"Find and mark the previous part of the buffer matching the currently active region
|
||||
If no region is active add a cursor on the previous line
|
||||
With negative ARG, delete the last one instead.
|
||||
With zero ARG, skip the last one and mark next."
|
||||
(interactive "p")
|
||||
(if (< arg 0)
|
||||
(let ((cursor (mc/furthest-cursor-before-point)))
|
||||
(if cursor
|
||||
(mc/remove-fake-cursor cursor)
|
||||
(error "No cursors to be unmarked")))
|
||||
(if (region-active-p)
|
||||
(mc/mark-more-like-this (= arg 0) 'backwards)
|
||||
(mc/mark-lines arg 'backwards)))
|
||||
(mc/maybe-multiple-cursors-mode))
|
||||
|
||||
;;;###autoload
|
||||
(defun mc/mark-previous-like-this-word (arg)
|
||||
"Find and mark the previous part of the buffer matching the currently active region
|
||||
If no region is active, mark the word at the point and find the previous match
|
||||
With negative ARG, delete the last one instead.
|
||||
With zero ARG, skip the last one and mark previous."
|
||||
(interactive "p")
|
||||
(if (< arg 0)
|
||||
(let ((cursor (mc/furthest-cursor-after-point)))
|
||||
(if cursor
|
||||
(mc/remove-fake-cursor cursor)
|
||||
(error "No cursors to be unmarked")))
|
||||
(if (region-active-p)
|
||||
(mc/mark-more-like-this (= arg 0) 'backwards)
|
||||
(mc--select-thing-at-point 'word)
|
||||
(mc/mark-more-like-this (= arg 0) 'backwards)))
|
||||
(mc/maybe-multiple-cursors-mode))
|
||||
|
||||
(defun mc/mark-previous-like-this-symbol (arg)
|
||||
"Find and mark the previous part of the buffer matching the currently active region
|
||||
If no region is active, mark the symbol at the point and find the previous match
|
||||
With negative ARG, delete the last one instead.
|
||||
With zero ARG, skip the last one and mark previous."
|
||||
(interactive "p")
|
||||
(if (< arg 0)
|
||||
(let ((cursor (mc/furthest-cursor-after-point)))
|
||||
(if cursor
|
||||
(mc/remove-fake-cursor cursor)
|
||||
(error "No cursors to be unmarked")))
|
||||
(if (region-active-p)
|
||||
(mc/mark-more-like-this (= arg 0) 'backwards)
|
||||
(mc--select-thing-at-point 'symbol)
|
||||
(mc/mark-more-like-this (= arg 0) 'backwards)))
|
||||
(mc/maybe-multiple-cursors-mode))
|
||||
|
||||
|
||||
;;;###autoload
|
||||
(defun mc/mark-previous-word-like-this (arg)
|
||||
"Find and mark the previous part of the buffer matching the currently active region
|
||||
The matching region must be a whole word to be a match
|
||||
If no region is active add a cursor on the previous line
|
||||
With negative ARG, delete the last one instead.
|
||||
With zero ARG, skip the last one and mark next."
|
||||
(interactive "p")
|
||||
(let ((mc/enclose-search-term 'words))
|
||||
(mc/mark-previous-like-this arg)))
|
||||
|
||||
;;;###autoload
|
||||
(defun mc/mark-previous-symbol-like-this (arg)
|
||||
"Find and mark the previous part of the buffer matching the currently active region
|
||||
The matching region must be a whole symbol to be a match
|
||||
If no region is active add a cursor on the previous line
|
||||
With negative ARG, delete the last one instead.
|
||||
With zero ARG, skip the last one and mark next."
|
||||
(interactive "p")
|
||||
(let ((mc/enclose-search-term 'symbols))
|
||||
(mc/mark-previous-like-this arg)))
|
||||
|
||||
(defun mc/mark-lines (num-lines direction)
|
||||
(dotimes (i (if (= num-lines 0) 1 num-lines))
|
||||
(mc/save-excursion
|
||||
(let ((furthest-cursor (cl-ecase direction
|
||||
(forwards (mc/furthest-cursor-after-point))
|
||||
(backwards (mc/furthest-cursor-before-point)))))
|
||||
(when (overlayp furthest-cursor)
|
||||
(goto-char (overlay-get furthest-cursor 'point))
|
||||
(when (= num-lines 0)
|
||||
(mc/remove-fake-cursor furthest-cursor))))
|
||||
(cl-ecase direction
|
||||
(forwards (next-logical-line 1 nil))
|
||||
(backwards (previous-logical-line 1 nil)))
|
||||
(mc/create-fake-cursor-at-point))))
|
||||
|
||||
;;;###autoload
|
||||
(defun mc/mark-next-lines (arg)
|
||||
(interactive "p")
|
||||
(mc/mark-lines arg 'forwards)
|
||||
(mc/maybe-multiple-cursors-mode))
|
||||
|
||||
;;;###autoload
|
||||
(defun mc/mark-previous-lines (arg)
|
||||
(interactive "p")
|
||||
(mc/mark-lines arg 'backwards)
|
||||
(mc/maybe-multiple-cursors-mode))
|
||||
|
||||
;;;###autoload
|
||||
(defun mc/unmark-next-like-this ()
|
||||
"Deselect next part of the buffer matching the currently active region."
|
||||
(interactive)
|
||||
(mc/mark-next-like-this -1))
|
||||
|
||||
;;;###autoload
|
||||
(defun mc/unmark-previous-like-this ()
|
||||
"Deselect prev part of the buffer matching the currently active region."
|
||||
(interactive)
|
||||
(mc/mark-previous-like-this -1))
|
||||
|
||||
;;;###autoload
|
||||
(defun mc/skip-to-next-like-this ()
|
||||
"Skip the current one and select the next part of the buffer matching the currently active region."
|
||||
(interactive)
|
||||
(mc/mark-next-like-this 0))
|
||||
|
||||
;;;###autoload
|
||||
(defun mc/skip-to-previous-like-this ()
|
||||
"Skip the current one and select the prev part of the buffer matching the currently active region."
|
||||
(interactive)
|
||||
(mc/mark-previous-like-this 0))
|
||||
|
||||
;;;###autoload
|
||||
(defun mc/mark-all-like-this ()
|
||||
"Find and mark all the parts of the buffer matching the currently active region"
|
||||
(interactive)
|
||||
(unless (region-active-p)
|
||||
(error "Mark a region to match first."))
|
||||
(mc/remove-fake-cursors)
|
||||
(let ((master (point))
|
||||
(case-fold-search nil)
|
||||
(point-first (< (point) (mark)))
|
||||
(re (regexp-opt (mc/region-strings) mc/enclose-search-term)))
|
||||
(mc/save-excursion
|
||||
(goto-char 0)
|
||||
(while (search-forward-regexp re nil t)
|
||||
(push-mark (match-beginning 0))
|
||||
(when point-first (exchange-point-and-mark))
|
||||
(unless (= master (point))
|
||||
(mc/create-fake-cursor-at-point))
|
||||
(when point-first (exchange-point-and-mark)))))
|
||||
(if (> (mc/num-cursors) 1)
|
||||
(multiple-cursors-mode 1)
|
||||
(multiple-cursors-mode 0)))
|
||||
|
||||
(defun mc--select-thing-at-point (thing)
|
||||
(let ((bound (bounds-of-thing-at-point thing)))
|
||||
(when bound
|
||||
(set-mark (car bound))
|
||||
(goto-char (cdr bound))
|
||||
bound)))
|
||||
|
||||
(defun mc--select-thing-at-point-or-bark (thing)
|
||||
(unless (or (region-active-p) (mc--select-thing-at-point thing))
|
||||
(error "Mark a region or set cursor on a %s." thing)))
|
||||
|
||||
;;;###autoload
|
||||
(defun mc/mark-all-words-like-this ()
|
||||
(interactive)
|
||||
(mc--select-thing-at-point-or-bark 'word)
|
||||
(let ((mc/enclose-search-term 'words))
|
||||
(mc/mark-all-like-this)))
|
||||
|
||||
;;;###autoload
|
||||
(defun mc/mark-all-symbols-like-this ()
|
||||
(interactive)
|
||||
(mc--select-thing-at-point-or-bark 'symbol)
|
||||
(let ((mc/enclose-search-term 'symbols))
|
||||
(mc/mark-all-like-this)))
|
||||
|
||||
;;;###autoload
|
||||
(defun mc/mark-all-in-region (beg end &optional search)
|
||||
"Find and mark all the parts in the region matching the given search"
|
||||
(interactive "r")
|
||||
(let ((search (or search (read-from-minibuffer "Mark all in region: ")))
|
||||
(case-fold-search nil))
|
||||
(if (string= search "")
|
||||
(message "Mark aborted")
|
||||
(progn
|
||||
(mc/remove-fake-cursors)
|
||||
(goto-char beg)
|
||||
(while (search-forward search end t)
|
||||
(push-mark (match-beginning 0))
|
||||
(mc/create-fake-cursor-at-point))
|
||||
(let ((first (mc/furthest-cursor-before-point)))
|
||||
(if (not first)
|
||||
(error "Search failed for %S" search)
|
||||
(mc/pop-state-from-overlay first)))
|
||||
(if (> (mc/num-cursors) 1)
|
||||
(multiple-cursors-mode 1)
|
||||
(multiple-cursors-mode 0))))))
|
||||
|
||||
;;;###autoload
|
||||
(defun mc/mark-all-in-region-regexp (beg end)
|
||||
"Find and mark all the parts in the region matching the given regexp."
|
||||
(interactive "r")
|
||||
(let ((search (read-regexp "Mark regexp in region: "))
|
||||
(case-fold-search nil))
|
||||
(if (string= search "")
|
||||
(message "Mark aborted")
|
||||
(progn
|
||||
(mc/remove-fake-cursors)
|
||||
(goto-char beg)
|
||||
(let ((lastmatch))
|
||||
(while (and (< (point) end) ; can happen because of (forward-char)
|
||||
(search-forward-regexp search end t))
|
||||
(push-mark (match-beginning 0))
|
||||
(mc/create-fake-cursor-at-point)
|
||||
(setq lastmatch (point))
|
||||
(when (= (point) (match-beginning 0))
|
||||
(forward-char)))
|
||||
(unless lastmatch
|
||||
(error "Search failed for %S" search)))
|
||||
(goto-char (match-end 0))
|
||||
(if (< (mc/num-cursors) 3)
|
||||
(multiple-cursors-mode 0)
|
||||
(mc/pop-state-from-overlay (mc/furthest-cursor-before-point))
|
||||
(multiple-cursors-mode 1))))))
|
||||
|
||||
(when (not (fboundp 'set-temporary-overlay-map))
|
||||
;; Backport this function from newer emacs versions
|
||||
(defun set-temporary-overlay-map (map &optional keep-pred)
|
||||
"Set a new keymap that will only exist for a short period of time.
|
||||
The new keymap to use must be given in the MAP variable. When to
|
||||
remove the keymap depends on user input and KEEP-PRED:
|
||||
|
||||
- if KEEP-PRED is nil (the default), the keymap disappears as
|
||||
soon as any key is pressed, whether or not the key is in MAP;
|
||||
|
||||
- if KEEP-PRED is t, the keymap disappears as soon as a key *not*
|
||||
in MAP is pressed;
|
||||
|
||||
- otherwise, KEEP-PRED must be a 0-arguments predicate that will
|
||||
decide if the keymap should be removed (if predicate returns
|
||||
nil) or kept (otherwise). The predicate will be called after
|
||||
each key sequence."
|
||||
|
||||
(let* ((clearfunsym (make-symbol "clear-temporary-overlay-map"))
|
||||
(overlaysym (make-symbol "t"))
|
||||
(alist (list (cons overlaysym map)))
|
||||
(clearfun
|
||||
`(lambda ()
|
||||
(unless ,(cond ((null keep-pred) nil)
|
||||
((eq t keep-pred)
|
||||
`(eq this-command
|
||||
(lookup-key ',map
|
||||
(this-command-keys-vector))))
|
||||
(t `(funcall ',keep-pred)))
|
||||
(remove-hook 'pre-command-hook ',clearfunsym)
|
||||
(setq emulation-mode-map-alists
|
||||
(delq ',alist emulation-mode-map-alists))))))
|
||||
(set overlaysym overlaysym)
|
||||
(fset clearfunsym clearfun)
|
||||
(add-hook 'pre-command-hook clearfunsym)
|
||||
|
||||
(push alist emulation-mode-map-alists))))
|
||||
|
||||
;;;###autoload
|
||||
(defun mc/mark-more-like-this-extended ()
|
||||
"Like mark-more-like-this, but then lets you adjust with arrows key.
|
||||
The adjustments work like this:
|
||||
|
||||
<up> Mark previous like this and set direction to 'up
|
||||
<down> Mark next like this and set direction to 'down
|
||||
|
||||
If direction is 'up:
|
||||
|
||||
<left> Skip past the cursor furthest up
|
||||
<right> Remove the cursor furthest up
|
||||
|
||||
If direction is 'down:
|
||||
|
||||
<left> Remove the cursor furthest down
|
||||
<right> Skip past the cursor furthest down
|
||||
|
||||
The bindings for these commands can be changed. See `mc/mark-more-like-this-extended-keymap'."
|
||||
(interactive)
|
||||
(mc/mmlte--down)
|
||||
(set-temporary-overlay-map mc/mark-more-like-this-extended-keymap t))
|
||||
|
||||
(defvar mc/mark-more-like-this-extended-direction nil
|
||||
"When using mc/mark-more-like-this-extended are we working on the next or previous cursors?")
|
||||
|
||||
(make-variable-buffer-local 'mc/mark-more-like-this-extended)
|
||||
|
||||
(defun mc/mmlte--message ()
|
||||
(if (eq mc/mark-more-like-this-extended-direction 'up)
|
||||
(message "<up> to mark previous, <left> to skip, <right> to remove, <down> to mark next")
|
||||
(message "<down> to mark next, <right> to skip, <left> to remove, <up> to mark previous")))
|
||||
|
||||
(defun mc/mmlte--up ()
|
||||
(interactive)
|
||||
(mc/mark-previous-like-this 1)
|
||||
(setq mc/mark-more-like-this-extended-direction 'up)
|
||||
(mc/mmlte--message))
|
||||
|
||||
(defun mc/mmlte--down ()
|
||||
(interactive)
|
||||
(mc/mark-next-like-this 1)
|
||||
(setq mc/mark-more-like-this-extended-direction 'down)
|
||||
(mc/mmlte--message))
|
||||
|
||||
(defun mc/mmlte--left ()
|
||||
(interactive)
|
||||
(if (eq mc/mark-more-like-this-extended-direction 'down)
|
||||
(mc/unmark-next-like-this)
|
||||
(mc/skip-to-previous-like-this))
|
||||
(mc/mmlte--message))
|
||||
|
||||
(defun mc/mmlte--right ()
|
||||
(interactive)
|
||||
(if (eq mc/mark-more-like-this-extended-direction 'up)
|
||||
(mc/unmark-previous-like-this)
|
||||
(mc/skip-to-next-like-this))
|
||||
(mc/mmlte--message))
|
||||
|
||||
(defvar mc/mark-more-like-this-extended-keymap (make-sparse-keymap))
|
||||
|
||||
(define-key mc/mark-more-like-this-extended-keymap (kbd "<up>") 'mc/mmlte--up)
|
||||
(define-key mc/mark-more-like-this-extended-keymap (kbd "<down>") 'mc/mmlte--down)
|
||||
(define-key mc/mark-more-like-this-extended-keymap (kbd "<left>") 'mc/mmlte--left)
|
||||
(define-key mc/mark-more-like-this-extended-keymap (kbd "<right>") 'mc/mmlte--right)
|
||||
|
||||
(defvar mc--restrict-mark-all-to-symbols nil)
|
||||
|
||||
;;;###autoload
|
||||
(defun mc/mark-all-like-this-dwim (arg)
|
||||
"Tries to guess what you want to mark all of.
|
||||
Can be pressed multiple times to increase selection.
|
||||
|
||||
With prefix, it behaves the same as original `mc/mark-all-like-this'"
|
||||
(interactive "P")
|
||||
(if arg
|
||||
(mc/mark-all-like-this)
|
||||
(if (and (not (use-region-p))
|
||||
(derived-mode-p 'sgml-mode)
|
||||
(mc--on-tag-name-p))
|
||||
(mc/mark-sgml-tag-pair)
|
||||
(let ((before (mc/num-cursors)))
|
||||
(unless (eq last-command 'mc/mark-all-like-this-dwim)
|
||||
(setq mc--restrict-mark-all-to-symbols nil))
|
||||
(unless (use-region-p)
|
||||
(mc--mark-symbol-at-point)
|
||||
(setq mc--restrict-mark-all-to-symbols t))
|
||||
(if mc--restrict-mark-all-to-symbols
|
||||
(mc/mark-all-symbols-like-this-in-defun)
|
||||
(mc/mark-all-like-this-in-defun))
|
||||
(when (<= (mc/num-cursors) before)
|
||||
(if mc--restrict-mark-all-to-symbols
|
||||
(mc/mark-all-symbols-like-this)
|
||||
(mc/mark-all-like-this)))
|
||||
(when (<= (mc/num-cursors) before)
|
||||
(mc/mark-all-like-this))))))
|
||||
|
||||
;;;###autoload
|
||||
(defun mc/mark-all-dwim (arg)
|
||||
"Tries even harder to guess what you want to mark all of.
|
||||
|
||||
If the region is active and spans multiple lines, it will behave
|
||||
as if `mc/mark-all-in-region'. With the prefix ARG, it will call
|
||||
`mc/edit-lines' instead.
|
||||
|
||||
If the region is inactive or on a single line, it will behave like
|
||||
`mc/mark-all-like-this-dwim'."
|
||||
(interactive "P")
|
||||
(if (and (use-region-p)
|
||||
(not (> (mc/num-cursors) 1))
|
||||
(not (= (mc/line-number-at-pos (region-beginning))
|
||||
(mc/line-number-at-pos (region-end)))))
|
||||
(if arg
|
||||
(call-interactively 'mc/edit-lines)
|
||||
(call-interactively 'mc/mark-all-in-region))
|
||||
(progn
|
||||
(setq this-command 'mc/mark-all-like-this-dwim)
|
||||
(mc/mark-all-like-this-dwim arg))))
|
||||
|
||||
(defun mc--in-defun ()
|
||||
(bounds-of-thing-at-point 'defun))
|
||||
|
||||
;;;###autoload
|
||||
(defun mc/mark-all-like-this-in-defun ()
|
||||
"Mark all like this in defun."
|
||||
(interactive)
|
||||
(if (mc--in-defun)
|
||||
(save-restriction
|
||||
(widen)
|
||||
(narrow-to-defun)
|
||||
(mc/mark-all-like-this))
|
||||
(mc/mark-all-like-this)))
|
||||
|
||||
;;;###autoload
|
||||
(defun mc/mark-all-words-like-this-in-defun ()
|
||||
"Mark all words like this in defun."
|
||||
(interactive)
|
||||
(mc--select-thing-at-point-or-bark 'word)
|
||||
(if (mc--in-defun)
|
||||
(save-restriction
|
||||
(widen)
|
||||
(narrow-to-defun)
|
||||
(mc/mark-all-words-like-this))
|
||||
(mc/mark-all-words-like-this)))
|
||||
|
||||
;;;###autoload
|
||||
(defun mc/mark-all-symbols-like-this-in-defun ()
|
||||
"Mark all symbols like this in defun."
|
||||
(interactive)
|
||||
(mc--select-thing-at-point-or-bark 'symbol)
|
||||
(if (mc--in-defun)
|
||||
(save-restriction
|
||||
(widen)
|
||||
(narrow-to-defun)
|
||||
(mc/mark-all-symbols-like-this))
|
||||
(mc/mark-all-symbols-like-this)))
|
||||
|
||||
(defun mc--mark-symbol-at-point ()
|
||||
"Select the symbol under cursor"
|
||||
(interactive)
|
||||
(when (not (use-region-p))
|
||||
(let ((b (bounds-of-thing-at-point 'symbol)))
|
||||
(goto-char (car b))
|
||||
(set-mark (cdr b)))))
|
||||
|
||||
(defun mc--get-nice-sgml-context ()
|
||||
(car
|
||||
(last
|
||||
(progn
|
||||
(when (looking-at "<") (forward-char 1))
|
||||
(when (looking-back ">") (forward-char -1))
|
||||
(sgml-get-context)))))
|
||||
|
||||
(defun mc--on-tag-name-p ()
|
||||
(let* ((context (save-excursion (mc--get-nice-sgml-context)))
|
||||
(tag-name-len (length (aref context 4)))
|
||||
(beg (aref context 2))
|
||||
(end (+ beg tag-name-len (if (eq 'open (aref context 1)) 1 3))))
|
||||
(and context
|
||||
(>= (point) beg)
|
||||
(<= (point) end))))
|
||||
|
||||
;;;###autoload
|
||||
(defun mc/toggle-cursor-on-click (event)
|
||||
"Add a cursor where you click, or remove a fake cursor that is
|
||||
already there."
|
||||
(interactive "e")
|
||||
(mouse-minibuffer-check event)
|
||||
;; Use event-end in case called from mouse-drag-region.
|
||||
;; If EVENT is a click, event-end and event-start give same value.
|
||||
(let ((position (event-end event)))
|
||||
(if (not (windowp (posn-window position)))
|
||||
(error "Position not in text area of window"))
|
||||
(select-window (posn-window position))
|
||||
(let ((pt (posn-point position)))
|
||||
(if (numberp pt)
|
||||
;; is there a fake cursor with the actual *point* right where we are?
|
||||
(let ((existing (mc/fake-cursor-at-point pt)))
|
||||
(if existing
|
||||
(mc/remove-fake-cursor existing)
|
||||
(save-excursion
|
||||
(goto-char pt)
|
||||
(mc/create-fake-cursor-at-point))))))
|
||||
(mc/maybe-multiple-cursors-mode)))
|
||||
|
||||
;;;###autoload
|
||||
(defalias 'mc/add-cursor-on-click 'mc/toggle-cursor-on-click)
|
||||
|
||||
;;;###autoload
|
||||
(defun mc/mark-sgml-tag-pair ()
|
||||
"Mark the tag we're in and its pair for renaming."
|
||||
(interactive)
|
||||
(when (not (mc--inside-tag-p))
|
||||
(error "Place point inside tag to rename."))
|
||||
(let ((context (mc--get-nice-sgml-context)))
|
||||
(if (looking-at "</")
|
||||
(setq context (car (last (sgml-get-context)))))
|
||||
(goto-char (aref context 2))
|
||||
(let* ((tag-name (aref context 4))
|
||||
(num-chars (length tag-name))
|
||||
(master-start (1+ (point)))
|
||||
(mirror-end (save-excursion
|
||||
(sgml-skip-tag-forward 1)
|
||||
(1- (point)))))
|
||||
(goto-char (- mirror-end num-chars))
|
||||
(set-mark mirror-end)
|
||||
(mc/create-fake-cursor-at-point)
|
||||
(goto-char master-start)
|
||||
(set-mark (+ (point) num-chars))))
|
||||
(mc/maybe-multiple-cursors-mode))
|
||||
|
||||
(defun mc--inside-tag-p ()
|
||||
(save-excursion
|
||||
(not (null (sgml-get-context)))))
|
||||
|
||||
(provide 'mc-mark-more)
|
||||
|
||||
;;; mc-mark-more.el ends here
|
|
@ -1,22 +0,0 @@
|
|||
;;; mc-mark-pop.el --- Pop cursors off of the mark stack
|
||||
|
||||
(require 'multiple-cursors-core)
|
||||
|
||||
;;;###autoload
|
||||
(defun mc/mark-pop ()
|
||||
"Add a cursor at the current point, pop off mark ring and jump
|
||||
to the popped mark."
|
||||
(interactive)
|
||||
;; If the mark happens to be at the current point, just pop that one off.
|
||||
(while (eql (mark) (point))
|
||||
(pop-mark))
|
||||
(mc/create-fake-cursor-at-point)
|
||||
(exchange-point-and-mark)
|
||||
(pop-mark)
|
||||
(mc/maybe-multiple-cursors-mode))
|
||||
|
||||
;; A good key binding for this feature is perhaps "C-S-p" ('p' for pop).
|
||||
|
||||
(provide 'mc-mark-pop)
|
||||
|
||||
;;; mc-mark-pop.el ends here
|
|
@ -1,150 +0,0 @@
|
|||
;;; mc-separate-operations.el - functions that work differently on each cursor
|
||||
|
||||
;; Copyright (C) 2012-2016 Magnar Sveen
|
||||
|
||||
;; Author: Magnar Sveen <magnars@gmail.com>
|
||||
;; 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 <http://www.gnu.org/licenses/>.
|
||||
|
||||
;;; Commentary:
|
||||
|
||||
;; This file contains functions that work differently on each cursor,
|
||||
;; instead of treating all of them the same.
|
||||
|
||||
;; Please see multiple-cursors.el for more commentary.
|
||||
|
||||
;;; Code:
|
||||
|
||||
(require 'multiple-cursors-core)
|
||||
|
||||
(defcustom mc/insert-numbers-default 0
|
||||
"The default number at which to start counting for
|
||||
`mc/insert-numbers'"
|
||||
:type 'integer
|
||||
:group 'multiple-cursors)
|
||||
|
||||
(defvar mc--insert-numbers-number 0)
|
||||
|
||||
;;;###autoload
|
||||
(defun mc/insert-numbers (arg)
|
||||
"Insert increasing numbers for each cursor, starting at
|
||||
`mc/insert-numbers-default' or ARG."
|
||||
(interactive "P")
|
||||
(setq mc--insert-numbers-number (or (and arg (prefix-numeric-value arg))
|
||||
mc/insert-numbers-default))
|
||||
(mc/for-each-cursor-ordered
|
||||
(mc/execute-command-for-fake-cursor 'mc--insert-number-and-increase cursor)))
|
||||
|
||||
(defun mc--insert-number-and-increase ()
|
||||
(interactive)
|
||||
(insert (number-to-string mc--insert-numbers-number))
|
||||
(setq mc--insert-numbers-number (1+ mc--insert-numbers-number)))
|
||||
|
||||
(defun mc--ordered-region-strings ()
|
||||
(let (strings)
|
||||
(save-excursion
|
||||
(mc/for-each-cursor-ordered
|
||||
(setq strings (cons (buffer-substring-no-properties
|
||||
(mc/cursor-beg cursor)
|
||||
(mc/cursor-end cursor)) strings))))
|
||||
(nreverse strings)))
|
||||
|
||||
(defvar mc--insert-letters-number 0)
|
||||
|
||||
;;;###autoload
|
||||
(defun mc/insert-letters (arg)
|
||||
"Insert increasing letters for each cursor, starting at 0 or ARG.
|
||||
Where letter[0]=a letter[2]=c letter[26]=aa"
|
||||
(interactive "P")
|
||||
(setq mc--insert-letters-number (or (and arg (prefix-numeric-value arg))
|
||||
0))
|
||||
(mc/for-each-cursor-ordered
|
||||
(mc/execute-command-for-fake-cursor 'mc--insert-letter-and-increase cursor)))
|
||||
|
||||
(defun mc--number-to-letters (number)
|
||||
(let ((letter
|
||||
(char-to-string
|
||||
(+ (mod number 26) ?a)))
|
||||
(number2 (/ number 26)))
|
||||
(if (> number2 0)
|
||||
(concat (mc--number-to-letters (- number2 1)) letter)
|
||||
letter)))
|
||||
|
||||
(defun mc--insert-letter-and-increase ()
|
||||
(interactive)
|
||||
(insert (mc--number-to-letters mc--insert-letters-number))
|
||||
(setq mc--insert-letters-number (1+ mc--insert-letters-number)))
|
||||
|
||||
(defvar mc--strings-to-replace nil)
|
||||
|
||||
(defun mc--replace-region-strings-1 ()
|
||||
(interactive)
|
||||
(delete-region (region-beginning) (region-end))
|
||||
(save-excursion (insert (car mc--strings-to-replace)))
|
||||
(setq mc--strings-to-replace (cdr mc--strings-to-replace)))
|
||||
|
||||
(defun mc--replace-region-strings ()
|
||||
(mc/for-each-cursor-ordered
|
||||
(mc/execute-command-for-fake-cursor 'mc--replace-region-strings-1 cursor)))
|
||||
|
||||
;;;###autoload
|
||||
(defun mc/reverse-regions ()
|
||||
(interactive)
|
||||
(if (not multiple-cursors-mode)
|
||||
(progn
|
||||
(mc/mark-next-lines 1)
|
||||
(mc/reverse-regions)
|
||||
(multiple-cursors-mode 0))
|
||||
(unless (use-region-p)
|
||||
(mc/execute-command-for-all-cursors 'mark-sexp))
|
||||
(setq mc--strings-to-replace (nreverse (mc--ordered-region-strings)))
|
||||
(mc--replace-region-strings)))
|
||||
|
||||
;;;###autoload
|
||||
(defun mc/sort-regions ()
|
||||
(interactive)
|
||||
(unless (use-region-p)
|
||||
(mc/execute-command-for-all-cursors 'mark-sexp))
|
||||
(setq mc--strings-to-replace (sort (mc--ordered-region-strings) 'string<))
|
||||
(mc--replace-region-strings))
|
||||
|
||||
|
||||
;;;###autoload
|
||||
(defun mc/vertical-align (character)
|
||||
"Aligns all cursors vertically with a given CHARACTER to the one with the
|
||||
highest colum number (the rightest).
|
||||
Might not behave as intended if more than one cursors are on the same line."
|
||||
(interactive "c")
|
||||
(let ((rightest-column (current-column)))
|
||||
(mc/execute-command-for-all-cursors
|
||||
(lambda () "get the rightest cursor"
|
||||
(interactive)
|
||||
(setq rightest-column (max (current-column) rightest-column))
|
||||
))
|
||||
(mc/execute-command-for-all-cursors
|
||||
(lambda ()
|
||||
(interactive)
|
||||
(let ((missing-spaces (- rightest-column (current-column))))
|
||||
(save-excursion (insert (make-string missing-spaces character)))
|
||||
(forward-char missing-spaces))))))
|
||||
|
||||
;;;###autoload
|
||||
(defun mc/vertical-align-with-space ()
|
||||
"Aligns all cursors with whitespace like `mc/vertical-align' does"
|
||||
(interactive)
|
||||
(mc/vertical-align 32))
|
||||
|
||||
(provide 'mc-separate-operations)
|
||||
;;; mc-separate-operations.el ends here
|
|
@ -1,362 +0,0 @@
|
|||
;;; multiple-cursors-autoloads.el --- automatically extracted autoloads
|
||||
;;
|
||||
;;; Code:
|
||||
|
||||
(add-to-list 'load-path (directory-file-name
|
||||
(or (file-name-directory #$) (car load-path))))
|
||||
|
||||
|
||||
;;;### (autoloads nil "mc-cycle-cursors" "mc-cycle-cursors.el" (0
|
||||
;;;;;; 0 0 0))
|
||||
;;; Generated autoloads from mc-cycle-cursors.el
|
||||
|
||||
(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "mc-cycle-cursors" '("mc/")))
|
||||
|
||||
;;;***
|
||||
|
||||
;;;### (autoloads nil "mc-edit-lines" "mc-edit-lines.el" (0 0 0 0))
|
||||
;;; Generated autoloads from mc-edit-lines.el
|
||||
|
||||
(autoload 'mc/edit-lines "mc-edit-lines" "\
|
||||
Add one cursor to each line of the active region.
|
||||
Starts from mark and moves in straight down or up towards the
|
||||
line point is on.
|
||||
|
||||
What is done with lines which are not long enough is governed by
|
||||
`mc/edit-lines-empty-lines'. The prefix argument ARG can be used
|
||||
to override this. If ARG is a symbol (when called from Lisp),
|
||||
that symbol is used instead of `mc/edit-lines-empty-lines'.
|
||||
Otherwise, if ARG negative, short lines will be ignored. Any
|
||||
other non-nil value will cause short lines to be padded.
|
||||
|
||||
\(fn &optional ARG)" t nil)
|
||||
|
||||
(autoload 'mc/edit-ends-of-lines "mc-edit-lines" "\
|
||||
Add one cursor to the end of each line in the active region.
|
||||
|
||||
\(fn)" t nil)
|
||||
|
||||
(autoload 'mc/edit-beginnings-of-lines "mc-edit-lines" "\
|
||||
Add one cursor to the beginning of each line in the active region.
|
||||
|
||||
\(fn)" t nil)
|
||||
|
||||
(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "mc-edit-lines" '("mc/edit-lines-empty-lines")))
|
||||
|
||||
;;;***
|
||||
|
||||
;;;### (autoloads nil "mc-hide-unmatched-lines-mode" "mc-hide-unmatched-lines-mode.el"
|
||||
;;;;;; (0 0 0 0))
|
||||
;;; Generated autoloads from mc-hide-unmatched-lines-mode.el
|
||||
|
||||
(autoload 'mc-hide-unmatched-lines-mode "mc-hide-unmatched-lines-mode" "\
|
||||
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 <return> or \"C-g\"
|
||||
|
||||
\(fn &optional ARG)" t nil)
|
||||
|
||||
(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "mc-hide-unmatched-lines-mode" '("hum/")))
|
||||
|
||||
;;;***
|
||||
|
||||
;;;### (autoloads nil "mc-mark-more" "mc-mark-more.el" (0 0 0 0))
|
||||
;;; Generated autoloads from mc-mark-more.el
|
||||
|
||||
(autoload 'mc/mark-next-like-this "mc-mark-more" "\
|
||||
Find and mark the next part of the buffer matching the currently active region
|
||||
If no region is active add a cursor on the next line
|
||||
With negative ARG, delete the last one instead.
|
||||
With zero ARG, skip the last one and mark next.
|
||||
|
||||
\(fn ARG)" t nil)
|
||||
|
||||
(autoload 'mc/mark-next-like-this-word "mc-mark-more" "\
|
||||
Find and mark the next part of the buffer matching the currently active region
|
||||
If no region is active, mark the word at the point and find the next match
|
||||
With negative ARG, delete the last one instead.
|
||||
With zero ARG, skip the last one and mark next.
|
||||
|
||||
\(fn ARG)" t nil)
|
||||
|
||||
(autoload 'mc/mark-next-word-like-this "mc-mark-more" "\
|
||||
Find and mark the next word of the buffer matching the currently active region
|
||||
The matching region must be a whole word to be a match
|
||||
If no region is active, mark the symbol at the point and find the next match
|
||||
With negative ARG, delete the last one instead.
|
||||
With zero ARG, skip the last one and mark next.
|
||||
|
||||
\(fn ARG)" t nil)
|
||||
|
||||
(autoload 'mc/mark-next-symbol-like-this "mc-mark-more" "\
|
||||
Find and mark the next symbol of the buffer matching the currently active region
|
||||
The matching region must be a whole symbol to be a match
|
||||
If no region is active, mark the symbol at the point and find the next match
|
||||
With negative ARG, delete the last one instead.
|
||||
With zero ARG, skip the last one and mark next.
|
||||
|
||||
\(fn ARG)" t nil)
|
||||
|
||||
(autoload 'mc/mark-previous-like-this "mc-mark-more" "\
|
||||
Find and mark the previous part of the buffer matching the currently active region
|
||||
If no region is active add a cursor on the previous line
|
||||
With negative ARG, delete the last one instead.
|
||||
With zero ARG, skip the last one and mark next.
|
||||
|
||||
\(fn ARG)" t nil)
|
||||
|
||||
(autoload 'mc/mark-previous-like-this-word "mc-mark-more" "\
|
||||
Find and mark the previous part of the buffer matching the currently active region
|
||||
If no region is active, mark the word at the point and find the previous match
|
||||
With negative ARG, delete the last one instead.
|
||||
With zero ARG, skip the last one and mark previous.
|
||||
|
||||
\(fn ARG)" t nil)
|
||||
|
||||
(autoload 'mc/mark-previous-word-like-this "mc-mark-more" "\
|
||||
Find and mark the previous part of the buffer matching the currently active region
|
||||
The matching region must be a whole word to be a match
|
||||
If no region is active add a cursor on the previous line
|
||||
With negative ARG, delete the last one instead.
|
||||
With zero ARG, skip the last one and mark next.
|
||||
|
||||
\(fn ARG)" t nil)
|
||||
|
||||
(autoload 'mc/mark-previous-symbol-like-this "mc-mark-more" "\
|
||||
Find and mark the previous part of the buffer matching the currently active region
|
||||
The matching region must be a whole symbol to be a match
|
||||
If no region is active add a cursor on the previous line
|
||||
With negative ARG, delete the last one instead.
|
||||
With zero ARG, skip the last one and mark next.
|
||||
|
||||
\(fn ARG)" t nil)
|
||||
|
||||
(autoload 'mc/mark-next-lines "mc-mark-more" "\
|
||||
|
||||
|
||||
\(fn ARG)" t nil)
|
||||
|
||||
(autoload 'mc/mark-previous-lines "mc-mark-more" "\
|
||||
|
||||
|
||||
\(fn ARG)" t nil)
|
||||
|
||||
(autoload 'mc/unmark-next-like-this "mc-mark-more" "\
|
||||
Deselect next part of the buffer matching the currently active region.
|
||||
|
||||
\(fn)" t nil)
|
||||
|
||||
(autoload 'mc/unmark-previous-like-this "mc-mark-more" "\
|
||||
Deselect prev part of the buffer matching the currently active region.
|
||||
|
||||
\(fn)" t nil)
|
||||
|
||||
(autoload 'mc/skip-to-next-like-this "mc-mark-more" "\
|
||||
Skip the current one and select the next part of the buffer matching the currently active region.
|
||||
|
||||
\(fn)" t nil)
|
||||
|
||||
(autoload 'mc/skip-to-previous-like-this "mc-mark-more" "\
|
||||
Skip the current one and select the prev part of the buffer matching the currently active region.
|
||||
|
||||
\(fn)" t nil)
|
||||
|
||||
(autoload 'mc/mark-all-like-this "mc-mark-more" "\
|
||||
Find and mark all the parts of the buffer matching the currently active region
|
||||
|
||||
\(fn)" t nil)
|
||||
|
||||
(autoload 'mc/mark-all-words-like-this "mc-mark-more" "\
|
||||
|
||||
|
||||
\(fn)" t nil)
|
||||
|
||||
(autoload 'mc/mark-all-symbols-like-this "mc-mark-more" "\
|
||||
|
||||
|
||||
\(fn)" t nil)
|
||||
|
||||
(autoload 'mc/mark-all-in-region "mc-mark-more" "\
|
||||
Find and mark all the parts in the region matching the given search
|
||||
|
||||
\(fn BEG END &optional SEARCH)" t nil)
|
||||
|
||||
(autoload 'mc/mark-all-in-region-regexp "mc-mark-more" "\
|
||||
Find and mark all the parts in the region matching the given regexp.
|
||||
|
||||
\(fn BEG END)" t nil)
|
||||
|
||||
(autoload 'mc/mark-more-like-this-extended "mc-mark-more" "\
|
||||
Like mark-more-like-this, but then lets you adjust with arrows key.
|
||||
The adjustments work like this:
|
||||
|
||||
<up> Mark previous like this and set direction to 'up
|
||||
<down> Mark next like this and set direction to 'down
|
||||
|
||||
If direction is 'up:
|
||||
|
||||
<left> Skip past the cursor furthest up
|
||||
<right> Remove the cursor furthest up
|
||||
|
||||
If direction is 'down:
|
||||
|
||||
<left> Remove the cursor furthest down
|
||||
<right> Skip past the cursor furthest down
|
||||
|
||||
The bindings for these commands can be changed. See `mc/mark-more-like-this-extended-keymap'.
|
||||
|
||||
\(fn)" t nil)
|
||||
|
||||
(autoload 'mc/mark-all-like-this-dwim "mc-mark-more" "\
|
||||
Tries to guess what you want to mark all of.
|
||||
Can be pressed multiple times to increase selection.
|
||||
|
||||
With prefix, it behaves the same as original `mc/mark-all-like-this'
|
||||
|
||||
\(fn ARG)" t nil)
|
||||
|
||||
(autoload 'mc/mark-all-dwim "mc-mark-more" "\
|
||||
Tries even harder to guess what you want to mark all of.
|
||||
|
||||
If the region is active and spans multiple lines, it will behave
|
||||
as if `mc/mark-all-in-region'. With the prefix ARG, it will call
|
||||
`mc/edit-lines' instead.
|
||||
|
||||
If the region is inactive or on a single line, it will behave like
|
||||
`mc/mark-all-like-this-dwim'.
|
||||
|
||||
\(fn ARG)" t nil)
|
||||
|
||||
(autoload 'mc/mark-all-like-this-in-defun "mc-mark-more" "\
|
||||
Mark all like this in defun.
|
||||
|
||||
\(fn)" t nil)
|
||||
|
||||
(autoload 'mc/mark-all-words-like-this-in-defun "mc-mark-more" "\
|
||||
Mark all words like this in defun.
|
||||
|
||||
\(fn)" t nil)
|
||||
|
||||
(autoload 'mc/mark-all-symbols-like-this-in-defun "mc-mark-more" "\
|
||||
Mark all symbols like this in defun.
|
||||
|
||||
\(fn)" t nil)
|
||||
|
||||
(autoload 'mc/toggle-cursor-on-click "mc-mark-more" "\
|
||||
Add a cursor where you click, or remove a fake cursor that is
|
||||
already there.
|
||||
|
||||
\(fn EVENT)" t nil)
|
||||
|
||||
(defalias 'mc/add-cursor-on-click 'mc/toggle-cursor-on-click)
|
||||
|
||||
(autoload 'mc/mark-sgml-tag-pair "mc-mark-more" "\
|
||||
Mark the tag we're in and its pair for renaming.
|
||||
|
||||
\(fn)" t nil)
|
||||
|
||||
(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "mc-mark-more" '("mc/" "mc--")))
|
||||
|
||||
;;;***
|
||||
|
||||
;;;### (autoloads nil "mc-mark-pop" "mc-mark-pop.el" (0 0 0 0))
|
||||
;;; Generated autoloads from mc-mark-pop.el
|
||||
|
||||
(autoload 'mc/mark-pop "mc-mark-pop" "\
|
||||
Add a cursor at the current point, pop off mark ring and jump
|
||||
to the popped mark.
|
||||
|
||||
\(fn)" t nil)
|
||||
|
||||
;;;***
|
||||
|
||||
;;;### (autoloads nil "mc-separate-operations" "mc-separate-operations.el"
|
||||
;;;;;; (0 0 0 0))
|
||||
;;; Generated autoloads from mc-separate-operations.el
|
||||
|
||||
(autoload 'mc/insert-numbers "mc-separate-operations" "\
|
||||
Insert increasing numbers for each cursor, starting at
|
||||
`mc/insert-numbers-default' or ARG.
|
||||
|
||||
\(fn ARG)" t nil)
|
||||
|
||||
(autoload 'mc/insert-letters "mc-separate-operations" "\
|
||||
Insert increasing letters for each cursor, starting at 0 or ARG.
|
||||
Where letter[0]=a letter[2]=c letter[26]=aa
|
||||
|
||||
\(fn ARG)" t nil)
|
||||
|
||||
(autoload 'mc/reverse-regions "mc-separate-operations" "\
|
||||
|
||||
|
||||
\(fn)" t nil)
|
||||
|
||||
(autoload 'mc/sort-regions "mc-separate-operations" "\
|
||||
|
||||
|
||||
\(fn)" t nil)
|
||||
|
||||
(autoload 'mc/vertical-align "mc-separate-operations" "\
|
||||
Aligns all cursors vertically with a given CHARACTER to the one with the
|
||||
highest colum number (the rightest).
|
||||
Might not behave as intended if more than one cursors are on the same line.
|
||||
|
||||
\(fn CHARACTER)" t nil)
|
||||
|
||||
(autoload 'mc/vertical-align-with-space "mc-separate-operations" "\
|
||||
Aligns all cursors with whitespace like `mc/vertical-align' does
|
||||
|
||||
\(fn)" t nil)
|
||||
|
||||
(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "mc-separate-operations" '("mc/insert-numbers-default" "mc--")))
|
||||
|
||||
;;;***
|
||||
|
||||
;;;### (autoloads nil "multiple-cursors-core" "multiple-cursors-core.el"
|
||||
;;;;;; (0 0 0 0))
|
||||
;;; Generated autoloads from multiple-cursors-core.el
|
||||
|
||||
(autoload 'multiple-cursors-mode "multiple-cursors-core" "\
|
||||
Mode while multiple cursors are active.
|
||||
|
||||
\(fn &optional ARG)" t nil)
|
||||
|
||||
(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "multiple-cursors-core" '("multiple-cursors-mode" "unsupported-cmd" "deactivate-cursor-after-undo" "activate-cursor-for-undo")))
|
||||
|
||||
;;;***
|
||||
|
||||
;;;### (autoloads nil "rectangular-region-mode" "rectangular-region-mode.el"
|
||||
;;;;;; (0 0 0 0))
|
||||
;;; Generated autoloads from rectangular-region-mode.el
|
||||
|
||||
(autoload 'set-rectangular-region-anchor "rectangular-region-mode" "\
|
||||
Anchors the rectangular region at point.
|
||||
|
||||
Think of this one as `set-mark' except you're marking a rectangular region. It is
|
||||
an exceedingly quick way of adding multiple cursors to multiple lines.
|
||||
|
||||
\(fn)" t nil)
|
||||
|
||||
(autoload 'rectangular-region-mode "rectangular-region-mode" "\
|
||||
A mode for creating a rectangular region to edit
|
||||
|
||||
\(fn &optional ARG)" t nil)
|
||||
|
||||
(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "rectangular-region-mode" '("rectangular-region-mode" "rrm/")))
|
||||
|
||||
;;;***
|
||||
|
||||
;;;### (autoloads nil nil ("multiple-cursors-pkg.el" "multiple-cursors.el")
|
||||
;;;;;; (0 0 0 0))
|
||||
|
||||
;;;***
|
||||
|
||||
;; Local Variables:
|
||||
;; version-control: never
|
||||
;; no-byte-compile: t
|
||||
;; no-update-autoloads: t
|
||||
;; coding: utf-8
|
||||
;; End:
|
||||
;;; multiple-cursors-autoloads.el ends here
|
|
@ -1,852 +0,0 @@
|
|||
;;; multiple-cursors-core.el --- An experiment in multiple cursors for emacs.
|
||||
|
||||
;; Copyright (C) 2012-2016 Magnar Sveen
|
||||
|
||||
;; Author: Magnar Sveen <magnars@gmail.com>
|
||||
;; 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 <http://www.gnu.org/licenses/>.
|
||||
|
||||
;;; Commentary:
|
||||
|
||||
;; This file contains the core functionality of multiple-cursors.
|
||||
;; Please see multiple-cursors.el for more commentary.
|
||||
|
||||
;;; Code:
|
||||
|
||||
(require 'cl-lib)
|
||||
(require 'rect)
|
||||
|
||||
(defvar mc--read-char)
|
||||
|
||||
(defface mc/cursor-face
|
||||
'((t (:inverse-video t)))
|
||||
"The face used for fake cursors"
|
||||
:group 'multiple-cursors)
|
||||
|
||||
(defface mc/cursor-bar-face
|
||||
`((t (:height 1 :background ,(face-attribute 'cursor :background))))
|
||||
"The face used for fake cursors if the cursor-type is bar"
|
||||
:group 'multiple-cursors)
|
||||
|
||||
(defface mc/region-face
|
||||
'((t :inherit region))
|
||||
"The face used for fake regions"
|
||||
:group 'multiple-cursors)
|
||||
|
||||
(defmacro mc/add-fake-cursor-to-undo-list (&rest forms)
|
||||
"Make sure point is in the right place when undoing"
|
||||
(let ((uc (make-symbol "undo-cleaner")))
|
||||
`(let ((,uc (cons 'apply (cons 'deactivate-cursor-after-undo (list id)))))
|
||||
(setq buffer-undo-list (cons ,uc buffer-undo-list))
|
||||
,@forms
|
||||
(if (eq ,uc (car buffer-undo-list)) ;; if nothing has been added to the undo-list
|
||||
(setq buffer-undo-list (cdr buffer-undo-list)) ;; then pop the cleaner right off again
|
||||
(setq buffer-undo-list ;; otherwise add a function to activate this cursor
|
||||
(cons (cons 'apply (cons 'activate-cursor-for-undo (list id))) buffer-undo-list))))))
|
||||
|
||||
(defun mc/all-fake-cursors (&optional start end)
|
||||
(cl-remove-if-not 'mc/fake-cursor-p
|
||||
(overlays-in (or start (point-min))
|
||||
(or end (point-max)))))
|
||||
|
||||
(defmacro mc/for-each-fake-cursor (&rest forms)
|
||||
"Runs the body for each fake cursor, bound to the name cursor"
|
||||
`(mapc #'(lambda (cursor) ,@forms)
|
||||
(mc/all-fake-cursors)))
|
||||
|
||||
(defmacro mc/save-excursion (&rest forms)
|
||||
"Saves and restores all the state that multiple-cursors cares about."
|
||||
(let ((cs (make-symbol "current-state")))
|
||||
`(let ((,cs (mc/store-current-state-in-overlay
|
||||
(make-overlay (point) (point) nil nil t))))
|
||||
(overlay-put ,cs 'type 'original-cursor)
|
||||
(save-excursion ,@forms)
|
||||
(mc/pop-state-from-overlay ,cs))))
|
||||
|
||||
(defun mc--compare-by-overlay-start (o1 o2)
|
||||
(< (overlay-start o1) (overlay-start o2)))
|
||||
|
||||
(defmacro mc/for-each-cursor-ordered (&rest forms)
|
||||
"Runs the body for each cursor, fake and real, bound to the name cursor"
|
||||
(let ((rci (make-symbol "real-cursor-id")))
|
||||
`(let ((,rci (overlay-get (mc/create-fake-cursor-at-point) 'mc-id)))
|
||||
(mapc #'(lambda (cursor)
|
||||
(when (mc/fake-cursor-p cursor)
|
||||
,@forms))
|
||||
(sort (overlays-in (point-min) (point-max)) 'mc--compare-by-overlay-start))
|
||||
(mc/pop-state-from-overlay (mc/cursor-with-id ,rci)))))
|
||||
|
||||
(defmacro mc/save-window-scroll (&rest forms)
|
||||
"Saves and restores the window scroll position"
|
||||
(let ((p (make-symbol "p"))
|
||||
(s (make-symbol "start"))
|
||||
(h (make-symbol "hscroll")))
|
||||
`(let ((,p (set-marker (make-marker) (point)))
|
||||
(,s (set-marker (make-marker) (window-start)))
|
||||
(,h (window-hscroll)))
|
||||
,@forms
|
||||
(goto-char ,p)
|
||||
(set-window-start nil ,s t)
|
||||
(set-window-hscroll nil ,h)
|
||||
(set-marker ,p nil)
|
||||
(set-marker ,s nil))))
|
||||
|
||||
(defun mc/cursor-is-bar ()
|
||||
"Return non-nil if the cursor is a bar."
|
||||
(or (eq cursor-type 'bar)
|
||||
(and (listp cursor-type)
|
||||
(eq (car cursor-type) 'bar))))
|
||||
|
||||
(defun mc/line-number-at-pos (&optional pos absolute)
|
||||
"Faster implementation of `line-number-at-pos'."
|
||||
(if pos
|
||||
(save-excursion
|
||||
(if absolute
|
||||
(save-restriction
|
||||
(widen)
|
||||
(goto-char pos)
|
||||
(string-to-number (format-mode-line "%l")))
|
||||
(goto-char pos)
|
||||
(string-to-number (format-mode-line "%l"))))
|
||||
(string-to-number (format-mode-line "%l"))))
|
||||
|
||||
(defun mc/make-cursor-overlay-at-eol (pos)
|
||||
"Create overlay to look like cursor at end of line."
|
||||
(let ((overlay (make-overlay pos pos nil nil nil)))
|
||||
(if (mc/cursor-is-bar)
|
||||
(overlay-put overlay 'before-string (propertize "|" 'face 'mc/cursor-bar-face))
|
||||
(overlay-put overlay 'after-string (propertize " " 'face 'mc/cursor-face)))
|
||||
overlay))
|
||||
|
||||
(defun mc/make-cursor-overlay-inline (pos)
|
||||
"Create overlay to look like cursor inside text."
|
||||
(let ((overlay (make-overlay pos (1+ pos) nil nil nil)))
|
||||
(if (mc/cursor-is-bar)
|
||||
(overlay-put overlay 'before-string (propertize "|" 'face 'mc/cursor-bar-face))
|
||||
(overlay-put overlay 'face 'mc/cursor-face))
|
||||
overlay))
|
||||
|
||||
(defun mc/make-cursor-overlay-at-point ()
|
||||
"Create overlay to look like cursor.
|
||||
Special case for end of line, because overlay over a newline
|
||||
highlights the entire width of the window."
|
||||
(if (eolp)
|
||||
(mc/make-cursor-overlay-at-eol (point))
|
||||
(mc/make-cursor-overlay-inline (point))))
|
||||
|
||||
(defun mc/make-region-overlay-between-point-and-mark ()
|
||||
"Create overlay to look like active region."
|
||||
(let ((overlay (make-overlay (mark) (point) nil nil t)))
|
||||
(overlay-put overlay 'face 'mc/region-face)
|
||||
(overlay-put overlay 'type 'additional-region)
|
||||
overlay))
|
||||
|
||||
(defvar mc/cursor-specific-vars '(transient-mark-mode
|
||||
kill-ring
|
||||
kill-ring-yank-pointer
|
||||
mark-ring
|
||||
mark-active
|
||||
yank-undo-function
|
||||
autopair-action
|
||||
autopair-wrap-action
|
||||
temporary-goal-column
|
||||
er/history
|
||||
dabbrev--abbrev-char-regexp
|
||||
dabbrev--check-other-buffers
|
||||
dabbrev--friend-buffer-list
|
||||
dabbrev--last-abbrev-location
|
||||
dabbrev--last-abbreviation
|
||||
dabbrev--last-buffer
|
||||
dabbrev--last-buffer-found
|
||||
dabbrev--last-direction
|
||||
dabbrev--last-expansion
|
||||
dabbrev--last-expansion-location
|
||||
dabbrev--last-table)
|
||||
"A list of vars that need to be tracked on a per-cursor basis.")
|
||||
|
||||
(defun mc/store-current-state-in-overlay (o)
|
||||
"Store relevant info about point and mark in the given overlay."
|
||||
(overlay-put o 'point (set-marker (make-marker) (point)))
|
||||
(overlay-put o 'mark (set-marker (make-marker)
|
||||
(let ((mark-even-if-inactive t))
|
||||
(mark))))
|
||||
(dolist (var mc/cursor-specific-vars)
|
||||
(when (boundp var) (overlay-put o var (symbol-value var))))
|
||||
o)
|
||||
|
||||
(defun mc/restore-state-from-overlay (o)
|
||||
"Restore point and mark from stored info in the given overlay."
|
||||
(goto-char (overlay-get o 'point))
|
||||
(set-marker (mark-marker) (overlay-get o 'mark))
|
||||
(dolist (var mc/cursor-specific-vars)
|
||||
(when (boundp var) (set var (overlay-get o var)))))
|
||||
|
||||
(defun mc/remove-fake-cursor (o)
|
||||
"Delete overlay with state, including dependent overlays and markers."
|
||||
(set-marker (overlay-get o 'point) nil)
|
||||
(set-marker (overlay-get o 'mark) nil)
|
||||
(mc/delete-region-overlay o)
|
||||
(delete-overlay o))
|
||||
|
||||
(defun mc/pop-state-from-overlay (o)
|
||||
"Restore the state stored in given overlay and then remove the overlay."
|
||||
(mc/restore-state-from-overlay o)
|
||||
(mc/remove-fake-cursor o))
|
||||
|
||||
(defun mc/delete-region-overlay (o)
|
||||
"Remove the dependent region overlay for a given cursor overlay."
|
||||
(ignore-errors
|
||||
(delete-overlay (overlay-get o 'region-overlay))))
|
||||
|
||||
(defvar mc--current-cursor-id 0
|
||||
"Var to store increasing id of fake cursors, used to keep track of them for undo.")
|
||||
|
||||
(defun mc/create-cursor-id ()
|
||||
"Returns a unique cursor id"
|
||||
(cl-incf mc--current-cursor-id))
|
||||
|
||||
(defvar mc--max-cursors-original nil
|
||||
"This variable maintains the original maximum number of cursors.
|
||||
When `mc/create-fake-cursor-at-point' is called and
|
||||
`mc/max-cursors' is overridden, this value serves as a backup so
|
||||
that `mc/max-cursors' can take on a new value. When
|
||||
`mc/remove-fake-cursors' is called, the values are reset.")
|
||||
|
||||
(defcustom mc/max-cursors nil
|
||||
"Safety ceiling for the number of active cursors.
|
||||
If your emacs slows down or freezes when using too many cursors,
|
||||
customize this value appropriately.
|
||||
|
||||
Cursors will be added until this value is reached, at which point
|
||||
you can either temporarily override the value or abort the
|
||||
operation entirely.
|
||||
|
||||
If this value is nil, there is no ceiling."
|
||||
:type '(integer)
|
||||
:group 'multiple-cursors)
|
||||
|
||||
(defun mc/create-fake-cursor-at-point (&optional id)
|
||||
"Add a fake cursor and possibly a fake active region overlay based on point and mark.
|
||||
Saves the current state in the overlay to be restored later."
|
||||
(unless mc--max-cursors-original
|
||||
(setq mc--max-cursors-original mc/max-cursors))
|
||||
(when mc/max-cursors
|
||||
(unless (< (mc/num-cursors) mc/max-cursors)
|
||||
(if (yes-or-no-p (format "%d active cursors. Continue? " (mc/num-cursors)))
|
||||
(setq mc/max-cursors (read-number "Enter a new, temporary maximum: "))
|
||||
(mc/remove-fake-cursors)
|
||||
(error "Aborted: too many cursors"))))
|
||||
(let ((overlay (mc/make-cursor-overlay-at-point)))
|
||||
(overlay-put overlay 'mc-id (or id (mc/create-cursor-id)))
|
||||
(overlay-put overlay 'type 'fake-cursor)
|
||||
(overlay-put overlay 'priority 100)
|
||||
(mc/store-current-state-in-overlay overlay)
|
||||
(when (use-region-p)
|
||||
(overlay-put overlay 'region-overlay
|
||||
(mc/make-region-overlay-between-point-and-mark)))
|
||||
overlay))
|
||||
|
||||
(defun mc/execute-command (cmd)
|
||||
"Run command, simulating the parts of the command loop that makes sense for fake cursors."
|
||||
(setq this-command cmd)
|
||||
(run-hooks 'pre-command-hook)
|
||||
(unless (eq this-command 'ignore)
|
||||
(call-interactively cmd))
|
||||
(run-hooks 'post-command-hook)
|
||||
(when deactivate-mark (deactivate-mark)))
|
||||
|
||||
(defvar mc--executing-command-for-fake-cursor nil)
|
||||
|
||||
(defun mc/execute-command-for-fake-cursor (cmd cursor)
|
||||
(let ((mc--executing-command-for-fake-cursor t)
|
||||
(id (overlay-get cursor 'mc-id))
|
||||
(annoying-arrows-mode nil)
|
||||
(smooth-scroll-margin 0))
|
||||
(mc/add-fake-cursor-to-undo-list
|
||||
(mc/pop-state-from-overlay cursor)
|
||||
(ignore-errors
|
||||
(mc/execute-command cmd)
|
||||
(mc/create-fake-cursor-at-point id)))))
|
||||
|
||||
(defun mc/execute-command-for-all-fake-cursors (cmd)
|
||||
"Calls CMD interactively for each cursor.
|
||||
It works by moving point to the fake cursor, setting
|
||||
up the proper environment, and then removing the cursor.
|
||||
After executing the command, it sets up a new fake
|
||||
cursor with updated info."
|
||||
(mc/save-excursion
|
||||
(mc/save-window-scroll
|
||||
(mc/for-each-fake-cursor
|
||||
(save-excursion
|
||||
(mc/execute-command-for-fake-cursor cmd cursor)))))
|
||||
(mc--reset-read-prompts))
|
||||
|
||||
(defun mc/execute-command-for-all-cursors (cmd)
|
||||
"Calls CMD interactively for the real cursor and all fakes."
|
||||
(call-interactively cmd)
|
||||
(mc/execute-command-for-all-fake-cursors cmd))
|
||||
|
||||
;; Intercept some reading commands so you won't have to
|
||||
;; answer them for every single cursor
|
||||
|
||||
(defvar mc--read-char nil)
|
||||
(defvar multiple-cursors-mode nil)
|
||||
(defadvice read-char (around mc-support activate)
|
||||
(if (not multiple-cursors-mode)
|
||||
ad-do-it
|
||||
(unless mc--read-char
|
||||
(setq mc--read-char ad-do-it))
|
||||
(setq ad-return-value mc--read-char)))
|
||||
|
||||
(defvar mc--read-quoted-char nil)
|
||||
(defadvice read-quoted-char (around mc-support activate)
|
||||
(if (not multiple-cursors-mode)
|
||||
ad-do-it
|
||||
(unless mc--read-quoted-char
|
||||
(setq mc--read-quoted-char ad-do-it))
|
||||
(setq ad-return-value mc--read-quoted-char)))
|
||||
|
||||
(defun mc--reset-read-prompts ()
|
||||
(setq mc--read-char nil)
|
||||
(setq mc--read-quoted-char nil))
|
||||
|
||||
(mc--reset-read-prompts)
|
||||
|
||||
(defun mc/fake-cursor-p (o)
|
||||
"Predicate to check if an overlay is a fake cursor"
|
||||
(eq (overlay-get o 'type) 'fake-cursor))
|
||||
|
||||
(defun mc/cursor-with-id (id)
|
||||
"Find the first cursor with the given id, or nil"
|
||||
(cl-find-if #'(lambda (o) (and (mc/fake-cursor-p o)
|
||||
(= id (overlay-get o 'mc-id))))
|
||||
(overlays-in (point-min) (point-max))))
|
||||
|
||||
(defvar mc--stored-state-for-undo nil
|
||||
"Variable to keep the state of the real cursor while undoing a fake one")
|
||||
|
||||
(defun activate-cursor-for-undo (id)
|
||||
"Called when undoing to temporarily activate the fake cursor which action is being undone."
|
||||
(let ((cursor (mc/cursor-with-id id)))
|
||||
(when cursor
|
||||
(setq mc--stored-state-for-undo (mc/store-current-state-in-overlay
|
||||
(make-overlay (point) (point) nil nil t)))
|
||||
(mc/pop-state-from-overlay cursor))))
|
||||
|
||||
(defun deactivate-cursor-after-undo (id)
|
||||
"Called when undoing to reinstate the real cursor after undoing a fake one."
|
||||
(when mc--stored-state-for-undo
|
||||
(mc/create-fake-cursor-at-point id)
|
||||
(mc/pop-state-from-overlay mc--stored-state-for-undo)
|
||||
(setq mc--stored-state-for-undo nil)))
|
||||
|
||||
(defcustom mc/always-run-for-all nil
|
||||
"Disables whitelisting and always executes commands for every fake cursor."
|
||||
:type '(boolean)
|
||||
:group 'multiple-cursors)
|
||||
|
||||
(defcustom mc/always-repeat-command nil
|
||||
"Disables confirmation for `mc/repeat-command' command."
|
||||
:type '(boolean)
|
||||
:group 'multiple-cursors)
|
||||
|
||||
(defun mc/prompt-for-inclusion-in-whitelist (original-command)
|
||||
"Asks the user, then adds the command either to the once-list or the all-list."
|
||||
(let ((all-p (y-or-n-p (format "Do %S for all cursors?" original-command))))
|
||||
(if all-p
|
||||
(add-to-list 'mc/cmds-to-run-for-all original-command)
|
||||
(add-to-list 'mc/cmds-to-run-once original-command))
|
||||
(mc/save-lists)
|
||||
all-p))
|
||||
|
||||
(defun mc/num-cursors ()
|
||||
"The number of cursors (real and fake) in the buffer."
|
||||
(1+ (cl-count-if 'mc/fake-cursor-p
|
||||
(overlays-in (point-min) (point-max)))))
|
||||
|
||||
(defvar mc--this-command nil
|
||||
"Used to store the original command being run.")
|
||||
(make-variable-buffer-local 'mc--this-command)
|
||||
|
||||
(defun mc/make-a-note-of-the-command-being-run ()
|
||||
"Used with pre-command-hook to store the original command being run.
|
||||
Since that cannot be reliably determined in the post-command-hook.
|
||||
|
||||
Specifically, this-original-command isn't always right, because it could have
|
||||
been remapped. And certain modes (cua comes to mind) will change their
|
||||
remapping based on state. So a command that changes the state will afterwards
|
||||
not be recognized through the command-remapping lookup."
|
||||
(unless mc--executing-command-for-fake-cursor
|
||||
(let ((cmd (or (command-remapping this-original-command)
|
||||
this-original-command)))
|
||||
(setq mc--this-command (and (not (eq cmd 'god-mode-self-insert))
|
||||
cmd)))))
|
||||
|
||||
(defun mc/execute-this-command-for-all-cursors ()
|
||||
"Wrap around `mc/execute-this-command-for-all-cursors-1' to protect hook."
|
||||
(condition-case error
|
||||
(mc/execute-this-command-for-all-cursors-1)
|
||||
(error
|
||||
(message "[mc] problem in `mc/execute-this-command-for-all-cursors': %s"
|
||||
(error-message-string error)))))
|
||||
|
||||
;; execute-kbd-macro should never be run for fake cursors. The real cursor will
|
||||
;; execute the keyboard macro, resulting in new commands in the command loop,
|
||||
;; and the fake cursors can pick up on those instead.
|
||||
(defadvice execute-kbd-macro (around skip-fake-cursors activate)
|
||||
(unless mc--executing-command-for-fake-cursor
|
||||
ad-do-it))
|
||||
|
||||
(defun mc/execute-this-command-for-all-cursors-1 ()
|
||||
"Used with post-command-hook to execute supported commands for all cursors.
|
||||
|
||||
It uses two lists of commands to know what to do: the run-once
|
||||
list and the run-for-all list. If a command is in neither of these lists,
|
||||
it will prompt for the proper action and then save that preference.
|
||||
|
||||
Some commands are so unsupported that they are even prevented for
|
||||
the original cursor, to inform about the lack of support."
|
||||
(unless mc--executing-command-for-fake-cursor
|
||||
|
||||
(if (eq 1 (mc/num-cursors)) ;; no fake cursors? disable mc-mode
|
||||
(multiple-cursors-mode 0)
|
||||
(when this-original-command
|
||||
(let ((original-command (or mc--this-command
|
||||
(command-remapping this-original-command)
|
||||
this-original-command)))
|
||||
|
||||
;; skip keyboard macros, since they will generate actual commands that are
|
||||
;; also run in the command loop - we'll handle those later instead.
|
||||
(when (functionp original-command)
|
||||
|
||||
;; if it's a lambda, we can't know if it's supported or not
|
||||
;; - so go ahead and assume it's ok, because we're just optimistic like that
|
||||
(if (or (not (symbolp original-command))
|
||||
;; lambda registered by smartrep
|
||||
(string-prefix-p "(" (symbol-name original-command)))
|
||||
(mc/execute-command-for-all-fake-cursors original-command)
|
||||
|
||||
;; smartrep `intern's commands into own obarray to help
|
||||
;; `describe-bindings'. So, let's re-`intern' here to
|
||||
;; make the command comparable by `eq'.
|
||||
(setq original-command (intern (symbol-name original-command)))
|
||||
|
||||
;; otherwise it's a symbol, and we can be more thorough
|
||||
(if (get original-command 'mc--unsupported)
|
||||
(message "%S is not supported with multiple cursors%s"
|
||||
original-command
|
||||
(get original-command 'mc--unsupported))
|
||||
|
||||
;; lazy-load the user's list file
|
||||
(mc/load-lists)
|
||||
|
||||
(when (and original-command
|
||||
(not (memq original-command mc--default-cmds-to-run-once))
|
||||
(not (memq original-command mc/cmds-to-run-once))
|
||||
(or mc/always-run-for-all
|
||||
(memq original-command mc--default-cmds-to-run-for-all)
|
||||
(memq original-command mc/cmds-to-run-for-all)
|
||||
(mc/prompt-for-inclusion-in-whitelist original-command)))
|
||||
(mc/execute-command-for-all-fake-cursors original-command))))))))))
|
||||
|
||||
(defun mc/remove-fake-cursors ()
|
||||
"Remove all fake cursors.
|
||||
Do not use to conclude editing with multiple cursors. For that
|
||||
you should disable multiple-cursors-mode."
|
||||
(mc/for-each-fake-cursor
|
||||
(mc/remove-fake-cursor cursor))
|
||||
(when mc--max-cursors-original
|
||||
(setq mc/max-cursors mc--max-cursors-original))
|
||||
(setq mc--max-cursors-original nil))
|
||||
|
||||
(defun mc/keyboard-quit ()
|
||||
"Deactivate mark if there are any active, otherwise exit multiple-cursors-mode."
|
||||
(interactive)
|
||||
(if (not (use-region-p))
|
||||
(multiple-cursors-mode 0)
|
||||
(deactivate-mark)))
|
||||
|
||||
(defun mc/repeat-command ()
|
||||
"Run last command from `command-history' for every fake cursor."
|
||||
(interactive)
|
||||
(when (or mc/always-repeat-command
|
||||
(y-or-n-p (format "[mc] repeat complex command: %s? " (caar command-history))))
|
||||
(mc/execute-command-for-all-fake-cursors
|
||||
(lambda () (interactive)
|
||||
(cl-letf (((symbol-function 'read-from-minibuffer)
|
||||
(lambda (p &optional i k r h d m) (read i))))
|
||||
(repeat-complex-command 0))))))
|
||||
|
||||
(defvar mc/keymap nil
|
||||
"Keymap while multiple cursors are active.
|
||||
Main goal of the keymap is to rebind C-g and <return> to conclude
|
||||
multiple cursors editing.")
|
||||
(unless mc/keymap
|
||||
(setq mc/keymap (make-sparse-keymap))
|
||||
(define-key mc/keymap (kbd "C-g") 'mc/keyboard-quit)
|
||||
(define-key mc/keymap (kbd "<return>") 'multiple-cursors-mode)
|
||||
(define-key mc/keymap (kbd "C-:") 'mc/repeat-command)
|
||||
(when (fboundp 'phi-search)
|
||||
(define-key mc/keymap (kbd "C-s") 'phi-search))
|
||||
(when (fboundp 'phi-search-backward)
|
||||
(define-key mc/keymap (kbd "C-r") 'phi-search-backward)))
|
||||
|
||||
(defun mc--all-equal (list)
|
||||
"Are all the items in LIST equal?"
|
||||
(let ((first (car list))
|
||||
(all-equal t))
|
||||
(while (and all-equal list)
|
||||
(setq all-equal (equal first (car list)))
|
||||
(setq list (cdr list)))
|
||||
all-equal))
|
||||
|
||||
(defun mc--kill-ring-entries ()
|
||||
"Return the latest kill-ring entry for each cursor.
|
||||
The entries are returned in the order they are found in the buffer."
|
||||
(let (entries)
|
||||
(mc/for-each-cursor-ordered
|
||||
(setq entries (cons (car (overlay-get cursor 'kill-ring)) entries)))
|
||||
(reverse entries)))
|
||||
|
||||
(defun mc--maybe-set-killed-rectangle ()
|
||||
"Add the latest kill-ring entry for each cursor to killed-rectangle.
|
||||
So you can paste it in later with `yank-rectangle'."
|
||||
(let ((entries (let (mc/max-cursors) (mc--kill-ring-entries))))
|
||||
(unless (mc--all-equal entries)
|
||||
(setq killed-rectangle entries))))
|
||||
|
||||
(defvar mc/unsupported-minor-modes '(company-mode auto-complete-mode flyspell-mode jedi-mode)
|
||||
"List of minor-modes that does not play well with multiple-cursors.
|
||||
They are temporarily disabled when multiple-cursors are active.")
|
||||
|
||||
(defvar mc/temporarily-disabled-minor-modes nil
|
||||
"The list of temporarily disabled minor-modes.")
|
||||
(make-variable-buffer-local 'mc/temporarily-disabled-minor-modes)
|
||||
|
||||
(defun mc/temporarily-disable-minor-mode (mode)
|
||||
"If MODE is available and turned on, remember that and turn it off."
|
||||
(when (and (boundp mode) (eval mode))
|
||||
(add-to-list 'mc/temporarily-disabled-minor-modes mode)
|
||||
(funcall mode -1)))
|
||||
|
||||
(defun mc/temporarily-disable-unsupported-minor-modes ()
|
||||
(mapc 'mc/temporarily-disable-minor-mode mc/unsupported-minor-modes))
|
||||
|
||||
(defun mc/enable-minor-mode (mode)
|
||||
(funcall mode 1))
|
||||
|
||||
(defun mc/enable-temporarily-disabled-minor-modes ()
|
||||
(mapc 'mc/enable-minor-mode mc/temporarily-disabled-minor-modes)
|
||||
(setq mc/temporarily-disabled-minor-modes nil))
|
||||
|
||||
(defcustom mc/mode-line
|
||||
`(" mc:" (:eval (format ,(propertize "%d" 'face 'font-lock-warning-face)
|
||||
(mc/num-cursors))))
|
||||
"What to display in the mode line while multiple-cursors-mode is active."
|
||||
:group 'multiple-cursors)
|
||||
(put 'mc/mode-line 'risky-local-variable t)
|
||||
|
||||
;;;###autoload
|
||||
(define-minor-mode multiple-cursors-mode
|
||||
"Mode while multiple cursors are active."
|
||||
nil mc/mode-line mc/keymap
|
||||
(if multiple-cursors-mode
|
||||
(progn
|
||||
(mc/temporarily-disable-unsupported-minor-modes)
|
||||
(add-hook 'pre-command-hook 'mc/make-a-note-of-the-command-being-run nil t)
|
||||
(add-hook 'post-command-hook 'mc/execute-this-command-for-all-cursors t t)
|
||||
(run-hooks 'multiple-cursors-mode-enabled-hook))
|
||||
(remove-hook 'post-command-hook 'mc/execute-this-command-for-all-cursors t)
|
||||
(remove-hook 'pre-command-hook 'mc/make-a-note-of-the-command-being-run t)
|
||||
(setq mc--this-command nil)
|
||||
(mc--maybe-set-killed-rectangle)
|
||||
(mc/remove-fake-cursors)
|
||||
(mc/enable-temporarily-disabled-minor-modes)
|
||||
(run-hooks 'multiple-cursors-mode-disabled-hook)))
|
||||
|
||||
(add-hook 'after-revert-hook #'(lambda () (multiple-cursors-mode 0)))
|
||||
|
||||
(defun mc/maybe-multiple-cursors-mode ()
|
||||
"Enable multiple-cursors-mode if there is more than one currently active cursor."
|
||||
(if (> (mc/num-cursors) 1)
|
||||
(multiple-cursors-mode 1)
|
||||
(multiple-cursors-mode 0)))
|
||||
|
||||
(defmacro unsupported-cmd (cmd msg)
|
||||
"Adds command to list of unsupported commands and prevents it
|
||||
from being executed if in multiple-cursors-mode."
|
||||
`(progn
|
||||
(put (quote ,cmd) 'mc--unsupported ,msg)
|
||||
(defadvice ,cmd (around unsupported-advice activate)
|
||||
"command isn't supported with multiple cursors"
|
||||
(unless (and multiple-cursors-mode (called-interactively-p 'any))
|
||||
ad-do-it))))
|
||||
|
||||
;; Commands that does not work with multiple-cursors
|
||||
(unsupported-cmd isearch-forward ". Feel free to add a compatible version.")
|
||||
(unsupported-cmd isearch-backward ". Feel free to add a compatible version.")
|
||||
|
||||
;; Make sure pastes from other programs are added to all kill-rings when yanking
|
||||
(defadvice current-kill (before interprogram-paste-for-all-cursors
|
||||
(n &optional do-not-move) activate)
|
||||
(let ((interprogram-paste (and (= n 0)
|
||||
interprogram-paste-function
|
||||
(funcall interprogram-paste-function))))
|
||||
(when interprogram-paste
|
||||
;; Add interprogram-paste to normal kill ring, just
|
||||
;; like current-kill usually does for itself.
|
||||
;; We have to do the work for it tho, since the funcall only returns
|
||||
;; something once. It is not a pure function.
|
||||
(let ((interprogram-cut-function nil))
|
||||
(if (listp interprogram-paste)
|
||||
(mapc 'kill-new (nreverse interprogram-paste))
|
||||
(kill-new interprogram-paste))
|
||||
;; And then add interprogram-paste to the kill-rings
|
||||
;; of all the other cursors too.
|
||||
(mc/for-each-fake-cursor
|
||||
(let ((kill-ring (overlay-get cursor 'kill-ring))
|
||||
(kill-ring-yank-pointer (overlay-get cursor 'kill-ring-yank-pointer)))
|
||||
(if (listp interprogram-paste)
|
||||
(mapc 'kill-new (nreverse interprogram-paste))
|
||||
(kill-new interprogram-paste))
|
||||
(overlay-put cursor 'kill-ring kill-ring)
|
||||
(overlay-put cursor 'kill-ring-yank-pointer kill-ring-yank-pointer)))))))
|
||||
|
||||
(defcustom mc/list-file (locate-user-emacs-file ".mc-lists.el")
|
||||
"The position of the file that keeps track of your preferences
|
||||
for running commands with multiple cursors."
|
||||
:type 'file
|
||||
:group 'multiple-cursors)
|
||||
|
||||
(defvar mc--list-file-loaded nil
|
||||
"Whether the list file has already been loaded.")
|
||||
|
||||
(defun mc/load-lists ()
|
||||
"Loads preferences for running commands with multiple cursors from `mc/list-file'"
|
||||
(unless mc--list-file-loaded
|
||||
(load mc/list-file 'noerror 'nomessage)
|
||||
(setq mc--list-file-loaded t)))
|
||||
|
||||
(defun mc/dump-list (list-symbol)
|
||||
"Insert (setq 'LIST-SYMBOL LIST-VALUE) to current buffer."
|
||||
(cl-symbol-macrolet ((value (symbol-value list-symbol)))
|
||||
(insert "(setq " (symbol-name list-symbol) "\n"
|
||||
" '(")
|
||||
(newline-and-indent)
|
||||
(set list-symbol
|
||||
(sort value (lambda (x y) (string-lessp (symbol-name x)
|
||||
(symbol-name y)))))
|
||||
(mapc #'(lambda (cmd) (insert (format "%S" cmd)) (newline-and-indent))
|
||||
value)
|
||||
(insert "))")
|
||||
(newline)))
|
||||
|
||||
(defun mc/save-lists ()
|
||||
"Saves preferences for running commands with multiple cursors to `mc/list-file'"
|
||||
(with-temp-file mc/list-file
|
||||
(emacs-lisp-mode)
|
||||
(insert ";; This file is automatically generated by the multiple-cursors extension.")
|
||||
(newline)
|
||||
(insert ";; It keeps track of your preferences for running commands with multiple cursors.")
|
||||
(newline)
|
||||
(newline)
|
||||
(mc/dump-list 'mc/cmds-to-run-for-all)
|
||||
(newline)
|
||||
(mc/dump-list 'mc/cmds-to-run-once)))
|
||||
|
||||
(defvar mc/cmds-to-run-once nil
|
||||
"Commands to run only once in multiple-cursors-mode.")
|
||||
|
||||
(defvar mc--default-cmds-to-run-once nil
|
||||
"Default set of commands to run only once in multiple-cursors-mode.")
|
||||
|
||||
(setq mc--default-cmds-to-run-once '(mc/edit-lines
|
||||
mc/edit-ends-of-lines
|
||||
mc/edit-beginnings-of-lines
|
||||
mc/mark-next-like-this
|
||||
mc/mark-next-like-this-word
|
||||
mc/mark-next-like-this-symbol
|
||||
mc/mark-next-word-like-this
|
||||
mc/mark-next-symbol-like-this
|
||||
mc/mark-previous-like-this
|
||||
mc/mark-previous-like-this-word
|
||||
mc/mark-previous-like-this-symbol
|
||||
mc/mark-previous-word-like-this
|
||||
mc/mark-previous-symbol-like-this
|
||||
mc/mark-all-like-this
|
||||
mc/mark-all-words-like-this
|
||||
mc/mark-all-symbols-like-this
|
||||
mc/mark-more-like-this-extended
|
||||
mc/mark-all-like-this-in-defun
|
||||
mc/mark-all-words-like-this-in-defun
|
||||
mc/mark-all-symbols-like-this-in-defun
|
||||
mc/mark-all-like-this-dwim
|
||||
mc/mark-all-dwim
|
||||
mc/mark-sgml-tag-pair
|
||||
mc/insert-numbers
|
||||
mc/insert-letters
|
||||
mc/sort-regions
|
||||
mc/reverse-regions
|
||||
mc/cycle-forward
|
||||
mc/cycle-backward
|
||||
mc/add-cursor-on-click
|
||||
mc/mark-pop
|
||||
mc/add-cursors-to-all-matches
|
||||
mc/mmlte--left
|
||||
mc/mmlte--right
|
||||
mc/mmlte--up
|
||||
mc/mmlte--down
|
||||
mc/unmark-next-like-this
|
||||
mc/unmark-previous-like-this
|
||||
mc/skip-to-next-like-this
|
||||
mc/skip-to-previous-like-this
|
||||
rrm/switch-to-multiple-cursors
|
||||
mc-hide-unmatched-lines-mode
|
||||
mc/repeat-command
|
||||
hum/keyboard-quit
|
||||
hum/unhide-invisible-overlays
|
||||
save-buffer
|
||||
ido-exit-minibuffer
|
||||
ivy-done
|
||||
exit-minibuffer
|
||||
minibuffer-complete-and-exit
|
||||
execute-extended-command
|
||||
eval-expression
|
||||
undo
|
||||
redo
|
||||
undo-tree-undo
|
||||
undo-tree-redo
|
||||
universal-argument
|
||||
universal-argument-more
|
||||
universal-argument-other-key
|
||||
negative-argument
|
||||
digit-argument
|
||||
top-level
|
||||
recenter-top-bottom
|
||||
describe-mode
|
||||
describe-key-1
|
||||
describe-function
|
||||
describe-bindings
|
||||
describe-prefix-bindings
|
||||
view-echo-area-messages
|
||||
other-window
|
||||
kill-buffer-and-window
|
||||
split-window-right
|
||||
split-window-below
|
||||
delete-other-windows
|
||||
toggle-window-split
|
||||
mwheel-scroll
|
||||
scroll-up-command
|
||||
scroll-down-command
|
||||
mouse-set-point
|
||||
mouse-drag-region
|
||||
quit-window
|
||||
toggle-read-only
|
||||
windmove-left
|
||||
windmove-right
|
||||
windmove-up
|
||||
windmove-down
|
||||
repeat-complex-command))
|
||||
|
||||
(defvar mc--default-cmds-to-run-for-all nil
|
||||
"Default set of commands that should be mirrored by all cursors")
|
||||
|
||||
(setq mc--default-cmds-to-run-for-all '(mc/keyboard-quit
|
||||
self-insert-command
|
||||
quoted-insert
|
||||
previous-line
|
||||
next-line
|
||||
newline
|
||||
newline-and-indent
|
||||
open-line
|
||||
delete-blank-lines
|
||||
transpose-chars
|
||||
transpose-lines
|
||||
transpose-paragraphs
|
||||
transpose-regions
|
||||
join-line
|
||||
right-char
|
||||
right-word
|
||||
forward-char
|
||||
forward-word
|
||||
left-char
|
||||
left-word
|
||||
backward-char
|
||||
backward-word
|
||||
forward-paragraph
|
||||
backward-paragraph
|
||||
upcase-word
|
||||
downcase-word
|
||||
capitalize-word
|
||||
forward-list
|
||||
backward-list
|
||||
hippie-expand
|
||||
hippie-expand-lines
|
||||
yank
|
||||
yank-pop
|
||||
append-next-kill
|
||||
kill-word
|
||||
kill-line
|
||||
kill-whole-line
|
||||
backward-kill-word
|
||||
backward-delete-char-untabify
|
||||
delete-char delete-forward-char
|
||||
delete-backward-char
|
||||
py-electric-backspace
|
||||
c-electric-backspace
|
||||
org-delete-backward-char
|
||||
cperl-electric-backspace
|
||||
python-indent-dedent-line-backspace
|
||||
paredit-backward-delete
|
||||
autopair-backspace
|
||||
just-one-space
|
||||
zap-to-char
|
||||
end-of-line
|
||||
set-mark-command
|
||||
exchange-point-and-mark
|
||||
cua-set-mark
|
||||
cua-replace-region
|
||||
cua-delete-region
|
||||
move-end-of-line
|
||||
beginning-of-line
|
||||
move-beginning-of-line
|
||||
kill-ring-save
|
||||
back-to-indentation
|
||||
subword-forward
|
||||
subword-backward
|
||||
subword-mark
|
||||
subword-kill
|
||||
subword-backward-kill
|
||||
subword-transpose
|
||||
subword-capitalize
|
||||
subword-upcase
|
||||
subword-downcase
|
||||
er/expand-region
|
||||
er/contract-region
|
||||
smart-forward
|
||||
smart-backward
|
||||
smart-up
|
||||
smart-down))
|
||||
|
||||
(defvar mc/cmds-to-run-for-all nil
|
||||
"Commands to run for all cursors in multiple-cursors-mode")
|
||||
|
||||
(provide 'multiple-cursors-core)
|
||||
|
||||
;; Local Variables:
|
||||
;; coding: utf-8
|
||||
;; End:
|
||||
|
||||
;;; multiple-cursors-core.el ends here
|
|
@ -1,5 +0,0 @@
|
|||
(define-package "multiple-cursors" "20190820.749" "Multiple cursors for Emacs."
|
||||
'((cl-lib "0.5")))
|
||||
;; Local Variables:
|
||||
;; no-byte-compile: t
|
||||
;; End:
|
|
@ -1,203 +0,0 @@
|
|||
;;; multiple-cursors.el --- Multiple cursors for emacs.
|
||||
|
||||
;; Copyright (C) 2012-2016 Magnar Sveen
|
||||
|
||||
;; Author: Magnar Sveen <magnars@gmail.com>
|
||||
;; Version: 1.4.0
|
||||
;; 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 <http://www.gnu.org/licenses/>.
|
||||
|
||||
;;; Commentary:
|
||||
|
||||
;; Multiple cursors for Emacs. This is some pretty crazy functionality, so yes,
|
||||
;; there are kinks. Don't be afraid tho, I've been using it since 2011 with
|
||||
;; great success and much merriment.
|
||||
|
||||
;; ## Basic usage
|
||||
|
||||
;; Start out with:
|
||||
|
||||
;; (require 'multiple-cursors)
|
||||
|
||||
;; Then you have to set up your keybindings - multiple-cursors doesn't presume to
|
||||
;; know how you'd like them laid out. Here are some examples:
|
||||
|
||||
;; When you have an active region that spans multiple lines, the following will
|
||||
;; add a cursor to each line:
|
||||
|
||||
;; (global-set-key (kbd "C-S-c C-S-c") 'mc/edit-lines)
|
||||
|
||||
;; When you want to add multiple cursors not based on continuous lines, but based on
|
||||
;; keywords in the buffer, use:
|
||||
|
||||
;; (global-set-key (kbd "C->") 'mc/mark-next-like-this)
|
||||
;; (global-set-key (kbd "C-<") 'mc/mark-previous-like-this)
|
||||
;; (global-set-key (kbd "C-c C-<") 'mc/mark-all-like-this)
|
||||
|
||||
;; First mark the word, then add more cursors.
|
||||
|
||||
;; To get out of multiple-cursors-mode, press `<return>` or `C-g`. The latter will
|
||||
;; first disable multiple regions before disabling multiple cursors. If you want to
|
||||
;; insert a newline in multiple-cursors-mode, use `C-j`.
|
||||
|
||||
;; ## Video
|
||||
|
||||
;; You can [watch an intro to multiple-cursors at Emacs Rocks](http://emacsrocks.com/e13.html).
|
||||
|
||||
;; ## Command overview
|
||||
|
||||
;; ### Mark one more occurrence
|
||||
|
||||
;; - `mc/mark-next-like-this`: Adds a cursor and region at the next part of the buffer forwards that matches the current region.
|
||||
;; - `mc/mark-next-like-this-word`: Adds a cursor and region at the next part of the buffer forwards that matches the current region, if no region is selected it selects the word at the point.
|
||||
;; - `mc/mark-next-like-this-symbol`: Adds a cursor and region at the next part of the buffer forwards that matches the current region, if no region is selected it selects the symbol at the point.
|
||||
;; - `mc/mark-next-word-like-this`: Like `mc/mark-next-like-this` but only for whole words.
|
||||
;; - `mc/mark-next-symbol-like-this`: Like `mc/mark-next-like-this` but only for whole symbols.
|
||||
;; - `mc/mark-previous-like-this`: Adds a cursor and region at the next part of the buffer backwards that matches the current region.
|
||||
;; - `mc/mark-previous-word-like-this`: Like `mc/mark-previous-like-this` but only for whole words.
|
||||
;; - `mc/mark-previous-symbol-like-this`: Like `mc/mark-previous-like-this` but only for whole symbols.
|
||||
;; - `mc/mark-more-like-this-extended`: Use arrow keys to quickly mark/skip next/previous occurances.
|
||||
;; - `mc/add-cursor-on-click`: Bind to a mouse event to add cursors by clicking. See tips-section.
|
||||
|
||||
;; ### Mark many occurrences
|
||||
|
||||
;; - `mc/mark-all-like-this`: Marks all parts of the buffer that matches the current region.
|
||||
;; - `mc/mark-all-words-like-this`: Like `mc/mark-all-like-this` but only for whole words.
|
||||
;; - `mc/mark-all-symbols-like-this`: Like `mc/mark-all-like-this` but only for whole symbols.
|
||||
;; - `mc/mark-all-in-region`: Prompts for a string to match in the region, adding cursors to all of them.
|
||||
;; - `mc/mark-all-like-this-in-defun`: Marks all parts of the current defun that matches the current region.
|
||||
;; - `mc/mark-all-words-like-this-in-defun`: Like `mc/mark-all-like-this-in-defun` but only for whole words.
|
||||
;; - `mc/mark-all-symbols-like-this-in-defun`: Like `mc/mark-all-like-this-in-defun` but only for whole symbols.
|
||||
;; - `mc/mark-all-like-this-dwim`: Tries to be smart about marking everything you want. Can be pressed multiple times.
|
||||
|
||||
;; ### Special
|
||||
|
||||
;; - `set-rectangular-region-anchor`: Think of this one as `set-mark` except you're marking a rectangular region.
|
||||
;; - `mc/mark-sgml-tag-pair`: Mark the current opening and closing tag.
|
||||
;; - `mc/insert-numbers`: Insert increasing numbers for each cursor, top to bottom.
|
||||
;; - `mc/insert-letters`: Insert increasing letters for each cursor, top to bottom.
|
||||
;; - `mc/sort-regions`: Sort the marked regions alphabetically.
|
||||
;; - `mc/reverse-regions`: Reverse the order of the marked regions.
|
||||
|
||||
;; ## Tips and tricks
|
||||
|
||||
;; - To get out of multiple-cursors-mode, press `<return>` or `C-g`. The latter will
|
||||
;; first disable multiple regions before disabling multiple cursors. If you want to
|
||||
;; insert a newline in multiple-cursors-mode, use `C-j`.
|
||||
;;
|
||||
;; - Sometimes you end up with cursors outside of your view. You can
|
||||
;; scroll the screen to center on each cursor with `C-v` and `M-v`.
|
||||
;;
|
||||
;; - Try pressing `mc/mark-next-like-this` with no region selected. It will just add a cursor
|
||||
;; on the next line.
|
||||
;;
|
||||
;; - Try pressing `mc/mark-next-like-this-word` or
|
||||
;; `mc/mark-next-like-this-symbol` with no region selected. It will
|
||||
;; mark the symbol and add a cursor at the next occurance
|
||||
;;
|
||||
;; - Try pressing `mc/mark-all-like-this-dwim` on a tagname in html-mode.
|
||||
;;
|
||||
;; - Notice that the number of cursors active can be seen in the modeline.
|
||||
;;
|
||||
;; - If you get out of multiple-cursors-mode and yank - it will yank only
|
||||
;; from the kill-ring of main cursor. To yank from the kill-rings of
|
||||
;; every cursor use yank-rectangle, normally found at C-x r y.
|
||||
;;
|
||||
;; - You can use `mc/reverse-regions` with nothing selected and just one cursor.
|
||||
;; It will then flip the sexp at point and the one below it.
|
||||
;;
|
||||
;; - If you would like to keep the global bindings clean, and get custom keybindings
|
||||
;; when the region is active, you can try [region-bindings-mode](https://github.com/fgallina/region-bindings-mode).
|
||||
;;
|
||||
;; BTW, I highly recommend adding `mc/mark-next-like-this` to a key binding that's
|
||||
;; right next to the key for `er/expand-region`.
|
||||
|
||||
;; ### Binding mouse events
|
||||
|
||||
;; To override a mouse event, you will likely have to also unbind the
|
||||
;; `down-mouse` part of the event. Like this:
|
||||
;;
|
||||
;; (global-unset-key (kbd "M-<down-mouse-1>"))
|
||||
;; (global-set-key (kbd "M-<mouse-1>") 'mc/add-cursor-on-click)
|
||||
;;
|
||||
;; Or you can do like me and find an unused, but less convenient, binding:
|
||||
;;
|
||||
;; (global-set-key (kbd "C-S-<mouse-1>") 'mc/add-cursor-on-click)
|
||||
|
||||
;; ## Unknown commands
|
||||
|
||||
;; Multiple-cursors uses two lists of commands to know what to do: the run-once list
|
||||
;; and the run-for-all list. It comes with a set of defaults, but it would be beyond silly
|
||||
;; to try and include all the known Emacs commands.
|
||||
|
||||
;; So that's why multiple-cursors occasionally asks what to do about a command. It will
|
||||
;; then remember your choice by saving it in `~/.emacs.d/.mc-lists.el`. You can change
|
||||
;; the location with:
|
||||
|
||||
;; (setq mc/list-file "/my/preferred/file")
|
||||
|
||||
;; ## Known limitations
|
||||
|
||||
;; * isearch-forward and isearch-backward aren't supported with multiple cursors.
|
||||
;; You should feel free to add a simplified version that can work with it.
|
||||
;; * Commands run with `M-x` won't be repeated for all cursors.
|
||||
;; * All key bindings that refer to lambdas are always run for all cursors. If you
|
||||
;; need to limit it, you will have to give it a name.
|
||||
;; * Redo might screw with your cursors. Undo works very well.
|
||||
|
||||
;; ## Contribute
|
||||
|
||||
;; Yes, please do. There's a suite of tests, so remember to add tests for your
|
||||
;; specific feature, or I might break it later.
|
||||
|
||||
;; You'll find the repo at:
|
||||
|
||||
;; https://github.com/magnars/multiple-cursors.el
|
||||
|
||||
;; To fetch the test dependencies:
|
||||
|
||||
;; $ cd /path/to/multiple-cursors
|
||||
;; $ git submodule update --init
|
||||
|
||||
;; Run the tests with:
|
||||
|
||||
;; $ ./util/ecukes/ecukes --graphical
|
||||
|
||||
;; ## Contributors
|
||||
|
||||
;; * [Takafumi Arakaki](https://github.com/tkf) made .mc-lists.el diff friendly
|
||||
;; * [Marco Baringer](https://github.com/segv) contributed looping to mc/cycle and adding cursors without region for mark-more.
|
||||
;; * [Ivan Andrus](https://github.com/gvol) added showing number of cursors in mode-line
|
||||
;; * [Fuco](https://github.com/Fuco1) added the first version of `mc/mark-all-like-this-dwim`
|
||||
|
||||
;; Thanks!
|
||||
|
||||
;;; Code:
|
||||
|
||||
(defgroup multiple-cursors nil
|
||||
"Multiple cursors for emacs."
|
||||
:group 'editing)
|
||||
|
||||
(require 'mc-edit-lines)
|
||||
(require 'mc-cycle-cursors)
|
||||
(require 'mc-mark-more)
|
||||
(require 'mc-mark-pop)
|
||||
(require 'rectangular-region-mode)
|
||||
(require 'mc-separate-operations)
|
||||
(require 'mc-hide-unmatched-lines-mode)
|
||||
|
||||
(provide 'multiple-cursors)
|
||||
|
||||
;;; multiple-cursors.el ends here
|
|
@ -1,125 +0,0 @@
|
|||
;;; rectangular-region-mode.el
|
||||
|
||||
;; Copyright (C) 2012-2016 Magnar Sveen
|
||||
|
||||
;; Author: Magnar Sveen <magnars@gmail.com>
|
||||
;; 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 <http://www.gnu.org/licenses/>.
|
||||
|
||||
;;; Commentary:
|
||||
|
||||
;; (global-set-key (kbd "H-SPC") 'set-rectangular-region-anchor)
|
||||
|
||||
;; Think of this one as `set-mark` except you're marking a rectangular region. It is
|
||||
;; an exceedingly quick way of adding multiple cursors to multiple lines.
|
||||
|
||||
;;; Code:
|
||||
|
||||
(require 'multiple-cursors-core)
|
||||
|
||||
(defvar rrm/anchor (make-marker)
|
||||
"The position in the buffer that anchors the rectangular region.")
|
||||
|
||||
(defvar rectangular-region-mode-map (make-sparse-keymap)
|
||||
"Keymap for rectangular region is mainly for rebinding C-g")
|
||||
|
||||
(define-key rectangular-region-mode-map (kbd "C-g") 'rrm/keyboard-quit)
|
||||
(define-key rectangular-region-mode-map (kbd "<return>") 'rrm/switch-to-multiple-cursors)
|
||||
|
||||
(defvar rectangular-region-mode nil)
|
||||
|
||||
(defun rrm/keyboard-quit ()
|
||||
"Exit rectangular-region-mode."
|
||||
(interactive)
|
||||
(rectangular-region-mode 0)
|
||||
(rrm/remove-rectangular-region-overlays)
|
||||
(deactivate-mark))
|
||||
|
||||
;; Bind this to a key (for instance H-SPC) to start rectangular-region-mode
|
||||
;;;###autoload
|
||||
(defun set-rectangular-region-anchor ()
|
||||
"Anchors the rectangular region at point.
|
||||
|
||||
Think of this one as `set-mark' except you're marking a rectangular region. It is
|
||||
an exceedingly quick way of adding multiple cursors to multiple lines."
|
||||
(interactive)
|
||||
(set-marker rrm/anchor (point))
|
||||
(push-mark (point))
|
||||
(rectangular-region-mode 1))
|
||||
|
||||
(defun rrm/remove-rectangular-region-overlays ()
|
||||
"Remove all rectangular-region overlays."
|
||||
(mc/remove-fake-cursors)
|
||||
(mapc #'(lambda (o)
|
||||
(when (eq (overlay-get o 'type) 'additional-region)
|
||||
(delete-overlay o)))
|
||||
(overlays-in (point-min) (point-max))))
|
||||
|
||||
(defun rrm/repaint ()
|
||||
"Start from the anchor and draw a rectangle between it and point."
|
||||
(if (not rectangular-region-mode)
|
||||
(remove-hook 'post-command-hook 'rrm/repaint t)
|
||||
;; else
|
||||
(rrm/remove-rectangular-region-overlays)
|
||||
(let* ((annoying-arrows-mode nil)
|
||||
(point-column (current-column))
|
||||
(point-line (mc/line-number-at-pos))
|
||||
(anchor-column (save-excursion (goto-char rrm/anchor) (current-column)))
|
||||
(anchor-line (save-excursion (goto-char rrm/anchor) (mc/line-number-at-pos)))
|
||||
(left-column (if (< point-column anchor-column) point-column anchor-column))
|
||||
(right-column (if (> point-column anchor-column) point-column anchor-column))
|
||||
(navigation-step (if (< point-line anchor-line) 1 -1)))
|
||||
(move-to-column anchor-column)
|
||||
(set-mark (point))
|
||||
(move-to-column point-column)
|
||||
(mc/save-excursion
|
||||
(while (not (= anchor-line (mc/line-number-at-pos)))
|
||||
(forward-line navigation-step)
|
||||
(move-to-column anchor-column)
|
||||
(when (= anchor-column (current-column))
|
||||
(set-mark (point))
|
||||
(move-to-column point-column)
|
||||
(when (= point-column (current-column))
|
||||
(mc/create-fake-cursor-at-point))))))))
|
||||
|
||||
(defun rrm/switch-to-multiple-cursors (&rest forms)
|
||||
"Switch from rectangular-region-mode to multiple-cursors-mode."
|
||||
(interactive)
|
||||
(rectangular-region-mode 0)
|
||||
(multiple-cursors-mode 1))
|
||||
|
||||
(defadvice er/expand-region (before switch-from-rrm-to-mc activate)
|
||||
(when rectangular-region-mode
|
||||
(rrm/switch-to-multiple-cursors)))
|
||||
|
||||
(defadvice kill-ring-save (before switch-from-rrm-to-mc activate)
|
||||
(when rectangular-region-mode
|
||||
(rrm/switch-to-multiple-cursors)))
|
||||
|
||||
;;;###autoload
|
||||
(define-minor-mode rectangular-region-mode
|
||||
"A mode for creating a rectangular region to edit"
|
||||
nil " rr" rectangular-region-mode-map
|
||||
(if rectangular-region-mode
|
||||
(progn
|
||||
(add-hook 'after-change-functions 'rrm/switch-to-multiple-cursors t t)
|
||||
(add-hook 'post-command-hook 'rrm/repaint t t))
|
||||
(remove-hook 'after-change-functions 'rrm/switch-to-multiple-cursors t)
|
||||
(remove-hook 'post-command-hook 'rrm/repaint t)
|
||||
(set-marker rrm/anchor nil)))
|
||||
|
||||
(provide 'rectangular-region-mode)
|
||||
|
||||
;;; rectangular-region-mode.el ends here
|
|
@ -1,18 +0,0 @@
|
|||
This is the file .../info/dir, which contains the
|
||||
topmost node of the Info hierarchy, called (dir)Top.
|
||||
The first time you invoke Info you start off looking at this node.
|
||||
|
||||
File: dir, Node: Top This is the top of the INFO tree
|
||||
|
||||
This (the Directory node) gives a menu of major topics.
|
||||
Typing "q" exits, "H" lists all Info commands, "d" returns here,
|
||||
"h" gives a primer for first-timers,
|
||||
"mEmacs<Return>" visits the Emacs manual, etc.
|
||||
|
||||
In Emacs, you can click mouse button 2 on a menu item or cross reference
|
||||
to select it.
|
||||
|
||||
* Menu:
|
||||
|
||||
Emacs
|
||||
* use-package: (use-package). Declarative package configuration for Emacs.
|
|
@ -1,228 +0,0 @@
|
|||
;;; use-package-autoloads.el --- automatically extracted autoloads
|
||||
;;
|
||||
;;; Code:
|
||||
|
||||
(add-to-list 'load-path (directory-file-name
|
||||
(or (file-name-directory #$) (car load-path))))
|
||||
|
||||
|
||||
;;;### (autoloads nil "use-package-bind-key" "use-package-bind-key.el"
|
||||
;;;;;; (0 0 0 0))
|
||||
;;; Generated autoloads from use-package-bind-key.el
|
||||
|
||||
(autoload 'use-package-autoload-keymap "use-package-bind-key" "\
|
||||
Loads PACKAGE and then binds the key sequence used to invoke
|
||||
this function to KEYMAP-SYMBOL. It then simulates pressing the
|
||||
same key sequence a again, so that the next key pressed is routed
|
||||
to the newly loaded keymap.
|
||||
|
||||
This function supports use-package's :bind-keymap keyword. It
|
||||
works by binding the given key sequence to an invocation of this
|
||||
function for a particular keymap. The keymap is expected to be
|
||||
defined by the package. In this way, loading the package is
|
||||
deferred until the prefix key sequence is pressed.
|
||||
|
||||
\(fn KEYMAP-SYMBOL PACKAGE OVERRIDE)" nil nil)
|
||||
|
||||
(autoload 'use-package-normalize-binder "use-package-bind-key" "\
|
||||
|
||||
|
||||
\(fn NAME KEYWORD ARGS)" nil nil)
|
||||
|
||||
(defalias 'use-package-normalize/:bind 'use-package-normalize-binder)
|
||||
|
||||
(defalias 'use-package-normalize/:bind* 'use-package-normalize-binder)
|
||||
|
||||
(defalias 'use-package-autoloads/:bind 'use-package-autoloads-mode)
|
||||
|
||||
(defalias 'use-package-autoloads/:bind* 'use-package-autoloads-mode)
|
||||
|
||||
(autoload 'use-package-handler/:bind "use-package-bind-key" "\
|
||||
|
||||
|
||||
\(fn NAME KEYWORD ARGS REST STATE &optional BIND-MACRO)" nil nil)
|
||||
|
||||
(defalias 'use-package-normalize/:bind-keymap 'use-package-normalize-binder)
|
||||
|
||||
(defalias 'use-package-normalize/:bind-keymap* 'use-package-normalize-binder)
|
||||
|
||||
(autoload 'use-package-handler/:bind-keymap "use-package-bind-key" "\
|
||||
|
||||
|
||||
\(fn NAME KEYWORD ARGS REST STATE &optional OVERRIDE)" nil nil)
|
||||
|
||||
(autoload 'use-package-handler/:bind-keymap* "use-package-bind-key" "\
|
||||
|
||||
|
||||
\(fn NAME KEYWORD ARG REST STATE)" nil nil)
|
||||
|
||||
(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "use-package-bind-key" '("use-package-handler/:bind*")))
|
||||
|
||||
;;;***
|
||||
|
||||
;;;### (autoloads nil "use-package-core" "use-package-core.el" (0
|
||||
;;;;;; 0 0 0))
|
||||
;;; Generated autoloads from use-package-core.el
|
||||
|
||||
(autoload 'use-package "use-package-core" "\
|
||||
Declare an Emacs package by specifying a group of configuration options.
|
||||
|
||||
For full documentation, please see the README file that came with
|
||||
this file. Usage:
|
||||
|
||||
(use-package package-name
|
||||
[:keyword [option]]...)
|
||||
|
||||
:init Code to run before PACKAGE-NAME has been loaded.
|
||||
:config Code to run after PACKAGE-NAME has been loaded. Note that
|
||||
if loading is deferred for any reason, this code does not
|
||||
execute until the lazy load has occurred.
|
||||
:preface Code to be run before everything except `:disabled'; this
|
||||
can be used to define functions for use in `:if', or that
|
||||
should be seen by the byte-compiler.
|
||||
|
||||
:mode Form to be added to `auto-mode-alist'.
|
||||
:magic Form to be added to `magic-mode-alist'.
|
||||
:magic-fallback Form to be added to `magic-fallback-mode-alist'.
|
||||
:interpreter Form to be added to `interpreter-mode-alist'.
|
||||
|
||||
:commands Define autoloads for commands that will be defined by the
|
||||
package. This is useful if the package is being lazily
|
||||
loaded, and you wish to conditionally call functions in your
|
||||
`:init' block that are defined in the package.
|
||||
:hook Specify hook(s) to attach this package to.
|
||||
|
||||
:bind Bind keys, and define autoloads for the bound commands.
|
||||
:bind* Bind keys, and define autoloads for the bound commands,
|
||||
*overriding all minor mode bindings*.
|
||||
:bind-keymap Bind a key prefix to an auto-loaded keymap defined in the
|
||||
package. This is like `:bind', but for keymaps.
|
||||
:bind-keymap* Like `:bind-keymap', but overrides all minor mode bindings
|
||||
|
||||
:defer Defer loading of a package -- this is implied when using
|
||||
`:commands', `:bind', `:bind*', `:mode', `:magic', `:hook',
|
||||
`:magic-fallback', or `:interpreter'. This can be an integer,
|
||||
to force loading after N seconds of idle time, if the package
|
||||
has not already been loaded.
|
||||
:after Defer loading of a package until after any of the named
|
||||
features are loaded.
|
||||
:demand Prevent deferred loading in all cases.
|
||||
|
||||
:if EXPR Initialize and load only if EXPR evaluates to a non-nil value.
|
||||
:disabled The package is ignored completely if this keyword is present.
|
||||
:defines Declare certain variables to silence the byte-compiler.
|
||||
:functions Declare certain functions to silence the byte-compiler.
|
||||
:load-path Add to the `load-path' before attempting to load the package.
|
||||
:diminish Support for diminish.el (if installed).
|
||||
:delight Support for delight.el (if installed).
|
||||
:custom Call `customize-set-variable' with each variable definition.
|
||||
:custom-face Call `customize-set-faces' with each face definition.
|
||||
:ensure Loads the package using package.el if necessary.
|
||||
:pin Pin the package to an archive.
|
||||
|
||||
\(fn NAME &rest ARGS)" nil t)
|
||||
|
||||
(function-put 'use-package 'lisp-indent-function '1)
|
||||
|
||||
(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "use-package-core" '("use-package-")))
|
||||
|
||||
;;;***
|
||||
|
||||
;;;### (autoloads nil "use-package-delight" "use-package-delight.el"
|
||||
;;;;;; (0 0 0 0))
|
||||
;;; Generated autoloads from use-package-delight.el
|
||||
|
||||
(autoload 'use-package-normalize/:delight "use-package-delight" "\
|
||||
Normalize arguments to delight.
|
||||
|
||||
\(fn NAME KEYWORD ARGS)" nil nil)
|
||||
|
||||
(autoload 'use-package-handler/:delight "use-package-delight" "\
|
||||
|
||||
|
||||
\(fn NAME KEYWORD ARGS REST STATE)" nil nil)
|
||||
|
||||
(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "use-package-delight" '("use-package-normalize-delight")))
|
||||
|
||||
;;;***
|
||||
|
||||
;;;### (autoloads nil "use-package-diminish" "use-package-diminish.el"
|
||||
;;;;;; (0 0 0 0))
|
||||
;;; Generated autoloads from use-package-diminish.el
|
||||
|
||||
(autoload 'use-package-normalize/:diminish "use-package-diminish" "\
|
||||
|
||||
|
||||
\(fn NAME KEYWORD ARGS)" nil nil)
|
||||
|
||||
(autoload 'use-package-handler/:diminish "use-package-diminish" "\
|
||||
|
||||
|
||||
\(fn NAME KEYWORD ARG REST STATE)" nil nil)
|
||||
|
||||
(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "use-package-diminish" '("use-package-normalize-diminish")))
|
||||
|
||||
;;;***
|
||||
|
||||
;;;### (autoloads nil "use-package-ensure" "use-package-ensure.el"
|
||||
;;;;;; (0 0 0 0))
|
||||
;;; Generated autoloads from use-package-ensure.el
|
||||
|
||||
(autoload 'use-package-normalize/:ensure "use-package-ensure" "\
|
||||
|
||||
|
||||
\(fn NAME KEYWORD ARGS)" nil nil)
|
||||
|
||||
(autoload 'use-package-handler/:ensure "use-package-ensure" "\
|
||||
|
||||
|
||||
\(fn NAME KEYWORD ENSURE REST STATE)" nil nil)
|
||||
|
||||
(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "use-package-ensure" '("use-package-")))
|
||||
|
||||
;;;***
|
||||
|
||||
;;;### (autoloads nil "use-package-jump" "use-package-jump.el" (0
|
||||
;;;;;; 0 0 0))
|
||||
;;; Generated autoloads from use-package-jump.el
|
||||
|
||||
(autoload 'use-package-jump-to-package-form "use-package-jump" "\
|
||||
Attempt to find and jump to the `use-package' form that loaded
|
||||
PACKAGE. This will only find the form if that form actually
|
||||
required PACKAGE. If PACKAGE was previously required then this
|
||||
function will jump to the file that originally required PACKAGE
|
||||
instead.
|
||||
|
||||
\(fn PACKAGE)" t nil)
|
||||
|
||||
(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "use-package-jump" '("use-package-find-require")))
|
||||
|
||||
;;;***
|
||||
|
||||
;;;### (autoloads nil "use-package-lint" "use-package-lint.el" (0
|
||||
;;;;;; 0 0 0))
|
||||
;;; Generated autoloads from use-package-lint.el
|
||||
|
||||
(autoload 'use-package-lint "use-package-lint" "\
|
||||
Check for errors in use-package declarations.
|
||||
For example, if the module's `:if' condition is met, but even
|
||||
with the specified `:load-path' the module cannot be found.
|
||||
|
||||
\(fn)" t nil)
|
||||
|
||||
(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "use-package-lint" '("use-package-lint-declaration")))
|
||||
|
||||
;;;***
|
||||
|
||||
;;;### (autoloads nil nil ("use-package-pkg.el" "use-package.el")
|
||||
;;;;;; (0 0 0 0))
|
||||
|
||||
;;;***
|
||||
|
||||
;; Local Variables:
|
||||
;; version-control: never
|
||||
;; no-byte-compile: t
|
||||
;; no-update-autoloads: t
|
||||
;; coding: utf-8
|
||||
;; End:
|
||||
;;; use-package-autoloads.el ends here
|
|
@ -1,172 +0,0 @@
|
|||
;;; use-package-bind-key.el --- Support for the :bind/:bind-keymap keywords -*- lexical-binding: t; -*-
|
||||
|
||||
;; Copyright (C) 2012-2017 John Wiegley
|
||||
|
||||
;; Author: John Wiegley <johnw@newartisans.com>
|
||||
;; Maintainer: John Wiegley <johnw@newartisans.com>
|
||||
;; Created: 17 Jun 2012
|
||||
;; Modified: 4 Dec 2017
|
||||
;; Version: 1.0
|
||||
;; Package-Requires: ((emacs "24.3") (use-package "2.4") (bind-key "2.4"))
|
||||
;; Keywords: dotemacs startup speed config package
|
||||
;; URL: https://github.com/jwiegley/use-package
|
||||
|
||||
;; 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, 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 GNU Emacs; see the file COPYING. If not, write to the
|
||||
;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||
;; Boston, MA 02111-1307, USA.
|
||||
|
||||
;;; Commentary:
|
||||
|
||||
;; Provides support for the :bind, :bind*, :bind-keymap and :bind-keymap*
|
||||
;; keywords. Note that these are currently still baked into
|
||||
;; `use-package-keywords' and `use-package-deferring-keywords', although this
|
||||
;; is harmless if they are never used.
|
||||
|
||||
;;; Code:
|
||||
|
||||
(require 'use-package-core)
|
||||
(require 'bind-key)
|
||||
|
||||
;;;###autoload
|
||||
(defun use-package-autoload-keymap (keymap-symbol package override)
|
||||
"Loads PACKAGE and then binds the key sequence used to invoke
|
||||
this function to KEYMAP-SYMBOL. It then simulates pressing the
|
||||
same key sequence a again, so that the next key pressed is routed
|
||||
to the newly loaded keymap.
|
||||
|
||||
This function supports use-package's :bind-keymap keyword. It
|
||||
works by binding the given key sequence to an invocation of this
|
||||
function for a particular keymap. The keymap is expected to be
|
||||
defined by the package. In this way, loading the package is
|
||||
deferred until the prefix key sequence is pressed."
|
||||
(if (not (require package nil t))
|
||||
(use-package-error (format "Cannot load package.el: %s" package))
|
||||
(if (and (boundp keymap-symbol)
|
||||
(keymapp (symbol-value keymap-symbol)))
|
||||
(let* ((kv (this-command-keys-vector))
|
||||
(key (key-description kv))
|
||||
(keymap (symbol-value keymap-symbol)))
|
||||
(if override
|
||||
(bind-key* key keymap)
|
||||
(bind-key key keymap))
|
||||
(setq unread-command-events
|
||||
(mapcar (lambda (ev) (cons t ev))
|
||||
(listify-key-sequence kv))))
|
||||
(use-package-error
|
||||
(format "package.el %s failed to define keymap %s"
|
||||
package keymap-symbol)))))
|
||||
|
||||
;;;###autoload
|
||||
(defun use-package-normalize-binder (name keyword args)
|
||||
(let ((arg args)
|
||||
args*)
|
||||
(while arg
|
||||
(let ((x (car arg)))
|
||||
(cond
|
||||
;; (KEY . COMMAND)
|
||||
((and (consp x)
|
||||
(or (stringp (car x))
|
||||
(vectorp (car x)))
|
||||
(or (use-package-recognize-function (cdr x) t #'stringp)))
|
||||
(setq args* (nconc args* (list x)))
|
||||
(setq arg (cdr arg)))
|
||||
;; KEYWORD
|
||||
;; :map KEYMAP
|
||||
;; :prefix-docstring STRING
|
||||
;; :prefix-map SYMBOL
|
||||
;; :prefix STRING
|
||||
;; :filter SEXP
|
||||
;; :menu-name STRING
|
||||
;; :package SYMBOL
|
||||
((or (and (eq x :map) (symbolp (cadr arg)))
|
||||
(and (eq x :prefix) (stringp (cadr arg)))
|
||||
(and (eq x :prefix-map) (symbolp (cadr arg)))
|
||||
(and (eq x :prefix-docstring) (stringp (cadr arg)))
|
||||
(eq x :filter)
|
||||
(and (eq x :menu-name) (stringp (cadr arg)))
|
||||
(and (eq x :package) (symbolp (cadr arg))))
|
||||
(setq args* (nconc args* (list x (cadr arg))))
|
||||
(setq arg (cddr arg)))
|
||||
((listp x)
|
||||
(setq args*
|
||||
(nconc args* (use-package-normalize-binder name keyword x)))
|
||||
(setq arg (cdr arg)))
|
||||
(t
|
||||
;; Error!
|
||||
(use-package-error
|
||||
(concat (symbol-name name)
|
||||
" wants arguments acceptable to the `bind-keys' macro,"
|
||||
" or a list of such values"))))))
|
||||
args*))
|
||||
|
||||
;;;; :bind, :bind*
|
||||
|
||||
;;;###autoload
|
||||
(defalias 'use-package-normalize/:bind 'use-package-normalize-binder)
|
||||
;;;###autoload
|
||||
(defalias 'use-package-normalize/:bind* 'use-package-normalize-binder)
|
||||
|
||||
;; jww (2017-12-07): This is too simplistic. It will fail to determine
|
||||
;; autoloads in this situation:
|
||||
;; (use-package foo
|
||||
;; :bind (:map foo-map (("C-a" . func))))
|
||||
;;;###autoload
|
||||
(defalias 'use-package-autoloads/:bind 'use-package-autoloads-mode)
|
||||
;;;###autoload
|
||||
(defalias 'use-package-autoloads/:bind* 'use-package-autoloads-mode)
|
||||
|
||||
;;;###autoload
|
||||
(defun use-package-handler/:bind
|
||||
(name _keyword args rest state &optional bind-macro)
|
||||
(use-package-concat
|
||||
(use-package-process-keywords name rest state)
|
||||
`(,@(mapcar
|
||||
#'(lambda (xs)
|
||||
`(,(if bind-macro bind-macro 'bind-keys)
|
||||
:package ,name ,@(use-package-normalize-commands xs)))
|
||||
(use-package-split-list-at-keys :break args)))))
|
||||
|
||||
(defun use-package-handler/:bind* (name keyword arg rest state)
|
||||
(use-package-handler/:bind name keyword arg rest state 'bind-keys*))
|
||||
|
||||
;;;; :bind-keymap, :bind-keymap*
|
||||
|
||||
;;;###autoload
|
||||
(defalias 'use-package-normalize/:bind-keymap 'use-package-normalize-binder)
|
||||
;;;###autoload
|
||||
(defalias 'use-package-normalize/:bind-keymap* 'use-package-normalize-binder)
|
||||
|
||||
;;;###autoload
|
||||
(defun use-package-handler/:bind-keymap
|
||||
(name _keyword args rest state &optional override)
|
||||
(use-package-concat
|
||||
(use-package-process-keywords name rest state)
|
||||
(mapcar
|
||||
#'(lambda (binding)
|
||||
`(,(if override 'bind-key* 'bind-key)
|
||||
,(car binding)
|
||||
#'(lambda ()
|
||||
(interactive)
|
||||
(use-package-autoload-keymap
|
||||
',(cdr binding) ',(use-package-as-symbol name)
|
||||
,override))))
|
||||
args)))
|
||||
|
||||
;;;###autoload
|
||||
(defun use-package-handler/:bind-keymap* (name keyword arg rest state)
|
||||
(use-package-handler/:bind-keymap name keyword arg rest state t))
|
||||
|
||||
(provide 'use-package-bind-key)
|
||||
|
||||
;;; use-package-bind-key.el ends here
|
File diff suppressed because it is too large
Load Diff
|
@ -1,91 +0,0 @@
|
|||
;;; use-package-delight.el --- Support for the :delight keyword -*- lexical-binding: t; -*-
|
||||
|
||||
;; Copyright (C) 2012-2017 John Wiegley
|
||||
|
||||
;; Author: John Wiegley <johnw@newartisans.com>
|
||||
;; Maintainer: John Wiegley <johnw@newartisans.com>
|
||||
;; Created: 17 Jun 2012
|
||||
;; Modified: 3 Dec 2017
|
||||
;; Version: 1.0
|
||||
;; Package-Requires: ((emacs "24.3") (use-package "2.4"))
|
||||
;; Keywords: dotemacs startup speed config package
|
||||
;; URL: https://github.com/jwiegley/use-package
|
||||
|
||||
;; 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, 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 GNU Emacs; see the file COPYING. If not, write to the
|
||||
;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||
;; Boston, MA 02111-1307, USA.
|
||||
|
||||
;;; Commentary:
|
||||
|
||||
;; Provides support for the :delight keyword, which is made available by
|
||||
;; default by requiring `use-package'.
|
||||
|
||||
;;; Code:
|
||||
|
||||
(require 'use-package-core)
|
||||
|
||||
(defun use-package-normalize-delight (name args)
|
||||
"Normalize ARGS for a single call to `delight'."
|
||||
(when (eq :eval (car args))
|
||||
;; Handle likely common mistake.
|
||||
(use-package-error ":delight mode line constructs must be quoted"))
|
||||
(cond ((and (= (length args) 1)
|
||||
(use-package-non-nil-symbolp (car args)))
|
||||
`(,(nth 0 args) nil ,name))
|
||||
((= (length args) 2)
|
||||
`(,(nth 0 args) ,(nth 1 args) ,name))
|
||||
((= (length args) 3)
|
||||
args)
|
||||
(t
|
||||
(use-package-error
|
||||
":delight expects `delight' arguments or a list of them"))))
|
||||
|
||||
;;;###autoload
|
||||
(defun use-package-normalize/:delight (name _keyword args)
|
||||
"Normalize arguments to delight."
|
||||
(cond ((null args)
|
||||
`((,(use-package-as-mode name) nil ,name)))
|
||||
((and (= (length args) 1)
|
||||
(use-package-non-nil-symbolp (car args)))
|
||||
`((,(car args) nil ,name)))
|
||||
((and (= (length args) 1)
|
||||
(stringp (car args)))
|
||||
`((,(use-package-as-mode name) ,(car args) ,name)))
|
||||
((and (= (length args) 1)
|
||||
(listp (car args))
|
||||
(eq 'quote (caar args)))
|
||||
`((,(use-package-as-mode name) ,@(cdar args) ,name)))
|
||||
((and (= (length args) 2)
|
||||
(listp (nth 1 args))
|
||||
(eq 'quote (car (nth 1 args))))
|
||||
`((,(car args) ,@(cdr (nth 1 args)) ,name)))
|
||||
(t (mapcar
|
||||
(apply-partially #'use-package-normalize-delight name)
|
||||
(if (use-package-non-nil-symbolp (car args))
|
||||
(list args)
|
||||
args)))))
|
||||
|
||||
;;;###autoload
|
||||
(defun use-package-handler/:delight (name _keyword args rest state)
|
||||
(let ((body (use-package-process-keywords name rest state)))
|
||||
(use-package-concat
|
||||
body
|
||||
`((if (fboundp 'delight)
|
||||
(delight '(,@args)))))))
|
||||
|
||||
(add-to-list 'use-package-keywords :delight t)
|
||||
|
||||
(provide 'use-package-delight)
|
||||
|
||||
;;; use-package-delight.el ends here
|
|
@ -1,80 +0,0 @@
|
|||
;;; use-package-diminish.el --- Support for the :diminish keyword -*- lexical-binding: t; -*-
|
||||
|
||||
;; Copyright (C) 2012-2017 John Wiegley
|
||||
|
||||
;; Author: John Wiegley <johnw@newartisans.com>
|
||||
;; Maintainer: John Wiegley <johnw@newartisans.com>
|
||||
;; Created: 17 Jun 2012
|
||||
;; Modified: 3 Dec 2017
|
||||
;; Version: 1.0
|
||||
;; Package-Requires: ((emacs "24.3") (use-package "2.4"))
|
||||
;; Keywords: dotemacs startup speed config package
|
||||
;; URL: https://github.com/jwiegley/use-package
|
||||
|
||||
;; 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, 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 GNU Emacs; see the file COPYING. If not, write to the
|
||||
;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||
;; Boston, MA 02111-1307, USA.
|
||||
|
||||
;;; Commentary:
|
||||
|
||||
;; Provides support for the :diminish keyword, which is made available by
|
||||
;; default by requiring `use-package'.
|
||||
|
||||
;;; Code:
|
||||
|
||||
(require 'use-package-core)
|
||||
|
||||
(defun use-package-normalize-diminish (name label arg &optional recursed)
|
||||
"Normalize the arguments to diminish down to a list of one of two forms:
|
||||
SYMBOL
|
||||
(SYMBOL . STRING)"
|
||||
(cond
|
||||
((not arg)
|
||||
(list (use-package-as-mode name)))
|
||||
((use-package-non-nil-symbolp arg)
|
||||
(list arg))
|
||||
((stringp arg)
|
||||
(list (cons (use-package-as-mode name) arg)))
|
||||
((and (consp arg) (stringp (cdr arg)))
|
||||
(list arg))
|
||||
((and (not recursed) (listp arg) (listp (cdr arg)))
|
||||
(mapcar #'(lambda (x) (car (use-package-normalize-diminish
|
||||
name label x t))) arg))
|
||||
(t
|
||||
(use-package-error
|
||||
(concat label " wants a string, symbol, "
|
||||
"(symbol . string) or list of these")))))
|
||||
|
||||
;;;###autoload
|
||||
(defun use-package-normalize/:diminish (name keyword args)
|
||||
(use-package-as-one (symbol-name keyword) args
|
||||
(apply-partially #'use-package-normalize-diminish name) t))
|
||||
|
||||
;;;###autoload
|
||||
(defun use-package-handler/:diminish (name _keyword arg rest state)
|
||||
(let ((body (use-package-process-keywords name rest state)))
|
||||
(use-package-concat
|
||||
(mapcar #'(lambda (var)
|
||||
`(if (fboundp 'diminish)
|
||||
,(if (consp var)
|
||||
`(diminish ',(car var) ,(cdr var))
|
||||
`(diminish ',var))))
|
||||
arg)
|
||||
body)))
|
||||
|
||||
(add-to-list 'use-package-keywords :diminish t)
|
||||
|
||||
(provide 'use-package-diminish)
|
||||
|
||||
;;; use-package-diminish.el ends here
|
|
@ -1,214 +0,0 @@
|
|||
;;; use-package-ensure.el --- Support for the :ensure and :pin keywords -*- lexical-binding: t; -*-
|
||||
|
||||
;; Copyright (C) 2012-2017 John Wiegley
|
||||
|
||||
;; Author: John Wiegley <johnw@newartisans.com>
|
||||
;; Maintainer: John Wiegley <johnw@newartisans.com>
|
||||
;; Created: 17 Jun 2012
|
||||
;; Modified: 3 Dec 2017
|
||||
;; Version: 1.0
|
||||
;; Package-Requires: ((emacs "24.3") (use-package "2.4"))
|
||||
;; Keywords: dotemacs startup speed config package
|
||||
;; URL: https://github.com/jwiegley/use-package
|
||||
|
||||
;; 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, 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 GNU Emacs; see the file COPYING. If not, write to the
|
||||
;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||
;; Boston, MA 02111-1307, USA.
|
||||
|
||||
;;; Commentary:
|
||||
|
||||
;; Provides support for the :ensure and :pin keywords, which is made available
|
||||
;; by default by requiring `use-package'.
|
||||
|
||||
;;; Code:
|
||||
|
||||
(require 'cl-lib)
|
||||
(require 'use-package-core)
|
||||
|
||||
(defgroup use-package-ensure nil
|
||||
"Support for :ensure and :pin keywords in use-package declarations."
|
||||
:group 'use-package)
|
||||
|
||||
(eval-when-compile
|
||||
(declare-function package-installed-p "package")
|
||||
(declare-function package-read-all-archive-contents "package" ()))
|
||||
|
||||
(defcustom use-package-always-ensure nil
|
||||
"Treat every package as though it had specified using `:ensure SEXP'.
|
||||
See also `use-package-defaults', which uses this value."
|
||||
:type 'sexp
|
||||
:group 'use-package-ensure)
|
||||
|
||||
(defcustom use-package-always-pin nil
|
||||
"Treat every package as though it had specified using `:pin SYM'.
|
||||
See also `use-package-defaults', which uses this value."
|
||||
:type 'symbol
|
||||
:group 'use-package-ensure)
|
||||
|
||||
(defcustom use-package-ensure-function 'use-package-ensure-elpa
|
||||
"Function that ensures a package is installed.
|
||||
This function is called with three arguments: the name of the
|
||||
package declared in the `use-package' form; the arguments passed
|
||||
to all `:ensure' keywords (always a list, even if only one); and
|
||||
the current `state' plist created by previous handlers.
|
||||
|
||||
Note that this function is called whenever `:ensure' is provided,
|
||||
even if it is nil. It is up to the function to decide on the
|
||||
semantics of the various values for `:ensure'.
|
||||
|
||||
This function should return non-nil if the package is installed.
|
||||
|
||||
The default value uses package.el to install the package."
|
||||
:type '(choice (const :tag "package.el" use-package-ensure-elpa)
|
||||
(function :tag "Custom"))
|
||||
:group 'use-package-ensure)
|
||||
|
||||
;;;; :pin
|
||||
|
||||
(defun use-package-normalize/:pin (_name keyword args)
|
||||
(use-package-only-one (symbol-name keyword) args
|
||||
#'(lambda (_label arg)
|
||||
(cond
|
||||
((stringp arg) arg)
|
||||
((use-package-non-nil-symbolp arg) (symbol-name arg))
|
||||
(t
|
||||
(use-package-error
|
||||
":pin wants an archive name (a string)"))))))
|
||||
|
||||
(eval-when-compile
|
||||
(defvar package-pinned-packages)
|
||||
(defvar package-archives))
|
||||
|
||||
(defun use-package-archive-exists-p (archive)
|
||||
"Check if a given ARCHIVE is enabled.
|
||||
|
||||
ARCHIVE can be a string or a symbol or 'manual to indicate a
|
||||
manually updated package."
|
||||
(if (member archive '(manual "manual"))
|
||||
't
|
||||
(let ((valid nil))
|
||||
(dolist (pa package-archives)
|
||||
(when (member archive (list (car pa) (intern (car pa))))
|
||||
(setq valid 't)))
|
||||
valid)))
|
||||
|
||||
(defun use-package-pin-package (package archive)
|
||||
"Pin PACKAGE to ARCHIVE."
|
||||
(unless (boundp 'package-pinned-packages)
|
||||
(setq package-pinned-packages ()))
|
||||
(let ((archive-symbol (if (symbolp archive) archive (intern archive)))
|
||||
(archive-name (if (stringp archive) archive (symbol-name archive))))
|
||||
(if (use-package-archive-exists-p archive-symbol)
|
||||
(add-to-list 'package-pinned-packages (cons package archive-name))
|
||||
(error "Archive '%s' requested for package '%s' is not available."
|
||||
archive-name package))
|
||||
(unless (bound-and-true-p package--initialized)
|
||||
(package-initialize t))))
|
||||
|
||||
(defun use-package-handler/:pin (name _keyword archive-name rest state)
|
||||
(let ((body (use-package-process-keywords name rest state))
|
||||
(pin-form (if archive-name
|
||||
`(use-package-pin-package ',(use-package-as-symbol name)
|
||||
,archive-name))))
|
||||
;; Pinning should occur just before ensuring
|
||||
;; See `use-package-handler/:ensure'.
|
||||
(if (bound-and-true-p byte-compile-current-file)
|
||||
(eval pin-form) ; Eval when byte-compiling,
|
||||
(push pin-form body)) ; or else wait until runtime.
|
||||
body))
|
||||
|
||||
;;;; :ensure
|
||||
|
||||
(defvar package-archive-contents)
|
||||
|
||||
;;;###autoload
|
||||
(defun use-package-normalize/:ensure (_name keyword args)
|
||||
(if (null args)
|
||||
(list t)
|
||||
(use-package-only-one (symbol-name keyword) args
|
||||
#'(lambda (_label arg)
|
||||
(cond
|
||||
((symbolp arg)
|
||||
(list arg))
|
||||
((and (listp arg) (= 3 (length arg))
|
||||
(symbolp (nth 0 arg))
|
||||
(eq :pin (nth 1 arg))
|
||||
(or (stringp (nth 2 arg))
|
||||
(symbolp (nth 2 arg))))
|
||||
(list (cons (nth 0 arg) (nth 2 arg))))
|
||||
(t
|
||||
(use-package-error
|
||||
(concat ":ensure wants an optional package name "
|
||||
"(an unquoted symbol name), or (<symbol> :pin <string>)"))))))))
|
||||
|
||||
(defun use-package-ensure-elpa (name args _state &optional _no-refresh)
|
||||
(dolist (ensure args)
|
||||
(let ((package
|
||||
(or (and (eq ensure t) (use-package-as-symbol name))
|
||||
ensure)))
|
||||
(when package
|
||||
(require 'package)
|
||||
(when (consp package)
|
||||
(use-package-pin-package (car package) (cdr package))
|
||||
(setq package (car package)))
|
||||
(unless (package-installed-p package)
|
||||
(condition-case-unless-debug err
|
||||
(progn
|
||||
(when (assoc package (bound-and-true-p
|
||||
package-pinned-packages))
|
||||
(package-read-all-archive-contents))
|
||||
(if (assoc package package-archive-contents)
|
||||
(package-install package)
|
||||
(package-refresh-contents)
|
||||
(when (assoc package (bound-and-true-p
|
||||
package-pinned-packages))
|
||||
(package-read-all-archive-contents))
|
||||
(package-install package))
|
||||
t)
|
||||
(error
|
||||
(display-warning 'use-package
|
||||
(format "Failed to install %s: %s"
|
||||
name (error-message-string err))
|
||||
:error))))))))
|
||||
|
||||
;;;###autoload
|
||||
(defun use-package-handler/:ensure (name _keyword ensure rest state)
|
||||
(let* ((body (use-package-process-keywords name rest state)))
|
||||
;; We want to avoid installing packages when the `use-package' macro is
|
||||
;; being macro-expanded by elisp completion (see `lisp--local-variables'),
|
||||
;; but still install packages when byte-compiling, to avoid requiring
|
||||
;; `package' at runtime.
|
||||
(if (bound-and-true-p byte-compile-current-file)
|
||||
;; Eval when byte-compiling,
|
||||
(funcall use-package-ensure-function name ensure state)
|
||||
;; or else wait until runtime.
|
||||
(push `(,use-package-ensure-function ',name ',ensure ',state)
|
||||
body))
|
||||
body))
|
||||
|
||||
(add-to-list 'use-package-defaults
|
||||
'(:ensure (list use-package-always-ensure)
|
||||
(lambda (name args)
|
||||
(and use-package-always-ensure
|
||||
(not (plist-member args :load-path))))) t)
|
||||
|
||||
(add-to-list 'use-package-defaults
|
||||
'(:pin use-package-always-pin use-package-always-pin) t)
|
||||
|
||||
(add-to-list 'use-package-keywords :ensure)
|
||||
(add-to-list 'use-package-keywords :pin)
|
||||
|
||||
(provide 'use-package-ensure)
|
||||
|
||||
;;; use-package-ensure.el ends here
|
|
@ -1,79 +0,0 @@
|
|||
;;; use-package-jump.el --- Attempt to jump to a use-package declaration -*- lexical-binding: t; -*-
|
||||
|
||||
;; Copyright (C) 2012-2017 John Wiegley
|
||||
|
||||
;; Author: John Wiegley <johnw@newartisans.com>
|
||||
;; Maintainer: John Wiegley <johnw@newartisans.com>
|
||||
;; Created: 17 Jun 2012
|
||||
;; Modified: 3 Dec 2017
|
||||
;; Version: 1.0
|
||||
;; Package-Requires: ((emacs "24.3") (use-package "2.4"))
|
||||
;; Keywords: dotemacs startup speed config package
|
||||
;; URL: https://github.com/jwiegley/use-package
|
||||
|
||||
;; 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, 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 GNU Emacs; see the file COPYING. If not, write to the
|
||||
;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||
;; Boston, MA 02111-1307, USA.
|
||||
|
||||
;;; Commentary:
|
||||
|
||||
;; Provides the command `M-x use-package-jump-to-package-form', however it
|
||||
;; only works if the package being jumped to was required during
|
||||
;; initialization. If it was delay-loaded, it will not work. Improvements are
|
||||
;; needed.
|
||||
|
||||
;;; Code:
|
||||
|
||||
(require 'use-package-core)
|
||||
|
||||
(defun use-package-find-require (package)
|
||||
"Find file that required PACKAGE by searching `load-history'.
|
||||
Returns an absolute file path or nil if none is found."
|
||||
(catch 'suspect
|
||||
(dolist (filespec load-history)
|
||||
(dolist (entry (cdr filespec))
|
||||
(when (equal entry (cons 'require package))
|
||||
(throw 'suspect (car filespec)))))))
|
||||
|
||||
;;;###autoload
|
||||
(defun use-package-jump-to-package-form (package)
|
||||
"Attempt to find and jump to the `use-package' form that loaded
|
||||
PACKAGE. This will only find the form if that form actually
|
||||
required PACKAGE. If PACKAGE was previously required then this
|
||||
function will jump to the file that originally required PACKAGE
|
||||
instead."
|
||||
(interactive (list (completing-read "Package: " features)))
|
||||
(let* ((package (if (stringp package) (intern package) package))
|
||||
(requiring-file (use-package-find-require package))
|
||||
file location)
|
||||
(if (null requiring-file)
|
||||
(user-error "Can't find file requiring file; may have been autoloaded")
|
||||
(setq file (if (string= (file-name-extension requiring-file) "elc")
|
||||
(concat (file-name-sans-extension requiring-file) ".el")
|
||||
requiring-file))
|
||||
(when (file-exists-p file)
|
||||
(find-file-other-window file)
|
||||
(save-excursion
|
||||
(goto-char (point-min))
|
||||
(setq location
|
||||
(re-search-forward
|
||||
(format (eval use-package-form-regexp-eval) package) nil t)))
|
||||
(if (null location)
|
||||
(message "No use-package form found.")
|
||||
(goto-char location)
|
||||
(beginning-of-line))))))
|
||||
|
||||
(provide 'use-package-jump)
|
||||
|
||||
;;; use-package-jump.el ends here
|
|
@ -1,84 +0,0 @@
|
|||
;;; use-package-lint.el --- Attempt to find errors in use-package declarations -*- lexical-binding: t; -*-
|
||||
|
||||
;; Copyright (C) 2012-2017 John Wiegley
|
||||
|
||||
;; Author: John Wiegley <johnw@newartisans.com>
|
||||
;; Maintainer: John Wiegley <johnw@newartisans.com>
|
||||
;; Created: 17 Jun 2012
|
||||
;; Modified: 3 Dec 2017
|
||||
;; Version: 1.0
|
||||
;; Package-Requires: ((emacs "24.3") (use-package "2.4"))
|
||||
;; Keywords: dotemacs startup speed config package
|
||||
;; URL: https://github.com/jwiegley/use-package
|
||||
|
||||
;; 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, 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 GNU Emacs; see the file COPYING. If not, write to the
|
||||
;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||
;; Boston, MA 02111-1307, USA.
|
||||
|
||||
;;; Commentary:
|
||||
|
||||
;; Provides the command `M-x use-package-lint'.
|
||||
|
||||
;;; Code:
|
||||
|
||||
(require 'cl-lib)
|
||||
(require 'use-package-core)
|
||||
|
||||
(defun use-package-lint-declaration (name plist)
|
||||
(dolist (path (plist-get plist :load-path))
|
||||
(unless (file-exists-p path)
|
||||
(display-warning
|
||||
'use-package
|
||||
(format "%s :load-path does not exist: %s"
|
||||
name path) :error)))
|
||||
|
||||
(unless (or (plist-member plist :disabled)
|
||||
(plist-get plist :no-require)
|
||||
(locate-library (use-package-as-string name) nil
|
||||
(plist-get plist :load-path)))
|
||||
(display-warning
|
||||
'use-package
|
||||
(format "%s module cannot be located" name) :error))
|
||||
|
||||
;; (dolist (command (plist-get plist :commands))
|
||||
;; (unless (string= (find-lisp-object-file-name command nil)
|
||||
;; (locate-library (use-package-as-string name) nil
|
||||
;; (plist-get plist :load-path)))
|
||||
;; (display-warning
|
||||
;; 'use-package
|
||||
;; (format "%s :command is from different path: %s"
|
||||
;; name (symbol-name command)) :error)))
|
||||
)
|
||||
|
||||
;;;###autoload
|
||||
(defun use-package-lint ()
|
||||
"Check for errors in use-package declarations.
|
||||
For example, if the module's `:if' condition is met, but even
|
||||
with the specified `:load-path' the module cannot be found."
|
||||
(interactive)
|
||||
(save-excursion
|
||||
(goto-char (point-min))
|
||||
(let ((re (eval use-package-form-regexp-eval)))
|
||||
(while (re-search-forward re nil t)
|
||||
(goto-char (match-beginning 0))
|
||||
(let ((decl (read (current-buffer))))
|
||||
(when (eq (car decl) 'use-package)
|
||||
(use-package-lint-declaration
|
||||
(use-package-as-string (cadr decl))
|
||||
(use-package-normalize-keywords
|
||||
(cadr decl) (cddr decl)))))))))
|
||||
|
||||
(provide 'use-package-lint)
|
||||
|
||||
;;; use-package-lint.el ends here
|
|
@ -1,13 +0,0 @@
|
|||
(define-package "use-package" "20190716.1829" "A configuration macro for simplifying your .emacs"
|
||||
'((emacs "24.3")
|
||||
(bind-key "2.4"))
|
||||
:keywords
|
||||
'("dotemacs" "startup" "speed" "config" "package")
|
||||
:authors
|
||||
'(("John Wiegley" . "johnw@newartisans.com"))
|
||||
:maintainer
|
||||
'("John Wiegley" . "johnw@newartisans.com")
|
||||
:url "https://github.com/jwiegley/use-package")
|
||||
;; Local Variables:
|
||||
;; no-byte-compile: t
|
||||
;; End:
|
|
@ -1,54 +0,0 @@
|
|||
;;; use-package.el --- A configuration macro for simplifying your .emacs -*- lexical-binding: t; -*-
|
||||
|
||||
;; Copyright (C) 2012-2017 John Wiegley
|
||||
|
||||
;; Author: John Wiegley <johnw@newartisans.com>
|
||||
;; Maintainer: John Wiegley <johnw@newartisans.com>
|
||||
;; Created: 17 Jun 2012
|
||||
;; Modified: 29 Nov 2017
|
||||
;; Version: 2.4
|
||||
;; Package-Requires: ((emacs "24.3") (bind-key "2.4"))
|
||||
;; Keywords: dotemacs startup speed config package
|
||||
;; URL: https://github.com/jwiegley/use-package
|
||||
|
||||
;; 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, 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 GNU Emacs; see the file COPYING. If not, write to the
|
||||
;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||
;; Boston, MA 02111-1307, USA.
|
||||
|
||||
;;; Commentary:
|
||||
|
||||
;; The `use-package' declaration macro allows you to isolate package
|
||||
;; configuration in your ".emacs" in a way that is performance-oriented and,
|
||||
;; well, just tidy. I created it because I have over 80 packages that I use
|
||||
;; in Emacs, and things were getting difficult to manage. Yet with this
|
||||
;; utility my total load time is just under 1 second, with no loss of
|
||||
;; functionality!
|
||||
;;
|
||||
;; Please see README.md from the same repository for documentation.
|
||||
|
||||
;;; Code:
|
||||
|
||||
(require 'use-package-core)
|
||||
|
||||
(require 'use-package-bind-key)
|
||||
(require 'use-package-diminish)
|
||||
(require 'use-package-delight)
|
||||
(require 'use-package-ensure)
|
||||
|
||||
(declare-function use-package-jump-to-package-form "use-package-jump")
|
||||
(autoload #'use-package-jump-to-package-form "use-package-jump" nil t)
|
||||
|
||||
(provide 'use-package)
|
||||
|
||||
;;; use-package.el ends here
|
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue