如何在 rstudioapi::insertText 中使用缩进

How to use indentation with `rstudioapi::insertText`

我有一个字符串,我想使用 {rstudioapi} 将其缩进粘贴到 RStudio 中。这是一个简单的测试字符串:

test_str <- "for (i in seq_along(x)) {\nout[[i]] <- sum(x[[i]])\n}"
cat(test_str)

#> for (i in seq_along(x)) {
#> out[[i]] <- sum(x[[i]])
#> }

复制控制台输出并将其手动粘贴到 RStudio 中的 R 脚本时,输出具有正确的缩进,一个制表符等于两个空格(我的默认设置):

# this is my desired output (directly in a script, not the console):
for (i in seq_along(x)) {
  out[[i]] <- sum(x[[i]])
}

当使用 rstudioapi::insertText 时,字符串插入脚本时没有缩进:

rstudioapi::insertText(test_str)

for (i in seq_along(x)) {
out[[i]] <- sum(x[[i]]) # one tab (equalling two spaces) is missing
}

如何在使用 rstudioapi::insertText 或 {rstudioapi} 包中的任何其他函数时添加缩进?

阅读文档我找到了如何阅读系统缩进首选项:

rstudioapi::readRStudioPreference("num_spaces_for_tab")
#> 2

但是,我不知道如何让 insertText 使用这些信息。

更多上下文:
我正在寻找一种以编程方式向字符串输出添加缩进的方法。这意味着,我不想手动添加 \t 到应该有缩进的行。我在一个包中并且必须处理用户输入,这使得计算所需的正确缩进量可能非常困难。在上面的示例中,第 1 行和第 3 行不需要缩进,而第 2 行需要一个制表符或两个空格。

理想情况下,除了 {rstudioapi} 或 base R,我不想使用其他包。查看 documentation insertText 也有一个位置参数,它与位置或范围一起使用脚本。我不确定这是否可以以某种方式用于包含缩进。

我也在看 {datapasta} 包,它也使用 {rstudioapi} 和 here output_context 中使用了 "num_spaces_for_tab" 选项(在名为oc$nspc),但我不确定如何将它应用到我的问题中。

我没有听说 rstudioapi 库中有 缩进功能

但是我知道,styler有这个可能。

也许,对你也有帮助。

例子:

library(styler)

test_str <- "for (i in seq_along(x)) {\nout[[i]] <- sum(x[[i]])\n}" #your code

style_text(test_str, indent_by = 3)

一次输出:

for (i in seq_along(x)) {
   out[[i]] <- sum(x[[i]])
}

让我们将其添加到 insertText

> rstudioapi::insertText(style_text(test_str, indent_by = 3))
named list()
> for (i in seq_along(x)) {
+    out[[i]] <- sum(x[[i]])
+ }

有效吗?


一个补充

也许是这个?

\t 添加到我们的字符串中。

test_str <- "for (i in seq_along(x)) {\n\tout[[i]] <- sum(x[[i]])\n}"

因为你想看到两个空格,所以我们这样做:

> insertText(gsub('\t','  ', test_str))
named list()
> for (i in seq_along(x)) {
+   out[[i]] <- sum(x[[i]])
+ }

祝你好运;)

您可以使用 rstudioapi::executeCommand 启动 reindentreformatCode 命令:

如果您运行在编辑器中一起执行命令(例如ctrl+A Ctrl+Enter):

test_str <- "for (i in seq_along(x)) {\nout[[i]] <- sum(x[[i]])\n}"
rstudioapi::insertText(test_str)

# Should be adapted to the range you want to reformat (here : all lines)
ranges <- rstudioapi::document_range(c(1, 0), c(Inf, Inf))
rstudioapi::setSelectionRanges(ranges)
rstudioapi::executeCommand('reformatCode')

你得到:

for (i in seq_along(x)) {
  out[[i]] <- sum(x[[i]])
}

可用命令 ID 列表可用 here