vim - Satırları saymadan büyük bir metin bloğunu nasıl silebilirim?


193

Vim'de kendimi genellikle büyük metin bloklarını silerken (veya kopyalarken) bulurum. Metin satırları sayılabilir ve (örneğin) 50dd50 satır silinebilir.

Ancak kaç satır sileceğini bilmeden bu büyük metin bloğunu nasıl silebilirsiniz?


1
Pencere yeterince büyükse, göreli satır numaralandırma burada yardımcı olur. İmleci pencerenin üstüne getirin, silinecek son satırın göreceli satır numarasını bulun (diyelim, n), bir tane ekleyin, ardından bu sayıyı yazın, sonra dd yazın. Örneğin n = 50 ise 51dd. Alternatif olarak, bir hareket komutu kullanın -50d<down arrow>
BallpointBen

"Göreli satır numarasını bulun" - veya, kullanın :set rnuve Vim bunu anında yapacaktır! Üzerinde bulunduğunuz satır hala kesin olarak numaralandırılacaktır, ancak imlecin üstündeki ve altındaki satırlar simetrik olarak 1, 2, ... olarak numaralandırılacaktır (ve imleç hareketi, dosya düzeyi olaylar vb. İle güncelleyin)
John P

Yanıtlar:


287

Ben vim guru değilim, ama bu durumda kullandığım şey "görsel mod". Komut modunda, V(capital) yazın. Ardından, silmek istediğiniz bloğu vurgulamak için yukarı / aşağı hareket edin (normal hareket komutlarının tümü çalışır). Sonra xveya ile kaldırın d.


2
Garip. Linux'ta (vim 7.3.50) ve Windows'ta gVim ile Benim İçin Çalıştığını (tm) biliyorum. Ve diğer cevaplara bakarak, diğer insanlar için çalışır. Belki de bazı ayarlarınız .vimrconu harekete geçiriyor?
Mat

Tamam, nedense Shift- - ile görsel hat moduna girebileceğinizi fark etmedim. v... ... ben de CTRLanahtarı kullanmaya çalışıyordum . Yani bu işe yarıyor ve muhtemelen en uygun yol.
Justin Ethier

7
İki görsel mod olduğunu açıklığa kavuşturmak isteyebilirsiniz - Görsel Çizgi ( CTRL- v) ve Görsel Blok ( Shift- v).
Justin Ethier

2
Bunu çok yapıyorum. Ama her zaman hile ve idealden daha az vim olduğunu düşünüyorum.
Jim Mitchener

9
Aslında üç görsel mod vardır: Görsel Mod (Karakter tabanlı {v}), Görsel Satır Modu (Satır tabanlı {Sv}) ve Görsel Blok Modu ({Cv} bloklarının seçilmesine izin verir)
Tom Regner

293

Başlangıç ​​satırına gidin ve yazın ma("a" işareti). Sonra son satıra gidin ve girin d'a("a" olarak işaretlemek için silin).

Bu, geçerli satırdan işaretli olana (dahil) tüm satırları silecektir. Ayrıca ile uyumlu violarak vim, ortamınız ikincisi ile kutsanmış olmadığı kapalı şans.


3
Bu korkutucu kayalar! Daha iyi bir çözüme bakmadan önce bir şey yapmaktan (satır sayma gibi) nefret ediyorum. Teşekkürler!
ryanjdillon

1
gerçekten harika Her zaman blok silmek için görsel modu kullanıyorum ama bu şekilde daha iyi +1
hish

4
Bunu 500k + satırları silmek için görsel moddan daha yararlı buldum
Michael - Clay Shirky nerede

Gerçekten pratik bir cevap. Sunucumdaki postaları /var/mail/usernametoplu olarak dosyadan silmek ve son postaları olduğu gibi bırakmak için kullanıyorum. Sonra ben mesela girin bir işareti yapmak 50000izledi ggsonra aradaki tüm satırları silin, hat 50.000 gidin. tıkır tıkır çalışıyor!
otmezger

1
@horta, muhtemelen vimgigabayt dosyalarını düzenlemek için bir araç olarak kullanmazdım - awkve kardeşleri gibi metin işleme araçlarını tercih etme eğilimindeyim :-)
paxdiablo

46

Görsel modu da kullanabilirsiniz (bazı komutlar silme seçeneği ile de kullanılabilir) vip vapparagraf v2apseçmek için, iki paragraf seçmek için de dapçalışır d2ap. Sen blokları içinde silebilir [ ]gibida[

Referans için: nesne türleri. Vim belgelerinden: bölüm 4. http://vimdoc.sourceforge.net/htmldoc/visual.html

4. Operating on the Visual area             *visual-operators*

...    
The objects that can be used are:
aw  a word (with white space)           
iw  inner word                  
aW  a WORD (with white space)           
iW  inner WORD                  
as  a sentence (with white space)           
is  inner sentence                  
ap  a paragraph (with white space)          
ip  inner paragraph                 
ab  a () block (with parenthesis)           
ib  inner () block                  
aB  a {} block (with braces)            
iB  inner {} block                  
a<  a <> block (with <>)                
i<  inner <> block                  
a[  a [] block (with [])                
i[  inner [] block                  

1
da [, da {, da "hepsi programcılar için yararlı
Rene Wooller

1
Teşekkürler! dapbir paragraf silmek gibi hatırlamak çok kolay
Tropilio

38

Burada çok daha iyi cevaplar var, ancak bütünlük için yukarıda belirtilen bazı harika cevapları okumadan önce kullandığım yöntemden bahsedeceğim.

24-39 satırlarından silmek istediğinizi varsayalım. Ex komutunu kullanabilirsiniz

:24,39d

Ayrıca satırları kullanarak

:24,39y

Ve bulmak ve kullanarak 24-39 hatları üzerinden sadece

:24,39s/find/replace/g

11

Satır numaralarını set numbersizin aracılığınızla açarsanız, dNNGNN satırına geçerli konumdan silinir. Böylece silmek istediğiniz satırın başlangıcına gidebilir ve silmek istediğiniz d50Gson satır olduğunu varsayabilirsiniz.


10

Bu büyük bloğun ne olduğuna bağlı . Belki sadece bir paragrafı silmek dipistersiniz , bu durumda a bunu yapar.


Bahşiş için teşekkürler. Ne yazık ki burada kod ile çalışıyorum ve genellikle bundan daha ince taneli kontrol gerekiyor.
Justin Ethier

1
Ben de kod ile çalışıyorum ve mantıksal blokları boş bir çizgi ile ayırın. Bu ipucu sadece benim günümü yaptı. Artık üç tuş vuruşuyla büyük mantık bloklarını silebilirim.
miniml

'd' silme anlamına gelir, bu bağlamda 'p' paragraf anlamına gelir
user98761

7

Birkaç olasılık vardır, en iyisi üzerinde çalıştığınız metne bağlıdır.

Akla gelen iki olasılık var:

  • görsel moda geç ( V,, S-V...), imleç hareketine sahip metni seç ved
  • ile tüm paragrafı sil: dap

Ben çok sık şimdi bunu biliyorum ve dis ve daldırma tercih dap kullanın, ama, her zaman bir blok ve blok sonra gelen boş satır siler, ama blok ve boş satır silmek için bir yol vardı ondan önce mi geliyor?
Funkodebat

Paragraflı bir metnin ortasında sonuçta sözdizimsel bir fark yoktur, değil mi? Varsa, istediğinizi örneklerle yeni bir soruya yazmanızı öneririm.
Tom Regner

6

Tüm blok ekranda görünürse, göreceli sayı ayarını kullanabilirsiniz. Bakınız: relativenumber yardım. 7.3 sürümünde mevcut


Ne kadar yararlı olduğunun farkında değildim: se rnu onu kullanmaya başlayana kadar - 50dd'yi ve navigasyonu bilmek için harika, 50j
rshdev

3

İmlecinizi bloğun başına veya sonuna getirebilir ve görsel moda girebilirsiniz (shift-v). Ardından istenen blok vurgulanana kadar yukarı veya aşağı hareket edin. Son olarak, y tuşuna basarak metni kopyalayın veya d tuşuna basarak metni kesin.


belki tuhaf, ama bundan bir satırda istenen orta noktadan nasıl metin seçileceğini ve her satırın sonuna kadar aynı noktada birden fazla satır seçmeyi anladım. Tam aradığım şey.
nanker

3

Burada daha önce bahsedilen diğer hareketlerin yanı sıra /{pattern}<CR>hareket de var , bu yüzden foo içeren bir satıra silmek istediğinizi biliyorsanız, bunu yapabilirsiniz dV/foo<CR>. Vvarsayılan /olarak karaktersel olduğu için hareketi satır bazında zorlamak için burada .


3

Satırları saymak benim için çok sıkıcı, ama 'paragrafları' saymak o kadar da kötü değil. '{' ve '}' imleci sırasıyla imleçten önce ve sonra ilk boş satıra götürür. İmleç taşıma işlemleri silme ile birleştirilebilir ve diğer bazı cevaplar benzer bir yaklaşım kullanır (bir satır için dd, belgenin sonu için dG, vb.)
Örneğin:

/* Lorem ipsum dolor sit amet, consectetur adipiscing elit. */

Lorem *ipsum(void) {
  return dolor(sit, amet);
}

İmleciniz yorum bloğunun üstünde başlarsa, 'd}' yorum bloğunu ve 'd2}' hem yorum bloğunu hem de kod bloğunu siler. İmleciniz kod bloğunun altında başlarsa, 'd {' kodu ve 'd2 {' her ikisini de siler. Tabii ki, önce imleci hareket ettirerek bir bloğun üstünden atlayabilirsiniz: '{d {' veya '} d}'.

Boşluğunuzla tutarlıysanız veya paragrafları bir bakışta sayabiliyorsanız, bu işe yarayacaktır. Eğer ilgileniyorsanız Vim yardım dosyasında daha fazla imleç püf noktası var.


1

Ayrıca çok büyük bir sayı girebilir ddve imlecin altındaki tüm satırları silmek istiyorsanız tuşuna basabilirsiniz .


Son satıra varsayılan dGolarak belgenin sonuna kadar silen kullanımı daha da kolay olabilir G.
andyg0808

1

Bir metin bloğunu silme

İmlecinizin bloğun başında olduğunu varsayarsak:

V/^$<CR>d (where <CR> is the enter/return key)

açıklama

  • "Doğrusal-görsel" moduna girin: V
  • Bir sonraki boş satıra kadar vurgulayın: /^$<CR>
  • Sil: d

Anahtar bağlama

Daha sağlam bir çözüm:

:set nowrapscan
:nnoremap D V/^\s*$\\|\%$<CR>d

açıklama

  • Arama paketini devre dışı bırak: :set nowrapscan
  • DAnahtarı yeniden eşleyin (aşağıdaki komutlara)::nnoremap D
  • "Doğrusal-görsel" moduna girin: V
  • Bir sonraki boş / boşluk satırına veya EOF'a kadar vurgulayın: /^\s*$\\|\%$<CR>
  • Sil: d
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.