branch: elpa/multiple-cursors
commit 980a8808ddfc4e48def0cab76782a909a3456029
Merge: ed18fa4 1cdd730
Author: Magnar Sveen <[email protected]>
Commit: Magnar Sveen <[email protected]>
Merge pull request #63 from tkf/select-thing-at-point
Automatically select word/symbol
---
features/mark-things.feature | 137 +++++++++++++++++++++
.../step-definitions/multiple-cursors-steps.el | 8 ++
mc-mark-more.el | 15 +++
3 files changed, 160 insertions(+)
diff --git a/features/mark-things.feature b/features/mark-things.feature
new file mode 100644
index 0000000..c99c24f
--- /dev/null
+++ b/features/mark-things.feature
@@ -0,0 +1,137 @@
+Feature: Mark things
+
+ Scenario: Mark all symbols like this with select
+ Given I turn on emacs-lisp-mode
+ And I turn on delete-selection-mode
+ And I insert:
+ """
+ (defun abc (ghi) (message ghi))
+ (defun def (ghi) (message some-other-ghi))
+ """
+ When I select "ghi"
+ And I mark all symbols like this
+ And I type "hmm"
+ Then I should see:
+ """
+ (defun abc (hmm) (message hmm))
+ (defun def (hmm) (message some-other-ghi))
+ """
+
+ Scenario: Mark all words like this with select
+ Given I turn on emacs-lisp-mode
+ And I turn on delete-selection-mode
+ And I insert:
+ """
+ (defun abc (ghi) (message ghi))
+ (defun def (ghi) (message some-other-ghi))
+ """
+ When I select "ghi"
+ And I mark all words like this
+ And I type "hmm"
+ Then I should see:
+ """
+ (defun abc (hmm) (message hmm))
+ (defun def (hmm) (message some-other-hmm))
+ """
+
+ Scenario: Mark all symbols like this in defun with select
+ Given I turn on emacs-lisp-mode
+ And I turn on delete-selection-mode
+ And I insert:
+ """
+ (defun abc (ghi) (message ghi))
+ (defun def (ghi) (message some-other-ghi))
+ """
+ When I select "ghi"
+ And I mark all symbols like this in defun
+ And I type "hmm"
+ Then I should see:
+ """
+ (defun abc (hmm) (message hmm))
+ (defun def (ghi) (message some-other-ghi))
+ """
+
+ Scenario: Mark all words like this in defun with select
+ Given I turn on emacs-lisp-mode
+ And I turn on delete-selection-mode
+ And I insert:
+ """
+ (defun abc (ghi) (message ghi))
+ (defun def (ghi) (message some-other-ghi))
+ """
+ When I select "ghi"
+ And I mark all words like this in defun
+ And I type "hmm"
+ Then I should see:
+ """
+ (defun abc (hmm) (message hmm))
+ (defun def (ghi) (message some-other-ghi))
+ """
+
+ Scenario: Mark all symbols like this with no select
+ Given I turn on emacs-lisp-mode
+ And I turn on delete-selection-mode
+ And I insert:
+ """
+ (defun abc (ghi) (message ghi))
+ (defun def (ghi) (message some-other-ghi))
+ """
+ When I go to word "ghi"
+ And I mark all symbols like this
+ And I type "hmm"
+ Then I should see:
+ """
+ (defun abc (hmm) (message hmm))
+ (defun def (hmm) (message some-other-ghi))
+ """
+
+ Scenario: Mark all words like this with no select
+ Given I turn on emacs-lisp-mode
+ And I turn on delete-selection-mode
+ And I insert:
+ """
+ (defun abc (ghi) (message ghi))
+ (defun def (ghi) (message some-other-ghi))
+ """
+ When I go to word "ghi"
+ And I mark all words like this
+ And I type "hmm"
+ Then I should see:
+ """
+ (defun abc (hmm) (message hmm))
+ (defun def (hmm) (message some-other-hmm))
+ """
+
+ Scenario: Mark all symbols like this in defun with no select
+ Given I turn on emacs-lisp-mode
+ And I turn on delete-selection-mode
+ And I insert:
+ """
+ (defun abc (ghi) (message ghi))
+ (defun def (ghi) (message some-other-ghi))
+ """
+ When I go to word "ghi"
+ And I mark all symbols like this in defun
+ And I type "hmm"
+ Then I should see:
+ """
+ (defun abc (hmm) (message hmm))
+ (defun def (ghi) (message some-other-ghi))
+ """
+
+ Scenario: Mark all words like this in defun with no select
+ Given I turn on emacs-lisp-mode
+ And I turn on delete-selection-mode
+ And I insert:
+ """
+ (defun abc (ghi) (message ghi))
+ (defun def (ghi) (message some-other-ghi))
+ """
+ When I go to word "ghi"
+ And I mark all words like this in defun
+ And I type "hmm"
+ Then I should see:
+ """
+ (defun abc (hmm) (message hmm))
+ (defun def (ghi) (message some-other-ghi))
+ """
diff --git a/features/step-definitions/multiple-cursors-steps.el
b/features/step-definitions/multiple-cursors-steps.el
index 900eeed..ba25181 100644
--- a/features/step-definitions/multiple-cursors-steps.el
+++ b/features/step-definitions/multiple-cursors-steps.el
@@ -95,3 +95,11 @@
(assert search nil "The text '%s' was not found in the current
buffer." text))
(set-mark (point))
(re-search-forward text)))
+
+(When "^I mark all \\(.+\\)$"
+ (lambda (rest)
+ (let ((func (intern (mapconcat 'identity
+ (cons "mc/mark-all"
+ (split-string rest))
+ "-"))))
+ (call-interactively func))))
diff --git a/mc-mark-more.el b/mc-mark-more.el
index ca239e0..eba7bed 100644
--- a/mc-mark-more.el
+++ b/mc-mark-more.el
@@ -225,15 +225,28 @@ With zero ARG, skip the last one and mark next."
(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)))
@@ -355,6 +368,7 @@ With prefix, it behaves the same as original
`mc/mark-all-like-this'"
(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)
@@ -366,6 +380,7 @@ With prefix, it behaves the same as original
`mc/mark-all-like-this'"
(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)