Geçerli satır değil, imlecin üzerindeki / altındaki satır nasıl silinir?


11

Geçerli satırın üzerindeki satırı (veya n satırı) silmek için bir komut var mı? Yukarıda = akım dahil değildir.

Yani, dkmevcut satırı silmeyen bir alternatif var mı? Nasıl o/ Ove p/ Pişe benzer, ancak silinerek.

Şu anda, kddimleci bir satır yukarı hareket ettirip silen yapıyorum . Yapabileceğim nnoremap <Leader>d kddve nnoremap <Leader>D jdd-ancak imleci hareket etmez bir alternatif olan daha iyi bir seçenek gibi görünüyor. Böyle var mı?


Sorunun sizin eşleştirmeleri imleci o ise niye yapmıyoruz nnoremap <Leader>d kddjve nnoremap <Leader>D jddk?
statox

kddjVeya düğmelerinden herhangi biri kullanıldığında jddksütun konumu korunmaz. Bunun büyük bir sorun olduğunu söylemiyorum ama sinir bozucu. Kayıt için, kddjimleç 1 satırını orijinal konumun altına taşır. Ve en azından ilk boşluk olmayan karaktere geri döndüğüm için jdd-daha iyi bir alternatif gibi görünüyor jddk. Silmek istediğim çizginin altındaki satır boşsa, satırın başında kaldım.
Martin Tóth

Haritanız için makdd`a kullanmaya ne dersiniz? Bir işaret koyar ve daha sonra ona geri döner ... ancak daha az kullanılan bir karakterle değiştirmek isteyebilirsiniz.
PhilippFrank

@PhilippFrank Veya `` imleci geri almak ve bir kayıt işgal etmemek için kullanabilirim (herhangi birini kullanmam :) değil).
Martin Tóth

Hayır, işe yaramaz, k bir sıçrama değildir, bu yüzden `` kullanarak geri dönemezsiniz.
PhilippFrank

Yanıtlar:


30
:-d

çizgiyi geçerli çizginin üzerinde keser.


:-5d

5. satırı geçerli satırın yukarısında keser (ancak imleci hareket ettirir).


:-5,-d

geçerli satırın 5 satırını keser.


:+,+5d

geçerli satırın altındaki 5 satırı keser.


2
Yine de bu imleci hareket ettirir.
PhilippFrank

1
İmleci hareket ettirmekten kaçınamazsınız. Yapabileceğiniz en iyi şey imleci hareket ettirmek ve geri taşımaktır .
romainl

Teşekkür ederim! Bu tür bir "vim yolu" aradığım şeydi. Bunu `` imleci olduğu yere geri getirmek için `` ile birlikte kullanacağım.
Martin Tóth

6

"- küçük silme kaydını kullanırsak, n satırını sildikten sonra imleç konumunu geri yükleyebiliriz.

Örneğin, d0dgk"-P1 satırın üstünü siler ve imleci bulunduğu yere geri yükler.

  1. d0imleçten satırın ilk karakterine kadar olan karakterleri siler. Yana 0özel bir hareket olduğunu, imlecin altındaki karakteri silinmez. Ve silinen karakterler küçük silme regsiter içine konur "-.

  2. dgk1 satırın üzerinde siler. Bu mevcut çizgiyi bırakacaktır, çünkü çizgi gkve münhasır değildir.

  3. "-P küçük silme kaydındaki metni koyar "-.

Bir çeţit hack. Ancak ex olmayan komutlar arıyorsanız, onu kullanmayı düşünün.


Güzel çözüm! Bence rağmen istediğiniz "-Pdeğil "-p. İkincisi metni biraz dağıtır.
James

@DJMcMayhem Haklısın. Cevabı düzelttim. İşaret ettiğiniz için teşekkür ederim.
MS.Kim

5

EDIT Cevabında @Romainl tarafından önerilen yerleşik özellikleri bilmiyordum: Tabii ki -dve +dyöntem tercih edilmeli, çünkü.vimrc

Belki buna böyle bir şey eklemek istediğiniz şey .vimrcolabilir:

function! DeleteOver()
   let save_cursor = getpos(".")
   normal k
   normal dd
   call setpos(".", save_cursor)
   normal k
endfunction

function! DeleteUnder()
   let save_cursor = getpos(".")
   normal j
   normal dd
   call setpos(".", save_cursor)
endfunction

Bu işlevler, geçerli satırın altındaki satırı veya satırı siler ve silme işleminden önceki konuma geri döner.

İşlev DeleteOver()için normal k, silme işleminden sonra bir satır yukarı gitmemiz gerekir, çünkü silme işlemi gerçekleşmeyen orijinal satırın numarasını değiştirirDeleteUnder()

Bunu ayrıca .vimrc

nnoremap <Leader>d :call DeleteOver()<CR>
nnoremap <Leader>D :call DeleteUnder()<CR>

Fonksiyonları çağıran eşlemeler oluşturmak.


İmleç konumunu kaydetmeye / geri yüklemeye bir alternatif, nostartoflineseçeneğin ayarını kaldırmak / geri yüklemektir .
Zengin

2

Belki de atlamaktan korkmazsan iş akışını iyileştireceksin :)

Misal:

This is where cursor initially is: _.

[Some other stuff you want to keep/skip ...]

I want to delete these lines.
I want to delete these lines.
I want to delete these lines.
I want to delete these lines.
I want to delete these lines.

Hareketlerin (normal mod, imleç üzerinde _): /I want Enter 5dd Ctrl-o. Bu kadar.

Tabii ki, romainl cevabı tüm satırları silmek istediğinizde en iyisidir ve ofsetlerini kolayca sayabilirsiniz (örneğin, göreceli keten numaralarını kullanarak). Yukarıdakiler "harekete geçmenin" daha genel bir yoludur: atlama olarak sayılan bir şey kullanarak oraya gidin: bu, metni değiştirdikten sonra her zaman geri atlayabileceğiniz anlamına gelir.

Örneğin, mutlak satır numaraları kullanıyorsanız, yerine doğrudan bu satır numarasına atlamak için veya /I want Entergibi bir şey kullanabilirsiniz.78gg78G


0

Ms-kim çözümüne dayanarak, col postion tasarrufu sağlayan biraz farklı bir varyasyon geliştirdim.

function! DeleteLineAbove()
    if line('.') == 1
        echom "You are at the first line!"
        return
    endif
    let l:colsave = col(".")
    exec  "normal! kdd"
    call cursor(line("."), l:colsave)
endfunction
nnoremap <Leader>k :call DeleteLineAbove()<CR>

OBS: Ben de kullandım bu yazıyı referans olarak.


Şunu mu demek istediniz: @statox @ @ MS.Kim?
Zengin

-1

Dosyanın tamamında yinelenen satırları silmek istiyorsanız, aşağıdakileri yapmanız yeterlidir:

:g/any part of the string/d

Misal:

Komut modunda

:g/I want to delete/d

Başlangıçta sadece dize (ler) in bir listesini istiyorsanız:

:g/I want to delete/p

3
Bunun sorulan soruya nasıl cevap verdiğinden emin değilim?
Martin Tournoij
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.