 
 ;; ((and (eq mark orig) (< (point) mark)) (setq mark (1+ mark)))
 
-(defun emc-refresh-region (region orig)
-  "Refresh the visual REGION when point moved from ORIG to current location."
-  (let ((mark (emc-get-region-mark region)))
-    ;; (message "mark %s orig %s point %s" mark orig (point))
-    (unless mark (setq mark orig))
-    (cond ((and (<= mark orig) (< (point) mark)) (setq mark (1+ mark)))
-          ((and (< orig mark) (<= mark (point))) (setq mark (1- mark))))
+;; (emc-line-region)
+;; (evil-visual-make-region (point) (point) evil-visual-line)
+;; (evil-visual-line)
+;; (evil-visual-highlight -1)
+;; (list (point) (point-at-bol) (point-at-eol))
+
+(defun emc-line-region (&optional prev-mark prev-point)
+  "Creates a visual region line for the line at point
+optionally storing PREV-MARK and PREV-POINT."
+  (let ((start (point-at-bol))
+        (end (point-at-eol)))
+    (emc-make-region-overlay start (1+ end) 'line prev-mark prev-point)))
+
+(defun emc-refresh-char-region (orig-mark orig-point)
+  "Create a new char region based on ORIG-MARK and ORIG-POINT."
+  (let ((mark (or orig-mark orig-point)))
+    (cond ((and (<= mark orig-point) (< (point) mark)) (setq mark (1+ mark)))
+          ((and (< orig-point mark) (<= mark (point))) (setq mark (1- mark))))
     (cond ((< mark (point)) (emc-make-region-overlay mark (1+ (point))))
           ((< (point) mark) (emc-make-region-overlay mark (point)))
           (t (emc-make-region-overlay (point) (1+ (point)))))))
 
+(defun emc-refresh-line-region (orig-mark orig-point)
+  "Create a new line region based on ORIG-MARK and ORIG-POINT."
+  (let* ((mark (or orig-mark orig-point))
+         (mark-line (line-number-at-pos mark))
+         (point (point))
+         (point-line (line-number-at-pos point)))
+    (cond ((eq point-line mark-line) (emc-line-region orig-mark orig-point))
+          (t nil))))
+
+(defun emc-refresh-region (region orig-point)
+  "Refresh the visual REGION when point moved from ORIG-POINT to current location."
+  (cond
+   ((eq (emc-get-region-type region) 'line)
+    (emc-refresh-line-region (emc-get-region-mark region) orig-point))
+   (t
+    (emc-refresh-char-region (emc-get-region-mark region) orig-point))))
+
 (defun emc-exchange-point-and-mark (region)
-  "Exchange point and mark for a fake REGION."
+  "Ex)change point and mark for a fake REGION."
   (let* ((mark (emc-get-region-mark region))
          (point (emc-get-region-point region)))
     (when region

          ((eq cmd 'evil-downcase) (execute-kbd-macro keys-string))
          ((eq cmd 'keyboard-quit) nil)
          ((eq cmd 'evil-visual-char) (evil-force-normal-state))

          ((eq cmd 'evil-yank)
           (emc-with-region region

                                (evil-forward-char)
                                (evil-delete start end))
                              (execute-kbd-macro
                               (emc-change-operator-sequence keys-string)))))

          ;; TODO make this work
          ;; ((eq cmd 'evil-repeat) (evil-repeat 1))
