Created
July 6, 2017 15:45
-
-
Save xtetsuji/87283b3650cff38d0a759f7d571375f6 to your computer and use it in GitHub Desktop.
Google Chrome tab selection via terminal/shell for macOS
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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