shougo / neocomplcache.vim Goto Github PK
View Code? Open in Web Editor NEWUltimate auto-completion system for Vim.
Home Page: http://www.vim.org/scripts/script.php?script_id=2620
Ultimate auto-completion system for Vim.
Home Page: http://www.vim.org/scripts/script.php?script_id=2620
Could you create wiki page or put this in docs?
Is it possible to use necomplcache with following behavior:
1) disable auto popup
2) popup on
3) auto complete to common string and show available variants (if any), highlighting first available
4) switch between options with
5) choose option using
I understand that i could figure it out reading docs and giving it a try :-/
Thanks.
Hi,
I recently switched from snipMate to neocomplcache.
I like the snippet system of neocomplcahce because it supports nested snippet.
Nevertheless, I found that neocomplcache does not support function call inside a snippet.
For example, the following snippet in snipMate would use the current file name to be the default include file name.
snippet Inc
#include "${1:Filename("$1.h")
}"
Do you have any future plan to support this functionality?
Thank you for your great work.
snippetの展開を開始した行のインデントを考慮してくれるとすごく嬉しいです。
function hoge(){
if(/* condition */) {
${2:// code...}
}
}
シェルスクリプト用のスニペットを作っていて気づいたのですが、
展開後の形に ``
が含まれていた場合、それが VimScript のレベルで eval として扱われるために
スニペットがうまく展開できません。
例えば以下のような場合↓
snippet getopts FLAG=FALSE VALUE= OPT= # parse command options if [ "$OPTIND" = 1 ]; then while getopts fv: OPT; do case $OPT in f) FLAG=TRUE ;; v) VALUE=$OPTARG ;; \?) echo "$USAGE" 1>&2 exit 1 ;; esac done shift `expr $OPTIND - 1` else echo "$CMDNAME: getopts is not supported." 1>&2 exit 1 fi
shift
の部分。expr $OPTIND - 1
\ で `
をエスケープもできないようなのですが、なんとかならないでしょうか?
Perl や Ruby でも外部コマンドの出力を取るのに ``
が使われるので、
これを含むスニペットって結構あるような気がするのですが。
Awesome plugin.
Prob a noob question but I'm having an issue with the snippets where an extra space is placed in front of each ${n} which is making it pretty tough to use. Ex:
snippet is...
def ${1}
${2}
end
type def(neocomplcache_snippets_expand)...
and it places
def |
${2}
end
and when I hit it again, its doing the same for the 2 (replacing it with a space in front...so 3 spaces in in the example above)
any ideas?
バージョン: 2.50
詳細な条件は不明ですが、読み込み時のメッセージ(:help read-messages)などとキャッシュ中のメッセージ(Caching... please wait. やCaching: xx%など)がかぶるといちいちhit-enter-promptが出てきて非常に鬱陶しいです。redrawすべきです。(:help :echo-redraw)
また、個人的な意見ですがこの場合は:echomsgより:echoの方が良い気がします。
ちなみにfuzzyfinder.vim経由で開くと再現することは確認しました。
はじめまして。ここで書いていいものかどうか・・・と思ったのですが、
どうしても数字キーによるクイックマッチが出来ません。
数字キー付きの候補一覧は出るのですが、そこで数字キーを入力すると、数字のみが入力され
た状態で、候補一覧も消えてしまいます。
例:HTML編集中に、<tab等と入力すると候補は出ますが、2番目の候補を選ぼうと、キーボード
の「2」を入力すると、<tab2となってしまいます。
環境は、WindowsXPで、Kaoriyaさん版のGVIMを使用しています。
neocomplcacheをバージョンアップした後に、
ときどきですがエラーメッセージが表示されることがあるようです。
以下にv3.07から現masterにバージョンアップした後に表示された
エラーメッセージを記します。
( ファイル名等、一部修正しています)
_viminfoを削除したら治まると思っていたのですが、
削除しなくても治るようです。
条件は分かりません。
~~~~~~~~~~ エラーメッセージ ~~~~~~~~~~
"F:\dev\myproject\aaa.cpp" [変換済] 250L, 6677C
"aaa.cpp" 250 行 --0%--
"aaa.h" [変換済] 105L, 3315C
"bbb.cpp" 871L, 23342C
function 52_check_buffer_all..52_check_buffer..52_check_include..52_load_from_tags の処理中にエラーが検出されました:
行 79:
E684: リストのインデックスが範囲外です: 3
E15: 無効な式です: (l:tag[3] == 'd' || l:option['cmd'] == '')? l:tag[0] : l:option['cmd']
行 80:
E121: 未定義の変数です: l:abbr
E116: Invalid arguments for function len(l:abbr) > g:NeoComplCache_MaxKeywordWidth)? printf(l:abbr_pattern, l:abbr, l:abbr[-8:]) : l:abbr, 'kind' : l:option['kind']}
E15: 無効な式です: { 'word' : l:tag[0], 'rank' : 5, 'prev_rank' : 0, 'prepre_rank' : 0, 'icase' : 1, 'abbr' : (len(l:abbr) > g:NeoComplCache_MaxKeywordWidth)? printf(l:abbr_pattern, l:abbr, l:abbr[-8:]) : l:abbr, 'kind' : l:option['kind']}
行 93:
E121: 未定義の変数です: keyword
行 100:
E121: 未定義の変数です: l:keyword
E116: Invalid arguments for function add
ソースを見た感じだとなくてもいけそうな気がしたので。
完全に見た目の問題であり、対して検証もしてないので、ないと問題が起こるのならこのIssueは閉じてしまって下さい。
ヘルプにあるように alias hoge hogera hogehoge とすると hogehogerahogehoge という1つの alias が定義されます。
これは3つの alias が定義されるのが期待される動作ですよね。
autoload/neocomplcache/plugin/snippets_complete.vim において alias 名を切り出している箇所で substitute() が空白をつぶしてしまっているのですが、これは
let l:snippet_pattern.alias = split(substitute(matchstr(line, '^alias\s+\zs.\ze\s$'), '\s+', ',', 'g'), ',')
が本来意図された動作ではないでしょうか?
手元で修正したところ期待した通りに alias が定義されるようになりました。
Can you please add Objective-C/C++ support ?
Thank you for this great plugin!
filetype が cpp のファイルを編集中に snippet を展開しようとすると以下のエラーが出ました。
行 14: E716: 辞書型にキーが存在しません: c E116: 関数 extend に対して不正な引数です function 86_snippets_expand の処理中にエラーが検出されました:
展開自体は成功します。
autoload/neocomplcache/sources/snippets_complete.vim の
" Set same filetype. if has_key(g:neocomplcache_same_filetype_lists, l:ft) for l:same_ft in split(g:neocomplcache_same_filetype_lists[l:ft], ',') call extend(l:snippets, s:snippets[l:same_ft], 'keep') endfor endif
において、s:snippets['c'] が未定義ということのようです。
展開自体が成功するのは cpp.snip において include c されているからですが、そうするとそもそも上の extend() は不要なようにも見えます。
include導入時の消し忘れ? スニペットファイルのロードに関しては same filetype と include で機能が重複していてどちらか片方が不要に見えるのでそう推測するのですがどうなんでしょう。
Hello,
I tried ver.5, but I found that I cannot do nested snippets anymore.
That is, I cannot trigger another snippet at ${1} in the following code.
if( ${1} ) { ${0:/* code */} }
I can do this in 4.30, but it's broken because it will jump into wrong placeholder.
Then I tried 4.08, and it works perfectly without any problem.
What happened to nested snippet?
ファイルの open/save などの操作後に次のエラーメッセージが表示されます。
特定の filetype では再現しておらず、これといった条件は掴めておりません。
function 48_update_source..48_caching_source..48_caching..48_split_keyword の処理中にエラーが検
出されました:
行 13:
Unmatched (.
エラーメッセージが表示される場合の l:keyword_pattern は
次のようになっていました(400行程度の .zshrcを開いた際のものです)。
[[:alpha:].-][[:alnum:].-]%(\s[[(])?
参考になりましたら幸いです。
vim empty.snip で以下のエラーが発生
Error detected while processing function 17_LoadIndent:
line 2:
E749: empty buffer
Hi,
The neocomplcache plugin is great. Nice work.
I typically use it on a Mac with MacVim. Unfortunately the performance is pretty bad for me, which really hinders the overall utility of the plugin. The appearance of characters on the screen during normal typing often lags behind my key presses by as much as a couple of seconds.
If there's any more information I can provide, please let me know. Keep up the great work.
現在、空行(インデントもなし)を含む snippet を展開すると、空行は無視されて詰められてしまうのですが、展開後も空行のまま残すと何か不都合があるのでしょうか?
例えば以下のような snippet において、展開後も空行がそのまま残って欲しいのです。
snippet logger require 'logger' # the logger settings LOG_FILE = File.join(DIR, "hoge.log") LOG_ROTATE = 10 LOG_SIZE = 500 * 1024 @logger = Logger.new(LOG_FILE, LOG_ROTATE, LOG_SIZE)
インデントがあれば空行(?)を残せることは把握していますが、展開後にタブ文字だけからなる行ができるのが気持ち悪いので、できればインデントなしで純粋な空行を設定したいです。
snippet の定義に空行があるとしたらそれは意図的に設けられたものと考えるのが自然で、展開後も空行が維持されるべきだと思うのですがどうでしょうか?
Every time I hit to make a new line, there's a "^F" appears at the end of the last line. This only occurs when editing html file.
After some digging I find this line was the cause:
inoremap neocomplcache#smart_close_popup() . (&indentexpr != '' ? "X":"")
It suppose to close the popup and make a new line, right?
バージョン: 2.43
g:NeoComplCache_PartialCompletionStartLength のタグが g:NeoComplCache_PartialCompletion になっています。
実際には g:NeoComplCache_EnableSkipCompletion である変数に対するヘルプの項目が g:NeoComplCache_EnableCompletionSkip になっています。
実際には g:NeoComplCache_SkipCompletionTime である変数に対するヘルプの項目が g:NeoComplCache_SkipCompleteTime に、更にタグ名が g:NeoComplCache_EnableCompleteTime になっています。
g:NeoComplCache_SkipInputTime のタグが g:NeoComplCache_EnableInputTime になっています。
EXAMPLESに載っている g:NeoComplCache_DictionaryFileTypeLists のヘルプがありません。
プラグインの作成に関するヘルプがありません。
ヘルプのバージョン表記が古いままです。
以上、これは簡単にチェックして発見した分で完全なリストではありません。
in my Lua settings, function() ... end will fold (I added a fold option in lua syntax, syn-fold), and I have a snip:
snippet func
function ${1:name}(${2:...})
${3:/* code */}
end
so, if i expand func, all these three lines will fold and turn to select mode, if i press any key, all these lines will replaced by whatever you press.
I added several lines to snippet_expand to prevent this issue:
at 461 line of snippets_complete.vim:
if l:snip_word =~ '<\t>'
call s:expand_tabline()
else
call s:expand_newline()
endif
if has('folding') && foldclosed(line('.'))
normal! zR
end
if l:old_col < col('$')
startinsert
else
startinsert!
endif
トリガキーを、例えばなどにしたい場合、展開できるときだけ展開して通常時はなどの動作にしたい。
現在展開可能か、を取得する関数があればいいと思う。
Hi.
I've installed NeoComplCache(clone from github) and snipMate(0.83, latest from http://www.vim.org/scripts/script.php?script_id=2540).
My .vimrc:
syntax on
function! s:KindOfQ(write,bang)
if a:write
wall
endif
if tabpagenr('$')!=1
let l:cmd="tabclose"
else
let l:cmd="qall"
endif
try
exec 'silent '.l:cmd.a:bang
catch /:E\%(37\|136\):/
echohl ErrorMsg
echo substitute(v:exception, '^[^:]\+:', '', '')
echohl None
endtry
endfunction
command W wall
command -bang Q :call <SID>KindOfQ(0,'<bang>')
command -bang WQ :call <SID>KindOfQ(1,'<bang>')
map <s-tab> <c-w><c-w>
let g:NeoComplCache_EnableAtStartup = 1
let g:NeoComplCache_SmartCase = 1
let g:NeoComplCache_EnableUnderbarCompletion = 1
let g:NeoComplCache_MinSyntaxLength = 1
let g:NeoComplCache_ManualCompletionStartLength = 0
let g:NeoComplCache_MinKeywordLength = 1
let g:NeoComplCache_CachingPercentInStatusline = 1
map <silent><C-l> <Plug>(neocomplcache_snippets_expand)
smap <silent><C-l> <Plug>(neocomplcache_snippets_expand)
inoremap <expr><C-h> pumvisible() ? "\<C-y>\<C-h>" : "\<C-h>"
inoremap <expr><silent><C-g> neocomplcache#undo_completion()
inoremap <expr><C-s> neocomplcache#complete_common_string()
color desert
no changes or modifications were made to plugins. no other plugins installed.
The bugs:
C++のソースファイル(filetypeがcpp)を開くと以下のメッセージが表示されます。
~~~~~~~~~~~ ここから ~~~~~~~~~~~
function 53_check_buffer..53_check_include の処理中にエラーが検出されました:
行 15:
E15: 無効な式です:
~~~~~~~~~~~ ここまで ~~~~~~~~~~~
neocomplcacheのバージョンはv3.06です。
function 64_complete の処理中にエラーが検出されました:
行 22:
E68: \z の後に不正な文字がありました
該当コード(autoload/neocomplcache.vim:859)
let l:use_previous_result = l:cur_text =~ '^\V' . s:old_text
s:old_text は escape(s:old_text, '') とする必要があります。
NeoComplCache will not complete the common string, if auto completion is off, even after manual completion has been triggered.
I love this plugin, but I'm having a hard time making it work with HTML code
I also use HTML_autoclosetag plugin, which as soon as typing closing the opening tag ">", the corresponding closing tag is inserted.
The issue is raised when used combined with NeoComplCache. It will place the cursor in the beginning of the opening tag and it will delete the ">"
Something like this (| is the cursor):
|<thetag
</thetag>
while it should be:
<thetag>
|
</thetag>
However, there is no problem with
|
when you write something in between the tags then delete it and insert a linebreak, it will work as expected
I thought I might be a problem with the html indent file or the html_autoclosetag plugin but I've already tested just the HTML_autoclosetag plugin alone and works fine, so there is definitely a "conflict" between these 2 plugins.
特にデフォルトのsnippetを書き換えてしまうとバージョンアップ時に上書きされてしまうので、複数の場所を指定できた方がうれしい。
精力的な開発、本当におつかれさまです。
先日、クイックマッチの絞込みの事でこちらで発言したものですが、
htmlを編集時、例えば<htと入力してhtmlを補完させようとした場合、
現れた候補の中からクイックマッチで数字キーを入力した場合、
htmlとだけ入力され、先頭に入力していた開始タグ記号「<」を消してしまいます。
これが、クイックマッチを使わず、Ctrl+NやPで選択すると消す事はありません。
こちらも、良かったらお願いできないでしょうか?
前回に引き続きで申き訳ないです。
Hi how to set up to cache both snippets and snippet file
eg: for .php files
//at the moment it only caches
snippets/php.snippets
//and also cache these in the folder of php
snippets/php/a.snippet
snippets/php/b.snippet
snippets/php/c.snippet
snippets/php/~.snippet
//so on
thank you
Neocomplcache erroneously inserts a ^F at the end of the line when I hit enter in insert mode. It's as if it tries to run the mapping:
inoremap neocomplcache#smart_close_popup() . "X"
unnecessarily. Too much time spent debugging gave no clues.
バージョン:2.51
NeoComplCacheDisableコマンドを実行すると、存在しないコマンド NeoComplCacheCachingDictionary を削除しようとしてエラーが発生します。
バージョン: 2.43
neocomplcache#keyword_escape()にて
-ワイルドカードのためにファイルタイプを見ていますが、-がキーワードに含まれているかを見た方が良いと思います。
if '-' =~ '\k'
シングルクォートを二重に展開していますが、呼び出し元でstring()関数を使った方が意味合い的にも合っているし確実かと思います。
以上、何か特別な理由があって今のようになっていたのでしたら、ご容赦ください。
syn match NeoComplCacheExpandSnippets するタイミングが明らかにおかしいです。
バージョン:2.51
g:NeoComplCache_EnableAtStartup を設定しないなどして未初期化の状態で neocomplcache#keyword_complete#caching_percent() を呼ぶとエラーになります。
function neocomplcache#keyword_complete#caching_percent の処理中にエラーが検出されました:
行 6:
E121: 未定義の変数です: s:sources
常に使用する変数は関数外で初期化した方が確実です。
I've noticed that if you have a snippet which is only 1 level deep (see examples below) newlines appear to be stripped.
snippet perl
<\t>#!/usr/bin/env perl
<\t>use strict;
<\t>use warnings;
<\t>${1}
When expanded looks like this:
#!/usr/bin/env perl
use strict;use warnings;| # '|' is where the cursor is
snippet perl
<\t>#!/usr/bin/env perl
<\t>use strict;
<\t>use warnings;
<\t>${1}
<\t><\t>
When expanded looks like this:
#!/usr/bin/env perl
use strict;
use warnings;
| # Where the cursor is
{ } # Extra spaces are still left here
Which is fine except I have to deal with the trailing spaces...
I downloaded neocomplcache-ver.5.0.zip from http://www.vim.org/scripts/script.php?script_id=2620 and installed it. It works great! And any keywords in c-c++-keywords.list from csupport plugin (in ~/.vim/c-support/wordlists) can be completed by neocomplcache-ver.5.0.
But yesterday I installed The latest version in github. I found it can't complete these words now.
Sorry for broken English...
バージョン: 2.43
ワイルドカード_を連続で入力するとエラーになります。
function 43_complete..43_get_complete_words..neocomplcache#keyword_complete#get_keyword_list の処理中にエラーが検出されました:
行 15:
E61:_ が入れ子になっています
展開後の正規表現が .** になっているようです。
when i use neocomplcache in C mode, i typed:
wh|
and show menu:
while [S] cRepeat
while while () {}
then I select and press , it expands to:
while (|/* condition /)
{
${0:/ code */}
}
and cursor jumps to the cmdline, and show
:'<,'>|
why it happened? are there something wrong i made?
特に複数行のsnippetを1行で定義すると見づらいので、読みやすく書きやすい定義ファイルのフォーマットが欲しい。
改行マーカの隠ぺいにもなる。
フォーマットは見やすければなんでもよいが、snipMateなどと互換があるとsnippetが使い回せてよいかも。
unite.vim の issue を誤ってこちらへ投稿してしまったため削除します。
Issues - Shougo/unite.vim - GitHub
https://github.com/Shougo/unite.vim/issues#issue/9
Hi,
I tried to create the snippet like the following:
snippet {
{
${1}
}
Neverthelss, it did not work. I tried to change it to other symbols like "!", but it still did not work.
I noticed that in javascript.snip, there is a snippet with a punctuation mark trigger
snippet :f
${1:method_name}: function(${2:attribute}){
${0}
}
However, the above built-in snippet did not work.
Is this a bug?
HI Shougo:
Thanks, for this plugin, I love it. It works very well in my vim, except:
For 1st issue. The complete_common_string does not bring me the whole line include variables of the keyword, it just the keyword it self. For example, when I type phpin and press , it complete the whole line "phpinfo([int what] | bool", but in neocomplcache, I only see "phpinfo".
For 2nd issue. It seems the neocomplcache does not get the whole build-in function name from phpcomplete, for example, the Memcache::XXX exist in phpcomplete but does not exist in ~./neocon/syntax_cache/php. Therefore, I can't complete MemcXXX, it just found nothing.
It is a bug? or my configuration error? Please kindly let me know how to fix this. Thanks!
=== Here comes from my necomplcache settings in .vimrc ===
let g:neocomplcache_enable_at_startup = 1
let g:neocomplcache_enable_smart_case = 1
let g:neocomplcache_enable_camel_case_completion = 1
let g:neocomplcache_enable_underbar_completion = 1
let g:neocomplcache_min_syntax_length = 3
let g:neocomplcache_enable_auto_select = 1
" Define keyword
if !exists('g:neocomplcache_keyword_patterns')
let g:neocomplcache_keyword_patterns = {}
endif
let g:neocomplcache_keyword_patterns['default'] = '\h\w*'
" Enable heavy omni completion
if !exists('g:neocomplcache_omni_patterns')
let g:neocomplcache_omni_patterns = {}
endif
" Key mappings
inoremap neocomplcache#complete_common_string()
imap neocomplcache#sources#snippets_complete#expandable() ? "(neocomplcache_snippets_expand)" : pumvisible() ? "" : ""
filetype別のsnippetが全体のsnippetにマージされてしまい、どのバッファでも表示されるようになってしまいます。
http://github.com/Shougo/neocomplcache/blob/master/autoload/neocomplcache/plugin/snippets_complete.vim#L322
http://github.com/Shougo/neocomplcache/blob/v3.13/autoload/neocomplcache/plugin/snippets_complete.vim#L563
辺りで copy() する必要があると思います。
snippet sample
abc
def
が、以下のように展開されます(|はカーソル)
abc
d
d|f
また、
snippet sample
abc
def
は、
abc
<
\n>de|f
になります。
-- 追記 --
なぜかコメントを書き込もうとしてもエラーが出て書き込めないので追記で返信します。
スニペットは、空行にもちゃんとインデントがあるのを除けば最初に挙げたものと同じですが、念のためgistに貼っておきます。
http://gist.github.com/280762
こちらでは初期状態(vim -u NONE -N)でも発生しました。展開キーもごく一般的な設定です。
imap <C-l> <Plug>(neocomplcache_snippets_expand)
確認時のバージョンは Windows gVim 7.2.327 neocomplcache 4.08 です。
snippets_complete.vim の 1.13 で確認。
241行目、以下のようにvalues()が必要なようです。
for snip in values(s:load_snippets(snippets_file))
ついでですが、snippets_complete.vim の2行目、FILE:の項目が syntax_complete.vim になっています。
This plugin looks good, but I , unsurprisingly, can not read Japanese. Is it possible to get an english version?
function 45_caching..45_initialize_syntax の処理中にエラーが検出されました:
行 55:
E121: 未定義の変数です: l:menu
filetypeによって発生するようです。今のところ javascript,lua,scala,io,groovy,sed,gitconfig などで確認。
Pythonソースファイル編集時に補完をすると、次のようなエラーが出ます。
function 25_complete..25_get_complete_omni..pythoncomplete#Complete の処理中にエラーが検出
されました:
行 35:
Traceback (most recent call last):
function 25_complete..25_get_complete_omni..pythoncomplete#Complete の処理中にエラーが検出
されました:
行 35:
File "", line 1, in
function 25_complete..25_get_complete_omni..pythoncomplete#Complete の処理中にエラーが検出
されました:
行 35:
NameError: name 'vimcomplete' is not defined
function 25_complete..25_get_complete_omni..pythoncomplete#Complete の処理中にエラーが検出
されました:
行 36:
E121: 未定義の変数です: g:pythoncomplete_completions
function 25_complete..25_get_complete_omni..pythoncomplete#Complete の処理中にエラーが検出
されました:
行 36:
E15: 無効な式です: g:pythoncomplete_completions
Skipped auto completion
こちらの環境は以下の通りです。
OS:Windows Vista Ultimate 32bit
vim version: 7.2.261(香り屋版gvim)
neocomplecache version: 3.15
使用環境について補足です。
エラーが起こっている別のWindowsマシン(OSはVista Business 32bit)でvim環境を作り、TortoiseHgのリポジトリに登録。
これをDropboxに移してリポジトリを共有し、問題のあった環境にリポジトリのクローンを作りvimを使用するといった事をしているのでneocomplcacheのバグではなく、別の原因でneocomplcacheのエラーが出ている(実際vim環境作った方のマシンでエラーが出ていません)ということも考えられるので、どちらに原因があるかを教えてください。
以上よろしくお願いします。
Hi,
is it possible to make cocoa.vim:
http://www.vim.org/scripts/script.php?script_id=2674
Objective-C method name autocompletion (with snipMate support) to work with neocomplcache auto completion popup menu ?
It can be activated with F5 (over neocomplcache menu) while typing method name like:
[NSString init
and choosing one from the list inserts method name with snipMate support (if installed).
The problem is that when typing some next characters of method name, the neocomplcache menu takes over again.
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.