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.