4,494
edits
m (Fixed mistyped 0) |
m (Text replacement - "<source" to "<syntaxhighlight") |
||
Line 1: | Line 1: | ||
:''This article is specific for Linux. For Hardware and other platforms, see [[Typing glyphs]].'' | :''This article is specific for Linux. For Hardware and other platforms, see [[Typing glyphs]].'' | ||
Since mid-2012, most Linux distributions with [[wikipedia:X_Window_System|X11]] and [[wikipedia:Wayland_(display_server_protocol)|Wayland]] have [[Dyalog APL]] keyboard support included with the distribution,<ref>[[Dyalog]] [[Forums]]. [https://forums.dyalog.com/viewtopic.php?f=20&t=210 Keyboard setup on Linux]. Sep 21, 2010.</ref> using < | Since mid-2012, most Linux distributions with [[wikipedia:X_Window_System|X11]] and [[wikipedia:Wayland_(display_server_protocol)|Wayland]] have [[Dyalog APL]] keyboard support included with the distribution,<ref>[[Dyalog]] [[Forums]]. [https://forums.dyalog.com/viewtopic.php?f=20&t=210 Keyboard setup on Linux]. Sep 21, 2010.</ref> using <syntaxhighlight lang=console inline>xkb</source>, the [https://www.x.org/wiki/XKB/ X Keyboard Extension].<ref name="Dyalog APL XKB">[[Geoff Streeter]]. [https://www.dyalog.com/uploads/conference/dyalog10/presentations/P19_Streeter_Keyboards.pdf Supporting APL keyboards on Linux]. [[Dyalog '10]].</ref> | ||
== setxkbmap == | == setxkbmap == | ||
The simplest way to set up an APL keyboard on Linux is with the following < | The simplest way to set up an APL keyboard on Linux is with the following <syntaxhighlight lang=console inline>setxkbmap</source> command. Enter the following in your terminal emulator of choice: | ||
< | <syntaxhighlight lang=console> | ||
setxkbmap -layout us,apl -variant ,dyalog -option grp:switch | setxkbmap -layout us,apl -variant ,dyalog -option grp:switch | ||
</source> | </source> | ||
Line 13: | Line 13: | ||
An explanation: | An explanation: | ||
* < | * <syntaxhighlight lang=console inline>-layout us,apl</source> assigns <syntaxhighlight lang=console inline>us</source> ([[wikipedia:American_English|U.S. English]]) to be the primary layout, whereas <syntaxhighlight lang=console inline>apl</source> is secondary | ||
* < | * <syntaxhighlight lang=console inline>-option grp:switch</source> assigns <kbd>Right Alt</kbd> to switch to the secondary <syntaxhighlight lang=console inline>apl</source> layout when it is pressed, otherwise <syntaxhighlight lang=console inline>us</source> is used | ||
* < | * <syntaxhighlight lang=console inline>-variant ,dyalog</source> assigns the [[Dyalog APL]] variant to the <syntaxhighlight lang=console inline>apl</source> layout which contains modifiations unique to the Dyalog language ('''Note the preceding comma''') | ||
A full list of keys that can be used to switch layouts is included in < | A full list of keys that can be used to switch layouts is included in <syntaxhighlight lang=console inline>/usr/share/X11/xkb/rules/evdev.lst</source> under the <syntaxhighlight lang=console inline>option</source> category. | ||
Note: | Note: | ||
Line 25: | Line 25: | ||
* These changes are not permanent; the user will have to select one of a myriad of methods to run the command on startup. Alternatively, if they use one of the [[wikipedia:Desktop_environment|desktop environments]] listed below, they can follow those instructions. | * These changes are not permanent; the user will have to select one of a myriad of methods to run the command on startup. Alternatively, if they use one of the [[wikipedia:Desktop_environment|desktop environments]] listed below, they can follow those instructions. | ||
* If you want to specify a different language, say for United Kingdom, specify < | * If you want to specify a different language, say for United Kingdom, specify <syntaxhighlight lang=console inline>gb</source> instead of <syntaxhighlight lang=console inline>us</source> (not <syntaxhighlight lang=console inline>uk</source>) | ||
* If you want to specify a different layout, dvorak, bepo, etc, change the variant flag to < | * If you want to specify a different layout, dvorak, bepo, etc, change the variant flag to <syntaxhighlight lang=console inline>dvorak,dyalog</source>. | ||
== libinput == | == libinput == | ||
X11 and Wayland use XKB rules to determine their layout. To set a layout create a file called < | X11 and Wayland use XKB rules to determine their layout. To set a layout create a file called <syntaxhighlight lang=console inline>00-keyboard.conf</source> at <syntaxhighlight lang=console inline>/etc/X11/xorg.conf.d</source> or <syntaxhighlight lang=console inline>/usr/etc/X11/corg.conf.d</source>, ensuring you have permissions, and edit it to: | ||
< | <syntaxhighlight lang=console> | ||
Section "InputClass" | Section "InputClass" | ||
Identifier "system-keyboard" | Identifier "system-keyboard" | ||
Line 45: | Line 45: | ||
The options "us,apl", ",dyalog", and "grp:switch" are the same as in [[#setxkbmap|setxkbmap]] and can be changed to better suit your environment. | The options "us,apl", ",dyalog", and "grp:switch" are the same as in [[#setxkbmap|setxkbmap]] and can be changed to better suit your environment. | ||
Once saved this will affect any future session. To change the current session and test out layouts, use < | Once saved this will affect any future session. To change the current session and test out layouts, use <syntaxhighlight lang=console inline>setxkbmap</source>. | ||
== GNOME == | == GNOME == | ||
Line 59: | Line 59: | ||
# Navigate to <code>~/.config/autostart</code> and create a <code>.desktop</code> with any name that will help you remember its function. | # Navigate to <code>~/.config/autostart</code> and create a <code>.desktop</code> with any name that will help you remember its function. | ||
# Add the following to the contents of your file, customizing to suit your needs:< | # Add the following to the contents of your file, customizing to suit your needs:<syntaxhighlight lang=ini> | ||
[Desktop Entry] | [Desktop Entry] | ||
Type=Application | Type=Application | ||
Line 74: | Line 74: | ||
== LXDE == | == LXDE == | ||
# Prepend an < | # Prepend an <syntaxhighlight lang=console inline>@</source> to the <syntaxhighlight lang=console inline>setxkbmap</source> command from above:<br><syntaxhighlight lang=console> | ||
@setxkbmap -layout us,apl -variant ,dyalog -option grp:switch | @setxkbmap -layout us,apl -variant ,dyalog -option grp:switch | ||
</source> | </source> | ||
# Add it as a line in your user's LXDE < | # Add it as a line in your user's LXDE <syntaxhighlight lang=console inline>autostart</source> file, located at:<br><syntaxhighlight lang=console> | ||
~/.config/lxsession/LXDE/autostart | ~/.config/lxsession/LXDE/autostart | ||
</source> | </source> | ||
For Lubuntu versions up to and including 18.04 (before the LXQt split), the location of < | For Lubuntu versions up to and including 18.04 (before the LXQt split), the location of <syntaxhighlight lang=console inline>autostart</source> is <syntaxhighlight lang=console inline>~/.config/lxsession/Lubuntu/autostart</source>. | ||
== LXQt == | == LXQt == | ||
Line 87: | Line 87: | ||
=== GUI === | === GUI === | ||
# From your LXQt panel, navigate to ''Preferences'' → ''LXQt Settings'' → ''Session Settings''; alternatively, enter < | # From your LXQt panel, navigate to ''Preferences'' → ''LXQt Settings'' → ''Session Settings''; alternatively, enter <syntaxhighlight lang=console inline>lxqt-config-session</source> in your terminal emulator. You will be greeted with the following window:<br>[[File:Lxqt-session-settings.png|frameless|LXQt Autostart menu of Session Settings window]] | ||
# Select the < | # Select the <syntaxhighlight lang=console inline>LXQt Autostart</source> dropdown (it will be highlighted as shown above) and click the <kbd>Add</kbd> button to display the following pop-up window:<br>[[File:Lxqt-add-autostart.png|frameless|LXQt add a new autostart menu item]] | ||
# Provide a name, enter your <code>setxkbmap</code> command, and click <kbd>OK</kbd> when finished. | # Provide a name, enter your <code>setxkbmap</code> command, and click <kbd>OK</kbd> when finished. | ||
=== Terminal === | === Terminal === | ||
The above GUI approach merely creates a < | The above GUI approach merely creates a <syntaxhighlight lang=console inline>.desktop</source> file in the user's <syntaxhighlight lang=console inline>~/.config/autostart</source>. Create your own file in the <syntaxhighlight lang=console inline>autostart</source> directory whose contents are as follows, to replicate the functionality achieved through the GUI: | ||
< | <syntaxhighlight lang=ini> | ||
[Desktop Entry] | [Desktop Entry] | ||
Exec=setxkbmap -layout us,apl -variant ,dyalog -option grp:switch | Exec=setxkbmap -layout us,apl -variant ,dyalog -option grp:switch | ||
Line 119: | Line 119: | ||
Add the following to the contents of your file, customizing to suit your needs: | Add the following to the contents of your file, customizing to suit your needs: | ||
< | <syntaxhighlight lang=ini> | ||
[Desktop Entry] | [Desktop Entry] | ||
Type=Application | Type=Application | ||
Line 155: | Line 155: | ||
Xfce ships with a utility, [https://docs.xfce.org/xfce/xfconf/xfconf-query xfconf-query], which allows you to manage Xfce's XML configuration files on the command line. Enter the following commands into your terminal: | Xfce ships with a utility, [https://docs.xfce.org/xfce/xfconf/xfconf-query xfconf-query], which allows you to manage Xfce's XML configuration files on the command line. Enter the following commands into your terminal: | ||
< | <syntaxhighlight lang=console> | ||
xfconf-query -c keyboard-layout -n -p '/Default/XkbDisable' -t 'bool' -s 'false' | xfconf-query -c keyboard-layout -n -p '/Default/XkbDisable' -t 'bool' -s 'false' | ||
</source> | </source> | ||
Line 161: | Line 161: | ||
This enables [https://www.x.org/wiki/XKB/ XKB], allowing us to manage our keyboard layout. | This enables [https://www.x.org/wiki/XKB/ XKB], allowing us to manage our keyboard layout. | ||
< | <syntaxhighlight lang=console> | ||
xfconf-query -c keyboard-layout -n -p '/Default/XkbLayout' -t 'string' -s 'us,apl' | xfconf-query -c keyboard-layout -n -p '/Default/XkbLayout' -t 'string' -s 'us,apl' | ||
</source> | </source> | ||
Line 167: | Line 167: | ||
Defines the keyboard layout itself. The comma-delimited <code>apl</code> specifies a second layout group. Make sure you replace <code>us</code> with the code for your language; a list of these can be found in <code>/usr/share/X11/xkb/rules/evdev.lst</code>, under the <code>layout</code> category. | Defines the keyboard layout itself. The comma-delimited <code>apl</code> specifies a second layout group. Make sure you replace <code>us</code> with the code for your language; a list of these can be found in <code>/usr/share/X11/xkb/rules/evdev.lst</code>, under the <code>layout</code> category. | ||
< | <syntaxhighlight lang=console> | ||
xfconf-query -c keyboard-layout -n -p '/Default/XkbOptions/Group' -t 'string' -s 'grp:win_switch' | xfconf-query -c keyboard-layout -n -p '/Default/XkbOptions/Group' -t 'string' -s 'grp:win_switch' | ||
</source> | </source> | ||
Line 173: | Line 173: | ||
This tells Xfce to switch to the APL layout only when the <kbd>Windows</kbd> key is pressed. When the <kbd>Windows</kbd> key is released, the layout will return to its previous setting. This is incredibly useful as the <code>apl</code> layouts in XKB do not support <kbd>Space</kbd>, <kbd>Enter</kbd>, or the arrow keys (among basically all the others). A full list of possible keys for switching between keyboard groups is located in <code>/usr/share/X11/xkb/rules/evdev.lst</code>, under the <code>option</code> category. | This tells Xfce to switch to the APL layout only when the <kbd>Windows</kbd> key is pressed. When the <kbd>Windows</kbd> key is released, the layout will return to its previous setting. This is incredibly useful as the <code>apl</code> layouts in XKB do not support <kbd>Space</kbd>, <kbd>Enter</kbd>, or the arrow keys (among basically all the others). A full list of possible keys for switching between keyboard groups is located in <code>/usr/share/X11/xkb/rules/evdev.lst</code>, under the <code>option</code> category. | ||
< | <syntaxhighlight lang=console> | ||
xfconf-query -c keyboard-layout -n -p '/Default/XkbVariant' -t 'string' -s ',dyalog' | xfconf-query -c keyboard-layout -n -p '/Default/XkbVariant' -t 'string' -s ',dyalog' | ||
</source> | </source> | ||
Line 183: | Line 183: | ||
== xmodmap == | == xmodmap == | ||
Modifying the Linux keyboard to support APL keys via [https://linux.die.net/man/1/xmodmap xmodmap(1)] is possible, but not recommended — it has been superseded by the [https://wiki.archlinux.org/title/X_keyboard_extension X keyboard extension] (XKB). Generally < | Modifying the Linux keyboard to support APL keys via [https://linux.die.net/man/1/xmodmap xmodmap(1)] is possible, but not recommended — it has been superseded by the [https://wiki.archlinux.org/title/X_keyboard_extension X keyboard extension] (XKB). Generally <syntaxhighlight lang=console inline>xmodmap</source> is best for simple tasks,<ref>ArchWiki Contributors. [https://wiki.archlinux.org/title/xmodmap xmodmap]. 19 July 2021</ref> which APL keyboards often tend not to be. [[Dyalog APL]], for example, has native support for XKB.<ref name="Dyalog APL XKB"/> | ||
For users who understand the pitfalls, an example < | For users who understand the pitfalls, an example <syntaxhighlight lang=console inline>~/.Xmodmap</source> can be [https://gist.github.com/Russtopia/20ae5ab571d5bed73359ca956d9010a7 found at this GitHub Gist]. | ||
== Troubleshooting == | == Troubleshooting == | ||
=== Gnome catches keystrokes before Dyalog === | === Gnome catches keystrokes before Dyalog === | ||
After upgrading Ubuntu 21.04 (Hirsute Hippo), Gnome catches the keystrokes from the <kbd>Super</kbd> key to show the list of applications, before Dyalog can receive it. [[#setxkbmap|Changing the shifting key]] from < | After upgrading Ubuntu 21.04 (Hirsute Hippo), Gnome catches the keystrokes from the <kbd>Super</kbd> key to show the list of applications, before Dyalog can receive it. [[#setxkbmap|Changing the shifting key]] from <syntaxhighlight lang=console inline>grp:win_switch</source> to <syntaxhighlight lang=console inline>grp:caps_switch</source> avoids the issue. Changing it to <syntaxhighlight lang=console inline>grp:rctrl_switch</source> does not work. | ||
=== Dyalog Overrides Current Keyboard Settings === | === Dyalog Overrides Current Keyboard Settings === | ||
Line 198: | Line 198: | ||
To run Dyalog in the terminal without overriding ("hijacking") the user keyboard configuration, run <code>dyalog</code> with the <code>-nokbd</code> option: | To run Dyalog in the terminal without overriding ("hijacking") the user keyboard configuration, run <code>dyalog</code> with the <code>-nokbd</code> option: | ||
< | <syntaxhighlight lang=bash> | ||
dyalog -nokbd | dyalog -nokbd | ||
</source> | </source> | ||
Line 204: | Line 204: | ||
The following script can be used to launch RIDE, immediately connecting a new Dyalog instance, without changing the xkb settings: | The following script can be used to launch RIDE, immediately connecting a new Dyalog instance, without changing the xkb settings: | ||
< | <syntaxhighlight lang=bash> | ||
#!/usr/bin/env sh | #!/usr/bin/env sh | ||
env RIDE_CONNECT=localhost:4502 ride & | env RIDE_CONNECT=localhost:4502 ride & | ||
Line 216: | Line 216: | ||
Previous versions of Dyalog override the current keyboard configuration, as described in [[#Dyalog_Overrides_Current_Keyboard_Settings|this section]], but even using the default keyboard configuration by starting Dyalog 18.2 or later with | Previous versions of Dyalog override the current keyboard configuration, as described in [[#Dyalog_Overrides_Current_Keyboard_Settings|this section]], but even using the default keyboard configuration by starting Dyalog 18.2 or later with | ||
< | <syntaxhighlight lang=bash> | ||
dyalog --keyboard | dyalog --keyboard | ||
</source> | </source> | ||
Line 222: | Line 222: | ||
fails to return the user to their previous keyboard configuration on exit. To solve this, create a custom [[wikipedia:Bash_(Unix_shell)|Bash]] script to save and revert keyboard settings upon exiting Dyalog APL:<ref>Adám Brudzewsky. [https://stackoverflow.com/questions/63431922/dyalog-apl-hijack-windows-key-and-do-not-give-it-back-fedora-32-gnome-free-lic/63433845#63433845 Stack Overflow answer]. 17 Aug, 2020</ref> | fails to return the user to their previous keyboard configuration on exit. To solve this, create a custom [[wikipedia:Bash_(Unix_shell)|Bash]] script to save and revert keyboard settings upon exiting Dyalog APL:<ref>Adám Brudzewsky. [https://stackoverflow.com/questions/63431922/dyalog-apl-hijack-windows-key-and-do-not-give-it-back-fedora-32-gnome-free-lic/63433845#63433845 Stack Overflow answer]. 17 Aug, 2020</ref> | ||
< | <syntaxhighlight lang=bash> | ||
#!/usr/bin/sh | #!/usr/bin/sh | ||
OLDLAYOUT=$(setxkbmap -query | sed -n 's/^layout://p') | OLDLAYOUT=$(setxkbmap -query | sed -n 's/^layout://p') | ||
Line 235: | Line 235: | ||
=== Settings reverted during X Windows session === | === Settings reverted during X Windows session === | ||
Since at least March 2020 there have been issues with < | Since at least March 2020 there have been issues with <syntaxhighlight lang=console inline>setxkbmap</source> settings being reset without user instruction under the [[wikipedia:X Windows System|X Windows System]]. | ||
Below is a script written in [[wikipedia:Raku (programming language)|Raku]] that continuously checks for this undesirable reset behavior and puts the intended settings back in place.<ref>John Longwalker. [https://5ab5traction5.bearblog.dev/ 5ab5traction5 blog]. [https://5ab5traction5.bearblog.dev/apl-keyboard-keeper/ Raku to the Rescue: APL Keyboard Keeper]. 29 Jun, 2020</ref> | Below is a script written in [[wikipedia:Raku (programming language)|Raku]] that continuously checks for this undesirable reset behavior and puts the intended settings back in place.<ref>John Longwalker. [https://5ab5traction5.bearblog.dev/ 5ab5traction5 blog]. [https://5ab5traction5.bearblog.dev/apl-keyboard-keeper/ Raku to the Rescue: APL Keyboard Keeper]. 29 Jun, 2020</ref> | ||
< | <syntaxhighlight lang=perl6> | ||
#!/usr/bin/env raku | #!/usr/bin/env raku | ||