Bisakah saya mengkonfigurasi bash / readline untuk secara otomatis mengkonversi NBSP ke ruang normal?


10

Saya menggunakan tata letak keyboard Finlandia yang memetakan AltGr+ Spaceke ruang non-breaking (NBSP, U + 00A0). Saya senang dengan ini secara umum, tetapi saya menemukan bahwa saya sering secara tidak sengaja menulis NBSP daripada ruang normal setelah |simbol " " pipa (ditulis dengan AltGr+ <dengan tata letak keyboard Finlandia) saat menggunakan baris perintah bash. Saya kira ini disebabkan oleh fakta bahwa saya perlu memegang AltGrsambil mengetik pipa dan melepaskannya sebelum mengenai ruang. Dan ketika saya memiliki waktu yang tidak tepat untuk rilis AltGrsaya berakhir dengan salah ketik pada baris perintah dan pesan kesalahan seperti

 grep: command not found

yang terlihat sangat mirip

grep: command not found

yang membuat masalah ini agak sulit untuk diperhatikan pada pertama kalinya.

Saya tahu bahwa saya dapat menonaktifkan NBSP tapi saya lebih suka menonaktifkannya (harus AltGr+ Spaceuntuk menghasilkan ruang biasa) hanya setelah karakter pipa, atau jika itu tidak mungkin, selalu di baris atau readlinelevel perintah bash . Apakah ada cara sederhana untuk melakukan ini tanpa memodifikasi kode sumber bash, readlineatau emulator terminal saya ( gnome-terminal)?

Solusi lain yang baik adalah mengkonfigurasi NBSP agar terlihat pada baris perintah, misalnya diganti dengan karakter lain (katakanlah U + 2423 ) untuk rendering saja.


@Dabut tidak perlu hadiah, sungguh. Saya baru saja menemukan masalah dan menulis pertanyaan tentang itu. Kemudian saya menemukan konfigurasi yang cukup dekat melalui Pencarian Google untuk mencari tahu jawabannya di bawah ini. Saya masih mencari jawaban untuk membuat NBSP terlihat daripada menonaktifkan karakter untuk semua kasus. Saya pikir saya ingin memiliki NBSP yang terlihat pada tingkat readline sehingga semua output terminal tidak kacau jika saya memiliki NBSP dalam string data.
Mikko Rantalainen

@MikkoRantalainen dapatkah Anda menjelaskan apa yang masih Anda lewatkan dengan lebih jelas? Karena Anda menemukan cara untuk memetakan karakter, mengapa tidak " ":␣cukup? Apa lagi yang kamu butuhkan?
terdon

#: 33811 ddq Saya ingin memiliki fitur di mana saya bisa menulis NBSP pada command line dan dapatkan echo a␣btetapi output line dihasilkan echo a bdengan NBSP nyata di output. Karena itu, saya pikir itu harus dilakukan pada tingkat readline (yaitu, editor baris perintah selalu menampilkan karakter yang terlihat tetapi terminal emulator tidak dapat mengetahui perbedaan antara tampilan editor dan tampilan keluaran dan oleh karena itu terminal emulator tidak dapat melakukan penggantian visual untuk rendering ).
Mikko Rantalainen

1
Memecahkannya di tingkat readline memang bagus, tetapi Anda mungkin mengalami masalah yang sama saat menulis skrip shell di vim / emacs / etc di terminal. Lihat bugzilla.gnome.org/show_bug.cgi?id=788673 untuk bukti kerja patch konsep untuk gnome-terminal untuk menyoroti kecocokan string, termasuk mungkin karakter NBSP tunggal. (Ya saya tahu Anda bilang tidak ingin mengubah kode sumber apa pun ...)
egmont

1
Pendekatan lain adalah mengatasinya pada tingkat font, melalui font khusus di mana mesin terbang NBSP tidak kosong, bersama dengan beberapa konfigurasi fontconfig. Ini juga akan berfungsi untuk editor grafis, bukan hanya terminal. Namun pendekatan lain adalah memodifikasi tata letak keyboard untuk memancarkan ruang biasa, dan menggunakan beberapa metode lain untuk memasukkan NBSP dalam kasus langka ketika itu yang Anda butuhkan.
egmont

Jawaban:


9

Ini bisa dilakukan pada readlinelevel dua cara berbeda.

Metode 1

Masukkan berikut ini .inputrc(file konfigurasi untuk readline):

# include default system config because ~/.inputrc overrides system config
$include /etc/inputrc
# map NBSP to regular space (left part has NBSP in quotes, right part has space)
" ":" "

Jika penurunan harga mengacaukan hal di atas, Anda harus memberi tanda kutip NBSP di sisi kiri titik dua seperti yang dijelaskan dalam komentar. Ini akan memetakan setiap kejadian NBSP pada aliran input dengan ruang reguler.

Metode 2

Masukkan sebagai berikut .inputrc:

# include default system config because ~/.inputrc overrides system config
$include /etc/inputrc
# map "pipe + NBSP" to "pipe + regular space" (left part has NBSP in quotes)
"| ":"| "
set keyseq-timeout 250

Idenya adalah untuk memetakan urutan kunci {pipe diikuti oleh NBSP} ke {pipe diikuti oleh space}. Ini berfungsi jika Anda mengetik urutan dalam 250 ms (dapat dikonfigurasi di atas). Namun, hingga batas waktu habis, mengetik simbol pipa saja tidak akan menghasilkan apa-apa. Dan jika Anda mengetik urutan terlalu lambat, perbaikannya tidak akan diterapkan. Perhatikan juga bahwa batas waktu bersifat global sehingga jika Anda bermaksud menggunakan urutan lain, Anda harus menetapkan batas waktu cukup lama untuk dapat mengetik urutan terpanjang. (Perpustakaan readline tidak cukup pintar untuk memungkinkan pengetikan karakter dan kemudian mengganti karakter yang sudah terlihat setelah urutan karakter cocok dengan konfigurasi.)


0

Ada artikel bagus yang membahas masalah ini:

Saya telah berusaha untuk mengatasi masalah utama dengan greppesan kesalahan dan mengubah NBSP menjadi sesuatu yang lebih terlihat menggunakan execperintah. Saya belum menerima sintaks tepuk bawah:

exec 2> >(tr $'\xa0' $'\x43' >&2) 

Idenya adalah untuk memiliki perintah ini ~/.bashrcsehingga secara otomatis dimuat dengan gnome-terminalpembukaan. Tapi seperti yang saya katakan itu belum berfungsi ...


1
Itu hanya akan berurusan dengan pesan kesalahan. Saya lebih suka untuk menangkap masalah ketika saya sedang mengedit baris perintah karena saya mungkin menulis sesuatu seperti perl -i -npe 's/MARKER/4 KB/'dan saya tidak sengaja memasukkan NBSP antara 4dan K. Ups, masalahnya disimpan ke dalam file tetapi saya tidak mendapatkan kesalahan dan baris perintah yang saya tulis terlihat sempurna.
Mikko Rantalainen
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.