Cara menempelkan teks yang ditarik ke dalam baris perintah Vim

Jawaban:

1157

Iya. Hit Ctrl- Rlalu ". Jika Anda memiliki karakter kontrol literal dalam apa yang telah Anda tarik, gunakan Ctrl- R, Ctrl- O," .

Berikut adalah penjelasan tentang apa yang dapat Anda lakukan dengan register. Apa yang dapat Anda lakukan dengan register sangat luar biasa, dan begitu Anda tahu cara menggunakannya, Anda tidak bisa hidup tanpanya.

Register pada dasarnya adalah lokasi penyimpanan untuk string. Vim memiliki banyak register yang bekerja dengan berbagai cara:

  • 0 (yank register: saat Anda menggunakan y dalam mode normal, tanpa menentukan register, teks yang ditarik ke sana dan juga ke register default),
  • 1to 9(menggeser register hapus, ketika Anda menggunakan perintah seperti catau d, apa yang telah dihapus masuk ke register 1, apa yang ada di register 1 masuk ke register 2, dll. ),
  • "(daftar default, juga dikenal sebagai register tanpa nama. Di sinilah "masuk Ctrl- R," ),
  • auntuk zuntuk penggunaan Anda sendiri (dikapitalisasi Auntuk Zuntuk ditambahkan ke register yang sesuai).
  • _(bertindak seperti /dev/null(Unix) atauNUL (Windows), Anda dapat menulis ke sana tetapi dibuang dan ketika Anda membacanya, itu selalu kosong),
  • - (register hapus kecil),
  • /(pencarian pola mendaftar, diperbarui ketika Anda mencari teks dengan /, ?, *atau# misalnya, Anda juga dapat menulis untuk itu untuk secara dinamis mengubah pola pencarian),
  • :(menyimpan perintah ketikan VimL terakhir melalui Qatau: , hanya baca),
  • +dan *(register clipboard sistem, Anda dapat menulis kepada mereka untuk mengatur clipboard dan membaca konten clipboard dari mereka)

Lihat :help registersuntuk referensi lengkap.

Anda dapat, kapan saja, gunakan :registersuntuk menampilkan konten semua register. Sinonim dan singkatan untuk perintah ini adalah :display, :regdan :di.

Dalam mode Sisipkan atau baris perintah, Ctrl- Rditambah nama register, masukkan konten register ini. Jika Anda ingin memasukkannya secara harfiah (tidak ada indentasi otomatis, tidak ada konversi karakter kontrol seperti 0x08untuk backspace, dll), Anda dapat menggunakan Ctrl- R, Ctrl- O, mendaftarkan nama. Lihat :help i_CTRL-Rdan paragraf berikut untuk referensi lebih lanjut.

Tetapi Anda juga dapat melakukan hal berikut (dan saya mungkin lupa banyak kegunaan untuk register).

  • Dalam mode normal, tekan ":p. Perintah terakhir yang Anda gunakan dalam vim disisipkan ke buffer Anda.
    Mari kita dekomposisi: "adalah perintah mode Normal yang memungkinkan Anda memilih register apa yang akan digunakan selama operasi penarikan, penghapusan atau tempel berikutnya. Jadi ":pilih register titik dua (menyimpan perintah terakhir). Kemudianp adalah perintah yang sudah Anda ketahui, itu menempel isi register.

    lih. :help ",:help quote_:

  • Anda mengedit file VimL (misalnya Anda .vimrc) dan ingin mengeksekusi beberapa baris berturut-turut sekarang: yj:@"Enter.
    Di sini, yjmenarik baris saat ini dan berikutnya (ini karena j adalah gerakan secara garis tetapi ini berada di luar jangkauan jawaban ini) ke dalam register default (juga dikenal sebagai register yang tidak disebutkan namanya). Kemudian :@perintah Ex memainkan perintah Ex yang disimpan dalam register yang diberikan sebagai argumen, dan "adalah bagaimana Anda merujuk ke register yang tidak disebutkan namanya. Lihat juga bagian atas jawaban ini, yang terkait.

    Jangan bingung "digunakan di sini (yang merupakan nama register) dengan "dari contoh sebelumnya, yang merupakan perintah mode-Normal.

    lih. :help :@dan:help quote_quote

  • Masukkan pola pencarian terakhir ke file Anda dalam mode Insert, atau ke baris perintah, dengan Ctrl- R, /.

    lih. :help quote_/,help i_CTRL-R

    Akibat wajar: Jaga pola pencarian Anda, tetapi menambahkan alternatif: / Ctrl- R, / \|alternative.

  • Anda telah memilih dua kata di tengah-tengah garis dalam mode visual, menariknya dengan y, mereka berada di register yang tidak disebutkan namanya. Sekarang Anda ingin membuka baris baru tepat di bawah di mana Anda berada, dengan dua kata: :pu. Ini adalah singkatan untuk :put ". The :putperintah, seperti banyak perintah Ex, bekerja hanya linewise.

    lih. :help :put

    Anda juga bisa melakukannya: :call setreg('"', @", 'V')lalu p. The setregFungsi set register yang namanya diberikan sebagai argumen pertama (sebagai string), menginisialisasi dengan isi argumen kedua (dan Anda dapat menggunakan register sebagai variabel dengan nama @xmana xadalah nama mendaftar di VimL), dan mengubahnya menjadi mode yang ditentukan dalam argumen ketiga, Vuntuk linewise, tidak ada untuk characterwise dan literal ^Vuntuk blockwise.

    lih. :help setreg(). Fungsi sebaliknya adalah getreg()dan getregtype().

  • Jika Anda telah mencatat makro dengan qa... q, maka :echo @aakan memberi tahu Anda apa yang telah Anda ketik, dan @aakan memutar ulang makro (mungkin Anda tahu itu, sangat berguna untuk menghindari tugas yang berulang)

    lih. :help q,help @

    Konsekuensi dari contoh sebelumnya: Jika Anda memiliki 8godi clipboard, maka @+akan memainkan konten clipboard sebagai makro, dan dengan demikian pergi ke byte ke 8 file Anda. Sebenarnya ini akan bekerja dengan hampir setiap register. Jika string yang Anda masukkan terakhir dddalam mode Sisipkan, maka @.akan (karena .register berisi string yang dimasukkan terakhir) menghapus baris. (Dokumentasi Vim yang salah dalam hal ini, karena menyatakan bahwa register #, %, :dan .hanya akan bekerja dengan p, P, :putdan Ctrl- R).

    lih. :help @

    Jangan bingung :@(perintah yang memainkan perintah Vim dari register) dan @(perintah mode normal yang memainkan perintah mode normal dari register).

    Pengecualian penting adalah @:. Register perintah tidak mengandung titik dua awal dan juga tidak berisi akhir carriage return. Namun dalam mode Normal, @:akan melakukan apa yang Anda harapkan, menafsirkan register sebagai perintah Ex, tidak mencoba memainkannya dalam mode Normal. Jadi, jika perintah terakhir Anda adalah :e, register berisi etetapi @:akan memuat ulang file, tidak pergi ke akhir kata.

    lih. :help @:

  • Menunjukkan apa yang Anda akan lakukan dalam mode normal sebelum menjalankannya: @='dd' Enter. Segera setelah Anda menekan =tombol, Vim beralih ke evaluasi ekspresi: saat Anda memasukkan ekspresi dan menekan Enter, Vim menghitungnya, dan hasilnya bertindak sebagai konten register. Tentu saja register =itu hanya-baca, dan satu-shot. Setiap kali Anda mulai menggunakannya, Anda harus memasukkan ekspresi baru.

    lih. :help quote_=

    Konsekuensi: Jika Anda mengedit perintah, dan Anda menyadari bahwa Anda harus memasukkan beberapa baris perintah ke buffer Anda saat ini: jangan tekan Esc! Gunakan Ctrl- R =getline(58) Enter. Setelah itu Anda akan kembali ke pengeditan baris perintah, tetapi telah memasukkan konten baris ke-58.

  • Tetapkan pola pencarian secara manual: :let @/ = 'foo'

    lih. :help :let

    Perhatikan bahwa melakukan itu, Anda tidak perlu melarikan diri /dalam polanya. Namun Anda harus menggandakan semua kutipan tunggal, tentu saja.

  • Menyalin semua baris yang dimulai dengan foo, dan setelah semua baris yang mengandung barke clipboard, rantai perintah ini: qaq(ulang yang suatu daftar menyimpan makro kosong di dalamnya), :g/^foo/y A, :g/bar/y A, :let @+ = @a.

    Menggunakan nama register modal membuat register berfungsi dalam mode append

    Lebih baik, jika Qbelum dipetakan kembali mswin.vim, mulai mode Ex dengan Q, rantai "perintah usus besar" yang sebenarnya lebih baik disebut "perintah Ex", dan kembali ke mode Normal dengan mengetik visual.

    lih. :help :g, :help :y,:help Q

  • Double-ruang file Anda: :g/^/put _. Ini menempatkan isi register lubang hitam (kosong saat membaca, tetapi dapat ditulis, berperilaku seperti /dev/null) secara berurutan, setelah setiap baris (karena setiap baris memiliki permulaan!).

  • Tambahkan baris yang mengandung foosebelum setiap baris: :g/^/-put ='foo'. Ini adalah penggunaan register ekspresi yang cerdas. Di sini, -adalah sinonim untuk .-1(lih :help :range.). Karena :putmenempatkan teks setelah baris, Anda harus secara eksplisit mengatakannya untuk bertindak pada yang sebelumnya.

  • Menyalin seluruh penyangga ke clipboard sistem: :%y+.

    lih. :help :range(untuk %bagian) dan :help :y.

  • Jika Anda salah mencatat makro, Anda bisa mengetik :let @a=' Ctrl- R =replace(@a,"'","''",'g') Enter 'dan mengeditnya. Ini akan mengubah konten makro yang disimpan dalam register a, dan itu ditampilkan di sini bagaimana Anda bisa menggunakan register ekspresi untuk melakukannya.

  • Jika Anda melakukannya dddd, Anda mungkin melakukannya uuuntuk membatalkan. Dengan pAnda bisa mendapatkan baris yang terakhir dihapus. Tetapi sebenarnya Anda juga dapat memulihkan hingga 9 penghapusan dengan register @1melalui @9.

    Bahkan lebih baik, jika Anda melakukannya "1P, maka .dalam mode Normal akan diputar "2P, dan seterusnya.

    lih. :help .dan:help quote_number

  • Jika Anda ingin memasukkan tanggal saat ini dalam mode Sisipkan: Ctrl- R=strftime('%y%m%d')Enter.

    lih. :help strftime()

Sekali lagi, apa yang bisa membingungkan:

  • :@ adalah perintah baris perintah yang mengartikan isi register sebagai vimscript dan sumbernya
  • @ dalam mode normal perintah yang mengartikan isi register sebagai penekanan tombol mode normal (kecuali ketika Anda menggunakan :register, yang berisi perintah terakhir dimainkan tanpa titik dua awal: dalam hal ini ia mengulang perintah seolah-olah Anda juga mengetik ulang titik dua dan kunci pengembalian akhir).

  • " dalam mode normal perintah yang membantu Anda memilih register untuk menarik, menempel, menghapus, memperbaiki, dll.

  • " juga merupakan nama register yang valid (default, atau tidak disebutkan namanya, register) dan karenanya dapat diajukan sebagai argumen untuk perintah yang mengharapkan nama register
Benoit
sumber
205
Bukankah ada lencana “Rasio panjang 100/1 antara jawaban dan pertanyaan?” :)
Benoit
8
Ini jawaban yang bagus, tetapi sekitar 900 kata, kurang dari 1400. :)
19
Jawaban ini telah mengubah cara saya menggunakan vim. Terima kasih Benoit
P. Myer Nore
11
Jangan lupa: reg yang akan mendaftar semua register beserta isinya
eugenevd
3
Dalam versi terbaru vim, penghapusan yang lebih kecil dari satu baris masuk ke "register penghapusan kecil" alih-alih masuk ke register bernomor. Referensi: Vi dan Vim , Vi dan Vim , Reddit
Christian Long
48

Untuk menempelkan sesuatu yang merupakan clipboard sistem Anda hanya dapat menggunakan SHIFT- INS.

Ini bekerja di Windows, tapi saya kira itu bekerja dengan baik di Linux juga.

Skeept
sumber
7
Yup, bekerja di Linux juga. Diuji di bawah GNOME di Vim dan GVim.
Teoulas
3
Ini sebenarnya memberi makan papan tulis ke Vim sebagai input keyboard, jadi jika Anda berada dalam mode normal dan tempel :!rm -rf /<cr>, itu akan menjalankannya. Gunakan register sebagai gantinya!
lericson
4
@lericson Bukankah saya mengatakan dalam jawaban saya bahwa ini berguna untuk sesuatu yang ada di keyboard sistem? Saya tidak mengerti downvote. Dan untuk Anda contohnya, serius? Anda benar-benar memilikinya di clipboard? Dan Anda tidak berpikir bahwa mengetik shift-inslebih mudah daripada ctrl-R+*? Ini tentu saja jika Anda berada di gvim. Jika Anda berada di terminal yang terhubung ke komputer lain dan Anda ingin menempelkan sesuatu dari clipboard Anda, tahukah Anda sesuatu yang lebih baik shift-ins? karena register tidak berfungsi dalam situasi itu. Tolong pikirkan sebelum Anda berkomentar dan melakukan hal-hal lain (seperti downvoting).
skeept
Saya pikir ini adalah informasi yang salah dan saya telah bertindak atas penilaian itu.
lericson
1
Tidak bekerja untuk saya. Saya baru saja menambahkan '<S-Insert>' ke baris perintah saya. Mungkin saya melewatkan sesuatu. (Ubuntu 19.04 / 2: 8.1.0320-1ubuntu3.1).
Max Waterman
39

"Saya ingin menempelkan teks yang ditarik ke baris perintah Vim."

Sementara jawaban terpilih teratas sangat lengkap, saya lebih suka mengedit sejarah perintah.

Dalam mode normal, ketik: q:. Ini akan memberi Anda daftar perintah terbaru, dapat diedit dan dapat dicari dengan perintah vim normal. Anda akan mulai pada baris perintah kosong di bagian bawah.

Untuk hal yang persis seperti yang ditanyakan oleh artikel tersebut, menempelkan baris yang ditarik (atau menarik apa pun) ke dalam baris perintah, tarik teks Anda dan kemudian: q:p (masuk ke mode edit histori perintah, dan kemudian (p) ut teks yang Anda tarik itu menjadi perintah baru Sunting sesuka hati, enteruntuk mengeksekusi.

Untuk keluar dari mode histori perintah, itu kebalikannya. Dalam mode normal di histori perintah, ketik: :q+enter

Wandspiegel
sumber
1
jika Anda sudah memodifikasi perintah yang ada dan tidak menekan 'q:' tekan ctrl + f dan itu akan menarik kemampuan untuk mengedit riwayat perintah.
Clay
14

Untuk menempelkan sesuatu dari clipboard sistem ke dalam baris perintah Vim ("mode perintah"), gunakan Ctrl+ Rdiikuti oleh +. Bagi saya, setidaknya di Ubuntu, Shift+ Instidak berfungsi.

PS: Saya tidak yakin mengapa Ctrl+ Rdiikuti *, yang secara teori sama dengan Ctrl+ Rdiikuti +sepertinya tidak selalu berhasil. Saya mencari dan menemukan +versinya dan sepertinya selalu berhasil, setidaknya di komputer saya.

Proto
sumber
2
Perbedaan antara Ctrl-r + dan Ctrl-r * adalah bahwa yang pertama adalah clipboard biasa, tetapi di Linux ada jenis clipboard kedua yang disebut "primer" yang mewakili teks yang paling baru dipilih (tombol tengah tempelkan mouse dari sana) . Ini tidak tersedia di Windows atau MAC
Matias Thayer
13

Perlu dicatat juga bahwa register yank sama dengan buffer makro. Dengan kata lain, Anda cukup menuliskan seluruh perintah di dokumen Anda (termasuk cuplikan yang disisipkan), lalu "bymenariknya ke bregister, dan kemudian menjalankannya @b.

tidak ada apa-apa101
sumber
1

Saya mengalami masalah yang sama. Saya ingin teks yang dipilih berakhir di sebuah perintah, tetapi tidak bergantung pada menempelkannya. Inilah perintah yang saya coba tuliskan pemetaan untuk:

:call VimuxRunCommand("python")

Dokumen untuk plugin ini hanya ditampilkan menggunakan string literal. Berikut ini akan pecah jika Anda mencoba untuk memilih teks yang berisi tanda kutip:

vnoremap y:call VimuxRunCommand("<c-r>"")<cr>

Untuk menyiasatinya, Anda cukup mereferensikan konten makro menggunakan @:

vnoremap y:call VimuxRunCommand(@")<cr>

Menyerahkan isi register yang tidak disebutkan namanya dan bekerja dengan penawaran ganda dan multiline edgecases saya.

Conrad.Dean
sumber
Saya pikir contoh terakhir Anda tidak ada ". Mungkin maksud Anda VimuxRunCommand (" @ ").
kd8azz
Itu akan mengirim @karakter ke perintah vimux. anggap @sebagai lolos dari kutipan ganda berikut dan diperlakukan sebagai register bukan sebagai karakter biasa. Yang vnoremapsaya definisikan aktif dalam mode visual, jadi itu menarik teks yang dipilih, dan kemudian menempelkannya ke perintah vimux, mengirimkannya ke interpreter yang berjalan di panel yang berdekatan. sangat bagus untuk mengerjakan naskah dan menguji bagian-bagian kecil dengan beberapa penekanan tombol.
Conrad.
1

OS X

Jika Anda menggunakan Vim di Mac OS X, sayangnya ia hadir dengan versi yang lebih lama, dan tidak mematuhi opsi clipboard. Untungnya, Homebrew dapat dengan mudah menyelesaikan masalah ini.

Instal Vim:

brew install vim --with-lua --with-override-system-vi

Instal versi GUI Vim:

brew install macvim --with-lua --with-override-system-vi

Mulai ulang terminal agar mulai berlaku.


Tambahkan baris berikut ke ~/.vimrc
set clipboard=unnamed

Sekarang Anda dapat menyalin garis di Vim dengan yydan menempelkannya di seluruh sistem.

anonim
sumber
1

Untuk konteks, informasi ini berasal dari out-of-the-box, tidak ada plugins, no .vimrc Vim 7.4 perilaku di Linux Mint dengan opsi default.

Anda selalu dapat memilih teks dengan mouse (atau menggunakan Vatau vdan menempatkan pilihan di register "*), dan menempelkannya ke dalam baris perintah dengan Shift+ Ctrl+v .

Mengetik Ctrl+ rpada baris perintah akan menyebabkan prompt untuk nama register. jadi pengetikan :CTRL-r*akan menempatkan register konten * ke dalam baris perintah. Ini akan menempelkan register apa pun, bukan hanya "*. Lihat:help c_CTRL-R .

Selanjutnya, tombol tengah mouse akan menempel ke baris perintah.

Lihat :help->quote-plus deskripsi tentang bagaimana X Window menangani pilihan. Bahkan dalam Vim yang sederhana dan out-of-the-box (sekali lagi, dalam Vim 7.4 di Linux Mint), setiap pilihan yang dibuat dengan tombol mouse kiri dapat disisipkan di baris perintah dengan tombol mouse tengah.

Selain itu, tombol tengah mouse juga akan menempelkan teks yang dipilih di Vim ke banyak aplikasi X Window lainnya, bahkan yang GUI (misalnya, Firefox dan Thunderbird ) dan menempelkan teks ke dalam baris perintah juga dimungkinkan di mana teks dipilih dari aplikasi lain .

Lihat: help-> x11-selection untuk informasi addl.

tl; dr

Coba terlebih dahulu: pendekatan CTRL-r, dan kemudian gunakan Shift+ Ctrl+ vatau tombol tengah mouse jika Anda membutuhkan yang lain.

Diakui bahwa itu bisa membingungkan.

wmm
sumber
0
  1. "[a-z]y: Salin teks ke register [az]

  2. Gunakan :!untuk pergi ke perintah edit

  3. Ctrl+ R: Ikuti identitas register untuk menempelkan apa yang Anda salin.

Ini digunakan untuk CentOS 7.

yang
sumber
Yang dimaksud dengan "Dulu CentOS 7." ?
Peter Mortensen
0

Jika Anda memiliki dua nilai yang ditarik ke dalam dua register yang berbeda (misalnya mendaftar adan mendaftar b) maka Anda cukup mengatur variabel cdan melakukan operasi di atasnya.

Misalnya, :set c = str2float(@a) + str2float(@b)lalu Anda bisa menempelkan konten di cmana saja.

Misalnya sementara dalam mode INSERT, CTRL + Rlalu ketik =untuk masuk ke register ekspresi dan cukup ketik csetelah tanda sama dan tekan ENTER. Selesai Anda sekarang harus memiliki total adan bregister.

Semua ini dapat direkam dalam makro dan diulangi!

The str2floatFungsi ini digunakan jika Anda bekerja dengan mengapung, jika Anda tidak, Anda akan mendapatkan bilangan bulat sebagai gantinya.

Saya tidak yakin apakah ini idiomatis tetapi berfungsi untuk kasus saya di mana saya perlu menambahkan 2 angka berturut-turut dan mengulanginya untuk 500 baris lagi.

Rafael
sumber