Mengapa saya tidak bisa menyorot teks dalam emulator terminal linux dengan tombol shift + panah?

19

Ini adalah pintasan keyboard pengeditan teks standar yang saya gunakan secara konstan setiap kali mengedit teks di, secara harfiah, aplikasi linux apa pun selain emulator terminal:

  • panah kiri + kanan untuk bergerak ke kiri + kanan
  • ctrl + panah untuk memindahkan seluruh kata
  • home / end untuk pindah ke start / end of line
  • ctrl + c / ctrl + v untuk menyalin / menempel [beberapa terminal dapat menggunakan shift-ctrl-C / shift-ctrl-V; ini adalah pengganti yang bagus]
  • geser + panah untuk menyorot teks
  • menggeser + ctrl + panah untuk menyorot seluruh kata

Saya belum pernah menemukan kombinasi emulator shell plus terminal yang memungkinkan dua item terakhir dalam daftar ini, dan itu membuat saya gila. Jelas emulator terminal mendukung penyorotan (mouse dapat melakukannya), dan mereka mendukung penggunaan ctrl dan tombol shift sebagai pengubah (mereka dapat digunakan untuk menggerakkan kursor seluruh kata, dan untuk huruf besar, masing-masing; [edit:] mereka bahkan dapat digunakan bersama untuk menyalin / menempel dengan shift-ctrl-C dan shift-ctrl-V), jadi apa masalahnya mencegah fungsi ini? Saya punya beberapa pertanyaan:

  • Apakah ini masalah dengan emulator terminal saya, atau dengan shell saya (bash, meskipun saya bersedia untuk berubah)?
  • Mengapa emulator terminal / cangkang tidak sesuai dengan standar universal ini?
  • Jika ada alasan aktual, apakah ini kuno dan usang, atau apakah masih relevan dengan sejumlah besar pengguna desktop linux?
  • Apakah ada solusi?
  • Apakah ada beberapa program tidak jelas yang dapat saya gunakan yang mendukung ini?
  • Apakah layak untuk memodifikasi sumber, katakanlah, terminal gnome untuk mendukung ini?

Saya tahu teks dapat disalin / ditempelkan dengan mouse, bukan itu yang saya tanyakan. Saya bertanya mengapa saya tidak dapat melakukan hal-hal ini dengan keyboard di terminal emulator.

monguin
sumber
Perhatikan bahwa memilih teks dengan mouse tidak mengubah posisi kursor. Jika Anda mencampur dalam pemilihan teks dengan memasukkan perintah biasa pada keyboard, itu hanya akan sangat membingungkan di luar batas-batas perintah yang baru saja Anda ketik dan belum dieksekusi. Apakah Anda dapat memilih teks di luar batas kotak teks pada halaman web dengan keyboard? Harap perhatikan juga bahwa ada beberapa program seperti layar yang memungkinkan memasuki mode berbeda yang memiliki pemilihan teks untuk seluruh terminal, tetapi tentu saja tidak lagi mengizinkan memasukkan perintah.
Daniel Beck
1
Daniel: konsol Matlab, misalnya, adalah CLI yang memungkinkan penyorotan teks dengan keyboard. Ini bekerja dengan baik dalam pengalaman saya; itu memungkinkan pemilihan di luar perintah yang belum dieksekusi saat ini jika diinginkan, secara pribadi saya tidak banyak menggunakan untuk itu.
monguin
lihat juga stackoverflow.com/questions/1536757/…
Nikos Alexandris
dan di sini juga stackoverflow.com/q/312213/1172302
Nikos Alexandris

Jawaban:

5

Saya pikir itu akan sangat berguna jika saya mengambil sepotong ini sekaligus. Masalah umumnya adalah: untuk siapa pers utama itu ditekan? Terminal, atau program yang berjalan di dalam terminal?

Sebagai contoh, "layar", yang merupakan terminal, menggunakan Ctrl+ Asebagai awalan untuk perintahnya, untuk membedakannya dari hal-hal yang terjadi pada program yang sedang berjalan itu sendiri. (Dan menyediakan cara untuk mengirim Ctrl+ A.)

gnome-terminal memiliki beberapa kunci yang ditangkapnya untuk melakukan berbagai hal, termasuk beberapa yang Anda tanyakan.

Juga perlu diingat bahwa "penyorotan" terminal terpisah dari posisi kursor terminal . Beberapa terminal tidak memiliki kemampuan untuk menyorot sama sekali.

Sekarang, ambil kombinasi tombol ini sekaligus:

panah kiri + kanan untuk pindah ke kiri + ctrl kanan + panah untuk memindahkan seluruh kata home / end untuk pindah ke awal / akhir baris

Pindahkan apa yang kiri dan kanan? Bash dapat dikonfigurasi untuk melakukan ini, dan biasanya secara default. Biasanya, ini memindahkan posisi kursor.

ctrl + c / ctrl + v untuk menyalin / menempel

Pertama: apakah salin / tempel masuk akal? Jika Anda berada di VT, Anda tidak benar-benar memiliki clipboard, terutama jika X tidak berjalan.

Beberapa terminal dapat menyalin teks di output, dan beberapa juga akan "menempel" dengan mensimulasikan Anda mengetik konten clipboard. Ctrl+ Shift+ V, misalnya, ditempelkan gnome-terminal, yang mungkin membantu. (Dan Ctrl+ Shift+ Cadalah copy.) Seperti dibahas sebelumnya, masalah besar dengan Ctrl+ Cdan Ctrl+ Vadalah mereka tumpang tindih dengan perintah terminal / program umum. ( Ctrl+ Cmengirim interupsi (SIGINT) dan Ctrl+ Vadalah kata demi kata.)

Beberapa terminal juga mendukung dua mode penyalinan data: "salin saja" yang lebih normal, dan apa yang dikenal sebagai "blok pilih" atau "blok salin". (Tahan Ctrl, lalu seret selagi masuk gnome-terminalmisalnya.)

Selain itu, xsel -bdapat digunakan untuk menyalurkan konten clipboard di sekitar. Tergantung pada situasi yang pasti apakah xselversi tempel terminal lebih berguna. Lihat man xsel.

menggeser + panah untuk menyorot pergeseran teks + ctrl + panah untuk menyorot seluruh kata

Sorotan terminal Anda (jika memiliki kemampuan ini) terpisah dari posisi kursor. Sekali lagi, kurangnya kombo kunci yang tersedia mungkin merupakan faktor. Perlu diingat bahwa sorotan memiliki dua posisi: mulai dan berakhir, atau sudut kiri atas dan kanan bawah. Bagaimana Anda mengatur keduanya?

Akhirnya, perhatikan bahwa banyak terminal GUI, mengklik dua kali kata akan menyorotnya. (Dan di X, salin ke pemilihan utama.)

screen, sebagai contoh, memiliki tombol untuk beralih ke mode untuk bergerak di sekitar buffer (output sebelumnya) dan menyalin / menempel.

Saya pikir jika Anda menggunakan cukup xseldan pemilihan utama, Anda akan menemukan operasi clipboard cukup langka dan cukup kompleks untuk pantas menggunakan mouse.

Thanatos
sumber
5
Saya menghargai waktu yang Anda gunakan untuk menuliskan jawaban Anda, tetapi entah bagaimana saya tidak merasa seperti saya memiliki pemahaman yang lebih besar tentang mengapa ini bukan fitur yang tersedia di emulator terminal. Anda menunjukkan ide baru kepada saya - bahwa emulator terminal adalah unik karena dapat menjalankan program lain - tetapi saya tidak mengerti mengapa hanya sebagian pilihan kombinasi tombol yang tidak mungkin tersedia bagi pengguna.
monguin
2
Terminal emulator meniru terminal fisik . Mereka tidak dibuat dari awal untuk menyediakan antarmuka baris perintah. Hal-hal seperti Control-C telah menetapkan makna jauh sebelum Microsoft memutuskan untuk memilihnya sebagai pintasan keyboard, dan emulator terminal harus mematuhinya.
chepner
2
Saya pikir iblis ada dalam perincian di sini. Bukan tidak mungkin: layar memiliki mode untuk melakukan apa yang Anda inginkan, saya pikir. Tetapi untuk mencapainya, Anda harus beralih ke mode "Saya ingin memilih sesuatu". gnome-terminalakan memiliki masalah serupa: mereka mungkin tidak mengimplementasikannya karena itu bukan sesuatu yang Anda lakukan. Ingatlah bahwa shell bukan satu-satunya program yang berjalan: program apa pun dapat berjalan, dan ia ingin menggunakan urutan kunci apa pun yang mungkin Anda gunakan untuk menyalin / menempel untuk tujuan itu sendiri. Layar memiliki cara untuk mengirim kunci yang ditimpa, dan gnome-terminal mencoba untuk tidak menginjak jari kaki.
Thanatos
1
Blok pilih adalah cara memilih persegi panjang: Tahan kontrol dan seret di terminal gnome, dan Anda harus segera melihat bagaimana itu berbeda. Kebanyakan emulator terminal GUI memiliki kemampuan ini, dan sebagian besar editor teks tingkat lanjut juga. (Lihat blok Visual dalam vim, misalnya.)
Thanatos
1
Ah, kalau begitu saya terbiasa dengan blok pilih, tetapi tidak tahu namanya. Saya juga tidak mengetahui cara pintas keyboard GUI untuk tindakan itu, jadi sepertinya tidak perlu untuk menciptakan satu demi menjawab pertanyaan saya. Saya menghargai komentar semua orang di sini, tetapi karena saya masih tidak puas, saya kira yang bisa saya lakukan sekarang adalah menggali sendiri sumbernya ...
monguin
1

Saya bukan ahli emulator terminal tapi ...

aplikasi seperti bash (readline) yang berjalan ke terminal emulator tidak tahu apa-apa tentang sistem X windows yang sedang berjalan dan jendela X yang ada di dalamnya, mereka tahu stdin dan stdout pada perangkat terminal (ttyS / ttyUSB / tty / pts di linux).

Masalahnya bukan menampilkan beberapa teks yang disorot tetapi bagaimana memberi tahu aplikasi X-window (emulator terminal) bahwa teks telah dipilih, melalui perangkat terminal ini.

Saya kira aplikasi terminal X membuka salah satu perangkat di input dan output dan kemudian menerjemahkan peristiwa kunci X untuk benar output (dari sisi X) input (dari sisi bash). Demikian pula sebaliknya aliran keluaran bash ke terminal X sebagai input , di sini terminal X memproses input ini untuk memindahkan kursor, mengisi backround dengan beberapa warna, sesuai dengan output aplikasi bash.

Untuk pengetahuan saya kode pelarian dapat digunakan untuk mengontrol perilaku khusus, seperti menghapus, mengisi latar belakang, memindahkan kursor, dan mungkin beberapa kode pelarian khusus dapat ditambahkan untuk memberi tahu terminal X bahwa teks dari baris, col ke baris, col telah dipilih, hanya sebuah contoh, mungkin sebagai gantinya teks yang dipilih hanya dapat dikembalikan (detail implementasi).

Saya kira tidak menjadi definisi standar Anda harus menambal setiap aplikasi yang Anda ingin mendukungnya untuk mengetahui tentang kombinasi tombol yang telah ditekan dan menampilkan kode escape yang sesuai, readline jika Anda menginginkannya di bash, emulator terminal X aktif sisi lain untuk memproses dengan benar kode pelarian (dan akhirnya mengirim informasi ke clipboard). Mungkin mengimplementasikan ini sebagai kemampuan terminal akan menyelamatkan Anda dari menambal setiap aplikasi. Saya harap (dan tebak) driver perangkat terminal di kernel ingin tahu sesedikit mungkin tentang kode melarikan diri, jadi jika Anda beruntung patch tidak diperlukan.

Terminal X menggambar output, sehingga dengan mudah tahu, ketika Anda menggunakan mouse, teks / karakter apa yang Anda pilih.

Widget teks grafis mengetahui segala hal tentang jendela X-nya sehingga mengapa sangat mudah untuk menerapkan pilih & salin.

EDIT

Di sini tambalan urxvt-9.16-image-display ini bisa menjadi titik awal yang baik untuk memahami apa yang diperlukan untuk mendukung kode pelarian baru. http://lists.schmorp.de/pipermail/rxvt-unicode/2013q1/001736.html

Alex
sumber
1

Jawaban yang diberikan adalah penjelasan yang baik mengapa hal ini sulit dilakukan. Ini adalah sesuatu yang dapat Anda lakukan di gnome-terminal untuk mengatur ctrl-cdan ctrl-vmenyalin dan menempel, sembari memutar kunci lain dalam disiplin terminal dengan sttymengirim SIGINTdan menyisipkan karakter kata demi kata. Ini bukan solusi lengkap karena beberapa program menonaktifkan disiplin terminal, dan Anda tidak akan dapat mengirimnya '^ C' dan '^ V'. Info lebih lanjut di sini .

Dalam skrip startup shell Anda (mis ~/.bashrc. ~/.zshrc, ~/.rcrc), Lakukan

stty intr '^Q' 2>/dev/null  # To send SIGINT I will use ctrl-q
stty lnext '^A' 2>/dev/null # To insert a character verbatim I will use ctrl-a

Kemudian di gnome-terminal Edit> Preferences> Shortcuts Anda dapat mengikat Copy dan Paste ke ctrl-c dan ctrl-v. Perhatikan bahwa terminal akan mendapatkan peristiwa penting sebelum sesuatu dikirim ke perangkat terminal, jadi sejak saat itu Anda tidak dapat mengirim '^ C' dan '^ V' ke proses apa pun yang berjalan di terminal.

Saya hanya melakukan ini dan saya akan melihat bagaimana kelanjutannya, dan masalah apa yang menyebabkannya. Saya melakukan stty secara kondisional untuk menerapkannya hanya ketika saya menjalankan X.

spelufo
sumber
1
Terima kasih atas tanggapannya. Sementara itu saya sudah terbiasa dengan binding OSX dan Emacs, dan juga menyerah pada mimpi ctrl + shift + panah di terminal ...
monguin
1

Seperti yang disebutkan Thanatos, ada perbedaan yang harus dibuat antara emulator terminal (berjalan di X Windows atau Wayland) dan program yang berjalan di dalam terminal (sebut saja "shell", meskipun mungkin tidak); dua hal ini terisolasi satu sama lain (lihat detail teknis ).

Item pertama dalam daftar Anda (tombol panah, Rumah / Akhir, dll.) Ditangani langsung oleh program di dalam terminal, sehingga posisi kursor dikendalikan oleh program di dalam terminal.

Cara pintas salin dan tempel (Ctrl + Shift + C dan Ctrl + Shift + V), di sisi lain, ditangani oleh terminal emulator, yang memahami mouse (sehingga Anda dapat memilih teks dengan mouse), ia tahu apa itu pada layar (sehingga dapat menyalin), dan dapat mengirim penekanan tombol ke program di dalamnya (sehingga dapat menempel).

Untuk mendukung Shift + Kiri dan Shift + Kanan, baik emulator terminal atau shell harus menangani keystroke. Bagaimanapun kita memiliki masalah:

  1. Shell tidak dapat dengan mudah menangani tombol-tombol ini karena pada akhirnya Anda akan ingin menyalin teks yang dipilih ke clipboard, dan clipboard adalah konsep X Windows yang shell tidak harus memiliki akses ke (tetapi lihat xclip). Dan sejauh yang saya tahu, jika shell mendukung pemilihan teks, Linux tidak mendefinisikan mekanisme apa pun untuk memberi tahu emulator terminal tentang apa yang dipilih.
  2. Sementara itu, terminal emulator tidak bertanggung jawab atas lokasi kursor. Bahkan jika terminal emulator dapat mengubah lokasi kursor, itu mungkin tidak tahu di mana baris teks saat ini mulai dan berakhir. Misalnya, terminal mungkin berisi teks seperti ~ $ ls -ldan emulator terminal tidak menyadari bahwa hanya ls -lbagian yang menjadi milik pengguna.

Tidak sulit membayangkan emulator terminal yang mendukung seleksi dengan Shift + Arrows, tapi saya kira itu harus menyembunyikan kursor shell dan memperkenalkan "kursor palsu" sendiri yang ada sementara untuk membantu Anda memilih sesuatu, dan kemudian Anda dapat menekan Ctrl + C / Ctrl + Shift + C / Ctrl + Ins untuk menyalin (atau Esc untuk membatalkan) dan menunjukkan kursor nyata sekali lagi. Ini tidak akan memiliki semua kemampuan pilihan normal - tentu saja memotong dan menghapus tidak akan ada.

Qwertie
sumber
Terima kasih, saya akan membaca artikel TTY itu, tetapi belum. Itu mungkin menjelaskan kesenjangan dalam pemahaman saya tentang perbedaan antara "terminal emulator" dan "aplikasi desktop yang menangani program teks". Contoh saya sebelumnya, konsol Matlab, berperilaku persis seperti yang saya inginkan. Saya tidak mengerti mengapa tidak ada aplikasi desktop dengan perilaku itu, di mana program teks yang berjalan di dalamnya adalah sesuatu selain Matlab. Katakanlah saya hanya ingin menggunakan perintah shell yang paling mendasar - ls, cd, cp, mv - maka saya tidak melihat adanya konflik. Program seperti layar atau tmux, saya mengerti mungkin membuat segalanya lebih rumit.
monguin
1

Ini adalah binding keyboard CUA yang Anda uraikan, standar dari IBM pada pertengahan 80-an:

https://en.wikipedia.org/wiki/IBM_Common_User_Access

Mereka biasanya diterapkan di semua lingkungan desktop yang dibuat sejak itu. DOS, Windows, Motif, bahkan alat-alat Netware semuanya memenuhi standar ini. Satu pengecualian adalah Mac, yang menggunakan set yang sangat mirip tetapi berbeda (Cmd, bukan Ctrl) dari periode waktu yang sama.

Terminal Unix jauh sebelum standar ini dan kebanyakan mengabaikannya. Juga, jika mereka benar-benar menerapkan ikatan kunci ini, itu mungkin mengganggu program TUI yang sudah menggunakannya untuk fungsionalitas lain. Jadi sementara secara teknis bisa dilakukan, bermasalah juga.

Aplikasi:

The microeditor teks adalah yang terbaik yang pernah kulihat di meniru editor teks GUI, mirip dengan DOS  edittetapi dengan fitur yang lebih modern Teks Sublime la. neadalah yang lebih lama di repo Debian, dan bahkan nanodapat dikonfigurasi dengan keybindings yang waras. Tapi terminal telanjang / kulitnya, tidak.

Dengan libvteitu mungkin mudah untuk membangun terminal virtual yang belum sempurna yang menangani sendiri keybindings ini. Namun, banyak pekerjaan untuk keuntungan kecil.

Gringo Suave
sumber
0

Saya hanya membantu seorang teman melalui masalah yang serupa dengan ini dan menemukan bahwa clipit manager clipit adalah biang keladinya.

sudo apt-get remove clipit

bisa mendapatkan semuanya kembali dan berjalan baik untuknya. Semoga itu bisa membantu orang lain di luar sana.

Mandela Terkena
sumber
Apakah Anda menjawab pertanyaan yang salah? Ini adalah pertanyaan umum tentang kemampuan semua emulator terminal. Cukup jelas tidak ada "solusi". Saya tidak sekarang, saya juga belum pernah menginstal clipit pada mesin apa pun.
monguin