Rstudio更有意义的窗口标题

3
我正在Ubuntu(16.04)下使用R Studio(版本1.0.143),但窗口标题只显示非常不具信息性的“RStudio”。
我希望至少能够看到当前选项卡的名称,或者理想情况下是与该选项卡对应的文件的完整路径。似乎在Windows下,窗口标题中会显示完整路径。
这可能有助于在窗口之间导航,但我的主要用途是跟踪每个软件中花费的时间(例如arbtt)。目前,我只知道上周在R Studio中花费了20小时,但我想知道是在哪些文件/项目中花费的时间。
下面有一个部分解决方案,但如果有人知道如何获取当前选项卡的完整名称和路径,我仍然很感兴趣。
根据@Spacedman的回复,我现在可以通过在安装wmctrl后将以下行添加到/usr/lib/R/etc/Rprofile.site来在窗口标题中获取工作目录路径(但无法获取脚本名称):
RStudio_title <- function(...){system(paste0('wmctrl -r "RStudio" -N "RStudio - @ ', getwd(), '"')) ; TRUE}
addTaskCallback(RStudio_title, data = NULL, name = character())

问题在于,如果您已经打开了一个标题中包含“rstudio”(不区分大小写)的窗口(例如在Web浏览器中),则该窗口将接收新标题,而不是Rstudio窗口。有一个-F选项可以使窗口标题严格与提供的标题相同。我尝试先通过将以下内容添加到Rprofile.site来修改RStudio标题,以使其更不可能出现在另一个窗口中:

system('wmctrl -F -r "RStudio" -N "RStudio - @ "')

问题在于 Rprofile.site 中的 system R 函数调用似乎被 Rstudio 忽略了(但在从 R 调用时可以正常工作)。
事实上,来自 Rprofile.site 的 system 命令并没有被忽略。它被执行了,但由于某种原因,在 Rstudio R 控制台中没有显示输出(例如,如果您键入 system("echo 'Hello World'"))。请参见此问题中的讨论。
system('wmctrl -F -r "RStudio" -N "RStudio - @ "') 不起作用的原因可能是在执行此命令时(当 R 加载 Rprofile.site 时),RStudio 窗口尚不存在...
现在我是这样做的,包括 @Spacedman 的建议(即使用十六进制 ID 和 if(interactive()))。即使已经打开了另一个标题为“RStudio”的窗口,它也能很好地工作。如果您执行 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())
}

1
你可以使用 wmctrl -i -r 0x04c0005c -N MyRStudio 通过唯一的十六进制 ID 匹配窗口,而不是窗口标题,因为如你所说,窗口标题可能不唯一。目前还不确定应用程序如何找到它的 ID,但你可以使用 wmctrl -l 来构建一个菜单,让用户选择。 - Spacedman
不确定为什么在Rprofile.site中它无法工作。可能是因为RStudio尚未完全启动,或者没有正确设置其窗口名称,或者窗口管理器尚未映射它。如果在Rprofile.site中放置wmctrl -l,它是否显示存在RStudio窗口? - Spacedman
1
你应该将所有这些内容隐藏在一个 if(interactive()) 块后面,这样你就不会破坏在 RStudio 之外运行的 R 代码。 - Spacedman
if(interactive()): 太好了,谢谢你的好主意! - Gilles San Martin
你可以使用 xwininfo 来提示用户单击 RStudio 窗口,并从中获取十六进制 ID。或者如果在命令行上,system("xprop -root _NET_ACTIVE_WINDOW") 应该能够获取具有焦点的窗口的 ID。但是,RStudio 可能在启动时不会获得焦点...无论如何,这些方法都有点hacky(这就是我喜欢它的原因!)。 - Spacedman
显示剩余2条评论
1个回答

1

安装 wmctrl ,然后您可以像这样将名为“Calculator”的东西的标题更改为“Fnord”:

 xcalc &
 wmctrl -r Calculator -N "Fnord"

所以你只需要当前的标题(“RStudio”?)或者它的ID(可以用wmctrl -l获取),然后就可以了。
你可以在R中使用system调用此功能,并从getwd()获取当前工作目录。你可以将其挂钩到R中,以便在每个命令行上执行,至少在普通的R中可以使用addTaskCallback,但是可能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 ..."))的内容来设置标题,然后完成。

感谢您的技巧。它没有提供脚本名称并且存在一些缺陷(请参见我的编辑问题),但它已经比仅使用“RStudio”作为标题要好得多了。 - Gilles San Martin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接