Skip to content

Instantly share code, notes, and snippets.

@strengejacke
Last active May 13, 2024 01:24
Show Gist options
  • Save strengejacke/82e8d7b869bd9f961d12b4091c145b88 to your computer and use it in GitHub Desktop.
Save strengejacke/82e8d7b869bd9f961d12b4091c145b88 to your computer and use it in GitHub Desktop.
VS Code setup for R
// save to windows-user directory
linters: with_defaults(object_name_linter = NULL,
object_length_linter(50),
commented_code_linter = NULL,
object_usage_linter = NULL,
line_length_linter(120),
cyclocomp_linter = cyclocomp_linter(50))
[
/*
Keybindings for R Language ------------------------------------------------
*/
// Build RD files for R functions / packages
{
"description": "R Build Docs",
"key": "ctrl+shift+d",
// "command": "r.document",
"command": "r.runCommand",
"args": "devtools::document(roclets = c('rd', 'collate', 'namespace'))",
"when": "editorTextFocus || terminalFocus"
},
// Insert pipe-operator
{
"description": "R Pipe Operator",
"key": "ctrl+shift+m",
"command": "type",
"args": {"text": " |> "},
"when": "editorTextFocus || terminalFocus",
},
// Insert <- assignment
{
"description": "R Assignment Arrow",
"key": "alt+-",
"command": "type",
"args": {"text": " <- "},
"when": "editorTextFocus || terminalFocus",
},
// Build R *source* package (e.g. for submission to win-builder)
{
"description": "R Build Source Package",
"key": "ctrl+shift+b",
// "command": "r.build",
"command": "r.runCommand",
"args": "devtools::build()",
"when": "editorTextFocus || terminalFocus",
},
// Install R package (for developers)
{
"description": "R Install Package",
"key": "ctrl+shift+i",
// "command": "r.install",
"command": "r.runCommand",
"args": "devtools::install(quick=TRUE,upgrade=FALSE)",
"when": "resourceLangId == 'r'"
},
// Restart R session, to clean workspace and namespace
{
"description": "R Restart Session",
"key": "ctrl+shift+F10",
"command": "r.runCommand",
"when": "editorLangId == 'r'",
"args": "startup::restart()"
},
// Loads current package (for developers), local install
{
"description": "R Load Package",
"key": "ctrl+alt+l",
"command": "r.loadAll",
"when": "editorLangId == 'r' || editorTextFocus && editorLangId == 'rmd'"
},
// Update R packages
{
"description": "R Update Packages",
"key": "ctrl+shift+u",
"command": "r.runCommand",
"args": "vsCodeSnippets::update_R_packages()",
"when": "resourceLangId == 'r' || terminalFocus"
},
// Create reprex (must be in clipboard)
{
"description": "R Create Reprex",
"key": "ctrl+shift+x",
"command": "r.runCommand",
"args": "reprex::reprex()",
"when": "resourceLangId == 'r'"
},
// Compile report (knit R Script)
{
"description": "R Compile Report",
"key": "ctrl+shift+t",
"command": "r.runCommand",
"args": "rmarkdown::render(input=rstudioapi::getSourceEditorContext()$path)",
"when": "resourceLangId == 'r'"
},
// Show help for function at cursor position
{
"description": "R Show Documentation",
"key": "f1",
"command": "r.helpPanel.openForSelection",
"when": "editorLangId == 'r' || editorTextFocus && editorLangId == 'rmd'"
},
/*
Editor-specific keybindings -----------------------------------------------
*/
// View R workspace
{
"description": "View: Show R Workspace",
"key": "ctrl+shift+w",
"command": "workbench.view.extension.workspaceViewer"
},
// Format Code
{
"key": "ctrl+shift+a",
"command": "editor.action.formatSelection",
"when": "editorHasDocumentSelectionFormattingProvider && editorTextFocus && !editorReadonly"
},
// Show all symbols (objects, ...)
{
"key": "ctrl+oem_period",
"command": "workbench.action.showAllSymbols"
},
// new R file
{
"key": "ctrl+n",
"command": "r.newFileDocument"
},
// new file
{
"key": "ctrl+shift+n",
"command": "welcome.showNewFileEntries"
},
// switch position of panel
{
"key": "shift+alt+7",
"command": "workbench.action.positionPanelRight"
},
{
"key": "shift+alt+8",
"command": "workbench.action.positionPanelBottom"
},
// other stuff
{
"key": "ctrl+alt+l",
"command": "quarto.previewShortcut",
"when": "editorLangId == 'dot' || editorLangId == 'mermaid' || editorLangId == 'quarto'"
},
{
"key": "ctrl+l",
"command": "workbench.action.terminal.clear",
"when": "terminalFocus"
},
// requires extension "multi-command"
{
"key": "ctrl+shift+j",
"command": "extension.multiCommand.execute",
"args": {
"sequence": [
"workbench.action.toggleMaximizedPanel",
"workbench.action.terminal.focus"
]
},
"when": "editorTextFocus || terminalFocus"
},
// lock scrolling, to synch scrolling across editor windows
{
"key": "ctrl+t",
"command": "workbench.action.toggleLockedScrolling"
},
/*
Switch default keybindings for these commands -----------------------
*/
{
"key": "shift+f12",
"command": "references-view.findReferences",
"when": "editorHasReferenceProvider"
},
{
"key": "shift+alt+f12",
"command": "editor.action.goToReferences",
"when": "editorHasReferenceProvider && editorTextFocus && !inReferenceSearchEditor && !isInEmbeddedEditor"
},
{
"key": "ctrl+oem_5",
"command": "editor.action.jumpToBracket",
"when": "editorTextFocus"
},
{
"key": "ctrl+shift+oem_5",
"command": "workbench.action.splitEditor"
},
{
"key": "alt+oem_5",
"command": "workbench.action.splitEditorDown"
},
/*
Unbinding pre-defined shortcuts ----------------------------------------
*/
{
"key": "ctrl+k ctrl+f",
"command": "-editor.action.formatSelection",
"when": "editorHasDocumentSelectionFormattingProvider && editorTextFocus && !editorReadonly"
},
{
"key": "ctrl+oem_period",
"command": "-editor.action.quickFix",
"when": "editorHasCodeActionsProvider && editorTextFocus && !editorReadonly"
},
{
"key": "ctrl+t",
"command": "-workbench.action.showAllSymbols"
},
{
"key": "ctrl+shift+d",
"command": "-workbench.view.debug",
"when": "viewContainer.workbench.view.debug.enabled"
},
{
"key": "ctrl+shift+x",
"command": "-workbench.view.extensions",
"when": "viewContainer.workbench.view.extensions.enabled"
},
{
"key": "ctrl+shift+u",
"command": "-workbench.action.output.toggleOutput",
"when": "workbench.panel.output.active"
},
{
"key": "ctrl+shift+w",
"command": "-workbench.action.closeWindow"
},
{
"key": "ctrl+shift+l",
"command": "-quarto.previewShortcut",
"when": "editorLangId == 'dot' || editorLangId == 'mermaid' || editorLangId == 'quarto'"
},
{
"key": "ctrl+shift+n",
"command": "-workbench.action.newWindow"
},
{
"key": "ctrl+n",
"command": "-workbench.action.files.newUntitledFile"
},
{
"key": "ctrl+alt+win+n",
"command": "-welcome.showNewFileEntries"
},
{
"key": "shift+alt+f12",
"command": "-references-view.findReferences",
"when": "editorHasReferenceProvider"
},
{
"key": "shift+f12",
"command": "-editor.action.goToReferences",
"when": "editorHasReferenceProvider && editorTextFocus && !inReferenceSearchEditor && !isInEmbeddedEditor"
},
{
"key": "shift+f12",
"command": "-goToPreviousReference",
"when": "inReferenceSearchEditor || referenceSearchVisible"
},
{
"key": "ctrl+oem_5",
"command": "-workbench.action.splitEditor"
},
{
"key": "ctrl+shift+oem_5",
"command": "-editor.action.jumpToBracket",
"when": "editorTextFocus"
},
{
"key": "ctrl+shift+b",
"command": "-workbench.action.tasks.build",
"when": "taskCommandsRegistered"
},
{
"key": "shift+f1",
"command": "workbench.action.showCommands"
},
{
"key": "f1",
"command": "-workbench.action.showCommands"
},
{
"key": "ctrl+shift+t",
"command": "-workbench.action.reopenClosedEditor"
}
]
{
// Place your snippets for r here. Each snippet is defined under a snippet name and has a prefix, body and
// description. 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": {
// "prefix": "log",
// "body": [
// "console.log('$1');",
// "$2"
// ],
// "description": "Log output to console"
// }
"VS Code Debugging": {
"prefix": ["deb", "debugging"],
"body": ["vsCodeSnippets::load_debug_pkg()"],
"description": "Loads package for debugging and refreshes breakpoints"
},
"VS Code Debugging 2": {
"prefix": ["fixit"],
"body": [
"ret <- pkgload::load_all()",
"exports <- as.environment(paste0(\"package:\", environmentName(ret$env)))",
"vscDebugger::.vsc.refreshBreakpoints(list(ret$env, exports))"
],
"description": "Loads package for debugging and refreshes breakpoints (no need for vcCodeSnippets)"
}
}
{
// workspace, workbench and window settings
"workbench.startupEditor": "none",
"workbench.panel.defaultLocation": "right",
"workbench.colorTheme": "Default Dark+",
"security.workspace.trust.untrustedFiles": "open",
"window.commandCenter": true,
"explorer.confirmDelete": false,
"diffEditor.renderSideBySide": false,
"diffEditor.ignoreTrimWhitespace": false,
"diffEditor.experimental.showMoves": true,
// terminal settings
"terminal.integrated.defaultProfile.windows": "R Terminal",
"terminal.integrated.fontWeightBold": "normal",
"terminal.integrated.enableMultiLinePasteWarning": "never",
"terminal.integrated.cursorStyle": "underline",
"terminal.integrated.cursorBlinking": true,
// editor settings
"editor.stickyScroll.enabled": true,
"editor.minimap.enabled": false,
"editor.formatOnPaste": true,
"editor.unicodeHighlight.nonBasicASCII": true,
"editor.tabSize": 2,
"editor.detectIndentation": false,
"editor.defaultFormatter": "REditorSupport.r",
"editor.guides.indentation": false,
"editor.fontFamily": "'Fira Code', Hasklig, Consolas, 'Courier New', monospace",
"editor.fontLigatures": true,
"editor.inlineSuggest.enabled": true,
"editor.guides.bracketPairs": "active", // adds guides to matching brackets
"editor.accessibilitySupport": "off",
"editor.rulers": [
{"column": 80, "color": "#5a5a5a80"}, // right rule
{"column": 95, "color": "#5a5a5a30"}, // right rule
{"column": 120, "color": "#5a5a5a40"} // extra right rule
],
// remember (and restore) unsaved files even when switching workspaces
"files.hotExit": "onExitAndWindowClose",
// make sure ".rmd" files are treated as R Markdown
"files.associations": {
"*.rmd": "rmd"
},
// other extension settings
// allows PathAutocomplete to start completion after typing "."
// use "./<filename>" for correct file paths
"path-autocomplete.pathMappings": {
".": "${workspace}"
},
// git settings
"git.autofetch": true,
"git.confirmSync": false,
"git.suggestSmartCommit": false,
// r settings
"r.alwaysUseActiveTerminal": true,
"r.bracketedPaste": true,
"r.plot.useHttpgd": true,
"r.plot.defaults.fullWindowMode": true,
"r.rpath.windows": "C:\\Program Files\\R\\R-4.3.3\\bin\\R.exe",
"r.rterm.windows": "C:\\Program Files\\R\\R-4.3.3\\bin\\x64\\Rterm.exe",
// "r.rterm.windows": "C:\\Users\\mail\\AppData\\Local\\Programs\\Python\\Python311\\Scripts\\radian.exe",
"r.removeLeadingComments": true,
"r.session.levelOfObjectDetail": "Normal",
"quarto.mathjax.theme": "dark",
// github settings
"githubPullRequests.fileListLayout": "tree",
"githubPullRequests.defaultMergeMethod": "squash",
"githubPullRequests.pullBranch": "never",
"github-actions.org-features": true,
// TODO highlighter
"todohighlight.include": [
"**/*.r"
],
"todohighlight.keywords": [
{
"text": "TODO",
// "color": "#1ab7ea",
"color": "#fffc00",
"backgroundColor": "rgba(245, 145, 0, .66)",
}
],
// StatusBar Debugger
"statusbarDebugger.actions": [
"step_over",
"step_into",
"step_out",
"restart",
"stop"
],
"statusbarDebugger.actionsIcons": [
"$(debug-step-over)",
"$(debug-step-into)",
"$(debug-step-out)",
"$(debug-step-back)",
"$(debug-stop)"
],
"debug.toolBarLocation": "docked",
// Codesnap
"codesnap.boxShadow": "rgba(0, 0, 0, 0.55) 0px 20px 60px",
"codesnap.backgroundColor": "#6090a0",
"codesnap.containerPadding": "1em",
"codesnap.showWindowControls": false,
"codesnap.shutterAction": "copy",
// todo tree
"todo-tree.highlights.customHighlight": {
"TODO": {
"background": "#F5910044",
"foreground": "#fffc00FF"
},
"BUG": {
"icon": "bug",
"background": "#D3262655",
"foreground": "#FF3300FF"
},
"HACK": {
"icon": "tools"
},
"FIXME": {
"icon": "flame",
"background": "#00996844",
"foreground": "#25D366FF"
}
},
// GitHub Copilot
"github.copilot.enable": {
"files.associations": {
"*.R": "r"
},
"languages": [{
"id": "r",
"extensions": [ ".r", ".R", ".rmd", ".Rmd" ],
"aliases": [ "R" ]
}],
"quarto": false,
"*": true
},
"chatgpt.lang": "en"
}
@gadepallivs
Copy link

gadepallivs commented Jan 25, 2024

Thank you for this detailed gist. It is quite helpful.
I would like to use VS code IDE for R development. My work revolves around, shiny, API's, developing workflow pipelines ( Nextflow, snakemake, WDL), connecting to remote DB's, and submitting jobs to remote servers. Any specific extensions you would recommend to make the development process a bit easier in VS code ?

The most used features for me on Rstudio are, "

publish button for shiny apps, Knitr, markdown preview or quarto preview feature, 'cmd+enter' to run each line of code.

Is there a way we can set-up some of these features to work in VS code ? I work on Mac OS, what aspects of the .json settings need to be changed specifically to Mac ? Do you have similar setup guidelines for IOS?

PS: I guess the publish button in Rstudio may be out-of-scope , and wish Rstudio would make it available. The tedious task with shiny apps is to host them ( if not using Rstudio products). Is there any simpler way to host shiny apps from VS code ?

@aminuldu07
Copy link

does the vscode has data viewer like in Rstudio?
I mean in rstudio, i can open a data frame and search within it ? does vs code has this capability? Thanks.

@strengejacke
Copy link
Author

knitr, preview of markdown/quarto files and Ctrl+enter are available in vscode. Not sure about shiny apps though, since I don't use it.
A data viewer is available, but probably less sophisticated. Click on the magnifier next to the data frame in the workbench, where you see all objects in your environment

@strengejacke
Copy link
Author

There's a ShinyUiEditor-Extension, that might be able to do this.

@grcatlin
Copy link

@aminuldu07 @strengejacke The data viewer in VS Code can also be accessed with View(). I.E.,

View(mtcars)
# or
mtcars |> View()

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment