Как включить сочетания клавиш Ctrl+Alt+Shift+... в MX Linux?

Это безопасно в том смысле, что здесь вы намерены передать формат в качестве аргумента.Но вы должны помнить при использовании функции, что это формат. Так что, возможно, вы должны назвать свою функцию errorfв качестве напоминания.

Если вы использовали его как:

error "invalid arg: $arg"

Вы вызовете проблемы, например, для значений $arg, таких как%99999999s

В идеале вы хотели бы указать shellcheck игнорировать использованиеprintfи , чтобы он помечал использование вашего printf, где первый аргумент содержит переменные.

Пара замечаний:

  • поскольку вы вызываете printfдважды, это будет как минимум 2 write()системных вызова. Маловероятно, что это имеет какое-либо значение, и обратите внимание, что некоторые реализации printf, такие как bash, также будут выполнять несколько системных вызовов при некоторых обстоятельствах. Тип проблемы , о которой я думаю, состоит в том, что две части сообщения об ошибке переплетаются с выводом другой команды, работающей параллельно.
  • В error "%s\n" error1 error2префикс будет выведен только для первой ошибки. Это нормально, если вы хотите это сделать. Вы также можете сделать:

    errorf() { printf "utility: ERROR: $@" >&2; }
    

    чтобы префикс был добавлен перед форматом, чтобы он выводился каждый раз, когда формат повторно используется (, что также решит множественную проблемуwrite()).

    Однако это не сработает, если вы хотите, чтобы utilityбыла переменной.

    PROG_NAME=${0##*/}
    errorf() { printf >&2 "$PROG_NAME: ERROR: $@"; }
    
    не подходит, так как это приведет к ошибке, если $0содержит %или \.

    и

    PROG_NAME=${0##*/}
    errorf() {
    format=$1; shift
    printf >&2 "%s: ERROR: $format" "$PROG_NAME" "$@"
    }
    не будут работать в тех случаях, когда формат используется повторно (и будет означать, что пользователю нужно будет сместить на одну директиву %<n>$d(, но я бы не рекомендовал использовать их, поскольку они не являются портативными )).

    Я не могу придумать какой-либо простой обходной путь, кроме как экранировать \и %вручную в $PROG_NAME, и даже это непросто, как во многих реализациях printf, вам также понадобится чтобы избежать 0x5cбайтов, найденных в других символах, кроме\(для таких кодировок, как BIG5 или GB18030, которые имеют некоторые ).

1
16.09.2020, 22:51
1 ответ

Я понял это. Проблема заключалась в том, что сочетание клавиш Alt+Shift распознавалось как специальная клавиша Next Group, которая использовалась для переключения раскладки клавиатуры. Я не уверен, как изменить ярлык для переключения раскладки, но мне удалось найти способ просто удалить его.

Откройте /etc/default/keyboardв текстовом редакторе и удалите grp:alt_shift_toggleиз XKBOPTIONS. В моем случае мне пришлось изменить эту строку:

XKBOPTIONS="grp:alt_shift_toggle,grp_led:scroll,terminate:ctrl_alt_bksp"
с

по

XKBOPTIONS="grp_led:scroll,terminate:ctrl_alt_bksp"

Тогда просто перезагрузитесь (Я уверен, что есть и другой способ, но перезагрузиться было проще всего ). Теперь Alt+Shift не будет распознаваться как Next Group.

2
18.03.2021, 23:04

Теги

Похожие вопросы