Tôi có thể định cấu hình bash / readline để tự động chuyển đổi NBSP sang không gian bình thường không?


10

Tôi đang sử dụng bố trí bàn phím Phần Lan để ánh xạ AltGr+ Spacevào không gian không phá vỡ (NBSP, U + 00A0). Tôi rất hài lòng với điều này nói chung nhưng tôi thấy rằng tôi thường vô tình viết NBSP thay vì không gian bình thường sau |biểu tượng "" (được viết bằng AltGr+ <với bố cục bàn phím Phần Lan) trong khi sử dụng dòng lệnh bash. Tôi đoán điều này là do thực tế là tôi cần phải giữ AltGrtrong khi gõ ống và nhả nó trước khi chạm vào không gian. Và khi tôi có thời điểm xấu để phát hành, AltGrtôi kết thúc bằng lỗi đánh máy vô hình trên dòng lệnh và các thông báo lỗi như

 grep: command not found

trông khá giống với

grep: command not found

Điều này làm cho vấn đề này hơi khó để nhận thấy lần đầu tiên.

Tôi biết rằng tôi có thể vô hiệu hóa NBSP nhưng tôi chỉ muốn vô hiệu hóa nó (có AltGr+ Spaceđể tạo không gian thông thường) chỉ sau ký tự ống hoặc nếu không thể, luôn luôn ở dòng lệnh hoặc readlinemức bash . Có cách nào đơn giản để làm điều này mà không cần sửa đổi mã nguồn của bash, readlinehoặc trình giả lập thiết bị đầu cuối của tôi ( gnome-terminal) không?

Một giải pháp tốt khác là cấu hình NBSP bằng cách nào đó hiển thị trên dòng lệnh, ví dụ: được thay thế bằng một ký tự khác (giả sử U + 2423 ) chỉ để hiển thị.


@datcher không cần tiền thưởng, thật đấy. Tôi chỉ nhấn vào vấn đề và viết một câu hỏi về nó. Sau đó tôi tìm thấy cấu hình đủ gần thông qua Google Tìm kiếm để tìm ra câu trả lời dưới đây. Tôi vẫn đang tìm kiếm một câu trả lời để hiển thị NBSP thay vì vô hiệu hóa ký tự cho tất cả các trường hợp. Tôi nghĩ rằng tôi muốn có NBSP hiển thị ở cấp độ đọc để tất cả đầu ra của thiết bị đầu cuối không bị rối nếu tôi có NBSP trong chuỗi dữ liệu.
Mikko Rantalainen

@MikkoRantalainen bạn có thể giải thích những gì bạn vẫn còn thiếu rõ ràng hơn không? Vì bạn đã tìm thấy cách lập bản đồ các ký tự, tại sao không " ":␣đủ? Bạn cần gì nữa?
terdon

@dPlay Tôi rất thích có một tính năng nơi tôi có thể viết NBSP trên dòng lệnh và nhận echo a␣bnhưng dòng đầu ra kết quả là echo a bvới NBSP thực trong đầu ra. Như vậy, tôi nghĩ rằng nó phải được thực hiện ở cấp độ đọc (nghĩa là trình soạn thảo dòng lệnh luôn hiển thị ký tự hiển thị nhưng trình giả lập thiết bị đầu cuối không thể biết sự khác biệt giữa hiển thị trình soạn thảo và hiển thị đầu ra và do đó trình giả lập thiết bị đầu cuối không thể thay thế trực quan cho kết xuất ).
Mikko Rantalainen

1
Giải quyết nó ở cấp độ đọc thực sự tốt, nhưng bạn có thể gặp vấn đề tương tự trong khi viết tập lệnh shell trong vim / emacs / etc trong thiết bị đầu cuối. Xem bugzilla.gnome.org/show_orms.cgi?id=788673 để biết bằng chứng hoạt động của bản vá khái niệm cho gnome-terminal để làm nổi bật các kết hợp chuỗi, bao gồm cả ký tự NBSP duy nhất. (Vâng, tôi biết bạn nói rằng bạn không muốn sửa đổi bất kỳ mã nguồn nào)
egmont

1
Một cách tiếp cận khác là giải quyết nó ở cấp độ phông chữ, thông qua một phông chữ đặc biệt trong đó glyph của NBSP không trống, cùng với một số cấu hình fontconfig. Điều này cũng sẽ làm việc cho các biên tập viên đồ họa, không chỉ thiết bị đầu cuối. Tuy nhiên, một cách tiếp cận khác là sửa đổi bố cục bàn phím để phát ra không gian thông thường và sử dụng một số phương pháp khác để nhập NBSP trong trường hợp hiếm hoi khi đó là những gì bạn cần.
egmont

Câu trả lời:


9

Điều này có thể được thực hiện ở readlinecấp độ hai cách khác nhau.

Phương pháp 1

Đặt phần sau vào .inputrc(tệp cấu hình cho 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)
" ":" "

Nếu markdown làm rối tung những điều trên, bạn phải đặt NBSP trong dấu ngoặc kép ở bên trái dấu hai chấm như được giải thích trong bình luận. Điều này sẽ ánh xạ bất kỳ sự xuất hiện của NBSP trên luồng đầu vào với một không gian thông thường.

Cách 2

Đặt sau .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

Ý tưởng là ánh xạ chuỗi khóa {pipe theo sau là NBSP} thành {pipe theo sau là dấu cách}. Điều này hoạt động nếu bạn nhập chuỗi trong vòng 250 ms (có thể định cấu hình ở trên). Tuy nhiên, cho đến khi hết thời gian, chỉ cần gõ biểu tượng ống sẽ không xuất ra bất cứ thứ gì. Và nếu bạn gõ chuỗi quá chậm, sửa chữa sẽ không được áp dụng. Cũng lưu ý rằng thời gian chờ là toàn cầu, vì vậy nếu bạn có ý định sử dụng bất kỳ trình tự nào khác, bạn phải đặt thời gian chờ đủ lâu để có thể nhập trình tự dài nhất. (Thư viện readline không đủ thông minh để cho phép nhập các ký tự và sau đó thay thế các ký tự đã hiển thị sau khi chuỗi ký tự khớp với cấu hình.)


0

Có một bài viết xuất sắc đề cập đến vấn đề này:

Tôi đã cố gắng giải quyết mối quan tâm chính với grepcác thông báo lỗi và thay đổi NBSP thành một cái gì đó rõ ràng hơn bằng cách sử dụng execlệnh. Tôi chưa có cú pháp xuống vỗ dù:

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

Ý tưởng là để có lệnh này ~/.bashrcđể nó tự động tải khi gnome-terminalmở. Nhưng như tôi đã nói nó chưa hoạt động ...


1
Điều đó sẽ chỉ đối phó với các thông báo lỗi. Tôi muốn bắt gặp sự cố trong khi tôi đang chỉnh sửa dòng lệnh vì tôi có thể đang viết một cái gì đó giống như perl -i -npe 's/MARKER/4 KB/'và tôi vô tình trượt một NBSP giữa 4K. Rất tiếc, sự cố được lưu trữ trong một tệp nhưng tôi không gặp phải bất kỳ lỗi nào và dòng lệnh tôi đã viết trông hoàn hảo.
Mikko Rantalainen
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.