Я видел этот же вопрос для VIM, и это было то, что я сам хотел знать, как сделать для Emacs. В ReSharper я использую CTRL-D для этого действия. Каково наименьшее количество команд для выполнения этого в Emacs?
Как дублировать целую строку в Emacs?
Ответ 1
Я использую
C-a C-SPACE C-n M-w C-y
который разбивается на
-  C-a: переместить курсор в начало строки
-  C-SPACE: начните выделение ( "set mark" )
-  C-n: переместить курсор в следующую строку
-  M-w: область копирования
-  C-y: paste ( "yank" )
Вышеупомянутый
C-a C-k C-k C-y C-y
составляет то же самое (TMTOWTDI)
-  C-a: переместить курсор в начало строки
-  C-k: cut ( "kill" ) строка
-  C-k: вырезать новую строку
-  C-y: вставить ( "yank" ) (мы вернулись на квадрат)
-  C-y: снова вставьте (теперь у нас есть две копии строки)
Они оба смущающе подробные по сравнению с C-d в вашем редакторе, но в Emacs всегда есть настройка. C-d по умолчанию привязан к delete-char, так как насчет C-c C-d? Просто добавьте следующее в свой .emacs:
(global-set-key "\C-c\C-d" "\C-a\C- \C-n\M-w\C-y")
(@вариант Nathan elisp, вероятно, предпочтительнее, потому что он не сломается, если какое-либо из привязок клавиш будет изменено.)
Остерегайтесь: некоторые режимы Emacs могут вернуть C-c C-d, чтобы сделать что-то еще.
Ответ 2
В дополнение к предыдущим ответам вы также можете определить свою собственную функцию для дублирования строки. Например, добавив следующее в ваш файл .emacs, C-d дублирует текущую строку.
(defun duplicate-line()
  (interactive)
  (move-beginning-of-line 1)
  (kill-line)
  (yank)
  (open-line 1)
  (next-line 1)
  (yank)
)
(global-set-key (kbd "C-d") 'duplicate-line)
Ответ 3
Поместите курсор в строке, если не начинайте делать CTRL - A, а затем:
CTRL - K
CTRL - K
CTRL - Y
CTRL - Y
Ответ 4
Моя версия функции для дублирования строки, которая отлично работает с отменой и не путается с позицией курсора. Это было результатом обсуждения в gnu.emacs.sources с ноября 1997 г..
(defun duplicate-line (arg)
  "Duplicate current line, leaving point in lower line."
  (interactive "*p")
  ;; save the point for undo
  (setq buffer-undo-list (cons (point) buffer-undo-list))
  ;; local variables for start and end of line
  (let ((bol (save-excursion (beginning-of-line) (point)))
        eol)
    (save-excursion
      ;; don't use forward-line for this, because you would have
      ;; to check whether you are at the end of the buffer
      (end-of-line)
      (setq eol (point))
      ;; store the line and disable the recording of undo information
      (let ((line (buffer-substring bol eol))
            (buffer-undo-list t)
            (count arg))
        ;; insert the line arg times
        (while (> count 0)
          (newline)         ;; because there is no newline in 'line'
          (insert line)
          (setq count (1- count)))
        )
      ;; create the undo information
      (setq buffer-undo-list (cons (cons eol (point)) buffer-undo-list)))
    ) ; end-of-let
  ;; put the point in the lowest line and return
  (next-line arg))
Затем вы можете определить CTRL-D для вызова этой функции:
(global-set-key (kbd "C-d") 'duplicate-line)
Ответ 5
Вместо kill-line (C-k), как в C-a C-k C-k C-y C-y используйте kill-whole-line:
C-S-Backspace
C-y
C-y
Преимущества перед C-k включают в себя то, что не имеет значения, где точка находится на линии (в отличие от C-k, которая требует быть в начале строки), а также убивает новую строку (опять-таки что-то C-k не делает).
Ответ 6
Вот еще одна функция для этого. Моя версия не касается кольца уничтожения, и курсор заканчивается на новой строке, где он был на оригинале. Он будет дублировать регион, если он активен (режим временной метки), или по умолчанию дублирует линию в противном случае. Он также будет делать несколько копий, если задан префикс arg, и прокомментировать исходную строку, если задан отрицательный префикс arg (это полезно для тестирования другой версии команды/оператора при сохранении старой).
(defun duplicate-line-or-region (&optional n)
  "Duplicate current line, or region if active.
With argument N, make N copies.
With negative N, comment out original line and use the absolute value."
  (interactive "*p")
  (let ((use-region (use-region-p)))
    (save-excursion
      (let ((text (if use-region        ;Get region if active, otherwise line
                      (buffer-substring (region-beginning) (region-end))
                    (prog1 (thing-at-point 'line)
                      (end-of-line)
                      (if (< 0 (forward-line 1)) ;Go to beginning of next line, or make a new one
                          (newline))))))
        (dotimes (i (abs (or n 1)))     ;Insert N times, or once if not specified
          (insert text))))
    (if use-region nil                  ;Only if we're working with a line (not a region)
      (let ((pos (- (point) (line-beginning-position)))) ;Save column
        (if (> 0 n)                             ;Comment out original with negative arg
            (comment-region (line-beginning-position) (line-end-position)))
        (forward-line 1)
        (forward-char pos)))))
Я привязался к C-c d:
(global-set-key [?\C-c ?d] 'duplicate-line-or-region)
Это никогда не должно быть повторно назначено режимом или чем-либо, потому что C-c, за которым следует одна (немодифицированная) буква, зарезервирована для привязок пользователей.
Ответ 7
Добавление Nathan в ваш файл .emacs - это путь, но его можно немного упростить, заменив
  (open-line 1)
  (next-line 1)
с
  (newline)
получая
(defun duplicate-line()
  (interactive)
  (move-beginning-of-line 1)
  (kill-line)
  (yank)
  (newline)
  (yank)
)
(global-set-key (kbd "C-d") 'duplicate-line)
Ответ 8
Я не совсем помню, как дублирование строк работает в другом месте, но, как бывший пользователь SciTE, мне понравилась одна вещь о SciTE-пути: она не касается позиции курсора! Так что все рецепты выше не были достаточно хороши для меня, здесь моя версия хиппи:
(defun duplicate-line ()
    "Clone line at cursor, leaving the latter intact."
    (interactive)
    (save-excursion
        (let ((kill-read-only-ok t) deactivate-mark)
            (toggle-read-only 1)
            (kill-whole-line)
            (toggle-read-only 0)
            (yank))))
Обратите внимание: ничто не становится фактически убитым в процессе, оставляя метки и текущий выбор неповрежденными.
Кстати, почему вы, ребята, так любите подергиваться курсором, когда там эта прекрасная вещь, убивающая целую линию (C-S-backspace)?
Ответ 9
установить двойную вещь из melpa:
Mx package-install RET duplicate-вещь
и добавьте эту привязку клавиш в файл инициализации:
(global-set-key (kbd "Mc") 'duplicate-thing)
Ответ 10
потому что я не знаю, я начну этот раунд гольфа с замедленным ходом:
ctrl-k, y, y
Ответ 11
У меня есть copy-from-above-command, связанный с ключом и использующий это. Он снабжен XEmacs, но я не знаю о GNU Emacs.
`copy-from-above-command '- это интерактивная скомпилированная функция Lisp- загружен из "/usr/share/xemacs/21.4.15/lisp/misc.elc" (копирование из вышеприведенной команды и дополнительный ARG)
Документация: Копировать символы из предыдущая непустая строка, начиная с выше пункт. Скопируйте символы ARG, но а не в конце этой строки. Если нет аргумент, копировать весь отдых линии. Символы, скопированные вставлен в буфер до точки.
Ответ 12
'Я написал свою собственную версию duplicate-line, потому что я не хочу испортить убийственное кольцо.
  (defun jr-duplicate-line ()
    "EASY"
    (interactive)
    (save-excursion
      (let ((line-text (buffer-substring-no-properties
                        (line-beginning-position)
                        (line-end-position))))
        (move-end-of-line 1)
        (newline)
        (insert line-text))))
  (global-set-key "\C-cd" 'jr-duplicate-line)
Ответ 13
C-a C-k C-k C-y C-y
Ответ 14
то, что вы, возможно, захотите иметь в своем .emacs,
(setq kill-whole-line t)
Что в основном убивает всю строку плюс новую строку всякий раз, когда вы вызываете kill-line (т.е. через C-k). Затем без дополнительного кода вы можете просто создать C-c C-y C-y для дублирования строки. Он разбивается на
C-a go to beginning of line
C-k kill-line (i.e. cut the line into clipboard)
C-y yank (i.e. paste); the first time you get the killed line back; 
    second time gives the duplicated line.
Но если вы часто используете это, возможно, выделение связывания ключевых слов может быть лучшей идеей, но преимущество использования Ca Ck Cy Cy заключается в том, что вы можете дублировать строку в другом месте, а не чуть ниже текущей строки.
Ответ 15
По умолчанию это ужасно. Тем не менее, вы можете расширить Emacs для работы как SlickEdit и TextMate, то есть скопировать/вырезать текущую строку, когда не выбран текст:
(transient-mark-mode t)
(defadvice kill-ring-save (before slick-copy activate compile)
  "When called interactively with no active region, copy a single line instead."
  (interactive
   (if mark-active (list (region-beginning) (region-end))
     (message "Copied line")
     (list (line-beginning-position)
           (line-beginning-position 2)))))
(defadvice kill-region (before slick-cut activate compile)
  "When called interactively with no active region, kill a single line instead."
  (interactive
   (if mark-active (list (region-beginning) (region-end))
     (list (line-beginning-position)
           (line-beginning-position 2)))))
Поместите выше в .emacs. Затем, чтобы скопировать строку, M-w. Чтобы удалить строку, C-w. Чтобы дублировать строку, C-a M-w C-y C-y C-y ....
Ответ 16
Мне понравилась версия FraGGod, за исключением двух вещей: (1) Он не проверяет, является ли буфер уже доступным только для чтения с (interactive "*"), и (2) он не работает в последней строке буфера, если последний строка пуста (так как вы не можете убить строку в этом случае), оставив ваш буфер только для чтения.
Я сделал следующие изменения, чтобы решить следующее:
(defun duplicate-line ()
  "Clone line at cursor, leaving the latter intact."
  (interactive "*")
  (save-excursion
    ;; The last line of the buffer cannot be killed
    ;; if it is empty. Instead, simply add a new line.
    (if (and (eobp) (bolp))
        (newline)
      ;; Otherwise kill the whole line, and yank it back.
      (let ((kill-read-only-ok t)
            deactivate-mark)
        (toggle-read-only 1)
        (kill-whole-line)
        (toggle-read-only 0)
        (yank)))))
Ответ 17
С недавними emacs вы можете использовать M-w в любом месте строки, чтобы скопировать его. Так оно и делается:
M-w C-a RET C-y
Ответ 18
Я видел очень сложные решения, во всяком случае...
(defun duplicate-line ()
  "Duplicate current line"
  (interactive)
  (kill-whole-line)
  (yank)
  (yank))
(global-set-key (kbd "C-x M-d") 'duplicate-line)
Ответ 19
Существует пакет с именем Avy. Он имеет команду avy-copy-line. Когда вы используете эту команду, каждая строка в вашем окне получает комбинацию букв. Тогда вам просто нужно набрать комбинацию, и вы получите эту строку. Это также работает для региона. Тогда вам просто нужно набрать две комбинации.
Здесь вы можете увидеть интерфейс:
Ответ 20
@[Кевин Коннер]: Довольно близко, насколько я знаю. Единственное, что нужно рассмотреть, это включить kill-whole-line для включения новой строки в C-k.
Ответ 21
При вызове интерактивно без активной области COPY (Mw) вместо одной строки:
(defadvice kill-ring-save (before slick-copy activate compile)
  "When called interactively with no active region, COPY a single line instead."
  (interactive
   (if mark-active (list (region-beginning) (region-end))
     (message "Copied line")
     (list (line-beginning-position)
           (line-beginning-position 2)))))
При вызове интерактивно без активной области вместо KILL (Cw) используется одна строка.
(defadvice kill-region (before slick-cut activate compile)
  "When called interactively with no active region, KILL a single line instead."
  (interactive
   (if mark-active (list (region-beginning) (region-end))
     (message "Killed line")
     (list (line-beginning-position)
           (line-beginning-position 2)))))
Кроме того, по соответствующей заметке:
(defun move-line-up ()
  "Move up the current line."
  (interactive)
  (transpose-lines 1)
  (forward-line -2)
  (indent-according-to-mode))
(defun move-line-down ()
  "Move down the current line."
  (interactive)
  (forward-line 1)
  (transpose-lines 1)
  (forward-line -1)
  (indent-according-to-mode))
(global-set-key [(meta shift up)]  'move-line-up)
(global-set-key [(meta shift down)]  'move-line-down)
Ответ 22
ctrl - k, ctrl - k, (позиция для нового местоположения) ctrl - y
Добавьте ctrl - a, если вы не начинаете в начале строки. И второй ctrl - k должен захватить символ новой строки. Его можно удалить, если вы просто хотите текст.
Ответ 23
Я пишу один для своих предпочтений.
(defun duplicate-line ()
  "Duplicate current line."
  (interactive)
  (let ((text (buffer-substring-no-properties (point-at-bol) (point-at-eol)))
        (cur-col (current-column)))
    (end-of-line) (insert "\n" text)
    (beginning-of-line) (right-char cur-col)))
(global-set-key (kbd "C-c d l") 'duplicate-line)
Но я обнаружил, что у этой проблемы будет некоторая проблема, если текущая строка содержит многобайтные символы (например, символы CJK). Если вы столкнулись с этой проблемой, попробуйте это вместо:
(defun duplicate-line ()
  "Duplicate current line."
  (interactive)
  (let* ((text (buffer-substring-no-properties (point-at-bol) (point-at-eol)))
         (cur-col (length (buffer-substring-no-properties (point-at-bol) (point)))))
    (end-of-line) (insert "\n" text)
    (beginning-of-line) (right-char cur-col)))
(global-set-key (kbd "C-c d l") 'duplicate-line)
Ответ 24
Эта функциональность должна соответствовать реализации JetBrains с точки зрения дублирования как по линии, так и по региону, а затем оставляя точку и/или активную область как ожидалось:
Просто оберните вокруг интерактивной формы:
(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)))
Что вызывает это,
(defun wrx/duplicate-region-in-buffer (beg end)
  "copy and duplicate context of current active region
   |------------------------+----------------------------|
   |        before          |           after            |
   |------------------------+----------------------------|
   | first <MARK>line here  | first line here            |
   | second item<POINT> now | second item<MARK>line here |
   |                        | second item<POINT> now     |
   |------------------------+----------------------------|
   TODO: Acts funky when point < mark"
  (set-mark-command nil)
  (insert (buffer-substring beg end))
  (setq deactivate-mark nil))
Или это
(defun wrx/duplicate-line-in-buffer ()
  "Duplicate current line, maintaining column position.
   |--------------------------+--------------------------|
   |          before          |          after           |
   |--------------------------+--------------------------|
   | lorem ipsum<POINT> dolor | lorem ipsum dolor        |
   |                          | lorem ipsum<POINT> 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))
И тогда у меня есть эта привязка к мета + сдвигу + d
(global-set-key (kbd "M-D") 'wrx/duplicate-line-or-region)
Ответ 25
С аргументами префикса и тем, что (я надеюсь) интуитивное поведение:
(defun duplicate-line (&optional arg)
  "Duplicate it. With prefix ARG, duplicate ARG times."
  (interactive "p")
  (next-line 
   (save-excursion 
     (let ((beg (line-beginning-position))
           (end (line-end-position)))
       (copy-region-as-kill beg end)
       (dotimes (num arg arg)
         (end-of-line) (newline)
         (yank))))))
Курсор останется на последней строке. Кроме того, вы можете указать префикс для дублирования следующих нескольких строк сразу:
(defun duplicate-line (&optional arg)
  "Duplicate it. With prefix ARG, duplicate ARG times."
  (interactive "p")
  (save-excursion 
    (let ((beg (line-beginning-position))
          (end 
           (progn (forward-line (1- arg)) (line-end-position))))
      (copy-region-as-kill beg end)
      (end-of-line) (newline)
      (yank)))
  (next-line arg))
Я использую оба часто, используя функцию-оболочку, чтобы переключать поведение аргумента префикса.
И привязка клавиш:
(global-set-key (kbd "C-S-d") 'duplicate-line)
Ответ 26
;; http://www.emacswiki.org/emacs/WholeLineOrRegion#toc2
;; cut, copy, yank
(defadvice kill-ring-save (around slick-copy activate)
  "When called interactively with no active region, copy a single line instead."
  (if (or (use-region-p) (not (called-interactively-p)))
      ad-do-it
    (kill-new (buffer-substring (line-beginning-position)
                                (line-beginning-position 2))
              nil '(yank-line))
    (message "Copied line")))
(defadvice kill-region (around slick-copy activate)
  "When called interactively with no active region, kill a single line instead."
  (if (or (use-region-p) (not (called-interactively-p)))
      ad-do-it
    (kill-new (filter-buffer-substring (line-beginning-position)
                                       (line-beginning-position 2) t)
              nil '(yank-line))))
(defun yank-line (string)
  "Insert STRING above the current line."
  (beginning-of-line)
  (unless (= (elt string (1- (length string))) ?\n)
    (save-excursion (insert "\n")))
  (insert string))
(global-set-key (kbd "<f2>") 'kill-region)    ; cut.
(global-set-key (kbd "<f3>") 'kill-ring-save) ; copy.
(global-set-key (kbd "<f4>") 'yank)           ; paste.
добавьте elisp выше к вам init.el, и теперь вы можете вырезать/скопировать всю линейную функцию, тогда вы можете F3 F4 дублировать строку.
Ответ 27
Самый простой способ - метод Криса Конвей.
C-a C-SPACE C-n M-w C-y
Это метод по умолчанию, заданный EMACS. По-моему, лучше использовать стандарт. Я всегда стараюсь настроить собственную привязку ключей в EMACS. EMACS уже достаточно мощная, я думаю, что мы должны приложить все усилия, чтобы адаптироваться к своим ключевым привязкам.
Хотя он немного длинный, но когда вы привыкли к нему, вы можете быстро и найти это весело!
Ответ 28
 Здесь функция для дублирования текущей строки. С аргументами префикса он будет дублировать строку несколько раз. Например, C-3 CSo будет дублировать текущую строку три раза. Не меняет кольцо убийства.
(defun duplicate-lines (arg)
  (interactive "P")
  (let* ((arg (if arg arg 1))
         (beg (save-excursion (beginning-of-line) (point)))
         (end (save-excursion (end-of-line) (point)))
         (line (buffer-substring-no-properties beg end)))
    (save-excursion
      (end-of-line)
      (open-line arg)
      (setq num 0)
      (while (< num arg)
        (setq num (1+ num))
        (forward-line 1)
        (insert-string line))
      )))
(global-set-key (kbd "C-S-o") 'duplicate-lines)
Ответ 29
Я не могу поверить всем этим сложным решениям. Это два нажатия клавиши:
 <C-S-backspace> запускает команду kill-whole-line
 C-/ команду
 Таким образом, <C-S-backspace> C-/ "копировать" целую строку (убить и отменить).
Разумеется, вы можете комбинировать это с числовыми и отрицательными аргументами, чтобы убить несколько строк вперед или назад.
Ответ 30
Это кажется более естественным, в отношении выбранного ответа Криса Конвей.
(глобальный набор-ключ "\ C- c\C- d" "\ C- a\C-\C- n\Mw\C- y\C- p\C- e ")
Это позволяет дублировать строку несколько раз, просто повторяя нажатия клавиш C- c\C- d.

