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

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

Ответы [ 33 ]

4 голосов
/ 03 октября 2008

У меня есть copy-from-above-command привязанный к ключу и использую его. Он поставляется с XEmacs, но я не знаю о GNU Emacs.

команда «копировать из-над-» интерактивная скомпилированная функция Lisp
- загружено из "/usr/share/xemacs/21.4.15/lisp/misc.elc" (команда "скопировать сверху" и необязательно ARG)

Документация: Копирование символов из предыдущая непустая строка , начиная только выше точки. Скопируйте символы ARG, но не за концом этой линии. Если нет аргумент дан, скопируйте весь остальной линии. Скопированные символы вставляется в буфер перед точкой.

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

потому что я не знаю, я начну этот раунд игры в гольф с медленным шаром

ctrl-k, y, y

3 голосов
/ 21 мая 2009

Значения по умолчанию ужасны для этого. Однако вы можете расширить 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 ....

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

то, что вы можете захотеть иметь в вашем .emacs, это

(setq kill-whole-line t)

Который в основном убивает всю строку плюс новую строку всякий раз, когда вы вызываете kill-line (т.е. через C-k). Тогда без лишнего кода вы можете просто сделать C-a C-k 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.

Но если вы используете это часто, то, возможно, лучше было бы использовать выделенную привязку клавиш, но преимущество простого использования C-a C-k C-y C-y в том, что вы можете дублировать строку в другом месте, а не чуть ниже текущей строки.

3 голосов
/ 18 сентября 2008
C-a C-k C-k C-y C-y
3 голосов
/ 09 июля 2010

Мне понравилась версия 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)))))
3 голосов
/ 01 декабря 2016

Существует пакет с именем Avy Он имеет команду avy-copy-line. Когда вы используете эту команду, каждая строка в вашем окне получает комбинацию букв. Тогда вам просто нужно набрать комбинацию, и вы получите эту строку. Это также работает для региона. Тогда вам просто нужно набрать две комбинации.

Здесь вы можете увидеть интерфейс:

http://i68.tinypic.com/24fk5eu.png

3 голосов
/ 12 июля 2016

Я видел очень сложные решения, так или иначе ...

(defun duplicate-line ()
  "Duplicate current line"
  (interactive)
  (kill-whole-line)
  (yank)
  (yank))
(global-set-key (kbd "C-x M-d") 'duplicate-line)
3 голосов
/ 27 ноября 2013

В последних версиях Emacs вы можете использовать M-w в любом месте строки, чтобы скопировать его. Так и становится:

M-w C-a RET C-y
2 голосов
/ 22 июня 2015

При интерактивном вызове без активной области, COPY (M-w) вместо одной строки:

(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 (C-w) вместо одной строки.

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