mirror of
				https://github.com/mfulz/qmk_firmware.git
				synced 2025-10-30 21:02:32 +01:00 
			
		
		
		
	CLI: Add 'cd' subcommand (#12584)
* CLI: Add 'cd' subcommand Go to your qmk_firmware dir with ease. * Fix for Windows and do not run if already under QMK Home * Make flake8 happy * Fix prompt for Windows * Make flake8 happy once again * I'll get it right eventually * Apply suggestions from code review Co-authored-by: Ryan <fauxpark@gmail.com> * Add subcommand to __init__.py and fixup after rebase * Update Windows code to use milc's run * Unify the subshell starting with os.execl * Exit with error msg when output is redirected to non-TTY. * Revert Windows-specific code Co-authored-by: Ryan <fauxpark@gmail.com>
This commit is contained in:
		
							parent
							
								
									fefd7fdc51
								
							
						
					
					
						commit
						c8b09d0d4a
					
				| @ -118,6 +118,20 @@ This command lets you configure the behavior of QMK. For the full `qmk config` d | |||||||
| qmk config [-ro] [config_token1] [config_token2] [...] [config_tokenN] | qmk config [-ro] [config_token1] [config_token2] [...] [config_tokenN] | ||||||
| ``` | ``` | ||||||
| 
 | 
 | ||||||
|  | ## `qmk cd` | ||||||
|  | 
 | ||||||
|  | This command opens a new shell in your `qmk_firmware` directory. | ||||||
|  | 
 | ||||||
|  | Note that if you are already somewhere within `QMK_HOME` (for example, the `keyboards/` folder), nothing will happen. | ||||||
|  | 
 | ||||||
|  | To exit out into the parent shell, simply type `exit`. | ||||||
|  | 
 | ||||||
|  | **Usage**: | ||||||
|  | 
 | ||||||
|  | ``` | ||||||
|  | qmk cd | ||||||
|  | ``` | ||||||
|  | 
 | ||||||
| ## `qmk console` | ## `qmk console` | ||||||
| 
 | 
 | ||||||
| This command lets you connect to keyboard consoles to get debugging messages. It only works if your keyboard firmware has been compiled with `CONSOLE_ENABLE=yes`. | This command lets you connect to keyboard consoles to get debugging messages. It only works if your keyboard firmware has been compiled with `CONSOLE_ENABLE=yes`. | ||||||
|  | |||||||
| @ -31,6 +31,7 @@ safe_commands = [ | |||||||
| subcommands = [ | subcommands = [ | ||||||
|     'qmk.cli.bux', |     'qmk.cli.bux', | ||||||
|     'qmk.cli.c2json', |     'qmk.cli.c2json', | ||||||
|  |     'qmk.cli.cd', | ||||||
|     'qmk.cli.cformat', |     'qmk.cli.cformat', | ||||||
|     'qmk.cli.chibios.confmigrate', |     'qmk.cli.chibios.confmigrate', | ||||||
|     'qmk.cli.clean', |     'qmk.cli.clean', | ||||||
|  | |||||||
							
								
								
									
										46
									
								
								lib/python/qmk/cli/cd.py
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										46
									
								
								lib/python/qmk/cli/cd.py
									
									
									
									
									
										Executable file
									
								
							| @ -0,0 +1,46 @@ | |||||||
|  | """Open a shell in the QMK Home directory | ||||||
|  | """ | ||||||
|  | import sys | ||||||
|  | import os | ||||||
|  | 
 | ||||||
|  | from milc import cli | ||||||
|  | 
 | ||||||
|  | from qmk.path import under_qmk_firmware | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | @cli.subcommand('Go to QMK Home') | ||||||
|  | def cd(cli): | ||||||
|  |     """Go to QMK Home | ||||||
|  |     """ | ||||||
|  |     if not sys.stdout.isatty(): | ||||||
|  |         cli.log.error("This command is for interactive usage only. For non-interactive usage, 'cd $(qmk env QMK_HOME)' is more robust.") | ||||||
|  |         sys.exit(1) | ||||||
|  | 
 | ||||||
|  |     if not under_qmk_firmware(): | ||||||
|  |         # Only do anything if the user is not under qmk_firmware already | ||||||
|  |         # in order to reduce the possibility of starting multiple shells | ||||||
|  |         cli.log.info("Spawning a subshell in your QMK_HOME directory.") | ||||||
|  |         cli.log.info("Type 'exit' to get back to the parent shell.") | ||||||
|  |         if not cli.platform.lower().startswith('windows'): | ||||||
|  |             # For Linux/Mac/etc | ||||||
|  |             # Check the user's login shell from 'passwd' | ||||||
|  |             # alternatively fall back to $SHELL env var | ||||||
|  |             # and finally to '/bin/bash'. | ||||||
|  |             import getpass | ||||||
|  |             import pwd | ||||||
|  |             shell = pwd.getpwnam(getpass.getuser()).pw_shell | ||||||
|  |             if not shell: | ||||||
|  |                 shell = os.environ.get('SHELL', '/bin/bash') | ||||||
|  |             # Start the new subshell | ||||||
|  |             os.execl(shell, shell) | ||||||
|  |         else: | ||||||
|  |             # For Windows | ||||||
|  |             # Check the $SHELL env var | ||||||
|  |             # and fall back to '/usr/bin/bash'. | ||||||
|  |             qmk_env = os.environ.copy() | ||||||
|  |             # Set the prompt for the new shell | ||||||
|  |             qmk_env['MSYS2_PS1'] = qmk_env['PS1'] | ||||||
|  |             # Start the new subshell | ||||||
|  |             cli.run([os.environ.get('SHELL', '/usr/bin/bash')], env=qmk_env) | ||||||
|  |     else: | ||||||
|  |         cli.log.info("Already within qmk_firmware directory.") | ||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Erovia
						Erovia