Bagaimana cara menduplikasi seluruh baris di Emacs?

Jawaban:

150

saya menggunakan

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

yang terurai menjadi

  • C-a: gerakkan kursor untuk memulai baris
  • C-SPACE: mulai seleksi ("setel tanda")
  • C-n: pindahkan kursor ke baris berikutnya
  • M-w: wilayah copy
  • C-y: paste ("yank")

Yang disebutkan di atas

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

sama dengan jumlah yang sama (TMTOWTDI)

  • C-a: gerakkan kursor untuk memulai baris
  • C-k: cut ("kill") baris
  • C-k: potong baris baru
  • C-y: paste ("yank") (kami kembali di titik awal)
  • C-y: paste lagi (sekarang kami punya dua salinan dari baris)

Keduanya sama-sama memalukan dibandingkan dengan C-ddi editor Anda, tetapi di Emacs selalu ada penyesuaian. C-dterikat delete-charsecara default, jadi bagaimana C-c C-d? Tambahkan saja yang berikut ke .emacs:

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

(Versi elisp dari Nathan mungkin lebih disukai, karena itu tidak akan rusak jika ada binding kunci yang diubah.)

Hati-hati: beberapa mode Emacs dapat mengklaim kembali C-c C-duntuk melakukan sesuatu yang lain.

Chris Conway
sumber
5
Hai! Ketahuilah bahwa jika Anda memiliki '(setq kill-whole-line t)' Anda hanya perlu satu 'Ck' (solusi 2) karena sudah membunuh baris baru bersama dengan isi baris. Saya lebih suka menggunakan 'C-k'. Cheers, Daniel
danielpoe
179
Ini benar-benar memalukan.
tofutim
18
Bagaimana dengan C-S-backspace C-y C-y?
ericzma
1
apa itu Mw? kunci mana yang digunakan untuk itu?
Bala
4
@Bala "M" adalah "Meta" (biasanya Esc atau Alt, itu tergantung pada tata letak keyboard Anda). "Mw" adalah "Meta" dan "w" secara bersamaan (di keyboard saya, "Alt-w").
Chris Conway
96

Selain jawaban sebelumnya, Anda juga dapat menentukan fungsi Anda sendiri untuk menduplikasi baris. Misalnya, meletakkan berikut ini di file .emacs Anda akan membuat Cd menduplikasi baris saat ini.

(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)
Nate
sumber
Saya mendapatkan kesalahan berikut dengan ini:Symbol's function definition is void: move-beginning-of-line
Rohaq
5
Masalah dengan ini adalah bahwa kunci "Del" juga diikat untuk menduplikasi baris ...
David Gomes
Jadi, ada ide tentang cara melepaskan ikatan Deldari fungsi ini?
Alexander Shcheblikin
OK, menemukan solusi untuk Delkembali ke normal sambil mempertahankan yang baru C-d: (global-set-key (kbd "<delete>") 'delete-char)perlu ditambahkan setelah C-ddefinisi.
Alexander Shcheblikin
Mencoba itu pada baris kosong menghasilkan memasukkan dua baris, bukan hanya satu. Saya tidak tahu kenapa. Apakah ada perbaikan yang mudah?
Zelphir Kaltstahl
68

Tempatkan kursor on line, jika tidak di awal lakukan a CTRL- A, maka:

CTRL-K

CTRL-K

CTRL-Y

CTRL-Y

epatel
sumber
Saya pikir CY kedua tidak diperlukan.
Bastien Léonard
4
itu tidak akan menjadi duplikat tanpa
epatel
17
Gunakan CS-Backspace (kill-whole-line) alih-alih Ck. Anda tidak perlu mengacaukan dengan posisi kursor atau membunuh baris baru.
Nietzche-jou
Ini bekerja dengan baik tetapi tidak ada cara pendek untuk melakukan ini?
Stryker
52

Versi saya dari suatu fungsi untuk menduplikasi baris yang berfungsi baik dengan undo dan tidak mengacaukan posisi kursor. Itu adalah hasil diskusi di gnu.emacs.sources dari November 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))

Kemudian Anda dapat mendefinisikan CTRL-D untuk memanggil fungsi ini:

(global-set-key (kbd "C-d") 'duplicate-line)
pesche
sumber
Luar biasa! Fitur batalkan dan posisi kursor menjadikan ini yang terbaik. Terima kasih!
ptrn
juga, di tautan ada beberapa kode untuk daerah juga!
pcarvalho
Solusi yang sangat bagus Thx
Plankalkül
Bagus sekali. Terima kasih atas solusinya.
Stryker
@pesche crux-duplicate-current-line-or-regionbekerja lebih baik untuk saya, karena dengan fungsi Anda membatalkan duplikasi baris dan operasi terakhir juga
rofrol
47

Alih-alih kill-line( C-k) seperti dalam C-a C-k C-k C-y C-y menggunakan kill-whole-lineperintah:

C-S-Backspace
C-y
C-y

Keuntungan lebih dari C-ktermasuk bahwa tidak masalah di mana titik berada di jalur (tidak seperti C-kyang mengharuskan berada di awal baris) dan juga membunuh baris baru (sekali lagi sesuatu C-ktidak dilakukan).

sinar
sumber
2
Kudos @RayVega! Saya mencoba solusi ini dan berfungsi seperti jagoan (dalam GNU Emacs 23.3.1 saya, toh). Apakah solusi ini tidak berfungsi untuk sebagian orang? Ini adalah jawaban terbaik untuk pertanyaan Anda (sendiri).
JS.
1
Anda harus menerima jawaban ini sebagai jawaban yang benar. Itu tidak persis apa yang Anda minta, dan dalam "jumlah perintah paling sedikit".
Davor Cubranic
24

Inilah fungsi lain untuk melakukan ini. Versi saya tidak menyentuh cincin bunuh, dan kursor berakhir di baris baru di mana itu pada aslinya. Ini akan menggandakan wilayah jika itu aktif (mode tanda sementara), atau default untuk menduplikasi garis sebaliknya. Ini juga akan membuat banyak salinan jika diberi awalan arg, dan mengomentari baris asli jika diberi awalan arg negatif (ini berguna untuk menguji versi yang berbeda dari perintah / pernyataan sambil mempertahankan yang lama).

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

Saya terikat untuk C-c d:

(global-set-key [?\C-c ?d] 'duplicate-line-or-region)

Ini tidak boleh ditugaskan kembali oleh mode atau apa pun karena C-cdiikuti oleh satu huruf (tidak dimodifikasi) dicadangkan untuk binding pengguna.

qmega
sumber
Solusi terbaik sejauh ini
Leo Ufimtsev
1
Saya meletakkan ini di file .emacs saya, tetapi ketika saya mencoba menggunakan C-c dsaya mendapatkan kesalahan command-execute: Wrong type argument: commandp, duplicate-line-or-region. Ada yang tahu ada apa? Saya menggunakan Emacs 25.1.1 di Windows
junius
Solusi yang sangat bagus, saya menghargai fitur kawasan dan fitur komentar-dengan-negatif-argumen. Juga suka mengikat kunci yang disarankan.
Alex Trueman
18

Penambahan Nathan ke file .emacs Anda adalah cara yang harus dilakukan tetapi bisa disederhanakan sedikit dengan mengganti

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

dengan

  (newline)

menghasilkan

(defun duplicate-line()
  (interactive)
  (move-beginning-of-line 1)
  (kill-line)
  (yank)
  (newline)
  (yank)
)
(global-set-key (kbd "C-d") 'duplicate-line)
pw.
sumber
Ini bagus. Terima kasih!
tejasbubane
7

instal duplikat dari melpa:

Mx paket-instal RET duplikat-hal

dan tambahkan pengikat kunci ini ke file init :

(duplikat-global-set-key (kbd "Mc") ')

extrav
sumber
Sepertinya tidak ada tanggal ini.
MarkSkayff
5

Saya tidak begitu ingat bagaimana duplikasi garis bekerja di tempat lain, tetapi sebagai mantan pengguna SciTE saya menyukai satu hal tentang SciTE-way: itu tidak menyentuh posisi kursor! Jadi semua penerima di atas tidak cukup baik untuk saya, inilah versi hippie saya:

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

Perhatikan bahwa tidak ada yang benar-benar terbunuh dalam proses, meninggalkan tanda dan pilihan saat ini utuh.

BTW, mengapa kalian sangat suka menyentak kursor ketika ada nice'n'clean kill-seluruh-line thingy (CS-backspace)?

mk-fg
sumber
4

karena saya tidak tahu, saya akan memulai putaran golf ini dengan slowball:

ctrl-k, y, y

Kevin Conner
sumber
4

sesuatu yang Anda mungkin ingin miliki di .emacs Anda

(setq kill-whole-line t)

Yang pada dasarnya membunuh seluruh baris plus baris baru setiap kali Anda memanggil kill-line (yaitu via Ck). Kemudian tanpa kode tambahan, Anda bisa melakukan Ca Ck Cy Cy untuk menduplikasi baris. Itu rusak menjadi

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.

Tetapi jika Anda sering menggunakan ini maka mungkin pengikatan kunci khusus mungkin merupakan ide yang lebih baik, tetapi keuntungan dari hanya menggunakan Ca Ck Cy Cy adalah Anda dapat menduplikasi baris di tempat lain, bukan hanya di bawah garis saat ini.

poliglot
sumber
4

Saya telah copy-from-above-commandterikat pada kunci dan menggunakannya. Ini disediakan dengan XEmacs, tapi saya tidak tahu tentang GNU Emacs.

`copy-from-above-command 'adalah fungsi Lisp interaktif yang dikompilasi
- diambil dari" /usr/share/xemacs/21.4.15/lisp/misc.elc "(salin dari perintah di atas & ARG opsional)

Dokumentasi: Salin karakter dari baris nonblank sebelumnya , mulai tepat di atas titik. Salin karakter ARG, tetapi tidak melewati akhir baris itu. Jika tidak ada argumen yang diberikan, salin seluruh baris. Karakter yang disalin dimasukkan dalam buffer sebelum titik.

Darron
sumber
Sedangkan untuk versi 23, itu adalah bagian dari distribusi GNU Emacs standar juga.
viam0Zah
Sepertinya tidak ada dalam versi saya. Apakah ada sesuatu yang harus dimuat? Versi saya adalah GNU Emacs 23.2.1 (amd64-portbld-freebsd8.1) of 2010-11-14 on [host clipped].
qmega
2
@ qmega Yang perlu Anda lakukan (memerlukan 'misc).
Dmitry
4

Ada paket yang disebut Avy Ini memiliki perintah avy-copy-line. Saat Anda menggunakan perintah itu, setiap baris di jendela Anda mendapat kombinasi huruf. Maka Anda hanya perlu mengetikkan kombinasi dan Anda mendapatkan garis itu. Ini juga berfungsi untuk wilayah. Maka Anda hanya perlu mengetikkan dua kombinasi.

Di sini Anda dapat melihat antarmuka:

masukkan deskripsi gambar di sini

teksturi
sumber
3
C-a C-k C-k C-y C-y
sverrejoh
sumber
3

Defaultnya mengerikan untuk ini. Namun, Anda dapat memperluas Emacs agar berfungsi seperti SlickEdit dan TextMate, yaitu, salin / potong baris saat ini ketika tidak ada teks yang dipilih:

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

Tempatkan di atas .emacs. Kemudian, untuk menyalin garis M-w,. Untuk menghapus garis C-w,. Untuk menggandakan garis C-a M-w C-y C-y C-y ...,.

Marius Andersen
sumber
3

'Saya menulis versi saya sendiri duplicate-line, karena saya tidak ingin mengacaukan cincin pembunuhan.

  (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)
Joyer
sumber
3

Saya menyukai versi FraGGod, kecuali untuk dua hal: (1) Tidak memeriksa apakah buffer sudah hanya-baca (interactive "*"), dan (2) gagal pada baris terakhir buffer jika baris terakhir kosong (seperti Anda tidak dapat mematikan baris dalam kasus ini), membuat buffer Anda hanya-baca.

Saya membuat perubahan berikut untuk menyelesaikannya:

(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)))))
phils
sumber
3

Dengan emacs terbaru, Anda dapat menggunakan Mw di mana saja di baris untuk menyalinnya. Jadi itu menjadi:

M-w C-a RET C-y
Louis Kottmann
sumber
Betulkah? Emacs "baru" apa itu? Tidak halnya dengan 24.4: Anda mendapatkan "Tanda tidak diatur sekarang, jadi tidak ada wilayah."
Davor Cubranic
Emacs saat ini adalah 24,5, dan M-wterikat pada easy-kill. Periksa itu yang Anda dapatkan saat melakukannyaC-h c M-w
Louis Kottmann
Tidak bekerja di Emacs 24.5.1. Hanya disalin dari awal baris ke titik di awal baris yang sama setelah memasukkan baris kosong sebelumnya.
Derek Mahar
3

Saya melihat solusi yang sangat kompleks, ...

(defun duplicate-line ()
  "Duplicate current line"
  (interactive)
  (kill-whole-line)
  (yank)
  (yank))
(global-set-key (kbd "C-x M-d") 'duplicate-line)
pengguna6581334
sumber
Perhatikan bahwa ini akan mengacaukan ring pembunuhan.
Dodgie
Ini menambahkan baris ke dirinya sendiri ketika itu adalah baris terakhir dan file tidak berakhir pada baris baru
Mark
2

@ [Kevin Conner]: Cukup dekat, sejauh yang saya tahu. Satu-satunya hal lain yang perlu dipertimbangkan adalah menyalakan kill-whole-lineuntuk memasukkan baris baru dalam Ck.

Allen
sumber
@ Allen: hapus [dan ]in@[Kevin Conner]
jfs
2

ctrl- k, ctrl- k, (posisi ke lokasi baru) ctrl-y

Tambahkan ctrl- ajika Anda tidak memulai di awal baris. Dan yang kedua ctrl- kadalah untuk mengambil karakter baris baru. Itu dapat dihapus jika Anda hanya ingin teks.

CJP
sumber
Ini harus menjadi metode yang paling mudah di sini. Terima kasih!
bartlomiej.n
2

Ketika dipanggil secara interaktif tanpa wilayah aktif, COPY (Mw) sebagai gantinya:

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

Ketika dipanggil secara interaktif tanpa wilayah aktif, MEMBUNUH (Cw) satu baris sebagai gantinya.

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

Juga, pada catatan terkait:

(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)
yPhil
sumber
1

Saya menulis satu untuk preferensi saya.

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

Tetapi saya menemukan ini akan memiliki beberapa masalah ketika baris saat ini berisi karakter multi-byte (misalnya karakter CJK). Jika Anda mengalami masalah ini, coba ini:

(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)
kuanyui
sumber
1

Fungsionalitas ini harus sesuai dengan implementasi JetBrains dalam hal duplikasi baik menurut garis atau wilayah, dan kemudian meninggalkan titik dan / atau wilayah aktif seperti yang diharapkan:

Hanya pembungkus di sekitar formulir interaktif:

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

Yang menyebut ini,

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

Atau ini

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

Dan kemudian saya memiliki ini terikat dengan meta + shift + d

(global-set-key (kbd "M-D") 'wrx/duplicate-line-or-region)
AesopHimself
sumber
1

Seperti disebutkan dalam jawaban lain, mengikat stroke kunci ke kode lisp adalah ide yang lebih baik daripada mengikat mereka ke stroke kunci lain. Dengan jawaban mw, kode menduplikasi baris dan memindahkan tanda ke akhir baris baru. Modifikasi ini menjaga posisi tanda pada kolom yang sama di baris baru:

fun duplicate-line ()
  (interactive)
  (let ((col (current-column)))
    (move-beginning-of-line 1)
    (kill-line)
    (yank)
    (newline)
    (yank)
    (move-to-column col)))
Krsoni
sumber
1

Jika Anda menggunakan Spacemacs, Anda bisa menggunakan duplicate-line-or-region, terikat ke:

SPC x l d 
Dan Garland
sumber
0

Dengan argumen awalan, dan apa itu perilaku intuitif (saya harap):

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

Kursor akan tetap berada di baris terakhir. Atau, Anda mungkin ingin menentukan awalan untuk menduplikasi beberapa baris berikutnya sekaligus:

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

Saya menemukan diri saya sering menggunakan keduanya, menggunakan fungsi wrapper untuk mengalihkan perilaku argumen awalan.

Dan keybinding: (global-set-key (kbd "C-S-d") 'duplicate-line)

Karthik
sumber
0
;; 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.

tambahkan elisp di atas untuk Anda init.el, dan Anda mendapatkan fungsi cut / copy seluruh baris sekarang, maka Anda dapat F3 F4 untuk menduplikasi satu baris.

WisdomFusion
sumber
0

Cara paling sederhana adalah metode Chris Conway.

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

Itulah cara standar yang diamanatkan oleh EMACS. Menurut pendapat saya, lebih baik menggunakan standar. Saya selalu berhati-hati terhadap kustomisasi yang mengikat kunci sendiri dalam EMACS. EMACS sudah cukup kuat, saya pikir kita harus mencoba yang terbaik untuk beradaptasi dengan kunci-ikatannya sendiri.

Meskipun agak panjang, tetapi ketika Anda terbiasa, Anda dapat melakukannya dengan cepat dan akan menemukan ini menyenangkan!

linbianxiaocao
sumber
4
Semua hal dipertimbangkan, mandat Emacs sangat kecil - kemenangan besar yang diberikannya adalah kemudahan menyesuaikannya dengan kebutuhan Anda sendiri. Tentu saja dalam prakteknya ada yang banyak cara standar untuk melakukan hal-hal yang bermanfaat untuk menempel, tetapi jika Anda menggunakan "default" Emacs dan melakukan sesuatu dengan cara yang lebih keras dari yang diperlukan hanya karena Anda berpikir "itu lebih baik menggunakan standar" , Anda salah melakukannya.
phils
0

Berikut adalah fungsi untuk menduplikasi baris saat ini. Dengan argumen awalan, itu akan menduplikasi baris beberapa kali. Misalnya, C-3 C-S-oakan menduplikasi baris saat ini tiga kali. Tidak mengubah cincin bunuh.

(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)
Dodgie
sumber