home · contact · privacy
Emulate Vim's Y more fully.
[plomvi.el] / plomvi.el
index 4d1b9e3cfa5db15a21b6abffd7ea06a165e8529e..34524fd35b0359fa5043df3a120e31005b2b7b0d 100644 (file)
--- a/plomvi.el
+++ b/plomvi.el
 
 
 
-(defun plomvi-nothing()
-  "Do nothing. Used to shadow self-insert bindings in `plomvi-mode-editable-map'."
-  (interactive))
-
 (defun plomvi-half-scroll()
   "Scroll down half a screen width."
   (interactive)
@@ -174,14 +170,31 @@ 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)
+    (let* ((start-start-pos (region-beginning))
+           (start-end-pos (region-end))
+           (region-start (progn
+                           (goto-char start-start-pos)
+                           (beginning-of-line)
+                           (point)))
+           (region-end (progn
+                         (goto-char start-end-pos)
+                         (end-of-line)
+                         (+ 1 (point)))))
+      (copy-region-as-kill region-start region-end)
+      (goto-char region-start)))
+   (t
+    (let ((keep-pos (point))
+          (region-start (progn (beginning-of-line) (point)))
+          (region-end (progn (end-of-line) (+ 1 (point)))))
+      (copy-region-as-kill region-start region-end)
+      (goto-char keep-pos)))))
 
 (defun plomvi-copy-region()
   "Copy marked region."
@@ -193,29 +206,6 @@ Note that this ignores killed rectangles."
   (interactive "cplomvi-replace-char")
   (delete-char 1) (insert-char c) (left-char))
 
-;;; some attempt at a redo feature, not very successful, documented here for
-;;; research purposes
-;
-;(setq plomvi-in-redo nil)  ; should be made buffer-local
-;(setq plomvi-undo-count 0) ; should be made buffer-local
-;(defun plomvi-undo()
-;  (interactive)
-;  (undo-only)
-;  (setq plomvi-in-redo nil)
-;  (setq plomvi-undo-count (+ plomvi-undo-count 1)))
-;(defun plomvi-redo()
-;  (interactive)
-;  (if (> plomvi-undo-count 0)
-;      (progn
-;        (if (null plomvi-in-redo)
-;            (progn
-;              (insert-char ?\s 1)
-;              (undo)
-;              (setq plomvi-in-redo t)))
-;        (progn
-;          (undo)
-;          (setq plomvi-undo-count (- plomvi-undo-count 1))))))
-
 (defun plomvi-no-redo()
   "Tell user what to do, since implementing vim redo was too much of a hassle."
   (interactive)
@@ -234,12 +224,10 @@ Note that this ignores killed rectangles."
 (defvar plomvi-mode-basic-map (make-sparse-keymap)
   "Keymap for `plomvi-mode' on read-only buffers.
 
-In contrast to the keymap `plomvi-editable-mode' for editable buffers,
-this not only excludes keybindings for editing text, but also does not
-shadow keybindings that are bound to `self-insert-command'.
-
-Thus, it on the whole shadows much fewer keybindings of other keymaps
-that can therefore be used for other purposes.")
+In contrast to the keymap `plomvi-editable-mode' for editable
+buffers, this excludes keybindings for editing text, which thus
+become available to be used for other purposes.")
+(suppress-keymap plomvi-mode-basic-map t)
 (define-key plomvi-mode-basic-map (kbd ":") 'plomvi-prompt)
 (define-key plomvi-mode-basic-map (kbd "C-w") 'other-window)
 (define-key plomvi-mode-basic-map (kbd "k") 'previous-line)
@@ -275,11 +263,9 @@ that can therefore be used for other purposes.")
 (defvar plomvi-mode-editable-map (make-sparse-keymap)
   "Keymap for `plomvi-mode' on editable buffers.
 
-Inherits from `plomvi-mode-basic-map', but adds keybindings for text editing
-and shadows keybindings bound to `self-insert-command' to avoid accidentally
-typing text outside of what would be Vim's Insert mode.")
+Inherits from `plomvi-mode-basic-map', but adds keybindings for
+text editing.")
 (set-keymap-parent plomvi-mode-editable-map plomvi-mode-basic-map)
-(define-key plomvi-mode-editable-map [remap self-insert-command] 'plomvi-nothing)
 (define-key plomvi-mode-editable-map (kbd "i") 'plomvi-deactivate)
 (define-key plomvi-mode-editable-map (kbd "x") 'plomvi-x)
 (define-key plomvi-mode-editable-map (kbd "o") 'plomvi-newline-below)
@@ -287,12 +273,10 @@ typing text outside of what would be Vim's Insert mode.")
 (define-key plomvi-mode-editable-map (kbd "r") 'plomvi-replace-char)
 (define-key plomvi-mode-editable-map (kbd "u") 'undo-only)
 (define-key plomvi-mode-editable-map (kbd "C-r") 'plomvi-no-redo)
-;(define-key plomvi-mode-editable-map (kbd "u") 'plomvi-undo)
-;(define-key plomvi-mode-editable-map (kbd "C-r") 'plomvi-redo)
 (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-prefix-command 'plomvi-d-map)
@@ -320,9 +304,9 @@ or, on editable buffers, `plomvi-mode-editable'. The latter two's values in
 `minor-mode-map-alist' toggle either `plomvi-mode-basic-map' or
 `plomvi-mode-editable-map'."
   (interactive (list (or current-prefix-arg 'toggle)))
-  (let ((enable (if (eq arg 'toggle)
-                    (not plomvi-mode)
-                  (> (prefix-numeric-value arg) 0 ))))
+  (let ((enable (if (eq arg 'toggle)                   ; follow suggestions
+                    (not plomvi-mode)                  ; from (elisp)Minor
+                  (> (prefix-numeric-value arg) 0 )))) ; Mode Conventions
     (if enable
         (unless (minibufferp)
           (if buffer-read-only