Alan D. Salewski on 27 Apr 2011 20:53:03 -0700

[Date Prev] [Date Next] [Thread Prev] [Thread Next] [Date Index] [Thread Index]

Re: [PLUG] fold output of 'tree' with 'vim'?

On Tue, Apr 26, 2011 at 08:47:36AM +0200, sean finney spake thus:
> Hi,
> On Mon, Apr 25, 2011 at 02:28:51PM -0400, Randall A Sindlinger wrote:
> > just work on an input file.  It *seems* like vim should be able to do this
> > for me by using it's folding feature, but I've not had any luck.
> One idea: use foldmethod=expr, and make a function that counts the number
> of /'s to determine the folding level via foldexpr?
> 	sean

Because emacs vs. vim is always fun, here's a quick and dirty way of
doing it in emacs with emacs's 'outline' mode, from within a bash shell:

    $ ( tfile=$(mktemp) && echo '-*-outline-*-' >> "$tfile" && tree -ifF | while read line; do pat='.*/$'; if [[ $line =~ $pat ]]; then for cnt in $(seq 3 $(echo "$line" | sed -n 's,[^/],,pg' | wc -c)); do printf '*'; done; printf ' %s\n' "$line"; else echo $line; fi; done >> "$tfile" && emacsclient "$tfile" && rm -f "$tfile" )

It basically turns the output of directory lines into the header lines
recognized by outline mode, which can be collapsed and expanded using
the normal outline-mode navigation.

The magic number 3 comes from the observation that the first-level child
directories will be displayed with 2 '/' characters in them in the
output of 'tree -ifF', and the full line (post sed) will have 3
characters due to the newline.

It also uses 'emacsclient', which presumes there's a running emacs

I was disappointed to learn that I could not get emacs to just stream
the data from stdin to a new buffer without first going through a tmp
file. Anyone got some mojo for that?


Philadelphia Linux Users Group         --
Announcements -
General Discussion  --