Mengapa Terminal secara otomatis memasukkan perintah saya setelah menempelkan teks?

9

Ini terjadi apakah saya menggunakan ctrl + shift + v atau menempel dari menu klik kanan.

Bagaimana cara menghentikan perilaku ini?

Kehilangan jiwa
sumber
Penjelasan lebih lanjut diperlukan untuk memahami pertanyaan Anda
SHW
Mungkin ConEmu di Windows melakukan apa yang Anda inginkan - ketika Anda mencoba menempelkan sesuatu yang berisi baris baru, itu akan memperingatkan Anda sebelum melanjutkan. Ini semacam sentuhan yang bagus. Mungkin ada emulator terminal Linux yang memiliki fitur ini?
Brandin
4
Saya yakin Anda menyalin trailing "\ n" (karakter baris baru, Anda tidak akan melihat pada teks Anda tetapi ada jika Anda memiliki jeda baris) ketika Anda menyalin teks Anda, yang akan meniru pers pada tombol ENTER, maka menjalankan perintah.
herbert
Kemungkinan duplikat ini - unix.stackexchange.com/questions/202732/... Saya tidak tahu tentang "braket tempel" yang disebutkan dalam pertanyaan itu. Saya biasanya menggunakan editor teks dalam kombinasi dengan terminal dan kemudian dengan hati-hati menyalin / menempel bagian-bagian yang saya inginkan ke terminal.
Brandin

Jawaban:

6

Jangan menyalin beberapa baris teks, untuk menempel. Saya hampir dapat menjamin Anda hanya menyalin bagian terakhir dari baris. Jika Anda mengklik tiga kali untuk menyalin baris kode yang Anda tempelkan, Anda mendapatkan baris baru di akhir baris. Jika Anda ingin memastikan, itu benar-benar masalah, maka salin seluruh baris, kecuali untuk huruf / digit terakhir, dan lihat apakah menempelkan itu juga termasuk baris baru.

WormFood
sumber
Ini hanya terjadi ketika saya menyalin beberapa baris kode. Sekarang saya mengerti mengapa.
LostSoul
7

Teks yang Anda tempelkan menyertakan baris tambahan. Ketika Anda menempelkan baris baru, shell yang berjalan di terminal melihatnya sebagai menekan Enter, sehingga menjalankan perintah.

Operasi tempel dilakukan oleh emulator terminal; itu mengirimkan teks yang disisipkan ke aplikasi yang berjalan di terminal, dengan cara yang sama seperti itu melewati teks yang diketik oleh pengguna. Lihat Bagaimana cara kerja input keyboard dan output teks? untuk informasi lebih lanjut tentang cara kerja input. Aplikasi (di sini, shell) tidak memiliki cara untuk membedakan antara penekanan tombol dan operasi tempel.

Banyak emulator terminal dewasa ini mendukung pasta yang dikurung . Dalam mode kurung kurung, aplikasi dapat membedakan operasi tempel dari penekanan tombol. Bracketed paste hanya berguna jika aplikasi melakukan sesuatu yang berbeda dengan teks yang disisipkan, jadi itu diaktifkan oleh aplikasi pendukung, itu bukan sesuatu yang dikonfigurasikan oleh pengguna terminal emulator.

Zsh 5.1 (yang keluar beberapa minggu lalu, jadi belum tersedia di sebagian besar distribusi) menambahkan dukungan untuk mode tempel kurung. Saat Anda menempelkan teks, itu hanya disisipkan pada baris perintah, dan Anda dapat mengeditnya sebelum menekan Enteruntuk mengeksekusi baris perintah.

Pengguna oh-my-zsh dapat menggunakan plugin safe-paste bahkan dalam versi zsh sebelumnya.

Hal lain yang dapat Anda lakukan di zsh adalah membuatnya memasukkan pilihan sebagai string, dengan mengutip (dalam bentuk garis miring terbalik sebelum setiap karakter khusus shell seperti spasi putih). Ketik `xsel`untuk mendapatkan pemilihan utama (pemilihan mouse otomatis), atau `xsel -b`untuk mendapatkan konten clipboard (teks disalin dengan Ctrl+ C), lalu tekan Tab.

Jika Anda memiliki versi zsh yang lebih lama dan Anda ingin memasukkan konten clipboard tanpa mengutip, Anda dapat menentukan fungsi yang menyisipkan pilihan.

function zle_insert_x_selection {
  LBUFFER+=$(xsel ${NUMERIC+-b} -o </dev/null)
}
zle -N zle_insert_x_selection
bindkey '\e\C-v' zle_insert_x_selection

Dengan ini di Anda .zshrc, Anda dapat menekan Ctrl+ Alt+ Vuntuk menyisipkan pilihan utama, atau Ctrl+ U Ctrl+ Alt+ Vuntuk memasukkan konten clipboard. Mereka dimasukkan sebelum kursor, tidak berubah kecuali tanpa baris baru. Lihat Bagikan papan klip antara bash dan X11 untuk sesuatu yang serupa di bash.

Gilles 'SANGAT berhenti menjadi jahat'
sumber
7

Jika Anda menggunakan bash sebagai shell, Anda dapat menekan Ctrl-X Ctrl-Euntuk membuka editor (ditentukan oleh $ VISUAL atau $ EDITOR, mis. viAtau mungkin nano).

Anda kemudian dapat menempelkan perintah Anda ke dalam persis seperti yang Anda lakukan jika Anda mengedit file. Mereka akan dieksekusi jika Anda menyimpan dan keluar. Atau dibatalkan jika Anda berhenti tanpa menyimpan.

cas
sumber
Metode ini tidak berfungsi untuk saya.
LostSoul
3

Untuk melakukan tempel multi-baris ke prompt perintah, buka tanda kutip tunggal atau ganda sebelum menempel.

$ echo 'paste
...
... '

Kemudian Anda dapat menekan kembali untuk mengulanginya. Saat Anda panah atas, semua baris yang Anda tempelkan akan berada pada satu baris yang dapat diedit.

Ini berfungsi selama tidak ada kutipan tunggal dalam teks yang Anda tempel.

Peter Cordes
sumber
1

Di jendela editor teks, gunakan pintasan berikut untuk menyalin teks tanpa \ n (umpan baris):

  • Shift+ Home, Ctrl+ Insert- menyalin bagian dari baris sebelum kursor.
  • Shift+ End, Ctrl+ Insert- menyalin bagian dari baris setelah kursor.
  • Home, Shift+ End, Ctrl+ Insert- menyalin semua baris tanpa \ n.

Di jendela browser, atau hal lain di mana teks tidak dapat diedit gunakan salah satu dari dua teknik:

  • Salin ke editor teks terlebih dahulu (lebih disukai, karena memberi Anda kesempatan untuk mengedit perintah).
  • Pilih hanya teks pada baris (tanpa memperluas zona pemilihan ke kanan di luar karakter terakhir), lalu Ctrl+ Insertdan tempel ke jendela terminal.

Tampilan yang benar (tanpa \ n):

ls -al

Bagaimana pilihan yang salah (dengan \ n) terlihat:

ls -al
Incnis Mrsi
sumber