@ -198,50 +198,51 @@ point reaches the beginning or end of the buffer, stop there."
( kill-new filename )
( kill-new filename )
( message " Copied buffer file name '%s' to the clipboard. " filename ) ) ) )
( message " Copied buffer file name '%s' to the clipboard. " filename ) ) ) )
( defun prelude-duplicate-current-line-or-region ( arg )
" Duplicates the current line or region ARG times.
If there 's no region, the current line will be duplicated. However, if
there 's a region, all lines that region covers will be duplicated. "
( interactive " p " )
( let ( beg end ( origin ( point ) ) )
( defun prelude-get-positions-of-line-or-region ( )
" Return positions (beg . end) of the current line
or region. "
( let ( beg end )
( if ( and mark-active ( > ( point ) ( mark ) ) )
( if ( and mark-active ( > ( point ) ( mark ) ) )
( exchange-point-and-mark ) )
( exchange-point-and-mark ) )
( setq beg ( line-beginning-position ) )
( setq beg ( line-beginning-position ) )
( if mark-active
( if mark-active
( exchange-point-and-mark ) )
( exchange-point-and-mark ) )
( setq end ( line-end-position ) )
( setq end ( line-end-position ) )
( let ( ( region ( buffer-substring-no-properties beg end ) ) )
( -dotimes arg
( lambda ( n )
( goto-char end )
( newline )
( insert region )
( setq end ( point ) ) ) )
( goto-char ( + origin ( * ( length region ) arg ) arg ) ) ) ) )
;; TODO: Remove code duplication by extracting something more generic
( cons beg end ) ) )
( defun prelude-duplicate-current-line-or-region ( arg )
" Duplicates the current line or region ARG times.
If there 's no region, the current line will be duplicated. However, if
there 's a region, all lines that region covers will be duplicated. "
( interactive " p " )
( pcase-let* ( ( origin ( point ) )
( ` ( , beg . , end ) ( prelude-get-positions-of-line-or-region ) )
( region ( buffer-substring-no-properties beg end ) ) )
( -dotimes arg
( lambda ( n )
( goto-char end )
( newline )
( insert region )
( setq end ( point ) ) ) )
( goto-char ( + origin ( * ( length region ) arg ) arg ) ) ) )
( defun prelude-duplicate-and-comment-current-line-or-region ( arg )
( defun prelude-duplicate-and-comment-current-line-or-region ( arg )
" Duplicates and comments the current line or region ARG times.
" Duplicates and comments the current line or region ARG times.
If there 's no region, the current line will be duplicated. However, if
If there 's no region, the current line will be duplicated. However, if
there 's a region, all lines that region covers will be duplicated. "
there 's a region, all lines that region covers will be duplicated. "
( interactive " p " )
( interactive " p " )
( let ( beg end ( origin ( point ) ) )
( if ( and mark-active ( > ( point ) ( mark ) ) )
( exchange-point-and-mark ) )
( setq beg ( line-beginning-position ) )
( if mark-active
( exchange-point-and-mark ) )
( pcase-let* ( ( origin ( point ) )
( ` ( , beg . , end ) ( prelude-get-positions-of-line-or-region ) )
( region ( buffer-substring-no-properties beg end ) ) )
( comment-or-uncomment-region beg end )
( setq end ( line-end-position ) )
( setq end ( line-end-position ) )
( let ( ( region ( buffer-substring-no-properties beg end ) ) )
( comment-or-uncomment-region beg end )
( setq end ( line-end-position ) )
( -dotimes arg
( lambda ( n )
( goto-char end )
( newline )
( insert region )
( setq end ( point ) ) ) )
( goto-char ( + origin ( * ( length region ) arg ) arg ) ) ) ) )
( -dotimes arg
( lambda ( n )
( goto-char end )
( newline )
( insert region )
( setq end ( point ) ) ) )
( goto-char ( + origin ( * ( length region ) arg ) arg ) ) ) )
( defun prelude-rename-file-and-buffer ( )
( defun prelude-rename-file-and-buffer ( )
" Renames current buffer and file it is visiting. "
" Renames current buffer and file it is visiting. "