Bagaimana cara menempelkan di baris baru dengan vim?

149

Saya sering harus menempelkan beberapa hal di baris baru di vim. Yang biasanya saya lakukan adalah:

o<Esc>p

Yang menyisipkan baris baru dan menempatkan saya dalam mode penyisipan, kemudian keluar dari mode penyisipan, dan akhirnya menempel.

Tiga penekanan tombol. Tidak terlalu efisien. Ada ide yang lebih baik?

static_rtti
sumber
9
3 penekanan tombol tidak efisien?
gtd
62
1 atau 2 akan lebih baik :) Mengapa menggunakan vim jika bukan untuk efisiensi maksimal?
static_rtti
2
Ini juga menghasilkan baris baru tambahan jika konten yang disalin diakhiri dengan baris baru.
Jonathan W.
2
@gtd Editor normal bekerja dengan <Enter> <CV>. Dua penekanan tombol.
pengguna4052054
2
@ user4052054 tidak, itu tidak melakukan hal yang sama, o / O bekerja dimanapun Anda berada, dalam editor normal Anda harus ke awal atau akhir baris terlebih dahulu. Selain itu, jika Anda menyalin seluruh baris, semuanya hanya menjadi satu penekanan tombol untuk menyisipkan baris, yang merupakan proposisi yang jauh lebih umum dalam pengkodean.
gtd

Jawaban:

73

Tak lama setelah :help pitu tertulis:

:[line]pu[t] [x]    Put the text [from register x] after [line] (default
                    current line).  This always works |linewise|, thus
                    this command can be used to put a yanked block as
                    new lines.

:[line]pu[t]! [x]   Put the text [from register x] before [line]
                    (default current line).

Sayangnya itu tidak lebih pendek dari solusi Anda saat ini kecuali Anda menggabungkannya dengan beberapa peta keyboard seperti yang disarankan dalam jawaban yang berbeda. Misalnya, Anda dapat memetakannya ke kunci apa saja (bahkan p):

:nmap p :pu<CR>
Bombe
sumber
2
Saya tahu itu, dan saya menggunakannya, tapi bukan itu yang saya tanyakan, karena terkadang apa yang Anda salin tidak memiliki LF di dalamnya. Jika ada perintah "tempel ke baris baru", perintah itu akan berfungsi terlepas dari konten yang akan Anda tempelkan, jadi Anda tidak perlu memikirkannya.
static_rtti
5
Oke, :pu[t]akan meletakkan teks di baris baru setelah baris saat ini, :pu[t]!akan meletakkan teks di baris baru sebelum baris saat ini. Saya akan mengedit jawaban saya. (Hore untuk :help p.)
Bombe
2
Tidak benar-benar lebih baik dari solusi saya saat ini, tetapi menurut saya ini adalah jawaban terbaik untuk pertanyaan saya.
static_rtti
4
Sementara jumlah penekanan tombol yang sama, saya rasa ini terasa lebih efisien. o <Esc> p terasa kikuk, sementara ini tidak.
Mark Story
2
Anda dapat memetakan perintah ke kunci apa pun, termasuk p itu sendiri: :nmap p :pu<CR>Taruh di file .vimrc Anda dan pergilah :)
Capi Etheriel
56

Pilihan:

1) Gunakan yyuntuk menarik seluruh baris (termasuk karakter akhir baris). pkemudian akan menempelkan baris pada baris baru setelah yang sekarang dan P( Shift- P) akan menempel di atas baris saat ini.

2) Buat pemetaan: maka itu hanya satu atau dua kunci:

:nmap ,p o<ESC>p
:nmap <F4> o<ESC>p

3) Versi fungsi dari pemetaan (sebenarnya tidak perlu, tapi hanya untuk kelengkapan):

:nmap <F4> :call append(line('.'), @")<CR>

" This one may be a little better (strip the ending new-line before pasting)
:nmap <F4> :call append(line('.'), substitute(@", '\n$', '', ''))<CR>

:help let-register
:help :call
:help append()
:help line()
:help nmap
DrAl
sumber
2
Saya rasa saya akan membuat pemetaan. Saya hanya berharap mungkin ada solusi standar: - / Terima kasih atas jawaban Anda!
static_rtti
2
@AI: Menggunakan ', p' (',' dipetakan sebagai <Leader> saya) adalah solusi terbaik menurut saya. Anda bahkan menyediakan fungsi yang mudah digunakan. :) Bagus!
Seseorang masih menggunakan Anda MS-DOS
31

Anda dapat menempelkan buffer dalam mode sisipkan menggunakan <C-R>diikuti dengan nama buffer yang akan ditempel. Buffer default adalah ", jadi Anda akan melakukannya

o<C-R>"

Saya menemukan bahwa saya <C-R>"sangat sering menggunakan dan mengikatnya <C-F>di vimrc saya:

inoremap <C-F> <C-R>"
Soulmerge
sumber
2
Ini bagus karena menjaga indentasi tetap benar jika baris yang disalin tidak menjorok ke dalam.
CornSmith
24

Ini masih menggunakan tiga penekanan tombol, tetapi saya merasa lebih mudah daripada Esc:

o<Alt-p>

Karena Anda berada dalam mode penyisipan setelah menekan o, pengubah Alt akan memungkinkan Anda untuk menggunakan perintah seolah-olah tidak.

Nick
sumber
2
Cara yang cukup berguna ketika Anda mencoba yank sth Anda memotong di dalam baris dengan "d $" di baris baru
Serhat Cevikel
Maaf, ini tidak mempertahankan indentasi, melainkan menempel di awal baris.
Michael Goldshteyn
Adakah yang bisa menguraikan metode ini untuk mac (tanpa alt)?
Li haonan
@Lihaonan Pertanyaan Anda dari 8 bulan yang lalu, semoga Anda sudah melihat stackoverflow.com/q/7501092/5407634
m_mlvx
14

Menggunakan plugin ini: https://github.com/tpope/vim-unimpaired

]ppasta di baris di bawah ini

[ppasta pada baris di atas

keuntungan:

  • berfungsi pada semua teks yang ditarik (kata, baris, karakter, dll)
  • indentasi teks yang ditempelkan untuk mencocokkan dengan teks di sekitarnya
  • 2 penekanan tombol, bukan 3 dan lebih banyak lagi pukulan yang "lebih mudah"
  • cepat
crogers
sumber
1
Favorit saya juga. Mungkin layak disebutkan bahwa Anda memang membutuhkan tpope/vim-unimpairedini untuk bekerja 😉.
alextes
1
ah saya menginstalnya begitu lama saya lupa tentang itu. terima kasih atas pengingatnya!
Crogers
9

Secara pribadi saya telah memetakan Enter (CR) seperti ini:

nmap <CR> o<Esc>k

... berdasarkan ini artikel Vim Wikia.

Dengan cara ini saya dapat membuat baris baru langsung dari mode normal, dan menggabungkan ini dengan keinginan untuk menempelkan ke baris baru di bawah ini yang akan saya lakukan:

<CR>jp

Anda juga dapat melewati k dalam nmap di atas, tergantung pada fungsionalitas apa yang Anda sukai dari Enter , jadi itu akan terjadi <CR>p.

Saya juga telah memasang jj ke Esc , yang juga akan membantu dalam kasus ini. Esc terlalu jauh dari barisan tuan rumah untuk seberapa signifikan itu di vim.

Tidak lebih pendek dari solusi lainnya, tapi menurut saya ini terasa kurang kikuk daripada beberapa solusi lainnya, dan memiliki kegunaan lain juga.

miyalys
sumber
5

Jika Anda menyalin seluruh baris lalu menempelkan seluruh baris, gunakan Yuntuk menarik baris atau beberapa baris, termasuk baris baru, di tempat pertama, dan puntuk menempel. Anda juga dapat menggunakan V, yaitu mode garis visual , berbeda dengan vmode biasa untuk visual.

Peter
sumber
3
Masalahnya adalah, terkadang Anda tidak ingin menyalin seluruh baris ... Saya ingin solusi yang berfungsi baik saya telah menyalin sepuluh baris atau dua kata.
static_rtti
3

Saya memiliki pemetaan inoremap jj <ESC>. Sehingga mudah untuk menyisipkan baris baru dengan ojjdan Ojjkemudian p.

jadi ojjptempel baris baru. itu memiliki satu pukulan lagi o<esc>ptetapi ojjpmudah bagi saya.

Natwar Singh
sumber
2

Saya menemukan solusi elegan untuk ini. Jika Anda meletakkan register yank di clipboard OS Anda (yang memang bagus), dengan

set clipboard+=unnamed

daripada yang bisa Anda lakukan o<Ctl-v> .

Selain menjadi lebih sedikit pukulan, ini meningkatkan baik o<Esc>pdan:pu karena mempertahankan indentasi: kedua opsi lain memulai Anda dari karakter nol pada baris baru.

Peringatan adalah bahwa ini mungkin atau mungkin tidak bergantung pada OS. Yang saya tahu adalah ini berfungsi pada versi terbaru OS X, tetapi papan klip hanyalah salah satu dari banyak cara untuk menarik papan klip OS.

pesona
sumber
1

Jika Anda juga ingin mengakhiri mode sisip, dimungkinkan untuk menempelkan saat dalam mode sisip menggunakan CTRL-R ". https://stackoverflow.com/a/2861909/461834

Masih tiga kali penekanan tombol, tetapi tidak ada jalan keluar, dan Anda menyimpan satu tombol jika Anda ingin mengakhiri penyisipan.

jtpereyda.dll
sumber
1

Saya menggunakan pemetaan berikut di konfigurasi Neovim saya:

nnoremap <leader>p m`o<ESC>p``
nnoremap <leader>P m`O<ESC>p``

Sedikit penjelasan:

  • m`: setel tanda di posisi kursor saat ini.
  • o<Esc>p: buat baris baru di bawah dan tempel teks di baris ini
  • O<Esc>P: buat baris baru di atas dan tempel teks di baris ini
  • ``: letakkan kursor di posisi semula

Lihat :h markuntuk informasi lebih lanjut tentang merek di Vim.

jdhao
sumber
1

Jika Anda ingin tetap dalam mode penyisipan, Anda bisa melakukannya o ctrl+o p

  • o - masukkan mode dan pergi ke baris baru
  • ctrl+o - jalankan satu perintah seperti dalam mode normal
  • p - tempel

Ini tiga penekanan tombol tetapi Anda tetap dalam mode penyisipan dan juga o ctrl+ocukup cepat jadi saya pribadi memperlakukannya sebagai 2,5 penekanan tombol.

terhubung kembali
sumber
0

Solusi ini tampaknya hanya berlaku ketika blok teks yang disalin dimulai pada baris baru (sebagai lawan mengambil potongan teks di suatu tempat dalam baris), tetapi Anda selalu dapat memulai salinan Anda pada karakter terakhir yang ingin Anda ambil, lalu navigasikan ke karakter terakhir di akhir baris sebelum dimulainya blok salinan yang Anda inginkan. Kemudian ketika Anda ingin menempelkannya, letakkan kursor di akhir baris di mana Anda ingin teks Anda ditempelkan dan tekan p. Jika saya belum mengacaukan penjelasannya, ini akan memberikan efek yang Anda cari.

kelinci yang tidak terputus
sumber
0

Jika Anda ingin menempelkan new linedan masih mempertahankan indentasi, buat pemetaan ini:

nnoremap <leader>p oq<BS><Esc>p

Prasyarat: Anda memiliki pemimpin yang dipetakan dan ada set autoindentdi.vimrc .

Penjelasan: baris baru dibuat dengan 'o', 'q' diketik dan kemudian diberi spasi mundur (untuk menjaga indentasi), dan 'esc' membawa Anda kembali ke mode normal di mana Anda akhirnya menempel.

Justin Wong
sumber