Setidaknya sekali sehari saya mengalami situasi berikut:
A: This line should also replace line X
...
X: This is line should be replaced
Saya percaya bahwa saya tidak melakukan tugas itu dengan efisien.
Apa yang saya lakukan:
- Pergi ke baris A: AG
- Yank baris A: yy
- Pergi ke baris X: XG
- Tempel baris A: P
- Pindah ke jalur lama: j
- Hapus baris lama: dd
Ini memiliki kerugian tambahan bahwa baris X sekarang ada di register default, yang menjengkelkan jika saya menemukan baris lain yang harus diganti dengan A. Yanking dan paste dari register tambahan ( "ayy , " aP ) membuat tugas sederhana ini bahkan kurang efisien.
Pertanyaan saya:
- Apakah saya melewatkan perintah Vim bawaan untuk mengganti baris yang dicabut sebelumnya?
- Jika tidak, bagaimana saya dapat mengikat perintah saya sendiri yang meninggalkan (atau memulihkan) baris yang dicabut di register default?
:move
dan lubang hitam mendaftar (_
) (atau sebenarnya, hanya mendaftar)Jawaban:
Apa yang akan saya lakukan :
aG
Y
xG
Vp
Anda tidak harus meninggalkan mode normal, tetapi tidak yank baris. Namun Anda dapat menggunakan
V"0p
yang akan selalu membuat garis ditarik pada langkah 2.sumber
Y
adalah sinonim untukyy
Y
adalah sinonim untukyy
, tetapi saya sarankan untuk memetakannya kembali menjadiy$
untuk mencocokkanD
danC
.Vp
: pilih baris, tempel apa yang telah ditariksumber
VP
bekerja dengan baik, yang berguna karena Anda dapat menahan Shift untuk seluruh urutan.V"0p
, yang menempel dari register yang terakhir dicabut.V"0p
fungsinya? V masuk ke mode garis Visual dan p untuk menempel. Apa "dan 0 untuk? Terima kasihUntuk menghapus teks tanpa mempengaruhi register normal, Anda dapat menggunakan register lubang hitam
"_
:sumber
d
dandd
selalu menggunakan lubang hitam, danx
danxx
melakukan apa yang kebanyakan editor sebut "cut" (menghapus dan menyimpan default register):noremap x d
noremap xx dd
noremap d "_d
noremap dd "_dd
Berdasarkan jawaban yang menyarankan penggunaan
Vp
atauVP
tempel di atas garis - untuk menghindari mengubah isi daftar yank, menurut saya perintah yang paling ergonomis adalah:VPY
sumber
sumber
Saya akan menggunakan mode commandline (Ex) dan melakukan dua perintah berikut
Ini hanya memindahkan baris X ke tepat di bawah A, lalu menghapus A memindahkan baris itu ke atas
Sebagai contoh
sumber
Pindah ke awal baris pertama.
y, $- salin baris tanpa penghentian baris di bagian akhir
Pindah ke awal garis target.
V, p- ganti hanya satu baris target
c, c, Ctrlr, 0, Esc- mengganti baris target dengan yank asli
Pindah ke awal baris target berikutnya.
. - mengulangi perintah yang dikeluarkan pada 4.2.
Catatan:
4.1 adalah y, $karena jika Anda melakukannya y, yatau YAnda akan menyalin pemutusan baris, dan Ctrlr, 0sebenarnya menambahkan pemutusan baris di bawah garis target Anda.
4.2 menggantikan V p, yang tidak bekerja dengan repeat karena secara teknis tindakan terakhir adalah delete, jadi .hanya akan menghapus satu baris.
Jika ada yang tahu bagaimana mengeluarkan 'ganti baris saat ini dengan register' dari mode EX (baris perintah), saya ingin mendengar dari Anda (dan untuk mengetahui di mana Anda menemukan dokumentasi). Mungkin ada perintah EX berulang yang lebih cepat dari 4.2 dan / atau tidak memiliki peringatan pemutusan baris.
sumber
Inilah yang akan saya lakukan
sumber
Anda dapat menggunakan ini dengan mode visual.
A
GX
Gsumber
Anda juga bisa melakukan:
Tombol yang sama dapat digunakan untuk menarik / menempelkan lebih dari satu baris.
sumber
Anda dapat menggunakan perintah ini dalam Mode Normal:
yang
m
perintah untukm[ove]
, yang bergerak nomor baris A setelah nomor baris X, jika Anda ingin menyalin bukannya memindahkan baris, penggunaanco[py]
. yangd
perintah untukd[elete]
.Anda dapat memindahkan (menyalin menggunakan
co
) berbagai baris menggunakansumber
Mengingat komentar terbaru oleh cicld (terima kasih!), Saya melihat bahwa saya tidak memahami sepenuhnya masalah aslinya. Memindahkan garis tidak tepat, tetapi menyalinnya (karena garis itu ditarik.) Jadi saya akan merevisinya menjadi:
Salin baris pertama (
:t
perintah adalah alias untuk:copy
) setelah baris 20 (akan letakkan di baris 21)Hapus baris 20, letakkan baris yang dihapus ke dalam register 'lubang hitam' (
_
) (yaitu tidak mempengaruhi buffer yank saat ini)Seperti yang disebutkan dalam komentar terbaru, ini tidak akan mempengaruhi posisi kursor saat ini.
sumber
sumber
Saya merasa lebih mudah menggunakan perintah Ex untuk ini; ex. untuk memindahkan baris 9 ke 46:
Ini akan memindahkan kursor ke baris 46, memindahkan baris 9 di bawah arus, lalu menghapus baris sebelumnya (karena baris yang dipindahkan adalah baris saat ini).
Atau menggunakan tanda, menggunakan tanda 'a':
sumber
:1m20|.+1d
(pindahkan baris 1 ke baris 20 dan hapus baris berikutnya, yaitu teks yang ada di baris 20 sebelumnya). Ide yang sama sekalipun!Saya sering harus Y satu baris dan menggantinya di banyak tempat, yang masing-masing memiliki nilai yang berbeda (yang berarti saya tidak dapat membuat regex).
Y untuk menarik garis asli yang diinginkan
lalu di setiap baris yang ingin Anda ganti, VpzeroY
sumber
saya hanya akan menggunakan register "Lubang hitam":
diberikan:
nnoremap <Cd> "_dd
solusinya adalah:
<Cd> yy
sumber