Как мне продублировать целую строку в Emacs?

Python не предоставляет многоплатформенное решение из коробки. Если вы находитесь в Windows, вы можете попробовать msvcrt с помощью:

import msvcrt
print 'Press s or n to continue:\n'
input_char = msvcrt.getch()
if input_char.upper() == 'S': 
   print 'YES'

144
задан Community 23 May 2017 в 11:54
поделиться

19 ответов

Я использую

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

, который ломается к [1 130]

  • 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: вставьте снова (теперь, у нас есть две копии строки)

, Они являются оба смущающе подробными по сравнению с [1 113] в Вашем редакторе, но в Emacs всегда существует настройка. C-d связывается с [1 115] по умолчанию, таким образом, как насчет [1 116]? Просто добавьте следующее к Вашему .emacs:

(global-set-key "\C-c\C-d" "\C-a\C- \C-n\M-w\C-y")

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

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

140
ответ дан Chris Conway 23 May 2017 в 11:54
поделиться

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

'copy-from-above-command' является интерактивной скомпилированной функцией Lisp
- загруженный из "/usr/share/xemacs/21.4.15/lisp/misc.elc" (copy-from-above-command & дополнительный АРГУМЕНТ)

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

4
ответ дан Török Gábor 23 May 2017 в 11:54
поделиться

хорошо я обычно использовал:

Ctl-Space (set the mark)
move to end of line
Ctl-K kill line
Ctl-Y * 2 (yank the line back)

может быть намного лучший путь хотя: P

-1
ответ дан Arthur Thomas 23 May 2017 в 11:54
поделиться

ctrl - k , ctrl - k , (положение к новому местоположению) ctrl - y

Добавляют ctrl - , если Вы не запускаете в начале строки. И 2-е ctrl - k должно захватить символ новой строки. Это может быть удалено, если Вы просто хотите текст.

1
ответ дан Hulk1991 23 May 2017 в 11:54
поделиться

В дополнение к предыдущим ответам можно также определить собственную функцию для дублирования строки. Например, помещение следующего в Вашем .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)
93
ответ дан Nate 23 May 2017 в 11:54
поделиться

[Kevin Conner]: Достаточно близкий, насколько я знаю. Единственная другая вещь рассмотреть включает kill-whole-line для включения новой строки в C-k.

2
ответ дан Allen 23 May 2017 в 11:54
поделиться
C-a C-k C-k C-y C-y
3
ответ дан sverrejoh 23 May 2017 в 11:54
поделиться
  • 1
    @JustBasti необходимо отметить его как ответ тогда. – Lukas Knuth 12 May 2013 в 00:50

Установите курсор на строку, если не вначале делают CTRL - , то:

CTRL - K

CTRL - K

CTRL - Y

CTRL - Y

60
ответ дан Hulk1991 23 May 2017 в 11:54
поделиться

потому что я не знаю, я запущу эту партию в гольф с slowball:

ctrl-k, y, y

4
ответ дан Kevin Conner 23 May 2017 в 11:54
поделиться
  • 1
    Уже мысль it' d быть чем-то немым. You' ve, доказанный это; P Ty – JustBasti 11 May 2013 в 15:09

Дополнение 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)
16
ответ дан pw. 23 May 2017 в 11:54
поделиться

что-то, что Вы могли бы хотеть иметь в своем .emacs,

(setq kill-whole-line t)

, Который в основном уничтожает всю строку плюс новая строка каждый раз, когда Вы вызываете уничтожать-строку (т.е. через 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
ответ дан polyglot 23 May 2017 в 11:54
поделиться

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

3
ответ дан 23 November 2019 в 22:21
поделиться

Я не совсем помню, как дублирование строк работает где-либо еще, но как бывший пользователь 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))))

Обратите внимание, что на самом деле ничего не убивается в процессе, оставляя отметки и текущий выбор нетронутыми.

Кстати, почему вы так любите подергивания курсор вокруг, когда есть эта приятная штука, убивающая целую строку (CS-backspace)?

5
ответ дан 23 November 2019 в 22:21
поделиться

Моя версия функции для дублирования строки, которая хорошо работает с отменой и не влияет на положение курсора. Это результат обсуждения в 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)
51
ответ дан 23 November 2019 в 22:21
поделиться

«Я написал свою собственную версию 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)
4
ответ дан 23 November 2019 в 22:21
поделиться

Вместо kill-line ( Ck ), как в Ca Ck Ck Cy Cy , используйте kill-all-line команда:

C-S-Backspace
C-y
C-y

Преимущества перед Ck заключаются в том, что не имеет значения, где находится точка в строке (в отличие от Ck , который требует наличия в начале строки), а также уничтожает новую строку (опять же, что-то Ck не работает).

44
ответ дан 23 November 2019 в 22:21
поделиться

Мне понравилась версия FraGGod, за исключением двух вещей: (1) она не проверяет, является ли буфер уже доступным только для чтения с помощью (интерактивный "*") , и (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
ответ дан 23 November 2019 в 22:21
поделиться

С аргументами префикса и (я надеюсь) интуитивным поведением:

(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") ')

0
ответ дан 23 November 2019 в 22:21
поделиться

При использовании Spacemacs можно просто использовать duplicate-line-or-region, связанный с:

SPC x l d 
0
ответ дан 23 November 2019 в 22:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: