动态 Rstudio 代码片段

Posted

技术标签:

【中文标题】动态 Rstudio 代码片段【英文标题】:Dynamic Rstudio Code Snippet 【发布时间】:2015-12-14 12:50:00 【问题描述】:

我倾向于在我的代码中使用很多换行符,如下所示:

# Data =========================================================================

整个评论的长度始终为 80 个字符(包括主题标签)。我想做的是为Rstudio编写一个代码sn-p,它将插入主题标签,然后是一个空格,然后允许用户输入一系列单词,然后插入另一个空格,最后填写一堆“ =" 直到达到 80 个字符的限制。

我完全不熟悉 sn-ps 的工作原理,所以我不确定这有多难。

我有这么多:

snippet lb
  # $1:name

但我不知道如何添加动态数量的“=”符号。另外,lb = linebreak。

【问题讨论】:

【参考方案1】:

很遗憾,你不能用 sn-ps 做到这一点; sn-p 是一个文本模板,其中包含固定文本和用户插入文本的插槽。

但是,RStudio 中内置了一个命令来执行非常相似的操作;从代码菜单中,选择插入节(或 Ctrl+Shift+R)。这将完全按照您的描述进行,但有两个小区别:

    该行将延伸到打印边距前 5 个字符(您可以在工具 -> 全局选项 -> 代码中调整打印边距。

    该行由-而不是=字符组成。

以这种方式标记的部分的一个优点是您可以使用它们在文件内折叠和导航(添加后查看编辑器状态栏)。

【讨论】:

谢谢!我认为没有办法让它一直到打印边距或将字符更改为=? 不幸的是,两者都不可配置,尽管您可以将打印边距更改为 85 个字符。 ;-)【参考方案2】:

您可以在 sn-p 中使用rstudioapi(可以返回列位置)来获得您想要的东西。

下面是我使用的名为endhead 的sn-p。我通过评论我的标题标题然后应用sn-p来使用它,例如:

# Section name endhead

导致:

# Section name -----------------------------------------------------------------
snippet endhead
    `r paste0(rep.int("-", 88 - rstudioapi::primary_selection(rstudioapi::getActiveDocumentContext())$range$start[2]), collapse = "")`

【讨论】:

【参考方案3】:

您可以编写一个 sn-p 来操作文本(有点)。我写了下面的 sn-p 来做类似于你想做的事情。我仍在解决问题(刚刚问过this question)。

snippet comm
    `r paste0(
        "#######################################><###################\n##  ", 
        date(), 
        " -------------------------------\n##  ", 
        eval(
            paste0(
                gsub(
                    ".1,51\\s?\\K\\b", 
                    "\n##  ", 
                    gsub("\\.", " ", paste0(text)), 
                    perl = T
                )
            )
        ), 
        "###################################><###################\n"
    )`

我认为,如果您使用匿名函数编写 R 代码 sn-p,该函数接受通过 $$ 输入的文本,计算文本中的 nchar,计算最后需要的 - 的数量,然后使用eval(paste0()) 插入您应该能够使其工作的评论。如果我弄清楚了,我会在这里发表评论或回答。如果你让它工作,请对我的问题做同样的事情。谢谢。 (PS Go Badgers!)

【讨论】:

【参考方案4】:

受上面 nick 回答的启发,我设计了两个 sn-ps,允许用户选择要插入的级别部分。

第一个将用#=- 填写该行的其余部分。

snippet end
    `r strrep(ifelse(substr("$$", 1, 1) %in% c("-", "="), substr("$$", 1, 1), "#"), 84 - rstudioapi::primary_selection(rstudioapi::getActiveDocumentContext())$range$start[2])`

只需在end 之后指定要使用的字符(如果没有给出任何字符或任何其他字符,则默认为#)。例如:

## Level 1 Header end<shift+tab>
## Level 2 Header end=<shift+tab>
## Level 3 Header end-<shift+tab>
end<shift+tab>   
end=<shift+tab>  
end-<shift+tab>  

产生以下几行:

## Level 1 Header ##############################################################
## Level 2 Header =============================================================
## Level 3 Header -------------------------------------------------------------
################################################################################
===============================================================================
-------------------------------------------------------------------------------

【讨论】:

【参考方案5】:

与 Josh 的建议类似,以下 sn-p 使用 $$ 表示法传递 sn-p 后面的文本,如 here 所述。

snippet !
    `r paste("##", substr("$$", 4, nchar("$$")), strrep(substr("$$", 2, 2), 79-nchar("$$")))`

这再次允许用户选择部分级别(#=-)。 !# 之后的第一个字符应该是您想要的标题级别字符,后跟空格和标题文本。例如:

!## Level 1 Header<shift+tab>
!#= Level 2 Header<shift+tab>
!#- Level 3 Header<shift+tab>

产生以下几行:

## Level 1 Header ##############################################################
## Level 2 Header ==============================================================
## Level 3 Header --------------------------------------------------------------

我更喜欢上面的end sn-p,因为它更健壮,只允许在! 允许插入任何字符的地方插入字符#=-,但它是比调用rstudioapi 更短,我认为更容易理解。

!loon<shift+tab>
## n ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo

【讨论】:

以上是关于动态 Rstudio 代码片段的主要内容,如果未能解决你的问题,请参考以下文章

支持动态或静态片段的不同屏幕尺寸?

在片段中动态添加文本视图

RecyclerView holder中的Android Google Maps动态片段

asp.net页面实用代码片段

scrapy按顺序启动多个爬虫代码片段(python3)

将片段添加到片段中(嵌套片段)