Vim'de seçilen satır sırasını nasıl tersine çeviririm?


94

Örneğin, aşağıdaki gibi dört satır varsa:

ilk satır
ikinci satır
üçüncü satır
dördüncü satır

Onları tersine çevirmek istiyorum.

dördüncü satır
üçüncü satır
ikinci satır
ilk satır

Bunu Vim'de nasıl yapabilirim?




1
:command! -bar -range=% Reverse <line1>,<line2>global/^/m<line1>-1 vi.stackexchange.com/a/2107/10254
qeatzy

Yanıtlar:


86

Bir dosyadaki tüm satırları ters çevirmek için,

:g/^/m0

Bir açıklama için bkz.

:help 12.4

Bu aynı zamanda sadece bir dizi hattın nasıl tersine çevrileceğini gösterir.


12
Kesin yardım bölümünde harika bir ipucu! Özetlemek için: 1. geri çevirmek istediğiniz son satıra bir işaretçi koyun (işaretleyiciyi 'a' kullanarak adlandırırım ma), 2. imleci bloğun ilk satırına getirin, 3. tür:'a,.g/^/m 'a
Brent Faust

68

İstenilen çizgileri seçin, tuşuna basın !ve ardından gelen satırda satırları tacbir la ile işaretleyin :'<,'>!tac. Daha man tacfazla ayrıntı için bakınız.


4
Çizgileri seçmek için shift+vgörsel çizgi moduna girmek için düğmelerini kullanın , daha sonra jseçime çizgiler ekleyin.
WISBucky

Bunun Windows'da da çalıştığını onaylayabilirim gvim! Aksi taktirde, mutlak satır numaraları kullanmanız gerekir (belki akraba kullanabilirsiniz, ancak dikkatli olmanız gerekir) :g/^/m0(hatırlanması da gerçekten zor olan) ... Bu nedenle, aslında, hangi platformda olursa olsun tac vim ile birlikte olmalıdır. sen, ANCAK% 100 vimscript değil, kimin umurunda: P
dylnmc 12:18

tac tam olarak doğal vim işleme değildir, ancak 'm'ove komutu bir satır numarası alır ve bu her zaman makul değildir. Sıklıkla bir aralığın parçası olarak bir işaret kullanırım, bu yüzden :.,'a!tacminimum çabayla çalışır.
studog

Kullandıktan sonra , bir sonraki paragrafa veya boş dikey alana ulaşmak için shift+vkullanabilirsiniz }. Ayrıca man tac: concatenate and print files in reverse,.
nilon,

33

Mac OS X'te tacmevcut değil, ancak tail -raynı etkiyi kullanabilirsiniz:

:%!tail -r

Bu ayrıca görsel mod için iyi çalışıyor:

:'<,'>!tail -r

tail(1)'Sayfasından alıntı :

-R seçeneği, girişin satır sırasına göre ters sırada görüntülenmesine neden olur. Ek olarak, bu seçenek -b, -c ve -n seçeneklerinin anlamını değiştirir. -R seçeneği belirtildiğinde, bu seçenekler, görüntülenecek olan girişin başından veya sonundan itibaren bayt, satır veya satır yerine, görüntülenecek bayt, satır veya 512 bayt blok sayısını belirtir. -R seçeneği için varsayılan girişin tümünü göstermektir.


3
Mükemmel! Öyleyse OS X altında 'tac' sağlamak için:alias tac='tail -r'
Brent Faust

4
Ayrıca brew install coreutilsve kullanabilirsiniz gtac.
Andrew Marshall

1
Cin. Kullanmayı asla düşünmedim! bu tür görsel çizgi manipülasyonu için komutlar.
Charlie Dalsass

3

Görsel modda daha rahat olanlar için:
1. Kullanılmasını istediğiniz seçimin üstündeki satır numarasını tanımlayın :set nu.
2. Shift-Vİstediğiniz seçimi vurgulamak için (görsel mod).
3. :g/^/m <Line number from step 1>.

Görsel modda :'<,'>g/^/m <Line number>, komutu 3'ten itibaren yazdığınız gibi otomatik olarak görüneceğini unutmayın .

Bu komut, seçimi bir seferde bir satır, verdiğiniz satır numarasına getirerek çalışır. İkinci öğe verilen satır numarasına basıldığında, ilk satırın + 1'e indirilmesini sağlar. Ardından üçüncü, birinci ve ikinci aşağı ve böylece tüm listenin tek satır numarasına itilmesine kadar devam eder. sıralı listeyi tersten uygulayın.


4
'<Satır numarasını manuel olarak girmek yerine kullanabilirsiniz . Seçimi bir satır önceden başlatmanız yeterlidir :'<,'>g/^/m'<.
Palec

3

:Rev[erse]Sizin için bir komut ve isteğe bağlı eşlemeler vimrc, bu nedenle bu tarifin açıklanmayan adımlarını hatırlamanız ve gerçekleştirmeniz gerekmez:

" Reverse the lines of the whole file or a visually highlighted block.
    " :Rev is a shorter prefix you can use.
    " Adapted from http://tech.groups.yahoo.com/group/vim/message/34305
command! -nargs=0 -bar -range=% Reverse
    \       let save_mark_t = getpos("'t")
    \<bar>      <line2>kt
    \<bar>      exe "<line1>,<line2>g/^/m't"
    \<bar>  call setpos("'t", save_mark_t)

nmap <Leader>r :Reverse<CR>
xmap <Leader>r :Reverse<CR>

( yazdırılabilir karakterlerin eşleştirilmesi için önerildiği :xmapgibi Görsel olan ancak Seçim modu olmayan :help mapmode-xharitalar.)

(Dayanarak: http://tech.groups.yahoo.com/group/vim/message/34305 )


Bu kabul edilen cevap IMO olmalıdır. En kullanışlı ve hatırlamama gerek yok :'<,'>g/^/m'<:)
Eliot

1
@Eliot, teşekkürler! :) (Biraz 'bonus içeriği' ekledim.;))
Aaron Thoma

Bu durumda seçimin -1 başladığını nasıl söyleyebilirim? Çünkü hareket bu noktada başlıyor.
SergioAraujo

@SergioAraujo: Aradığın şeye benziyor :-1,+1Revmu? Eğer görsel, örneğin tersine çevirmek istediğiniz aralığı seçebilirsiniz Bilin ki: V7j:Rev. Bu sorunuza cevap vermezse, anlamadım, bu yüzden benim için detaylandırmanız veya tekrar ifade etmeniz gerekir.
Aaron Thoma

1

Diyelim ki 3. satırdasınız, bu nedenle 3-6 aralığında bir değerimiz var.

:3,6g/^/m2

1
Geçerli satırın numarasını gizli bırakabilirsiniz: Menzilinizin ilk satırındaki imleç ile kısaltabilirsiniz :,6g/^/m2; veya aralığın son satırında :3,g/^/m2:; ve :3,6g/^/m2dosyanın herhangi bir yerinden çalışır.
Aaron Thoma
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.