BBEdit Text Filters

tags: bbedit 

BBEdit allows you to make your own text processing programs. It gives your program the contents of a selection then replaces that selection with the output of your program. I also wrote about these in BBEdit Text Filters in Perl 6.

These show up in the Text > Apply Text Filters menu item, but I tend to use them from the Text Filters palette (Windows > Palettes > Text Filters).

These programs go in Application Support/BBEdit/Text Filters folder; I keep mine in Dropbox so it’s common across all my Macs. These can be AppleScript or Text Automator actions, but they can also be Unix scripts. I tend to use Perl, but I have some in Python and Ruby too.

Here’s a Perl program that finds the => in the selection and aligns them:

#!/Users/brian/bin/perls/perl-latest
use warnings;
use strict;
use v5.26;

my( $longest, @lines ) = 0;

while ( <> ) {
	push @lines, [ split /\s+=>\s+/, $_, 2 ];
	if( $lines[-1]->@* == 2 ) {
		my( $key, $length ) = map { $_, length } $lines[-1][0];
		$longest = $length if $length > $longest;
		}
	}

foreach my $line ( @lines ) {
	if( @$line > 1 ) {
		printf "%*s => %s", -$longest, @$line;
		}
	else {
		print @$line
		}
	}

It takes this hash, where the arrows are not aligned:

my %hash = (
	common => 'sea otter',
	genus => 'Enhydra',
	species => 'lutris',
	);

And turns it into this hash, where the arrows are aligned:

my %hash = (
	common  => 'sea otter',
	genus   => 'Enhydra',
	species => 'lutris',
	);

I actually used the text filter to turn the unaligned hash into the aligned one.

My filter can be as complicated as I like it to be. Here’s one that reads the entire selection and attempts to pretty print JSON:

#!/Users/brian/bin/perls/perl-latest
use warnings;
use strict;
use v5.26;

use JSON;

# this is already UTF-8
my $selection = do { local $/; <> };

# now I need octets
open my $string_fh, '>:encoding(UTF-8)', \my $octets;
print {$string_fh} $selection;
close $string_fh;

my $json = JSON->new;
my $perl = $json->decode( $octets );

print $json->pretty->encode($perl);