2019-09-10 12:14:25 +00:00
""" This script automates the copying of the default keymap into your own keymap.
"""
2024-11-21 06:18:51 +00:00
import re
2019-09-10 12:14:25 +00:00
import shutil
2022-12-03 12:04:06 +00:00
from milc import cli
from milc . questions import question
2023-11-27 20:53:43 +00:00
from qmk . constants import HAS_QMK_USERSPACE , QMK_USERSPACE
2023-05-19 06:05:43 +00:00
from qmk . path import is_keyboard , keymaps , keymap
2022-12-03 12:04:06 +00:00
from qmk . git import git_get_username
2020-03-13 22:47:04 +00:00
from qmk . decorators import automagic_keyboard , automagic_keymap
2021-04-15 02:00:22 +00:00
from qmk . keyboard import keyboard_completer , keyboard_folder
2023-11-27 20:53:43 +00:00
from qmk . userspace import UserspaceDefs
2022-12-03 12:04:06 +00:00
2024-11-21 06:18:51 +00:00
def validate_keymap_name ( name ) :
""" Returns True if the given keymap name contains only a-z, 0-9 and underscore characters.
"""
regex = re . compile ( r ' ^[a-zA-Z0-9][a-zA-Z0-9_]+$ ' )
return bool ( regex . match ( name ) )
2022-12-03 12:04:06 +00:00
def prompt_keyboard ( ) :
prompt = """ {fg_yellow} Select Keyboard {style_reset_all}
If you ` re unsure you can view a full list of supported keyboards with { fg_yellow } qmk list - keyboards { style_reset_all } .
Keyboard Name ? """
return question ( prompt )
def prompt_user ( ) :
prompt = """
{ fg_yellow } Name Your Keymap { style_reset_all }
Used for maintainer , copyright , etc
Your GitHub Username ? """
return question ( prompt , default = git_get_username ( ) )
2019-09-10 12:14:25 +00:00
2021-04-15 02:00:22 +00:00
@cli.argument ( ' -kb ' , ' --keyboard ' , type = keyboard_folder , completer = keyboard_completer , help = ' Specify keyboard name. Example: 1upkeyboards/1up60hse ' )
2019-09-22 20:25:33 +00:00
@cli.argument ( ' -km ' , ' --keymap ' , help = ' Specify the name for the new keymap directory ' )
@cli.subcommand ( ' Creates a new keymap for the keyboard of your choosing ' )
2020-03-13 22:47:04 +00:00
@automagic_keyboard
@automagic_keymap
2019-09-22 20:25:33 +00:00
def new_keymap ( cli ) :
2019-09-10 12:14:25 +00:00
""" Creates a new keymap for the keyboard of your choosing.
"""
2022-12-03 12:04:06 +00:00
cli . log . info ( ' {style_bright} Generating a new keymap {style_normal} ' )
cli . echo ( ' ' )
2019-09-10 12:14:25 +00:00
2022-12-03 12:04:06 +00:00
# ask for user input if keyboard or keymap was not provided in the command line
kb_name = cli . config . new_keymap . keyboard if cli . config . new_keymap . keyboard else prompt_keyboard ( )
user_name = cli . config . new_keymap . keymap if cli . config . new_keymap . keymap else prompt_user ( )
2019-09-10 12:14:25 +00:00
# check directories
2022-12-03 12:04:06 +00:00
if not is_keyboard ( kb_name ) :
cli . log . error ( f ' Keyboard {{ fg_cyan }} { kb_name } {{ fg_reset }} does not exist! Please choose a valid name. ' )
2020-10-06 23:46:10 +00:00
return False
2020-02-17 19:42:11 +00:00
2022-12-03 12:04:06 +00:00
# generate keymap paths
2023-05-19 06:05:43 +00:00
keymaps_dirs = keymaps ( kb_name )
keymap_path_default = keymap ( kb_name , ' default ' )
keymap_path_new = keymaps_dirs [ 0 ] / user_name
2022-12-03 12:04:06 +00:00
2020-02-17 19:42:11 +00:00
if not keymap_path_default . exists ( ) :
2022-12-03 12:04:06 +00:00
cli . log . error ( f ' Default keymap {{ fg_cyan }} { keymap_path_default } {{ fg_reset }} does not exist! ' )
2020-10-06 23:46:10 +00:00
return False
2020-02-17 19:42:11 +00:00
2024-11-21 06:18:51 +00:00
if not validate_keymap_name ( user_name ) :
cli . log . error ( ' Keymap names must contain only {fg_cyan} a-z {fg_reset} , {fg_cyan} 0-9 {fg_reset} and {fg_cyan} _ {fg_reset} ! Please choose a different name. ' )
return False
2020-02-17 19:42:11 +00:00
if keymap_path_new . exists ( ) :
2022-12-03 12:04:06 +00:00
cli . log . error ( f ' Keymap {{ fg_cyan }} { user_name } {{ fg_reset }} already exists! Please choose a different name. ' )
2020-10-06 23:46:10 +00:00
return False
2019-09-10 12:14:25 +00:00
# create user directory with default keymap files
2020-04-18 20:00:56 +00:00
shutil . copytree ( keymap_path_default , keymap_path_new , symlinks = True )
2019-09-10 12:14:25 +00:00
# end message to user
2022-12-03 12:04:06 +00:00
cli . log . info ( f ' {{ fg_green }} Created a new keymap called {{ fg_cyan }} { user_name } {{ fg_green }} in: {{ fg_cyan }} { keymap_path_new } . {{ fg_reset }} ' )
cli . log . info ( f " Compile a firmware with your new keymap by typing: {{ fg_yellow }} qmk compile -kb { kb_name } -km { user_name } {{ fg_reset }} . " )
2023-11-27 20:53:43 +00:00
# Add to userspace compile if we have userspace available
if HAS_QMK_USERSPACE :
userspace = UserspaceDefs ( QMK_USERSPACE / ' qmk.json ' )
userspace . add_target ( keyboard = kb_name , keymap = user_name , do_print = False )
return userspace . save ( )