Saya melihat pertanyaan yang sama untuk VIM dan ini adalah sesuatu yang saya sendiri ingin tahu bagaimana melakukannya untuk Emacs. Di ReSharper saya menggunakan CTRL-D untuk tindakan ini. Berapa jumlah perintah paling sedikit untuk melakukan ini di Emacs?
155
Jawaban:
saya menggunakan
yang terurai menjadi
C-a
: gerakkan kursor untuk memulai barisC-SPACE
: mulai seleksi ("setel tanda")C-n
: pindahkan kursor ke baris berikutnyaM-w
: wilayah copyC-y
: paste ("yank")Yang disebutkan di atas
sama dengan jumlah yang sama (TMTOWTDI)
C-a
: gerakkan kursor untuk memulai barisC-k
: cut ("kill") barisC-k
: potong baris baruC-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-d
di editor Anda, tetapi di Emacs selalu ada penyesuaian.C-d
terikatdelete-char
secara default, jadi bagaimanaC-c C-d
? Tambahkan saja yang berikut ke.emacs
:(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-d
untuk melakukan sesuatu yang lain.sumber
C-S-backspace C-y C-y
?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.
sumber
Symbol's function definition is void: move-beginning-of-line
Del
dari fungsi ini?Del
kembali ke normal sambil mempertahankan yang baruC-d
:(global-set-key (kbd "<delete>") 'delete-char)
perlu ditambahkan setelahC-d
definisi.Tempatkan kursor on line, jika tidak di awal lakukan a CTRL- A, maka:
CTRL-K
CTRL-K
CTRL-Y
CTRL-Y
sumber
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 .
Kemudian Anda dapat mendefinisikan CTRL-D untuk memanggil fungsi ini:
sumber
crux-duplicate-current-line-or-region
bekerja lebih baik untuk saya, karena dengan fungsi Anda membatalkan duplikasi baris dan operasi terakhir jugaAlih-alih
kill-line
(C-k
) seperti dalamC-a
C-k
C-k
C-y
C-y
menggunakankill-whole-line
perintah:Keuntungan lebih dari
C-k
termasuk bahwa tidak masalah di mana titik berada di jalur (tidak sepertiC-k
yang mengharuskan berada di awal baris) dan juga membunuh baris baru (sekali lagi sesuatuC-k
tidak dilakukan).sumber
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).
Saya terikat untuk
C-c d
:Ini tidak boleh ditugaskan kembali oleh mode atau apa pun karena
C-c
diikuti oleh satu huruf (tidak dimodifikasi) dicadangkan untuk binding pengguna.sumber
C-c d
saya mendapatkan kesalahancommand-execute: Wrong type argument: commandp, duplicate-line-or-region
. Ada yang tahu ada apa? Saya menggunakan Emacs 25.1.1 di WindowsPenambahan Nathan ke file .emacs Anda adalah cara yang harus dilakukan tetapi bisa disederhanakan sedikit dengan mengganti
dengan
menghasilkan
sumber
instal duplikat dari melpa:
Mx paket-instal RET duplikat-hal
dan tambahkan pengikat kunci ini ke file init :
(duplikat-global-set-key (kbd "Mc") ')
sumber
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:
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)?
sumber
karena saya tidak tahu, saya akan memulai putaran golf ini dengan slowball:
ctrl-k, y, y
sumber
sesuatu yang Anda mungkin ingin miliki di .emacs Anda
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
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.
sumber
Saya telah
copy-from-above-command
terikat pada kunci dan menggunakannya. Ini disediakan dengan XEmacs, tapi saya tidak tahu tentang GNU Emacs.sumber
GNU Emacs 23.2.1 (amd64-portbld-freebsd8.1) of 2010-11-14 on [host clipped]
.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:
sumber
sumber
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:
Tempatkan di atas
.emacs
. Kemudian, untuk menyalin garisM-w
,. Untuk menghapus garisC-w
,. Untuk menggandakan garisC-a M-w C-y C-y C-y ...
,.sumber
'Saya menulis versi saya sendiri
duplicate-line
, karena saya tidak ingin mengacaukan cincin pembunuhan.sumber
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:
sumber
Dengan emacs terbaru, Anda dapat menggunakan Mw di mana saja di baris untuk menyalinnya. Jadi itu menjadi:
sumber
M-w
terikat padaeasy-kill
. Periksa itu yang Anda dapatkan saat melakukannyaC-h c M-w
Saya melihat solusi yang sangat kompleks, ...
sumber
@ [Kevin Conner]: Cukup dekat, sejauh yang saya tahu. Satu-satunya hal lain yang perlu dipertimbangkan adalah menyalakan
kill-whole-line
untuk memasukkan baris baru dalam Ck.sumber
[
dan]
in@[Kevin Conner]
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.
sumber
Ketika dipanggil secara interaktif tanpa wilayah aktif, COPY (Mw) sebagai gantinya:
Ketika dipanggil secara interaktif tanpa wilayah aktif, MEMBUNUH (Cw) satu baris sebagai gantinya.
Juga, pada catatan terkait:
sumber
Saya menulis satu untuk preferensi saya.
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:
sumber
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:
Yang menyebut ini,
Atau ini
Dan kemudian saya memiliki ini terikat dengan meta + shift + d
sumber
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:
sumber
Jika Anda menggunakan Spacemacs, Anda bisa menggunakan
duplicate-line-or-region
, terikat ke:sumber
Dengan argumen awalan, dan apa itu perilaku intuitif (saya harap):
Kursor akan tetap berada di baris terakhir. Atau, Anda mungkin ingin menentukan awalan untuk menduplikasi beberapa baris berikutnya sekaligus:
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)
sumber
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.
sumber
Cara paling sederhana adalah metode Chris Conway.
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!
sumber
Berikut adalah fungsi untuk menduplikasi baris saat ini. Dengan argumen awalan, itu akan menduplikasi baris beberapa kali. Misalnya,
C-3 C-S-o
akan menduplikasi baris saat ini tiga kali. Tidak mengubah cincin bunuh.sumber