Mengapa Ctrl + V tidak menempel di Bash (Linux shell)?

192

Ketika saya menyalin sesuatu ke clipboard dan menekan Ctrl+ Vdi Bash, tidak ada yang terjadi; Namun, mengklik kanan dan memilih Tempel berhasil .

Mengapa? Apakah ada masalah yang masuk akal (saya yakin ada) di balik perilaku ini di Linux?

Yasser Zamani
sumber
25
Shift- InsertJuga berfungsi
bonyiii
33
Saya lebih suka Ctrl-Shift-V, secara pribadi.
amalloy
3
Anda juga dapat menggunakan Shift + Insert di sebagian besar lingkungan shell.
Fabian
4
Bagaimana jika Anda tidak akan memiliki kunci Sisipkan?
Ben Racicot
3
itu tidak berfungsi di command prompt windows juga
phuclv

Jawaban:

360

Pada masa terminal fisik , clipboard seluruh sesi tidak ada, hanya beberapa program yang mendukung copy / paste internal - seringkali dengan nama "buffer" atau "kill rings" - dan menggunakan berbagai penekanan tombol yang berbeda. Misalnya, bash shell menggunakan CtrlKatau CtrlUuntuk "membunuh" (memotong), CtrlYuntuk "menarik" (tempel); ini berasal dari para emacs redaksi .

CtrlChampir di semua tempat di Unix adalah kunci "interupsi" , yang digunakan untuk membatalkan program atau operasi saat ini. The CtrlVkey sering berarti "insert verbatim" - yaitu, masukkan karakter berikut harfiah tanpa melakukan tindakan apapun terkait. Misalnya, normal Escberalih ke mode perintah di editor vi , tetapi CtrlV, Escakan memasukkan ESCkarakter ke dalam dokumen.

Penggunaan CtrlCuntuk menyalin dan CtrlVmenempel dari clipboard seluruh sesi diperkenalkan oleh Mac OS pada tahun 1983 dan Microsoft Windows 3.x pada tahun 1990. (Versi Windows sebelumnya (1.x dan 2.x), serta IBM OS / 2 , hanya mendukung kunci CUA IBMCtrlIns untuk menyalin dan ShiftInsmenempel; pintasan ini tetap didukung oleh semua versi Windows.)

Ketika GUI dengan dukungan clipboard akhirnya mencapai Unix, Ctrlpenekanan tombol sudah digunakan oleh banyak program terminal. Selain itu, antarmuka grafis X memiliki mekanisme yang agak berbeda : "seleksi" dan "potong buffer". Bahkan sekarang Anda dapat memilih teks dalam satu program dan menyisipkannya menggunakan tombol tengah mouse, tanpa tindakan penyalinan eksplisit.

Singkatnya, pada saat Xterm dan Terminal GNOME ditulis (saya kira Anda menggunakan yang terakhir), CtrlV sudah memiliki arti yang sangat berbeda selama bertahun-tahun dan tidak dapat diubah. Selain itu, metode alternatif menyalin teks - "seleksi" - sudah ada di X11, jadi tindakan salin / tempel eksplisit mungkin dianggap tidak sepenting seperti di Windows. Ini berarti bahwa berbagai pintasan keyboard harus dipilih - misalnya, sebagian besar program terminal modern, seperti Terminal GNOME, menggunakan CtrlShiftCdan CtrlShiftV. (Jika Anda menggunakan Xterm, pintasan yang sama dapat ditambahkan secara manual menggunakan XTerm * vt100 * terjemahan Xresource. Rxvt tidak memiliki opsi seperti itu.)

(Kebanyakan toolkit X11 juga mendukung kunci "copy" dan "paste" CUA, yang tidak bertentangan dengan program terminal. Sayangnya, implementasinya agak tidak konsisten - CtrlInssalinan ke "clipboard" di sebagian besar program (GTK, Qt4, tetapi diabaikan oleh Namun, ShiftInspasta dari "pemilihan utama" di sebagian besar program GTK dan Qt4, tetapi dari "clipboard" di Firefox, dan dari buffer cut yang sudah usang di Xaw yang sekarang usang.)


Semua yang mengatakan, beberapa terminal atau konsol (khususnya, Windows 10 konsol) melakukan mendukung kunci ini. Karena konsol Windows selalu memiliki mode "tandai / pilih" yang terpisah, CtrlCkini juga memiliki dua makna berdasarkan konteks - dalam mode biasa ia mengirimkan interupsi, dalam mode pilih, ia menyalin ke clipboard (seperti Enterdulu).

Sementara itu, alat baris perintah Windows tidak pernah benar-benar digunakan CtrlV untuk apa pun, jadi ia terikat untuk "menempel" tanpa mengganggu banyak hal. Melakukan hal yang sama pada terminal seperti Unix akan lebih bermasalah.

grawity
sumber
10
Hmm. Dalam Vim, "yank" berarti menyalin daripada menempel. Ini tampaknya lebih masuk akal juga. Apakah Anda yakin tentang arti istilah ini di sini?
Konrad Rudolph
11
Ya saya yakin. Bash mewarisi cara pintas default dari yang setara dengan Emacs mereka .
grawity
4
@grawity: komentar terakhir Anda agak sedikit keliru. Bash menawarkan dua mode pengeditan baris perintah, mode vim dan mode emacs. Kebetulan emacs-mode adalah default pada kebanyakan instalasi. Itu memang menimbulkan ambiguitas dalam penggunaan istilah yank , bahkan untuk bash.
rahmu
1
A-ha! Saya tahu pengembang Vimperator membuat kesalahan ketika mereka beralih <C-v>ke idalam versi 3, tetapi saya tidak tahu mengapa .
Izkata
2
@Colin: Anda masih melewatkan perbedaan antara clipboard dan pemilihan X. Ada beberapa pilihan (PRIMARY, SECONDARY, CLIPBOARD), tetapi hanya satu dari mereka yang biasanya disebut "clipboard" - pilihan CLIPBOARD, karena di situlah salinan Ctrl-C berada, dan dari situlah Ctrl-V menempel. Pilihan utama bukan clipboard.
grawity
47

Gunakan CtrlShiftVuntuk menempel.

Ctrl dengan karakter lain biasanya digunakan oleh shell untuk fungsi khusus.

Akash
sumber
4
Jadi mengapa Linux tidak mendaftarkan CTRL + SHIFT untuk fungsi khusus sebagai gantinya; Saya pikir copy-paste lebih khas oleh beberapa pengguna daripada fungsi-fungsi khusus, kan?
Yasser Zamani
22
Kerang telah ada jauh sebelum ada Terminal dan GUI grafis dengan fungsionalitas cut and paste, sehingga argumen Anda tidak benar-benar valid. @YasserZamani
slhck
9
Ctrl + Shift + V dijalankan oleh emulator terminal (dengan asumsi Anda menggunakan Terminal GNOME) dan tidak dengan bashsendirinya. Jika Anda pernah berada di luar lingkungan GUI, atau jika Anda menggunakan emulator istilah lain, ini mungkin tidak akan berfungsi. Jangan menganggap perintah ini portabel.
rahmu
@rahmu Oh, tidak tahu tentang itu. Gunakan hanya stock install Ubuntu. Apakah ada perintah universal?
Akash
2
Mungkin tidak ada satu untuk mengakses clipboard (hanya Shift + Ins untuk pemilihan utama). Bahkan clipboard itu sendiri adalah hal X11, tidak dapat diakses dari tty's. Namun, Ctrl + Shift + V didukung oleh Terminal GNOME, Terminal Xfce4, Konsol KDE; ini mencakup lingkungan GUI paling populer.
grawity
20

Berikut ini adalah pengaturan umum untuk penyalinan dengan terminal populer:

gnome-terminal (paling populer di Linux)
Salin : CtrlShiftC
Tempel : CtrlShiftV
Catatan : Select-to-copy dan middle-clickpaste juga berfungsi, tetapi menggunakan clipboard alternatif.

Putty (terminal paling populer di Windows)
Salin : (pilih dengan mouse, tidak ada interaksi keyboard)
Paste : Right-click (atau lebih andal: shiftRight-click)
Catatan : Aplikasi yang mengambil masukan mouse (seperti vimdan links) dapat mencuri Right-click- shiftRight-clickakan selalu bekerja dalam aplikasi apapun.


Salinan Terminal OSX : AppleC
Tempel : AppleV
Catatan: Aplikasi yang mengambil kontrol mouse (seperti vimdan links) dapat mengesampingkan apa artinya memilih teks, dalam hal ini penyalinan tidak akan berfungsi seperti yang Anda harapkan. Dalam kasus itu, tahan Controlsambil menyeret mouse untuk memilih. Interaksi mouse dengan aplikasi dinonaktifkan secara default di pengaturan terminal Anda, sehingga kebanyakan orang bahkan tidak akan tahu tentang ini.

tylerl
sumber
Bukankah cmd.exelebih populer daripada Putty di Windows? :-)
Ben
@ Ben Bukan sebagai terminal SSH.
tylerl
1
Tidak, cmd.exeini bukan terminal SSH. Itu benar sekali.
Ben
3
@ Ben: Ini bukan terminal sama sekali - hanya sebuah shell. Terminal default di Windows adalah komponen "Windows Console" dari csrss.
grawity
@Ben tetapi klik kanan untuk menempel juga berfungsi cmd.exe(dan merupakan satu-satunya jalan di sana, jika Anda tidak ingin membuka menu> edit> tempel) dalam mode edit cepat . Tidak ada pintasan di command prompt pra-win10
phuclv
17

Merupakan tradisi yang mengakar kuat bahwa Ctrlkunci bersama dengan huruf menghasilkan karakter kontrol ASCII yang ditemukan dengan mengurangi 64 dari nilai ASCII huruf besar. Perhitungan ini memetakan Ctrl- Ake 1, dan seterusnya. Misalnya Ctrl- Iadalah Tabdan Ctrl- Jadalah linefeed.

Tidak ada tradisi serupa untuk Ctrl- Shift. Ctrl- Shift- Vtidak diharapkan untuk menghasilkan karakter spesifik apa pun.

Emulator terminal harus mendukung tradisi dengan secara transparan melewati Ctrlkonvensi, membiarkannya muncul sebagai input karakter ke program yang dioperasikan melalui jendela terminal itu. Program berbasis terminal memetakan kunci kontrol ke perintah. Misalnya, Bash menggunakan Ctrl- Vsebagai perintah yang berarti "ambil karakter berikutnya secara harfiah". Ini memungkinkan Anda untuk menanamkan karakter kontrol di baris perintah. Jika terminal mencuri kunci kontrol untuk penggunaannya sendiri, perintah seperti itu menjadi tidak tersedia. Jadi mencegat Ctrl- Vuntuk fungsi-meta keluar dari pertanyaan (setidaknya dalam konfigurasi default).

Namun, emulator terminal bebas untuk mencegat Ctrl- Shift- Vyang tidak diharapkan menghasilkan karakter. Ctrl- Shift- Vbukan standar; itu adalah hal Terminal Gnome (yang mungkin ada di beberapa terminal lain).

Pada desktop Unix berbasis X konvensi adalah bahwa tidak ada perintah yang diperlukan untuk menyalin. Anda tinggal memilih teks. Dan tombol tengah menempel teks itu di tempat lain. Anda akan menemukan bahwa ia berfungsi di Xterm, Gnome Terminal dan Firefox.

Ctrl- Vadalah konvensi Microsoft Windows, yang merupakan tiruan dari Apple- Vdari Macintosh.

Kaz
sumber
3
Hal ini tidak persis pengurangan - tradisional Ctrl telah dibersihkan 6 dan 7 bit dari karakter; karena itu, Ctrl + Shift + letter bekerja secara identik dengan Ctrl + Letter di sebagian besar terminal (kecuali jika secara eksplisit ditimpa oleh terminal, seperti dalam kasus copy / paste pintasan).
grawity
1
Karena kunci pada dasarnya dipesan secara acak sehubungan dengan standar ASCII, ROM program mencakup beberapa tabel pencarian yang membantu dalam pembuatan kode ASCII. ... Menahan sendiri kunci CONTROL saat tombol lain ditekan menyebabkan pencarian tabel lainnya. [Manual Teknis seri VT100, 4.4.9.3, Digital].
Kaz
1
@Linger terima kasih atas hasil editnya. Rendernya bagus, tapi tidak mungkin saya mengetik semua <kbd>tag ini di posting mendatang.
Kaz
Ctrl-Aadalah 1. Bagaimana saya bisa mencoba ini? Terminal Gnome saya tidak melakukan apa-apa ketika saya menekan Ctrl-A.
robert
3

Bagi saya, cara paling sederhana untuk menyalin paste di shell adalah:

Pilih kode yang Anda inginkan dan lalu lewati dengan mengklik mouse-middle-key

Pedro Lobito
sumber
1
Selama Anda memiliki tombol tengah mouse.
jpierson
1
@ jpierson bukan saya sangat merekomendasikan ini, tetapi Anda dapat menulis skrip kecil yang hanya digunakan xdotool click 2untuk meniru klik tombol ketiga untuk Anda. Kemudian, di lingkungan window manager / desktop apa pun yang Anda gunakan, Anda dapat mengikat skrip ini ke kunci - katakan mod i(untuk disisipkan) atau apa pun ikatan kunci yang mungkin Anda miliki (atau apa pun mod yang mungkin berarti - yang benar-benar tergantung di mana Anda mengikat ini)
dylnmc
2

Kita dapat menggunakan tombol keyboard insert untuk melakukan salin dan tempel (Di keyboard yang lama bisa hilang)

Salin : CtrlInsert
Tempel :CtrlShiftInsert

Bharat
sumber
1

Anda juga dapat menggunakan tombol tengah mouse jika Anda merasa malas dan memilih perintah dari dokumen teks, skrip atau web atau forum. setelah Anda memilih perintah yang dimaksud cukup pindah ke terminal Anda dan klik tombol tengah pada mouse. Saya menggunakan metode ini karena saya menggunakan puppy linux yang sepertinya tidak mendukung perilaku normal klik kanan dan tempel. itu di jendela penangan file, hanya saja tidak di jendela terminal. nggak tahu kenapa tapi saya cukup senang saya mengetahui tentang metode tombol tengah, sangat berguna! ;-)

m1cha3ll0w3
sumber