Giter VIP home page Giter VIP logo

vim-flake8's Introduction

vim-flake8

vim-flake8 is a Vim plugin that runs the currently open file through Flake8, a static syntax and style checker for Python source code. It supersedes both vim-pyflakes and vim-pep8.

Flake8 is a wrapper around PyFlakes (static syntax checker), PEP8 (style checker) and Ned's MacCabe script (complexity checker).

Installation

Make sure you've installed the flake8 package.

If you use vim >= 8, install this plugin with:

mkdir -p ~/.vim/pack/flake8/start/
cd ~/.vim/pack/flake8/start/
git clone https://github.com/nvie/vim-flake8.git

Otherwise, install vim-pathogen if you're not using it already. Then, simply put the contents of this repository in your ~/.vim/bundle directory.

Usage

  1. Open a Python file
  2. Press <F7> to run flake8 on it

It shows the errors inside a quickfix window, which will allow your to quickly jump to the error locations by simply pressing [Enter].

If any of g:flake8_show_in_gutter or g:flake8_show_in_file are set to 1, call:

call flake8#Flake8UnplaceMarkers()

To remove all markers. No default mapping is provided.

Customization

If you don't want to use the <F7> key for flake8-checking, simply remap it to another key. It autodetects whether it has been remapped and won't register the <F7> key if so. For example, to remap it to <F3> instead, use:

autocmd FileType python map <buffer> <F3> :call flake8#Flake8()<CR>

Since the autocmd order is not specified in Vim, the previous recommendation is sometimes not sufficient to "unmap" <F7>. In such a case, being more explicit about it should help (see :h no_mail_maps):

let g:no_flake8_maps = 1

For flake8 configuration options please consult the following page:

http://flake8.pycqa.org/en/latest/user/configuration.html

To customize the location of your flake8 binary, set g:flake8_cmd:

let g:flake8_cmd="/opt/strangebin/flake8000"

To customize the location of quick fix window, set g:flake8_quickfix_location:

let g:flake8_quickfix_location="topleft"

To customize the height of quick fix window, set g:flake8_quickfix_height:

let g:flake8_quickfix_height=7

To customize whether the quickfix window opens, set g:flake8_show_quickfix:

let g:flake8_show_quickfix=0  " don't show
let g:flake8_show_quickfix=1  " show (default)

To customize whether the show signs in the gutter, set g:flake8_show_in_gutter:

let g:flake8_show_in_gutter=0  " don't show (default)
let g:flake8_show_in_gutter=1  " show

To customize whether the show marks in the file, set g:flake8_show_in_file:

let g:flake8_show_in_file=0  " don't show (default)
let g:flake8_show_in_file=1  " show

To customize the number of marks to show, set g:flake8_max_markers:

let g:flake8_max_markers=500  " (default)

To customize the gutter markers, set any of flake8_error_marker, flake8_warning_marker, flake8_pyflake_marker, flake8_complexity_marker, flake8_naming_marker. Setting one to the empty string disables it. Ex.:

let g:flake8_error_marker='EE'     " set error marker to 'EE'
let g:flake8_warning_marker='WW'   " set warning marker to 'WW'
let g:flake8_pyflake_marker=''     " disable PyFlakes warnings
let g:flake8_complexity_marker=''  " disable McCabe complexity warnings
let g:flake8_naming_marker=''      " disable naming warnings

To customize the colors used for markers, define the highlight groups, Flake8_Error, Flake8_Warning, Flake8_PyFlake, Flake8_Complexity, Flake8_Naming:

" to use colors defined in the colorscheme
highlight link Flake8_Error      Error
highlight link Flake8_Warning    WarningMsg
highlight link Flake8_Complexity WarningMsg
highlight link Flake8_Naming     WarningMsg
highlight link Flake8_PyFlake    WarningMsg

To show the error message of the current line in the ruler, call flake8#ShowError():

" add binding to call the function
nnoremap <C-K> :call flake8#Flake8ShowError()<cr>

Tips

A tip might be to run the Flake8 check every time you write a Python file, to enable this, add the following line to your .vimrc file (thanks Godefroid!):

autocmd BufWritePost *.py call flake8#Flake8()

This plugin goes well together with the following plugin:

  • PyUnit (unit test helper under <F8> and <F9>)

Max line lengths

One particular customization a lot of people like to make is relaxing the maximum line length default. This is a config setting that should be set in flake8 itself. (vim-flake8 "just" invokes it and deals with showing the output in Vim's quickfix window.)

To do so, put the following into a .flake8 file at the root of your project:

[flake8]
max-line-length = 120

History

1.6: Deprecated configuring flake8 options through Vim settings. Instead, advise users to use a .flake8 config file in the root of your project.

- Decprecated options:
  - `g:flake8_builtins`
  - `g:flake8_ignore`
  - `g:flake8_max_line_length`
  - `g:flake8_max_complexity`

- New options:
  - `g:flake8_quickfix_height`

1.5: Added markers and the option to don't show the quickfix window, also split functions into a autoload file. Added:

- Options:
  - `g:flake8_show_quickfix`
  - `g:flake8_show_in_gutter`
  - `g:flake8_show_in_file`
  - `g:flake8_max_markers`
  - `flake8_error_marker`
  - `flake8_warning_marker`
  - `flake8_pyflake_marker`
  - `flake8_complexity_marker`
  - `flake8_naming_marker`
- Functions:
  - `flake8#Flake8UnplaceMarkers()`
  - `flake8#Flake8()`
- Highlighting:
  - `Flake8_Error`
  - `Flake8_Warning`
  - `Flake8_Complexity`
  - `Flake8_Naming`
  - `Flake8_PyFlake`

1.4: Suppress output to stdout.

1.3: Added the following options:

- `g:flake8_builtins="_,apply"`
- `g:flake8_max_complexity=10`

1.2: Added the following options:

- `g:flake8_cmd="/opt/strangebin/flake8000"`
- `g:flake8_max_line_length=120`
- `g:flake8_ignore="E501,W293"`

1.1: Added g:flake8_ignore option.

1.0: Initial version.

License

Liberally licensed under BSD terms.

vim-flake8's People

Contributors

5t111111 avatar alanbriolat avatar amacfie avatar amosnier avatar antoinemadec avatar danieljsottile avatar dolph avatar ecmendenhall avatar eistaa avatar fthiery avatar gustavla avatar noah avatar nvie avatar pgiraud avatar phdru avatar pmrowla avatar saghul avatar skvrahul avatar tabac avatar tomasflam avatar yifanzhang avatar zsarver avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

vim-flake8's Issues

No built in vim help?

I installed this and seems to work well but I am surprised that there is no built in help accessible from within vim. All respectable vim plugins should provide this.

E21: Cannot make changes, 'modifiable' is off

When I try to go to the error(inconsistency with pep-8) in my code after running vim-flake8, by pressing enter.
E21: Cannot make changes, 'modifiable' is off
How do I resolve this?

Undefined variable: b:showing_message

Hello,
I am trying to show the error at the current line using the lightbar plugin, as described in the lightbar documentation. The error is echoed, but I receive the error in the subject.
My little understanding of vim plug-ins suggests that the ShowErrorMessage() function tests the showing_variable before it is set.

    let l:cursorPos = getpos(".")
    if !exists('s:resultDict')
        return
    endif

    " if there is a message on the current line,
    " then echo it 
    if has_key(s:resultDict, l:cursorPos[1])
        let l:errorText = get(s:resultDict, l:cursorPos[1])
        echo strpart(l:errorText, 0, &columns-1)
        let b:showing_message = 1
    endif

    " if a message is already being shown,
    " then clear it
    if !b:showing_message == 0   <--------- Here!
        echo
        let b:showing_message = 0
    endif

If I set
let b:showing_message = 0
in my config file the error disappears.

enabling flake8 kills my tabstops

Ok, I had this in vimrc:
set tabstop=4
set shiftwidth=4
set expandtab
set softtabstop=4
set autoindent
set smarttab

and I added the following to enable Flake8:
execute pathogen#infect()
filetype plugin indent on

The second line "filetype plugin indent on" is required to make Flake8 work. Without that line, I get this when trying to run Flake8:

E117: Unknown function: Flake8

So I have to add that filetype line in order to use Flake8 on python code.

However, when I turn that on, my tabstops no longer work and I get THIS whenever I try using the Tab key during an edit:

Error detected while processing function 34_SetVals:
line 12:
E121: Undefined variable: g:pydiction_location

So I am either doing something wrong, or there's a bug somewhere... I followed the instructions in the README file...

Doesn't work in Windows 7

When I press f7, it just keeps saying something about how it can't find the flake8 executable script. I can open up the bash shell that comes with Git and use flake8.. so it's definitely in my path. But if I open a cmd shell and try to use flake8, windows won't see it. Any ideas why? I installed with pip to a fresh Python 2.7.2 install.

On save and F7 both show no errors - flake8 in terminal does

As the title says, I can't figure out why everything seems happy in VIM but running flake8 in a terminal makes a big difference.

Sometimes it works, but most of the time it does, really odd.

FWIW I'm using a virtualenv, and launching vim from within the virtualenv too. Not sure if that makes a difference (still fairly new to VIM).

flake8#Flake8UnplaceMarkers() fail

When I try :call flake8#Flake8UnplaceMarkers(), either manually or with the autocmd I set up for it (on <S-F7>), I get the following error:

Error detected while processing function flake8#Flake8UnplaceMarkers[1]..<SNR>79_UnplaceMarkers:
line    9:
E121: Undefined variable: s:markerdata
E116: Invalid arguments for function values(s:markerdata)
E15: Invalid expression: values(s:markerdata)

I get an error whether let g:flake8_show_in_gutter=1, let g:flake8_show_in_file=1 or both are set.

Vim 8.0 under Mint 19, with the following additional plugins:

Plug 'jlanzarotta/bufexplorer'
Plug 'tmhedberg/SimpylFold'
Plug 'vim-scripts/indentpython.vim'
Plug 'Rigellute/shades-of-purple.vim'
Plug 'Valloric/YouCompleteMe'
Plug 'vim-syntastic/syntastic'
Plug 'nvie/vim-flake8'

# nopep8 doesn't work

Previously I used pyflakes, and in there, if I wanted a line of code to be excluded from flake8 checks, I would add # nopep8 at the end of the line. This does not seem to work in vim-flake8.

No proper result checking pep8 in several split

Hi!

To reproduce this error:

  1. Open 2 python files in different horizontal splits (vim -O fileA.py fileB.py)
  2. Go to the file in the left split
  3. Run Flake8

The result will be a vertical split in the split of the right with no result on it.

If instead make the mistake on fileA you do it in fileB it works properly.

Thanks for the plugin! It's really useful! :)

Quickest way to "go to next error"?

Great plugin!

I'm wondering if there's a command I can run that quickly goes to the next line where there's a flake8 error. Right now I have to read the list of errors, spot the line number, and do :<line number>, but it would be nice if I could remap something like <leader>k to automatically jump to that line.

How could I do this?

Adjusting colours

I find the default grey-on-lightblue colour of the first listed flake8 error to be unreadable on my terminal. I can't quite figure out from the vim-flake8 docs how to change that. Can you make a suggestion and/or cover tweaking the colour scheme in the README?

Disable complexity warnings?

I added the next option to my .vimrc:
let g:flake8_complexity_marker='' " disable McCabe complexity warnings
But running flake#Flake8() still displays complexity warnings:
image
Could you please advise?

Problem with 'ignore'

I have this in my ~/.vimrc:

let g:flake8_ignore="W802"

However, running vim-flake8 (with F7) still lists lots of undefined names:

/path/to/script.py|13| W802 undefined name 'request'

I can't see what I'm doing wrong...

Flake8() makes window title persist after closing Vim

Running Flake8() makes the window title persist after closing Vim.

I have the following in my .vimrc:

" Set the title of the Terminal window
autocmd BufEnter *
\ if getbufvar(winbufnr(winnr()), "&buftype") != "quickfix" |
\ set title |
\ endif
let &titleold=""

For each file I open in vim, the terminal's window title is set to the default "fname (path)". If I then close vim, the terminal's window is normally reset to the old title.

If I run Flake8() during a session and then quit vim, the terminal's window title is not reset (it stays as "fname (path)").

It doesn't seem to matter if the quickfix window is show or not (e.g. valid vs invalid), so I think it has something to do with the grep command.

Autodetection of mapping for flake8-checking

Example given in README, namely:

autocmd FileType python map <buffer> <F3> :call Flake8()<CR>

for disabling automapping to <F7> doesn't work. The reason is that ftplugins are sourced before vimrc's autocmds. It makes this check:

if !hasmapto('Flake8(')
    noremap <buffer> <F7> :call Flake8()<CR>
endif

useless.

I've overcame this by defining:

let g:no_flake8_maps=1

which is already defined, but the README needs to be clarified so no one is confused.

Unknown function: Flake8

When utilizing the following command to run Flake8 on save, I get an "Unknown function: Flake8" error. The plugin still works, and >> is displayed next to the lines where there are errors but it's quite annoying.

Here is the code I'm using in my .vimrc file (suggested by the README):

autocmd BufWritePost *.py call Flake8()

I use Vundle instead of pathogen... not sure if that makes a difference. I'm on a Mac (OSX 10.6.8) using Mac Vim version 7.3. Any help would be appreciated! Thanks!

Breaking line automatically

After installed vim flake8 my code breaks line automatically when I pass the 80 characters. How can I prevent that?

Customize quickfix window height.

I've done this locally would you be interested in merging a PR for it?

It will look something like: let g:flake8_quickfix_height=5

Add parameter for config in Flake8() function

I would like to be able to explicitly declare which flake8 config to use with the Flake8() function. I can currently do this by setting the flake8_cmd with flake8's --config option before each call, but it is not convenient.

Quickfix window displayed when no errors

I have this problem since a while now, and never succeeded to solve it on both my macOS at work or my Linux workstation at home.

When I run VIM-Flake8 on a Python file containing no error, the quickfix window is still open and displays a strange message: || 0

As a screenshot is worth thousands words: https://drive.google.com/open?id=1GiAGqLRWjPr4UvBGzs2y1HTlb4zled4y

Here is my configuration:

let g:flake8_show_in_gutter=1
let g:flake8_show_in_file=1
let g:flake8_show_quickfix=1
autocmd BufWritePost *.py call Flake8()

Does anyone else have the same problem? Is it a bug, or a feature? 😉

Dead link

Hi! :) I'm trying to figure out how to customize the max line length, and the installation instructions are a little unclear on exactly which file to edit. I think the info I need should be at this link: https://flake8.readthedocs.org/en/latest/config.html but it "doesn't exist yet." Would be helpful to have a concrete example and/or fix that link for n00bs.

Thanks for a great tool!

Highlighting Python code on the fly with warnings?

Thanks for releasing vim-flake8!

I was wondering if you would be interested in integrating an highlighting option like in pyflakes.vim ? If so, how would you go about implementing it in vim-flake8? Let me know how I could help.

vim-flake8 does work(Solved)

When i open a python file with vim and enter F7, it turn that "File flake8 not found. Please install it first."

I had installed the flake8 package by " sudo pip3 install flake8" and vim-flake8 by "Plugin 'nvie/vim-flake8'".

And my system is centos 7 and vim' version is 8.0.

When i install the flake8 by "sudo yum install python-flake8", the vim-flake8 does work.

Flake8 ignoring -ignore flag setting

Hello,

Problem

I call Flake8 whenever I write to a Buffer:

autocmd BufWritePost *.py :call Flake8()

But it shows a list of errors which I've already configured to be ignored:

foo.py|28 col 80| E501 line too long (88 > 79 characters)
foo.py|36 col 1| E302 expected 2 blank lines, found 1

Here are the relevant lines from my vimrc:

execute pathogen#infect()
filetype plugin indent on

set statusline+=%#warningmsg#
set statusline+=%{SyntasticStatuslineFlag()}
set statusline+=%*
let g:syntastic_python_checkers = ['flake8', 'pylint']

let g:syntastic_python_pylint_args="-d C0103,C0111,R0201"
let g:syntastic_python_flake8_args='--ignore=F821,E302,E501'

Software

I'm using terminal NeoVim (NVIM 0.1.5-dev) on latest Mac OS X release (10.11.5)

Note: I have the same issue with standard OS X install of terminal Vim (7.3)

Notes

The Flake8 plugin appears to work as I can see it's being loaded as part of Syntastic:

Syntastic version: 3.7.0-157 (Vim 704, Darwin)                                                                    
Info for filetype: python                                                                                         
Global mode: active                                                                                               
Filetype python is active                                                                                         
The current file will be checked automatically                                                                    
Available checkers: flake8 pep8 pycodestyle pyflakes pylint python                                                
Currently enabled checkers: flake8 pylint

I've looked at :scriptnames and I can see the flake8 plugin is being loaded:

~/.vim/bundle/vim-flake8/ftplugin/python_flake8.vim
~/.vim/bundle/syntastic/syntax_checkers/python/flake8.vim

If I was to remove the following line from my vimrc:

let g:syntastic_python_flake8_args='--ignore=F821,E302,E501'

...then close Vim and re-open the relevant python file in Vim, I would see those errors appear in a quickfix window and that would be expected behaviour.

If I then put back that line into my vimrc, close Vim and re-open the relevant python file in Vim I'll see the errors are ignored. Again, expected behaviour.

The problem occurs only when calling Flake8 when writing to the current buffer. The errors re-appear, when they should be ignored.

Interestingly I noticed, when removing the flake8_args setting, that after opening the file and the quicklist window immediately appeared, that if I then wrote to the buffer I would get another quickfix window with the same errors. But the first quickfix window shows the command used as:

:flake8 "foo.py"

I think the problem is that when I use call Flake8 that I'm using the shell directly, maybe? This would explain why it's side-stepping my Syntastic ignore flag setting

Quickfix window displayed only once for each file

Hi, I'm using vim-flake8 (default settings) with vim 7.4 installed via vim-plug.
Quickfix window is shown only once for a file, i.e. if I close it and then call flake8 again using F7 I'm getting "Flake8 check OK" even if I didn't fix any errors.
Changing anything in the file or opening it again via netrw doesn't help. Only reinvoking vim helps - the quickfix window is displayed again for the first time. I don't think this is an expected behaviour.

Flake8 is always showing errors when invoked from terminal.

Thanks for the help in advance.

file flake8 not found

I want use vim-flake8 in windows , I have install tlake8. why tips “file flake8 not found ...” .
I need to change the config ?

show error in a popup on hover

I configure it in my init.vim to show errors in file instead of a quick fix window. is it possible to show these error in a popup window while hovering?

Distinguish between linting and PEP-8 errors?

Is it possible to distinguish between errors that come from the linter (syntax errors) and PEP-8 violations? I'd like to have different colors and symbols for them.
If not possible, according to Flake8 docs there is at least one error code that is different from the others E999 that is raised when the file does not compile in a correct syntax tree, and that could be catched in a different category?
Thanks!

Making vim-flake8 asynchronuous

For some weird reason that I'm still debugging, when putting autocmd BufWritePost *.py call MaybeFlake8() flake8 runs for every single buffer on save, which takes about 4 seconds.

What's more, because flake8 is blocking, I have to wait for those 4 seconds to finish before being able to type anything.

This ticket is about making vim-flake8 asynchronous, so that we can still use vim while flake8 is running.

It seems @alfredodeza https://github.com/alfredodeza/khuno.vim implemented something similar. Any interest in doing the same?

:flake8 command instead of <F7> key

It will feel very familiar to vim users if vim-flake8 executes with vim command like :flake8 instead of hitting <F7> key.
Or you can make both options available.
This is only my suggestion if this happens I am sure much more users will be happy.

Thanks @nvie of nice plugin.

g:flake8_builtins to pass --builtins to flake8.py

Hello! flake8.py has --builtins command line option which isn't read from .pep8 config. The attached patch adds g:flake8_builtins configuration variable that passes --builtins to flake8.py.

Thank you for the plugin!

BTW, why it's mapped to F7? It would be logical to map it to F8, no? ;-)

diff --git a/README.mdown b/README.mdown
index 86a09cb..7a01cf8 100644
--- a/README.mdown
+++ b/README.mdown
@@ -34,6 +34,10 @@ the `<F7>` key if so.  For example, to remap it to `<F3>` instead, use:

     autocmd FileType python map <buffer> <F3> :call Flake8()<CR>

+To add builtins, in your .vimrc:
+
+    let g:flake8_builtins="_,apply"
+
 To ignore errors, in your .vimrc:

     let g:flake8_ignore="E501,W293"
diff --git a/ftplugin/python_flake8.vim b/ftplugin/python_flake8.vim
index 2fc7ed4..710abf7 100644
--- a/ftplugin/python_flake8.vim
+++ b/ftplugin/python_flake8.vim
@@ -37,6 +37,12 @@ if !exists("*Flake8()")
         endif

         " read config
+        if exists("g:flake8_builtins")
+            let s:flake8_builtins_opt=" --builtins=".g:flake8_builtins
+        else
+            let s:flake8_builtins_opt=""
+        endif
+
         if exists("g:flake8_ignore")
             let s:flake8_ignores=" --ignore=".g:flake8_ignore
         else
@@ -57,7 +63,7 @@ if !exists("*Flake8()")

         " perform the grep itself
         let &grepformat="%f:%l:%c: %m\,%f:%l: %m"
-        let &grepprg=s:flake8_cmd.s:flake8_ignores.s:flake8_max_line_length.s:flake8_max_complexity
+        let &grepprg=s:flake8_cmd.s:flake8_builtins_opt.s:flake8_ignores.s:flake8_max_line_length.s:flake8_max_complexity
         silent! grep! %

         " restore grep settings

Says "OK" if flake8 fails

For one of my source files, flake8 fails with

IndexError: list index out of range

vim-flake8 doesn't see the exit code and reports "OK", though.

vim-flake8 git version gets hold of the <F7> key unconditionally

Hi!

This page reads - https://github.com/nvie/vim-flake8

Customization

If you don't want to use the <F7> key for flake8-checking, simply remap it to another key. It autodetects whether it has been remapped and won't register the <F7> key if so. For example, to remap it to <F3> instead, use:

autocmd FileType python map <buffer> <F3> :call Flake8()<CR>

However having added this line to my .vimrc, still does the flake8 thing instead of my previous mapping which is :cp in the quickfix window:

autocmd FileType python map <buffer> <F5> :call Flake8()<CR>

please look into correcting it because vim-flake8 does not work as advertised.

Hotkey mapped in too many modes

Using noremap! binds the key in input mode, causing the F7 key to insert :call Flake8() in the middle of whatever you're typing, and never resulting in the command actually running. It should be replaced with cnoremap if you definitely want it to work in command-line mode (only useful if you entered command-line mode but didn't type anything yet) or removed altogether.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.