diff --git a/README.asciidoc b/README.asciidoc index b1f5ea5a4..bcfd4699d 100644 --- a/README.asciidoc +++ b/README.asciidoc @@ -39,6 +39,7 @@ :sc_scroll_page_up: pass:quotes[`ctrl+shift+page_up`] :sc_second_window: pass:quotes[`ctrl+shift+2`] :sc_seventh_window: pass:quotes[`ctrl+shift+7`] +:sc_show_preferences: pass:quotes[`ctrl+shift+f2`] :sc_show_scrollback: pass:quotes[`ctrl+shift+h`] :sc_sixth_window: pass:quotes[`ctrl+shift+6`] :sc_tenth_window: pass:quotes[`ctrl+shift+0`] @@ -234,6 +235,7 @@ windows are: |Input unicode character | {sc_input_unicode_character} |Click URL using the keyboard | {sc_run_simple_kitten_text_url_hints} |Pass current selection to program | {sc_pass_selection_to_program} +|Edit kitty config file| {sc_edit_config_file} |=== diff --git a/kittens/unicode_input/main.py b/kittens/unicode_input/main.py index 730052981..bf2b10acf 100644 --- a/kittens/unicode_input/main.py +++ b/kittens/unicode_input/main.py @@ -3,7 +3,6 @@ # License: GPL v3 Copyright: 2018, Kovid Goyal import os -import shlex import string import subprocess import sys @@ -11,7 +10,7 @@ from gettext import gettext as _ from kitty.config import cached_values_for -from kitty.constants import config_dir +from kitty.constants import config_dir, editor from kitty.fast_data_types import wcswidth from kitty.key_encoding import ( DOWN, ESCAPE, F1, F2, F3, F4, F12, LEFT, RELEASE, RIGHT, SHIFT, TAB, UP, @@ -426,7 +425,6 @@ def edit_favorites(self): if not os.path.exists(favorites_path): with open(favorites_path, 'wb') as f: f.write(serialize_favorites(load_favorites()).encode('utf-8')) - editor = shlex.split(os.environ.get('EDITOR', 'vim')) with self.suspend(): p = subprocess.Popen(editor + [favorites_path]) if p.wait() == 0: diff --git a/kitty/boss.py b/kitty/boss.py index 3a98a8479..fe2044919 100644 --- a/kitty/boss.py +++ b/kitty/boss.py @@ -10,8 +10,10 @@ from weakref import WeakValueDictionary from .cli import create_opts, parse_args -from .config import MINIMUM_FONT_SIZE, initial_window_size -from .constants import appname, set_boss +from .config import ( + MINIMUM_FONT_SIZE, initial_window_size, prepare_config_file_for_editing +) +from .constants import appname, editor, set_boss from .fast_data_types import ( ChildMonitor, create_os_window, current_os_window, destroy_global_data, destroy_sprite_map, get_clipboard_string, glfw_post_empty_event, @@ -410,6 +412,11 @@ def display_scrollback(self, window, data): SpecialWindow( self.opts.scrollback_pager, data, _('History'), overlay_for=window.id)) + def edit_config_file(self, *a): + confpath = prepare_config_file_for_editing() + cmd = editor + [confpath] + self.new_os_window(*cmd) + def input_unicode_character(self): w = self.active_window tab = self.active_tab diff --git a/kitty/cocoa_window.m b/kitty/cocoa_window.m index 455713a09..e9bcd56fb 100644 --- a/kitty/cocoa_window.m +++ b/kitty/cocoa_window.m @@ -59,11 +59,35 @@ return @"kitty"; } +@interface GlobalMenuTarget : NSObject ++ (GlobalMenuTarget *) shared_instance; +@end + +@implementation GlobalMenuTarget + +- (void) show_preferences : (id)sender { + (void)sender; + call_boss(edit_config_file, NULL); +} + ++ (GlobalMenuTarget *) shared_instance +{ + static GlobalMenuTarget *sharedGlobalMenuTarget = nil; + @synchronized(self) + { + if (!sharedGlobalMenuTarget) + sharedGlobalMenuTarget = [[GlobalMenuTarget alloc] init]; + return sharedGlobalMenuTarget; + } +} + +@end void cocoa_create_global_menu(void) { NSString* app_name = find_app_name(); NSMenu* bar = [[NSMenu alloc] init]; + GlobalMenuTarget *global_menu_target = [GlobalMenuTarget shared_instance]; [NSApp setMainMenu:bar]; NSMenuItem* appMenuItem = @@ -75,6 +99,9 @@ action:@selector(orderFrontStandardAboutPanel:) keyEquivalent:@""]; [appMenu addItem:[NSMenuItem separatorItem]]; + NSMenuItem* preferences_menu_item = [[NSMenuItem alloc] initWithTitle:@"Preferences..." action:@selector(show_preferences:) keyEquivalent:@","]; + [preferences_menu_item setTarget:global_menu_target]; + [appMenu addItem:preferences_menu_item]; [appMenu addItemWithTitle:[NSString stringWithFormat:@"Hide %@", app_name] action:@selector(hide:) keyEquivalent:@"h"]; @@ -124,7 +151,7 @@ setKeyEquivalentModifierMask:NSEventModifierFlagControl | NSEventModifierFlagCommand]; [NSApp setWindowsMenu:windowMenu]; [windowMenu release]; - + [preferences_menu_item release]; [bar release]; } diff --git a/kitty/config.py b/kitty/config.py index ba16e48fa..c5859c6b5 100644 --- a/kitty/config.py +++ b/kitty/config.py @@ -478,13 +478,12 @@ def commented_out_default_config(): def prepare_config_file_for_editing(): - if os.path.exists(defconf): - return - d = os.path.dirname(defconf) - try: - os.makedirs(d) - except FileExistsError: - pass - with open(defconf, 'w') as f: - f.write(commented_out_default_config) + if not os.path.exists(defconf): + d = os.path.dirname(defconf) + try: + os.makedirs(d) + except FileExistsError: + pass + with open(defconf, 'w') as f: + f.write(commented_out_default_config) return defconf diff --git a/kitty/constants.py b/kitty/constants.py index dfa515d78..3bcfef616 100644 --- a/kitty/constants.py +++ b/kitty/constants.py @@ -4,6 +4,7 @@ import os import pwd +import shlex import sys from collections import namedtuple @@ -15,6 +16,7 @@ _plat = sys.platform.lower() is_macos = 'darwin' in _plat base = os.path.dirname(os.path.abspath(__file__)) +editor = shlex.split(os.environ.get('EDITOR', 'vim')) ScreenGeometry = namedtuple('ScreenGeometry', 'xstart ystart xnum ynum dx dy') diff --git a/kitty/kitty.conf b/kitty/kitty.conf index 15b5f1888..153b741db 100644 --- a/kitty/kitty.conf +++ b/kitty/kitty.conf @@ -11,6 +11,7 @@ # # You can get a list of full family names available on your computer by running # kitty list-fonts +# The default values shown below rely on your OS to choose an appropriate monospace font family. font_family monospace italic_font auto bold_font auto @@ -341,6 +342,7 @@ map ctrl+shift+minus decrease_font_size map ctrl+shift+backspace restore_font_size map ctrl+shift+f11 toggle_fullscreen map ctrl+shift+u input_unicode_character +map ctrl+shift+f2 edit_config_file # Open a currently visible URL using the keyboard. The program used ot open the URL is specified in open_url_with. # You can customize how the URLs are detected and opened by specifying command line options to # url_hints. For example: