Bagaimana membalikkan seleksi di vim?


12

Setelah memilih rentang baris dengan Vperintah, saya ingin menghapus setiap baris file yang TIDAK dipilih, jadi apakah cara untuk membalikkan seleksi - pilih setiap baris yang tidak dipilih?

Seperti bagaimana

:g!/FOO/d

menghapus setiap baris yang TIDAK mengandung FOO .

Jika saya memiliki rentang dalam pikiran dan ingin menggunakan kebalikannya:

'a,'b

Saya perlu menggunakan dua rentang:

1,'a-1

dan

'b+1,$

Saya menduga ini tidak dapat dilakukan dalam satu langkah - tetapi itu akan menyenangkan!


jadi Anda ingin operasi gaya "pangkas"?
quack quixote

Jawaban:


7

Pertama buat pemetaan berikut (misalnya terikat pada <F4>kunci)

map <F4> :<C-U>1,'<-1:delete<CR>:'>+1,$:delete<CR>

kemudian, setelah memilih rentang dalam mode visual, cukup tekan <F4>untuk memicu perintah terkait. Perintah ini dapat dengan mudah dijelaskan di bagian-bagian:

  • " :" Masuk ke mode baris perintah.
  • " <C-U>" Hapus semua karakter antara posisi kursor dan awal baris.
  • " 1,'<-1" Menentukan rentang dari baris pertama file ke baris sebelum dimulainya pemilihan saat ini.
  • " :delete<CR>" Hapus (rentang garis yang ditentukan sebelumnya).
  • " :'>+1,$:delete<CR>" Hapus baris dalam kisaran " '>+1,$", yaitu dari baris setelah akhir seleksi ke akhir file.

2
hanya untuk menjelaskannya: 1, '<- 1 adalah rentang dari baris 1 hingga awal seleksi. '> +1, $ adalah kisaran dari 1 baris setelah seleksi hingga akhir ...
akira

Apakah ada cara untuk melakukan itu hanya dengan satu perintah "hapus"?
Kevin Panko

1
@Kevin Panko: Anda harus menggabungkan rentang menjadi satu ekspresi. Saya telah melihat dokumen dan saya tidak berpikir sintaks rentang mendukung hal semacam itu. vimdoc.sourceforge.net/htmldoc/cmdline.html#cmdline-ranges ,,, vim.wikia.com/wiki/Ranges
quack quixote

15
  1. pilih teks Anda
  2. "*yggdG"*p yang berarti ...

    "*y    " yank it to the selection register
    ggdG   " delete everything
    "*p    " and paste the selection again 
    

9
ygg "_dGP adalah sama tetapi lebih pendek.
Kevin Panko

1
pada akhirnya Anda mendapatkan teks yang sama, benar :)
akira

Saya ingin merujuk pada jawaban akira dan Kevin Panko (saya tidak dapat menambahkan komentar). "[o] pposite [d] elete dalam mode vual isual (v) od ygg" _dGP
Marcin Rogacki

Plugin seperti github.com/maxbrunsfeld/vim-yankstack membuat pendekatan ini lebih mudah. Anda tidak perlu terlalu khawatir tentang pendaftaran yank Anda menjadi musnah oleh penghapusan.
Jack O'Connor

bagaimana ini bisa ditambahkan sebagai pemetaan keyboard .vimrc? Saya sudah mencoba beberapa upaya tetapi belum mendapatkannya. Upaya saya map <F4> n"*yggdG"*p dannmap <F4> "*yggdG"*p
Brad Parks

7

Hanya untuk anak cucu:

:v/\%V/d

Itu melakukan invers global pada garis yang bukan bagian dari seleksi. Perhatikan bahwa: v adalah konstruksi berbasis garis, sehingga setiap baris yang berisi salah satu dari seleksi, baik itu garis, aliran, atau pemilihan blok akan terhapus penghapusan.


1

karena 'pembalik' pada dasarnya berarti membuat 'pemilihan banyak-banyak' (area sebelum dan sesudah pemilihan awal) saya mencari lagi vimscripts http://www.vim.org/scripts/script.php?script_id=953 . coba ini.

 There are a number of operations to very
 easily manipulate selections such as modifying 
 the regions (add/delete/inverte/clear), hiding, 
 refreshing, saving and restoring etc."
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.