bc
может или распечатать результаты как длинных целых или как десятичные числа. Вот сценарий, который присоединяется к длинным целым, разделенным на несколько строк вместе, и удаляет конечные нули после десятичных точек в десятичных числах.
calc () {
emulate -L zsh; setopt extended_glob
local line
bc <<EOF |
scale=3
$@
EOF
while read line; do
if [[ $line = *.* ]]; then
print -r -- ${${${line%%0##}/#%0#./0}%.}
else
print -r -- $line
fi
done
}
Путем это записано, больше упражнения в текстовом управлении с заменами параметра, чем действительно ясный способ довольно печатающих десятичных чисел.
${…%%0##}
удаляет самое долгое суффиксное соответствие 0##
, т.е. конечные нули.${…/#%0#./0}
устанавливает строку на 0
если это состоит только (#%
префикс к шаблону в ${VAR/PATTERN/REPLACEMENT}
) из дополнительного продвижения обнуляет (0#
) и .
${…%.}
снимает изоляцию с запаздывания .
если таковые имеются.Я думаю, разделяя шаги, более ясно.
if [[ $line = *.* ]]; then line=${line%%0##}; fi
if [[ $line = . ]]; then line=0; else line=${line%.}
print -r -- $line
I ' Я лучше отвечу на свой вопрос для дальнейшего использования.
После небольшого углубленного исследования я обнаружил, что xmodmap
на самом деле устарел и в основном исправлен для клавиатуры xkb
модель.Модель xkb
не использует линейный массив альтернатив, но разбивает макеты на группы
, причем каждая группа имеет пару символов с разными уровнями сдвига. Определения xmodmap
заполняют записи в очень забавном порядке: группа 1, уровень 1,2, группа 2, уровень 1,2, группа 1, уровни 3 .... "макеты" и обычно не доступны с модификаторами, а с переключением. Исключением является символ Mode_switch
, который я использовал, но он обращается только к группе 2.
Все было бы хорошо, за исключением того, что ключи имеют типы . Каждый ключ определяется макетом как TWO_LEVEL
, FOUR_LEVEL
, FOUR_LEVEL_ALPHANUMERIC
и т. Д., И каждый уровень может иметь различное представление о том, какие модификаторы соответствуют каким уровням. . Я предполагал, что поведение (8 уровней, все комбинации) было на самом деле LOCAL_EIGHT_LEVEL
, которое вообще не использовалось макетом. Таким образом, в случае кода клавиши 51
, значение по умолчанию было фактически TWO_LEVEL
, и xmodmap
заполнил 3 группы 6 клавишами вместо добавления 6 уровней к 1-й группе. В 3-ю группу не попал модификатор Mode_switch
. Использование другого ключа привело к другому поведению, поскольку предопределенный тип отличался.
Как и в случае с повторениями в распечатке xmodmap
, я не совсем уверен, что происходит (я распечатал определения xkb
, и все было в порядке), но я не удивлен тем, что ошибки возникают при отображении многомерного массива переменной длины в один список симкодов. Выходные данные в любом случае не отражают фактическое состояние.
В заключение, xmodmap - это зло . Никогда не используйте это. Его поведение в лучшем случае неустойчиво и неопределенно. Он не делает того, что говорит. Создавайте свои собственные карты xkb
. Повторно используйте большую часть макета , включая
-ing и добавьте необходимые изменения.
В моем случае решение состоит в том, чтобы вывести вторую группу из греческой схемы и заменить математические символы в стратегических местах, а также внести некоторые изменения в первую группу.
Большинство дешевых клавиатур очень ограничены, когда дело доходит до нажатия трех клавиш за раз. Это привело к неустойчивым и аппаратно-зависимым сбоям некоторых ключей. Я поэкспериментирую с различными клавишами-модификаторами (самая бесполезная клавиша в мире - клавиша меню или аналогичная бесполезная правая клавиша win) и, возможно, куплю клавиатуру получше. Комбинация обеих проблем (аппаратное обеспечение с нарушенной конструкцией + вредоносное программное обеспечение, вводящее в заблуждение) создала запутанную случайную ситуацию, которая сначала помешала мне рассматривать их как отдельные проблемы.
Материалы для чтения: