Port new_keyboard.sh to CLI (#13706)
Co-authored-by: Erovia <Erovia@users.noreply.github.com>
This commit is contained in:
parent
770a525425
commit
b021c2f2c5
7 changed files with 208 additions and 56 deletions
|
@ -280,12 +280,12 @@ qmk list-keymaps -kb planck/ez
|
||||||
|
|
||||||
This command creates a new keyboard based on available templates.
|
This command creates a new keyboard based on available templates.
|
||||||
|
|
||||||
This command will prompt for input to guide you though the generation process.
|
Any arguments that are not provided will prompt for input. If `-u` is not passed and `user.name` is set in .gitconfig, it will be used as the default username in the prompt.
|
||||||
|
|
||||||
**Usage**:
|
**Usage**:
|
||||||
|
|
||||||
```
|
```
|
||||||
qmk new-keyboard
|
qmk new-keyboard [-kb KEYBOARD] [-t {avr,ps2avrgb}] -u USERNAME
|
||||||
```
|
```
|
||||||
|
|
||||||
## `qmk new-keymap`
|
## `qmk new-keymap`
|
||||||
|
|
|
@ -6,26 +6,28 @@ Si aún no lo has hecho, debes leer las [Pautas de teclados](hardware_keyboard_g
|
||||||
|
|
||||||
## Añadir tu Teclado AVR a QMK
|
## Añadir tu Teclado AVR a QMK
|
||||||
|
|
||||||
QMK tiene varias características para simplificar el trabajo con teclados AVR. Para la mayoría de los teclados no tienes que escribir ni una sola línea de código. Para empezar, ejecuta el archivo `util/new_keyboard.sh`:
|
QMK tiene varias características para simplificar el trabajo con teclados AVR. Para la mayoría de los teclados no tienes que escribir ni una sola línea de código. Para empezar, ejecuta `qmk new-keyboard`:
|
||||||
|
|
||||||
```
|
```
|
||||||
$ ./util/new_keyboard.sh
|
$ qmk new-keyboard
|
||||||
Generating a new QMK keyboard directory
|
Ψ Generating a new QMK keyboard directory
|
||||||
|
|
||||||
Keyboard Name: mycoolkb
|
Keyboard Name: mycoolkeeb
|
||||||
Keyboard Type [avr]:
|
Keyboard Type:
|
||||||
Your Name [John Smith]:
|
1. avr
|
||||||
|
2. ps2avrgb
|
||||||
|
Please enter your choice: [1]
|
||||||
|
Your Name: [John Smith]
|
||||||
|
Ψ Copying base template files...
|
||||||
|
Ψ Copying avr template files...
|
||||||
|
Ψ Renaming keyboard.[ch] to mycoolkeeb.[ch]...
|
||||||
|
Ψ Replacing %YEAR% with 2021...
|
||||||
|
Ψ Replacing %KEYBOARD% with mycoolkeeb...
|
||||||
|
Ψ Replacing %YOUR_NAME% with John Smith...
|
||||||
|
|
||||||
Copying base template files... done
|
Ψ Created a new keyboard called mycoolkeeb.
|
||||||
Copying avr template files... done
|
Ψ To start working on things, `cd` into keyboards/mycoolkeeb,
|
||||||
Renaming keyboard files... done
|
Ψ or open the directory in your preferred text editor.
|
||||||
Replacing %KEYBOARD% with mycoolkb... done
|
|
||||||
Replacing %YOUR_NAME% with John Smith... done
|
|
||||||
|
|
||||||
Created a new keyboard called mycoolkb.
|
|
||||||
|
|
||||||
To start working on things, cd into keyboards/mycoolkb,
|
|
||||||
or open the directory in your favourite text editor.
|
|
||||||
```
|
```
|
||||||
|
|
||||||
Esto creará todos los archivos necesarios para tu nuevo teclado, y rellenará la configuración con valores predeterminados. Ahora sólo tienes que personalizarlo para tu teclado.
|
Esto creará todos los archivos necesarios para tu nuevo teclado, y rellenará la configuración con valores predeterminados. Ahora sólo tienes que personalizarlo para tu teclado.
|
||||||
|
|
|
@ -6,26 +6,28 @@ If you have not yet you should read the [Keyboard Guidelines](hardware_keyboard_
|
||||||
|
|
||||||
## Adding Your AVR Keyboard to QMK
|
## Adding Your AVR Keyboard to QMK
|
||||||
|
|
||||||
QMK has a number of features to simplify working with AVR keyboards. For most keyboards you don't have to write a single line of code. To get started, run the `util/new_keyboard.sh` script:
|
QMK has a number of features to simplify working with AVR keyboards. For most keyboards you don't have to write a single line of code. To get started, run `qmk new-keyboard`:
|
||||||
|
|
||||||
```
|
```
|
||||||
$ ./util/new_keyboard.sh
|
$ qmk new-keyboard
|
||||||
Generating a new QMK keyboard directory
|
Ψ Generating a new QMK keyboard directory
|
||||||
|
|
||||||
Keyboard Name: mycoolkb
|
Keyboard Name: mycoolkeeb
|
||||||
Keyboard Type [avr]:
|
Keyboard Type:
|
||||||
Your Name [John Smith]:
|
1. avr
|
||||||
|
2. ps2avrgb
|
||||||
|
Please enter your choice: [1]
|
||||||
|
Your Name: [John Smith]
|
||||||
|
Ψ Copying base template files...
|
||||||
|
Ψ Copying avr template files...
|
||||||
|
Ψ Renaming keyboard.[ch] to mycoolkeeb.[ch]...
|
||||||
|
Ψ Replacing %YEAR% with 2021...
|
||||||
|
Ψ Replacing %KEYBOARD% with mycoolkeeb...
|
||||||
|
Ψ Replacing %YOUR_NAME% with John Smith...
|
||||||
|
|
||||||
Copying base template files... done
|
Ψ Created a new keyboard called mycoolkeeb.
|
||||||
Copying avr template files... done
|
Ψ To start working on things, `cd` into keyboards/mycoolkeeb,
|
||||||
Renaming keyboard files... done
|
Ψ or open the directory in your preferred text editor.
|
||||||
Replacing %KEYBOARD% with mycoolkb... done
|
|
||||||
Replacing %YOUR_NAME% with John Smith... done
|
|
||||||
|
|
||||||
Created a new keyboard called mycoolkb.
|
|
||||||
|
|
||||||
To start working on things, cd into keyboards/mycoolkb,
|
|
||||||
or open the directory in your favourite text editor.
|
|
||||||
```
|
```
|
||||||
|
|
||||||
This will create all the files needed to support your new keyboard, and populate the settings with default values. Now you just need to customize it for your keyboard.
|
This will create all the files needed to support your new keyboard, and populate the settings with default values. Now you just need to customize it for your keyboard.
|
||||||
|
|
|
@ -12,26 +12,28 @@
|
||||||
|
|
||||||
## AVR を使用したキーボードを QMK に追加する
|
## AVR を使用したキーボードを QMK に追加する
|
||||||
|
|
||||||
QMK には AVR を使ったキーボードでの作業を簡略化するための機能が多数あります。大体のキーボードでは1行もコードを書く必要がありません。まずはじめに、`util/new_keyboard.sh` スクリプトを実行します。
|
QMK には AVR を使ったキーボードでの作業を簡略化するための機能が多数あります。大体のキーボードでは1行もコードを書く必要がありません。まずはじめに、`qmk new-keyboard` を実行します。
|
||||||
|
|
||||||
```
|
```
|
||||||
$ ./util/new_keyboard.sh
|
$ qmk new-keyboard
|
||||||
Generating a new QMK keyboard directory
|
Ψ Generating a new QMK keyboard directory
|
||||||
|
|
||||||
Keyboard Name: mycoolkb
|
Keyboard Name: mycoolkeeb
|
||||||
Keyboard Type [avr]:
|
Keyboard Type:
|
||||||
Your Name [John Smith]:
|
1. avr
|
||||||
|
2. ps2avrgb
|
||||||
|
Please enter your choice: [1]
|
||||||
|
Your Name: [John Smith]
|
||||||
|
Ψ Copying base template files...
|
||||||
|
Ψ Copying avr template files...
|
||||||
|
Ψ Renaming keyboard.[ch] to mycoolkeeb.[ch]...
|
||||||
|
Ψ Replacing %YEAR% with 2021...
|
||||||
|
Ψ Replacing %KEYBOARD% with mycoolkeeb...
|
||||||
|
Ψ Replacing %YOUR_NAME% with John Smith...
|
||||||
|
|
||||||
Copying base template files... done
|
Ψ Created a new keyboard called mycoolkeeb.
|
||||||
Copying avr template files... done
|
Ψ To start working on things, `cd` into keyboards/mycoolkeeb,
|
||||||
Renaming keyboard files... done
|
Ψ or open the directory in your preferred text editor.
|
||||||
Replacing %KEYBOARD% with mycoolkb... done
|
|
||||||
Replacing %YOUR_NAME% with John Smith... done
|
|
||||||
|
|
||||||
Created a new keyboard called mycoolkb.
|
|
||||||
|
|
||||||
To start working on things, cd into keyboards/mycoolkb,
|
|
||||||
or open the directory in your favourite text editor.
|
|
||||||
```
|
```
|
||||||
|
|
||||||
これにより、新しいキーボードをサポートするために必要なすべてのファイルが作成され、デフォルト値で設定が入力されます。あとはあなたのキーボード用にカスタマイズするだけです。
|
これにより、新しいキーボードをサポートするために必要なすべてのファイルが作成され、デフォルト値で設定が入力されます。あとはあなたのキーボード用にカスタマイズするだけです。
|
||||||
|
|
|
@ -1,11 +1,142 @@
|
||||||
"""This script automates the creation of keyboards.
|
"""This script automates the creation of new keyboard directories using a starter template.
|
||||||
"""
|
"""
|
||||||
|
from datetime import date
|
||||||
|
import fileinput
|
||||||
|
from pathlib import Path
|
||||||
|
import re
|
||||||
|
import shutil
|
||||||
|
|
||||||
|
from qmk.commands import git_get_username
|
||||||
|
import qmk.path
|
||||||
from milc import cli
|
from milc import cli
|
||||||
|
from milc.questions import choice, question
|
||||||
|
|
||||||
|
KEYBOARD_TYPES = ['avr', 'ps2avrgb']
|
||||||
|
|
||||||
|
|
||||||
@cli.subcommand('Creates a new keyboard')
|
def keyboard_name(name):
|
||||||
def new_keyboard(cli):
|
"""Callable for argparse validation.
|
||||||
"""Creates a new keyboard
|
|
||||||
"""
|
"""
|
||||||
# TODO: replace this bodge to the existing script
|
if not validate_keyboard_name(name):
|
||||||
cli.run(['util/new_keyboard.sh'], stdin=None, capture_output=False)
|
raise ValueError
|
||||||
|
return name
|
||||||
|
|
||||||
|
|
||||||
|
def validate_keyboard_name(name):
|
||||||
|
"""Returns True if the given keyboard name contains only lowercase a-z, 0-9 and underscore characters.
|
||||||
|
"""
|
||||||
|
regex = re.compile(r'^[a-z0-9][a-z0-9/_]+$')
|
||||||
|
return bool(regex.match(name))
|
||||||
|
|
||||||
|
|
||||||
|
@cli.argument('-kb', '--keyboard', help='Specify the name for the new keyboard directory', arg_only=True, type=keyboard_name)
|
||||||
|
@cli.argument('-t', '--type', help='Specify the keyboard type', arg_only=True, choices=KEYBOARD_TYPES)
|
||||||
|
@cli.argument('-u', '--username', help='Specify your username (default from Git config)', arg_only=True)
|
||||||
|
@cli.subcommand('Creates a new keyboard directory')
|
||||||
|
def new_keyboard(cli):
|
||||||
|
"""Creates a new keyboard.
|
||||||
|
"""
|
||||||
|
cli.log.info('{style_bright}Generating a new QMK keyboard directory{style_normal}')
|
||||||
|
cli.echo('')
|
||||||
|
|
||||||
|
# Get keyboard name
|
||||||
|
new_keyboard_name = None
|
||||||
|
while not new_keyboard_name:
|
||||||
|
new_keyboard_name = cli.args.keyboard if cli.args.keyboard else question('Keyboard Name:')
|
||||||
|
if not validate_keyboard_name(new_keyboard_name):
|
||||||
|
cli.log.error('Keyboard names must contain only {fg_cyan}lowercase a-z{fg_reset}, {fg_cyan}0-9{fg_reset}, and {fg_cyan}_{fg_reset}! Please choose a different name.')
|
||||||
|
|
||||||
|
# Exit if passed by arg
|
||||||
|
if cli.args.keyboard:
|
||||||
|
return False
|
||||||
|
|
||||||
|
new_keyboard_name = None
|
||||||
|
continue
|
||||||
|
|
||||||
|
keyboard_path = qmk.path.keyboard(new_keyboard_name)
|
||||||
|
if keyboard_path.exists():
|
||||||
|
cli.log.error(f'Keyboard {{fg_cyan}}{new_keyboard_name}{{fg_reset}} already exists! Please choose a different name.')
|
||||||
|
|
||||||
|
# Exit if passed by arg
|
||||||
|
if cli.args.keyboard:
|
||||||
|
return False
|
||||||
|
|
||||||
|
new_keyboard_name = None
|
||||||
|
|
||||||
|
# Get keyboard type
|
||||||
|
keyboard_type = cli.args.type if cli.args.type else choice('Keyboard Type:', KEYBOARD_TYPES, default=0)
|
||||||
|
|
||||||
|
# Get username
|
||||||
|
user_name = None
|
||||||
|
while not user_name:
|
||||||
|
user_name = question('Your Name:', default=find_user_name())
|
||||||
|
|
||||||
|
if not user_name:
|
||||||
|
cli.log.error('You didn\'t provide a username, and we couldn\'t find one set in your QMK or Git configs. Please try again.')
|
||||||
|
|
||||||
|
# Exit if passed by arg
|
||||||
|
if cli.args.username:
|
||||||
|
return False
|
||||||
|
|
||||||
|
# Copy all the files
|
||||||
|
copy_templates(keyboard_type, keyboard_path)
|
||||||
|
|
||||||
|
# Replace all the placeholders
|
||||||
|
keyboard_basename = keyboard_path.name
|
||||||
|
replacements = [
|
||||||
|
('%YEAR%', str(date.today().year)),
|
||||||
|
('%KEYBOARD%', keyboard_basename),
|
||||||
|
('%YOUR_NAME%', user_name),
|
||||||
|
]
|
||||||
|
filenames = [
|
||||||
|
keyboard_path / 'config.h',
|
||||||
|
keyboard_path / 'info.json',
|
||||||
|
keyboard_path / 'readme.md',
|
||||||
|
keyboard_path / f'{keyboard_basename}.c',
|
||||||
|
keyboard_path / f'{keyboard_basename}.h',
|
||||||
|
keyboard_path / 'keymaps/default/readme.md',
|
||||||
|
keyboard_path / 'keymaps/default/keymap.c',
|
||||||
|
]
|
||||||
|
replace_placeholders(replacements, filenames)
|
||||||
|
|
||||||
|
cli.echo('')
|
||||||
|
cli.log.info(f'{{fg_green}}Created a new keyboard called {{fg_cyan}}{new_keyboard_name}{{fg_green}}.{{fg_reset}}')
|
||||||
|
cli.log.info(f'To start working on things, `cd` into {{fg_cyan}}{keyboard_path}{{fg_reset}},')
|
||||||
|
cli.log.info('or open the directory in your preferred text editor.')
|
||||||
|
|
||||||
|
|
||||||
|
def find_user_name():
|
||||||
|
if cli.args.username:
|
||||||
|
return cli.args.username
|
||||||
|
elif cli.config.user.name:
|
||||||
|
return cli.config.user.name
|
||||||
|
else:
|
||||||
|
return git_get_username()
|
||||||
|
|
||||||
|
|
||||||
|
def copy_templates(keyboard_type, keyboard_path):
|
||||||
|
"""Copies the template files from quantum/template to the new keyboard directory.
|
||||||
|
"""
|
||||||
|
template_base_path = Path('quantum/template')
|
||||||
|
keyboard_basename = keyboard_path.name
|
||||||
|
|
||||||
|
cli.log.info('Copying base template files...')
|
||||||
|
shutil.copytree(template_base_path / 'base', keyboard_path)
|
||||||
|
|
||||||
|
cli.log.info(f'Copying {{fg_cyan}}{keyboard_type}{{fg_reset}} template files...')
|
||||||
|
shutil.copytree(template_base_path / keyboard_type, keyboard_path, dirs_exist_ok=True)
|
||||||
|
|
||||||
|
cli.log.info(f'Renaming {{fg_cyan}}keyboard.[ch]{{fg_reset}} to {{fg_cyan}}{keyboard_basename}.[ch]{{fg_reset}}...')
|
||||||
|
shutil.move(keyboard_path / 'keyboard.c', keyboard_path / f'{keyboard_basename}.c')
|
||||||
|
shutil.move(keyboard_path / 'keyboard.h', keyboard_path / f'{keyboard_basename}.h')
|
||||||
|
|
||||||
|
|
||||||
|
def replace_placeholders(replacements, filenames):
|
||||||
|
"""Replaces the given placeholders in each template file.
|
||||||
|
"""
|
||||||
|
for replacement in replacements:
|
||||||
|
cli.log.info(f'Replacing {{fg_cyan}}{replacement[0]}{{fg_reset}} with {{fg_cyan}}{replacement[1]}{{fg_reset}}...')
|
||||||
|
|
||||||
|
with fileinput.input(files=filenames, inplace=True) as file:
|
||||||
|
for line in file:
|
||||||
|
print(line.replace(replacement[0], replacement[1]), end='')
|
||||||
|
|
|
@ -240,6 +240,15 @@ def parse_configurator_json(configurator_file):
|
||||||
return user_keymap
|
return user_keymap
|
||||||
|
|
||||||
|
|
||||||
|
def git_get_username():
|
||||||
|
"""Retrieves user's username from Git config, if set.
|
||||||
|
"""
|
||||||
|
git_username = cli.run(['git', 'config', '--get', 'user.name'])
|
||||||
|
|
||||||
|
if git_username.returncode == 0 and git_username.stdout:
|
||||||
|
return git_username.stdout.strip()
|
||||||
|
|
||||||
|
|
||||||
def git_check_repo():
|
def git_check_repo():
|
||||||
"""Checks that the .git directory exists inside QMK_HOME.
|
"""Checks that the .git directory exists inside QMK_HOME.
|
||||||
|
|
||||||
|
|
|
@ -129,6 +129,12 @@ if [ ! -d "quantum" ]; then
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
echo_bold "########################################"
|
||||||
|
echo_bold "# NOTICE #"
|
||||||
|
echo_bold "# This script has been deprecated. #"
|
||||||
|
echo_bold "# Please use qmk new-keyboard instead. #"
|
||||||
|
echo_bold "########################################"
|
||||||
|
echo
|
||||||
echo_bold "Generating a new QMK keyboard directory"
|
echo_bold "Generating a new QMK keyboard directory"
|
||||||
echo
|
echo
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue