Rstudio 的更有意义 window 标题
More meaningfull window title for Rstudio
我在 Ubuntu (16.04) 下使用 R studio(版本 1.0.143),window 标题只显示非常无用的 "RStudio"。
我希望至少拥有当前选项卡的名称,或者最好是与该选项卡对应的文件的完整路径。 Windows 下的完整路径似乎出现在 window 标题中。
这对于在 windows 之间导航可能很有用,但我的主要用途是用于跟踪每个软件所花费时间的软件(如 arbtt
)。目前我只能知道我上周在 R studio 里花了 20 个小时,但我想知道在哪个 files/projects.
这里提供了部分解决方案,但如果有人知道如何获取当前选项卡的完整名称和路径,我仍然很感兴趣。
基于@Spacedman 的回复,我现在可以通过在安装 wmctrl
后将此行添加到 /usr/lib/R/etc/Rprofile.site
来获取 window 标题中的工作目录路径(但不是脚本名称) :
RStudio_title <- function(...){system(paste0('wmctrl -r "RStudio" -N "RStudio - @ ', getwd(), '"')) ; TRUE}
addTaskCallback(RStudio_title, data = NULL, name = character())
一个问题是,如果您已经在标题中使用 "rstudio"(不区分大小写)打开 window(例如在网络浏览器中),则此 window 将收到新标题而不是 Rstudio window。有一个 -F
选项可以使 window 标题与提供的标题完全相同。我试图首先将 RStudio 标题修改为不太可能出现在另一个 window 中的标题,方法是将其添加到 Rprofile.site
中:
system('wmctrl -F -r "RStudio" -N "RStudio - @ "')
问题是 Rprofile.site 中的 system
R 函数调用似乎被 Rstudio 忽略了(虽然它在 rstudio 外部调用的 R 中工作)
事实上,来自Rprofile.site的system
命令并没有被忽略。它被执行但出于任何原因输出未显示在 Rstudio R 控制台中(例如,如果您键入 system("echo 'Hello World'")
)。请参阅
中的讨论
system('wmctrl -F -r "RStudio" -N "RStudio - @ "')
不起作用的原因可能是在执行此命令时(当 Rprofile.site 由 R 提供时),RStudio windows 尚不存在...
这就是我现在的做法,包括@Spacedman 的建议(即使用十六进制 ID 和 if(interactive())
)。即使已经有另一个 window 以 "RStudio" 标题打开,它也能正常工作。如果您从 Rstudio 重新启动 R,它也可以工作。如果你执行 rm(list=ls())
它将被破坏(带有一条消息)(我个人从不这样做,我更喜欢重新启动 R)
if(interactive()) {
# function to capture the hexadecimal ID of the R studio window
RStudio_ID <- function(...) {
Rstudio_wmctrl_ID <<- system("wmctrl -l | grep 'N/A RStudio' | sed -r 's/\s.*//'",
intern = TRUE); FALSE
}
# execute last function only once after the first completed top-level task
# (because the output of that function is FALSE)
addTaskCallback(RStudio_ID, data = NULL, name = character())
# function that will change the Rstudio window title
RStudio_title <- function(...){system(paste0('wmctrl -i -r ', Rstudio_wmctrl_ID,
' -N "RStudio - @ ', getwd(), '"')) ; TRUE}
# this function is executed after every completed top-level task
addTaskCallback(RStudio_title, data = NULL, name = character())
}
安装 wmctrl
,然后你可以将名为 "Calculator" 的标题更改为 "Fnord",如下所示:
xcalc &
wmctrl -r Calculator -N "Fnord"
所以你只需要当前的标题("RStudio"?)或者它的 ID(可以用 wmctrl -l
获取)就可以了。
您可以在 R 中从 system
调用它并从 getwd()
粘贴当前工作目录。您可以使用 addTaskCallback
将其连接到 R 以在每个命令行上执行,至少在普通 R 上执行,但也许 RStudio 会搞砸这个。
回调示例:
定义一个函数:
> f = function(...){cat("Hello\n");TRUE}
将其添加到任务回调中:
> addTaskCallback(f, data = NULL, name = character())
1
1
Hello
现在 R 在每个命令后说 "Hello":
> ls()
[1] "f"
Hello
更改 f
以使用类似 system(paste0("wmctrl ..."))
的方式设置标题,然后就可以了。
我在 Ubuntu (16.04) 下使用 R studio(版本 1.0.143),window 标题只显示非常无用的 "RStudio"。
我希望至少拥有当前选项卡的名称,或者最好是与该选项卡对应的文件的完整路径。 Windows 下的完整路径似乎出现在 window 标题中。
这对于在 windows 之间导航可能很有用,但我的主要用途是用于跟踪每个软件所花费时间的软件(如 arbtt
)。目前我只能知道我上周在 R studio 里花了 20 个小时,但我想知道在哪个 files/projects.
这里提供了部分解决方案,但如果有人知道如何获取当前选项卡的完整名称和路径,我仍然很感兴趣。
基于@Spacedman 的回复,我现在可以通过在安装 wmctrl
后将此行添加到 /usr/lib/R/etc/Rprofile.site
来获取 window 标题中的工作目录路径(但不是脚本名称) :
RStudio_title <- function(...){system(paste0('wmctrl -r "RStudio" -N "RStudio - @ ', getwd(), '"')) ; TRUE}
addTaskCallback(RStudio_title, data = NULL, name = character())
一个问题是,如果您已经在标题中使用 "rstudio"(不区分大小写)打开 window(例如在网络浏览器中),则此 window 将收到新标题而不是 Rstudio window。有一个 -F
选项可以使 window 标题与提供的标题完全相同。我试图首先将 RStudio 标题修改为不太可能出现在另一个 window 中的标题,方法是将其添加到 Rprofile.site
中:
system('wmctrl -F -r "RStudio" -N "RStudio - @ "')
问题是 Rprofile.site 中的 system
R 函数调用似乎被 Rstudio 忽略了(虽然它在 rstudio 外部调用的 R 中工作)
事实上,来自Rprofile.site的system
命令并没有被忽略。它被执行但出于任何原因输出未显示在 Rstudio R 控制台中(例如,如果您键入 system("echo 'Hello World'")
)。请参阅
中的讨论
system('wmctrl -F -r "RStudio" -N "RStudio - @ "')
不起作用的原因可能是在执行此命令时(当 Rprofile.site 由 R 提供时),RStudio windows 尚不存在...
这就是我现在的做法,包括@Spacedman 的建议(即使用十六进制 ID 和 if(interactive())
)。即使已经有另一个 window 以 "RStudio" 标题打开,它也能正常工作。如果您从 Rstudio 重新启动 R,它也可以工作。如果你执行 rm(list=ls())
它将被破坏(带有一条消息)(我个人从不这样做,我更喜欢重新启动 R)
if(interactive()) {
# function to capture the hexadecimal ID of the R studio window
RStudio_ID <- function(...) {
Rstudio_wmctrl_ID <<- system("wmctrl -l | grep 'N/A RStudio' | sed -r 's/\s.*//'",
intern = TRUE); FALSE
}
# execute last function only once after the first completed top-level task
# (because the output of that function is FALSE)
addTaskCallback(RStudio_ID, data = NULL, name = character())
# function that will change the Rstudio window title
RStudio_title <- function(...){system(paste0('wmctrl -i -r ', Rstudio_wmctrl_ID,
' -N "RStudio - @ ', getwd(), '"')) ; TRUE}
# this function is executed after every completed top-level task
addTaskCallback(RStudio_title, data = NULL, name = character())
}
安装 wmctrl
,然后你可以将名为 "Calculator" 的标题更改为 "Fnord",如下所示:
xcalc &
wmctrl -r Calculator -N "Fnord"
所以你只需要当前的标题("RStudio"?)或者它的 ID(可以用 wmctrl -l
获取)就可以了。
您可以在 R 中从 system
调用它并从 getwd()
粘贴当前工作目录。您可以使用 addTaskCallback
将其连接到 R 以在每个命令行上执行,至少在普通 R 上执行,但也许 RStudio 会搞砸这个。
回调示例:
定义一个函数:
> f = function(...){cat("Hello\n");TRUE}
将其添加到任务回调中:
> addTaskCallback(f, data = NULL, name = character())
1
1
Hello
现在 R 在每个命令后说 "Hello":
> ls()
[1] "f"
Hello
更改 f
以使用类似 system(paste0("wmctrl ..."))
的方式设置标题,然后就可以了。