ajout kanata pour ergo-l
parent
721eec0498
commit
eb999bb3eb
|
|
@ -0,0 +1,186 @@
|
|||
Arsenik Kanata
|
||||
================================================================================
|
||||
|
||||
Installation
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
- To get Arsenik, check out this repository with Git or
|
||||
[download it][Download Arsenik].
|
||||
- Launch `kanata.kbd` with Kanata.
|
||||
- You can install Kanata by downloading a
|
||||
[pre-built executable][Download Kanata].
|
||||
- Follow the installation details of your operating system.
|
||||
|
||||
<details>
|
||||
<summary>Windows</summary>
|
||||
|
||||
Windows users might prefer to download the `kanata_winIOv2.exe` version as it
|
||||
fixes some weird bugs like <kbd>C</kbd> and <kbd>V</kbd> inversion.
|
||||
|
||||
*Note: This tip has been tested for version 1.6.1 of Kanata. In later versions the
|
||||
`winIOv2` version might be the default.*
|
||||
|
||||
Put the `kanata_winIOv2.exe` in the Kanata Arsenik folder, run it and you’re
|
||||
good to go!
|
||||
</details>
|
||||
|
||||
<details>
|
||||
<summary>Linux</summary>
|
||||
|
||||
### Run Kanata without <code>sudo</code>
|
||||
|
||||
kanata needs to intercept `uinput` signals, which it cannot do without the
|
||||
proper authorisations.
|
||||
|
||||
If you don’t want to run `kanata` with `sudo`, you’ll need to allow Kanata to
|
||||
read from `uinput`. This requires the users to be part of both `input` and
|
||||
`uinput` groups.
|
||||
|
||||
For that, you first need to create a `uinput` group if it doesn’t exist yet:
|
||||
|
||||
```bash
|
||||
sudo groupadd -U $USERNAME uinput
|
||||
```
|
||||
|
||||
where `$USERNAME` is the target user (or users in a comma-separated list). Then
|
||||
add the target user (or users) to the group input:
|
||||
|
||||
```bash
|
||||
sudo usermod -aG input $USERNAME
|
||||
```
|
||||
|
||||
You can check after re-logging that both groups appear in the result of the
|
||||
`groups` command launched as the target user.
|
||||
|
||||
Finally, you need to add a udev rule in `/etc/udev/rules.d/50-kanata.rules`:
|
||||
|
||||
```udev
|
||||
KERNEL=="uinput", MODE="0660", GROUP="uinput", OPTIONS+="static_node=uinput"
|
||||
```
|
||||
|
||||
### Making a user-side <code>systemd</code> service for Kanata
|
||||
|
||||
Note: This only works if `kanata` is able to run without `sudo` (and is using
|
||||
`systemd`).
|
||||
|
||||
Using a `systemd service` allows running `kanata` as a daemon, possibly right
|
||||
after logging in. Here is a template for a service file:
|
||||
|
||||
```
|
||||
[Unit]
|
||||
Description=Kanata keyboard remapper
|
||||
Documentation=https://github.com/jtroo/kanata
|
||||
|
||||
[Service]
|
||||
Environment=PATH=/usr/local/bin:/usr/local/sbin:/usr/bin:/bin
|
||||
Environment=DISPLAY=:0
|
||||
Environment=HOME=/path/to/home/folder
|
||||
Type=simple
|
||||
ExecStart=/usr/local/bin/kanata --cfg /path/to/kanata/config/file
|
||||
Restart=no
|
||||
|
||||
[Install]
|
||||
WantedBy=default.target
|
||||
```
|
||||
|
||||
Copy-paste it into `~/.config/systemd/user/kanata.service`, fill in the
|
||||
placeholders, then run one of the following commands:
|
||||
|
||||
- `systemctl --user start kanata.service` to manually start `kanata`
|
||||
- `systemctl --user enable kanata.service` so `kanata` may autostart whenever
|
||||
the current user logs in
|
||||
- `systemctl --user status kanata.service` to check if `kanata` is running
|
||||
|
||||
</details>
|
||||
|
||||
<details>
|
||||
<summary> macOS</summary>
|
||||
|
||||
### Karabiner DriverKit installation
|
||||
|
||||
Install the [Karabiner-DriverKit-VirtualHIDDevice](https://github.com/pqrs-org/Karabiner-DriverKit-VirtualHIDDevice/releases/tag/v4.3.0). Latest version (v5.0.0) is not working with Kanata.
|
||||
|
||||
To activate it:
|
||||
|
||||
```
|
||||
/Applications/.Karabiner-VirtualHIDDevice-Manager.app/Contents/MacOS/Karabiner-VirtualHIDDevice-Manager activate
|
||||
```
|
||||
|
||||
You may have to allow Kanata execution in the Privacy & Security panel from macOS settings.
|
||||
|
||||
As root, add the following content in `/Library/LaunchDaemons/org.pqrs.service.daemon.Karabiner-VirtualHIDDevice-Daemon.plist` file:
|
||||
|
||||
```
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>Label</key>
|
||||
<string>org.pqrs.service.daemon.Karabiner-VirtualHIDDevice-Daemon</string>
|
||||
<key>KeepAlive</key>
|
||||
<true/>
|
||||
<key>ProcessType</key>
|
||||
<string>Interactive</string>
|
||||
<key>ProgramArguments</key>
|
||||
<array>
|
||||
<string>/Library/Application Support/org.pqrs/Karabiner-DriverKit-VirtualHIDDevice/Applications/Karabiner-VirtualHIDDevice-Daemon.app/Contents/MacOS/Karabiner-VirtualHIDDevice-Daemon</string>
|
||||
</array>
|
||||
</dict>
|
||||
</plist>
|
||||
```
|
||||
|
||||
A new item *Fumihiko Takayama* will be added in System Settings > Login Items.
|
||||
|
||||
Two Karabiner processes should be started:
|
||||
|
||||
```
|
||||
sh-3.2# ps aux | grep -i karabiner | grep -v grep
|
||||
_driverkit 26050 0.0 0.0 410598064 2256 ?? Ss 8:02PM 0:00.04 /Library/SystemExtensions/.../org.pqrs.Karabiner-DriverKit-VirtualHIDDevice.dext/org.pqrs.Karabiner-DriverKit-VirtualHIDDevice org.pqrs.Karabiner-DriverKit-VirtualHIDDevice 0x10002b929 org.pqrs.Karabiner-DriverKit-VirtualHIDDevice
|
||||
root 25744 0.0 0.1 410756464 9872 ?? Ss 8:01PM 0:00.16 /Library/Application Support/org.pqrs/Karabiner-DriverKit-VirtualHIDDevice/Applications/Karabiner-VirtualHIDDevice-Daemon.app/Contents/MacOS/Karabiner-VirtualHIDDevice-Daemon
|
||||
```
|
||||
|
||||
### Kanata installation
|
||||
|
||||
Download Kanata [here](https://github.com/jtroo/kanata/releases/tag/v1.7.0) and save it in a persistent directory.
|
||||
|
||||
Add a sudo rule in `/private/etc/sudoers.d/kanata` where `$USERNAME` is your username:
|
||||
|
||||
```
|
||||
$USERNAME ALL=(ALL) NOPASSWD: /path/to/kanata/binary/kanata
|
||||
```
|
||||
|
||||
To start Kanata at the beginning of the session, add a property list file in `~/Library/LaunchAgents/com.jtroo.kanata.plist` with the following content:
|
||||
|
||||
```
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>Label</key>
|
||||
<string>com.jtroo.kanata</string>
|
||||
|
||||
<key>ProgramArguments</key>
|
||||
<array>
|
||||
<string>sudo</string>
|
||||
<string>/path/to/kanata/binary/kanata</string>
|
||||
<string>--cfg</string>
|
||||
<string>/path/to/kanata/config/file</string>
|
||||
<string>-n</string>
|
||||
</array>
|
||||
|
||||
<key>RunAtLoad</key>
|
||||
<true/>
|
||||
|
||||
<key>KeepAlive</key>
|
||||
<true/>
|
||||
</dict>
|
||||
</plist>
|
||||
```
|
||||
|
||||
In system settings, search Login Items menu and select `sudo` service in *Allow in the Background* list.
|
||||
You can restart Kanata with new configuration by disabling and enabling this service.
|
||||
|
||||
</details>
|
||||
|
||||
[Download Arsenik]: https://github.com/OneDeadKey/arsenik/releases
|
||||
[Download Kanata]: https://github.com/jtroo/kanata/releases
|
||||
|
|
@ -0,0 +1,88 @@
|
|||
;; Azerty Windows/Linux aliases
|
||||
;; Works with AZERTY-fr. Needs a couple tweaks for the Belgian and Mac variants.
|
||||
|
||||
;; Navigation layer
|
||||
(defalias
|
||||
|
||||
all C-q
|
||||
sav C-s
|
||||
cls C-z
|
||||
ndo C-w
|
||||
cut C-x
|
||||
cpy C-c
|
||||
pst C-v
|
||||
|
||||
0 S-0
|
||||
1 S-1
|
||||
2 S-2
|
||||
3 S-3
|
||||
4 S-4
|
||||
5 S-5
|
||||
6 S-6
|
||||
7 S-7
|
||||
8 S-8
|
||||
9 S-9
|
||||
, m
|
||||
. S-,
|
||||
)
|
||||
|
||||
;; Symbols layer
|
||||
(defalias
|
||||
|
||||
^ (macro [ spc)
|
||||
< <
|
||||
> S-<
|
||||
$ ]
|
||||
% S-'
|
||||
@ AG-0
|
||||
& 1
|
||||
* \
|
||||
' 4
|
||||
` (macro AG-7 spc)
|
||||
|
||||
{ AG-4
|
||||
pl 5
|
||||
pr -
|
||||
} AG-=
|
||||
= =
|
||||
\ AG-8
|
||||
+ S-=
|
||||
- 6
|
||||
/ S-.
|
||||
'' 3
|
||||
|
||||
~ (macro AG-2 spc)
|
||||
[ AG-5
|
||||
] AG--
|
||||
_ 8
|
||||
# AG-3
|
||||
| AG-6
|
||||
! /
|
||||
; ,
|
||||
: .
|
||||
? S-m
|
||||
)
|
||||
|
||||
;; NumRow layer
|
||||
(defalias
|
||||
|
||||
s0 0
|
||||
s1 1
|
||||
s2 2
|
||||
s3 3
|
||||
s4 4
|
||||
s5 5
|
||||
s6 6
|
||||
s7 7
|
||||
s8 8
|
||||
s9 9
|
||||
nbs (unicode ) ;; narrow non-break space
|
||||
|
||||
dk1 XX
|
||||
dk2 XX
|
||||
dk3 XX
|
||||
dk4 XX
|
||||
dk5 XX
|
||||
)
|
||||
|
||||
;; vim: set ft=lisp:
|
||||
|
|
@ -0,0 +1,87 @@
|
|||
;; Bépo Windows/Linux aliases
|
||||
|
||||
;; Navigation layer
|
||||
(defalias
|
||||
|
||||
all C-a
|
||||
sav C-k
|
||||
cls C-]
|
||||
ndo C-[
|
||||
cut C-c
|
||||
cpy C-h
|
||||
pst C-u
|
||||
|
||||
0 S-0
|
||||
1 S-1
|
||||
2 S-2
|
||||
3 S-3
|
||||
4 S-4
|
||||
5 S-5
|
||||
6 S-6
|
||||
7 S-7
|
||||
8 S-8
|
||||
9 S-9
|
||||
, g
|
||||
. v
|
||||
)
|
||||
|
||||
;; Symbols layer
|
||||
(defalias
|
||||
|
||||
^ AG-6
|
||||
< AG-2
|
||||
> AG-3
|
||||
$ `
|
||||
% =
|
||||
@ 6
|
||||
& AG-e
|
||||
* 0
|
||||
' AG-g
|
||||
` S-=
|
||||
|
||||
{ AG-x
|
||||
pl 4
|
||||
pr 5
|
||||
} AG-c
|
||||
= -
|
||||
\ AG-z
|
||||
+ 7
|
||||
- 8
|
||||
/ AG-<
|
||||
'' 1
|
||||
|
||||
~ AG-b
|
||||
[ AG-4
|
||||
] AG-5
|
||||
_ AG-spc
|
||||
# S-`
|
||||
| AG-q
|
||||
! S-y
|
||||
; S-g
|
||||
: S-v
|
||||
? S-n
|
||||
)
|
||||
|
||||
;; NumRow layer
|
||||
(defalias
|
||||
|
||||
s0 0
|
||||
s1 1
|
||||
s2 2
|
||||
s3 3
|
||||
s4 4
|
||||
s5 5
|
||||
s6 6
|
||||
s7 7
|
||||
s8 8
|
||||
s9 9
|
||||
nbs S-spc ;; narrow no-break space
|
||||
|
||||
dk1 XX
|
||||
dk2 XX
|
||||
dk3 XX
|
||||
dk4 XX
|
||||
dk5 XX
|
||||
)
|
||||
|
||||
;; vim: set ft=lisp:
|
||||
|
|
@ -0,0 +1,89 @@
|
|||
;; Ergo‑L Windows/Linux aliases
|
||||
|
||||
;; Navigation layer
|
||||
(defalias
|
||||
|
||||
all C-a
|
||||
sav C-s
|
||||
cls C-t
|
||||
ndo C-z
|
||||
cut C-x
|
||||
cpy C-w
|
||||
pst C-v
|
||||
|
||||
0 0
|
||||
1 1
|
||||
2 2
|
||||
3 3
|
||||
4 4
|
||||
5 5
|
||||
6 6
|
||||
7 7
|
||||
8 8
|
||||
9 9
|
||||
, .
|
||||
. n
|
||||
)
|
||||
|
||||
;; Symbols layer
|
||||
(defalias
|
||||
|
||||
^ AG-q
|
||||
< AG-w
|
||||
> AG-e
|
||||
$ AG-r
|
||||
% AG-t
|
||||
@ AG-y
|
||||
& AG-u
|
||||
* AG-i
|
||||
' AG-o
|
||||
` AG-p
|
||||
|
||||
{ AG-a
|
||||
pl AG-s
|
||||
pr AG-d
|
||||
} AG-f
|
||||
= AG-g
|
||||
\ AG-h
|
||||
+ AG-j
|
||||
- AG-k
|
||||
/ AG-l
|
||||
'' AG-;
|
||||
|
||||
~ AG-z
|
||||
[ AG-x
|
||||
] AG-c
|
||||
_ AG-v
|
||||
# AG-b
|
||||
| AG-n
|
||||
! AG-m
|
||||
; AG-,
|
||||
: AG-.
|
||||
? AG-/
|
||||
)
|
||||
|
||||
;; NumRow layer
|
||||
(defalias
|
||||
|
||||
s0 S-0
|
||||
s1 S-1
|
||||
s2 S-2
|
||||
s3 S-3
|
||||
s4 S-4
|
||||
s5 S-5
|
||||
s6 S-6
|
||||
s7 S-7
|
||||
s8 S-8
|
||||
s9 S-9
|
||||
nbs S-spc ;; narrow no-break space
|
||||
|
||||
1dk o
|
||||
;; digits must be escaped, otherwise they’re interpreted as delays in ms
|
||||
dk1 (macro @1dk @1)
|
||||
dk2 (macro @1dk @2)
|
||||
dk3 (macro @1dk @3)
|
||||
dk4 (macro @1dk @4)
|
||||
dk5 (macro @1dk @5)
|
||||
)
|
||||
|
||||
;; vim: set ft=lisp:
|
||||
|
|
@ -0,0 +1,87 @@
|
|||
;; Optimot Windows/Linux aliases
|
||||
|
||||
;; Navigation layer
|
||||
(defalias
|
||||
|
||||
all C-a
|
||||
sav C-k
|
||||
cls C-v
|
||||
ndo C-]
|
||||
cut C-[
|
||||
cpy C-m
|
||||
pst C-/
|
||||
|
||||
0 S-0
|
||||
1 S-1
|
||||
2 S-2
|
||||
3 S-3
|
||||
4 S-4
|
||||
5 S-5
|
||||
6 S-6
|
||||
7 S-7
|
||||
8 S-8
|
||||
9 S-9
|
||||
, g
|
||||
. c
|
||||
)
|
||||
|
||||
;; Symbols layer
|
||||
(defalias
|
||||
|
||||
^ (macro ' spc)
|
||||
< AG-q
|
||||
> AG-w
|
||||
$ `
|
||||
% S-=
|
||||
@ -
|
||||
& AG-j
|
||||
* 6
|
||||
' o
|
||||
` AG-h
|
||||
|
||||
{ AG-u
|
||||
pl 9
|
||||
pr 0
|
||||
} AG-i
|
||||
= 8
|
||||
\ AG-7
|
||||
+ 5
|
||||
- 4
|
||||
/ 7
|
||||
'' 3
|
||||
|
||||
~ (macro AG-; spc)
|
||||
[ AG-9
|
||||
] AG-0
|
||||
_ S--
|
||||
# =
|
||||
| AG-[
|
||||
! S-'
|
||||
; S-g
|
||||
: S-c
|
||||
? S-o
|
||||
)
|
||||
|
||||
;; NumRow layer
|
||||
(defalias
|
||||
|
||||
s0 0
|
||||
s1 1
|
||||
s2 2
|
||||
s3 3
|
||||
s4 4
|
||||
s5 5
|
||||
s6 6
|
||||
s7 7
|
||||
s8 8
|
||||
s9 9
|
||||
nbs S-spc ;; narrow no-break space
|
||||
|
||||
dk1 XX
|
||||
dk2 XX
|
||||
dk3 XX
|
||||
dk4 XX
|
||||
dk5 XX
|
||||
)
|
||||
|
||||
;; vim: set ft=lisp:
|
||||
|
|
@ -0,0 +1,89 @@
|
|||
;; Qwerty‑Lafayette Windows/Linux aliases
|
||||
|
||||
;; Navigation layer
|
||||
(defalias
|
||||
|
||||
all C-a
|
||||
sav C-s
|
||||
cls C-w
|
||||
ndo C-z
|
||||
cut C-x
|
||||
cpy C-c
|
||||
pst C-v
|
||||
|
||||
0 0
|
||||
1 1
|
||||
2 2
|
||||
3 3
|
||||
4 4
|
||||
5 5
|
||||
6 6
|
||||
7 7
|
||||
8 8
|
||||
9 9
|
||||
, ,
|
||||
. .
|
||||
)
|
||||
|
||||
;; Symbols layer
|
||||
(defalias
|
||||
|
||||
^ AG-q
|
||||
< AG-w
|
||||
> AG-e
|
||||
$ AG-r
|
||||
% AG-t
|
||||
@ AG-y
|
||||
& AG-u
|
||||
* AG-i
|
||||
' AG-o
|
||||
` AG-p
|
||||
|
||||
{ AG-a
|
||||
pl AG-s
|
||||
pr AG-d
|
||||
} AG-f
|
||||
= AG-g
|
||||
\ AG-h
|
||||
+ AG-j
|
||||
- AG-k
|
||||
/ AG-l
|
||||
'' AG-;
|
||||
|
||||
~ AG-z
|
||||
[ AG-x
|
||||
] AG-c
|
||||
_ AG-v
|
||||
# AG-b
|
||||
| AG-n
|
||||
! AG-m
|
||||
; AG-,
|
||||
: AG-.
|
||||
? AG-/
|
||||
)
|
||||
|
||||
;; NumRow layer
|
||||
(defalias
|
||||
|
||||
s0 S-0
|
||||
s1 S-1
|
||||
s2 S-2
|
||||
s3 S-3
|
||||
s4 S-4
|
||||
s5 S-5
|
||||
s6 S-6
|
||||
s7 S-7
|
||||
s8 S-8
|
||||
s9 S-9
|
||||
nbs S-spc ;; narrow no-break space
|
||||
|
||||
1dk ;
|
||||
;; digits must be escaped, otherwise they’re interpreted as delays in ms
|
||||
dk1 (macro @1dk @1)
|
||||
dk2 (macro @1dk @2)
|
||||
dk3 (macro @1dk @3)
|
||||
dk4 (macro @1dk @4)
|
||||
dk5 (macro @1dk @5)
|
||||
)
|
||||
|
||||
;; vim: set ft=lisp:
|
||||
|
|
@ -0,0 +1,87 @@
|
|||
;; Qwerty/Colemak macOS aliases
|
||||
|
||||
;; Navigation layer
|
||||
(defalias
|
||||
|
||||
all M-a
|
||||
sav M-s
|
||||
cls M-w
|
||||
ndo M-z
|
||||
cut M-x
|
||||
cpy M-c
|
||||
pst M-v
|
||||
|
||||
0 0
|
||||
1 1
|
||||
2 2
|
||||
3 3
|
||||
4 4
|
||||
5 5
|
||||
6 6
|
||||
7 7
|
||||
8 8
|
||||
9 9
|
||||
, ,
|
||||
. .
|
||||
)
|
||||
|
||||
;; Symbols layer
|
||||
(defalias
|
||||
|
||||
^ S-6
|
||||
< S-,
|
||||
> S-.
|
||||
$ S-4
|
||||
% S-5
|
||||
@ S-2
|
||||
& S-7
|
||||
* S-8
|
||||
' '
|
||||
` `
|
||||
|
||||
{ S-[
|
||||
pl S-9
|
||||
pr S-0
|
||||
} S-]
|
||||
= =
|
||||
\ \
|
||||
+ S-=
|
||||
- -
|
||||
/ /
|
||||
'' S-'
|
||||
|
||||
~ S-`
|
||||
[ [
|
||||
] ]
|
||||
_ S--
|
||||
# S-3
|
||||
| S-\
|
||||
! S-1
|
||||
; ;
|
||||
: S-;
|
||||
? S-/
|
||||
)
|
||||
|
||||
;; NumRow layer
|
||||
(defalias
|
||||
|
||||
s0 S-0
|
||||
s1 S-1
|
||||
s2 S-2
|
||||
s3 S-3
|
||||
s4 S-4
|
||||
s5 S-5
|
||||
s6 S-6
|
||||
s7 S-7
|
||||
s8 S-8
|
||||
s9 S-9
|
||||
nbs spc ;; no narrow no-break space in Qwerty
|
||||
|
||||
dk1 XX
|
||||
dk2 XX
|
||||
dk3 XX
|
||||
dk4 XX
|
||||
dk5 XX
|
||||
)
|
||||
|
||||
;; vim: set ft=lisp:
|
||||
|
|
@ -0,0 +1,88 @@
|
|||
;; Qwerty/Colemak Windows/Linux aliases
|
||||
;; Works with QWERTY-US, Colemak and others.
|
||||
|
||||
;; Navigation layer
|
||||
(defalias
|
||||
|
||||
all C-a
|
||||
sav C-s
|
||||
cls C-w
|
||||
ndo C-z
|
||||
cut C-x
|
||||
cpy C-c
|
||||
pst C-v
|
||||
|
||||
0 0
|
||||
1 1
|
||||
2 2
|
||||
3 3
|
||||
4 4
|
||||
5 5
|
||||
6 6
|
||||
7 7
|
||||
8 8
|
||||
9 9
|
||||
, ,
|
||||
. .
|
||||
)
|
||||
|
||||
;; Symbols layer
|
||||
(defalias
|
||||
|
||||
^ S-6
|
||||
< S-,
|
||||
> S-.
|
||||
$ S-4
|
||||
% S-5
|
||||
@ S-2
|
||||
& S-7
|
||||
* S-8
|
||||
' '
|
||||
` `
|
||||
|
||||
{ S-[
|
||||
pl S-9
|
||||
pr S-0
|
||||
} S-]
|
||||
= =
|
||||
\ \
|
||||
+ S-=
|
||||
- -
|
||||
/ /
|
||||
'' S-'
|
||||
|
||||
~ S-`
|
||||
[ [
|
||||
] ]
|
||||
_ S--
|
||||
# S-3
|
||||
| S-\
|
||||
! S-1
|
||||
; ;
|
||||
: S-;
|
||||
? S-/
|
||||
)
|
||||
|
||||
;; NumRow layer
|
||||
(defalias
|
||||
|
||||
s0 S-0
|
||||
s1 S-1
|
||||
s2 S-2
|
||||
s3 S-3
|
||||
s4 S-4
|
||||
s5 S-5
|
||||
s6 S-6
|
||||
s7 S-7
|
||||
s8 S-8
|
||||
s9 S-9
|
||||
nbs spc ;; no narrow no-break space in Qwerty
|
||||
|
||||
dk1 XX
|
||||
dk2 XX
|
||||
dk3 XX
|
||||
dk4 XX
|
||||
dk5 XX
|
||||
)
|
||||
|
||||
;; vim: set ft=lisp:
|
||||
|
|
@ -0,0 +1,88 @@
|
|||
;; Qwertz Windows/Linux aliases
|
||||
;; Works with QWERTZ-de. Needs a couple tweaks for other QWERTZ variants.
|
||||
|
||||
;; Navigation layer
|
||||
(defalias
|
||||
|
||||
all C-a
|
||||
sav C-s
|
||||
cls C-w
|
||||
ndo C-y
|
||||
cut C-x
|
||||
cpy C-c
|
||||
pst C-v
|
||||
|
||||
0 0
|
||||
1 1
|
||||
2 2
|
||||
3 3
|
||||
4 4
|
||||
5 5
|
||||
6 6
|
||||
7 7
|
||||
8 8
|
||||
9 9
|
||||
, ,
|
||||
. .
|
||||
)
|
||||
|
||||
;; Symbols layer
|
||||
(defalias
|
||||
|
||||
^ (macro grv spc)
|
||||
< <
|
||||
> S-<
|
||||
$ S-4
|
||||
% S-5
|
||||
@ AG-q
|
||||
& S-6
|
||||
* S-]
|
||||
' S-\
|
||||
` (macro S-= spc)
|
||||
|
||||
{ AG-7
|
||||
pl S-8
|
||||
pr S-9
|
||||
} AG-0
|
||||
= S-0
|
||||
\ AG--
|
||||
+ ]
|
||||
- /
|
||||
/ S-7
|
||||
'' S-2
|
||||
|
||||
~ AG-]
|
||||
[ AG-8
|
||||
] AG-9
|
||||
_ S-/
|
||||
# \
|
||||
| AG-<
|
||||
! S-1
|
||||
; S-,
|
||||
: S-.
|
||||
? S--
|
||||
)
|
||||
|
||||
;; NumRow layer
|
||||
(defalias
|
||||
|
||||
s0 S-0
|
||||
s1 S-1
|
||||
s2 S-2
|
||||
s3 S-3
|
||||
s4 S-4
|
||||
s5 S-5
|
||||
s6 S-6
|
||||
s7 S-7
|
||||
s8 S-8
|
||||
s9 S-9
|
||||
nbs spc ;; no narrow no-break space in Qwerty
|
||||
|
||||
dk1 XX
|
||||
dk2 XX
|
||||
dk3 XX
|
||||
dk4 XX
|
||||
dk5 XX
|
||||
)
|
||||
|
||||
;; vim: set ft=lisp:
|
||||
|
|
@ -0,0 +1,11 @@
|
|||
;; Base layer: standard keyboard behavior
|
||||
|
||||
(deflayer base
|
||||
_ _ _ _ _ _ _ _ _ _ _
|
||||
q w e r t y u i o p
|
||||
a s d f g h j k l ;
|
||||
z x c v b < n m , . /
|
||||
_ _ _
|
||||
)
|
||||
|
||||
;; vim: set ft=lisp:
|
||||
|
|
@ -0,0 +1,23 @@
|
|||
;; Base layer: the 3 main thumb keys become mod/taps
|
||||
|
||||
(deflayer base
|
||||
_ _ _ _ _ _ _ _ _ _ _
|
||||
q w e r t y u i o p
|
||||
a s d f g h j k l ;
|
||||
z x c v b < n m , . /
|
||||
@alt @nav @sym
|
||||
)
|
||||
|
||||
;; Timing variables are defined in `kanata.kbd` file.
|
||||
|
||||
(defalias
|
||||
;; Main mod-tap: Nav layer when held, Space when tapped.
|
||||
nav (tap-hold $tap_timeout $long_hold_timeout spc (layer-while-held navigation))
|
||||
|
||||
;; Space-cadet thumb keys: Alt/BackSpace, AltGr/Enter.
|
||||
;; Acts as a modifier by default, or as BackSpace/Enter when tapped separately.
|
||||
alt (tap-hold-press $tap_timeout $hold_timeout bspc _)
|
||||
sym (tap-hold-press $tap_timeout $hold_timeout ret (layer-while-held symbols))
|
||||
)
|
||||
|
||||
;; vim: set ft=lisp:
|
||||
|
|
@ -0,0 +1,31 @@
|
|||
;; Base layer: layer-taps under the thumbs + home-row mods on SDF and JKL
|
||||
|
||||
(deflayer base
|
||||
_ _ _ _ _ _ _ _ _ _ _
|
||||
q w e r t y u i o p
|
||||
a @ss @dd @ff g h @jj @kk @ll ;
|
||||
z x c v b < n m , . /
|
||||
@sft @nav @sym
|
||||
)
|
||||
|
||||
;; Timing variables are defined in `kanata.kbd` file.
|
||||
|
||||
(defalias
|
||||
;; Main mod-tap: Nav layer when held, Space when tapped.
|
||||
nav (tap-hold $tap_timeout $long_hold_timeout spc (layer-while-held navigation))
|
||||
|
||||
;; Space-cadet thumb keys: Shift/BackSpace, AltGr/Enter.
|
||||
;; Acts as a modifier by default, or as BackSpace/Enter when tapped separately.
|
||||
sft (tap-hold-press $tap_timeout $hold_timeout bspc lsft)
|
||||
sym (tap-hold-press $tap_timeout $hold_timeout ret (layer-while-held symbols))
|
||||
|
||||
;; Home-row mods
|
||||
ss (tap-hold $tap_timeout $long_hold_timeout s lmet)
|
||||
dd (tap-hold $tap_timeout $long_hold_timeout d lctl)
|
||||
ff (tap-hold $tap_timeout $long_hold_timeout f lalt)
|
||||
jj (tap-hold $tap_timeout $long_hold_timeout j lalt)
|
||||
kk (tap-hold $tap_timeout $long_hold_timeout k rctl)
|
||||
ll (tap-hold $tap_timeout $long_hold_timeout l rmet)
|
||||
)
|
||||
|
||||
;; vim: set ft=lisp:
|
||||
|
|
@ -0,0 +1,17 @@
|
|||
;; Num-Navigation layer:
|
||||
;; - should inherit from NumPad
|
||||
;; - left: one-handed shortcuts (Cmd/Ctrl-AZXCV) + Tab/S-Tab
|
||||
;; - top: Super-num (i3/sway) or Alt-num (browser)
|
||||
|
||||
;; The `lrld` action stands for "live reload". This will re-parse everything
|
||||
;; except for linux-dev, i.e. you cannot live reload and switch keyboard devices.
|
||||
|
||||
(deflayer navigation
|
||||
M-1 M-2 M-3 M-4 M-5 lrld M-6 M-7 M-8 M-9 M-0
|
||||
tab home up end pgup @/ @7 @8 @9 @run
|
||||
@all lft down rght pgdn @- @4 @5 @6 @0
|
||||
@ndo @cut @cpy @pst S-tab _ @, @1 @2 @3 @.
|
||||
del _ esc
|
||||
)
|
||||
|
||||
;; vim: set ft=lisp:
|
||||
|
|
@ -0,0 +1,48 @@
|
|||
;; Vim-Navigation layer:
|
||||
;; - right: Vim-like arrows on HJKL, home/end page up/down, mouse scroll
|
||||
;; - left: one-hand shortcuts (Cmd/Ctrl-WASZXCV), Tab/Shift-Tab, prev/next
|
||||
;; - top: Super-num (i3/sway) or Alt-num (browser), zoom in/out
|
||||
|
||||
;; The `lrld` action stands for "live reload". This will re-parse everything
|
||||
;; except for linux-dev, i.e. you cannot live reload and switch keyboard devices.
|
||||
|
||||
(deflayer navigation
|
||||
M-1 M-2 M-3 M-4 M-5 lrld M-6 M-7 M-8 M-9 M-0
|
||||
@pad @cls bck fwd XX home pgdn pgup end @run
|
||||
@all @sav S-tab tab XX lft down up rght @fun
|
||||
@ndo @cut @cpy @pst XX _ @mwl @mwd @mwu @mwr XX
|
||||
del _ esc
|
||||
)
|
||||
|
||||
;; NumPad
|
||||
(deflayer numpad
|
||||
_ _ _ _ _ _ _ _ _ _ _
|
||||
XX home up end pgup @/ @7 @8 @9 XX
|
||||
XX lft down rght pgdn @- @4 @5 @6 @0
|
||||
XX XX XX XX XX _ @, @1 @2 @3 @.
|
||||
@std @nbs @std
|
||||
)
|
||||
|
||||
;; function keys
|
||||
(deflayer funpad
|
||||
XX XX XX XX XX XX XX XX XX XX XX
|
||||
f1 f2 f3 f4 XX XX XX XX XX XX
|
||||
f5 f6 f7 f8 XX XX lalt lctl lmet _
|
||||
f9 f10 f11 f12 XX XX XX XX XX XX XX
|
||||
_ _ _
|
||||
)
|
||||
|
||||
(defalias
|
||||
std (layer-switch base)
|
||||
pad (layer-switch numpad)
|
||||
|
||||
fun (layer-while-held funpad)
|
||||
|
||||
;; Mouse wheel emulation
|
||||
mwu (mwheel-up 50 120)
|
||||
mwd (mwheel-down 50 120)
|
||||
mwl (mwheel-left 50 120)
|
||||
mwr (mwheel-right 50 120)
|
||||
)
|
||||
|
||||
;; vim: set ft=lisp:
|
||||
|
|
@ -0,0 +1,14 @@
|
|||
;; Symbol layer: Lafayette/Ergo‑L AltGr programmation layer for the masses!
|
||||
|
||||
(deflayer symbols
|
||||
AG-1 AG-2 AG-3 AG-4 AG-5 XX AG-6 AG-7 AG-8 AG-9 AG-0
|
||||
@^ @< @> @$ @% @@ @& @* @' @`
|
||||
@{ @pl @pr @} @= @\ @+ @- @/ @''
|
||||
@~ @[ @] @_ @# XX @| @! @; @: @?
|
||||
_ spc _
|
||||
)
|
||||
|
||||
;; Note: this requires kanata 0.5+ to work properly.
|
||||
;; kanata 0.4 does not release Shift soon enough for this layer to work.
|
||||
|
||||
;; vim: set ft=lisp:
|
||||
|
|
@ -0,0 +1,26 @@
|
|||
;; Symbol layer: Lafayette/Ergo‑L AltGr programmation layer
|
||||
;; but enables a NumRow.
|
||||
|
||||
(deflayer symbols
|
||||
AG-1 AG-2 AG-3 AG-4 AG-5 XX AG-6 AG-7 AG-8 AG-9 AG-0
|
||||
@^ @< @> @$ @% @@ @& @* @' @`
|
||||
@{ @pl @pr @} @= @\ @+ @- @/ @''
|
||||
@~ @[ @] @_ @# XX @| @! @; @: @?
|
||||
@num spc _
|
||||
)
|
||||
|
||||
;; Numrow layer
|
||||
|
||||
(deflayer numrow
|
||||
_ _ _ _ _ _ _ _ _ _ _
|
||||
@s1 @s2 @s3 @s4 @s5 @s6 @s7 @s8 @s9 @s0
|
||||
@1 @2 @3 @4 @5 @6 @7 @8 @9 @0
|
||||
@dk1 @dk2 @dk3 @dk4 @dk5 _ XX @- @, @. @/
|
||||
_ @nbs @sym
|
||||
)
|
||||
|
||||
(defalias
|
||||
num (layer-toggle numrow)
|
||||
)
|
||||
|
||||
;; vim: set ft=lisp:
|
||||
|
|
@ -0,0 +1,14 @@
|
|||
;; Symbol layer: same as AltGr.
|
||||
;; Concretely this does nothing, just let AltGr as-is for keyboard layouts
|
||||
;; depending heavily on AltGr, like Bépo or simply Lafayette layouts like
|
||||
;; Ergo‑L, which already have that layer baked in.
|
||||
|
||||
(deflayer symbols
|
||||
AG-1 AG-2 AG-3 AG-4 AG-5 XX AG-6 AG-7 AG-8 AG-9 AG-0
|
||||
AG-q AG-w AG-e AG-r AG-t AG-y AG-u AG-i AG-o AG-p
|
||||
AG-a AG-s AG-d AG-f AG-g AG-h AG-j AG-k AG-l AG-;
|
||||
AG-z AG-x AG-c AG-v AG-b AG-< AG-n AG-m AG-, AG-. AG-/
|
||||
_ AG-spc _
|
||||
)
|
||||
|
||||
;; vim: set ft=lisp:
|
||||
|
|
@ -0,0 +1,29 @@
|
|||
;; Symbol layer: same as AltGr but enables a NumRow.
|
||||
;; Concretely this does nothing, just let AltGr as-is for keyboard layouts
|
||||
;; depending heavily on AltGr, like Bépo or simply Lafayette layouts like
|
||||
;; Ergo‑L, which already have that layer baked in.
|
||||
;; Except it adds an NumRow layer.
|
||||
|
||||
(deflayer symbols
|
||||
AG-1 AG-2 AG-3 AG-4 AG-5 XX AG-6 AG-7 AG-8 AG-9 AG-0
|
||||
AG-q AG-w AG-e AG-r AG-t AG-y AG-u AG-i AG-o AG-p
|
||||
AG-a AG-s AG-d AG-f AG-g AG-h AG-j AG-k AG-l AG-;
|
||||
AG-z AG-x AG-c AG-v AG-b AG-< AG-n AG-m AG-, AG-. AG-/
|
||||
@num AG-spc _
|
||||
)
|
||||
|
||||
;; Numrow layer
|
||||
|
||||
(deflayer numrow
|
||||
_ _ _ _ _ _ _ _ _ _ _
|
||||
@s1 @s2 @s3 @s4 @s5 @s6 @s7 @s8 @s9 @s0
|
||||
@1 @2 @3 @4 @5 @6 @7 @8 @9 @0
|
||||
@dk1 @dk2 @dk3 @dk4 @dk5 _ XX @- @, @. @/
|
||||
_ @nbs @sym
|
||||
)
|
||||
|
||||
(defalias
|
||||
num (layer-toggle numrow)
|
||||
)
|
||||
|
||||
;; vim: set ft=lisp:
|
||||
|
|
@ -0,0 +1,11 @@
|
|||
;; `defsrc` defines the keys that will be intercepted by kanata.
|
||||
|
||||
(defsrc
|
||||
1 2 3 4 5 bspc 6 7 8 9 0
|
||||
q w e r t y u i o p
|
||||
a s d f g h j k l ;
|
||||
z x c v b < n m , . /
|
||||
lmet spc rmet
|
||||
)
|
||||
|
||||
;; vim: set ft=lisp:
|
||||
|
|
@ -0,0 +1,11 @@
|
|||
;; angle-mod: the ISO key (a.k.a. LSGT or 102 key) becomes Z
|
||||
|
||||
(defsrc
|
||||
1 2 3 4 5 bspc 6 7 8 9 0
|
||||
q w e r t y u i o p
|
||||
a s d f g h j k l ;
|
||||
< z x c v b n m , . /
|
||||
lmet spc rmet
|
||||
)
|
||||
|
||||
;; vim: set ft=lisp:
|
||||
|
|
@ -0,0 +1,11 @@
|
|||
;; ansi-angle-mod: left shift becomes Z
|
||||
|
||||
(defsrc
|
||||
1 2 3 4 5 bspc 6 7 8 9 0
|
||||
q w e r t y u i o p
|
||||
a s d f g h j k l ;
|
||||
lsft z x c v b n m , . /
|
||||
lmet spc rmet
|
||||
)
|
||||
|
||||
;; vim: set ft=lisp:
|
||||
|
|
@ -0,0 +1,14 @@
|
|||
;; wide-angle-mod:
|
||||
;; - left shift becomes Z
|
||||
;; - the right hand is moved one key to the right
|
||||
|
||||
|
||||
(defsrc
|
||||
1 2 3 4 5 bspc 7 8 9 0 -
|
||||
q w e r t u i o p [
|
||||
a s d f g j k l ; '
|
||||
lsft z x c v b m , . / rsft
|
||||
lmet spc rmet
|
||||
)
|
||||
|
||||
;; vim: set ft=lisp:
|
||||
|
|
@ -0,0 +1,14 @@
|
|||
;; wide-angle-mod:
|
||||
;; - the ISO key (a.k.a. LSGT or 102 key) becomes Z
|
||||
;; - the right hand is moved one key to the right
|
||||
|
||||
|
||||
(defsrc
|
||||
1 2 3 4 5 bspc 7 8 9 0 -
|
||||
q w e r t u i o p [
|
||||
a s d f g j k l ; '
|
||||
< z x c v b m , . / rsft
|
||||
lmet spc rmet
|
||||
)
|
||||
|
||||
;; vim: set ft=lisp:
|
||||
|
|
@ -0,0 +1,11 @@
|
|||
;; `defsrc` defines the keys that will be intercepted by kanata.
|
||||
|
||||
(defsrc
|
||||
1 2 3 4 5 bspc 6 7 8 9 0
|
||||
q w e r t y u i o p
|
||||
a s d f g h j k l ;
|
||||
z x c v b < n m , . /
|
||||
lalt spc ralt
|
||||
)
|
||||
|
||||
;; vim: set ft=lisp:
|
||||
|
|
@ -0,0 +1,11 @@
|
|||
;; angle-mod: the ISO key (a.k.a. LSGT or 102 key) becomes Z
|
||||
|
||||
(defsrc
|
||||
1 2 3 4 5 bspc 6 7 8 9 0
|
||||
q w e r t y u i o p
|
||||
a s d f g h j k l ;
|
||||
< z x c v b n m , . /
|
||||
lalt spc ralt
|
||||
)
|
||||
|
||||
;; vim: set ft=lisp:
|
||||
|
|
@ -0,0 +1,11 @@
|
|||
;; ansi-angle-mod: left shift becomes Z
|
||||
|
||||
(defsrc
|
||||
1 2 3 4 5 bspc 6 7 8 9 0
|
||||
q w e r t y u i o p
|
||||
a s d f g h j k l ;
|
||||
lsft z x c v b n m , . /
|
||||
lalt spc ralt
|
||||
)
|
||||
|
||||
;; vim: set ft=lisp:
|
||||
|
|
@ -0,0 +1,13 @@
|
|||
;; wide-angle-mod:
|
||||
;; - left shift becomes Z
|
||||
;; - the right hand is moved one key to the right
|
||||
|
||||
(defsrc
|
||||
1 2 3 4 5 bspc 7 8 9 0 -
|
||||
q w e r t u i o p [
|
||||
a s d f g j k l ; '
|
||||
lsft z x c v b m , . / rsft
|
||||
lalt spc ralt
|
||||
)
|
||||
|
||||
;; vim: set ft=lisp:
|
||||
|
|
@ -0,0 +1,13 @@
|
|||
;; wide-angle-mod:
|
||||
;; - the ISO key (a.k.a. LSGT or 102 key) becomes Z
|
||||
;; - the right hand is moved one key to the right
|
||||
|
||||
(defsrc
|
||||
1 2 3 4 5 bspc 7 8 9 0 -
|
||||
q w e r t u i o p [
|
||||
a s d f g j k l ; '
|
||||
< z x c v b m , . / rsft
|
||||
lalt spc ralt
|
||||
)
|
||||
|
||||
;; vim: set ft=lisp:
|
||||
|
|
@ -0,0 +1,94 @@
|
|||
;;==========================================================================;;
|
||||
;; ;;
|
||||
;; With Arsenik, choose the features you want for your keyboard: ;;
|
||||
;; angle mods, Vim-like navigation layer, Mac/Azerty/Qwertz support, etc. ;;
|
||||
;; ;;
|
||||
;;==========================================================================;;
|
||||
|
||||
;; Every section is mandatory and should enable one and only one `include`
|
||||
;; - enable each feature by un-commenting the related line.
|
||||
;; - a commented line starts with ;;
|
||||
|
||||
;; Live-reload the configuration with Space+Backspace (requires layer-taps).
|
||||
|
||||
;; Timing variables for tap-hold effects.
|
||||
(defvar
|
||||
;; The key must be pressed twice in 200ms to enable repetitions.
|
||||
tap_timeout 200
|
||||
;; The key must be held 200ms to become a layer shift.
|
||||
hold_timeout 200
|
||||
;; Slightly higher value for typing keys, to prevent unexpected hold effect.
|
||||
long_hold_timeout 300
|
||||
)
|
||||
|
||||
;;-----------------------------------------------------------------------------
|
||||
;; Original key arrangement on your keyboard: Mac or PC.
|
||||
;; Choose here if you want to add an angle mod: ZXCVB are shifted to the left.
|
||||
;; See https://colemakmods.github.io/ergonomic-mods/angle.html for more details.
|
||||
|
||||
(include defsrc/pc.kbd) ;; PC, standard finger assignment
|
||||
;; (include defsrc/mac.kbd) ;; Mac, standard finger assignment
|
||||
(include defsrc/pc_anglemod.kbd) ;; PC, ZXCVB are shifted to the left
|
||||
;; (include defsrc/mac_anglemod.kbd) ;; Mac, ZXCVB are shifted to the left
|
||||
;; (include defsrc/pc_wide_anglemod.kbd) ;; PC, angle-mod + right hand shifted by one key
|
||||
;; (include defsrc/mac_wide_anglemod.kbd) ;; Mac, angle-mod + right hand shifted by one key
|
||||
|
||||
|
||||
;;-----------------------------------------------------------------------------
|
||||
;; `Base` layer: standard or dual keys? (layer-taps, homerow mods?)
|
||||
;; If you just want angle mod, you still have to enable the standard base.
|
||||
|
||||
(include deflayer/base.kbd) ;; standard keyboard behavior
|
||||
;; (include deflayer/base_lt.kbd) ;; layer-taps on both thumb keys
|
||||
;; (include deflayer/base_lt_hrm.kbd) ;; layer-taps + home-row mods
|
||||
|
||||
;; Note: not enabling layer-taps here makes the rest of the file useless.
|
||||
|
||||
|
||||
;;-----------------------------------------------------------------------------
|
||||
;; `Symbols` layer
|
||||
|
||||
(include deflayer/symbols_noop.kbd) ;; AltGr stays as-is
|
||||
;; (include deflayer/symbols_lafayette.kbd) ;; AltGr programmation layer like Ergo‑L
|
||||
;; (include deflayer/symbols_noop_num.kbd) ;; AltGr stays as-is + NumRow layers
|
||||
;; (include deflayer/symbols_lafayette_num.kbd) ;; AltGr prog layer + NumRow layers
|
||||
|
||||
|
||||
;;-----------------------------------------------------------------------------
|
||||
;; `Navigation` layer: ESDF or HJKL?
|
||||
|
||||
(include deflayer/navigation.kbd) ;; ESDF on the left, NumPad on the right
|
||||
;; (include deflayer/navigation_vim.kbd) ;; HJKL + NumPad on [Space]+[Q]
|
||||
|
||||
;; Replace XX by the keyboard shortcut of your application launcher, if any.
|
||||
;; Mapped on [Space]+[P] in both navigation layers.
|
||||
|
||||
;; (defalias run M-p) ;; [Command]-[P]
|
||||
(defalias run XX) ;; do nothing
|
||||
|
||||
|
||||
;;-----------------------------------------------------------------------------
|
||||
;; Aliases for `Symbols` and `Navigation` layers
|
||||
;; Depends on PC/Mac and keyboard layout
|
||||
|
||||
(include defalias/ergol_pc.kbd) ;; Ergo‑L PC
|
||||
;; (include defalias/qwerty-lafayette_pc.kbd) ;; Qwerty‑Lafayette PC
|
||||
;; (include defalias/qwerty_pc.kbd) ;; Qwerty / Colemak PC
|
||||
;; (include defalias/qwerty_mac.kbd) ;; Qwerty / Colemak Mac
|
||||
;; (include defalias/azerty_pc.kbd) ;; Azerty PC
|
||||
;; (include defalias/qwertz_pc.kbd) ;; Qwertz PC
|
||||
;; (include defalias/bepo_pc.kbd) ;; Bépo PC
|
||||
;; (include defalias/optimot_pc.kbd) ;; Optimot PC
|
||||
|
||||
;;-----------------------------------------------------------------------------
|
||||
;; Extra configuration
|
||||
;; You should not modify this, only if you need to.
|
||||
|
||||
(defcfg
|
||||
;; Enabled makes kanata process keys that are not defined in defsrc
|
||||
;; Fixes altgr for Windows (see Arsenik issue #22)
|
||||
process-unmapped-keys yes
|
||||
windows-altgr cancel-lctl-press
|
||||
)
|
||||
|
||||
;; vim: set ft=lisp:
|
||||
Loading…
Reference in New Issue