Bagaimana saya bisa membalik urutan baris sehingga baris pertama muncul di akhir dan baris terakhir muncul terlebih dahulu? (Bisa jadi semua baris dalam buffer, rentang alamat, atau pemilihan mode visual secara garis.)
Saya ingin berubah
rat
ox
tiger
⋮
dog
pig
ke
pig
dog
⋮
tiger
ox
rat
tanpa menggunakan perintah eksternal seperti tac
.
rearrangement
200_sukses
sumber
sumber
Jawaban:
Kekuatan global akan bekerja di sini:
Atau, lebih sederhana (terima kasih @tommcdo)
Yang pertama akan cocok dengan setiap baris dan untuk setiap baris, hapus dan tempel ke bagian atas file. Saat bergerak melalui file, itu membalikkan teks.
Yang kedua sama cocok dengan setiap baris dan memindahkannya ke bagian atas file.
Catatan: Keduanya berfungsi pada seluruh file dan tidak akan berlaku dengan benar untuk membalikkan bagian dari baris. Lihat jawaban Ingo Karkat untuk solusi yang bekerja dalam kisaran.
Deskripsi:
g
perintah global/^/
cocok dengan semua baris yang memiliki permulaan (yaitu semua baris)exe
jalankan string berikut ini"normal
lakukan perintah mode normaldd
hapus barisgg
pindah ke atasP
tempel file di atas posisi saat inimove 0
memindahkan baris saat ini ke bawah garis 0 (yang menempatkannya di posisi 1, atau baris pertama file)sumber
:normal
perintah, kita bisa menggunakan perintah Ex:move 0
, yang memindahkan garis ke awal buffer.:execute
hanya diperlukan ketika perintah perlu dibangun secara dinamis, mis:execute 'normal' g:user_command
.:execute
karena saya sering berakhir menambahkan perintah Ex lain setelah yang ada nanti, dan lebih mudah bagi saya untuk memiliki di:exe
sana daripada harus kembali dan memasukkannya nanti. Sayangnya, kebiasaan itu bocor ke jawaban ini di mana itu tidak berlaku banyak.:execute
: karena dibutuhkan sebuah string, ia memberikan penggambaran yang jelas untuk di mana perintah mode-normal berakhir, meskipun saya tidak membangun string, lebih mudah bagi saya untuk menemukan tanda kutip yang seimbang daripada mencari<esc>
atau apa pun untuk menghentikan mode. Sekali lagi, ini adalah preferensi dan kebiasaan pribadi. :-):9,11g/^/move 8
... Angka terakhir harus menjadi awal rentang minus 1 (diadaptasi dari jawaban Ingo).Baris satu ini (untuk Anda
~/.vimrc
) mendefinisikan sebuah:Reverse
perintah; Anda juga dapat menggunakan:global
bagian tersebut secara langsung, tetapi sintaksisnya:move
(yang secara iteratif menggeser garis sebelum dimulainya rentang, dengan demikian membalikkannya) tidak mudah untuk dihafal:sumber
<line1>
&<line2>
diminta untuk membuat karya ini pada kisaran, yaitu::7,9Reverse
(mereka fiturcommand
, bukanglobal
ataumove
). Yang lebih sederhana:command! -bar -range=% Reverse :global/^/m 0
juga akan berfungsi, tetapi hanya untuk seluruh penyangga ...Vim murni:
Penjelasan:
Sumber: Membalik semua garis dan Kekuatan g pada vim wikia.
Beberapa contoh menggunakan perintah eksternal:
tac
(bagian dari GNU coreutils -cat
terbalik):tail
pada BSD / OSX (tidak kompatibel dengan POSIX):Untuk lebih banyak ide, lihat:
sumber
:g/^/m0
sama dengan:g/^/move 0
, yang merupakan jawaban John?tac
juga). Tetapi saya menduga downvote itu karena jawaban yang diulang.tac
disebutkan oleh OP, tetapi semua pertanyaan serupa lainnya akan merupakan duplikat dari ini, jadi ada baiknya untuk menyebutkannya lagi. John mengambil cmd ini dari komentar @tommcdo, saya awalnya mengambilnya dari DerMike , tapi saya pikir dia mengambilnya hanya dari wikia, jadi saya memberikan kredit kepada vim wikia, jadi itu tidak sepenuhnya duplikat karena penjelasannya sangat berbeda.Dalam semangat VIML fungsional:
getline(1, line('$'))
mengembalikan daftar semua baris dalam buffer.'$'
adalah argumen khususline()
yang menunjukkan baris terakhir dalam buffer.reverse(...)
membalikkan daftar input, di tempat. Seseorang harus menggunakanreverse(copy(...))
jika daftar input tidak boleh dimodifikasi.setline(1, ...)
mengganti baris yang ditentukan dengan argumen kedua. Ketika argumen kedua adalah daftar, jumlah baris yang sama dengan panjang daftar diganti dengan konten daftar.Jika suka, Anda juga dapat menentukan perintah yang mengambil rentang (
%
buffer keseluruhan default )sumber
hlsearch
diaktifkan) seperti:g/
perintah dari jawaban lain ... Kinerja mungkin lebih buruk, sih ? Karenagetline(1, line('$'))
mendapat seluruh buffer dalam memori.reverse()
tampaknya di tempat, sehingga harus mengambil memori sangat sedikit seperti ...Per Dokumentasi Vim usr_12.txt - Trik Pintar
sumber
Menggunakan angka relatif. Paragraf dimulai pada baris 13 dan mengirim lebih banyak 4 baris
sumber