1
    2
    3
    4
    5
    6
    7
    8
    9
   10
   11
   12
   13
   14
   15
   16
   17
   18
   19
   20
   21
   22
   23
   24
   25
   26
   27
   28
   29
   30
   31
   32
   33
   34
   35
   36
   37
   38
   39
   40
   41
   42
   43
   44
   45
   46
   47
   48
   49
   50
   51
   52
   53
   54
   55
   56
   57
   58
   59
   60
   61
   62
   63
   64
   65
   66
   67
   68
   69
   70
   71
   72
   73
   74
   75
   76
   77
   78
   79
   80
   81
   82
   83
   84
   85
   86
   87
   88
   89
   90
   91
   92
   93
   94
   95
   96
   97
   98
   99
  100
  101
  102
  103
  104
  105
  106
  107
  108
  109
  110
  111
  112
  113
  114
  115
  116
  117
  118
  119
  120
  121
  122
  123
  124
  125
  126
  127
  128
  129
  130
  131
  132
  133
  134
  135
  136
  137
  138
  139
  140
  141
  142
  143
  144
  145
  146
  147
  148
  149
  150
  151
  152
  153
  154
  155
  156
  157
  158
  159
  160
  161
  162
  163
  164
  165
  166
  167
  168
  169
  170
  171
  172
  173
  174
  175
  176
  177
  178
  179
  180
  181
  182
  183
  184
  185
  186
  187
  188
  189
  190
  191
  192
  193
  194
  195
  196
  197
  198
  199
  200
  201
  202
  203
  204
  205
  206
  207
  208
  209
  210
  211
  212
  213
  214
  215
  216
  217
  218
  219
  220
  221
  222
  223
  224
  225
  226
  227
  228
  229
  230
  231
  232
  233
  234
  235
  236
  237
  238
  239
  240
  241
  242
  243
  244
  245
  246
  247
  248
  249
  250
  251
  252
  253
  254
  255
  256
  257
  258
  259
  260
  261
  262
  263
  264
  265
  266
  267
  268
  269
  270
  271
  272
  273
  274
  275
  276
  277
  278
  279
  280
  281
  282
  283
  284
  285
  286
  287
  288
  289
  290
  291
  292
  293
  294
  295
  296
  297
  298
  299
  300
  301
  302
  303
  304
  305
  306
  307
  308
  309
  310
  311
  312
  313
  314
  315
  316
  317
  318
  319
  320
  321
  322
  323
  324
  325
  326
  327
  328
  329
  330
  331
  332
  333
  334
  335
  336
  337
  338
  339
  340
  341
  342
  343
  344
  345
  346
  347
  348
  349
  350
  351
  352
  353
  354
  355
  356
  357
  358
  359
  360
  361
  362
  363
  364
  365
  366
  367
  368
  369
  370
  371
  372
  373
  374
  375
  376
  377
  378
  379
  380
  381
  382
  383
  384
  385
  386
  387
  388
  389
  390
  391
  392
  393
  394
  395
  396
  397
  398
  399
  400
  401
  402
  403
  404
  405
  406
  407
  408
  409
  410
  411
  412
  413
  414
  415
  416
  417
  418
  419
  420
  421
  422
  423
  424
  425
  426
  427
  428
  429
  430
  431
  432
  433
  434
  435
  436
  437
  438
  439
  440
  441
  442
  443
  444
  445
  446
  447
  448
  449
  450
  451
  452
  453
  454
  455
  456
  457
  458
  459
  460
  461
  462
  463
  464
  465
  466
  467
  468
  469
  470
  471
  472
  473
  474
  475
  476
  477
  478
  479
  480
  481
  482
  483
  484
  485
  486
  487
  488
  489
  490
  491
  492
  493
  494
  495
  496
  497
  498
  499
  500
  501
  502
  503
  504
  505
  506
  507
  508
  509
  510
  511
  512
  513
  514
  515
  516
  517
  518
  519
  520
  521
  522
  523
  524
  525
  526
  527
  528
  529
  530
  531
  532
  533
  534
  535
  536
  537
  538
  539
  540
  541
  542
  543
  544
  545
  546
  547
  548
  549
  550
  551
  552
  553
  554
  555
  556
  557
  558
  559
  560
  561
  562
  563
  564
  565
  566
  567
  568
  569
  570
  571
  572
  573
  574
  575
  576
  577
  578
  579
  580
  581
  582
  583
  584
  585
  586
  587
  588
  589
  590
  591
  592
  593
  594
  595
  596
  597
  598
  599
  600
  601
  602
  603
  604
  605
  606
  607
  608
  609
  610
  611
  612
  613
  614
  615
  616
  617
  618
  619
  620
  621
  622
  623
  624
  625
  626
  627
  628
  629
  630
  631
  632
  633
  634
  635
  636
  637
  638
  639
  640
  641
  642
  643
  644
  645
  646
  647
  648
  649
  650
  651
  652
  653
  654
  655
  656
  657
  658
  659
  660
  661
  662
  663
  664
  665
  666
  667
  668
  669
  670
  671
  672
  673

docs / sublime_ide.md [blame]

# Using Sublime Text as your IDE

Sublime Text is a fast, powerful and easily extensible code editor. Check out
some [visual demos](http://www.sublimetext.com) for a quick demonstration.

You can download and install Sublime Text 3 from the [Sublime Text
Website](http://www.sublimetext.com/3). Assuming you have access to the right
repositories, you can also install Sublime via apt-get on Linux. Help and
general documentation is available in the [Sublime Text 3
Docs](http://www.sublimetext.com/docs/3/).

Sublime can be used on Linux, Windows and Mac as an IDE for developing Chromium.
Here's what works:

*   Editing code works well (especially if you're used to it and get used to the
    shortcuts).
*   Navigating around the code works well. There are multiple ways to do this (a
    full list of keyboard shortcuts is available for [Windows/Linux](http://docs.sublimetext.info/en/latest/reference/keyboard_shortcuts_win.html)
    and [Mac](http://docs.sublimetext.info/en/latest/reference/keyboard_shortcuts_osx.html)).
*   Building works fairly well and it does a decent job of parsing errors so
    that you can click and jump to the problem spot.

[TOC]

## Setup

### Configuring Sublime

All global configuration for Sublime (including installed packages) is stored in
`~/.config/sublime-text-3` (or `%APPDATA\Sublime Text 3` on Windows, or
`~/Library/Application Support/Sublime Text 3` on Mac). We will reference the
Linux folder for the rest of this tutorial, but replace with your own path if
using a different OS. If you ever want a clean install, just remove this folder.

**Warning**: If you have installed a license key for a paid version Sublime
Text, removing this folder will delete the license key, too.

Most of the packages you will install will be placed in `~/.config/sublime-
text-3/Packages/User`, where Sublime Text can detect them. You can also get to
this folder by selecting `Preferences > Browse Packages...` (or `Sublime Text >
Preferences > Browse Packages...` on Mac).

### A short word about paths

Certain packages require executables to be on your `PATH`, but Sublime gets the
`$PATH` variable from a login shell, not an interactive session (i.e. your path
needs to be set in `~/.bash_profile`, `~/.zprofile`, etc, not `~/.bashrc`,
`~/.zshrc`, etc). For more info, see
[Debugging Path Problems](http://sublimelinter.readthedocs.io/en/latest/troubleshooting.html#debugging-path-problems).

### Editing Preferences

Sublime configuration (including project files, key bindings, etc) is done via
JSON files. All configurations have a Default config (usually provided with the
program or package to document the available commands) and a User config
(overrides the default; this is where your overrides go). For example, select
`Preferences > Settings - Default` to see all the available settings for
Sublime. You can override any of these in `Preferences > Settings - User`.

Here are some settings that help match the Chromium style guide:
```
{
  // Basic Chromium style preferences
  "rulers": [80],
  "tab_size": 2,
  "trim_trailing_white_space_on_save": true,
  "ensure_newline_at_eof_on_save": true,
  "translate_tabs_to_spaces" : true,

  // Optional, but also useful, preferences
  "always_show_minimap_viewport": true,
  "bold_folder_labels": true,
  "draw_white_space": "all",
  "enable_tab_scrolling": false,
  "highlight_line": true,

  // Mainly for Windows, but harmless on Mac/Linux
  "default_line_ending": "unix",
}
```

The settings will take effect as soon as you save the file.

#### Tips
*   `View > Side Bar > Show Open Files` will add a list of open files to the top
    of the sidebar
*   ``Ctrl+` `` will show the console; it shows errors and debugging output, and
    you can run Python
*   `View > Enter Distraction Free Mode` goes into fullscreen and removes
    Sublime's header and footer
*   `View > Layout > ...` changes the configuration of files you can open side-
    by-side
*   `Ctrl + P` (`Cmd + P` on Mac) quickly opens a search box to find a file or
    definition
*   `Alt + O` (`Alt + Cmd + Up` on Mac) switches between the source/header file
*   `Alt + PageUp`/`Alt + PageDown` (`Alt + Cmd + Left`/`Alt + Cmd + Right` on
    Mac) moves between tabs
*   `F12` (`Alt + Cmd + Down` on Mac) goes to the symbol's definition
*   With text selected, `Ctrl + D` will multi-select the next occurrence (so
    typing in one types in all of them), and `Ctrl+U` deselects
*   Similarly, after finding something with `Ctrl + F`, `Alt + Enter` will
    select all occurrences of the search query, which can be multi-edited
*   `Ctrl + X` without anything selected cuts the current line, then move to a
    different line and `Ctrl + V` pastes it below the current line

### Setting Sublime as the default Terminal editor

Add `export EDITOR="subl -w"` to your `~/.bashrc` file (or similar) to open git
commit messages, gn args, etc with Sublime Text. Since you may want to only open
sublime when using a non-SSH session, you can wrap it in the following:

```
if [ "$SSH_CONNECTION" ]; then
  export EDITOR='vim'
else
  export EDITOR='subl -w'
fi
```

### Installing the Package Manager

The Sublime Package Manager is the way most Sublime packages are installed and
configured. You can install the package manager by following in the
[installation instructions](https://packagecontrol.io/installation) on their
website. Once the package manager is installed, restart Sublime.

To install a package, press `Ctrl + Shift + P` and select `Package Manager:
Install Package` (the string match is fairly lenient; you can just type
`"instp"` and it should find it). Then type or select the package you want to
install.

#### Mac Paths Fix

There is a known bug on Mac where Sublime doesn't detect the current path
correctly. If you're using Mac, install the package `SublimeFixMacPath` to find
the path from your `~/.bashrc` file or similar.

## Making a New Project

Once you have a copy of the Chromium checkout, we'll make a new Sublime project
with the src directory as the root.

To do this, create a new file `chromium.sublime-project` (or whatever name you'd
like) in the folder above your `src/` directory, with the following contents
(the exclude patterns are needed - Sublime can't handle indexing all of Chrome's
files):

```json
{
  "folders": [
    {
      "name": "chromium",
      "path": "src",
      "file_exclude_patterns":
      [
        "*.vcproj",
        "*.vcxproj",
        "*.sln",
        "*.gitignore",
        "*.gitmodules",
        "*.vcxproj.*",
      ],
      "folder_exclude_patterns":
      [
        "build",
        "out",
        "third_party",
        ".git",
      ],
    },
    {
      "name": "Generated Files",
      "path": "src/out/Debug/gen",
    },
  ],
}
```

If you are working on Blink, or any other third-party subproject, you can add it
as a separate entry in the `folders` array:

```json
{
  "name": "blink",
  "path": "src/third_party/blink",
}
```

Once you've saved the file, select `Project > Switch Project` and navigate to
the `chromium.sublime-project` file.

### Code Linting with CPPLint (Chromium only)

**Note:** CPPLint enforces the Google/Chromium style guide, and hence is not
useful on third_party projects that use another style.

1.  Install the SublimeLinter package (`Ctrl + Shift + P > Install Package >
    SublimeLinter`).
1.  `cpplint` should be somewhere on your path so that SublimeLinter finds it.
    depot_tools includes `cpplint.py`, but it needs to be named `cpplint`, so on
    Linux and Mac you have to make a symlink to it:

    ```shell
    cd /path/to/depot_tools
    ln -s cpplint.py cpplint
    chmod a+x cpplint
    ```

1.  Install the SublimeLinter-cpplint package (`Ctrl + Shift + P > Install
    Package > SublimeLinter-cpplint`).

Now when you save a C++ file, red dots should appear next to lines that
invalidate the style. You can change this behavior with Choose Lint Mode
(`Ctrl + Shift + P > "lint mode"`).

You can also see and navigate all the linter errors with Show All Errors
(`Ctrl + Shift + P > "show all"`). You can also use Next Error/Previous Error
(and their associated shortcuts) to navigate the errors. The gutter at the
bottom of the screen shows the message for the error on the current line.

You can also change the style of dot next to the line with Choose Gutter Theme
(`Ctrl + Shift + P > "gutter"`)

For a list of all preferences, see `Preferences > Package Settings >
SublimeLinter > Settings - Default` (or `Settings - User` to edit your
preferences).

### Format Selection with Clang-Format (Chromium only)

**Note:** Like CPPLint, Clang-format enforces the Google/Chromium style guide,
and hence is not useful on third_party projects that use another style.

1.  Inside `src/`, run:

    ```shell
    cd /path/to/chromium/src
    cp third_party/clang-format/script/clang-format-sublime.py ~/.config/sublime-text-3/Packages/User/
    ```

1. This installs a plugin that defines the command "clang\_format". You can add
   the "clang\_format" command to `Preferences > Key Bindings - User`, e.g.:

    ```json
    [
        { "keys": ["ctrl+shift+c"], "command": "clang_format" },
    ]
    ```

2. Select some text and press `Ctrl + Shift + C` to format, or select no text to
   format the entire file

## CodeSearch Integration with Chromium X-Refs

With [Chromium X-Refs](https://github.com/karlinjf/ChromiumXRefs/) you can
perform [https://cs.chromium.org](https://cs.chromium.org) cross-reference
searches in your editor. This gives you the call graph, overrides, references,
declaration, and definition of most of the code. The results are as fresh as
the search engine's index so uncommitted changes won't be reflected.

More information on Chromium X-Ref's functionality (including keyboard and
mouse shortcuts) can be found on the [Chromium X-Refs
page](https://github.com/karlinjf/ChromiumXRefs/).


## Code Completion, Error Highlighting, Go-to-Definition, and Find References with LSP (clangd)

Gives Sublime Text 3 rich editing features for languages with Language Server
Protocol support. It searches the current compilation unit for definitions and
references and provides super fast code completion.

In this case, we're going to add C/C++ support.

1. Refer to [clangd.md](clangd.md) to install clangd and build a compilation
   database.

1. Install the [LSP Package](https://github.com/tomv564/LSP) and enable clangd
   support by following the [link](https://clang.llvm.org/extra/clangd/Installation.html#editor-plugins)
   and following the instructions for Sublime Text.

To remove sublime text's auto completion and only show LSPs (recommended), set
the following LSP preference:

```json
"only_show_lsp_completions": true
```

## Code Completion with SublimeClang (Linux Only) [Deprecated, see LSP above]

SublimeClang is a powerful autocompletion plugin for Sublime that uses the Clang
static analyzer to provide real-time type and function completion and
compilation errors on save. It works with Chromium with a script that finds and
parses the appropriate \*.ninja files to find the necessary include paths for a
given file.

**Note**: Currently, only the Linux setup of SublimeClang is working. However,
there are instructions below for Windows/Mac which you are welcome to try -- if
you can get them to work, please update these instructions ^\_^

More information on SublimeClang's functionality (including keyboard shortcuts)
can be found on the [SublimeClang GitHub
page](https://github.com/quarnster/SublimeClang).


### Linux

**Note** that there are recent (as of August 2017) changes to support C++14.
Namely, you must use a more recent clang (3.9 is known to work), and use its
resource directory instead of that supplied by SublimeClang.

1. Install a recent libclang-dev to get a copy of libclang.so. 3.4 isn't
   recent enough, but 3.9 works. If you use something different, change the
   names and paths accordingly:

    ```shell
    sudo apt-get install libclang-3.9-dev
    ```

1.  Build libclang.so and SublimeClang in your packages directory:

    ```shell
    cd ~/.config/sublime-text-3/Packages
    git clone --recursive https://github.com/quarnster/SublimeClang SublimeClang
    cd SublimeClang
    # Copy libclang.so to the internals dir
    cp /usr/lib/llvm-3.9/lib/libclang.so.1 internals/libclang.so
    # Fix src/main.cpp (shared_ptr -> std::shared_ptr)
    sed -i -- 's/shared_ptr/std::shared_ptr/g' src/main.cpp
    # Make the project - should be really quick, since libclang.so is already built
    cd src && mkdir build && cd build
    cmake ..
    make
    ```

1.  Edit your project file `Project > Edit Project` to call the script above
    (replace `/path/to/depot_tools` with your depot_tools directory):

    ```json
    {
      "folders":
      [
        ...
      ],
      "settings":
      {
        "sublimeclang_options":
        [
          "-Wno-attributes",
          "-resource-dir=/usr/lib/llvm-3.9/lib/clang/3.9.1",
        ],
        "sublimeclang_options_script": "python ${project_path}/src/tools/sublime/ninja_options_script.py -d '/path/to/depot_tools'",
      }
    }
    ```
1. Edit your SublimeClang settings and set `dont_prepend_clang_includes` to
   true. This way you use the resource directory we set instead of the ancient
   ones included in the repository. Without this you won't have C++14 support.

1. (Optional) To remove errors that sometimes show up from importing out of
   third_party, edit your SublimeClang settings and set:

   ```json
   "diagnostic_ignore_dirs":
   [
     "${project_path}/src/third_party/"
   ],
   ```

1.  Restart Sublime. Now when you save a file, you should see a "Reparsing…"
    message in the footer and errors will show up in the output panel. Also,
    variables and function definitions should auto-complete as you type.

**Note:** If you're having issues, adding `"sublimeclang_debug_options": true` to
your settings file will print more to the console (accessed with ``Ctrl + ` ``)
which can be helpful when debugging.

**Debugging:** If things don't seem to be working, the console ``Ctrl + ` `` is
your friend. Here are some basic errors which have workarounds:

1. Bad Libclang args
    - *problem:* ```tu is None...``` is showing up repeatedly in the console:
    - *solution:* ninja_options_script.py is generating arguments that libclang
    can't parse properly. To fix this, make sure to
    ```export CHROMIUM_OUT_DIR="{Default Out Directory}"```
    This is because the ninja_options_script.py file will use the most recently
    modified build directory unless specified to do otherwise. If the chosen
    build directory has unusual args (say for thread sanitization), libclang may
    fail.


### Mac (not working)

1.  Install cmake if you don't already have it
1.  Install XCode
1.  Copy libclang.dylib from XCode to the SublimeClang/internals folder:

    ```shell
    cd ~/Library/Application\ Support/Sublime\ Text\ 3/Packages
    git clone --recursive https://github.com/quarnster/SublimeClang SublimeClang
    cd SublimeClang
    cp /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/libclang.dylib internals/libclang.dylib
    # Remove i386 from the build file since XCode's libclang.dylib is only a 64-bit version
    sed -ie 's/CMAKE_OSX_ARCHITECTURES i386 x86_64/CMAKE_OSX_ARCHITECTURES x86_64/' src/CMakeLists.txt
    # Copy libclang.dylib to the internals dir
    # Make the project - should be really quick, since libclang.dylib is already built
    cd src && mkdir build && cd build
    cmake ..
    make
    ```

1.  The rest of the instructions are the same, but when adding your project
    settings, add these extra arguments to `sublimeclang_options`:

    ```json
    "sublimeclang_options":
    [
      ...
      // MAC-ONLY: Include these options, replacing the paths with the correct installed SDK
      "-isystem", "/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.10.sdk/usr/include/",
      "-isystem", "/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.10.sdk/usr/include/c++/4.2.1",
      "-F/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.10.sdk/System/Library/Frameworks/",
      "isysroot", "/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.10.sdk",
      "-mmacosx-version-min=10.7",
      "-stdlib=libc++",
      "-isystem", "/usr/include",
      "-isystem", "/usr/include/c++/*",
    ]
    ```

### Windows (not working)

You'll need cl.exe which can be installed with [the Visual C++ Build Tools
2015](https://blogs.msdn.microsoft.com/vcblog/2016/03/31/announcing-the-official-release-of-the-visual-c-build-tools-2015/).
You should have cl.exe on your `$PATH`, which you can get by running `C:\Program
Files (x86)\Microsoft Visual C++ Build Tools\Visual C++ 2015 x64 Native Build
Tools Command Prompt`.

Then you'll need a copy of libclang.so, which can be found on the [LLVM
website](http://llvm.org/releases/download.html). The instructions should be the
same as Linux from there.

## Alternative: Code Completion with Ctags

For a fast way to look up symbols, we recommend installing the CTags plugin.

1.  Install Exuberant Ctags and make sure that ctags is in your path:
    http://ctags.sourceforge.net/ (on linux you should be able to just do `sudo
    apt-get install ctags`)
1.  Install the Ctags plugin: `Ctrl + Shift + P > Install Package > Ctags`

Once installed, you'll get an entry in the context menu when you right click the
top level folder(s) in your project that allow you to build the Ctags database.
If you're working in a Chrome project however, do not do that at this point,
since it will index much more than you actually want. Instead, do one of:

1.  Create a batch file (e.g. ctags_builder.bat) that you can run either
    manually or automatically after you do a gclient sync:

    ```
    ctags --languages=C++ --exclude=third_party --exclude=.git --exclude=build --exclude=out -R -f .tmp_tags & ctags --languages=C++ -a -R -f .tmp_tags third_party\platformsdk_win7 & move /Y .tmp_tags .tags
    ```

    This takes a couple of minutes to run, but you can work while it is indexing.
1.  Edit the `CTags.sublime-settings` file for the ctags plugin so that it runs
    ctags with the above parameters.  Note: the above is a batch file - don't
    simply copy all of it verbatim and paste it into the CTags settings file)

Once installed, you can quickly look up symbols with `Ctrl+t, Ctrl+t` etc.  More
information on keyboard shortcuts can be found on the [CTags GitHub
page](https://github.com/SublimeText/CTags).

One more hint - Edit your `.gitignore` file (under `%USERPROFILE%` or `~/`) so
that git ignores the `.tags` file.  You don't want to commit it. :)

If you don't have a `.gitignore` in your profile directory, you can tell git
about it with this command: Windows: `git config --global core.excludesfile
%USERPROFILE%\.gitignore` Mac, Linux: `git config --global core.excludesfile
~/.gitignore`

## Building inside Sublime

To build inside Sublime Text, we first have to create a new build system.

You can add the build system to your project file (`Project > Edit Project`),
replacing `out/Debug` with your output directory (on Windows, replace /'s with
\s in `cmd` and `working_dir`):

```json
{
  "folders": [
  ...
  ],
  "build_systems":
  [
    {
      "name": "Build Chrome",
      "cmd": ["ninja", "-C", "out/Debug", "chrome"],
      "working_dir": "${project_path}/src",
      "file_regex": "^[.\\\\/]*([a-z]?:?[\\w.\\\\/]+)[(:]([0-9]+)[,:]?([0-9]+)?[)]?:(.*)$",
      "variants": [],
    },
  ],
}
```

The file regex will allow you to click on errors to go to the error line.

If you're using reclient, add the -j parameter (replace out/Debug with your out directory):
```
    "cmd": ["ninja", "-j", "1000", "-C", "out/Debug", "chrome"],
```

**Regex explanation:** Aims to capture these error formats while respecting
[Sublime's perl-like group matching](http://docs.sublimetext.info/en/latest/reference/build_systems/configuration.html#build-capture-error-output):

1.  `d:\src\chrome\src\base\threading\sequenced_worker_pool.cc(670): error
    C2653: 'Foo': is not a class or namespace name`
1.  `../../base/threading/sequenced_worker_pool.cc(670,26) error: use of
    undeclared identifier 'Foo'`
1.  `../../base/threading/sequenced_worker_pool.cc:670:26: error: use of
    undeclared identifier 'Foo'`

```
"file_regex": "^[.\\\\/]*([a-z]?:?[\\w.\\\\/]+)[(:]([0-9]+)[,:]?([0-9]+)?[)]?:(.*)$"
                (   0   ) (   1  )(    2     ) (3 )(  4   )( 5 )(   6   )(7 ) (8 )

(0) Cut relative paths (which typically are relative to the out dir and targeting src/ which is already the "working_dir")
(1) Match a drive letter if any
(2) Match the rest of the file
(1)+(2) Capture the "filename group"
(3) File name is followed by open bracket or colon before line number
(4) Capture "line number group"
(5) If (6) is non-empty there will be a comma or colon preceding it (but can't put it inside brackets as the "column number group" only wants digits).
(6) Capture "column number group" if any
(7) Closing bracket of either "(line)" or "(line,column)" if bracket syntax is in effect
(8) Everything else until EOL is the error message.
```

### Building other targets

You can add build variants to the `variants` array to have quick access to other
build targets with `Ctrl + Shift + B`:

```json
"variants":
  [
    {
      "name": "Unit Tests",
      "cmd": ["ninja", "-j", "1000", "-C", "out/Debug", "unit_tests"],
    },
    {
      "name": "Browser Tests",
      "cmd": ["ninja", "-j", "1000", "-C", "out/Debug", "browser_tests"],
    },
    {
      "name": "Current file",
      "cmd": ["compile_single_file", "--build-dir", "out/Debug", "--file-path", "$file"],
    },
  ]
```

You can also add a variant for running chrome, meaning you can assign a keyboard
shortcut to run it after building:

```json
"variants":
  [
    ...
    {
      "cmd": ["out/Debug/chrome"],
      "name": "run_chrome",
      "shell": true,
      "env": {
        "CHROME_DEVEL_SANDBOX": "/usr/local/sbin/chrome-devel-sandbox",
      },
    },
  ]
```

### More detailed stack traces

Chrome's default stack traces don't have full file paths so Sublime can't
parse them. You can enable more detailed stack traces and use F4 to step right
to the crashing line of code.

First, add `print_unsymbolized_stack_traces = true` to your gn args, and make
sure you have debug symbols enabled too (`symbol_level = 2`). Then, pipe
Chrome's stderr through the asan_symbolize.py script. Here's a suitable build
variant for Linux (with tweaked file_regex):

```json
{
  "name": "Build and run with asan_symbolize",
  "cmd": "ninja -j 1000 -C out/Debug chrome && out/Debug/chrome 2>&1 | ./tools/valgrind/asan/asan_symbolize.py",
  "shell": true,
  "file_regex": "(?:^|[)] )[.\\\\/]*([a-z]?:?[\\w.\\\\/]+)[(:]([0-9]+)[,:]?([0-9]+)?[)]?:?(.*)$"
}
```

You can test it by visiting chrome://crash. You should be able to step through
each line in the resulting stacktrace with F4. You can also get a stack trace
without crashing like so:

```c++
#include "base/debug/stack_trace.h"
[...]
base::debug::StackTrace().Print();
```

### Assigning builds to keyboard shortcuts

To assign a build to a keyboard shortcut, select `Preferences > Key Bindings -
User` (or `Key Bindings - Default` to see the current key bindings). You can add
the build variants above with the `"build"` command, like so:

```json
[
  ...
  { "keys": ["ctrl+shift+u"], "command": "build", "args": {"variant": "unit_tests"} },
  { "keys": ["ctrl+shift+b"], "command": "build", "args": {"variant": "browser_tests"} },
  { "keys": ["ctrl+shift+x"], "command": "build", "args": {"variant": "run_chrome"} },
]
```

For more info on custom key bindings, see the
[Sublime Text Key Bindings Documentation](http://docs.sublimetext.info/en/latest/customization/key_bindings.html).

## Other useful packages

Some other useful packages that improve sublime can be installed from `Ctrl+Shift+P > Install Package`:

*   Git enhancements
    *   [Git](https://packagecontrol.io/packages/Git)
    *   [GitCommitMsg](https://packagecontrol.io/packages/GitCommitMsg) -
        Performs a 'git blame' for one or more lines of code with `Alt + Shift +
        M` (`Command + Shift + M` on Mac)
    *   [GitDiffHelper](https://packagecontrol.io/packages/GitDiffHelper) -
        `Ctrl + Alt + G` to open all files modified since the last commit
    *   [GitOpenChangedFiles](https://packagecontrol.io/packages/GitOpenChangedFiles) -
        `Ctrl + Shift + O` (`Command + Shift + O` on Mac) to open all files
        modified on the current branch
    *   [Git Conflict
        Resolver](https://packagecontrol.io/packages/Git%20Conflict%20Resolver)
        - A GUI for resolving git conflicts
    *   [GitGutter](https://packagecontrol.io/packages/GitGutter) - Shows an
        icon next to lines that have been inserted, modified or deleted since
        the last commit.
*   Visual enhancements
    *   [SyncedSideBar](https://packagecontrol.io/packages/SyncedSideBar) -
        Syncs the currently open file with the expanded tree in the sidebar
    *   [SideBarEnhancements](https://packagecontrol.io/packages/SideBarEnhancements) -
        Adds more file management options to the sidebar context menu.
    *   [SyncedSidebarBg](https://packagecontrol.io/packages/SyncedSidebarBg) -
        A purely aesthetic improvement that syncs the sidebar background with
        the background color for the current theme.
    *   [Theme - Soda](http://buymeasoda.github.io/soda-theme/) - A global theme
        for Sublime that matches the default color scheme. Needs `"theme": "Soda
        Light 3.sublime-theme"` in your Preferences > Settings - User` file.
*   Code navigation tools
    *   [AutoFileName](https://packagecontrol.io/packages/AutoFileName) - Auto-
        completes filenames in #includes
    *   [Open-Include](https://packagecontrol.io/packagenavigations/Open-Include)
        - Opens the file path under the cursor with `Alt + D`
*   Text tools
    *   [Case Conversion](https://packagecontrol.io/packages/Case%20Conversion) -
        automatically changes the case of selected text, e.g. `kConstantName` to
        `CONSTANT_NAME`
    *   [Text Pastry](https://packagecontrol.io/packages/Text%20Pastry) -
        Inserts incremental number sequences with multi-select
    *   [Wrap Plus](https://packagecontrol.io/packages/Wrap%20Plus) - Auto-wraps
        a comment block to 80 columns with `Alt + Q` (was used to write this
        document! ;-)
    *   [Diffy](https://packagecontrol.io/packages/Diffy) - With two files
        opened side-by-side, `Ctrl + k Ctrl + d` will show the differences