Vim mengedit multiline seperti di sublimetext?

132

Saya mulai menggunakan gvim, dan saya tidak mengerti bagaimana cara kerja multiline edit di gvim.

Sebagai contoh:

Teks asli:

asd asd asd asd asd;
asd asd asd asd asd;
asd asd asd asd asd;
asd asd asd asd asd;
asd asd asd asd asd;
asd asd asd asd asd;
asd asd asd asd asd;

ctrl + q, jjjjjj, $ semuanya dipilih, lalu saya tekan I untuk melakukan multiline insert.

Tujuan saya adalah memasukkan kutipan seperti pada baris pertama, dan kemudian menekan Esc:

asd "asd asd" asd asd;
asd asd asd asd asd;
asd asd asd asd asd;
asd asd asd asd asd;
asd asd asd asd asd;
asd asd asd asd asd;
asd asd asd asd asd;

Apa yang terjadi? Saya mengharapkan perilaku yang mirip dengan sublimetext:

masukkan deskripsi gambar di sini

Jika Anda tidak tahu cara kerjanya, itu hanya mengulangi tindakan untuk setiap baris. Bagaimana bisa mencapainya? Dan apa yang sedang dilakukan vim di sini?

AlfredoVR
sumber
Rekam makro keyboard untuk mengubah baris pertama dan kemudian putar makro untuk semua baris lainnya.
high5

Jawaban:

214

Bantulah diri Anda sendiri dengan menjatuhkan lapisan kompatibilitas Windows.

Pintasan normal untuk memasuki mode Blok Visual adalah <C-v>.

Yang lain sudah berurusan dengan rekaman makro, berikut adalah beberapa ide lain:

Hanya menggunakan mode blok visual .

  1. Letakkan kursor pada kata kedua:

    asd |a|sd asd asd asd;
    asd asd asd asd asd;
    asd asd asd asd asd;
    asd asd asd asd asd;
    asd asd asd asd asd;
    asd asd asd asd asd;
    asd asd asd asd asd;
    
  2. Tekan <C-v>untuk masuk ke mode blok visual dan perluas pilihan Anda ke bawah:

    asd [a]sd asd asd asd;
    asd [a]sd asd asd asd;
    asd [a]sd asd asd asd;
    asd [a]sd asd asd asd;
    asd [a]sd asd asd asd;
    asd [a]sd asd asd asd;
    asd [a]sd asd asd asd;
    
  3. Hit I"<Esc>untuk mendapatkan:

    asd "asd asd asd asd;
    asd "asd asd asd asd;
    asd "asd asd asd asd;
    asd "asd asd asd asd;
    asd "asd asd asd asd;
    asd "asd asd asd asd;
    asd "asd asd asd asd;
    
  4. Letakkan kursor pada karakter terakhir dari kata ketiga:

    asd "asd as|d| asd asd;
    asd "asd asd asd asd;
    asd "asd asd asd asd;
    asd "asd asd asd asd;
    asd "asd asd asd asd;
    asd "asd asd asd asd;
    asd "asd asd asd asd;
    
  5. Tekan <C-v>untuk masuk ke mode blok visual dan perluas pilihan Anda ke bawah:

    asd "asd as[d] asd asd;
    asd "asd as[d] asd asd;
    asd "asd as[d] asd asd;
    asd "asd as[d] asd asd;
    asd "asd as[d] asd asd;
    asd "asd as[d] asd asd;
    asd "asd as[d] asd asd;
    
  6. Hit A"<Esc>untuk mendapatkan:

    asd "asd asd" asd asd;
    asd "asd asd" asd asd;
    asd "asd asd" asd asd;
    asd "asd asd" asd asd;
    asd "asd asd" asd asd;
    asd "asd asd" asd asd;
    asd "asd asd" asd asd;
    

Dengan mode blok visual dan Surround.vim .

  1. Letakkan kursor pada kata kedua:

    asd |a|sd asd asd asd;
    asd asd asd asd asd;
    asd asd asd asd asd;
    asd asd asd asd asd;
    asd asd asd asd asd;
    asd asd asd asd asd;
    asd asd asd asd asd;
    
  2. Tekan <C-v>untuk masuk ke mode blok visual dan perluas pilihan Anda ke arah bawah dan kanan:

    asd [asd asd] asd asd;
    asd [asd asd] asd asd;
    asd [asd asd] asd asd;
    asd [asd asd] asd asd;
    asd [asd asd] asd asd;
    asd [asd asd] asd asd;
    asd [asd asd] asd asd;
    
  3. Hit S"untuk mengelilingi pilihan Anda dengan ":

    asd "asd asd" asd asd;
    asd "asd asd" asd asd;
    asd "asd asd" asd asd;
    asd "asd asd" asd asd;
    asd "asd asd" asd asd;
    asd "asd asd" asd asd;
    asd "asd asd" asd asd;
    

Dengan mode garis-visual dan :normal.

  1. Tekan Vuntuk memilih seluruh baris dan rentangkan ke bawah:

    [asd asd asd asd asd;]
    [asd asd asd asd asd;]
    [asd asd asd asd asd;]
    [asd asd asd asd asd;]
    [asd asd asd asd asd;]
    [asd asd asd asd asd;]
    [asd asd asd asd asd;]
    
  2. Jalankan perintah ini: :'<,'>norm ^wi"<C-v><Esc>eea"<CR>untuk mendapatkan:

    asd "asd asd" asd asd;
    asd "asd asd" asd asd;
    asd "asd asd" asd asd;
    asd "asd asd" asd asd;
    asd "asd asd" asd asd;
    asd "asd asd" asd asd;
    asd "asd asd" asd asd;
    
    • :norm[al]memungkinkan Anda untuk mengeksekusi perintah mode normal pada rentang garis ( '<,'>bagian tersebut ditambahkan secara otomatis oleh Vim dan berarti "bertindak pada area yang dipilih")

    • ^ menempatkan kursor pada karakter pertama dari baris

    • w pindah ke kata berikutnya

    • i"menyisipkan "sebelum kursor

    • <C-v><Esc>adalah cara Vim untuk memasukkan karakter kontrol dalam konteks ini, di sini <Esc>digunakan untuk keluar dari mode penyisipan

    • ee pindah ke akhir kata berikutnya

    • a"menambahkan "setelah kursor

    • <CR> mengeksekusi perintah

    Menggunakan Surround.vim, perintah di atas menjadi

    :'<,'>norm ^wvees"<CR>
    
romainl
sumber
7
Untuk langkah 4 dan 5 saya akan merekomendasikan memukul gvuntuk mendapatkan kembali pilihan visual Anda sebelumnya, dan kemudian bergerak secara horizontal, mungkin dengan 2e. (Semakin banyak baris, semakin berharga gv!)
joeytwiddle
4
surround.vim menggunakan kecil sdalam mode normal tetapi besar Sdalam mode visual, jadi pada langkah 3 metode surround.vim, penekanan tombol harusS"
joeytwiddle
1
Titik 3 visual-block + Surround.vim seharusnya S", tidaks"
zool
1
Alih-alih mode blok visual langkah 5 dan 6 Anda cukup meletakkan kursor setelah kata ketiga dan tekan ..
Jonas
2
Ini keren, tetapi ini hanya berfungsi dalam beberapa kasus di mana karakter yang ingin Anda edit pada garis yang berbeda berada pada posisi horizontal yang sama persis pada setiap baris, dan garis yang diedit tepat satu demi satu. Tidak bisakah kita memilih tempat untuk masuk dalam mode edit di baris mana di Vim? Kita bisa di Sublim ... EDIT: Sebenarnya jawaban kedua adalah apa yang saya cari
Alexandre Bourlier
30

Itu adalah beberapa solusi out-of-the-box yang diberikan di atas, tetapi kami juga dapat mencoba beberapa plugin yang menyediakan banyak kursor seperti Sublime.

Saya pikir ini terlihat menjanjikan:

Tampaknya ditinggalkan untuk sementara waktu, tetapi memiliki beberapa kontribusi pada 2014

Ini cukup kuat, walaupun saya butuh sedikit waktu untuk membiasakan diri dengan aliran (yang cukup luhur tapi masih modal seperti Vim).

Dalam pengalaman saya jika Anda memiliki banyak plugin lain yang diinstal, Anda mungkin menemui beberapa konflik!

Ada beberapa upaya lain untuk fitur ini:

Silakan mengedit jika Anda melihat ada yang mengalami peningkatan.

joeytwiddle
sumber
Sepertinya github.com/osyo-manga/vim-over adalah yang paling aktif saat ini.
Wernight
Luar biasa, itulah yang saya cari
Alexandre Bourlier
1
Setelah menguji sebagian besar dari mereka hlissner / vim-multiedit tampaknya AFAIAC terbaik
Alexandre Bourlier
1
Periksa mg979 / vim-visual-multi sebagai pengganti yang baik untuk vim-multiple-cursors
Mushex Antaranian
29

Ada beberapa cara untuk mencapai itu di Vim. Saya tidak tahu mana yang paling mirip dengan Sublime Text.


Yang pertama adalah melalui mode penyisipan multiline . Letakkan kursor ke "a" kedua di baris pertama, tekan Ctrl-V, pilih semua baris, lalu tekan I, dan masukkan tanda kutip ganda. Menekan <esc>akan mengulang operasi di setiap baris.


Yang kedua adalah melalui makro. Letakkan kursor pada karakter pertama, dan mulai merekam makro dengan qa. Ke kanan dengan llll, masukkan mode insert dengan a, letakkan doublequote, keluar dari mode insert, dan kembali ke awal baris Anda dengan <home>(atau setara). Tekan juntuk turun satu baris. Hentikan merekam dengan q. Dan kemudian memutar ulang makro dengan @a. Beberapa kali.


Apakah salah satu dari pendekatan di atas bekerja untuk Anda?

Benteng
sumber
15

jika Anda menggunakan perintah "global", Anda dapat mengulangi apa yang dapat Anda lakukan pada satu online dan sejumlah baris.

:g/<search>/.<your ex command>

contoh:

:g/foo/.s/bar/baz/g

Perintah di atas menemukan semua baris yang memiliki foo, dan mengganti semua kemunculan bilah di baris itu dengan baz.

:g/.*/

akan dilakukan di setiap baris

srini.venigalla
sumber
1
Ini sangat berguna, saya tidak tahu itu. Tampak kombinasi perintah yang begitu kuat dan pandai.
0xc0de
Untuk kenyamanan, saya menulis sedikit fungsi yang mengambil kata di bawah kursor (atau kata yang dipilih secara visual), meminta penggantian, dan kemudian menjalankan :gperintah yang dijelaskan di sini. Saya suka menggunakan /gcuntuk meminta "konfirmasi" sehingga saya dapat menekan yatau nuntuk setiap penggantian, atau auntuk mengubah semuanya.
joeytwiddle
11
Ctrl-v ................ start visual block selection
6j .................... go down 6 lines
I" .................... inserts " at the beginning
<Esc><Esc> ............ finishes start
2fdl. ................. second 'd' l (goes right) . (repeats insertion)
SergioAraujo
sumber
Pada langkah 3, Itidak bisa masuk ke mode insert, tahukah Anda mengapa ini terjadi?
Ninja
Coba muat vim tanpa plugin: vim -u NONEdan coba lakukan tindakan yang diinginkan lagi, itu bisa berupa peta atau plugin yang mengubah perilaku vim Anda.
SergioAraujo
6

Saya tidak yakin apa vimyang dilakukan, tetapi ini adalah efek yang menarik. Cara Anda menggambarkan apa yang Anda inginkan terdengar seperti cara kerja makro ( :help macro). Sesuatu seperti ini akan melakukan apa yang Anda inginkan dengan makro (mulai dalam mode normal):

  1. qa: Rekam makro untuk amendaftar.
  2. 0w: 0mulai dari baris, wlompat satu kata.
  3. i"<Esc>: Masuk ke mode insert, masukkan a " dan kembali ke mode normal.
  4. 2e: Lompat ke akhir kata kedua.
  5. a"<Esc>: Tambahkan a " .
  6. jq Pindah ke baris berikutnya dan akhiri rekaman makro.

Diambil bersama-sama: qa0wi"<Esc>2ea"<Esc>

Sekarang Anda dapat menjalankan makro dengan @a, ulangi makro terakhir dengan @@. Untuk menerapkan ke seluruh file, lakukan sesuatu seperti99@a yang menganggap Anda tidak memiliki lebih dari 99 baris, eksekusi makro akan berakhir ketika mencapai akhir file.

Inilah cara mencapai apa yang Anda inginkan visual-block-mode(mulai dalam mode normal):

  1. Arahkan ke tempat yang Anda inginkan kutipan pertama berada.
  2. Masukkan visual-block-mode, pilih garis yang ingin Anda pengaruhi,G untuk pergi ke bagian bawah file.
  3. Memukul I"<Esc> .
  4. Pindah ke tempat berikutnya yang ingin Anda masukkan ".
  5. Anda ingin mengulangi apa yang baru saja Anda lakukan sehingga .kehendak yang sederhana sudah cukup.
Thor
sumber
4
Tidak perlu untuk 99 @ a. Jika Anda ingin menjalankan makro pada setiap baris file coba:% norm! @Sebuah.
Benteng
Tanpa titik-titik (itu hanya akhir dari kalimat, bukan bagian dari perintah)
Rook
9999@amungkin jelek tapi jauh lebih mudah untuk mengetik daripada :%norm! @adan itu tidak berjalan kembali pada baris yang baru saja diedit. Tetap bagus untuk mengetahuinya. :)
joeytwiddle
0

Solusi saya adalah menggunakan 2 pemetaan ini:

map <leader>n <Esc><Esc>0qq
map <leader>m q:'<,'>-1normal!@q<CR><Down>

Cara menggunakannya:

  1. Pilih jalur Anda. Jika saya ingin memilih 12 baris berikutnya saya cukup tekanV12j
  2. tekan <leader>n
  3. Buat perubahan Anda ke garis
  4. Pastikan Anda dalam mode normal dan kemudian tekan <leader>m

Untuk mengedit lagi, Anda tidak perlu memilih lagi. Cukup tekan <leader>n, edit dan tekan <leader>muntuk menerapkan.


Bagaimana ini bekerja:

  • <Esc><Esc>0qq Keluar dari pilihan visual, pergi ke awal baris dan mulai merekam makro.

  • q Berhenti merekam makro.

  • :'<,'>-1normal!@q<CR> Dari awal pemilihan visual ke baris sebelum akhir, mainkan makro pada setiap baris.

  • <Down> Kembali ke baris terakhir.


Anda juga bisa memetakan kunci yang sama tetapi untuk mode yang berbeda:

vmap <leader>m <Esc><Esc>0qq
nmap <leader>m q:'<,'>-1normal!@q<CR><Down>

Meskipun ini mengacaukan kemampuan Anda untuk mengedit lagi. Anda harus memilih kembali jalur Anda.

willmcpherson2
sumber