有没有办法通过 bash 激活 chrome 的特定选项卡?

有没有办法通过 bash 激活 chrome 的特定选项卡?

例如,假设我有一个处于活动状态的 Chrome 窗口,并且在其选项卡中的某处打开了 Gmail(但不一定是活动选项卡)。

问题:有没有办法激活Gmail 标签从命令行?

答案1

是的。我目前这样做:

1)你需要安装杰克为了搞乱选项卡数据,当调用 Chromium 中当前打开的选项卡的脚本时,您会得到反馈。你还需要安装chrome 远程接口完成从 Chromium 的后台 -> 前台激活选项卡的工作。


2) chromium 需要在打开远程调试的情况下运行。关闭 chromium 的所有实例,并运行此命令而不是仅chromium在终端中运行,否则此过程将不起作用:

/usr/bin/chromium --remote-debugging-port=9222 &


3)使用此基本脚本作为示例,并将其另存为act, chmod +xit 并将其放置在用户的 bin 目录中。例如,我使用 bash 脚本,如果您是 zsh 用户,则可以将其移植过来:

#!/usr/bin/env bash

TABS_JSON=$(chrome-remote-interface list | sed -e "s/^'//" -e "s/'$//" | jq -r 'map(select(.type == "page") | {id: .id, title: .title})')

if [[ -z $@ ]]; then
    TAB_NAMES=$(echo "$TABS_JSON" | jq -r 'map(.title) | .[]')

    echo "$TAB_NAMES"
else
    TAB=$*

    TAB_ID=$(echo "$TABS_JSON" | jq -r "map(select(.title | match(\"${TAB}\";\"i\")) | .id) | .[]")

        chrome-remote-interface activate "$TAB_ID" >/dev/null

    #you might need wmctrl if window does not activate. 
    #wmctrl -a chromium
fi

导航到 cnn.com 和其他几个选项卡,并将 cnn.com 保留在后台,切换到终端并尝试如下命令:

act cnn

它应该激活 chromium 窗口并切换到 cnn 选项卡。您可以自由地将其与工作流程中的 rofi 菜单或 fzf 变体进一步集成,甚至将打开的选项卡列表放入活动窗口的全局池中。

答案2

以下脚本对我有用,它要求您只有一个 Chrome 窗口,并且该窗口处于活动状态。调整或改进它应该很容易。

WINID=$(xdotool search --name 'Google Chrome' | head -n 1)
WINID_HEX=$(printf "0x%x" $WINID)

while true
do
        xwininfo -id $WINID_HEX | grep Gmail
        if [ "$?" -ne 0 ]
        then
                xdotool key --window $WINID ctrl+Tab
        else
                break
        fi
        sleep 2
done

可能还有很多其他方法可以做到这一点:

  • 使用Chromium并修改其源代码
  • 为 Chrome 编写一个扩展,在满足特定条件时切换到正确的选项卡
  • 使用xmacro等工具
  • ETC。

答案3

我调整了杰弗里的回答一下,因为它对我不起作用。

  • wmctrl -lx用于获取所有窗口及其标题。当前选项卡标题位于窗口选项卡名称内。
  • wmctrl -ia用于激活 chrome 窗口

这是结果,

function ctab() {

  # Activate the chrome window
  wmctrl -ia "$(wmctrl -lx | grep google-chrome | awk '{ print $1}')"

  # Create a while loop that continues until it finds the correct tab.
  # Note that this will go on forever if the tab is not found
  while true; do
    
    # Check the current windows title (which includes the tab title)
    result="$(wmctrl -lx | grep google-chrome | grep "@gmail.com")"
    
    # if the title contains @gmail then exit
    [ -n "$result" ] && break 

    # If it is the incorrect title then change to the next tab
    WINID=$(xdotool search --name 'Google Chrome' | head -n 1)
    xdotool key --window $WINID ctrl+Tab

  done
}

答案4

这个 Perl 代码对我有用:例如,findTab.pl Chrome Gmail.它使屏幕翻转一堆,并且可以更改其他窗口中的选项卡(它会检查 12 次,理论上,如果没有找到任何内容,只要窗口中有 <5 个选项卡,这应该将您的窗口保留在原始选项卡上)窗户)。

windowactivate如果你以前没有使用过,它在我的 Ubuntu 系统上不起作用key;与非常古老的安全协议有关。

我认为没有任何保证什么它将查找是否有不止一件东西需要查找;根据其他 xdotool 的经验,我怀疑重复使用时可能会发现不同的东西。

对于这个脚本来说,perl 可能不是一个好的选择,但我不知道 bash。

#! /usr/bin/perl
## findTab.pl
## usage findTab appName tabName
use strict;

my $maxTabs=12;

my ($app, $tab) = @ARGV;

my @wins = split /\s+/, `xdotool search --desktop 0 --name $app`;

foreach my $win (@wins){
    my $title;
    for (my $i=0;$i<$maxTabs;$i++){
        system ("xdotool windowactivate $win");
        $title = `xwininfo -id $win | grep $tab`;
        last if $title;
        system("xdotool key --window $win ctrl+Page_Down");
    }
    last if $title;
}

相关内容