Descobri que a causa desse comportamento está documentada indiretamente em man keyboard
:
DESCRIPTION
The keyboard file describes the properties of the keyboard. It is read by setupcon(1) in order to configure the keyboard on the console. In Debian systems the default keyboard layout is described in /etc/default/keyboard and it is shared between X and the console.
O conteúdo de /etc/default/keyboard
é gerado na instalação do sistema e deu uma dica para o problema real (adicionei a opção ctrl:nocaps
mais tarde):
XKBMODEL="pc105"
XKBLAYOUT="se"
XKBVARIANT=""
XKBOPTIONS="ctrl:nocaps"
O conjunto acima indica que X irá definir as opções do xkb em algum momento durante a inicialização (provavelmente após .xsession
e similares), o que faz com que qualquer xmodmap
configurações definidas durante .xsession
sejam perdidas.
Portanto, há a causa, a solução é sugerida em man setupcon
:
The keyboard configuration is specified in ~/.keyboard or /etc/default/keyboard. The font configuration is specified in ~/.console-setup or /etc/default/console-setup.
Verificando man console-setup
yields:
The file console-setup specifies the encoding and the font to be used by setupcon(1) in order to setup the console. It can be used also to specify the keyboard layout but it is not recommended to do so, use keyboard(5) instead.
Portanto, /etc/default/keyboard
é usado para definir as configurações de teclado para TTY e X. Embora /etc/default/console-setup
seja usado para configurar o teclado (não é realmente recomendado, mas funciona) e fonte somente para console.
Para que tudo isso funcione, movi /etc/default/keyboard
para /etc/default/console-setup
e adicionei o seguinte ao meu .xsession
:
#!/bin/bash
# The below assumes bash features, rewrite if you use other shells.
source /etc/default/console-setup
XKBPARMS=""
if [[ "$XKBLAYOUT" ]]; then
XKBPARMS="-layout $XKBLAYOUT"
fi
if [[ "$XKBMODEL" ]]; then
XKBPARMS+=" -model $XKBMODEL"
fi
if [[ "$XKBVARIANT" ]]; then
XKBPARMS+=" -variant $XKBVARIANT"
fi
if [[ "$XKBOPTIONS" ]]; then
XKBPARMS+=" -option $XKBOPTIONS"
fi
if [[ "$XKBPARMS" ]]; then
setxkbmap $XKBPARMS
fi
xmodmap ~/.Xmodmap
Agora, xmodmap
funciona corretamente e eu tenho o mapa de teclado e as opções corretas no TTY e no X.