Skip to content

Instantly share code, notes, and snippets.

@xtetsuji
Created July 6, 2017 15:45
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save xtetsuji/87283b3650cff38d0a759f7d571375f6 to your computer and use it in GitHub Desktop.
Save xtetsuji/87283b3650cff38d0a759f7d571375f6 to your computer and use it in GitHub Desktop.
Google Chrome tab selection via terminal/shell for macOS
#!/usr/bin/env perl
use strict;
use warnings;
use Scalar::Util qw(openhandle);
use IPC::Open2 qw(open2);
use Getopt::Long qw(:config posix_default no_ignore_case bundling auto_help);
use Pod::Usage qw(pod2usage);
use constant DEBUG => $ENV{DEBUG};
# GetOptions(
# \my %opt,
# );
my $chrome_list_text = chrome_list_text();
my @selected_list = peco($chrome_list_text) or die "no selected\n";
my $selected_line = $selected_list[0];
my ($window_number, $tab_number) = $selected_line =~ /^\[(\d+),(\d+)\]/;
print "window=$window_number, tab=$tab_number\n" if DEBUG;
select_chrome_window_tab($window_number, $tab_number);
sub chrome_list_text {
eval_jxa(<<'END_JXA');
var chrome = Application("Google Chrome");
var windows = chrome.windows();
var windows_length = windows.length;
var output = "";
for ( var i = 0; i < windows_length; i++ ) {
var window = windows[i];
var tabs = window.tabs();
var tabs_length = tabs.length;
for ( var j = 0; j < tabs_length; j++ ) {
var tab = tabs[j];
var page_desc = "[" + i + "," + (j+1) + "]\t";
output += page_desc + tab.name() + "\n";
}
}
output;
END_JXA
}
sub select_chrome_window_tab {
my ($window_number, $tab_number) = @_;
eval_jxa( sprintf <<'END_JXA', $window_number, $tab_number );
var chrome = Application("Google Chrome");
chrome.activate();
var window = chrome.windows()[%d];
window.activeTabIndex = %d;
END_JXA
}
sub eval_jxa {
my $jxa_code = shift;
print $jxa_code if DEBUG;
my $option = shift || +{};
my ($reader, $writer);
my $pid = open2 $reader, $writer, qw{osascript -l JavaScript};
print {$writer} $jxa_code;
close $writer;
my @lines = <$reader>;
return wantarray ? @lines : join "", @lines;
}
sub peco {
my @lines = @_;
my $pid = open2 my $reader, my $writer, 'peco';
print {$writer} $_ for @lines;
close $writer;
return <$reader>;
}
__END__
=pod
=encoding utf-8
=head1 NAME
chrome-wand - Google Chrome Window/Tab Wand on macOS
=head1 SYNOPSIS
chrome-wand
=head1 DESCRIPTIONS
(stub)
=head1 SEE ALSO
osascript, peco
=head1 AUTHOR
OGATA Tetsuji E<lt>tetsuji.ogata@gmail.comE<lt>
=head1 COPYRIGHT AND LICENSE
Copyright (C) 2017, OGATA Tetsuji.
This program is free software, you can redistribute it and/or modify it
under the terms of the Artistic License version 2.0.
=head1 SEE ALSO
osascript, peco.
=head1 DISCLAIMER
This script is ALPHA quality. I do not guarantee any things. :-)
Gist uploaded date is 2017/07/07.
=cut
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment