30 ответов:
Я использую
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: paste ("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")(версия elisp@Nathan, вероятно, предпочтительнее, потому что она не сломается, если какая-либо из Привязок клавиш будет изменена.)
осторожно: некоторые режимы Emacs могут восстановить
C-c C-dсделать что-то еще.
в дополнение к предыдущим ответам вы также можете определить свою собственную функцию для дублирования строки. Например, помещая следующее в свой .файл 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)
поместите курсор на строку, если не в начале сделать CTRL -A, тогда:
CTRL -K
CTRL -K
CTRL -Y
CTRL -Y
моя версия функции для дублирования строки, которая хорошо работает с отменой и не связывается с позицией курсора. Это было результатом обсуждение в gnu.в Emacs.источники с ноября 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)
вместо
kill-line(C-k) какC-aC-kC-kC-yC-yиспользоватьkill-whole-line:C-S-Backspace C-y C-yпреимущества
C-kвключить, что он не имеет значения, где точка находится на линии (в отличие отC-kкоторый требует быть в начале строки), а также убивает новую строку (опять что-тоC-kне делать).
вот еще одна функция для этого. Моя версия не касается кольца убийства, и курсор заканчивается на новой строке, где он был на оригинале. Он будет дублировать область, если она активна (режим переходной метки), или по умолчанию дублировать линию в противном случае. Он также сделает несколько копий, если задан префикс 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после чего одна (немодифицированная) буква зарезервирована для пользовательских Привязок.
дополнение Натана к вашему .файл 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)
Я не совсем помню, как дублирование строк работает в другом месте, но как бывший пользователь 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))))обратите внимание, что ничто не убивается в процессе, оставляя метки и текущий выбор нетронутыми.
кстати, почему вы, ребята, так любите дергать курсор вокруг, когда есть эта хорошая n'Clean kill-whole-line вещь (C-S-backspace)?
установить дубликат-вещь из melpa
и добавьте эту привязку клавиш:
(global-set-key (kbd "M-c") ' duplicate-thing)
У меня есть
copy-from-above-commandпривязан к ключу и использовать его. Он снабжен XEmacs, но я не знаю о GNU Emacs.'copy-from-above-command' является интерактивные компиляции Lisp-функция
-- загружено из " / usr/share/xemacs/21.4.15/lisp / misc.elc" (копировать-сверху-команда & необязательно ARG)документы: копировать персонажей из предыдущая непустая строка, начиная просто вышеуказанные пункты. Скопируйте символы ARG, но не прошло и конца из этой линии. Если нет аргумент дан, скопируйте все остальное линейный. Скопированные символы являются вставляется в буфер перед точкой.
что-то вы, возможно, захотите иметь в своем .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 заключается в том, что вы можете дублировать строку в другом месте, вместо этого чуть ниже текущей линии.
настройки по умолчанию ужасны для этого. Однако вы можете расширить 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 ....
' Я написал свою собственную версию
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)
С последними emacs, вы можете использовать M-w в любом месте строки, чтобы скопировать его. Так оно и становится:
M-w C-a RET C-y
Я видел очень сложные решения, во всяком случае...
(defun duplicate-line () "Duplicate current line" (interactive) (kill-whole-line) (yank) (yank)) (global-set-key (kbd "C-x M-d") 'duplicate-line)
есть пакет под названием Avy Он имеет команду avy-copy-line. Когда вы используете эту команду, каждая строка в вашем окне получает комбинацию букв. Тогда вам просто нужно ввести комбинацию, и вы получите эту строку. Это также работает для региона. Тогда вам просто нужно ввести две комбинации.
здесь вы можете увидеть интерфейс:
@[Kevin Conner]: довольно близко, насколько я знаю. Единственное, что нужно учитывать, это включение
kill-whole-lineчтобы включить новую строку в C-k.
мне понравилась версия 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)))))
при вызове в интерактивном режиме без активной области, скопируйте (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)))))при вызове в интерактивном режиме без активной области, убить (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)
ctrl -k,ctrl -k, (позиция на новое место) ctrl -y
добавить ctrl -a Если вы не начинаете в начале строки. А 2-й ctrl -k это захватить символ новой строки. Он может быть удален, если вы просто хотите, чтобы текст.
Я пишу один для моих предпочтений.
(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)
С префиксными аргументами, и что такое (я надеюсь) интуитивное поведение:
(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)
;; 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, чтобы дублировать линию.
самый простой способ-это метод Криса Конвея.
C-a C-SPACE C-n M-w C-yэто способ по умолчанию, предусмотренный EMACS. На мой взгляд, лучше использовать стандартные. Я всегда внимательно отношусь к настройке собственной привязки ключей в EMACS. EMACS уже достаточно мощный, я думаю, что мы должны стараться изо всех сил адаптироваться к своим собственным привязкам ключей.
хотя это немного длинно, но когда вы привыкнете к нему, вы можете сделать быстро и найдете это весело!
эта функциональность должна соответствовать реализации 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))и тогда у меня это связано с meta + shift+d
(global-set-key (kbd "M-D") 'wrx/duplicate-line-or-region)
вот функция для копирования текущей строки. С префиксными аргументами он будет дублировать строку несколько раз. Например,
C-3 C-S-oбудет дублировать текущую строку три раза. Не меняет кольцо убийства.(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)
Я не могу поверить, что все эти сложные решения. Это два нажатия клавиш:
<C-S-backspace>запускает команду kill-whole-line
C-/запускает команду undoТак
<C-S-backspace> C-/чтобы "скопировать" всю строку (убить и отменить).вы можете, конечно, объединить это с числовыми и отрицательными аргументами, чтобы убить несколько строк вперед или назад.
ну я обычно использовал:
Ctl-Space (set the mark) move to end of line Ctl-K kill line Ctl-Y * 2 (yank the line back)может быть гораздо лучший способ, хотя: P
Comments