branch: elpa/multiple-cursors
commit 608ceb4b81c8eff3f9bb6d3c5389b6ae7bdafff2
Author: Magnar Sveen <[email protected]>
Commit: Magnar Sveen <[email protected]>
Disable multiple-cursors-mode if there's only one cursor (the real one).
---
.../step-definitions/multiple-cursors-steps.el | 8 +-
multiple-cursors-core.el | 226 ++++++++++++---------
2 files changed, 131 insertions(+), 103 deletions(-)
diff --git a/features/step-definitions/multiple-cursors-steps.el
b/features/step-definitions/multiple-cursors-steps.el
index 465cfbc..990f19a 100644
--- a/features/step-definitions/multiple-cursors-steps.el
+++ b/features/step-definitions/multiple-cursors-steps.el
@@ -2,13 +2,9 @@
(lambda ()
(delete-selection-mode 1)))
-(defun num-cursors ()
- (1+ (count-if 'mc/fake-cursor-p
- (overlays-in (point-min) (point-max)))))
-
(Then "^I should have \\([0-9]+\\) cursors$"
(lambda (num)
- (let ((actual (num-cursors)))
+ (let ((actual (mc/num-cursors)))
(assert (eq (string-to-number num) actual) nil
"Expected to have %s cursors, but was %d." num actual))))
@@ -16,7 +12,7 @@
(lambda ()
(assert (not multiple-cursors-mode) nil
"Expected to have one cursor, but multiple-cursors-mode is
still active.")
- (assert (eq 1 (num-cursors)) nil
+ (assert (eq 1 (mc/num-cursors)) nil
"Expected to have one cursor, but there are still fake cursor
overlays.")))
(When "^I press \"\\(.+\\)\"$"
diff --git a/multiple-cursors-core.el b/multiple-cursors-core.el
index ec26d66..25883d3 100644
--- a/multiple-cursors-core.el
+++ b/multiple-cursors-core.el
@@ -178,10 +178,15 @@ cursor with updated info."
(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."
(if (y-or-n-p (format "Do %S for all cursors?" original-command))
- (add-to-list 'mc--cmds-to-run-for-all original-command)
- (add-to-list 'mc--cmds-to-run-once original-command)
+ (add-to-list 'mc--default-cmds-to-run-for-all original-command)
+ (add-to-list 'mc--default-cmds-to-run-once original-command)
nil))
+(defun mc/num-cursors ()
+ "The number of cursors (real and fake) in the buffer."
+ (1+ (count-if 'mc/fake-cursor-p
+ (overlays-in (point-min) (point-max)))))
+
(defun mc/execute-this-command-for-all-cursors ()
"Used with post-command-hook to execute supported commands for
all cursors. It also checks a list of explicitly unsupported
@@ -191,24 +196,26 @@ inform about the lack of support.
Commands that are neither supported nor explicitly unsupported
is executed normally for point, but skipped for the fake
cursors."
- (let ((original-command (or (command-remapping this-original-command)
- this-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 (not (symbolp original-command))
- (mc/execute-command-for-all-fake-cursors 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))
- (when (and original-command
- (not (memq original-command mc--cmds-to-run-once))
- (or (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))))))
+ (if (eq 1 (mc/num-cursors)) ;; no fake cursors? disable mc-mode
+ (multiple-cursors-mode 0)
+ (let ((original-command (or (command-remapping this-original-command)
+ this-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 (not (symbolp original-command))
+ (mc/execute-command-for-all-fake-cursors 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))
+ (when (and original-command
+ (not (memq original-command mc--default-cmds-to-run-once))
+ (or (memq original-command
mc--default-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.
@@ -284,82 +291,107 @@ from being executed if in multiple-cursors-mode."
(overlay-put cursor 'kill-ring-yank-pointer
kill-ring-yank-pointer)))))))
;;----------------------------------------------------------------------------------------
-;; Commands to run only once (don't need to message about skipping it)
-(setq mc--cmds-to-run-once '(mark-next-like-this
- save-buffer
- undo
- undo-tree-undo
- undo-tree-redo
- universal-argument
- universal-argument-other-key
- mc/switch-from-mark-multiple-to-cursors
- mc/edit-lines
- mc/edit-ends-of-lines
- mc/edit-beginnings-of-lines))
-
-;; Commands that should be mirrored by all cursors
-(setq mc--cmds-to-run-for-all '(mc/keyboard-quit
- self-insert-command
- js2-insert-and-indent
- wrap-region-trigger
- sgml-slash
- slime-space
- previous-line
- next-line
- newline
- yas/expand
- newline-and-indent
- join-line
- right-char forward-char
- right-word forward-word
- left-char backward-char
- left-word backward-word
- upcase-word
- downcase-word
- capitalize-word
- forward-list
- backward-list
- hippie-expand hippie-expand-lines
- yank yank-indented yank-pop
- kill-word
- kill-region-or-backward-word
- kill-line
- kill-whole-line
- subword-forward
- subword-backward
- subword-mark
- subword-kill
- subword-backward-kill
- subword-transpose
- subword-capitalize
- subword-upcase
- subword-downcase
- backward-kill-word
- backward-delete-char-untabify
- delete-char delete-forward-char c-electric-delete-forward
- delete-backward-char c-electric-backspace
- c-electric-paren
- c-electric-semi&comma
- org-shiftright
- just-one-space
- zap-to-char
- end-of-line
- set-mark-command
- js2-beginning-of-line
- js2-end-of-line
- js2r-inline-var
- change-number-at-point
- move-end-of-line
- beginning-of-line
- er/expand-region
- er/mark-word
- smart-forward
- smart-backward
- smart-up
- smart-down
- move-beginning-of-line
- dired-back-to-start-of-files
- kill-ring-save save-region-or-current-line
- back-to-indentation))
+(defvar mc--default-cmds-to-run-once '(save-buffer
+ ido-exit-minibuffer
+ undo undo-tree-undo
+ redo undo-tree-redo
+ universal-argument
+ universal-argument-other-key
+ top-level
+ mc/switch-from-mark-multiple-to-cursors
+ mc/edit-lines
+ mc/edit-ends-of-lines
+ mc/edit-beginnings-of-lines
+ mc/mark-next-like-this)
+ "Default set of commands to run only once in multiple-cursors-mode.")
+
+(defvar mc/cmds-to-run-once nil
+ "Commands to run only once in multiple-cursors-mode.")
+
+(defvar mc--default-cmds-to-run-for-all '(mc/keyboard-quit
+ self-insert-command
+ previous-line
+ next-line
+ newline
+ newline-and-indent
+ join-line
+ right-char
+ right-word
+ forward-char
+ forward-word
+ left-char
+ left-word
+ backward-char
+ backward-word
+ upcase-word
+ downcase-word
+ capitalize-word
+ forward-list
+ backward-list
+ hippie-expand
+ hippie-expand-lines
+ yank
+ yank-pop
+ kill-word
+ kill-line
+ kill-whole-line
+ backward-kill-word
+ backward-delete-char-untabify
+ delete-char delete-forward-char
+ delete-backward-char
+ just-one-space
+ zap-to-char
+ end-of-line
+ set-mark-command
+ move-end-of-line
+ beginning-of-line
+ move-beginning-of-line
+ kill-ring-save
+ back-to-indentation
+
+ ;; mode specific commands
+ org-shiftright
+ sgml-slash
+ slime-space
+ subword-forward
+ subword-backward
+ subword-mark
+ subword-kill
+ subword-backward-kill
+ subword-transpose
+ subword-capitalize
+ subword-upcase
+ subword-downcase
+ js2-beginning-of-line
+ js2-end-of-line
+ js2-insert-and-indent
+ js2r-inline-var
+ c-electric-delete-forward
+ c-electric-backspace
+ c-electric-paren
+ c-electric-semi&comma
+
+ ;; common extension commands
+ wrap-region-trigger
+ yas/expand
+
+ ;; magnars extension commands
+ er/expand-region
+ er/contract-region
+ smart-forward
+ smart-backward
+ smart-up
+ smart-down)
+ "Default set of commands that should be mirrored by all cursors")
+
+(defvar mc/cmds-to-run-for-all nil
+ "Commands to run for all cursors in multiple-cursors-mode")
+
+(setq mc/cmds-to-run-for-all '(save-region-or-current-line
+ kill-region-or-backward-word
+ change-number-at-point
+ dired-back-to-start-of-files
+ yank-indented))
+
(provide 'multiple-cursors-core)