Skip to content

Instantly share code, notes, and snippets.

@nedsociety
Last active September 22, 2021 14:19
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save nedsociety/91041691d0ac18bc8fd9e937ad21b055 to your computer and use it in GitHub Desktop.
Save nedsociety/91041691d0ac18bc8fd9e937ad21b055 to your computer and use it in GitHub Desktop.
Windows: add xonsh to the right click context menu
# Registers xonsh to the context menu (right click) on folders for Windows.
# Run following command line from WITHIN xonsh:
#
# $ exec(__import__('urllib.request').request.urlopen(r'https://gist.githubusercontent.com/nedsociety/91041691d0ac18bc8fd9e937ad21b055/raw/xonsh_context_menu.py').read());xonsh_register_right_click()
#
# To uninstall, run following command line from WITHIN xonsh:
#
# $ exec(__import__('urllib.request').request.urlopen(r'https://gist.githubusercontent.com/nedsociety/91041691d0ac18bc8fd9e937ad21b055/raw/xonsh_context_menu.py').read());xonsh_unregister_right_click()
#
# Q. Why do we need to run it inside xonsh?
# A. If xonsh is running on virtualenv then we need to point it in registry. This is trivial to detect from within (via sys.executable).
import winreg
import sys
def xonsh_register_right_click():
def ensure_registry_key(root, k):
elements = k.split('\\')
for i in range(1, len(elements)):
key_to_check = '\\'.join(elements[:i])
with winreg.CreateKey(root, key_to_check):
pass
def create_registry_key_and_set_default_value(root, k, v):
ensure_registry_key(root, k)
with winreg.CreateKey(root, k) as hkey:
winreg.SetValueEx(hkey, '', None, winreg.REG_SZ, v)
cmdline = r"""
"%s" -c "(lambda path=__import__('sys').path: path.remove('') if '' in path else None)(); __import__('os').chdir(r'%%V'); __import__('xonsh.main').main.main()"
""".strip() % sys.executable
# For right-clicking background
create_registry_key_and_set_default_value(winreg.HKEY_CURRENT_USER, r'Software\Classes\Directory\Background\shell\xonsh', r'Open &xonsh window here')
create_registry_key_and_set_default_value(winreg.HKEY_CURRENT_USER, r'Software\Classes\Directory\Background\shell\xonsh\command', cmdline)
# For right-clicking folder
create_registry_key_and_set_default_value(winreg.HKEY_CURRENT_USER, r'Software\Classes\Directory\shell\xonsh', r'Open &xonsh window here')
create_registry_key_and_set_default_value(winreg.HKEY_CURRENT_USER, r'Software\Classes\Directory\shell\xonsh\command', cmdline)
def xonsh_unregister_right_click():
def try_delete_registry_key(root, k):
try:
winreg.DeleteKey(root, k)
except FileNotFoundError:
pass
try_delete_registry_key(winreg.HKEY_CURRENT_USER, r'Software\Classes\Directory\shell\xonsh\command')
try_delete_registry_key(winreg.HKEY_CURRENT_USER, r'Software\Classes\Directory\shell\xonsh')
try_delete_registry_key(winreg.HKEY_CURRENT_USER, r'Software\Classes\Directory\Background\shell\xonsh\command')
try_delete_registry_key(winreg.HKEY_CURRENT_USER, r'Software\Classes\Directory\Background\shell\xonsh')
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment