keymap.py 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. """This script automates the copying of the default keymap into your own keymap.
  2. """
  3. import re
  4. import shutil
  5. from milc import cli
  6. from milc.questions import question
  7. from qmk.constants import HAS_QMK_USERSPACE, QMK_USERSPACE
  8. from qmk.path import is_keyboard, keymaps, keymap
  9. from qmk.git import git_get_username
  10. from qmk.decorators import automagic_keyboard, automagic_keymap
  11. from qmk.keyboard import keyboard_completer, keyboard_folder
  12. from qmk.userspace import UserspaceDefs
  13. def validate_keymap_name(name):
  14. """Returns True if the given keymap name contains only a-z, 0-9 and underscore characters.
  15. """
  16. regex = re.compile(r'^[a-zA-Z0-9][a-zA-Z0-9_]+$')
  17. return bool(regex.match(name))
  18. def prompt_keyboard():
  19. prompt = """{fg_yellow}Select Keyboard{style_reset_all}
  20. If you`re unsure you can view a full list of supported keyboards with {fg_yellow}qmk list-keyboards{style_reset_all}.
  21. Keyboard Name? """
  22. return question(prompt)
  23. def prompt_user():
  24. prompt = """
  25. {fg_yellow}Name Your Keymap{style_reset_all}
  26. Used for maintainer, copyright, etc
  27. Your GitHub Username? """
  28. return question(prompt, default=git_get_username())
  29. @cli.argument('-kb', '--keyboard', type=keyboard_folder, completer=keyboard_completer, help='Specify keyboard name. Example: 1upkeyboards/1up60hse')
  30. @cli.argument('-km', '--keymap', help='Specify the name for the new keymap directory')
  31. @cli.subcommand('Creates a new keymap for the keyboard of your choosing')
  32. @automagic_keyboard
  33. @automagic_keymap
  34. def new_keymap(cli):
  35. """Creates a new keymap for the keyboard of your choosing.
  36. """
  37. cli.log.info('{style_bright}Generating a new keymap{style_normal}')
  38. cli.echo('')
  39. # ask for user input if keyboard or keymap was not provided in the command line
  40. kb_name = cli.config.new_keymap.keyboard if cli.config.new_keymap.keyboard else prompt_keyboard()
  41. user_name = cli.config.new_keymap.keymap if cli.config.new_keymap.keymap else prompt_user()
  42. # check directories
  43. if not is_keyboard(kb_name):
  44. cli.log.error(f'Keyboard {{fg_cyan}}{kb_name}{{fg_reset}} does not exist! Please choose a valid name.')
  45. return False
  46. # generate keymap paths
  47. keymaps_dirs = keymaps(kb_name)
  48. keymap_path_default = keymap(kb_name, 'default')
  49. keymap_path_new = keymaps_dirs[0] / user_name
  50. if not keymap_path_default.exists():
  51. cli.log.error(f'Default keymap {{fg_cyan}}{keymap_path_default}{{fg_reset}} does not exist!')
  52. return False
  53. if not validate_keymap_name(user_name):
  54. 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.')
  55. return False
  56. if keymap_path_new.exists():
  57. cli.log.error(f'Keymap {{fg_cyan}}{user_name}{{fg_reset}} already exists! Please choose a different name.')
  58. return False
  59. # create user directory with default keymap files
  60. shutil.copytree(keymap_path_default, keymap_path_new, symlinks=True)
  61. # end message to user
  62. 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}}')
  63. 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}}.")
  64. # Add to userspace compile if we have userspace available
  65. if HAS_QMK_USERSPACE:
  66. userspace = UserspaceDefs(QMK_USERSPACE / 'qmk.json')
  67. userspace.add_target(keyboard=kb_name, keymap=user_name, do_print=False)
  68. return userspace.save()