Implement using Ctrl+Shift+u to input unicode

Fixes #302
This commit is contained in:
Kovid Goyal 2018-02-08 22:47:17 +05:30
parent 194454715f
commit 3068846d8f
No known key found for this signature in database
GPG Key ID: 06BC317B515ACE7C
5 changed files with 37 additions and 1 deletions

View File

@ -11,6 +11,7 @@
:sc_first_window: pass:quotes[`ctrl+shift+1`] :sc_first_window: pass:quotes[`ctrl+shift+1`]
:sc_fourth_window: pass:quotes[`ctrl+shift+4`] :sc_fourth_window: pass:quotes[`ctrl+shift+4`]
:sc_increase_font_size: pass:quotes[`ctrl+shift+equal`] :sc_increase_font_size: pass:quotes[`ctrl+shift+equal`]
:sc_input_unicode_character: pass:quotes[`ctrl+shift+u`]
:sc_move_tab_backward: pass:quotes[`ctrl+shift+,`] :sc_move_tab_backward: pass:quotes[`ctrl+shift+,`]
:sc_move_tab_forward: pass:quotes[`ctrl+shift+.`] :sc_move_tab_forward: pass:quotes[`ctrl+shift+.`]
:sc_move_window_backward: pass:quotes[`ctrl+shift+b`] :sc_move_window_backward: pass:quotes[`ctrl+shift+b`]
@ -226,6 +227,7 @@ windows are:
|Decrease font size | {sc_decrease_font_size} |Decrease font size | {sc_decrease_font_size}
|Restore font size | {sc_restore_font_size} |Restore font size | {sc_restore_font_size}
|Toggle fullscreen | {sc_toggle_fullscreen} |Toggle fullscreen | {sc_toggle_fullscreen}
|Input unicode character | {sc_input_unicode_character}
|Pass current selection to program | {sc_pass_selection_to_program} |Pass current selection to program | {sc_pass_selection_to_program}
|=== |===

View File

@ -88,5 +88,5 @@ def main(args=sys.argv):
handler = UnicodeInput() handler = UnicodeInput()
loop.loop(handler) loop.loop(handler)
if handler.current_char and loop.return_code == 0: if handler.current_char and loop.return_code == 0:
print(hex(ord(handler.current_char))[2:]) print('OK:', hex(ord(handler.current_char))[2:])
raise SystemExit(loop.return_code) raise SystemExit(loop.return_code)

View File

@ -3,6 +3,7 @@
# License: GPL v3 Copyright: 2016, Kovid Goyal <kovid at kovidgoyal.net> # License: GPL v3 Copyright: 2016, Kovid Goyal <kovid at kovidgoyal.net>
import re import re
from functools import partial
from gettext import gettext as _ from gettext import gettext as _
from weakref import WeakValueDictionary from weakref import WeakValueDictionary
@ -196,6 +197,12 @@ def on_child_death(self, window_id):
window = self.window_id_map.pop(window_id, None) window = self.window_id_map.pop(window_id, None)
if window is None: if window is None:
return return
if window.action_on_close:
try:
window.action_on_close(window)
except Exception:
import traceback
traceback.print_exc()
os_window_id = window.os_window_id os_window_id = window.os_window_id
window.destroy() window.destroy()
tm = self.os_window_map.get(os_window_id) tm = self.os_window_map.get(os_window_id)
@ -366,6 +373,29 @@ def display_scrollback(self, window, data):
SpecialWindow( SpecialWindow(
self.opts.scrollback_pager, data, _('History'), overlay_for=window.id)) self.opts.scrollback_pager, data, _('History'), overlay_for=window.id))
def input_unicode_character(self):
w = self.active_window
tab = self.active_tab
if w is not None and tab is not None and w.overlay_for is None:
overlay_window = tab.new_special_window(
SpecialWindow(
['kitty', '+runpy', 'from kittens.unicode_input.main import main; main()'],
overlay_for=w.id))
overlay_window.action_on_close = partial(self.send_unicode_character, w.id)
def send_unicode_character(self, target_window_id, source_window):
w = self.window_id_map.get(target_window_id)
if w is not None:
output = str(source_window.screen.linebuf.line(0))
if output.startswith('OK: '):
try:
text = chr(int(output.partition(' ')[2], 16))
except Exception:
import traceback
traceback.print_exc()
else:
w.paste(text)
def switch_focus_to(self, window_idx): def switch_focus_to(self, window_idx):
tab = self.active_tab tab = self.active_tab
tab.set_active_window_idx(window_idx) tab.set_active_window_idx(window_idx)
@ -491,6 +521,8 @@ def new_window(self, *args):
def new_window_with_cwd(self, *args): def new_window_with_cwd(self, *args):
w = self.active_window w = self.active_window
if w is None:
return self.new_window(*args)
cwd_from = w.child.pid if w is not None else None cwd_from = w.child.pid if w is not None else None
self._new_window(args, cwd_from=cwd_from) self._new_window(args, cwd_from=cwd_from)

View File

@ -328,6 +328,7 @@ map ctrl+shift+equal increase_font_size
map ctrl+shift+minus decrease_font_size map ctrl+shift+minus decrease_font_size
map ctrl+shift+backspace restore_font_size map ctrl+shift+backspace restore_font_size
map ctrl+shift+f11 toggle_fullscreen map ctrl+shift+f11 toggle_fullscreen
map ctrl+shift+u input_unicode_character
# Sending arbitrary text on shortcut key presses # Sending arbitrary text on shortcut key presses
# You can tell kitty to send arbitrary (UTF-8) encoded text to # You can tell kitty to send arbitrary (UTF-8) encoded text to

View File

@ -87,6 +87,7 @@ def setup_colors(screen, opts):
class Window: class Window:
def __init__(self, tab, child, opts, args, override_title=None): def __init__(self, tab, child, opts, args, override_title=None):
self.action_on_close = None
self.override_title = override_title self.override_title = override_title
self.overlay_window_id = None self.overlay_window_id = None
self.overlay_for = None self.overlay_for = None