How do I duplicate a whole line in Emacs?

前端 未结 30 1117
时光取名叫无心
时光取名叫无心 2020-12-04 05:20

I saw this same question for VIM and it has been something that I myself wanted to know how to do for Emacs. In ReSharper I use CTRL-D for this action. What is the least num

30条回答
  •  佛祖请我去吃肉
    2020-12-04 05:40

    This functionality should match up with JetBrains' implementation in terms of duplicating both by line or region, and then leaving the point and/ or active region as expected:

    Just a wrapper to around the interactive form:

    (defun wrx/duplicate-line-or-region (beg end)
      "Implements functionality of JetBrains' `Command-d' shortcut for `duplicate-line'.
       BEG & END correspond point & mark, smaller first
       `use-region-p' explained: 
       http://emacs.stackexchange.com/questions/12334/elisp-for-applying-command-to-only-the-selected-region#answer-12335"
      (interactive "r")
      (if (use-region-p)
          (wrx/duplicate-region-in-buffer beg end)
        (wrx/duplicate-line-in-buffer)))
    

    Which calls this,

    (defun wrx/duplicate-region-in-buffer (beg end)
      "copy and duplicate context of current active region
       |------------------------+----------------------------|
       |        before          |           after            |
       |------------------------+----------------------------|
       | first line here  | first line here            |
       | second item now | second itemline here |
       |                        | second item now     |
       |------------------------+----------------------------|
       TODO: Acts funky when point < mark"
      (set-mark-command nil)
      (insert (buffer-substring beg end))
      (setq deactivate-mark nil))
    

    Or this

    (defun wrx/duplicate-line-in-buffer ()
      "Duplicate current line, maintaining column position.
       |--------------------------+--------------------------|
       |          before          |          after           |
       |--------------------------+--------------------------|
       | lorem ipsum dolor | lorem ipsum dolor        |
       |                          | lorem ipsum dolor |
       |--------------------------+--------------------------|
       TODO: Save history for `Cmd-Z'
       Context: 
       http://stackoverflow.com/questions/88399/how-do-i-duplicate-a-whole-line-in-emacs#answer-551053"
      (setq columns-over (current-column))
      (save-excursion
        (kill-whole-line)
        (yank)
        (yank))
      (let (v)
        (dotimes (n columns-over v)
          (right-char)
          (setq v (cons n v))))
      (next-line))
    

    And then I have this bound to meta+shift+d

    (global-set-key (kbd "M-D") 'wrx/duplicate-line-or-region)
    

提交回复
热议问题