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


91

Vim'de genellikle büyük metin bloklarını silmem veya yank / koymam gerekir.

Metin satırlarını sayabilir ve 50dd50 satır silmek gibi bir şey girebilirim .

Ama bu biraz acı verici. Nasıl metin bu büyük bloğunu silebilirsiniz olmadan önceden silmek kaç satır bilmek zorunda?


4
Sonun nerede olduğunu nereden biliyorsun? Sonu tanımlayabilirseniz o noktaya silebilirsiniz. Eğer movesonuna kadar nasıl yapabileceğinizi açıklayabilirseniz . Sonra sonuna kadar silmek, sonuna kadar taşımaktan farklı değildir.
Martin York

@Loki, sonuna kadar hareket ettirmek, genellikle oraya ulaşana kadar sadece sayfa aşağı ve ok tuşlarını kullanıyor. Bu olabilir Bu, birinci ya da onuncu boş hattı olabilir , ilk kapatma bağ olabilir. Alt satırda, biraz değişir.

2
ayrıca bu cevabı da kontrol edin: stackoverflow.com/a/16407391/164835
Kent

Yanıtlar:


111

Bloğunuzun başlangıç ​​satırına gidin ve ma("a" işaretini yazın) , elbette farklı harfler kullanabilir, ancak farklı işaretler için birden fazla harf bile kullanabilirsiniz ; .

Sonra son satıra gidin ve d'a("a" işaretlemek için silin) ​​veya y'a("a" işaretlemek için yank) (a) yazın .

Bu, akımdan işaretli hattına (dahil) giden tüm satırları siler / yank yapar.

Ardından, pveya gibi normal yapıştırma komutlarıyla başka bir yere yapıştırabilirsiniz P.

Ayrıca ile uyumlu vihem de vimortamınızı ikincisi ile kutsanmış olmadığını kapalı şans.


(a) Örneğin, aramak istediğim bir işlevin tanımını kopyalayıp yapıştırmak gibi başka bir yere bakmam gerekirse, dosyadaki yerimi kaydetmek için de bunu kullanırım.

Ben sadece şu anki çizgiyi aynı şekilde işaretlerim ma, sonra aradığınızı bulmak için dolaşırım.

Sonra onu bulduktan ve bir kayıt defterine kopyaladığımda 'a, önceden kaydettiğim satır olan "a" işaretine geri dönmek için girdim, sonra yapıştırabilirim.


9
Bunun için görsel modu da kullanabilirsin, değil mi?
jmc

3
Bu bir yol, jmc, ama standart vi'in görsel bir modu olduğundan emin değilim .

5
Yaklaşık bir yıl önce görsel seçimden işaretlemeye ve göreceli satır numaralarına geçtiğimden beri, vi hareket komutlarının görsel seçimden çok daha hızlı ve verimli olduğunu buldum. Her ne zaman daha sonra tuşa her basışımda daha kolay olsa da vkendime gerçekten ihtiyacım var mı yoksa daha iyi bir hareket yolu var mı?
Sukima

1
Evet, aynı şekilde ilginç, @Sukima, bir GUI'de bile fareyi kullandıkça daha verimli hissediyorum. Klavyede kalabilirsem kendimi daha hızlı buluyorum.

3
Eğer gerçekten uzun çizgileri olan bir şeyi düzenliyorsanız, bunun backtick versiyonu da çok kullanışlı olabilir (bu, tüm çizgiden ziyade çizginin bulunduğu yere atıfta bulunur).
msouth

65

Vim'de görsel çizgi modunu kullanın :

  1. İmlecinizi kaldırmak için metin / kod bloğunun en üst satırına getirin
  2. Basın V(Bu büyük "V": Shift+ v)
  3. İmleci, kaldırmak için metin / kod bloğunun altına getirin
  4. Basın d

Büyük metin bloklarını silmek için bu, basit görsel modda tercih edilir çünkü imlecin hangi sütunda olduğu konusunda endişelenmenize gerek yoktur.


3
3. adımda, nesne hareketlerini kullanarak daha hızlı hareket edebilirsiniz. Örneğin }paragrafın tamamını veya )cümleleri seçmek için kullanabilirsiniz . Dahası var, onlar hakkında okuyabilirsiniz:h object-motions
mxlian

2
Ayrıca bir alt dize aramak /something<CR>, seçim bloğunuzun sonuna ulaşmak için çok etkili bir yöntemdir
mxlian

1
Bu benim tercih ettiğim yöntem. Bununla birlikte, alternatif jolarak imleci aşağı hareket ettirmek için art arda basmak zorunda kalmadan (adım 3), ardından Go satırı seçmek için ardından satır numarasını yazabilirsiniz . Örnek:V150Gd
Ranhiru Jude Cooray


39

Yapısını bilen büyük blok metinleri kolayca silebilirsiniz.

Paragraf ise, d{şunları kullanın: (örneğin, paragraf sayısı ile önek yapabilirsiniz)

Parantez içindeki bir kod bloğuysa, şunu kullanın: d%

Metin dosyanın sonuna kadar belirirse, şunu kullanın: dG

Nasıl bittiğini biliyorsanız, şunu kullanın: d/ve ardından gelen bitiş metnini yazın Enter(ayrıca normal ifadeyi de kullanabilirsiniz, böylece olanaklar sınırsızdır).

Alternatif olarak, görsel modu ( V) kullanın ve metni hızlıca seçmek için hareket tuşlarını kullanın (örn. By {) ve çıkartın ( d).

Ya da Lie Ryan'ın önerdiği gibi, d/search-string/emevcut imleçten aranan dizeye metin silmek için kullanın .

Bkz: :help dve :help motiondaha fazla bilgi için.


2
Ayrıca, d/search-string/emevcut imlecin içinde arama dizesinin kendisi de dahil olmak üzere arama dizesinin sonuna kadar c/search-querysilme ve silme işleminden sonra ekleme moduna girme de mümkündür. Kullanımı d/ile set incsearchbu etkileşimli doğru metin aralığına çalışıp çalışmadığını anlamaya ve gereğinden daha fazla yazarak önlemek için arama sorgusu yazmaya ne zaman duracağını bilmek yardımcı olmalarına olanak tanır olarak düzgün bir kombinasyonudur.
Lie Ryan

4
Ayrıca bulmak dile a(dış), ya da i(iç) ve bir nesne belirteci çok yararlı. Gibi nesneleri wkelime için, pparagraf için, (veya biçin (...), [için [...], {veya Biçin {...}vb görsel-operatörler için belgeler .
Shahbaz

22

Hareketleri ve / veya metin nesnelerini kullanabilirsiniz. Örneğin, imleçten sonraki boş satıra kadar olan her şeyi silebilirsiniz d}. İmleç bir paragraf içinde ise, paragraf ile silinebilir dipya dap. İmleç bir HTML etiketinin içindeyse, ditveya ile silebilirsiniz dat.

Bunlar için iyi kısaltmalar "dir d elete i nside" ve " d elete bir yuvarlak" (paragraf / etiket / parantez).


11

genellikle yaparım

:<start>,<end>d

(verilen satırlar dahil) verilen başlangıç ​​ve bitiş satırları arasındaki her satırı siler.

Her ikisinin de startve endbaşka bir konumdan mutlak satır numaraları, desenler veya ofsetler olabileceğini unutmayın .

Ayrıca doubleDown'ın Vim'in seri belgelerine bakma hakkındaki yorumuna bakın , bazı yararlı ipuçlarına sahiptir.

Örnek:

Aşağıdaki dosyaya sahip olduğunuzu söyleyin:

1. The quick brown
2. fox jumps
3. over the
4. lazy dog.

Sonra komutu kullanarak :2,3dveya :/fox/,/over/dveya :/quick/+1,/lazy/-1veya :+1,+2dilk satırdaysanız veya :-1,.düçüncü satırdaysanız, aşağıdakilerle sonuçlanırsınız:

1. The quick brown
4. lazy dog.

Ancak bu, hala satırları saymanız gerektiği anlamına mı geliyor? Yoksa cevabını yanlış mı anladım?
Martin Tournoij

7
Satırları saymanız gerekmez, ancak satır numaralarını bilmeniz gerekir.
jmc

Önce yapın :set ruler, sonra metnin en üstüne ve altına gidin startve endsatır numaralarını bulun , sonra yapın:<start>,<end>d
roblogic

1
Göreceli satır numaralarını da kullanabilirsiniz:+12,+24d
rpattabi

2
Aslında, bunun için <start>ve bunun <end>için bir çift satır numarası, bir çift desen veya karışık çift kullanabilirsiniz . Referans için bkz :h [range]. Bu yüzden aslında yaptığınızdan biraz daha esnek.
doubleDown

5

Sınırlandırılmış bloklarla (örneğin: kod veya XML / HTML etiketleri) uğraşıyorsanız, imleci bloğun başlangıcına konumlandırabilir ve %kodun tüm bloklarını hızlıca seçmek için görsel modla birlikte kullanabilirsiniz. donları silmek için.


5
Alternatif olarak, kullanabilirsiniz dap, bir paragraf silmek da(, da{, da[, parantez, parantez veya köşeli parantez delimeted blokları silin. HTML için dat, bir etiketi silen da've da"dizeleri silen var. Orada da dip, di(sınırlayıcı içindeki her şeyi silmek, ancak sağlam ayraçları bırakacaktır vb varyantları. Alternatif olarak, vap(resp vip) içindeki (resp ) tüm paragrafı seçmek için kullanabilirsiniz . (Ve böylece var va(ve var vi(.) Ayrıca silmek ve ekleme moduna (yani, "değiştirmek") capve cip(veya ca(ve ci() vardır. Ve yapyank için
jmc

Sanırım daha önce yaptığı açıklamada açıklanan bazı bağlamalara ilişkin jmc, Tim Pope tarafından surround.vim eklentisindendir. Yüklemenizi tavsiye edebileceğim harika bir eklenti, ancak bu bağlantıların varsayılan vim yüklemesinin bir parçası olmadığı anlamına geliyor.
Haegin

5

Tüm diğer iyi tavsiyeler dışında, mevcut imleç konumundan ekrandaki son görünür çizgiye kadar her şeyi silmek için d+ Shift+ ekliyorum L. Komutu tekrarlamak sizi nispeten hızlı indirecektir.


5

Numbers.vim eklentisi bunun için çok yararlıdır. Her satırdan önce bir satır numarasıyla ilerlemenin gelişmiş bir yoludur. Gibi 'number've 'relativenumber', ikisi de bir araya geldi!

Yüklemeden sonra varsayılan olarak etkindir, set numbereğer henüz almadıysanız vimrc'nize eklemek istersiniz , çünkü sizde yoksa garip şekillerde çalışır.

Gelen normal modda benzer görünüyor :set relativenumber:

  3 call plug#begin('~/.vim/plugged')
  2 
  1 Plug 'myusuf3/numbers.vim'
7   set number█
  1 
  2 " Add indentation 'guidelines' (:IndentLinesToggle or <F11>)
  3 Plug 'Yggdroot/indentLine'

İmlecin açık olduğu satır, mutlak satır numarasını gösterdiği satır hariç (bu durumda 7) , göreli satır numaralarını gösterir.

Daha sonra ekleme moduna geçersek, numberher zaman mutlak satır numaraları gösterilerek ayarlanmış gibi davranır :

  4 call plug#begin('~/.vim/plugged')
  5 
  6 Plug 'myusuf3/numbers.vim'
  7 set number█
  8   
  9 " Add indentation 'guidelines' (:IndentLinesToggle or <F11>)
 10 Plug 'Yggdroot/indentLine'

Daha fazla seçenek ve birkaç komut var (ana sayfayı kontrol edin), ancak varsayılanlar çoğu insan için çalışmalıdır.


İlk başta bu cevabın biraz konu dışı olduğunu düşündüm ama sonra eklentiyi yükledim ve bunun benim için bir oyun değiştirici olduğunu söylemeliyim. Manuel olarak değiş tokuş ediyordum ve ekstra zihinsel adım, bu hareketleri kullanmaktan çekindiğim anlamına geliyordu. Teşekkür ederim!
Sukima

1
Bu, göreceli satır numaralandırmasını değiştirmek için bir InsertEnter / InsertLeave autocmd öğesinin yapabileceği bir şeye benziyor. Bir şey mi eksik?
Ben,

Partiye ÇOK geç kaldım ama @ Ben haklı, bu sadece bir kaç otomatik komut satırı. Örneğin, benim vimrc'imde set number, set relativenumbero zaman autocmd InsertEnter * :set norelativenumberveautocmd InsertLeave * :set relativenumber
B Katmanı,

4

Başka bir yaklaşım ise, belirli bir düzende silmeye çalışıyorsanız, basitçe yazabilirsiniz d/delimEnter.


2

Normal giriş prosedürü dartı bir hareket (diğer cevaplarda daha önce açıklandığı gibi) kullanabilirsiniz. EasyMotion eklentisi, sorununuzu hızlı ve kolay bir şekilde çözebilecek yeni hareketler sunar.

Geçerli imleç konumundan ekrandaki herhangi bir kelimenin sonuna kadar silmek istediğinizi <Leader><Leader>evarsayalım , hareket tuşları (normal eharekete benzer ) olacaktır. Ardından, söz konusu kelimenin sonunda görünen vurgulanmış harfleri yazın. Ayrıca bir çizgi hareketi vardır, böylece mevcut çizgiyi söz konusu çizgiye kadar silebilirsiniz <Leader><Leader>j.

Benim sahip <Leader>anahtar olarak ayarlanmış ,. Dolayısıyla, tam komut d<Leader><Leader>e{vurgulanmış harf (ler)} şeklindedir.

Kimden :help easymotion:

EasyMotion vim'de bazı hareketleri kullanmak için çok daha basit bir yol sağlar. O alır <number>gibi durumlar o <number>w veya <number>f {char}tüm olası seçenekleri ön plana ve hedefe doğrudan atlamak için bir tuşa basın izin vererek.

Mevcut hareketlerden biri tetiklendiğinde, imleçten önceki veya sonraki tüm görünen metinler soluklaşır ve hareket hedefleri vurgulanır.

Düzenle:

EasyMotion en github deposu olan https://github.com/Lokaltog/vim-easymotion .

Easymotion kullanan kişiler hakkındaki bu reddit eğlenceli bir okuma olabilir.


1

Sorunu çözebilecek basit bir çözüm var.

İmlecinizi kaldırmak istediğiniz metin bloğunun başlangıcına getirin ve yapın d50gg.

Bu işlem, geçerli konumunuzdan metninizin 50. satırına kadar olan tüm satırları siler.

eq: Eğer imleciniz 46. ​​satırdaysa , 4 satırı d50ggsilecektir .


1
GVi'de de çalıştığı gibi gg yerine kullanmanızı öneririm ve elbette :set numbergitmek istediğiniz hattın hangi satır numarasını bulmak için her zaman faydalıdır.
Random832

Bu sorunun asıl amacı, kaç satır silmek istediğinizi bilmemenizdir.
200_success

200_success, gönderdiğim cevapla kaç satır silmek istediğinizi bilmek zorunda değilsiniz. Tüm bilmeniz gereken "hangi çizgiyi kaldırmak istiyorsunuz"
Geee

1

Çizgi vurgulama ile görsel modu kullanın.

  1. İmlecinizi kaldırmak için metin / kod bloğunun en üst satırına getirin
  2. Shift+ Tuşlarına basınv
  3. İmleci, kaldırmak için metin / kod bloğunun altına getirin
  4. Basın d

Kod bloklarını silmek için bu yöntemi tercih ediyorum çünkü tüm satırları basitçe imleci istediğinizi silmek için imleci doğru sütuna yerleştirmek zorunda olduğunuz görsel mod kullanarak siliyor.


3
Aslında cevabı @ 200_success ile tekrarladınız.
Martin Schröder,

1

relativenumberSürekli olmaktan hoşlanmıyorum , bu yüzden Vim'imi yalnızca Görsel Moddayken etkinleştirecek şekilde yapılandırdım:

" Entering Visual mode
nnoremap <silent>     v :set relativenumber cursorcolumn<CR>v
nnoremap <silent> <C-q> :set relativenumber cursorcolumn<CR><C-q>
nnoremap <silent>    gv :set relativenumber cursorcolumn<CR>gv
nnoremap <silent>     V :set relativenumber<CR>V

" When finished
augroup ClearCursorColumnAndLine
    autocmd!
    autocmd CursorHold * set norelativenumber nocursorcolumn nocursorline
augroup END

Bu görevinizi kolaylaştırır:

V49jd

Çünkü vurulduktan sonra Vhedef hattın ne kadar uzakta olduğunu görebilirsiniz.

Bu, uzun vadede can sıkıcı olabilir (metin, relatumberumber etkinleştirildiğinde / devre dışı bırakıldığında sağa ve sola kayar), ancak şimdiye kadar oldukça zevk alıyorum.


1
Bence kullanır v<Esc>d50jmısın?
Martin Tournoij

Teşekkürler, gerçekten yanlış yazmıştım. Aslında V, hatlı bir işlem yapacağımı bilirsem başlarım ve daha dfazla güven için sonuncuyu bırakabilirim .
joeytwiddle

Cevabım, fakir bir adamın , başka bir cevapta sunulan sayılar.vim eklentisine yaklaşımı gibi görünüyor . ;-)
joeytwiddle

1

Benim için harika olan şey vi:

  1. :set number satırın sayısını silmek istediğim yere kadar görüntülemek için;

    +1289 idle 
    +1289 idle 
    +1290 # <- I want to delete until here
    +1291 if [[ ! -z "$SFIN" ]]
    
  2. Silme işleminin başlaması gereken satıra geri dönün

  3. Normal modda geçerli satırdan silme kullanılmış> d1290G
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.