Skip to content

Commit 4eb3f7d

Browse files
tui: open log files in external application
* Allow log files to be open in external applications. * Tui will suspend whilst the external tool is open, and resume once it has closed. * Options implemented are `$EDITOR`, `$GEDITOR`, `$PAGER` and `vim` as a backup.
1 parent f6c3d79 commit 4eb3f7d

11 files changed

+103
-20
lines changed

changes.d/6611.feat.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Tui: Add ability to open log files in external tools. Configure your `$EDITOR`, `$GEDITOR` or `$PAGER` options to configure which tool is used.

cylc/flow/tui/overlay.py

Lines changed: 83 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,8 +38,10 @@
3838
"""
3939

4040
from functools import partial
41+
import os
4142
import re
4243
import sys
44+
from time import sleep
4345

4446
import urwid
4547

@@ -413,6 +415,8 @@ def log(app, id_=None, list_files=None, get_log=None):
413415
# display the actual log file itself
414416
text_widget = urwid.Text('')
415417

418+
_filename = None
419+
416420
def open_menu(*_args, **_kwargs):
417421
"""Open an overlay for selecting a log file."""
418422
nonlocal app, id_
@@ -459,7 +463,8 @@ def open_log(*_, filename=None, close=False):
459463
460464
"""
461465

462-
nonlocal host_widget, file_widget, text_widget
466+
nonlocal host_widget, file_widget, text_widget, _filename
467+
_filename = filename
463468
try:
464469
host, path, text = get_log(filename)
465470
except Exception as exc:
@@ -473,6 +478,64 @@ def open_log(*_, filename=None, close=False):
473478
if close:
474479
app.close_topmost()
475480

481+
def open_in_editor(*_, command):
482+
"""Suspend Tui, open the file in an external utility, then restore Tui.
483+
484+
Args:
485+
command:
486+
The command to run as a list, e.g. 'gvim -f'.
487+
This command must be blocking, the tui session will be
488+
restored when the command exits.
489+
490+
"""
491+
import shlex
492+
from subprocess import Popen
493+
import stat
494+
import tempfile
495+
496+
nonlocal _filename
497+
498+
try:
499+
host, path, text = get_log(_filename)
500+
except Exception as exc:
501+
host_widget.set_text(f'Error: {exc}')
502+
file_widget.set_text('')
503+
else:
504+
host_widget.set_text(f'Host: {host}')
505+
file_widget.set_text(f'Path: {path}')
506+
507+
with tempfile.NamedTemporaryFile('w+') as temp_file:
508+
# write the text into a temp file
509+
temp_file.write(text)
510+
temp_file.seek(0, 0)
511+
512+
# make the file readonly to avoid confusion
513+
os.chmod(temp_file.name, stat.S_IRUSR)
514+
515+
# suspend Tui
516+
app.loop.screen.stop()
517+
518+
# open the file using the external tool (must be blocking)
519+
print('Launching external tool, Tui will resume once it exits.')
520+
try:
521+
Popen([*shlex.split(command), temp_file.name]).wait()
522+
except OSError as exc:
523+
# ensure any critical errors are visible to the user so
524+
# that they have a chance to fix them
525+
_sleep_time = 5
526+
print(
527+
(
528+
f'Error running {command} {temp_file.name}'
529+
f'\n{exc}'
530+
f'\nTui will resume in {_sleep_time} seconds'
531+
),
532+
file=sys.stderr
533+
)
534+
sleep(_sleep_time)
535+
536+
# restore Tui
537+
app.loop.screen.start()
538+
476539
# load the default log file
477540
if id_:
478541
# NOTE: the kwargs are not provided in the overlay unit tests
@@ -489,6 +552,25 @@ def open_log(*_, filename=None, close=False):
489552
'Select File',
490553
on_press=open_menu,
491554
),
555+
urwid.Columns([
556+
('pack', urwid.Text('Open in: ')),
557+
*(
558+
(
559+
'pack',
560+
urwid.Button(
561+
label,
562+
align='left',
563+
on_press=partial(open_in_editor, command=command),
564+
),
565+
)
566+
for label, command in (
567+
('$EDITOR', os.environ.get('EDITOR', 'vim')),
568+
('$GEDITOR', os.environ.get('GEDITOR', 'gvim -f')),
569+
('$PAGER', os.environ.get('PAGER', 'less')),
570+
('vim', 'vim'),
571+
)
572+
),
573+
]),
492574
urwid.Divider(),
493575
text_widget,
494576
]),

tests/integration/tui/screenshots/test_errors.list-error.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
<span style="color:#000000;background:#e5e5e5"></span><span style="color:#000000;background:#e5e5e5"> </span><span style="color:#000000;background:#e5e5e5">Error: Somethi</span><span style="color:#000000;background:#e5e5e5"></span><span style="color:#000000;background:#e5e5e5"> </span><span style="color:#000000;background:#e5e5e5">Error </span><span style="color:#000000;background:#e5e5e5"> </span><span style="color:#000000;background:#e5e5e5"></span><span style="color:#000000;background:#e5e5e5"> </span><span style="color:#000000;background:#e5e5e5"> </span><span style="color:#000000;background:#e5e5e5"></span>
33
<span style="color:#000000;background:#e5e5e5"></span><span style="color:#000000;background:#e5e5e5"> </span><span style="color:#000000;background:#e5e5e5"> </span><span style="color:#000000;background:#e5e5e5"></span><span style="color:#000000;background:#e5e5e5"> </span><span style="color:#000000;background:#e5e5e5"> </span><span style="color:#000000;background:#e5e5e5"> </span><span style="color:#000000;background:#e5e5e5"></span><span style="color:#000000;background:#e5e5e5"> </span><span style="color:#000000;background:#e5e5e5"> </span><span style="color:#000000;background:#e5e5e5"></span>
44
<span style="color:#000000;background:#e5e5e5"></span><span style="color:#000000;background:#e5e5e5"> </span><span style="color:#000000;background:#e5e5e5">&lt;</span><span style="color:#000000;background:#e5e5e5"> </span><span style="color:#000000;background:#e5e5e5">Select File </span><span style="color:#000000;background:#e5e5e5"></span><span style="color:#000000;background:#e5e5e5"> </span><span style="color:#000000;background:#e5e5e5">Something went wrong :( </span><span style="color:#000000;background:#e5e5e5"> </span><span style="color:#000000;background:#e5e5e5"></span><span style="color:#000000;background:#e5e5e5"> </span><span style="color:#000000;background:#e5e5e5"> </span><span style="color:#000000;background:#e5e5e5">&gt;</span><span style="color:#000000;background:#e5e5e5"> </span><span style="color:#000000;background:#e5e5e5"></span>
5-
<span style="color:#000000;background:#e5e5e5"></span><span style="color:#000000;background:#e5e5e5"> </span><span style="color:#000000;background:#e5e5e5"> </span><span style="color:#000000;background:#e5e5e5"></span><span style="color:#000000;background:#e5e5e5"> </span><span style="color:#000000;background:#e5e5e5"> </span><span style="color:#000000;background:#e5e5e5"> </span><span style="color:#000000;background:#e5e5e5"></span><span style="color:#000000;background:#e5e5e5"> </span><span style="color:#000000;background:#e5e5e5"> </span><span style="color:#000000;background:#e5e5e5"></span>
5+
<span style="color:#000000;background:#e5e5e5"></span><span style="color:#000000;background:#e5e5e5"> </span><span style="color:#000000;background:#e5e5e5">Open in: </span><span style="color:#000000;background:#e5e5e5">&lt;</span><span style="color:#000000;background:#e5e5e5"> </span><span style="color:#000000;background:#e5e5e5">$E</span><span style="color:#000000;background:#e5e5e5"></span><span style="color:#000000;background:#e5e5e5"> </span><span style="color:#000000;background:#e5e5e5"> </span><span style="color:#000000;background:#e5e5e5"> </span><span style="color:#000000;background:#e5e5e5"></span><span style="color:#000000;background:#e5e5e5"> </span><span style="color:#000000;background:#e5e5e5"> </span><span style="color:#000000;background:#e5e5e5"></span>
66
<span style="color:#000000;background:#e5e5e5"></span><span style="color:#000000;background:#e5e5e5"> </span><span style="color:#000000;background:#e5e5e5"> </span><span style="color:#000000;background:#e5e5e5"></span><span style="color:#000000;background:#e5e5e5"> </span><span style="color:#000000;background:#e5e5e5"> </span><span style="color:#000000;background:#e5e5e5"> </span><span style="color:#000000;background:#e5e5e5"></span><span style="color:#000000;background:#e5e5e5"> </span><span style="color:#000000;background:#e5e5e5"> </span><span style="color:#000000;background:#e5e5e5"></span>
77
<span style="color:#000000;background:#e5e5e5"></span><span style="color:#000000;background:#e5e5e5"> </span><span style="color:#000000;background:#e5e5e5"> </span><span style="color:#000000;background:#e5e5e5"></span><span style="color:#000000;background:#e5e5e5"> </span><span style="color:#000000;background:#e5e5e5"> </span><span style="color:#000000;background:#e5e5e5"> </span><span style="color:#000000;background:#e5e5e5"></span><span style="color:#000000;background:#e5e5e5"> </span><span style="color:#000000;background:#e5e5e5"> </span><span style="color:#000000;background:#e5e5e5"></span>
88
<span style="color:#000000;background:#e5e5e5"></span><span style="color:#000000;background:#e5e5e5"> </span><span style="color:#000000;background:#e5e5e5"> </span><span style="color:#000000;background:#e5e5e5"></span><span style="color:#000000;background:#e5e5e5"> </span><span style="color:#000000;background:#e5e5e5"> </span><span style="color:#000000;background:#e5e5e5"> </span><span style="color:#000000;background:#e5e5e5"></span><span style="color:#000000;background:#e5e5e5"> </span><span style="color:#000000;background:#e5e5e5"> </span><span style="color:#000000;background:#e5e5e5"></span>

tests/integration/tui/screenshots/test_errors.open-error.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
<span style="color:#000000;background:#e5e5e5"></span><span style="color:#000000;background:#e5e5e5"> </span><span style="color:#000000;background:#e5e5e5">Error: Something went wrong :( </span><span style="color:#000000;background:#e5e5e5"> </span><span style="color:#000000;background:#e5e5e5"></span>
33
<span style="color:#000000;background:#e5e5e5"></span><span style="color:#000000;background:#e5e5e5"> </span><span style="color:#000000;background:#e5e5e5"> </span><span style="color:#000000;background:#e5e5e5"> </span><span style="color:#000000;background:#e5e5e5"></span>
44
<span style="color:#000000;background:#e5e5e5"></span><span style="color:#000000;background:#e5e5e5"> </span><span style="color:#000000;background:#e5e5e5">&lt;</span><span style="color:#000000;background:#e5e5e5"> </span><span style="color:#000000;background:#e5e5e5"></span><span style="color:#e5e5e5;background:#000000">S</span><span style="color:#000000;background:#e5e5e5">elect File </span><span style="color:#000000;background:#e5e5e5"> </span><span style="color:#000000;background:#e5e5e5">&gt;</span><span style="color:#000000;background:#e5e5e5"> </span><span style="color:#000000;background:#e5e5e5"></span>
5-
<span style="color:#000000;background:#e5e5e5"></span><span style="color:#000000;background:#e5e5e5"> </span><span style="color:#000000;background:#e5e5e5"> </span><span style="color:#000000;background:#e5e5e5"> </span><span style="color:#000000;background:#e5e5e5"></span>
5+
<span style="color:#000000;background:#e5e5e5"></span><span style="color:#000000;background:#e5e5e5"> </span><span style="color:#000000;background:#e5e5e5">Open in: </span><span style="color:#000000;background:#e5e5e5">&lt;</span><span style="color:#000000;background:#e5e5e5"> </span><span style="color:#000000;background:#e5e5e5">$EDITOR</span><span style="color:#000000;background:#e5e5e5"> </span><span style="color:#000000;background:#e5e5e5">&gt;</span><span style="color:#000000;background:#e5e5e5">&lt;</span><span style="color:#000000;background:#e5e5e5"> </span><span style="color:#000000;background:#e5e5e5">$GEDITOR</span><span style="color:#000000;background:#e5e5e5"> </span><span style="color:#000000;background:#e5e5e5">&gt;</span><span style="color:#000000;background:#e5e5e5">&lt;</span><span style="color:#000000;background:#e5e5e5"> </span><span style="color:#000000;background:#e5e5e5">$PAGER</span><span style="color:#000000;background:#e5e5e5"> </span><span style="color:#000000;background:#e5e5e5">&gt;</span><span style="color:#000000;background:#e5e5e5">&lt;</span><span style="color:#000000;background:#e5e5e5"> </span><span style="color:#000000;background:#e5e5e5">vim</span><span style="color:#000000;background:#e5e5e5"> </span><span style="color:#000000;background:#e5e5e5">&gt;</span><span style="color:#000000;background:#e5e5e5"> </span><span style="color:#000000;background:#e5e5e5"> </span><span style="color:#000000;background:#e5e5e5"></span>
66
<span style="color:#000000;background:#e5e5e5"></span><span style="color:#000000;background:#e5e5e5"> </span><span style="color:#000000;background:#e5e5e5"> </span><span style="color:#000000;background:#e5e5e5"> </span><span style="color:#000000;background:#e5e5e5"></span>
77
<span style="color:#000000;background:#e5e5e5"></span><span style="color:#000000;background:#e5e5e5"> </span><span style="color:#000000;background:#e5e5e5"> </span><span style="color:#000000;background:#e5e5e5"> </span><span style="color:#000000;background:#e5e5e5"></span>
88
<span style="color:#000000;background:#e5e5e5"></span><span style="color:#000000;background:#e5e5e5"> </span><span style="color:#000000;background:#e5e5e5"> </span><span style="color:#000000;background:#e5e5e5"> </span><span style="color:#000000;background:#e5e5e5"></span>

0 commit comments

Comments
 (0)