在 AppleScript 中识别终端 window
Identifying Terminal window in AppleScript
我正在尝试让我的终端在 运行 ssh
时更改配置文件。为此,我写了这个脚本(并定义了一个 alias
所以 ssh
会 运行 它):
#!/bin/bash
osascript -e "tell application \"Terminal\" to set current settings \
of front window to first settings set whose name is \"AmadanRemote\""
/usr/bin/ssh "$*"
osascript -e "tell application \"Terminal\" to set current settings \
of front window to first settings set whose name is \"AmadanLocal\""
这几乎就是我想要的。 (它在同一个 window 中绘制连续的选项卡是错误的,因为配置文件显然是 window-wide,但我不使用选项卡。)问题是如果连接关闭而另一个终端 window 在顶部,AmadanLocal
配置文件将应用到 错误的 window。
因此,问题是:有没有办法通过终端的 tty
设备或任何其他功能(而不是变化无常的 front window
明确识别终端 window 或选项卡)?
如果不是,第一个 osascript
调用是否有任何识别特征可以 return 在第二个 osascript
调用中明确识别相同的 window/tab?
(不必是 AppleScript - 如果 JavaScript 可以,JavaScript 也可以。)
编辑:如果有人感兴趣,脚本的最终形状是:
#!/bin/bash
tty=`tty`
osascript <<EOF
tell application "Terminal"
set W to the first window whose tty of tab 1 is "$tty"
set T to tab 1 of W
set the current settings of T to the first settings set whose name is "AmadanRemote"
end tell
EOF
/usr/bin/ssh "$*"
osascript <<EOF
tell application "Terminal"
set W to the first window whose tty of tab 1 is "$tty"
set T to tab 1 of W
set the current settings of T to the first settings set whose name is "AmadanLocal"
end tell
EOF
奖励:这实际上对每个选项卡都做了正确的事情! <3
是的,有。在 脚本编辑器 中,我可以 运行 这个命令:
tell application "Terminal" to get {properties, properties of tab 1} of window 1
这将使我获得前面 window 及其活动选项卡的所有属性。这是输出:
{
{
selected tab:tab 1 of window id 15491 of application "Terminal",
closeable:true,
size:{550,777},
zoomed:false,
frame:{730,0,1280,777},
index:1,
visible:true,
position:{730,23},
class:window,
origin:{730,0},
name:"~ — fish /Users/CK — ttys001",
miniaturizable:true,
frontmost:false,
id:15491, <---------------------------------------①
miniaturized:false,
resizable:true,
bounds:{730,23,1280,800},
zoomable:true
},
{
font:"mononoki-Regular",
title displays device name:true,
cursor color:{64587,609,65480},
current settings:current settings of tab 1 of window id 15491 of application "Terminal",
title displays shell path:false,
tty:"/dev/ttys001", <-----------------------------②
normal text color:{52428,52428,52427},
title displays window size:false,
title displays custom title:true,
contents:"Last login: Mon Jun 18 04:54:37 on ttys001\nCK@CK-mac ~> ",
row:39,
process:{
"login",
"-fish"
},
clean commands:{
"screen",
"tmux"
},
font antialiasing:true,
background color:{16383,16383,16383},
title:"fish /Users/CK",
class:tab,
title displays file name:false,
history:"Last login: Mon Jun 18 04:54:37 on ttys001\nCK@CK-mac ~> ",
selected:true,
size:16,
bold text color:{65535,65535,65535},
busy status:false,
column:60
}
}
该输出的前半部分是 window 的属性,输出的后半部分是同一 window 中选项卡的属性。
我用编号箭头 ① 和 ② 标记了音符的两个属性。
属性①属于window,是window的唯一id
。这将在 window 的整个生命周期内固定不变。因此,在您的脚本中的某个时刻,将 id of the front window
存储在一个变量中,并通过该变量引用 window:
tell application "Terminal"
set wID to the id of the front window
set visible of window id wID to false
end tell
事实上,如果您选择将实际的 window
对象而不是它的 id
存储在变量中,则根本不需要引用 id
:
tell application "Terminal"
set W to the front window
set visible of W to false
end tell
由于 AppleScript 通过 window 的 id
值引用了 window
对象,因此这样做同样可靠且不变。
在 window 的可用属性列表中,我没有看到 current settings
属性。但是,该选项卡有一个 current settings
属性。我知道你不使用标签,但在 AppleScript 中,Terminal 的每个标签实际上只属于一个 window,在一个非常违反直觉的标签中 - window 关系.
因此,如您所料,包含三个选项卡的 window 应该具有对单个 window
对象和三个 tab
对象的 AppleScript 引用。通过索引引用它们(它可以改变,所以不是在代码中引用它们的好方法),你会期望会有 tab 1 of window 1
、tab 2 of window 1
和 tab 3 of window 1
。相反,您得到的是 tab 1 of window 1
、tab 1 of window 2
和 tab 1 of window 3
.
我不知道为什么要这样实施。但是,从本质上讲,tab
对象和 window
对象似乎指的是您在屏幕上看到的同一个框架界面,希望将其称为 window
而实际上它可能是,出于某些目的,tab
.
current settings
是您可能认为要为 window
设置它的时候之一,但实际上您想要为 tab
设置它。
Tabs 有一个 属性,正如您所希望的那样,称为 tty
,它是一个字符串值,用于标识 tab 正在使用的终端。就我而言,它是 "/dev/ttys001"
。然而,正如我刚才所解释的,从 AppleScript 的奇怪观点来看,每个 window
对象实际上只包含一个 tab
对象。因此,如果您有对包含它的 window 的引用,那么引用该选项卡很简单:它将始终是 tab 1 of window id wID
或 tab 1 of W
,但是您之前存储了变量。
但是属于该选项卡的 tty
属性 可用于引用其包含的 window,这意味着如果您知道自己所在的终端,您将始终能够在正确的 window
中识别和引用正确的 tab
。你这样做:
tell application "Terminal"
set W to the first window whose tty of tab 1 contains "ttys001"
set T to tab 1 of W
set the current settings of T to the first settings set whose name is "AmadanLocal"
end tell
我正在尝试让我的终端在 运行 ssh
时更改配置文件。为此,我写了这个脚本(并定义了一个 alias
所以 ssh
会 运行 它):
#!/bin/bash
osascript -e "tell application \"Terminal\" to set current settings \
of front window to first settings set whose name is \"AmadanRemote\""
/usr/bin/ssh "$*"
osascript -e "tell application \"Terminal\" to set current settings \
of front window to first settings set whose name is \"AmadanLocal\""
这几乎就是我想要的。 (它在同一个 window 中绘制连续的选项卡是错误的,因为配置文件显然是 window-wide,但我不使用选项卡。)问题是如果连接关闭而另一个终端 window 在顶部,AmadanLocal
配置文件将应用到 错误的 window。
因此,问题是:有没有办法通过终端的 tty
设备或任何其他功能(而不是变化无常的 front window
明确识别终端 window 或选项卡)?
如果不是,第一个 osascript
调用是否有任何识别特征可以 return 在第二个 osascript
调用中明确识别相同的 window/tab?
(不必是 AppleScript - 如果 JavaScript 可以,JavaScript 也可以。)
编辑:如果有人感兴趣,脚本的最终形状是:
#!/bin/bash
tty=`tty`
osascript <<EOF
tell application "Terminal"
set W to the first window whose tty of tab 1 is "$tty"
set T to tab 1 of W
set the current settings of T to the first settings set whose name is "AmadanRemote"
end tell
EOF
/usr/bin/ssh "$*"
osascript <<EOF
tell application "Terminal"
set W to the first window whose tty of tab 1 is "$tty"
set T to tab 1 of W
set the current settings of T to the first settings set whose name is "AmadanLocal"
end tell
EOF
奖励:这实际上对每个选项卡都做了正确的事情! <3
是的,有。在 脚本编辑器 中,我可以 运行 这个命令:
tell application "Terminal" to get {properties, properties of tab 1} of window 1
这将使我获得前面 window 及其活动选项卡的所有属性。这是输出:
{
{
selected tab:tab 1 of window id 15491 of application "Terminal",
closeable:true,
size:{550,777},
zoomed:false,
frame:{730,0,1280,777},
index:1,
visible:true,
position:{730,23},
class:window,
origin:{730,0},
name:"~ — fish /Users/CK — ttys001",
miniaturizable:true,
frontmost:false,
id:15491, <---------------------------------------①
miniaturized:false,
resizable:true,
bounds:{730,23,1280,800},
zoomable:true
},
{
font:"mononoki-Regular",
title displays device name:true,
cursor color:{64587,609,65480},
current settings:current settings of tab 1 of window id 15491 of application "Terminal",
title displays shell path:false,
tty:"/dev/ttys001", <-----------------------------②
normal text color:{52428,52428,52427},
title displays window size:false,
title displays custom title:true,
contents:"Last login: Mon Jun 18 04:54:37 on ttys001\nCK@CK-mac ~> ",
row:39,
process:{
"login",
"-fish"
},
clean commands:{
"screen",
"tmux"
},
font antialiasing:true,
background color:{16383,16383,16383},
title:"fish /Users/CK",
class:tab,
title displays file name:false,
history:"Last login: Mon Jun 18 04:54:37 on ttys001\nCK@CK-mac ~> ",
selected:true,
size:16,
bold text color:{65535,65535,65535},
busy status:false,
column:60
}
}
该输出的前半部分是 window 的属性,输出的后半部分是同一 window 中选项卡的属性。
我用编号箭头 ① 和 ② 标记了音符的两个属性。
属性①属于window,是window的唯一id
。这将在 window 的整个生命周期内固定不变。因此,在您的脚本中的某个时刻,将 id of the front window
存储在一个变量中,并通过该变量引用 window:
tell application "Terminal"
set wID to the id of the front window
set visible of window id wID to false
end tell
事实上,如果您选择将实际的 window
对象而不是它的 id
存储在变量中,则根本不需要引用 id
:
tell application "Terminal"
set W to the front window
set visible of W to false
end tell
由于 AppleScript 通过 window 的 id
值引用了 window
对象,因此这样做同样可靠且不变。
在 window 的可用属性列表中,我没有看到 current settings
属性。但是,该选项卡有一个 current settings
属性。我知道你不使用标签,但在 AppleScript 中,Terminal 的每个标签实际上只属于一个 window,在一个非常违反直觉的标签中 - window 关系.
因此,如您所料,包含三个选项卡的 window 应该具有对单个 window
对象和三个 tab
对象的 AppleScript 引用。通过索引引用它们(它可以改变,所以不是在代码中引用它们的好方法),你会期望会有 tab 1 of window 1
、tab 2 of window 1
和 tab 3 of window 1
。相反,您得到的是 tab 1 of window 1
、tab 1 of window 2
和 tab 1 of window 3
.
我不知道为什么要这样实施。但是,从本质上讲,tab
对象和 window
对象似乎指的是您在屏幕上看到的同一个框架界面,希望将其称为 window
而实际上它可能是,出于某些目的,tab
.
current settings
是您可能认为要为 window
设置它的时候之一,但实际上您想要为 tab
设置它。
Tabs 有一个 属性,正如您所希望的那样,称为 tty
,它是一个字符串值,用于标识 tab 正在使用的终端。就我而言,它是 "/dev/ttys001"
。然而,正如我刚才所解释的,从 AppleScript 的奇怪观点来看,每个 window
对象实际上只包含一个 tab
对象。因此,如果您有对包含它的 window 的引用,那么引用该选项卡很简单:它将始终是 tab 1 of window id wID
或 tab 1 of W
,但是您之前存储了变量。
但是属于该选项卡的 tty
属性 可用于引用其包含的 window,这意味着如果您知道自己所在的终端,您将始终能够在正确的 window
中识别和引用正确的 tab
。你这样做:
tell application "Terminal"
set W to the first window whose tty of tab 1 contains "ttys001"
set T to tab 1 of W
set the current settings of T to the first settings set whose name is "AmadanLocal"
end tell