动态 Rstudio 代码片段

Dynamic Rstudio Code Snippet

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

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

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

我完全不熟悉代码片段的工作原理,所以我不确定这有多难。

我有这么多:

snippet lb
  # ${1:name}

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

不幸的是,你不能用片段来做到这一点;片段是一个文本模板,其中包含带有用于用户插入文本的插槽的固定文本。

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

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

  2. 该行由 - 个字符组成,而不是 = 个字符。

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

您可以编写一个片段来(某种程度上)操作文本。我写了下面的代码片段来做一些类似于你想做的事情。我仍在解决问题(刚问 )。

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

我认为如果您使用接受通过 $$ 接受文本输入的匿名函数编写 R 代码片段,计算文本中的 nchar,计算 - 的数量'最后需要 s,然后使用 eval(paste0()) 插入您应该能够使其工作的注释。如果我弄明白了,我会 post 在这里发表评论或回答。如果你让它工作,请对我的问题做同样的事情。谢谢。 (P.S。加油吧!)

您可以在代码段内使用 rstudioapi(可以是 return 列位置)来获得您想要的内容。

下面是我使用的片段 endhead。我通过评论我的 header 标题然后应用代码段来使用它,例如:

# Section name endhead

这导致:

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

受上面尼克回答的启发,我设计了两个片段,允许用户选择要插入的级别部分。

第一个将用 #=-.

填充该行的其余部分
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 -------------------------------------------------------------
################################################################################
===============================================================================
-------------------------------------------------------------------------------

与 Josh 的建议类似,以下代码段使用 $$ 符号按照 here.

所述的方式传递代码段后面的文本
snippet !
    `r paste("##", substr("$$", 4, nchar("$$")), strrep(substr("$$", 2, 2), 79-nchar("$$")))`

同样,这允许用户 select 部分级别(#=-)。 !# 之后的第一个字符应该是您想要的 header 级别字符,后跟 space 和 header 文本。例如:

!## 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 片段,因为它更健壮并且只允许插入字符 #=- 作为 ! 将允许任何内容,但它比调用 rstudioapi.

更短,而且我认为更容易理解
!loon<shift+tab>
## n ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo