Blokir pengeditan * langsung * di Emacs atau Vim

9

jEdit mendukung pengeditan blokir, tetapi Emacs dan Vim tampaknya memiliki beberapa masalah kegunaan serius pada subjek yang sama. Jika seseorang dapat mengisi yang tidak diketahui di sini, akan lebih baik jika menggunakan salah satu editor:

  • Seleksi persegi aktual : Di mana pemilihan pada layar adalah persegi panjang, bukan seleksi linear yang kemudian digunakan untuk menghitung suatu wilayah karena Emacs tampaknya terbatas.
    • jEdit: Tahan Ctrldan pilih.
    • Vim: Klik Ctrl-vdan pilih.
    • Emacs: Tidak Diketahui ; Sepertinya diperlukan 400+ baris plugin .
  • Pengeditan persegi panjang langsung : Lihat seperti apa hasilnya pada semua baris saat Anda mengedit setelah pemilihan blok.
    • jEdit: Cukup mulai mengetik, dan Anda akan melihat hasil akhirnya saat Anda menggunakannya.
    • Vim: Klik Shift-idan ketik. Akan menunjukkan hasil akhir hanya pada baris pertama sampai Anda menekan Escuntuk keluar dari mode penyisipan. Tidak diketahui apakah ada cara untuk melihat hasilnya di semua lini dengan segera.
    • Emacs: Tidak Diketahui ; Sepertinya satu-satunya cara adalah C-x r tdan mengatur teks untuk diisi setelah menekan Ret.
  • Mulai dan akhiri pemilihan pada posisi di luar teks : Misalnya, saya ingin menghapus N karakter pertama dari setiap baris, tetapi baris pertama dan terakhir mengandung kurang dari N karakter.
  • Tempel blok sebaris : Tempel blok yang disalin seolah-olah Anda menempelkan beberapa baris, seperti dalam, dorong teks yang sudah ada di bawah , tidak benar.
    • jEdit: Default. Untuk menempelkan blok sebagai blok, Anda harus melakukan pemilihan blok lain terlebih dahulu.
    • Vim: OEscVp.
    • Emacs: Tidak Diketahui .

Fungsionalitas pemilihan blok General Emacs dapat ditemukan di cua-modeplugin .

l0b0
sumber
Rupanya mode pengeditan kolom Emacs dapat melakukan semacam penyuntingan persegi panjang langsung: youtube.com/watch?v=k-6BVjlBSVo
Tom
Hanya sebuah pengamatan tentang emacs 400+ lines "plugin" .. Sebuah addon yang agak mirip untuk gedit, disebut multi-edit memiliki 1000+ baris kode python. Bagi saya, pugin sangat berguna (bagaimana saya bisa bertahan tanpanya), ukurannya akademis ... dan jika emacs berfungsi sebagai iklan, saya akan lebih senang menggunakannya, tapi saya mendapat kesalahan memuat ketika saya menjalankannya "command-line-normalize-file-name: Args out of range:" ", 1" :( ... Hanya saja apa yang saya cari juga ..
Peter.O
4
Bagi mereka yang belum menggunakan jEdit, tolong jelaskan terminologi Anda. Saya tidak mengerti apa artinya "live" di sini, apa "live rectangular editing", atau apa artinya "paste inline block".
Gilles 'SANGAT berhenti menjadi jahat'

Jawaban:

7

Saya bisa menjawab untuk Vim, tetapi tidak untuk Emacs.

Mulai dan akhiri pemilihan pada posisi di luar teks:

:set virtualedit=blockakan memungkinkan perilaku yang Anda inginkan. Anda dapat menjatuhkan titik dua awal dan menambahkannya ke .vimrc Anda jika Anda mau. Untuk info lebih lanjut, :help 'virtualedit'dari dalam Vim.

Tempel blok inline:

Jika Anda menekan pdi mode Perintah, Vim akan menyisipkan blok, mendorong karakter ke kanan di setiap baris. Jika Anda memilih blok lain dan tekan p, Vim akan mengganti blok itu dengan blok yang ditempelkan.

Anda dapat menempelkan blok "secara garis" dengan urutan tombol mode-perintah OEscVp. Ini menyisipkan garis di atas garis saat ini ( O Esc), memilihnya secara garis lurus ( V), lalu menempel di atasnya ( p). Anda dapat mempersingkat ini menjadi (misalnya) ypdengan pemetaan seperti :nmap yp O<Esc>Vp- ketik yang secara harfiah; gunakan lima kali penekanan tombol <Esc>daripada menekan tombol Escape.

Jander
sumber
Tip yang bagus tentang virtualedit; harus mencobanya. Tentang penyisipan sebaris, silakan lihat pertanyaan yang diperbarui untuk deskripsi fungsi yang diharapkan.
l0b0
Saya telah memperbarui jawaban saya dengan metode untuk menempelkan blokir.
Jander
5

Misalnya, saya ingin menghapus N karakter pertama dari setiap baris, tetapi baris pertama dan terakhir mengandung kurang dari N karakter.

Emacs: mulai seleksi di baris pertama dan cukup tambahkan jumlah karakter yang hilang (misalnya spasi) ke baris terakhir dan kemudian gunakan kill-rectangle

Atau, lihat artist-modeatau picture-modeyang memungkinkan Anda untuk bebas bergerak di jendela terlepas dari panjang garis.

Tempel blok inline

Emacs: Pertama-tama simpan blok dengan membunuh-persegi panjang atau menyimpannya ke register, kemudian pergi ke titik penyisipan, gunakan hapus-persegi panjang dan kemudian masukkan persegi panjang yang disimpan.

Sepertinya diperlukan 400+ baris plugin

Dalam kasus Emacs mengapa ini menjadi masalah? Plugin dapat dikompilasi dan filosofi emacs adalah Anda tidak meletakkan semuanya ke dalam inti, tetapi gunakan plugin untuk memperluas editor.

Tom
sumber
4

Ada 'cua-mode' yang hadir dengan Emacsen 22.1 dan yang lebih baru, atau ikuti tautan untuk mengunduh Emacs versi sebelumnya. Ada video pendek yang memperkenalkan fungsionalitas.

Untuk perintah persegi panjang umum, cobalah membaca manual , yang menyediakan pengenalan yang mudah.

Trey Jackson
sumber
emacs cua-modeterlihat bagus! +1 .. Saya tidak dapat menemukan video yang Anda sebutkan, lihat tautan Tom di komentar tepat di bawah pertanyaan, untuk tautan ke video info (berbeda?) ...
Peter.O
@ ditawarkan Ooops, kesalahan cut / paste, diperbaiki
Trey Jackson
0

Dalam vim, cara khas untuk menghapus n karakter pertama adalah dengan melakukan sesuatu seperti :%s/.\{0,6\}//.

%akan melakukan seluruh dokumen; Anda dapat menggantinya dengan pilihan atau dengan garis aktual yang Anda pedulikan. The sperintah untuk "pengganti". Itu akan mengganti ekspresi reguler dengan apa pun yang Anda berikan, dan itu hanya akan cocok sekali pada setiap baris kecuali Anda menambahkan opsi tertentu. Ini /adalah pembatas - ini bisa berupa karakter apa saja, tetapi /biasanya digunakan kecuali menguntungkan untuk menggunakan sesuatu yang lain (jadi Anda tidak perlu melarikan diri /dalam sisa perintah). Argumen setelah pembatas pertama adalah ekspresi reguler yang akan digunakan untuk menemukan string yang cocok dalam pilihan Anda. Argumen setelah pembatas kedua adalah pertandingan apa yang akan diganti.

Jadi perintah ini mengatakan temukan 0 hingga 6 contoh karakter apa pun, dan gantilah dengan apa pun.

Shawn J. Goff
sumber
Bukan apa yang saya minta.
l0b0
Tetapi apakah menurut Anda itu tidak berguna bagi orang lain yang menemukan pertanyaan ini? Saya pikir begitu, dan itulah sebabnya saya taruh di sini.
Shawn J. Goff