def test_parsing_of_open_actions(self): from kitty.open_actions import actions_for_url, KeyAction self.set_options() spec = ''' protocol file mime text/* fragment_matches . AcTion launch $EDITOR $FILE_PATH $FRAGMENT action protocol file mime text/* action ignored ext py,txt action one action two ''' def actions(url): with patch_env(FILE_PATH='notgood'): return tuple(actions_for_url(url, spec)) def single(url, func, *args): acts = actions(url) self.ae(len(acts), 1) self.ae(acts[0].func, func) self.ae(acts[0].args, args) single('file://hostname/tmp/moo.txt#23', 'launch', *get_editor(), '/tmp/moo.txt', '23') single('some thing.txt', 'ignored') self.ae(actions('x:///a.txt'), (KeyAction('one', ()), KeyAction('two', ())))
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')) with self.suspend(): p = subprocess.Popen(get_editor() + [favorites_path]) if p.wait() == 0: load_favorites(refresh=True) self.init_terminal_state() self.refresh()
def handle_action(action: str, cli_opts: RemoteFileCLIOptions) -> Result: cli_data = json.loads(cli_opts.ssh_connection_data or '') if cli_data and cli_data[0] == is_ssh_kitten_sentinel: conn_data = SSHConnectionData(is_ssh_kitten_sentinel, cli_data[-1], -1, identity_file=json.dumps(cli_data[1:])) else: conn_data = SSHConnectionData(*cli_data) remote_path = cli_opts.path or '' if action == 'open': print('Opening', cli_opts.path, 'from', cli_opts.hostname) dest = os.path.join(tempfile.mkdtemp(), os.path.basename(remote_path)) with ControlMaster(conn_data, remote_path, cli_opts, dest=dest) as master: if master.check_hostname_matches(): if master.download(): return dest master.show_error('Failed to copy file from remote machine') elif action == 'edit': print('Editing', cli_opts.path, 'from', cli_opts.hostname) editor = get_editor() with ControlMaster(conn_data, remote_path, cli_opts) as master: if not master.check_hostname_matches(): return None if not master.download(): master.show_error(f'Failed to download {remote_path}') return None mtime = os.path.getmtime(master.dest) print(reset_terminal(), end='', flush=True) editor_process = subprocess.Popen(editor + [master.dest]) while editor_process.poll() is None: time.sleep(0.1) newmtime = os.path.getmtime(master.dest) if newmtime > mtime: mtime = newmtime if master.is_alive: master.upload() print(reset_terminal(), end='', flush=True) if master.is_alive: if not master.upload(suppress_output=False): master.show_error(f'Failed to upload {remote_path}') else: master.show_error( f'Failed to upload {remote_path}, SSH master process died') elif action == 'save': print('Saving', cli_opts.path, 'from', cli_opts.hostname) save_as(conn_data, remote_path, cli_opts) return None