Saya ingin menempelkan teks yang ditarik ke baris perintah Vim. Apa itu mungkin?
vim
copy-paste
dan
sumber
sumber
Jawaban:
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 menggunakany
dalam mode normal, tanpa menentukan register, teks yang ditarik ke sana dan juga ke register default),1
to9
(menggeser register hapus, ketika Anda menggunakan perintah sepertic
ataud
, 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," ),a
untukz
untuk penggunaan Anda sendiri (dikapitalisasiA
untukZ
untuk 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 melaluiQ
atau:
, hanya baca),+
dan*
(register clipboard sistem, Anda dapat menulis kepada mereka untuk mengatur clipboard dan membaca konten clipboard dari mereka)Lihat
:help registers
untuk referensi lengkap.Anda dapat, kapan saja, gunakan
:registers
untuk menampilkan konten semua register. Sinonim dan singkatan untuk perintah ini adalah:display
,:reg
dan: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
0x08
untuk backspace, dll), Anda dapat menggunakan Ctrl- R, Ctrl- O, mendaftarkan nama. Lihat:help i_CTRL-R
dan 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:put
perintah, seperti banyak perintah Ex, bekerja hanya linewise.lih.
:help :put
Anda juga bisa melakukannya:
:call setreg('"', @", 'V')
lalup
. Thesetreg
Fungsi set register yang namanya diberikan sebagai argumen pertama (sebagai string), menginisialisasi dengan isi argumen kedua (dan Anda dapat menggunakan register sebagai variabel dengan nama@x
manax
adalah nama mendaftar di VimL), dan mengubahnya menjadi mode yang ditentukan dalam argumen ketiga,V
untuk linewise, tidak ada untuk characterwise dan literal^V
untuk blockwise.lih.
:help setreg()
. Fungsi sebaliknya adalahgetreg()
dangetregtype()
.Jika Anda telah mencatat makro dengan
qa
...q
, maka:echo @a
akan memberi tahu Anda apa yang telah Anda ketik, dan@a
akan 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
8go
di 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 terakhirdd
dalam 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 denganp
,P
,:put
dan 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 berisie
tetapi@:
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 mengandungbar
ke 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
Q
belum dipetakan kembalimswin.vim
, mulai mode Ex denganQ
, rantai "perintah usus besar" yang sebenarnya lebih baik disebut "perintah Ex", dan kembali ke mode Normal dengan mengetikvisual
.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
foo
sebelum setiap baris::g/^/-put ='foo'
. Ini adalah penggunaan register ekspresi yang cerdas. Di sini,-
adalah sinonim untuk.-1
(lih:help :range
.). Karena:put
menempatkan 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 registera
, dan itu ditampilkan di sini bagaimana Anda bisa menggunakan register ekspresi untuk melakukannya.Jika Anda melakukannya
dddd
, Anda mungkin melakukannyauu
untuk membatalkan. Denganp
Anda bisa mendapatkan baris yang terakhir dihapus. Tetapi sebenarnya Anda juga dapat memulihkan hingga 9 penghapusan dengan register@1
melalui@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 registersumber
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.
sumber
:!rm -rf /<cr>
, itu akan menjalankannya. Gunakan register sebagai gantinya!shift-ins
lebih mudah daripadactrl-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 baikshift-ins
? karena register tidak berfungsi dalam situasi itu. Tolong pikirkan sebelum Anda berkomentar dan melakukan hal-hal lain (seperti downvoting)."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
+entersumber
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.
sumber
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
"by
menariknya keb
register, dan kemudian menjalankannya@b
.sumber
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:
Dokumen untuk plugin ini hanya ditampilkan menggunakan string literal. Berikut ini akan pecah jika Anda mencoba untuk memilih teks yang berisi tanda kutip:
Untuk menyiasatinya, Anda cukup mereferensikan konten makro menggunakan
@
:Menyerahkan isi register yang tidak disebutkan namanya dan bekerja dengan penawaran ganda dan multiline edgecases saya.
sumber
@
karakter ke perintah vimux. anggap@
sebagai lolos dari kutipan ganda berikut dan diperlakukan sebagai register bukan sebagai karakter biasa. Yangvnoremap
saya 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.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
yy
dan menempelkannya di seluruh sistem.sumber
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.
sumber
"[a-z]y
: Salin teks ke register [az]Gunakan
:!
untuk pergi ke perintah editCtrl+ R: Ikuti identitas register untuk menempelkan apa yang Anda salin.
Ini digunakan untuk CentOS 7.
sumber
Jika Anda memiliki dua nilai yang ditarik ke dalam dua register yang berbeda (misalnya mendaftar
a
dan mendaftarb
) maka Anda cukup mengatur variabelc
dan melakukan operasi di atasnya.Misalnya,
:set c = str2float(@a) + str2float(@b)
lalu Anda bisa menempelkan konten dic
mana saja.Misalnya sementara dalam mode INSERT,
CTRL + R
lalu ketik=
untuk masuk ke register ekspresi dan cukup ketikc
setelah tanda sama dan tekan ENTER. Selesai Anda sekarang harus memiliki totala
danb
register.Semua ini dapat direkam dalam makro dan diulangi!
The
str2float
Fungsi 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.
sumber