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