Files
mark-copy-yank-things-mode/mark-copy-yank-things-mode.el

753 lines
24 KiB
EmacsLisp
Raw Normal View History

2017-03-23 18:41:01 +01:00
;;; mark-copy-yank-things-mode.el --- mark, copy, yank things
2017-03-23 12:00:42 +01:00
;; Copyright (C) 2017, T.v.Dein <tlinden@cpan.org>
;; This file is NOT part of Emacs.
;; This program is free software; you can redistribute it and/or
;; modify it under the terms of the GNU General Public License as
;; published by the Free Software Foundation; either version 2 of the
;; License, or (at your option) any later version.
;; This program is distributed in the hope that it will be useful, but
;; WITHOUT ANY WARRANTY; without even the implied warranty of
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
;; General Public License for more details.
;; You should have received a copy of the GNU General Public License
;; along with this program; if not, write to the Free Software
;; Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
;; USA
;; Version: 0.04
2017-03-23 12:00:42 +01:00
;; Author: T.v.Dein <tlinden@cpan.org>
;; Keywords: copy yank mark things
;; URL: https://github.com/tlinden/mark-copy-yank-things
;; License: GNU General Public License >= 2
;;; Commentary:
;;;; Usage
;; MCYT minor mode provides convenience functions and wrappers to
;; mark, copy and yank various things with just one key chord. In copy
;; and yank mode the thing in question will be highlighted shortly as
;; visual feedback. This can be turned off.
;; Copied text will be stripped of leading and trailing whitespaces,
;; fontification and other text properties will be removed. This might
;; change in a future version.
;; The MCYT mode has 3 sub mode key maps for copying, yanking and
;; marking things. Each sub map has it's own prefix key:
;; C-c c copy things prefix
;; C-c y yank things prefix
;; C-c m mark things prefix
;; COPY commands (keymap: mcyt-copy-map):
2017-08-24 18:18:44 +02:00
;; C-c c w mcyt-copy-word
;; C-c c q mcyt-copy-quote
;; C-c c k mcyt-copy-parens
;; C-c c l mcyt-copy-line
;; C-c c p mcyt-copy-paragraph
;; C-c c f mcyt-copy-defun
;; C-c c u mcyt-copy-url
;; C-c c e mcyt-copy-email
;; C-c c c mcyt-copy-comment-block
;; C-c c a mcyt-copy-buffer
;; C-c c i mcyt-copy-ip
2017-03-23 12:00:42 +01:00
;; C-c c s mcyt-copy-sexp
2017-08-24 18:18:44 +02:00
;; C-c c > mcyt-copy-buffer-after-point
;; C-c c < mcyt-copy-buffer-before-point
;; C-c c $ mcyt-copy-line-after-point
;; C-c c ^ mcyt-copy-line-before-point
2017-03-23 12:00:42 +01:00
;; COPY & YANK commands (keymap: mcyt-yank-map):
;; C-c c y y mcyt-copy-and-yank-line
;; C-c c y l mcyt-copy-and-yank-line
;; C-c c y p mcyt-copy-and-yank-paragraph
;; C-c c y f mcyt-copy-and-yank-defun
;; C-c c y a mcyt-copy-and-yank-buffer
;; C-c c y w mcyt-copy-and-yank-word
;; C-c c y i mcyt-copy-and-yank-ip
;; C-c c y c mcyt-copy-and-yank-comment
;; MARK commands (keymap: mcyt-mark-map):
2017-08-24 18:18:44 +02:00
;; C-c c a a mcyt-mark-buffer
;; C-c c a w mcyt-mark-word
;; C-c c a f mcyt-mark-defun
;; C-c c a p mcyt-mark-paragraph
;; C-c c a l mcyt-mark-line
;; C-c c a u mcyt-mark-url
;; C-c c a e mcyt-mark-email
;; C-c c a s mcyt-mark-sexp
;; C-c c a c mcyt-mark-comment-block
;; C-c c a i mcyt-mark-ip
;; C-c c a > mcyt-mark-buffer-after-point
;; C-c c a < mcyt-mark-buffer-before-point
;; C-c c a $ mcyt-mark-line-after-point
;; C-c c a ^ mcyt-mark-line-before-point
2017-03-23 12:00:42 +01:00
;; Please note, the commands mcyt-copy-sexp and mcyt-mark-sexp only
;; work if expand-region is installed. You can find it here:
;; https://github.com/magnars/expand-region.el.
;;;; Install:
2017-03-23 18:41:01 +01:00
;; To use, save mark-copy-yank-things-mode.el to a directory in your load-path.
2017-03-23 12:00:42 +01:00
;; Add something like this to your config:
;; (require 'mark-copy-yank-things-mode)
;; (add-hook 'text-mode-hook 'mark-copy-yank-things-mode)
;; or load it manually, when needed:
;; M-x mark-copy-yank-things-mode
;; However, it's also possible to enable MCYT globally:
;; (mark-copy-yank-things-global-mode)
;;;; Customize
;; To turn off short blinking of copied and yanked things (visual feedback):
;; (setq mark-copy-yank-things-enable-blinking nil)
;; Of course the mark commands do highlight anyway.
;; You can also customize the various prefix keys defined for this mode:
;; (define-key mark-copy-yank-things-mode-map (kbd "C-c c") 'mcyt-copy-map)
;; (define-key mark-copy-yank-things-mode-map (kbd "C-c y") 'mcyt-yank-map)
;; (define-key mark-copy-yank-things-mode-map (kbd "C-c m") 'mcyt-mark-map)
;; You may also directly customize the key bindings, e.g:
;; (define-key mcyt-copy-map (kbd "l") 'mcyt-copy-line)
;; (define-key mcyt-yank-map (kbd "l") 'mcyt-yank-line)
;; (define-key mcyt-mark-map (kbd "l") 'mcyt-mark-line)
;;;; Reporting Bugs:
;; Open https://github.com/tlinden/mark-copy-yank-things/issues and
;; file a new issue
;;; Code
;;;; Dependencies
(require 'thingatpt)
(require 'cl-lib)
2017-03-23 12:00:42 +01:00
;; optional: expand-region
;;;; Consts and Defs
2017-06-12 12:01:52 +02:00
(defconst mark-copy-yank-things-mode-version "0.02" "Mark-Copy-Yank-Things Mode version.")
2017-03-23 12:00:42 +01:00
(defgroup mark-copy-yank-things-mode nil
"Kill first, ask later - an emacs mode for killing things quickly"
:group 'extensions
:group 'tools
:link '(url-link :tag "Repository" "https://github.com/tlinden/mark-copy-yank-things"))
(defvar mark-copy-yank-things-mode-map (make-sparse-keymap)
"Keymap for the MCYT minor mode.")
;;;; Customizables
(defcustom mark-copy-yank-things-blink-time 0.2
"How long should mark-copy-yank-things highlight a region,
in seconds, specify milliseconds like this: 0.1"
:group 'mark-copy-yank-things-mode)
(defcustom mark-copy-yank-things-enable-blinking t
"If set to true (default) highlight the deleted text shortly
for 'mark-copy-yank-things-blink-time seconds. Set to nil to disable the feature"
:group 'mark-copy-yank-things-mode)
;;;; Internal Functions
;;;;; Helpers
(defun mcyt--blink(begin end)
"blink a region. used for copy and delete"
(interactive)
(let* ((rh (make-overlay begin end)))
(progn
(overlay-put rh 'face '(:background "DodgerBlue" :foreground "White"))
(sit-for mark-copy-yank-things-blink-time t)
(delete-overlay rh))))
(defun mcyt--get-point (symbol &optional arg)
"Return point at symbol"
(save-excursion
(funcall symbol arg)
(point)))
(defun mcyt--copy-thing (begin-of-thing end-of-thing &optional arg)
"Copy thing between beg & end into kill ring.
Remove leading and trailing whitespace while we're at it.
Also, remove whitespace before column, if any.
Also, font-lock will be removed, if any."
(save-excursion
(let* ((beg (mcyt--get-point begin-of-thing 1))
(end (mcyt--get-point end-of-thing arg)))
(progn
(copy-region-as-kill beg end)
(with-temp-buffer
(yank)
(goto-char 1)
(while (looking-at "[ \t\n\r]")
(delete-char 1))
(delete-trailing-whitespace)
(delete-whitespace-rectangle (point-min) (point-max)) ;; del column \s, hehe
(font-lock-unfontify-buffer) ;; reset font lock
(kill-region (point-min) (point-max))
)))))
2017-08-24 18:18:44 +02:00
(defun mcyt--blink-and-copy-thing (begin end &optional arg cap)
2017-03-23 12:00:42 +01:00
"General wrapper for all copy[+yank] functions. Highlights
the region BEGIN to END for mark-copy-yank-things-blink-time
seconds, then copies the stuff in between into the kill-ring."
2017-08-24 18:18:44 +02:00
(let ((name (or cap (car (last (split-string (symbol-name end) "-"))))))
2017-03-23 12:00:42 +01:00
(if (eq t mark-copy-yank-things-enable-blinking)
(mcyt--blink (mcyt--get-point begin 1) (mcyt--get-point end 1)))
(mcyt--copy-thing begin end arg)
(message (format "%s at point copied" name))))
(defun mcyt--space-p ()
"little helper, just returns true if current char
at point is a whitespace"
(interactive)
(let ((c (char-after nil)))
(or (eq 32 c) (eq 9 c))))
(defun mcyt--comment-p (pos)
"Check whether the code at POS is comment by comparing font face."
(interactive)
(let* ((fontfaces (get-text-property pos 'face)))
(if (not (listp fontfaces))
(setf fontfaces (list fontfaces)))
(delq nil
(mapcar #'(lambda (f)
(or (eq f 'font-lock-comment-face)
(eq f 'font-lock-comment-delimiter-face)))
fontfaces))))
2017-08-24 18:18:44 +02:00
(defun mcyt--point (&optional arg)
"Just a wrapper to make blink happy."
(point))
2017-03-23 12:00:42 +01:00
;;;;; Beginning- and End-of-things
(defun mcyt-beginning-of-comment-block ()
"Move point to the beginning of a comment block"
(interactive)
(let ((isc t)
(ok (point)))
(while (and (not (bobp)) (eq t isc))
;; if char behind is still a comment, go there
;; if we're already on the first comment char on current line, go up
(if (mcyt--comment-p (- (point) 1))
(backward-char 1)
(previous-line))
;; now, if we're not on a comment anymore,
;; go back to last recorded commentchar and break the loop
(if (mcyt--comment-p (point))
(setq ok (point))
(goto-char ok)
(setq isc nil)))))
(defun mcyt-end-of-comment-block ()
"Move point to the end of a comment block, return column
of widest comment line."
(interactive)
(let ((isc t)
(col (current-column))
(ok (point)))
(while (eq isc t)
;; if char in front is still a comment, go there
;; if not (e.g. because forward-char leads to next line)
;; go one line down
(if (mcyt--comment-p (+ (point) 1))
(forward-char 1)
(next-line))
;; now, if we're not on a comment anymore, go back to the last
;; recorded comment char and break the loop
(if (mcyt--comment-p (point))
(progn
(setq ok (point))
(if (> (current-column) col)
(setq col (current-column))))
(goto-char ok)
(setq isc nil)))
col))
(defun mcyt-beginning-of-quote(&optional arg)
"return position of begin of quote"
(re-search-backward "\"" (line-beginning-position) 3 1)
(if (looking-at "\"") (goto-char (+ (point) 1)) ))
(defun mcyt-end-of-quote(&optional arg)
"return position of end of quote"
(re-search-forward "\"" (line-end-position) 3 arg)
(if (looking-back "\"") (goto-char (- (point) 1)) ))
(defun mcyt-beginning-of-parenthesis(&optional arg)
"return position of opening parens"
(re-search-backward "[[<(?]" (line-beginning-position) 3 1)
(if (looking-at "[[<(?]") (goto-char (+ (point) 1)) ))
(defun mcyt-end-of-parenthesis(&optional arg)
"return position of closing parens"
(re-search-forward "[]>)?]" (line-end-position) 3 arg)
(if (looking-back "[]>)?]") (goto-char (- (point) 1)) ))
(defun mcyt-beginning-of-ip (&optional arg)
"goto begin of ip address"
(interactive)
(while (looking-at "[0-9\.\/]")
(backward-char 1))
(forward-char 1))
(defun mcyt-end-of-ip (&optional arg)
"goto end of ip address"
(interactive)
(while (looking-at "[0-9\.\/]")
(forward-char 1)))
2017-08-25 12:58:46 +02:00
;; We use these for word finding, since the built-in word functions do
;; not include -_. which is annoying, that is we (re-)define word here
;; independent of syntax table
2017-03-23 12:00:42 +01:00
(defun mcyt-beginning-of-symbol (&optional arg)
(interactive)
(backward-word)
(while (looking-back "[-_\.]")
(backward-word)))
(defun mcyt-end-of-symbol (&optional arg)
(interactive)
(forward-word)
(while (looking-at "[-_\.]")
(forward-word)))
2017-08-24 18:18:44 +02:00
(defun mcyt-buffer-after-point (&optional arg)
(interactive)
(goto-char (point-max)))
(defun mcyt-buffer-before-point (&optional arg)
(interactive)
(goto-char (point-min)))
(defun mcyt-line-after-point (&optional arg)
(interactive)
(end-of-line))
(defun mcyt-line-before-point (&optional arg)
(interactive)
(beginning-of-line))
2017-03-23 12:00:42 +01:00
;;;;; Prefix-Map Loader and Key Bindings
(defun mcyt--load-prefix-maps ()
(define-prefix-command 'mcyt-copy-map)
(define-prefix-command 'mcyt-yank-map)
(define-prefix-command 'mcyt-mark-map)
(define-key mark-copy-yank-things-mode-map (kbd "C-c c") 'mcyt-copy-map)
(define-key mark-copy-yank-things-mode-map (kbd "C-c y") 'mcyt-yank-map)
(define-key mark-copy-yank-things-mode-map (kbd "C-c m") 'mcyt-mark-map)
;; "speaking" bindings CTRL-[c]opy [w]ord, etc...
(define-key mcyt-copy-map (kbd "w") 'mcyt-copy-word)
(define-key mcyt-copy-map (kbd "q") 'mcyt-copy-quote)
(define-key mcyt-copy-map (kbd "k") 'mcyt-copy-parens)
(define-key mcyt-copy-map (kbd "l") 'mcyt-copy-line)
(define-key mcyt-copy-map (kbd "p") 'mcyt-copy-paragraph)
(define-key mcyt-copy-map (kbd "f") 'mcyt-copy-defun)
(define-key mcyt-copy-map (kbd "u") 'mcyt-copy-url)
(define-key mcyt-copy-map (kbd "e") 'mcyt-copy-email)
(define-key mcyt-copy-map (kbd "c") 'mcyt-copy-comment-block)
(define-key mcyt-copy-map (kbd "a") 'mcyt-copy-buffer)
(define-key mcyt-copy-map (kbd "i") 'mcyt-copy-ip)
(define-key mcyt-copy-map (kbd "s") 'mcyt-copy-sexp)
2017-08-24 18:18:44 +02:00
(define-key mcyt-copy-map (kbd ">") 'mcyt-copy-buffer-after-point)
(define-key mcyt-copy-map (kbd "<") 'mcyt-copy-buffer-before-point)
(define-key mcyt-copy-map (kbd "$") 'mcyt-copy-line-after-point)
(define-key mcyt-copy-map (kbd "^") 'mcyt-copy-line-before-point)
2017-03-23 12:00:42 +01:00
;; CTRL-[c]copy-and-[y]ank [w]word, etc...
(define-key mcyt-yank-map (kbd "y") 'mcyt-copy-and-yank-line)
(define-key mcyt-yank-map (kbd "l") 'mcyt-copy-and-yank-line)
(define-key mcyt-yank-map (kbd "p") 'mcyt-copy-and-yank-paragraph)
(define-key mcyt-yank-map (kbd "f") 'mcyt-copy-and-yank-defun)
(define-key mcyt-yank-map (kbd "a") 'mcyt-copy-and-yank-buffer)
(define-key mcyt-yank-map (kbd "w") 'mcyt-copy-and-yank-word)
(define-key mcyt-yank-map (kbd "i") 'mcyt-copy-and-yank-ip)
(define-key mcyt-yank-map (kbd "c") 'mcyt-copy-and-yank-comment)
;; M-a'rk commands
(define-key mcyt-mark-map (kbd "a") 'mcyt-mark-buffer)
(define-key mcyt-mark-map (kbd "w") 'mcyt-mark-word)
(define-key mcyt-mark-map (kbd "f") 'mcyt-mark-defun)
(define-key mcyt-mark-map (kbd "p") 'mcyt-mark-paragraph)
(define-key mcyt-mark-map (kbd "l") 'mcyt-mark-line)
(define-key mcyt-mark-map (kbd "u") 'mcyt-mark-url)
(define-key mcyt-mark-map (kbd "e") 'mcyt-mark-email)
(define-key mcyt-mark-map (kbd "s") 'mcyt-mark-sexp)
(define-key mcyt-mark-map (kbd "c") 'mcyt-mark-comment-block)
2017-08-24 18:18:44 +02:00
(define-key mcyt-mark-map (kbd "i") 'mcyt-mark-ip)
(define-key mcyt-mark-map (kbd ">") 'mcyt-mark-buffer-after-point)
(define-key mcyt-mark-map (kbd "<") 'mcyt-mark-buffer-before-point)
(define-key mcyt-mark-map (kbd "$") 'mcyt-mark-line-after-point)
(define-key mcyt-mark-map (kbd "^") 'mcyt-mark-line-before-point))
2017-03-23 12:00:42 +01:00
;;;; API Functions / Interface
;;;;; Copy
(defun mcyt-copy-comment-block ()
"Copy a block of comments positioned AFTER actual code.
For example:
if(tor) { # anonymous
$C-end; # disconnect
}
In this example the following text would be copied:
# anonymous
# disconnect
Also supports normal one- or multiline comments, indended or not.
"
(interactive)
(let ((beg 0)
(end 0)
(A 0)
(B 0)
(max 0))
(save-excursion
(mcyt-beginning-of-comment-block)
(setq beg (point))
(set-mark-command nil)
(setq max (mcyt-end-of-comment-block))
(unless (>= (current-column) max)
(setq A (point))
(while (< (current-column) max)
(insert " "))
(setq B (point)))
(setq end (point))
(rectangle-mark-mode)
(sit-for 0.2 t)
(copy-rectangle-as-kill beg end)
(unless (eq A 0)
(delete-region A B))
(with-temp-buffer
(yank-rectangle)
(delete-trailing-whitespace)
(copy-region-as-kill (point-min) (point-max))))))
(defun mcyt-copy-line (&optional arg)
"Copy line at point into kill-ring, truncated"
(interactive "P")
(mcyt--blink-and-copy-thing 'beginning-of-line 'end-of-line arg))
(defun mcyt-copy-paragraph (&optional arg)
"Copy line at point into kill-ring, truncated"
(interactive "P")
(mcyt--blink-and-copy-thing 'backward-paragraph 'forward-paragraph arg))
(defun mcyt-copy-quote(&optional arg)
"Copy a quoted string at point"
(interactive "P")
(mcyt--blink-and-copy-thing 'mcyt-beginning-of-quote 'mcyt-end-of-quote arg))
(defun mcyt-copy-parens(&optional arg)
"Copy a stuff inside parens at point"
(interactive "P")
(mcyt--blink-and-copy-thing 'mcyt-beginning-of-parenthesis 'mcyt-end-of-parenthesis arg))
(defun mcyt-copy-word (&optional arg)
"Copy word at point into kill-ring"
(interactive "P")
(mcyt--blink-and-copy-thing 'mcyt-beginning-of-symbol 'mcyt-end-of-symbol arg))
(defun mcyt-copy-buffer(&optional arg)
"Copy the whole buffer into kill-ring, as-is"
2017-08-25 12:58:46 +02:00
(interactive "P")
2017-03-23 12:00:42 +01:00
(mcyt--blink (point-min) (point-max))
(copy-region-as-kill (point-min) (point-max))
(message "buffer copied"))
(defun mcyt-copy-defun (&optional arg)
"Copy function at point into kill-ring"
(interactive "P")
(mcyt--blink-and-copy-thing 'beginning-of-defun 'end-of-defun arg))
(defun mcyt-copy-url (&optional arg)
"Copy url or file-path at point into kill-ring"
(interactive "P")
(let ((beg (car (or (bounds-of-thing-at-point 'url) (bounds-of-thing-at-point 'filename))))
(end (cdr (or (bounds-of-thing-at-point 'url) (bounds-of-thing-at-point 'filename)))))
(mcyt--blink beg end)
(kill-ring-save beg end)
(message "url at point copied")))
(defun mcyt-copy-email (&optional arg)
"Copy email at point into kill-ring"
(interactive "P")
(let ((beg (car (bounds-of-thing-at-point 'email)))
(end (cdr (bounds-of-thing-at-point 'email))))
(mcyt--blink beg end)
(kill-ring-save beg end)
(message "email at point copied")))
(defun mcyt-copy-sexp (&optional arg)
"Copy sexp at point into kill-ring"
(interactive "P")
(if (not (fboundp 'er/mark-outside-pairs))
(message "(mcyt-copy-sexp) not supported, install expand-region.")
(let ((ign (er/mark-outside-pairs))
(beg (mark))
(end (point)))
(deactivate-mark)
(mcyt--blink beg end)
(kill-ring-save beg end)
(message "sexp at point copied"))))
(defun mcyt-copy-ip (&optional arg)
"Copy ip address at point into kill-ring"
(interactive "P")
(mcyt--blink-and-copy-thing 'mcyt-beginning-of-ip 'mcyt-end-of-ip arg))
2017-08-24 18:18:44 +02:00
(defun mcyt-copy-buffer-after-point (&optional arg)
"Copy everything from (point) to (eobp)"
(interactive "P")
(mcyt--blink-and-copy-thing 'mcyt--point 'mcyt-buffer-after-point arg "buffer-after-point"))
(defun mcyt-copy-buffer-before-point (&optional arg)
"Copy everything from (point) to (bobp)"
(interactive "P")
(mcyt--blink-and-copy-thing 'mcyt--point 'mcyt-buffer-before-point arg "buffer-before-point"))
(defun mcyt-copy-line-after-point (&optional arg)
"Copy everything from (point) to end of line"
(interactive "P")
(mcyt--blink-and-copy-thing 'mcyt--point 'mcyt-line-after-point arg "line-after-point"))
(defun mcyt-copy-line-before-point (&optional arg)
"Copy everything from (point) to beginning of line"
(interactive "P")
(mcyt--blink-and-copy-thing 'mcyt--point 'mcyt-line-before-point arg "line-before-point"))
2017-03-23 12:00:42 +01:00
;;;;; Copy+Yank
(defun mcyt-copy-and-yank-word (&optional arg)
"copy current word, yank it after current and place the cursor to the beginning of the copy"
(interactive "P")
(progn
(mcyt-copy-word)
(mcyt-end-of-symbol)
(insert " ")
(yank)))
(defun mcyt-copy-and-yank-ip (&optional arg)
"copy current ip, yank it after current and place the cursor to the beginning of the copy"
(interactive "P")
(progn
(mcyt-copy-ip)
(mcyt-end-of-ip)
(insert " ")
(yank)))
(defun mcyt-copy-and-yank-line (&optional arg)
"copy current line, yank it below and place the cursor there.
Supports numerical arguments, if present, copy current line
ARG times. Also accessible with {C-u [0-9]+ C-c y y}"
(interactive "P")
(message "arg: %s" (prefix-numeric-value arg))
(cl-loop for i
2017-03-23 12:00:42 +01:00
below (prefix-numeric-value arg)
collect (progn
(mcyt-copy-line)
(move-end-of-line nil)
(newline-and-indent)
(yank))))
(defun mcyt-copy-and-yank-paragraph(&optional arg)
"copy current paragraph, add two newlines after current paragraph,
yank the copy below and place the cursor on the beginning of
copied paragraph"
(interactive "P")
(progn
(mcyt-copy-paragraph)
(move-end-of-line nil)
(newline-and-indent)
(newline-and-indent)
(yank)
(backward-paragraph)
(next-line)))
(defun mcyt-copy-and-yank-defun(&optional arg)
"copy current function, add two newlines after current function,
yank the copy below and place the cursor on the beginning of
copied defun"
(interactive "P")
(progn
(mcyt-copy-defun)
(end-of-defun)
(newline-and-indent)
(newline-and-indent)
(yank)
(beginning-of-defun)))
(defun mcyt-copy-and-yank-buffer(&optional arg)
"copy the whole buffer and yank all of it after end-of-buffer"
(interactive "P")
(progn
(mcyt-copy-buffer)
(end-of-buffer)
(newline)
(yank)))
(defun mcyt-copy-and-yank-comment(&optional arg)
"copy current comment block, add newline, yank the copy
below and place the cursor on the end of copied comment"
(interactive "P")
(progn
(mcyt-copy-comment-block)
(mcyt-end-of-comment-block)
(newline-and-indent)
(yank)
(end-of-coment-block)))
;;;;; Mark
;; related, but just mark things
(defun mcyt-mark-line ()
(interactive)
(move-beginning-of-line nil)
(set-mark-command nil)
(move-end-of-line nil)
(setq deactivate-mark nil))
(defun mcyt-mark-word()
(interactive)
(mcyt-beginning-of-symbol)
(set-mark-command nil)
(mcyt-end-of-symbol)
(setq deactivate-mark nil))
(defun mcyt-mark-url()
(interactive)
(beginning-of-thing 'url)
(set-mark-command nil)
(end-of-thing 'url)
(setq deactivate-mark nil))
(defun mcyt-mark-email()
(interactive)
(beginning-of-thing 'email)
(set-mark-command nil)
(end-of-thing 'email)
(setq deactivate-mark nil))
(defun mcyt-mark-ip()
(interactive)
(mcyt-beginning-of-ip)
(set-mark-command nil)
(mcyt-end-of-ip)
(setq deactivate-mark nil))
(defun mcyt-mark-comment-block ()
"Same as mcyt-copy-comment-block, without the copying part."
(interactive)
(let ((beg 0)
(end 0)
(A 0)
(B 0)
(max 0))
(save-excursion
(mcyt-beginning-of-comment-block)
(setq beg (point))
(set-mark-command nil)
(setq max (mcyt-end-of-comment-block))
(unless (>= (current-column) max)
(setq A (point))
(while (< (current-column) max)
(insert " "))
(setq B (point)))
(setq end (point))
(rectangle-mark-mode))))
(defun mcyt-mark-buffer ()
(interactive)
(mark-whole-buffer))
(defun mcyt-mark-defun ()
(interactive)
(mark-defun))
(defun mcyt-mark-sexp ()
(interactive)
(if (not (fboundp 'er/mark-outside-pairs))
(message "(mcyt-mark-sexp) not supported, install expand-region.")
(er/mark-outside-pairs)))
(defun mcyt-mark-paragraph ()
(interactive)
(mark-paragraph))
2017-08-24 18:18:44 +02:00
(defun mcyt-mark-buffer-after-point()
(interactive)
(set-mark-command nil)
(mcyt-buffer-after-point)
(setq deactivate-mark nil))
(defun mcyt-mark-buffer-before-point()
(interactive)
(set-mark-command nil)
(mcyt-buffer-before-point)
(setq deactivate-mark nil))
(defun mcyt-mark-line-after-point()
(interactive)
(set-mark-command nil)
(mcyt-line-after-point)
(setq deactivate-mark nil))
(defun mcyt-mark-line-before-point()
(interactive)
(set-mark-command nil)
(mcyt-line-before-point)
(setq deactivate-mark nil))
2017-03-23 12:00:42 +01:00
;;;; Minor Mode and Key Map
;;;###autoload
;; the minor mode, can be enabled by major mode via hook or manually
(define-minor-mode mark-copy-yank-things-mode "mark, copy and yank various things"
:lighter " Y"
:group 'mark-copy-yank-things-mode
2017-06-12 12:01:52 +02:00
(mcyt--load-prefix-maps)
(run-hooks 'mark-copy-yank-things-mode-hook))
2017-03-23 12:00:42 +01:00
;; just in case someone wants to use it globally
(define-globalized-minor-mode mark-copy-yank-things-global-mode
mark-copy-yank-things-mode mark-copy-yank-things-mode
:group 'mark-copy-yank-things-mode)
(provide 'mark-copy-yank-things-mode)
2017-03-23 18:41:01 +01:00
;;; mark-copy-yank-things-mode.el ends here