配置 VSCODE 写 R 代码

使用 VSCODE 写代码还是很爽的,因为有非常充裕的插件,多种语言的支持,并解决了我远程写代码无法同时看到输出的痛点。这篇文章记录了我配置 VSCODE 的步骤以及遇到的问题与解决方式,一方面作为我的备忘,另一方面希望帮助到他人。

基本配置

  1. 安装R插件用于在VSCODE中识别R语言

    [图片上传失败...(image-cfe7c7-1664976327070)]

  2. R中安装以下R包

    install.packages("languageserver")
    install.packages("httpgd")
    
  3. VSCODE 中安装radian终端

    pip3 install -U radian
    
     安装完输入`radian`可以进入radian终端说明安装成功
    
  4. 使用radian替换默认终端

    文件 => 首选项 => 设置

    • 搜索r.rterm.windows, 输入radian.exe路径(如C:\Users\way\anaconda3\Scripts\radian.exe)
    • 搜索r.br,勾选R: Bracketed Paste
    • 搜索httpgd,勾选R › Plot: Use Httpgd
    • 搜索shell wind,勾选git bash

快捷输入

1. 快捷键

  • alt + -输入 <-
  • alt + = 输入管道 %>%
  • ctrl + enter 运行代码
  {
    "key": "alt+-",
    "command": "editor.action.insertSnippet",
    "when": "editorTextFocus&&editorLangId=='r'",
    "args": {
      "snippet": " <- "
    }
  },
  {
    "key": "alt+=",
    "command": "editor.action.insertSnippet",
    "when": "editorTextFocus&&editorLangId=='r'",
    "args": {
      "snippet": "%>%"
    }
  },
  {
    "key": "ctrl+enter",
    "command": "workbench.action.terminal.runSelectedText",
    "when": "editorTextFocus && editorHasSelection"
  },

2. 注释模板

通过输入anno**就可以生成不同样式的注释,如下

[图片上传失败...(image-7a939c-1664976327070)]

配置方式:ctrl+shift+p 输入Snippets: Configure User Snippets => 新建全局代码段文件,粘入以下内容:

{
    // Place your 全局 snippets here. Each snippet is defined under a snippet name and has a scope, prefix, body and 
    // description. Add comma separated ids of the languages where the snippet is applicable in the scope field. If scope 
    // is left empty or omitted, the snippet gets applied to all languages. The prefix is what is 
    // used to trigger the snippet and the body will be expanded and inserted. Possible variables are: 
    // $1, $2 for tab stops, $0 for the final cursor position, and ${1:label}, ${2:another} for placeholders. 
    // Placeholders with the same ids are connected.
    // Example:
    // "Print to console": {
    //  "scope": "javascript,typescript",
    //  "prefix": "log",
    //  "body": [
    //      "console.log('$1');",
    //      "$2"
    //  ],
    //  "description": "Log output to console"
    // }

    "Annotate steps":{
        "prefix": "annoStep",
        "body": ["###### $1"]
    },
    "Annotate header":{
        "prefix": "annoHead",
        "body": [
            "# TODO: ${1}",
            "#",
            "# Author: liuwei",
            "# Date:$CURRENT_YEAR-$CURRENT_MONTH-$CURRENT_DATE", 
            "###############################################################################"
            ]},

    "Annotate function":{
        "prefix": "annoFun",
        "body": [
            "#' @description ${1}",
            "#' @param ${2}",
            "#' @param ${3}",
            "#' @output ${4}",
            "#' @example ${5}",
            "#' @author ${6}"
        ]
    },

    "Annotate section":{
        "prefix": "annoSection",
        "body": [
            "###  ${1}",
            "#' ${2}",
            "##################$CURRENT_YEAR-$CURRENT_MONTH-$CURRENT_DATE##################",
        ],
    },

    "Annotate large section":{
        "prefix": "annoLarge",
        "body": [
            "########################################################",
            "#' ${1}",
            "#######################$CURRENT_YEAR-$CURRENT_MONTH-$CURRENT_DATE#######################",
        ]
    },

    "Annotate mid section":{
        "prefix": "annoMid",
        "body": [
            "### ${1}",
            "#' ${2}",
            "################################"
        ],
    },

    "Annotate small section":{
        "prefix": "annoSmall",
        "body": [
            "#######",
            "#' ${1}",
            "#######"
        ]
    },

    "Annotate test section":{
        "prefix": "annoTest",
        "body": [
            "########", 
            "$CURRENT_YEAR-$CURRENT_MONTH-$CURRENT_DATE", 
            "########",
            "#' -----------测试案例-----------",
            "${1}",
            "#' -----------结束测试-----------",
            "#####################"
        ],
    },

    "Annotate install":{
        "prefix": "annoInstall",
        "body": [
            "#######################安装过程#############################",
            "#' ${1}",
            "###########################$CURRENT_YEAR-$CURRENT_MONTH-$CURRENT_DATE#######################",
        ],
    },

    "Annotate modify":{
        "prefix": "annoModify",
        "body": [
            "#### 修改日志 - $CURRENT_YEAR-$CURRENT_MONTH-$CURRENT_DATE",
            "#' ${1}",
            "##",
        ],
    },

}

远程服务器配置

安装完这个插件后,在远程服务器上的操作就如同在本地一般丝滑,如下:

[图片上传失败...(image-77905-1664976327070)]

搜索安装Remote - SSH插件后,通过如下方式连接:

[图片上传失败...(image-d87f85-1664976327070)]

远程服务器错误解决

解决此问题需要三个包文件,可以访问此处下载:

链接:https://pan.baidu.com/s/1mQS1CAQHRTIoqWoCPWXbig?pwd=9rzi
提取码:9rzi

问题1:连接服务器报错:The remote host may not meet VS Code Server's prerequisites for glibc and libstdc++

解决方式参考:Using Visual Studio Code for C Programming on an Old Linux Remote Server,简述如下

1. 检查问题:

# 74b1f979648cc44d385a2286793c226e611f59e7 这串字符根据随机生成,请根据实际修改
$ cd $HOME/.vscode-server/bin/74b1f979648cc44d385a2286793c226e611f59e7
$ ./node # 出现以下输出说明C++版本不够
# ./node: /usr/lib64/libc.so.6: version `GLIBC_2.16' not found (required by ./node)
# ./node: /usr/lib64/libc.so.6: version `GLIBC_2.17' not found (required by ./node)
$ strings /lib64/libc.so.6 | grep GLIBC # 目前最高版本2.15,而最低要求是2.17
...
GLIBC_2.14
GLIBC_2.15
GLIBC_PRIVATE

2. 以非管理员身份安装这些库

2.1. 下载库文件:
  • glibc (the GNU C standard library): glibc-2.17–307.el7.1.x86_64.rpm
  • libstdc++ (C++ standard library): libstdc++-4.8.5–39.el7.x86_64.rpm
2.2. 建立伪root安装目录,把待安装文件放在里面
$ mkdir ~/local && cd ~/local
$ ll
total 4600
-rw-rw-r-- 1 liuwei2019 bioX 3817244 May 19 20:50 glibc-2.17-326.el7_9.x86_64.rpm     
-rw-rw-r-- 1 liuwei2019 bioX  816216 Jul 23 11:26 libstdc++-4.8.5-44.el7.x86_64.rpm
-rw-rw-r-- 1 liuwei2019 bioX   72524 Nov 13  2018 patchelf-0.9-10.sdl7.x86_64.rpm  
2.3. 解压抽取,创建类似于root用户的安装结构
$ rpm2cpio glibc-2.17-326.el7_9.x86_64.rpm | cpio -idmv
$ rpm2cpio rpm2cpio libstdc++-4.8.5-44.el7.x86_64.rpm | cpio -idmv
2.4. 检查glibc版本
$ find . -name "lib*.so.6"
$ strings ./lib64/libc.so.6 | grep GLIBC
...
GLIBC_2.16
GLIBC_2.17 # 满足需求
GLIBC_PRIVATE
$ strings ./usr/lib64/libstdc++.so.6 | grep GLIBCXX
...
GLIBCXX_3.4.18
GLIBCXX_3.4.19 # 满足需求
GLIBCXX_DEBUG_MESSAGE_LENGTH
2.5. 重新链接

现在需要告诉VSCode使用新安装的库,一个天真的想法是改变$LD_LIBRARY_PATH环境变量检查local文件夹,但是这会导致其它的命令不可用并且导致你无法再连上服务器(不要尝试)。我们需要改变的是可执行文件的链接,此时需要一个包:patchelf-0.9–10.el7.x86_64.rpm,这个包里面我们只需要保留patchelf命令,因此将它解压到一个临时目录,再把这个命令拷过来:

$ mkdir ../tmp && cd ../tmp
$ rpm2cpio patchelf-0.9-10.sdl7.x86_64.rpm | cpio -idmv
./usr/bin/patchelf
./usr/share/doc/patchelf-0.9
./usr/share/doc/patchelf-0.9/README      
./usr/share/licenses/patchelf-0.9        
./usr/share/licenses/patchelf-0.9/COPYING
./usr/share/man/man1/patchelf.1.gz       
333 blocks
$ mkdir -p ~/bin
$ cp usr/bin/patchelf  ~/bin
$ cd ..
$ rm -rf tmp/ #删除临时目录

之后进入 VSCode 目录运行以下代码:

$ cd $HOME/.vscode-server/bin/74b1f979648cc44d385a2286793c226e611f59e7
$ ~/bin/patchelf --set-interpreter $HOME/local/lib64/ld-linux-x86-64.so.2 --set-rpath $HOME/local/usr/lib64/:$HOME/local/lib64 node
2.6. 检查是否成功

上面的命令没有输出的话可以认为没有错误,让我们检查一下:

$ ldd node
...
        linux-vdso.so.1 (0x00007fff1ebff000)
        libdl.so.2 => /home/liuwei2019/local/lib64/libdl.so.2 (0x00007f0a29af1000)
        libstdc++.so.6 => /pub5/xiaoyun/BioSoftware/MATLAB/MATLAB_Compiler_Runtime/v714/sys/os/glnxa64/libstdc++.so.6 (0x00007f0a297eb000)
        libm.so.6 => /home/liuwei2019/local/lib64/libm.so.6 (0x00007f0a294e9000)
        libgcc_s.so.1 => /pub5/xiaoyun/BioSoftware/MATLAB/MATLAB_Compiler_Runtime/v714/sys/os/glnxa64/libgcc_s.so.1 (0x00007f0a292d2000)
        libpthread.so.0 => /home/liuwei2019/local/lib64/libpthread.so.0 (0x00007f0a290b6000)  
        libc.so.6 => /usr/lib64/libc.so.6 (0x000000390ee00000)
        /home/liuwei2019/local/lib64/ld-linux-x86-64.so.2 => /lib64/ld-linux-x86-64.so.2 (0x000000324d200000)

3. 大功告成,重新打开远程(虽然有警告,但我们已经可以成功连上服务器)

[图片上传失败...(image-56d05f-1664976327070)]

问题2:远程后 bash_profile不加载

修改settings.json,添加以下内容,参考

    "terminal.integrated.profiles.linux": {
        "bash": {
            "path": "bash",
            "args": [
                "-l"
            ]
        }
     }

其它插件:

https://renkun.me/2022/03/06/my-recommendations-of-vs-code-extensions-for-r/

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,098评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,213评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,960评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,519评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,512评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,533评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,914评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,574评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,804评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,563评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,644评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,350评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,933评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,908评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,146评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,847评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,361评论 2 342

推荐阅读更多精彩内容