/usr/share/X11/xkb/rules/evdev
содержит спецификацию правил . Правила сообщают XKB, как создавать раскладки из частей, они не определяют конкретную раскладку. Ввод xkbcomp
должен быть раскладкой .
Самый простой способ выяснить, каким должен быть ввод, — это прочитать справочную страницу(ха-ха нет )читать официальную документацию(как будто )прочитать вводящее в заблуждение руководство Unreliable guide (, которое настолько хорошо, что на него есть ссылка на полу -официальную вики X.org , но хотя оно содержит информацию на самом деле не указано, что это ввод дляxkbcomp
)эээ, спросить в интернете? О, ты только что сделал это.
Что ж, xkbcomp
работает в обе стороны. Поэтому, если вы просто попросите его декомпилировать раскладку клавиатуры с вашего дисплея, вы увидите приемлемый ввод.
xkbcomp :0 - | less
Синтаксис::
xkb_keymap {
xkb_keycodes { … };
xkb_types { … };
xkb_compat { … };
xkb_symbols { … };
xkb_geometry { … };
}
Содержимое фигурных скобок после xkb_xxx
— это то, что входит в файлы в каталогах /usr/share/X11/xkb/xxx
. Вы можете использовать оператор include
, чтобы указать xkbcomp
читать существующие файлы. Обратите внимание, что вам нужна одна директива include
с +
между именами файлов. Некоторые файлы содержат несколько директив xkb_xxx
, передайте имя нужной в скобках. Например, чтобы использовать раскладку США с Compose
в меню ,использовать
xkb_symbols { include "us+compose(menu)" }
Вы можете попроситьsetxkbmap
предоставить приемлемый ввод для xkbcomp
. Передайте параметр -print
, чтобы увидеть вывод, а не передавать раскладку на сервер. С помощью setxkbmap
передайте -compat
, -geometry
, -keycodes
и -types
, чтобы установить соответствующие xkb_xxx
и -layout
для xkb_symbols
.
setxkbmap -layout "us+compose(menu)" -print
На самом деле, я соврал по умолчанию выше, есть более простой способ :информация находится на Arch wiki . Если вам нравится понимать, как настроить вашу систему, Arch wiki — отличный ресурс, независимо от того, используете вы Arch Linux или нет.
Вот почему в awk существует режим абзаца. Это будет работать с использованием любого awk в любой оболочке на каждом компьютере UNIX :
.$ awk -v RS= -F'\n' -v OFS='\t' '{$1=$1}1' file
Table $0.10 100 1 10
Chair $0.12 N/A 7 5
Desktop $0.08 86 7 3
Door $0.00 N/A 7 3
Nails $0.10 N/A 7 5
Sofa $0.07 100 7 3
Stool $1.00 0 7 5
Natural wood $0.00 99 7 20
Carpet $0.10 100 7 3
Все вышеперечисленное является идиоматическим awk, вот что это значит:
RS=<null>
сообщает awk, что ваш ввод представляет собой набор записей, разделенных пустыми строками (, то есть абзацами ). -F'\n'
сообщает awk, что поля ввода разделены новой строкой (, что эквивалентно-v FS='\n'
). OFS='\t'
сообщает awk, что поля вывода должны быть разделены табуляцией -. $1=$1
указывает awk перекомпилировать текущую запись, заменяя каждую FS (новую строку )на OFS (вкладку )между полями. 1
является истинным условием, которое вызывает действие awks по умолчанию для печати текущей записи. Можно сделать с NR (количество записей ), но необходимо удалить пустые строки.
sed '/^$/d' filename | awk '{ORS=(NR%5?FS:RS)}1'
Я нашел решение благодаря рекомендации steeldriver:
sed -E ':a;N;/\n[A-Za-z][^/]/!s/\n/\t/;ta;P;D'
Table $0.10 100 1 10
Chair $0.12 N/A 7 5
Desktop $0.08 86 7 3
Door $0.00 N/A 7 3
Nails $0.10 N/A 7 5
Sofa $0.07 100 7 3
Stool $1.00 0 7 5
Natural wood $0.00 99 7 20
Carpet $0.10 100 7 3