racer-rust / vim-racer Goto Github PK
View Code? Open in Web Editor NEWRacer support for Vim
License: MIT License
Racer support for Vim
License: MIT License
In init.vim
:
Plug 'racer-rust/vim-racer'
set hidden
let g:racer_cmd = "/home/vext01/.cargo/bin/racer"
au FileType rust nmap gd <Plug>(rust-def)
au FileType rust nmap gs <Plug>(rust-def-split)
au FileType rust nmap gx <Plug>(rust-def-vertical)
au FileType rust nmap <leader>gd <Plug>(rust-doc)
Racer is in the $PATH also:
$ which racer
/home/vext01/.cargo/bin/racer
Editting a file like this:
fn main() {
let a = 1;
println!("Hello, world! {}", a);
}
Cursor over second instance of a
:
gd
does nothing.:call racer#GoToDefinition()
does nothing.Hrm...
Is there a way to prevent messages on vim startup if racer is not configured?
I'm currently using a fork that just "finishes" instead of printing messages, but it might make it difficult for people to debug.
If there was a way to print messages but not slow vim start up, it would be great.
I've installed racer and the plugin properly, but typing printl
and pressing C-x-C-o
brings up the error "Pattern not found". Any advice?
I'm not familiar with vimscript and having some trouble changing the default binds for vim-racer.
I've set g:racer_no_default_keymappings
to disable the automatic mapping (seen here), but now i'm having trouble actually applying the binds.
It looks like the useful functions (like RacerShowDocumentation) are private, but this seems odd - i assume it's my lack of Vimscript knowledge.
So, how can we set the vim-racer mappings? And on that note, why are these useful functions private (if indeed they are)?
Perhaps it has to do with the <Plug>
setting, though i'm still investigating.
Hi!
Steps to reproduce:
main.rs
File::
C-x C-o
Error:
Error detected while processing function RacerComplete..<SNR>50_RacerGetCompletions:
line 2:
E121: Undefined variable: b:tmpfname
Press ENTER or type command to continue
Error detected while processing function RacerComplete..<SNR>50_RacerGetCompletions:
line 2:
E116: Invalid arguments for function writefile
Press ENTER or type command to continue
Error detected while processing function RacerComplete..<SNR>50_RacerGetCompletions:
line 4:
E121: Undefined variable: b:tmpfname
Press ENTER or type command to continue
Error detected while processing function RacerComplete..<SNR>50_RacerGetCompletions:
line 4:
E15: Invalid expression: g:racer_cmd." complete ".line(".")." ".col." \"".fname."\" \"".b:tmpfname."\""
My vimrc
let g:racer_cmd = "racer"
let $RUST_SRC_PATH="~/.vim/rustsrc/src"
Both paths are correct
$ racer
racer 1.2.6
Phil Dawes
A Rust code completion utility
USAGE:
racer [FLAGS] [OPTIONS] [SUBCOMMAND]
FLAGS:
-h, --help Prints help information
-V, --version Prints version information
OPTIONS:
-i, --interface <mode> Interface mode [values: text tab-text]
SUBCOMMANDS:
complete performs completion and returns matches
complete-with-snippet performs completion and returns more detailed matches
daemon start a process that receives the above commands via stdin
find-definition finds the definition of a function
help Prints this message
prefix
For more information about a specific command try 'racer <command> --help'
$ ls -lhd ~/.vim/rustsrc/src
drwxr-xr-x 65 flp staff 2.2K Mar 8 10:59 /Users/flp/.vim/rustsrc/src
My vim version
im --version
VIM - Vi IMproved 7.4 (2013 Aug 10, compiled Dec 26 2014 15:45:07)
MacOS X (unix) version
Included patches: 1-258
Compiled by Homebrew
Huge version with MacVim GUI. Features included (+) or not (-):
+acl +file_in_path +mouse_sgr +tag_binary
+arabic +find_in_path -mouse_sysmouse +tag_old_static
+autocmd +float +mouse_urxvt -tag_any_white
+balloon_eval +folding +mouse_xterm -tcl
+browse -footer +multi_byte +terminfo
++builtin_terms +fork() +multi_lang +termresponse
+byte_offset +fullscreen -mzscheme +textobjects
+cindent -gettext +netbeans_intg +title
+clientserver -hangul_input +odbeditor +toolbar
+clipboard +iconv +path_extra +transparency
+cmdline_compl +insert_expand +perl +user_commands
+cmdline_hist +jumplist +persistent_undo +vertsplit
+cmdline_info +keymap +postscript +virtualedit
+comments +langmap +printer +visual
+conceal +libcall +profile +visualextra
+cryptv +linebreak +python +viminfo
+cscope +lispindent -python3 +vreplace
+cursorbind +listcmds +quickfix +wildignore
+cursorshape +localmap +reltime +wildmenu
+dialog_con_gui -lua +rightleft +windows
+diff +menu +ruby +writebackup
+digraphs +mksession +scrollbind -X11
+dnd +modify_fname +signs -xfontset
-ebcdic +mouse +smartindent +xim
+emacs_tags +mouseshape -sniff -xsmp
+eval +mouse_dec +startuptime -xterm_clipboard
+ex_extra -mouse_gpm +statusline -xterm_save
+extra_search -mouse_jsbterm -sun_workshop -xpm
+farsi +mouse_netterm +syntax
system vimrc file: "$VIM/vimrc"
user vimrc file: "$HOME/.vimrc"
2nd user vimrc file: "~/.vim/vimrc"
user exrc file: "$HOME/.exrc"
system gvimrc file: "$VIM/gvimrc"
user gvimrc file: "$HOME/.gvimrc"
2nd user gvimrc file: "~/.vim/gvimrc"
system menu file: "$VIMRUNTIME/menu.vim"
fall-back for $VIM: "/Applications/MacVim.app/Contents/Resources/vim"
Compilation: clang -c -I. -Iproto -DHAVE_CONFIG_H -DFEAT_GUI_MACVIM -Wall -Wno-unknown-pragmas -pipe -DMACOS_X_UNIX -I/System/Library/Frameworks/Python.framework/Versions/2.7/include/python2.7 -I/System/Library/Frameworks/Python.framework/Versions/2.7/include/python2.7 -fno-strict-aliasing -fno-common -dynamic -g -Os -pipe -fno-common -fno-strict-aliasing -fwrapv -DENABLE_DTRACE -DMACOSX -DNDEBUG -Wall -Wstrict-prototypes -Wshorten-64-to-32 -DNDEBUG -g -fwrapv -Os -Wall -Wstrict-prototypes -DENABLE_DTRACE -arch x86_64 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.10.sdk -mmacosx-version-min=10.10 -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=1
Linking: clang -L. -L/usr/local/lib -L. -L/usr/local/lib -L/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/config -framework CoreFoundation -lpython2.7 -Wl,-syslibroot,/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.10.sdk -mmacosx-version-min=10.10 -L/usr/local/lib -o Vim -framework Cocoa -framework Carbon -lm -lncurses -liconv -framework Cocoa -fstack-protector -L/System/Library/Perl/5.18/darwin-thread-multi-2level/CORE -lperl -framework Python -framework Ruby
Running OSX el captain
if !executable(g:racer_cmd)
call s:Warn('No racer executable found in $PATH (' . $PATH . ')')
return 1
endif
This is the code in vim-racer that's causing the issue.
You probably meant to call GetRacerCmd
so it works on unexpanded paths!
As in,
let mut writer = io::BufWriter::with_capacity(io:: );
returns Pattern Not Found
.
But,
let mut writer = io::BufWriter::with_capacity(io::
matches just fine.
vim 7.4.963 Debian Testing. Reproducible with minimal vimrc, attached.
I seem to have a weird cross interaction with vim-racer and neocomplete.
If you look at the following gif, you see what happen when I type .unwrap()
. As you can see something is "eating" some of the letters. If I disable either vim-racer or neocomplete this doesn't happen. The letters that get eaten are not always the same, at another time I got .uwrp()
as result.
Both plugins are on default settings as per their READMEs.
I don't know what is causing this, so I can't really offer any debug information upfront. Please just ask for what you need.
Just like https://github.com/phildawes/racer first screenshot of README.md
. How can vim show pub fn as_mut_slice
at bottom?
How to config vim to auto popup tips when I'm typing?
Need I install Valloric/YouCompleteMe???
It seem like set omnifunc=syntaxcomplete#Complete
is needed, or nothing works fro me. Is that expected ?
Still it does not work perfectly C-x-C-o delete the start of the line before the token being completed. Am I doing something wrong ? Thanks.
It would be nice to have a vim help page describing the various features and options for this plugin. Looking at the code, it looks like there are a number of variables that aren't actually listed in the README, and I didn't realize that it was setup to work with K
.
When I have a vertical split open like in the picture above and move around alot (scroll up and down) redraw of the divider seems to fail. If I disable the racer plugin from loading this never happens.
The text that spills over is from the split on the left, if I drag the divider left or right then it redraws and everything is fine.
If someone could point out why this may be happening Id be happy to try and fix it myself.
Neovim version:
NVIM v0.2.2
Platform:
Linux 4.14.15
EDIT: clarified the movement that causes this
Hi.
I installed racer
and this plugin, and configure them.
I can launch racer
using /Users/antonin/.cargo/bin/racer
, and it works!
But, when I try gd
in a simple line like use std::
, Vim returns :
No racer executable found in $PATH ...
:/Users/antonin/.cargo/bin/racer
:/Users/antonin/.cargo/bin...
And that's weird, because the racer
executable is in the PATH
environment :-/
Anyone here has a solution to test please?
I just installed vim-racer using vim-plug in neovim and get no completion at all and the following error when trying to go to a definition:
Error detected while processing function racer#GoToDefinition:
line 14:
E15: Invalid expression: res #=~# ' error: ' && line !=# 'END'
The install on my laptop (exactly the same init.vim but installed a week ago) is working perfectly fine.
i'm using both linux and windows edtion rust, but there is no source folder....
is that meas i should download the rust souce code tar.gz and uncompress it to some place?
I'm using a rust crate mirror links: mirrors.ustc.edu.cn and racer with vim YCM
when I update dependents library, the third party crate source code is just download into the .cargo/registry/src/mirrors.ustc.edu.cn-XXXX/ path.
but I found that, racer does not catch the right define of the crate code. just show Errors:
"RuntimeError: Can't jump to definition." how could I resolve this problem. any help will be appreciate, thanks.
Today I decided to :PlugUpdate
. Not sure if that's why, but I later today realized no completions at all worked.
It has worked previously, and my init.vim
file looks like this,
where it's worth to point out
call plug#begin()
Plug 'rust-lang/rust.vim'
Plug 'racer-rust/vim-racer'
call plug#end()
and
filetype plugin indent on
let g:racer_cmd = '~/.cargo/bin/racer'
let g:racer_experimental_completer = 1
No idea why it fails. Still doesn't work if I replace ~
with /home/legolord208
, so it's not the expansion that is the problem.
EDIT:
Still doesn't work
accidentally said "Works" at first
TL;DR Omni completion (^O^N^P) Pattern not found
Completion string's insertion position is wrong while input some characters.
reproduction environment:
init.vim https://gist.github.com/orumin/625c54835eef6db7b827725c1b8c45eb
ArchLinux Linux 4.9.6-1-zen
NeoVim 0.1.7
racer 2.0.4
dein.vim c786aa8686
deoplete.nvim e182a11a13
rust.vim 732b5fcb36
vim-racer 12f8360
e.g.)
I was typing as below:
use std::thread;
use std::tim
and using compeltion.
Expected completion result:
use std::thread;
use std::time
In reality:
use std::thread;
use std::timtime
Go to definition works great ๐ฏ with https://github.com/ebfe/vim-racer and not with this plugin. Does anyone know why?
Calling <Plug>(rust-def)
re-opens a current file, but I think it should be avoided by the if-statement at following line: https://github.com/racer-rust/vim-racer/blob/master/autoload/racer.vim#L247
In my environment, a:filename
at the line is the full path to a source file containing a definition to jump.
However, bufname('%')
is the relative path to a file of a current buffer, and comparing them results in false
.
I think the condition of the if-statement should be if a:filename != expand('%:p')
, but I'm not confident about it.
Maybe it changed recently in racer, but racer returns the byte position, not the column number when you call racer prefix
.
So, the completion works nicely when you invoke it on the first line, but it doesn't on any other line :)
How to reproduce:
racer 2.0.2
)Open a new buffer:
use std::rc::R<C-x><C-o>
use std::cell::R<C-x><C-o>
The first line will work perfectly. The second line will end-up being use std::cel::RRef
(with completeopt=longest
).
Some solutions that I thought about:
s:RacerGetPrefixCol
so it uses the completions to define the column position (so startpos
would be col('.') - len(completions[0]) - 1
)racer prefix
to print the column number, maybe?)Thoughts?
how to fix ?
i see bottom show :call RacerGoToDefinition(), but nothing happend....no errors too.
It seems like I always get the same list of completions provided, no matter what I position my cursor after. Of course, if I've already written R
then only the ones starting with R
will be provided as options, but the "source list" from which it will provide the suggestions seems to be the same every time.
The "available" completions are these:
AsMut AsRef Box Clone Copy Debug Decodable Default DoubleEndedIterator Drop
Encodable Eq Err ExactSizeIterator Extend FIXME Fn FnMut FnOnce From
FromPrimitive Hash Into IntoIterator Iterator NB NOTE None Ok Option Ord
PartialEq PartialOrd Rand Result RustcDecodable RustcEncodable Self Send Show
Sized SliceConcatExt Some String Sync TODO ToOwned ToString Vec XXX abstract
alignof as become bool box break char const continue crate display do else enum
extern f32 f64 false final fn for i16 i32 i64 i8 if impl in isize let loop
macro match mod move mut offsetof override priv pub pure ref return self size
sizeof static str struct super trait transparent true type typeof u16 u32 u64
u8 unsafe unsized use usize virtual where while
For a one-completion-per-line list, read this gist.
Hi,
I've tried to use vim-racer with deoplete but it only show completions after the buffer with source code is saved.
For example, when I open below code:
fn main() {
let v: Vec<_> = vec![1, 2, 3];
}
and start writing new line: v.as
- it doesn't show any completions.
But when I write:
fn main() {
let v: Vec<_> = vec![1, 2, 3];
v.
}
and save it, then it will show completions when I start writing after the dot.
Can you help?
Cheers.
The current racer is able to look for the rust sources installed in a known location (by rustup usually), making the whole manual definition annoying.
I tried to put let b:racer_experimental_completer = 1
in ftplugin/rust.vim, but it seems to have no effect. Replacing b:
with g:
solves it though.
Expected behaviour:
b:racer_experimental_completer
should be respected.
I have installed racer and that seems to work i.e. "racer complete std::process"
When I try and use vim-racer I get the unknown function error above.
Any pointers on how to fix this, first time i've used racer and vim-racer, so probably some install step i've missed. The only thing I did to install vim-racer was this
"cp ftplugin/rust_racer.vim ~/.vim/plugin/"
Thanks,
Nick
Currently, with deoplete, there are no completions available after typing:
import sd::io{E
So autocomplete is not working inside the curlies.
This works fine with racer though. (racer complete std::io::{E
).
What's missing to make this work?
If I have
let mut file = try!(File::open(file_path).map_err(|e| e.to_string()));
let mut contents = String::new();
Then contents.<C-x C-o>
gives a good list of completion options, all appropriate for String, showing that vim-racer is indeed working properly. However, file.<C-x C-o>
doesn't find anything: Pattern not found
. Things like read_to_string, which are properly defined for File, can successfully be used, and the program successfully compiles, however.
Using <Plug>(rust-def)
does not populate the tag stack, which is counterintuitive, because the feature closely resembles CTRL-]
.
I'm not really sure how to make racer completion to work in vim.
I referred to #92 but so far problem persists.
Hello, I'm using neovim, and I split it up into several windows. My PC kept doing heavy work for a while, I could hear from the fans. And it turned out (htop) that racer was completing a line in a buffer that was in a vim windows that was not focused - several times apparently, with short bursts of 100% CPU but enough to keep my fans running. But after some minutes it stopped doing this alltogether.
See https://asciinema.org/a/a5sox8i2y6cpdyfwust7k8j2z for what I mean
In certain situations I get an error when adding a new global constant.
The error is
[deoplete] Traceback (most recent call last):
[deoplete] File "/home/adno/.config/nvim/bundle/deoplete.nvim/rplugin/python3/deoplete/deoplete.py", line 119, in gather_results
[deoplete] ctx['candidates'] = source.gather_candidates(ctx)
[deoplete] File "/home/adno/.config/nvim/bundle/vim-racer/rplugin/python3/deoplete/sources/racer.py", line 71, in gather_candidates
[deoplete] kind = typeMap.get(completions[4], '')
[deoplete] IndexError: list index out of range
[deoplete] Could not get completions from: racer. Use :messages for error details.
nvim -u minimal.vim
call plug#begin()
Plug 'Shougo/deoplete.nvim'
Plug 'racer-rust/vim-racer'
call plug#end()
let g:deoplete#enable_at_startup = 1
Create a new project
cargo new tmp
cd tmp
Edit the generated lib.rs
nvim -u PATH/TO/minimal.vim src/lib.rs
Add a constant to the file. For example, the file might then look like this:
#[cfg(test)]
mod tests {
#[test]
fn it_works() {
}
}
pub const A_CONST: u8 = 2;
In the line above the const, try to add another constant. For example:
#[cfg(test)]
mod tests {
#[test]
fn it_works() {
}
}
pub const SECOND_CONST: u8 = 1;
pub const A_CONST: u8 = 2;
You will get an error after writing just pub const SE
(since that is the default minimum length for completion).
I added a debug print line to the gather_candidates
function of racer.py
. Apparently when the error occurs it is because completions
is a single item array containing just the identifier of the partially typed second constant.
Hello,
Any chance of AutoComplPop-like behaviour where completion is suggested automatically?
It would be really nice if either a short documentation or at least the method signature could be displayed when a cursor is on a method invocation.
When typing text in a Rust file, I get the error tempfile is not defined: line 91 on deoplete/sources/racer.py
. I tried to place an import at the start of the file (import tempfile
), and the error is gone, but deoplete auto-completion in rust doesn't work at all.
However go-to definition works and manual omni-completion (C-X C-O) works with static declarations (such as (tested in another file and dynamic code works too).std::thread::
), but not with dynamic code
I'm quite confused as I think it could be a configuration issue, my init.vim has these:
let g:racer_cmd = "/usr/bin/racer"
let $RUST_SRC_PATH = "/usr/src/rust/src"
let g:deoplete#enable_at_startup = 1
And I'm using vim-plug:
Plug 'Shougo/deoplete.nvim'
Plug 'racer-rust/vim-racer'
Plug 'zchee/deoplete-jedi'
And deoplete-jedi works fine.
If you split a chain of invocations into multiple lines (according to style guidelines. This is also what rustfmt does) the completion won't work
use std::io;
fn main() {
println!("Guess the number!");
let mut guess = String::new();
io::stdin()
.r // here, the completion won't work
println!("You guessed {}", guess);
}
The completion popup does not show on its own, but also when you press C-xC-o
I'm in linux using nvim 0.1.4
.
I cloned racer
into ~/work/rust/lib
, and ran cargo build
.
In my vimrc:
Plug 'racer-rust/vim-racer'
set hidden
let g:racer_cmd='/home/ploppz/work/rust/lib/racer/target/debug/racer'
let $RUST_SRC_PATH='/home/ploppz/work/rust/lib/racer/src/'
But the plugin doesn't work. There's no useful completion, and hotkeys like gd
don't do anything. It worked earlier. What changed since then is just that I cloned and built the racer
repository anew.
(edit: this is ~/work/rust/lib/racer
)
Completing any line such as use std::
or self.
shows the completion popup but also deletes everything on the current line.
Versions affected:
Relevant config:
" Racer
set hidden
let g:racer_cmd = '/home/hoverbear/.cargo/bin/racer'
let $RUST_SRC_PATH = '/home/hoverbear/git/rust/src/'
Spoke about in #12, but that's not the issue there so I split this off.
If I type use std::pro
and then tab, the pro
part is replaced by __core
, which does not make sense at all.
After setting up shortcuts (eg. gd
) it works, but I'm unable to jump-back (typically C-t
). Could it be supported as well?
.So gd
used to work for me, but at some point it stopped (it was flaky)
I was investigating and found that I don't have:
au FileType rust nmap gd <Plug>(rust-def)
au FileType rust nmap gs <Plug>(rust-def-split)
au FileType rust nmap gx <Plug>(rust-def-vertical)
au FileType rust nmap <leader>gd <Plug>(rust-doc)
Was that requirement added recently and wasn't there before?
For inspiration: https://github.com/blog/1530-choosing-an-open-source-license :)
I don't use emacs but from racer screenshot at https://github.com/phildawes/racer one may expect to get more info than identifiers in vim too :-)
within the Readme.md
there is the line
let g:racer_cmd = "/path/to/racer/bin"
nowhere is the path the racer bin ever described, maybe it's just because I'm a rust n00b, but still seems ambiguous - is there a default directory which can often be assumed here?
When trying to autocomplete "std::" in this program, racer.exe unexpectedly (?) panics:
use std;
fn main() {
let x = std:: // Eclipse is setup to call racer.exe when it sees a '::' sequence.
}
I'm running under Eclipse:
Version: Mars.1 Release (4.5.1)
Build id: 20150924-1200
...with the RustDT plugin:
RustDT 0.4.2.v201511271555 com.github.rustdt.feature.group RustDT Project Team
I got:
>> Running: C:\Users\david_000\.cargo\bin\racer.exe complete-with-snippet 4 14 C:\Users\david_000\Documents\Programming\workspace\tedium\src\main.rs
PREFIX 14,14,
thread 'searcher' panicked at 'called `Option::unwrap()` on a `None` value', ../src/libcore\option.rs:367
stack backtrace:
0: 0x8aa62c - <unknown>
1: 0x8b28ce - <unknown>
2: 0x873f3c - <unknown>
3: 0x8746ab - <unknown>
4: 0x8a6ca2 - <unknown>
5: 0x8c73b8 - <unknown>
6: 0x8c79f0 - <unknown>
7: 0x4f18c2 - <unknown>
8: 0x4efa48 - <unknown>
9: 0x4ebac3 - <unknown>
10: 0x4a4ea2 - <unknown>
11: 0x4a5311 - <unknown>
12: 0x4a2d92 - <unknown>
13: 0x40438f - <unknown>
14: 0x89d3f1 - <unknown>
15: 0x4052da - <unknown>
16: 0x8b0ebd - <unknown>
17: 0x7fff28298101 - <unknown>
ERROR:racer: Search thread paniced: Any
END
I have according to my crates registry:
[v1]
"racer 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = ["racer.exe"]
I can run racer.exe via the command line (.cargo/bin is on my path).
Other pertinent information:
C:\Users\david_000>rustc --version
rustc 1.6.0 (c30b771ad 2016-01-19)
I'm running Windows 10 updated to 23 January 2016:
Version 10.0.10586 Build 10586
I can build and run hello world files and other examples from the Rust by Example book fine.
gd
currently exists to jump to a definition. Is it possible to add capabilities for a tag stack?
I imagine that CTRL+]
could use the same underlying jump-to-definition functionality that gd
uses, with the addition that CTRL+T
could pop us back to the previous location.
I'd be interested in adding this myself, but don't know where to start.
$RUST_SRC_PATH = "~/whatever/rustc/src" gives "No directory was found at provided RUST_SRC_PATH:"
while $RUST_SRC_PATH = "/Users/me/whatever/rustc/src" works fine.
A declarative, efficient, and flexible JavaScript library for building user interfaces.
๐ Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. ๐๐๐
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google โค๏ธ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.