Allow clicking URLs via keybaord hints by pressing ctrl+shift+e
This commit is contained in:
parent
9f52d427e5
commit
51e3e9997c
@ -30,6 +30,7 @@
|
|||||||
:sc_previous_tab: pass:quotes[`ctrl+shift+left`]
|
:sc_previous_tab: pass:quotes[`ctrl+shift+left`]
|
||||||
:sc_previous_window: pass:quotes[`ctrl+shift+[`]
|
:sc_previous_window: pass:quotes[`ctrl+shift+[`]
|
||||||
:sc_restore_font_size: pass:quotes[`ctrl+shift+backspace`]
|
:sc_restore_font_size: pass:quotes[`ctrl+shift+backspace`]
|
||||||
|
:sc_run_simple_kitten_text_url_hints: pass:quotes[`ctrl+shift+e`]
|
||||||
:sc_scroll_end: pass:quotes[`ctrl+shift+end`]
|
:sc_scroll_end: pass:quotes[`ctrl+shift+end`]
|
||||||
:sc_scroll_home: pass:quotes[`ctrl+shift+home`]
|
:sc_scroll_home: pass:quotes[`ctrl+shift+home`]
|
||||||
:sc_scroll_line_down: pass:quotes[`ctrl+shift+down` or `ctrl+shift+j`]
|
:sc_scroll_line_down: pass:quotes[`ctrl+shift+down` or `ctrl+shift+j`]
|
||||||
@ -228,6 +229,7 @@ windows are:
|
|||||||
|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}
|
|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}
|
|Pass current selection to program | {sc_pass_selection_to_program}
|
||||||
|===
|
|===
|
||||||
|
|
||||||
|
|||||||
@ -4,6 +4,7 @@
|
|||||||
|
|
||||||
import re
|
import re
|
||||||
import string
|
import string
|
||||||
|
import subprocess
|
||||||
import sys
|
import sys
|
||||||
from collections import namedtuple
|
from collections import namedtuple
|
||||||
from functools import lru_cache, partial
|
from functools import lru_cache, partial
|
||||||
@ -11,7 +12,7 @@ from gettext import gettext as _
|
|||||||
|
|
||||||
from kitty.cli import parse_args
|
from kitty.cli import parse_args
|
||||||
from kitty.key_encoding import ESCAPE, backspace_key, enter_key
|
from kitty.key_encoding import ESCAPE, backspace_key, enter_key
|
||||||
from kitty.utils import open_url, read_with_timeout
|
from kitty.utils import command_for_open, read_with_timeout
|
||||||
|
|
||||||
from ..tui.handler import Handler
|
from ..tui.handler import Handler
|
||||||
from ..tui.loop import Loop
|
from ..tui.loop import Loop
|
||||||
@ -187,7 +188,8 @@ def mark(finditer, line, index_map):
|
|||||||
|
|
||||||
def run(args, source_file=None):
|
def run(args, source_file=None):
|
||||||
if source_file is None:
|
if source_file is None:
|
||||||
text = read_from_stdin()
|
text = sys.stdin.buffer.read().decode('utf-8')
|
||||||
|
sys.stdin = open('/dev/tty')
|
||||||
else:
|
else:
|
||||||
with open(source_file, 'r') as f:
|
with open(source_file, 'r') as f:
|
||||||
text = f.read()
|
text = f.read()
|
||||||
@ -209,12 +211,18 @@ def run(args, source_file=None):
|
|||||||
handler = URLHints(lines, index_map)
|
handler = URLHints(lines, index_map)
|
||||||
loop.loop(handler)
|
loop.loop(handler)
|
||||||
if handler.chosen and loop.return_code == 0:
|
if handler.chosen and loop.return_code == 0:
|
||||||
open_url(handler.chosen, program=args.program or 'default')
|
cmd = command_for_open(args.program)
|
||||||
|
ret = subprocess.Popen(cmd + [handler.chosen]).wait()
|
||||||
|
if ret != 0:
|
||||||
|
print('URL handler "{}" failed with return code: {}'.format(' '.join(cmd), ret), file=sys.stderr)
|
||||||
|
input('Press Enter to quit')
|
||||||
|
loop.return_code = ret
|
||||||
raise SystemExit(loop.return_code)
|
raise SystemExit(loop.return_code)
|
||||||
|
|
||||||
|
|
||||||
OPTIONS = partial('''\
|
OPTIONS = partial('''\
|
||||||
--program
|
--program
|
||||||
|
default=default
|
||||||
What program to use to open matched URLs. Defaults
|
What program to use to open matched URLs. Defaults
|
||||||
to the default URL open program for the operating system.
|
to the default URL open program for the operating system.
|
||||||
|
|
||||||
|
|||||||
@ -397,6 +397,29 @@ class Boss:
|
|||||||
else:
|
else:
|
||||||
w.paste(text)
|
w.paste(text)
|
||||||
|
|
||||||
|
def run_simple_kitten(self, type_of_input, kitten, *args):
|
||||||
|
import shlex
|
||||||
|
w = self.active_window
|
||||||
|
tab = self.active_tab
|
||||||
|
if w is not None and tab is not None and w.overlay_for is None:
|
||||||
|
cmdline = args[0] if args else ''
|
||||||
|
args = shlex.split(cmdline) if cmdline else []
|
||||||
|
if '--program' not in cmdline:
|
||||||
|
args.extend(('--program', self.opts.open_url_with))
|
||||||
|
if type_of_input in ('text', 'history'):
|
||||||
|
data = (w.buffer_as_text(add_history=type_of_input == 'history') + '\x1c').encode('utf-8')
|
||||||
|
elif type_of_input in ('ansi', 'ansi-history'):
|
||||||
|
data = (w.buffer_as_ansi(add_history=type_of_input == 'ansi-history') + '\x1c').encode('utf-8')
|
||||||
|
elif type_of_input == 'none':
|
||||||
|
data = None
|
||||||
|
else:
|
||||||
|
raise ValueError('Unknown type_of_input: {}'.format(type_of_input))
|
||||||
|
tab.new_special_window(
|
||||||
|
SpecialWindow(
|
||||||
|
['kitty', '+runpy', 'from kittens.{}.main import main; main()'.format(kitten)] + args,
|
||||||
|
stdin=data,
|
||||||
|
overlay_for=w.id))
|
||||||
|
|
||||||
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)
|
||||||
|
|||||||
@ -111,6 +111,8 @@ def parse_key_action(action):
|
|||||||
args = tuple(map(parse_key_action, filter(None, parts)))
|
args = tuple(map(parse_key_action, filter(None, parts)))
|
||||||
elif func == 'send_text':
|
elif func == 'send_text':
|
||||||
args = rest.split(' ', 1)
|
args = rest.split(' ', 1)
|
||||||
|
elif func == 'run_simple_kitten':
|
||||||
|
args = rest.split(' ', 2)
|
||||||
elif func == 'goto_tab':
|
elif func == 'goto_tab':
|
||||||
args = (max(0, int(rest)), )
|
args = (max(0, int(rest)), )
|
||||||
elif func in shlex_actions:
|
elif func in shlex_actions:
|
||||||
|
|||||||
@ -329,6 +329,11 @@ 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
|
map ctrl+shift+u input_unicode_character
|
||||||
|
# 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:
|
||||||
|
# map ctrl+shift+e run_simple_kitten text url_hints --program firefox --regex "http://[^ ]+"
|
||||||
|
map ctrl+shift+e run_simple_kitten text url_hints
|
||||||
|
|
||||||
# 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
|
||||||
|
|||||||
@ -111,6 +111,14 @@ def base64_encode(
|
|||||||
return ans
|
return ans
|
||||||
|
|
||||||
|
|
||||||
|
def command_for_open(program='default'):
|
||||||
|
if program == 'default':
|
||||||
|
cmd = ['open'] if is_macos else ['xdg-open']
|
||||||
|
else:
|
||||||
|
cmd = shlex.split(program)
|
||||||
|
return cmd
|
||||||
|
|
||||||
|
|
||||||
def open_cmd(cmd, arg=None):
|
def open_cmd(cmd, arg=None):
|
||||||
if arg is not None:
|
if arg is not None:
|
||||||
cmd = list(cmd)
|
cmd = list(cmd)
|
||||||
@ -119,11 +127,7 @@ def open_cmd(cmd, arg=None):
|
|||||||
|
|
||||||
|
|
||||||
def open_url(url, program='default'):
|
def open_url(url, program='default'):
|
||||||
if program == 'default':
|
return open_cmd(command_for_open(program), url)
|
||||||
cmd = ['open'] if is_macos else ['xdg-open']
|
|
||||||
else:
|
|
||||||
cmd = shlex.split(program)
|
|
||||||
return open_cmd(cmd, url)
|
|
||||||
|
|
||||||
|
|
||||||
def detach(fork=True, setsid=True, redirect=True):
|
def detach(fork=True, setsid=True, redirect=True):
|
||||||
|
|||||||
@ -15,7 +15,8 @@ defns = defaultdict(list)
|
|||||||
|
|
||||||
for line in open('kitty/kitty.conf'):
|
for line in open('kitty/kitty.conf'):
|
||||||
if line.startswith('map '):
|
if line.startswith('map '):
|
||||||
_, sc, name = line.split(maxsplit=3)
|
_, sc, name = line.split(maxsplit=2)
|
||||||
|
name = name.rstrip().replace(' ', '_')
|
||||||
defns[name].append('`' + sc + '`')
|
defns[name].append('`' + sc + '`')
|
||||||
|
|
||||||
defns = [
|
defns = [
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user