Bagaimana cara menghapus beberapa karakter pertama dari setiap baris?

15

Saya baru-baru ini bertanya:

Bagaimana cara menambahkan awalan ke setiap baris?

Jadi, pergi dari kode di bawah ini:

I said Hello
I said There
I said I am some code

Untuk kode seperti:

Hello
There
I am some code

Sekarang, bagaimana cara saya menghapus n jumlah karakter dari satu baris?

Luke Shimkus
sumber
IMHO itu sama dengan pertanyaan Anda sebelumnya.
A_P

Jawaban:

28

Itu bahkan lebih mudah! Sekali lagi, gunakan perintah persegi panjang . Pindah ke salah satu sudut persegi panjang yang ingin Anda hapus, tekan C-SPCuntuk mengatur tanda. Pindah ke sudut lain dari persegi panjang dan tekan C-x r d( delete-rectangle). Misalnya, pindah ke baris pertama yang ingin Anda tindak lanjuti, tekan C-aatau homeuntuk pergi ke awal baris, pindah ke bawah ke baris terakhir yang ingin Anda tindak lanjuti, untuk pindah ke sudut kanan bawah, dan kemudian untuk menghapus.C-u number C-fC-x r d

Jika baris terakhir memiliki lebih sedikit dari jumlah karakter yang diinginkan, mungkin lebih mudah menggunakan sudut kiri bawah dan kanan atas. Atau, Anda dapat menyisipkan karakter sampah (ini berguna jika baris pertama dan baris terakhir lebih pendek).

Anda dapat menggunakan C-x r kuntuk membunuh persegi panjang, yang memungkinkan Anda untuk menarik ( C-x r y) nanti (pindah ke sudut kiri atas tempat di mana Anda ingin memasukkannya).

Anda juga dapat menggunakan C-x r t( string-rectangle) dan memasukkan string kosong.

Perintah persegi panjang didasarkan pada posisi kolom. Jika Anda ingin menghapus n karakter, bukan n kolom (yang membuat perbedaan dengan karakter multi-kolom seperti tab), Anda dapat menggunakan penggantian ekspresi reguler : ganti ^.\{42\}dengan nol untuk menghapus 42 karakter pertama dari setiap baris.

Gilles 'SO- berhenti menjadi jahat'
sumber
3
alih-alih mencoba mengingat semua perintah persegi panjang, Anda juga dapat menggunakan Cx spc, alih-alih C-spc, yang mengubah wilayah Anda menjadi persegi panjang dan semuanya berfungsi.
Malabarba
1
@Malabarba Hanya sejak Emacs 24 sekalipun. (Menulis ini di mesin dengan Emacs 23. Mereka masih banyak di sekitar.)
Gilles 'SO-stop being evil'
2
Belasungkawa ... :-(
Malabarba
Ini hanya bekerja untuk saya di GNU Emacs 23.4.1 (x86_64-pc-linux-gnu, GTK + Versi 2.24.21) dari 2013-10-25 di allspice, dimodifikasi oleh Debian
davidrmcharles
4

Kemungkinan lain: Saya sangat suka menggunakan banyak kursor untuk tugas-tugas seperti ini. Tersedia dalam package.elmelalui MELPA, itu menjadi bagian tak terpisahkan dari emacs saya. Saya hanya akan memilih I said(dan mungkin termasuk baris sebelum), gunakan M-x mc/mark-all-like-this, dan berada di jalan saya. Jika Anda ingin lebih banyak kontrol berbutir halus, Anda dapat menggunakan mc/mark-next-like-thisatau mc/mark-next-lines.

Pengikat kunci saya:

(use-package multiple-cursors
  :bind (("C->"   . mc/mark-next-like-this)
         ("C-M->" . mc/mark-all-like-this-dwim)))

Batu Emacs yang wajib! episode: http://emacsrocks.com/e13.html

Sean Allred
sumber
3

Jika Anda telah cua-modemengaktifkan, maka:

  • C-a untuk pindah ke awal baris,
  • C-RET untuk memulai persegi panjang,
  • Kemudian pindah dengan tombol panah atau emacs move command like C-f
  • DEL untuk menghapus pilihan

Saya lebih suka cua-modecara kerjanya, dibandingkan dengan persegi panjang standar Emacs di mana yang setara adalah:

  • C-a untuk pindah ke awal baris,
  • C-SPC untuk memulai persegi panjang,
  • Kemudian pindah dengan tombol panah atau emacs move command like C-f
  • C-x r d untuk menghapus pilihan

The cua-modemenyimpan tiga penekanan tombol dibandingkan dengan standar Emacs persegi panjang.

thdox
sumber
3

Demi kelengkapan: menghapus 3 karakter pertama dari setiap baris (secara formal: dari titik aktif, atau di wilayah) dapat dilakukan dengan mengganti regexp ^...(atau lebih umum:) ^.\{3\}dengan string kosong.

Penjelasan: dalam regexen, ^berarti "awal garis", .berarti "karakter apa saja", dan \{n\}berarti " n pengulangan hal sebelumnya".

Ini memiliki manfaat tambahan untuk menjadi interaktif (kecuali jika ada yang menekan !, yang membuat query-regexp-replacesemuanya diganti mulai sekarang tanpa pertanyaan lebih lanjut).

mbork
sumber
1
Mengapa downvotes?
mbork
0

Dan satu kemungkinan lagi:

F3C-aC-3C-dC-nF4

merekam makro keyboard, pada dasarnya mengatakan "pindah ke awal baris, hapus tiga karakter, dan pindah ke baris berikutnya". Kemudian, Anda dapat memutar ulang hingga akhir buffer dengan C-uF4, atau C-xC-krmenerapkannya ke garis di wilayah. Ini memiliki satu kelemahan: itu akan rusak ketika setiap baris memiliki kurang dari 3 karakter.

mbork
sumber
-1

Jika itu hanya sebuah garis, Anda dapat zap-to-char dengan Mz dengan asumsi bahwa karakter tidak diulangi antara titik dan yang Anda ingin hapus hingga. Untuk beberapa kasus, ini lebih cepat daripada membuat wilayah.

Willyfrog
sumber