X-Git-Url: https://plomlompom.com/repos/foo.html?a=blobdiff_plain;f=plomvi.el;h=8dd5117f6bd1907c7e7eb09c51ad11e3aa621a53;hb=2af70b677116cef8ae39f2b0eff32ad02a40ade8;hp=b98afc0db24709176a8ea3249221780193b48b8d;hpb=f4218d944fac35691bf024696b5267ab09d98301;p=plomvi.el diff --git a/plomvi.el b/plomvi.el index b98afc0..8dd5117 100644 --- a/plomvi.el +++ b/plomvi.el @@ -43,10 +43,6 @@ -(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) @@ -141,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." @@ -153,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." @@ -174,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." @@ -208,15 +220,19 @@ 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. -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) @@ -234,7 +250,7 @@ that can therefore 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) @@ -252,11 +268,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) @@ -267,9 +281,9 @@ typing text outside of what would be Vim's Insert mode.") (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)