-
Notifications
You must be signed in to change notification settings - Fork 6
/
vim.html
332 lines (266 loc) · 16.4 KB
/
vim.html
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
<!DOCTYPE html>
<html lang="en-US">
<head>
<meta name="msapplication-config" content="/browserconfig.xml"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<meta charset="utf-8"/>
<link rel="apple-touch-icon" type="image/png" href="/apple-touch-icon.png"/>
<link rel="manifest" type="application/manifest+json" href="/site.webmanifest"/>
<link rel="mask-icon" type="image/svg+xml" href="/mask-icon.svg" color="#990000"/>
<link rel="shortcut icon" type="image/png" href="/favicon.png"/>
<title>Drake: Vim/Neovim Notes</title>
<meta
name="description"
content="Drake ("dragon" in Middle English) is a C++ toolbox started by the Robot
Locomotion Group at the MIT Computer Science and Artificial Intelligence
Lab (CSAIL). The development team has now grown significantly, with core
development led by the Toyota Research Institute. It is a collection of
tools for analyzing the dynamics of our robots and building control
systems for them, with a heavy emphasis on optimization-based design/
analysis.
"/>
<!--
The "Work Sans" font is licensed under the SIL Open Font License (OFL). For
more information, see:
- https://fonts.google.com/specimen/Work+Sans?preview.text_type=custom#about
- https://scripts.sil.org/cms/scripts/page.php?site_id=nrsi&id=OFL
-->
<link href="https://fonts.googleapis.com/css2?family=Space+Mono:wght@400;700&family=Work+Sans:wght@300;400;600;700;800&display=swap" rel="stylesheet"/>
<link rel="stylesheet" href="/third_party/github-styling/github-markdown.css"/>
<link rel="stylesheet" href="/third_party/dracula/syntax.css"/>
<link rel="stylesheet" href="/third_party/pylons/pylons.css"/>
<link rel="stylesheet" href="/assets/css/main.css"/>
</head>
<body>
<header class="site-header">
<div class="site-header-inner contain">
<a href="/" class="drake-logo">
<img src="/images/drake-logo-white.svg">
</a>
<div class="menu-mobile-toggle">
<span></span>
</div>
<nav class="site-menu">
<ul>
<li class="site-menu-item site-menu-item-main">
<a href="/" class="site-menu-item">Home</a>
</li>
<li class="site-menu-item site-menu-item-main">
<a href="/installation.html" class="site-menu-item">Installation</a>
</li>
<li class="site-menu-item site-menu-item-main">
<a href="/gallery.html" class="site-menu-item">Gallery</a>
</li>
<li class="site-menu-item site-menu-item-main">
API Documentation
<div class="sub">
<a href="/doxygen_cxx/index.html" class="site-menu-item">C++</a>
<a href="/pydrake/index.html" class="site-menu-item">Python</a>
</div>
</li>
<li class="site-menu-item site-menu-item-main">
Resources
<div class="sub">
<a href="/getting_help.html" class="site-menu-item">Getting Help</a>
<a href="https://deepnote.com/workspace/Drake-0b3b2c53-a7ad-441b-80f8-bf8350752305/project/Tutorials-2b4fc509-aef2-417d-a40d-6071dfed9199/%2Findex.ipynb" class="site-menu-item">Tutorials</a>
<a href="/python_bindings.html" class="site-menu-item">Python Bindings</a>
<a href="/developers.html" class="site-menu-item">For Developers</a>
<a href="/credits.html" class="site-menu-item">Credits</a>
</div>
</li>
<li class="search">
<div class="search-icon">
<!-- This is an inline SVG image of a magnifying glass. -->
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 374.9 374.84">
<path d="M235 270a148.74 148.74 0 1 1 35-35l97.74 97.74a24.37 24.37 0 0 1 0 34.58l-.4.4a24.47 24.47 0 0 1-34.58 0L235 270Zm-86.22-7.47A113.75 113.75 0 1 0 35 148.75 113.75 113.75 0 0 0 148.75 262.5Z"/>
</svg>
</div>
<div class="search-bar">
<form id="search_form" action="https://google.com/search" method="get">
<input type="text" name="q" placeholder="Search all of Drake…" />
<input type="hidden" name="q" value="site:drake.mit.edu OR site:underactuated.csail.mit.edu OR site:manipulation.csail.mit.edu" />
</form>
<div class="search-close">
<!-- This is an inline SVG image of an "X". -->
<svg height="20" width="20" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 373.61 373.57">
<path d="M219.71 186.77 366.71 40a23.43 23.43 0 1 0-33.13-33.13l-146.77 147-146.77-147A23.43 23.43 0 0 0 6.9 40l147 146.77-147 146.77a23.43 23.43 0 1 0 33.14 33.13l146.77-147 146.77 147a23.43 23.43 0 1 0 33.13-33.13Z"/>
</svg>
</div>
</div>
<ul id="results-container"></ul>
</li>
<li class="github-link">
<a href="https://github.com/RobotLocomotion/drake" class="site-menu-item">GitHub <img src="/third_party/images/GitHub-Mark-Light-64px.png" /></a>
</li>
</ul>
</nav>
</div>
</header>
<div class="page">
<div class="content">
<div class="drake-page">
<header class="drake-page-header">
<div class="contain">
<h1>Vim/Neovim Notes</h1>
</div>
</header>
<section class="padding">
<div class="contain">
<article class="markdown-body">
<h1 id="introduction">Introduction</h1>
<p>This page contains notes on ways to use <a href="https://www.vim.org/">Vim</a> or
<a href="https://neovim.io/">Neovim</a> with Drake. Wherever there are differences
between the two the Neovim value will be given in curly braces after the Vim
value (e.g. <code class="language-plaintext highlighter-rouge">.vimrc</code> {<code class="language-plaintext highlighter-rouge">.config/nvim/init.vim</code>}).</p>
<h1 id="installing-neovim">Installing Neovim</h1>
<p>If you want to use Neovim, follow the instructions on the Neovim wiki
(<a href="https://github.com/neovim/neovim/wiki/Installing-Neovim#ubuntu">Ubuntu</a>,
<a href="https://github.com/neovim/neovim/wiki/Installing-Neovim#homebrew-macos--linuxbrew-linux">Homebrew</a>).
Ubuntu users should make sure that they install the Python modules as well.</p>
<h1 id="configuration-files">Configuration Files</h1>
<p><code class="language-plaintext highlighter-rouge">sample_vimrc</code> (<a href="/sample_vimrc">download</a>) provides a sample
configuration file that sets up some plugins and key-mappings that users may
find useful for working with Drake. It should work out of the box if copied
to <code class="language-plaintext highlighter-rouge">~/.vimrc</code> {<code class="language-plaintext highlighter-rouge">~/.config/nvim/init.vim</code>}. Be sure to back up any existing
<code class="language-plaintext highlighter-rouge">.vimrc</code> {<code class="language-plaintext highlighter-rouge">init.vim</code>} before copying! Users with existing Vim
configurations are, of course, free to cherry-pick whatever portions of
<code class="language-plaintext highlighter-rouge">sample_vimrc</code> they’d like.</p>
<p>If you do copy <code class="language-plaintext highlighter-rouge">sample_vimrc</code> to <code class="language-plaintext highlighter-rouge">.vimrc</code> {<code class="language-plaintext highlighter-rouge">init.vim</code>}, your next step
is to install the plugins that it specifies.</p>
<ol>
<li>Open a terminal and launch Vim. The plugin manager
(<a href="https://github.com/junegunn/vim-plug">vim-plug</a>) will be automatically
installed (to disable this behavior, delete the four lines following the
comment “Remove these lines …”).</li>
<li>In Vim, type <code class="language-plaintext highlighter-rouge">:PlugInstall</code> and press “Enter”. vim-plug will download
the specified plugins from GitHub. If you later decide to stop using
vim-plug, you can remove it along with the plugins it installs by
deleting the following
<ul>
<li><code class="language-plaintext highlighter-rouge">~/.vim/autoload/plug.vim</code>
{<code class="language-plaintext highlighter-rouge">~/.local/share/nvim/site/autoload/plug.vim</code>}</li>
<li><code class="language-plaintext highlighter-rouge">~/.vim/plugged</code> {<code class="language-plaintext highlighter-rouge">~/.local/share/nvim/plugged</code>}</li>
</ul>
</li>
</ol>
<h1 id="setting-up-code-completionlintingjump-to-declaration">Setting up Code-Completion/Linting/Jump To Declaration</h1>
<p><a href="https://github.com/Valloric/YouCompleteMe">YouCompleteMe</a> is a plugin that
provides real-time linting + jump-to-declaration functionality. It has a
compiled component, which needs to be built before the plugin can be used.</p>
<ol>
<li>Let <code class="language-plaintext highlighter-rouge"><YouCompleteMe-location></code> be the directory in which the plugin is
located. If you’re using the provided <code class="language-plaintext highlighter-rouge">sample_vimrc</code>, you can determine
<code class="language-plaintext highlighter-rouge"><YouCompleteMe-location></code> by running <code class="language-plaintext highlighter-rouge">:echo g:plug_home</code> in Vim and
appending <code class="language-plaintext highlighter-rouge">/YouCompleteMe</code> to the result.</li>
<li>In a terminal, run
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>cd <YouCompleteMe-location>
git submodule update --init --recursive
./install.py --clang-completer
</code></pre></div> </div>
</li>
</ol>
<p>In order for YouCompleteMe to provide code-completion and linting for Drake’s
C++ files, it needs to know what flags to use when compiling them. Fortunately,
<a href="https://github.com/grailbio/bazel-compilation-database">bazel-compilation-database</a>
provides a way for YouCompleteMe to get this information from Bazel. The
following steps should get this working in Drake:</p>
<ol>
<li>Download the bazel-compilation-database 0.2.2
<a href="https://github.com/grailbio/bazel-compilation-database/archive/0.2.2.tar.gz">tarball</a>.</li>
<li>Extract the contents of the tarball to some directory. We will refer to
this directory as <code class="language-plaintext highlighter-rouge"><bcd-location></code>.</li>
<li>From the root of your Drake repository run:
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>mkdir bazel
ln -s <bcd-location> bazel/compilation_database
</code></pre></div> </div>
</li>
<li>Add the following line to your <code class="language-plaintext highlighter-rouge">.vimrc</code> {<code class="language-plaintext highlighter-rouge">init.vim</code>}:
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>let g:ycm_global_ycm_extra_conf = '<bcd-location>/.ycm_extra_conf.py'
</code></pre></div> </div>
</li>
</ol>
<p>Now, when you open a Drake C++ file, you should get real-time linting and
completion, as well as jump-to functionality (through the <code class="language-plaintext highlighter-rouge">:YcmCompeter GoTo</code>
command). If it appears not to be working, try running <code class="language-plaintext highlighter-rouge">:YcmDiags</code> to force
YouCompleteMe to compile the current file. Note that for YouCompleteMe to see
a given Drake header file, the corresponding Bazel target must have been built.
See also, <a href="#linting-and-jump-to-declaration-mappings">Linting and Jump-to-Declaration Mappings</a>.</p>
<h1 id="additional-mappings">Additional Mappings</h1>
<p>The aforementioned <code class="language-plaintext highlighter-rouge">sample_vimrc</code> file pulls in several plugins and defines
mappings for working with them. It also defines some general-purpose mappings.
Here are some highlights. A lot of these start with <code class="language-plaintext highlighter-rouge"><leader></code>, which in the
attached file is mapped to <code class="language-plaintext highlighter-rouge">;</code> (so <code class="language-plaintext highlighter-rouge"><leader>gv</code> becomes <code class="language-plaintext highlighter-rouge">;gv</code>). You can, of course,
change <code class="language-plaintext highlighter-rouge"><leader></code> to whatever you prefer in your <code class="language-plaintext highlighter-rouge">.vimrc</code> {<code class="language-plaintext highlighter-rouge">init.vim</code>} file.</p>
<h2 id="git-mappings">Git Mappings</h2>
<p>These mappings use <a href="https://github.com/tpope/vim-fugitive">fugitive.git</a> and
<a href="https://github.com/gregsexton/gitv">Gitv</a> to perform Git-related tasks.</p>
<ul>
<li><code class="language-plaintext highlighter-rouge"><leader>gd</code> shows the git diff for the current file. You can move hunks into
the index using Vim’s diff commands.</li>
<li><code class="language-plaintext highlighter-rouge"><leader>gs</code> shows the current git status using fugitive.git.You can stage
files by moving the cursor to the line and pressing “-“. Press cc to start
editing the commit message. Save and exit in the commit message to commit.</li>
<li><code class="language-plaintext highlighter-rouge"><leader>gv</code> launches gitv, a Gitk clone for Vim. You can use this to inspect
commits, switch branches, cherry-pick, and more</li>
</ul>
<h2 id="linting-and-jump-to-declaration-mappings">Linting and Jump-to-Declaration Mappings</h2>
<p>These mappings use <a href="https://github.com/Valloric/YouCompleteMe">YouCompleteMe</a>
and <a href="https://github.com/Valloric/ListToggle">ListToggle</a>.</p>
<ul>
<li><code class="language-plaintext highlighter-rouge"><leader>gg</code> jumps to the declaration of the class/function under the cursor
(mnemonic “go go!”). Use the standard jump command Ctrl+o to go back.</li>
<li><code class="language-plaintext highlighter-rouge"><leader>fi</code> applies the “fix-it” action listed at the bottom of the buffer
(mnemonic “fix it!”).</li>
<li><code class="language-plaintext highlighter-rouge"><leader>lo</code> toggles the Location List on and off (mnemonic “LOcation”). All
errors found by YouCompleteMe are listed in the location list, which can
make it easy to go from one to the next.</li>
</ul>
<h2 id="file-tree-explorer-mappings">File Tree Explorer Mappings</h2>
<p>These mappings use <a href="https://github.com/scrooloose/nerdtree">NERDTree</a> to
provide a file tree explorer in Vim.</p>
<ul>
<li><code class="language-plaintext highlighter-rouge"><leader>nt</code> launches NERDTree for the current working directory</li>
<li><code class="language-plaintext highlighter-rouge"><leader>nf</code> launches NERDTree with the current file selected. This is
particularly useful for getting to the appropriate <code class="language-plaintext highlighter-rouge">BUILD.bazel</code> file for a
given source file.</li>
</ul>
<h2 id="fuzzy-finder-mappings">Fuzzy Finder Mappings</h2>
<p>These mappings use <a href="https://github.com/ctrlpvim/ctrlp.vim">ctrlp.vim</a> to
provide fuzzy file lookup in Vim.</p>
<ul>
<li><code class="language-plaintext highlighter-rouge"><leader>ff</code> launches CtrlP in file mode (mnemonic “find file”). Start typing
any portions of the file path (they don’t have to be contiguous!) and select
the file you want once the choices are narrowed down sufficiently.</li>
</ul>
</article>
</div>
</section>
</div>
<footer class="site-footer padding">
<div class="contain">
<a href="/" class="drake-logo">
<img src="/images/drake-logo.svg">
</a>
<div class="footer-menu">
<ul>
<li>
<a href="/doxygen_cxx/index.html" class="site-menu-item">C++</a>
</li>
<li>
<a href="/pydrake/index.html" class="site-menu-item">Python</a>
</li>
<li class="github-link">
<a href="https://github.com/RobotLocomotion/drake" class="site-menu-item">GitHub <img src="/third_party/images/GitHub-Mark-64px.png" /></a>
</li>
</ul>
</div>
</div>
<!-- TODO(eric.cousineau): Consider placing copyright here. -->
</footer>
</div>
</div>
<script src="/assets/js/mobile.js"></script>
<!-- Search -->
<script src="/assets/js/search.js"></script>
</body>
</html>