Как мне продублировать целую строку в Emacs? - PullRequest
144 голосов
/ 18 сентября 2008

Я видел этот же вопрос для VIM , и я хотел узнать, как это сделать для Emacs. В ReSharper я использую CTRL-D для этого действия. Какое наименьшее количество команд для выполнения этого в Emacs?

Ответы [ 33 ]

140 голосов
/ 18 сентября 2008

Я использую

C-a C-SPACE C-n M-w C-y

, который разбивается на

  • C-a: переместить курсор в начало строки
  • C-SPACE: начать выбор («установить отметку»)
  • C-n: переместить курсор на следующую строку
  • M-w: копировать регион
  • C-y: паста ("янки")

Вышеупомянутый

C-a C-k C-k C-y C-y

равносильно одному и тому же (TMTOWTDI)

  • C-a: переместить курсор в начало строки
  • C-k: вырезать («убить») строку
  • C-k: вырезать новую строку
  • C-y: паста ("дергать") (мы вернулись на круги своя)
  • 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")

(@ elisp-версия Натана, вероятно, предпочтительнее, потому что она не сломается при изменении какой-либо из привязок клавиш.)

Осторожно: некоторые режимы Emacs могут восстанавливать C-c C-d, чтобы делать что-то еще.

93 голосов
/ 18 сентября 2008

В дополнение к предыдущим ответам вы также можете определить свою собственную функцию для дублирования строки. Например, если в файле .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)
60 голосов
/ 18 сентября 2008

Поместите курсор на строку, если не в начале, сделайте CTRL - A , затем:

CTRL K

CTRL K

CTRL Y

CTRL Y

52 голосов
/ 16 июня 2009

Моя версия функции для дублирования строки, которая хорошо работает с отменой и не портит позицию курсора. Это стало результатом обсуждения в 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)
43 голосов
/ 08 июля 2010

Вместо 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 не делает ).

25 голосов
/ 17 января 2011

Вот еще одна функция для этого. Моя версия не касается списка уничтожений, и курсор оказывается на новой строке, где он был на оригинале. Он будет дублировать регион, если он активен (режим переходной метки), или по умолчанию дублирует строку в противном случае. Он также сделает несколько копий, если ему присваивается префиксный аргумент, и закомментирует исходную строку, если задан аргумент с отрицательным префиксом (это полезно для тестирования другой версии команды / оператора при сохранении старой).

(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, за которым следует одна (неизмененная) буква, зарезервирована для пользовательских привязок.

16 голосов
/ 15 февраля 2009

Добавим Натана в ваш файл .emacs, но его можно немного упростить, заменив

  (open-line 1)
  (next-line 1)

с

  (newline)

* 1007 получая *

(defun duplicate-line()
  (interactive)
  (move-beginning-of-line 1)
  (kill-line)
  (yank)
  (newline)
  (yank)
)
(global-set-key (kbd "C-d") 'duplicate-line)
5 голосов
/ 06 июня 2009

Я не совсем помню, как дублирование строк работает где-то еще, но как бывший пользователь SciTE мне понравилась одна вещь в SciTE-way: она не касается позиции курсора! Так что мне не хватило всех получателей выше, вот моя хиппи-версия:

(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)?

5 голосов
/ 27 сентября 2014

установка дубликата из melpa:

M-x package-install RET duplicate-thing

и добавьте эту привязку клавиш в файл инициализации :

(global-set-key (kbd "M-c") 'duplicate-thing)

4 голосов
/ 30 июня 2009

'Я написал свою собственную версию 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)
...