pindahkan pilihan ke file terpisah

12

Dengan vim, bagaimana saya bisa memindahkan sepotong teks ke file baru? Untuk saat ini, saya melakukan ini:

  • pilih teks
  • menggunakan :w new_file
  • pilih teks lagi
  • hapus teksnya

Apakah ada cara yang lebih efisien untuk melakukan ini?

Sebelum

a.txt

sometext
some other text
some other other text
end

Setelah

a.txt

sometext
end

b.txt

some other text
some other other text
greg0ire
sumber

Jawaban:

4

Bagaimana dengan perintah khusus ini:

:command! -bang -range -nargs=1 -complete=file MoveWrite  <line1>,<line2>write<bang> <args> | <line1>,<line2>delete _
:command! -bang -range -nargs=1 -complete=file MoveAppend <line1>,<line2>write<bang> >> <args> | <line1>,<line2>delete _
Ingo Karkat
sumber
1
Ini sangat jelek, tapi hei, sepertinya melakukan dalam satu langkah persis apa yang saya minta (saya coba). +1, dan diterima. Saya sedang mencari cara asli untuk melakukan ini dengan cepat tetapi karena sepertinya tidak ada satu, Anda akan baik-baik saja. Terima kasih!
greg0ire
1
Kecantikan ada di mata yang melihatnya. Saya menemukan ini cukup elegan; Anda hanya perlu mengetikkan satu kali (ke .vimrc Anda).
Ingo Karkat
Anda benar, "sangat jelek" harusnya "sangat asing". Perintah Anda sangat berguna, dan saya pikir saya pasti akan mengukirnya di .vimrc
greg0ire
8

Dengan "memindahkan sepotong teks ke file baru" Saya berasumsi maksud Anda memotong potongan teks dari file saat ini dan membuat file baru yang hanya berisi teks itu.

Berbagai contoh:

  • :1,1 w new_file untuk membuat file baru yang hanya berisi teks dari nomor baris 1
  • :5,50 w newfile untuk membuat file baru yang berisi teks dari baris 5 ke baris 50
  • :'a,'b w newfileuntuk membuat file baru yang berisi teks dari tanda ake tandab
    • setel tanda Anda dengan menggunakan madan di mbmana pun Anda suka

Di atas hanya menyalin teks dan membuat file baru yang berisi teks itu. Anda kemudian perlu menghapus sesudahnya.

Ini dapat dilakukan dengan menggunakan rentang dan dperintah yang sama:

  • :5,50 d untuk menghapus teks dari baris 5 ke baris 50
  • :'a,'b duntuk menghapus teks dari tanda ake tandab

Atau dengan menggunakan dduntuk kasing tunggal.

Jika Anda memilih teks menggunakan mode visual, dan kemudian menekan :saat teks dipilih, Anda akan melihat yang berikut pada baris perintah:

:'<,'>

Yang menunjukkan teks yang dipilih. Anda kemudian dapat memperluas perintah ke:

:'<,'>w >> old_file

Yang akan menambahkan teks ke file yang ada. Kemudian hapus seperti di atas.


Satu liner:

:2,3 d | new +put! "

Rinciannya:

  • :2,3 d - hapus baris 2 hingga 3
  • | - secara teknis ini mengalihkan output dari perintah pertama ke perintah kedua tetapi karena perintah pertama tidak menghasilkan apa-apa, kami hanya menggabungkan perintah bersama
  • new - membuka buffer baru
  • +put! "- memasukkan isi register yang tidak disebutkan namanya ( ") ke dalam buffer
    • Bang ( !) ada di sana sehingga isinya diletakkan sebelum baris saat ini. Ini menyebabkan dan mengosongkan baris di akhir file. Tanpanya, ada baris kosong di bagian atas file.
tertanam.kyle
sumber
Asumsi Anda benar. Ini terlihat bagus, saya akan menguji. Bisakah Anda jelaskan 2. lebih banyak? Saya tidak terlalu terbiasa dengan rentang. EDIT: Jika saya mencoba ini di baris kedua, itu menulis baris pertama ke file lain, bukan baris kedua.
greg0ire
@ greg0ire Saya mendapatkan sedikit mundur, saya akan mengedit untuk menjelaskan lebih baik
embedded.kyle
Saya menambahkan contoh untuk memperjelas pertanyaan saya.
greg0ire
@ greg0ire Saya mengoreksi jawaban saya. Itu masih dua langkah. Salinan dan penulisan pertama. Penghapusan kedua.
embedded.kyle
1
Solusi bagus! Anda juga bisa menuliskannya '<,'>d | new | 0put "untuk kejelasan.
Atrip
1

Berdasarkan jawaban @ embedded.kyle dan Tanya Jawab ini , saya berakhir dengan liner satu ini untuk menambahkan pilihan ke file dan menghapus dari file saat ini. Setelah memilih beberapa baris Shift+V, tekan :dan jalankan:

'<,'>w >> test | normal gvd 

Bagian pertama menambahkan baris yang dipilih. Perintah kedua memasuki mode normal dan berjalan gvduntuk memilih pilihan terakhir dan kemudian menghapus.

jtpereyda
sumber
0

Pilih teks dalam mode visual, lalu tekan yuntuk "menarik" ke dalam buffer (salin) atau duntuk "menghapus" ke dalam buffer (memotong).

Kemudian Anda dapat :split <new file name>membagi jendela vim Anda ke atas, dan tekan puntuk menempelkan teks yang ditarik. Tulis file seperti biasa.

Untuk menutup pemisahan lagi, berikan pemisahan yang ingin Anda tutup :q.

Xyon
sumber
1
Saya memiliki 4 langkah untuk saat ini: pilih, tulis, pilih, hapus. Dengan metode Anda, saya memiliki 6 langkah: pilih, hapus, pisahkan, tempel, tulis, tutup. Saya meminta sesuatu yang lebih efisien: P
greg0ire
Nah, jika Anda melewatkan pemisahan :x, Anda dapat menggabungkan tulisan dan menutup menjadi satu dan membuatnya menjadi lima langkah. : P
Xyon
Itu lebih baik, tetapi 5 masih> 4: P
greg0ire