     cursorWord = @editor.getTextInBufferRange(bufferRange)
     {pattern: ///\b#{_.escapeRegExp(cursorWord)}\b///g, bufferRange}
 
-# -------------------------
+# Select
 # When text-object is invoked from normal or viusal-mode, operation would be
 #  => Select operator with target=text-object
 # When motion is invoked from visual-mode, operation would be
 #  => Select operator with target=motion)
+# ================================
 class Select extends Operator
   @extend(false)
   flashTarget: false
   recordable: false
+
+  canChangeMode: ->
+    if @isMode('visual')
+      @isWithOccurrence() or @target.isAllowSubmodeChange?()
+    else
+      true
+
   execute: ->
     @selectTarget()
-    if @isWithOccurrence()
-      @updateSelectionProperties()
+    if canChangeMode()
       submode = swrap.detectVisualModeSubmode(@editor)
       @activateModeIfNecessary('visual', submode)
-    else
-      if @isMode('visual') and (not @target.isAllowSubmodeChange?())
-        return
-      else
-        submode = swrap.detectVisualModeSubmode(@editor)
-        @activateModeIfNecessary('visual', submode)
 
 class SelectLatestChange extends Select
   @extend()
   @description: "Select latest yanked or changed range"
   target: 'ALatestChange'
 
+# [FIXME] should be child of select with target=PrevoiusSelection
 class SelectPreviousSelection extends Operator
   @extend()
   requireTarget: false

    @editor.scrollToScreenRange(selection.getScreenRange(), {center: true})
    @activateMode('visual', submode)

# -------------------------
class Delete extends Operator
  @extend()
  hover: icon: ':delete:', emoji: ':scissors:'

    selection.toggleLineComments()
    @restorePoint(selection)

# Surround
# -------------------------
class Surround extends TransformString
  @extend()
