home · contact · privacy
Stronger match to vim char deletion and end of line behavior.
[plomvi.el] / plomvi.el
index 577e674c1812f857d1fa1f19a46452c24ebbfcee..8dd5117f6bd1907c7e7eb09c51ad11e3aa621a53 100644 (file)
--- a/plomvi.el
+++ b/plomvi.el
@@ -137,10 +137,23 @@ Note that this ignores killed rectangles."
     (yank)
     (previous-line)))
 
-(defun plomvi-region-kill()
-  "Kill marked region."
+(defun plomvi-affect-lines-of-region(f)
+  "Call f on start of first line of region and end of last line of region."
+  (let* ((start-start-pos (region-beginning))
+         (start-end-pos (region-end))
+         (region-start (progn
+                         (goto-char start-start-pos)
+                         (line-beginning-position)))
+         (region-end (progn
+                       (goto-char start-end-pos)
+                       (+ 1 (line-end-position)))))
+    (funcall f region-start region-end)
+    (goto-char region-start)))
+
+(defun plomvi-kill-region-lines()
+  "Kill lines of marked region."
   (interactive)
-  (kill-region (region-beginning) (region-end)))
+  (plomvi-affect-lines-of-region 'kill-region))
 
 (defun plomvi-x()
   "If rectangle or region marked, kill those; else, kill char after point."
@@ -149,9 +162,10 @@ Note that this ignores killed rectangles."
    ((and (boundp 'rectangle-mark-mode) (eq t rectangle-mark-mode))
     (kill-rectangle (region-beginning) (region-end)))
    ((use-region-p)
-    (plomvi-region-kill))
-   (t
-    (delete-char 1))))
+    (kill-region (region-beginning) (region-end)))
+   ((not (= (line-beginning-position) (line-end-position)))
+    (delete-char 1)
+    (if (not (= (point) (line-beginning-position))) (backward-char)))))
 
 (defun plomvi-rectangle-mark()
   "Start marked rectangle, move right one char so a single column is visible."
@@ -170,14 +184,16 @@ Note that this ignores killed rectangles."
   (interactive)
   (search-backward isearch-string))
 
-
-(defun plomvi-copy-line()
-  "Copy current line into kill buffer."
+(defun plomvi-Y()
+  "Copy rectangle, or full line, or region in full lines."
   (interactive)
-  (let ((keep_pos (point)))  ; We sort of cheat: We kill the line, then we
-    (kill-whole-line)        ; paste it back, and return point to its
-    (plomvi-paste-backward)  ; original position.
-    (goto-char keep_pos)))   ;
+  (cond
+   ((and (boundp 'rectangle-mark-mode) (eq t rectangle-mark-mode))
+    (copy-rectangle-as-kill (region-beginning) (region-end)))
+   ((use-region-p)
+    (plomvi-affect-lines-of-region 'copy-region-as-kill))
+   (t
+    (copy-region-as-kill (line-beginning-position) (+ 1 (line-end-position))))))
 
 (defun plomvi-copy-region()
   "Copy marked region."
@@ -204,6 +220,12 @@ Note that this ignores killed rectangles."
   (interactive)
   (plomvi-mode -1))
 
+(defun plomvi-end-of-line()
+  "Move to end of line exclusive line break char."
+  (interactive)
+  (end-of-line)
+  (if (not (= (point) (line-beginning-position))) (backward-char)))
+
 (defvar plomvi-mode-basic-map (make-sparse-keymap)
   "Keymap for `plomvi-mode' on read-only buffers.
 
@@ -228,7 +250,7 @@ become available to be used for other purposes.")
 (define-key plomvi-mode-basic-map (kbd "g") 'plomvi-g-map)
 (define-key plomvi-g-map (kbd "g") 'beginning-of-buffer)
 (define-key plomvi-mode-basic-map (kbd "G") 'plomvi-goto-line)
-(define-key plomvi-mode-basic-map (kbd "$") 'end-of-line)
+(define-key plomvi-mode-basic-map (kbd "$") 'plomvi-end-of-line)
 (define-key plomvi-mode-basic-map (kbd "0") 'plomvi-prefix-zero-or-line-start)
 (define-key plomvi-mode-basic-map (kbd "1") 'digit-argument)
 (define-key plomvi-mode-basic-map (kbd "2") 'digit-argument)
@@ -259,9 +281,9 @@ text editing.")
 (define-key plomvi-mode-editable-map (kbd "I") 'string-insert-rectangle)
 (define-key plomvi-mode-editable-map (kbd "p") 'plomvi-paste-forward)
 (define-key plomvi-mode-editable-map (kbd "P") 'plomvi-paste-backward)
-(define-key plomvi-mode-editable-map (kbd "Y") 'plomvi-copy-line)
+(define-key plomvi-mode-editable-map (kbd "Y") 'plomvi-Y)
 (define-key plomvi-mode-editable-map (kbd "y") 'plomvi-copy-region)
-(define-key plomvi-mode-editable-map (kbd "D") 'plomvi-region-kill)
+(define-key plomvi-mode-editable-map (kbd "D") 'plomvi-kill-region-lines)
 (define-prefix-command 'plomvi-d-map)
 (define-key plomvi-mode-editable-map (kbd "d") 'plomvi-d-map)
 (define-key plomvi-d-map (kbd "w") 'kill-word)