Tempel dalam mode sisipkan?

385

Apakah mungkin menempel di mode insert di Vim?

Amir Rachum
sumber

Jawaban:

465

Saat dalam mode masukkan tekan CTRL-R {register}

Contoh:

  • CTRL-R * akan memasukkan konten clipboard
  • CTRL-R " (register yang tidak disebutkan namanya) menyisipkan penghapusan atau penarikan terakhir.

Untuk menemukan ini dalam jenis bantuan vim :h i_ctrl-r

David
sumber
13
Yap, saya baru tahu tentang CTRL-R dan ini sangat berguna.
Dan
16
CTRL-R *hanya berfungsi di GVIM atau versi yang dikompilasi untuk berinteraksi dengan x. Ketik vim --versiondan cari +xterm_clipboard. Jika Anda tidak memilikinya, Anda memerlukan versi vim yang berbeda. ( vim.wikia.com/wiki/Accessing_the_system_clipboard )
Conrad.Dean
10
Anda sebenarnya hanya perlu +clipboard, tetapi jika Anda memilikinya +xterm_clipboardAnda tetap harus memilikinya. Pada beberapa OS xterm_clipboardtidak berlaku.
Andrew Marshall
1
Hmm, saya menggunakan C-r + untuk menempel dari clipboard sistem pada Windows (menggunakan GVim portable)? Tidak pernah mendengar * daftar.
kitsu.eb
6
@ kitsu.eb Pada sistem X *register dapat disentuh dengan klik-tengah-mouse sedangkan +copy / paste tradisional. standards.freedesktop.org/clipboards-spec/clipboards-latest.txt
amc
235

Jika Anda tidak ingin Vim untuk mangle format dalam yang masuk teks disisipkan, Anda juga mungkin ingin mempertimbangkan untuk menggunakan: :set paste. Ini akan mencegah Vim dari tab kembali kode Anda. Saat selesai menempel, :set nopasteakan kembali ke perilaku normal.

Dimungkinkan juga untuk mengganti mode dengan satu tombol, dengan menambahkan sesuatu seperti set pastetoggle=<F2>.vimrc Anda. Rincian lebih lanjut tentang pengubahan indentasi otomatis ada di sini .

James Snyder
sumber
47
:set nopasteakan menonaktifkan mode tempel
James Snyder
24
@JamesSnyder Cara yang lebih baik :set paste!Mungkin mengatur pasta sangat dekat dalam sejarah perintah Anda, jadi Anda cukup menekan ':', lalu panah-ke atas dan tambahkan '!'.
Rafael Barbosa
6
Hanya ingin tahu - apa yang lebih baik atau berbeda tentang :set paste! Terima kasih :)
Michael Durrant
33
yang !pada akhir perintah di vimmatikan perintah dan mematikan. Dengan cara ini Anda tidak perlu mengetik, :set nopasteAnda bisa menggulir ke atas melalui riwayat Anda dan menjalankan perintah yang sama ( :set paste!) lagi.
에이 바
3
@blockloop Anda seharusnya mengaktifkannya saat menempel dan menonaktifkannya setelah itu.
NieDzejkob
125

Tidak, tidak langsung. Apa yang dapat Anda lakukan adalah dengan cepat keluar dari mode insert untuk operasi mode normal tunggal Ctrl-Odan kemudian paste dari sana yang akan berakhir dengan menempatkan Anda kembali dalam mode insert.

Kombo Kunci: Ctrl-O p

EDIT: Menarik. Tampaknya ada cara seperti yang dilakukan beberapa orang.

JaredPar
sumber
2
ctrl-r "tidak berfungsi untuk saya (os x, vi di terminal). ctrl-op berhasil
Bob
4
Ini adalah cara tercepat dan termudah untuk diingat.
cacar
Bagaimana dengan esc + p?
sitilge
2
Jelas lebih cepat daripada esc + p + idan jelas lebih mudah CTRL-R + "
diketik
Sebenarnya, ini terkadang berperilaku berbeda CTRL-R ". Misalnya, meskipun pengaturan vimrc dapat mengubah ini, menempelkan sesuatu di baris baru menggunakan CTRL-O pmembuat lekukannya hilang.
noname
30

Saat berada dalam mode penyisipan, Anda dapat menggunakan Ctrl-R {register}, tempat pendaftaran dapat:

  • + untuk clipboard,
  • * untuk papan klip X (teks yang dipilih terakhir dalam X),
  • " untuk register tanpa nama (penghapusan terakhir atau mencabut di Vim),
  • atau sejumlah lainnya (lihat :h registers).

Ctrl-R {register} menyisipkan teks seolah-olah itu diketik.

Ctrl-R Ctrl-O {register} menyisipkan teks dengan indentasi asli.

Ctrl-R Ctrl-P {register} menyisipkan teks dan otomatis indentasi itu.

Ctrl-Odapat digunakan untuk menjalankan perintah mode normal sebelum kembali ke mode penyisipan, jadi
Ctrl-O "+pjuga dapat digunakan, misalnya.

Untuk informasi lebih lanjut, lihat dokumentasi dengan :h i_ctrl-r

Zaz
sumber
4
Jawaban ini tampaknya paling komprehensif. Sangat jelas, dan menurut saya, yang paling bermanfaat. Itu menjawab pertanyaan OP dan kemudian beberapa, dengan singkat.
Devvyn
26

Anda dapat menggunakan ini untuk menempel dari clipboard dengan Ctrlv:

set pastetoggle=<F10>
inoremap <C-v> <F10><C-r>+<F10>

Dan ini untuk menarik seleksi visual ke clipboard dengan Ctrlc:

vnoremap <C-c> "+y

Jika Anda juga ingin menggunakan clipboard secara default untuk viank yanking / paste ( y/ p) klasik dalam mode normal, berikut adalah opsi konfigurasi yang melakukannya:

set clipboard=unnamedplus

Dengan konfigurasi ini, Anda dapat mis. Mencabut pertama dalam mode normal dan kemudian menempel dengan Ctrlvdalam mode insert. Anda juga dapat menempelkan teks dari instance vim yang berbeda dan aplikasi yang berbeda.

Pilihan lain adalah:

set clipboard=unnamed

Kemudian Anda akan bisa memilih sesuatu dengan menyeret mouse di lingkungan X Anda dan menempelkannya ke vim sesudahnya. Tetapi (karena alasan tertentu) Anda tidak akan dapat menarik sesuatu ( y) di Vim dan di shiftinserttempat lain sesudahnya, yang mungkin sangat terbatas.

Vim docs tentang ini: http://vim.wikia.com/wiki/Accessing_the_system_clipboard

Untuk menempel dari register khusus, Anda dapat mengikuti jawaban lain :). Jawaban ini terutama tentang mengintegrasikan Vim dengan clipboard sistem Anda.


Perhatikan bahwa untuk set clipboard=unnamedplusdan set clipboard=unnameduntuk bekerja, Anda perlu menggunakan gvim atau vimx ( vim-X11): Yang dikompilasi dengan +xterm_clipboard. Anda bisa memasukkan ini ke .bashrcalias Anda vimdengan vimx:

if [ -e /usr/bin/vimx ]; then
    alias vim='/usr/bin/vimx'; # vim with +xterm_clipboard
fi

Anda dapat mengetahui apakah vim Anda memiliki +xterm_clipboardinformasi yang disediakan oleh vim --version.

iklim
sumber
7
Inilah yang saya cari. Ini juga satu-satunya jawaban yang masuk akal di sini. Ini adalah bagaimana seseorang mengharapkan sesuatu bekerja. Adakah yang tahu mengapa perilaku default :set pastedan Bizantium <leader><leader> * ybahkan sangat diinginkan? Tidak terdengar terlalu berkomitmen, saya benar-benar ingin tahu filosofi vim apa ini mencerminkan, atau jika itu hanya kemalangan historis.
Aeschylus
Jawaban Anda memungkinkan saya untuk menggunakan Shift + Sisipkan di Gvim juga dengan inoremap <S-Insert> <F12><C-r>+<F12>(saya menggunakan F12 sebagai pastetoggle). Terima kasih.
sromero
20

Jika Anda mengatur Vim untuk menggunakan clipboard sistem ( :set clipboard=unnamed), maka teks apa pun yang Anda salin di Vim dapat ditempel menggunakan Shift+ Insert. Shift+ Inserthanyalah kombinasi tombol tempel selebar OS ( Ctrl+ Insertadalah 'salinan' yang sesuai).

Akan
sumber
1
Tidak tahu tentang S-Insert :)
BandGap
Apakah ini bekerja secara terbalik? Apakah akan pmenempelkan teks di clipboard?
Zaz
Sebelum menggunakan Shift + Insertuntuk menempelkan teks, kita harus dalam mode sisipkan.
jdhao
18

Anda juga dapat menggunakan tombol tengah mouse untuk menempel dalam mode sisipkan (hanya Linux).

lcltj
sumber
106
Tikus apa yang kamu bicarakan?
Jim Mitchener
19
Apa OS non-linux yang Anda bicarakan?
Bruno Bronosky
-1: Jawaban ini sangat tergantung pada pengaturan perangkat keras dan terminal. Pada akhirnya, tombol-tombol pada mouse mengirimkan string preset ke terminal, dan terminal mem-parsing string itu untuk menjalankan perintah tertentu. Masalahnya, ini bisa sangat bervariasi, tergantung pada pengaturan terminal. Untuk meningkatkan jawaban ini, berikan setidaknya, versi terminal, OS, dan versi dan model mouse yang Anda gunakan.
melvynkim
Tempel tombol tengah mouse cukup umum di semua aplikasi Linux, tidak dibatasi oleh versi terminal atau OS.
lcltj
Tidak berfungsi di Arch Linux + urxvt. Itu hanya menambah baris baru.
zygimantus
5

Anda dapat masuk ke -- INSERT (past) --mode melalui:

  • Kombo keyboard: y p

atau

  • :set pastedan memasuki mode masukkan ( :set nopasteuntuk menonaktifkan)

sekali dalam -- INSERT (past) --mode cukup gunakan fungsi tempel sistem Anda (mis. CtrlShiftvdi Linux, Cmdvdi Mac OS).

Strategi ini sangat berguna ketika menggunakan vim over ssh.

rudolph9
sumber
4

Iya. Di Windows Ctrl+ Vdan di Linux menekan kedua tombol mouse hampir secara bersamaan.

Di Windows saya pikir baris ini di _vimrc saya mungkin melakukannya:

source $VIMRUNTIME/mswin.vim

Di Linux saya tidak ingat bagaimana saya melakukannya. Sepertinya saya mungkin menghapus beberapa baris dari file .vimrc default.

Pemrogram Windows
sumber
Bisakah saya memilih lebih dari satu kali ?? Saya hanya ingin menempel ketika saya datang dari jendela lain - jadi saya selalu menggunakan mouse. Cemerlang!
dave
Di Linux Anda menempelkannya dengan menekan tombol tengah mouse. Jika Anda memiliki dua tombol mouse dan tekan tombol kiri dan kanan, maka itu perlu "Emulate3Buttons" atau mirip untuk bekerja dengan cara ini.
Cougar
0

Tempel di Sisipkan Mode

Peta khusus sepertinya cocok untuk kasus ini. Ini yang saya gunakan untuk menempelkan item yang ditarik di mode insert:

inoremap <Leader>p <ESC>pa

Saya Leaderkunci di sini adalah \; ini berarti menekan \pdalam mode sisipkan akan menempelkan item / baris yang sebelumnya ditarik.

Sheharyar
sumber
0

Cukup tambahkan peta:

" ~/.vimrc
inoremap <c-p> <c-r>*

restart vim dan ketika menekan Crtl+pdalam mode insert, teks yang disalin akan disisipkan

itsnikolay
sumber