@ -2,51 +2,82 @@
;; Custom multiple cursors cut/copy/paste handling
;;
( when ( and ( require 'simpleclip ) ( require 'multiple-cursors ) )
;; To replicate Sublime behavior, if copy or cut is executed, do the operation for the whole line.
;; When pasting, paste that line above the current line, regardless of point position
( setq macoy-clipboard-no-selection-line-paste nil )
( setq macoy-multiple-cursors-buffers nil )
( setq macoy-mc-buffer-index 0 )
;;
;; Internal, per-cursor cxp functions for multiple-cursors
;;
( defun macoy-mc-copy ( )
( interactive )
( if ( use-region-p )
( push ( buffer-substring ( region-beginning ) ( region-end ) ) macoy-multiple-cursors-buffers )
;; TODO: Copy whole line if no region
( message " TODO: Copy whole line if no region selected " )
)
)
( progn ( push ( buffer-substring ( region-beginning ) ( region-end ) ) macoy-multiple-cursors-buffers )
( setq macoy-clipboard-no-selection-line-paste nil ) )
;; Nothing marked? Copy whole line
( progn
( push ( buffer-substring ( line-beginning-position ) ( line-end-position ) ) macoy-multiple-cursors-buffers )
( setq macoy-clipboard-no-selection-line-paste t ) ) ) )
( defun macoy-mc-cut ( )
( interactive )
;; TODO: Cut whole line if no region
( unless ( use-region-p )
( message " TODO: Cut whole line if no region selected " )
)
( push ( buffer-substring ( line-beginning-position ) ( line-end-position ) ) macoy-multiple-cursors-buffers )
;; (kill-region (line-beginning-position) (line-end-position))
( kill-whole-line )
( setq macoy-clipboard-no-selection-line-paste t ) )
( when ( use-region-p )
( push ( buffer-substring ( region-beginning ) ( region-end ) ) macoy-multiple-cursors-buffers )
( kill-region ( region-beginning ) ( region-end ) ) )
)
( kill-region ( region-beginning ) ( region-end ) )
( setq macoy-clipboard-no-selection-line-paste nil ) ) )
;; Respect macoy-clipboard-no-selection-line-paste
( defun macoy-simpleclip-paste ( )
( interactive )
( save-excursion
( if macoy-clipboard-no-selection-line-paste
( progn
( back-to-indentation )
( newline )
( call-interactively 'indent-for-tab-command )
( previous-line )
( call-interactively 'simpleclip-paste )
( call-interactively 'indent-for-tab-command ) )
( call-interactively 'simpleclip-paste ) ) ) )
( defun macoy-mc-paste ( )
( interactive )
;; Delete selected text before insert if necessary
( when ( use-region-p )
( delete-region ( region-beginning ) ( region-end ) )
)
( delete-region ( region-beginning ) ( region-end ) ) )
;; If no macoy-multiple-cursors-buffers the user probably did a simple copy so paste that
( unless macoy-multiple-cursors-buffers
( call-interactively 'simpleclip-paste )
)
( call-interactively 'macoy-simpleclip-paste ) )
( when macoy-multiple-cursors-buffers
( insert ( nth macoy-mc-buffer-index macoy-multiple-cursors-buffers ) )
( save-excursion
( if macoy-clipboard-no-selection-line-paste
( progn
( back-to-indentation )
( newline )
( call-interactively 'indent-for-tab-command )
( previous-line )
( insert ( nth macoy-mc-buffer-index macoy-multiple-cursors-buffers ) )
( call-interactively 'indent-for-tab-command ) )
( insert ( nth macoy-mc-buffer-index macoy-multiple-cursors-buffers ) ) ) )
;; Set up next cursor buffer index
;; Ensure we don't go out of range of the buffers
;; Sublime's behavior is to just paste all buffers at all marks, so our solution is different here
( setq macoy-mc-buffer-index ( min
( + macoy-mc-buffer-index 1 )
( - ( length macoy-multiple-cursors-buffers ) 1 ) ) )
)
)
( - ( length macoy-multiple-cursors-buffers ) 1 ) ) ) ) )
;;
;; Cxp functions at all cursors (uses internal functions)
;;
;; For versions newer than 25.3 or something :(
( defun string-join ( sl delim )
@ -62,8 +93,7 @@
( setq macoy-multiple-cursors-buffers ( reverse macoy-multiple-cursors-buffers ) )
;; Adding newline isn't correct but emacs won't copy the newline. It is slightly more useful
;; to paste things with the newlines when collapsing multiple selections
( simpleclip-set-contents ( string-join macoy-multiple-cursors-buffers " \n " ) )
)
( simpleclip-set-contents ( string-join macoy-multiple-cursors-buffers " \n " ) ) )
( defun macoy-multiple-cursors-cut ( )
" Cut at multiple cursors using `macoy-multiple-cursors-buffers' "
@ -74,24 +104,47 @@
( setq macoy-multiple-cursors-buffers ( reverse macoy-multiple-cursors-buffers ) )
;; Adding newline isn't correct but emacs won't copy the newline. It is slightly more useful
;; to paste things with the newlines when collapsing multiple selections
( simpleclip-set-contents ( string-join macoy-multiple-cursors-buffers " \n " ) )
)
( simpleclip-set-contents ( string-join macoy-multiple-cursors-buffers " \n " ) ) )
( defun macoy-multiple-cursors-paste ( )
" Paste at multiple cursors using `macoy-multiple-cursors-buffers' "
( interactive )
( setq macoy-mc-buffer-index 0 )
( mc/for-each-cursor-ordered
( mc/execute-command-for-fake-cursor 'macoy-mc-paste cursor ) )
)
( mc/execute-command-for-fake-cursor 'macoy-mc-paste cursor ) ) )
( defun macoy-test-multiple-cursors-print-list ( )
" Print buffers "
( interactive )
( message " %d in buffer " ( length macoy-multiple-cursors-buffers ) )
( dolist ( buffer macoy-multiple-cursors-buffers )
( message " Buffer: %s " buffer ) )
)
( message " Buffer: %s " buffer ) ) )
;;
;; Internal, non-mc cx functions (to duplicate no region line copy behavior)
;;
( defun macoy-nonmc-copy ( )
( interactive )
( if ( use-region-p )
( progn ( simpleclip-set-contents ( buffer-substring ( region-beginning ) ( region-end ) ) )
( setq macoy-clipboard-no-selection-line-paste nil ) )
;; Nothing marked? Copy whole line
( progn ( simpleclip-set-contents
( buffer-substring ( line-beginning-position )
( line-end-position ) ) )
( setq macoy-clipboard-no-selection-line-paste t ) ) ) )
( defun macoy-nonmc-cut ( )
( interactive )
( unless ( use-region-p )
( simpleclip-set-contents ( buffer-substring ( line-beginning-position ) ( line-end-position ) ) )
;; (kill-region (line-beginning-position) (line-end-position))
( kill-whole-line )
( setq macoy-clipboard-no-selection-line-paste t ) )
( when ( use-region-p )
( simpleclip-cut ( region-beginning ) ( region-end ) )
( setq macoy-clipboard-no-selection-line-paste nil ) ) )
;;
;; Custom copy/cut/paste functions so one key can work for simpleclip and multiple-cursors
@ -104,8 +157,7 @@
( setq macoy-multiple-cursors-buffers nil )
( if ( bound-and-true-p multiple-cursors-mode )
( call-interactively 'macoy-multiple-cursors-copy ) ;; Was kill-ring-save
( call-interactively 'simpleclip-copy ) )
)
( call-interactively 'macoy-nonmc-copy ) ) )
( defun macoyCut ( )
( interactive )
@ -114,13 +166,11 @@
( setq macoy-multiple-cursors-buffers nil )
( if ( bound-and-true-p multiple-cursors-mode )
( call-interactively 'macoy-multiple-cursors-cut ) ;; Was kill-region
( call-interactively 'simpleclip-cut ) )
)
( call-interactively 'macoy-nonmc-cut ) ) )
( defun macoyPaste ( )
( interactive )
( if ( bound-and-true-p multiple-cursors-mode )
( call-interactively 'macoy-multiple-cursors-paste ) ;; Was yank
( call-interactively 'simpleclip-paste ) )
)
( call-interactively 'macoy-simpleclip-paste ) ) )
)