---
title: "Editor setup"
output: rmarkdown::html_vignette
vignette: >
  %\VignetteIndexEntry{Editor setup}
  %\VignetteEngine{knitr::rmarkdown}
  %\VignetteEncoding{UTF-8}
---

```{r, include = FALSE}
knitr::opts_chunk$set(
  collapse = TRUE,
  comment = "#>"
)

in_pkgdown <- identical(Sys.getenv("IN_PKGDOWN"), "true")

maybe_still <- function(url) {
  if (in_pkgdown) {
    url
  } else {
    gsub("\\.gif$", "-still.gif", url)
  }
}
```

```{r, echo = FALSE, results = 'asis'}
if (!in_pkgdown) {
  cat(
    "Note: This vignette is best viewed [online](https://lintr.r-lib.org/articles/editors.html),",
    "where we can render full animations of editor flows.\n"
  )
}
```

## RStudio

lintr lints are automatically displayed in the RStudio Markers pane (RStudio versions \> v0.99.206).

![RStudio Example](rstudio.png "Rstudio Example")

In order to show the "Markers" pane in RStudio: Menu "Tools" -\> "Global Options...", a window with title "Options" will pop up.
In that window: click "Code" on the left; click "Diagnostics" tab; check "Show diagnostics for R".

To lint a source file `test.R` type in the Console `lintr::lint("test.R")` and look at the result in the "Markers" pane.

This package also includes two addins for linting the current source and package.
To bind the addin to a keyboard shortcut navigate to Tools \> addins \> Browse Addins \> Keyboard Shortcuts.
It's recommended to use Alt+Shift+L for linting the current source lint and Ctrl+Shift+Alt+L to code the package.
These are easy to remember as you are Alt+Shift+L(int) ;)

## Emacs

lintr has [built-in integration](http://www.flycheck.org/en/latest/languages.html#r) with [flycheck](https://github.com/flycheck/flycheck) versions greater than `0.23`.
![Emacs Example](`r maybe_still("emacs.gif")` "Emacs Example")

### Installation

lintr is fully integrated into flycheck when using [ESS](http://ess.r-project.org/).
See the installation documentation for those packages for more information.

### Configuration

You can also configure what linters are used.
e.g. using a different line length cutoff.
- `M-x customize-option` -\> `flycheck-lintr-linters` -\> `linters_with_defaults(line_length_linter(120))`

## Vim - syntastic

lintr can be integrated with [syntastic](https://github.com/vim-syntastic/syntastic) for on-the-fly linting.

![Vim Example](`r maybe_still("vim-syntastic.gif")` "Vim Example")

### Installation

Put the file [syntastic/lintr.vim](https://raw.githubusercontent.com/r-lib/lintr/v2.0.1/inst/syntastic/lintr.vim) in `syntastic/syntax_checkers/r`.
If you are using [pathogen](https://github.com/tpope/vim-pathogen) this directory is `~/.vim/bundles/syntastic/syntax_checkers/r`.

You will also need to add the following lines to your `.vimrc`.

``` vim
let g:syntastic_enable_r_lintr_checker = 1
let g:syntastic_r_checkers = ['lintr']
```

### Configuration

You can also configure what linters are used.
e.g. using a different line length cutoff.

``` vim
let g:syntastic_r_lintr_linters = "linters_with_defaults(line_length_linter(120))"
```

## Vim - ALE

lintr can be integrated with [ALE](https://github.com/dense-analysis/ale) for on the fly linting.

### Installation

lintr is integrated with ALE and requires no additional installation.

### Configuration

You can configure what linters are used, e.g. using a different line length cutoff.

``` vim
let g:ale_r_lintr_options = "linters_with_defaults(line_length_linter(120))"
```

You can also configure whether `lint` or `lint_package` is used.
Set to 1 for `lint_package` and 0 (default) for `lint`.

``` vim
let g:ale_r_lintr_lint_package = 1
```

See `:h ale_r_lintr` for more information.

Note that configuration through `.lintr` files are not supported.

There is a work around that can be used to read the contents of a `.lintr` file
in the root of the working directory. This would allow the use of configuration
through `.lintr` files.

``` vim
if filereadable(".lintr")
  let g:ale_r_lintr_options = join(readfile('.lintr'))
endif
```

## Sublime Text 3

lintr can be integrated with [Sublime Linter](https://github.com/SublimeLinter/SublimeLinter) for on-the-fly linting.

![Sublime Example](`r maybe_still("sublime.gif")` "Sublime Example")

### Installation

Simply install `sublimeLinter-contrib-lintr` using [Package Control](https://packagecontrol.io/).

For more information see [Sublime Linter Docs](https://sublimelinter.readthedocs.io/en/latest/installation.html#installing-via-pc)

### Configuration

You can also configure what linters are used.
e.g. disabling the assignment linter and using a different line length cutoff.
In the SublimeLinter User Settings

```json
    {
      "linters": {
        "lintr": {
          "linters": "linters_with_defaults(assignment_linter = NULL, line_length_linter(120))"
        }
      }
    }
```

## Atom

lintr can be integrated with [Linter](https://github.com/steelbrain/linter) for on the fly linting.

![Atom Example](atom.png "Atom Example")

### Installation

Simply install `linter-lintr` from within Atom or on the command line with:

``` bash
apm install linter-lintr
```

For more information and bug reports see [Atom linter-lintr](https://github.com/AtomLinter/linter-lintr).

## Visual Studio Code

In Visual Studio Code, [vscode-R](https://github.com/REditorSupport/vscode-R#r-extension-for-visual-studio-code) presents the lintr diagnostics from [languageserver](https://github.com/REditorSupport/languageserver).

![VS Code Example](vscode.png "VS Code Example")

### Installation

Installing `languageserver` package in R and `vscode-R` extension in VS Code will enable lintr in VS Code by default or run the following command lines:

``` bash
Rscript -e 'install.packages("languageserver")'
code --install-extension reditorsupport.r
```
