Comment Comment by kazinator $ find /etc/network | ./frangi.tl etc: network: if-post-down.d: wireless-tools wpasupplicant avahi-daemon if-down.d: resolvconf wpasupplicant avahi-autoipd interfaces.d interfaces if-pre-up.d: wireless-tools wpasupplicant ethtool if-up.d: ntpdate wpasupplicant 000resolvconf openssh-server ethtool avahi-autoipd slrn avahi-daemon $ find /etc/network | ./frangi-cheat.tl /etc/network /if-post-down.d /wireless-tools /wpasupplicant /avahi-daemon /if-down.d /resolvconf /wpasupplicant /avahi-autoipd /interfaces.d /interfaces /if-pre-up.d /wireless-tools /wpasupplicant /ethtool /if-up.d /ntpdate /wpasupplicant /000resolvconf /openssh-server /ethtool /avahi-autoipd /slrn /avahi-daemon $ cat frangi-cheat.tl #!/usr/bin/env txr (let (old-path) (whilet ((line (get-line))) (whenlet ((path (tok #/[^\/]*/ line)) (canon `@{path "/"}`) (pos (mismatch path old-path))) (let ((cpos (max 0 (+ pos -1 [sum [path 0..pos] len])))) (put-line `@{"" cpos}@{canon [cpos..:]}`)) (set old-path path)))) $ cat frangi.tl #!/usr/bin/env txr (defstruct (node name) list-builder name (:method equal (me) me.name) (:method ensure-child (me child-name) (let ((children me.(get))) (or (find child-name me.(get)) (let ((new-child (new (node child-name)))) me.(add new-child) new-child)))) (:method print (me stream : pretty-p) (let* ((old-im (set-indent-mode stream indent-code)) (old-id (get-indent stream)) (children me.(get)) (is-bottom (none children .(get)))) (unwind-protect (cond (children (put-line `@{me.name}:` stream) (set-indent stream (+ old-id 4)) [mapdo (op print @1 stream) children] (when is-bottom (put-char #\newline stream))) (t (put-string `@{me.name} `) stream)) (set-indent-mode stream old-im) (set-indent stream old-id))))) (let ((supernode (new (node :root)))) (whilet ((line (get-line))) (let ((path (tok #/[^\/]+/ line)) (node supernode)) (each ((comp path)) (set node node.(ensure-child comp))))) (each ((top-child supernode.(get))) (pprinl top-child))) parent kazinator 5 years ago