GithubHelp home page GithubHelp logo

ntpeters / vim-better-whitespace Goto Github PK

View Code? Open in Web Editor NEW
1.4K 18.0 80.0 119 KB

Better whitespace highlighting for Vim

License: The Unlicense

Vim Script 100.00%
vim whitespace trailing-spaces trailing-whitespaces

vim-better-whitespace's Introduction

Vim Better Whitespace Plugin

This plugin causes all trailing whitespace characters (see Supported Whitespace Characters below) to be highlighted. Whitespace for the current line will not be highlighted while in insert mode. It is possible to disable current line highlighting while in other modes as well (see options below). A helper function :StripWhitespace is also provided to make whitespace cleaning painless.

Here is a screenshot of this plugin at work: Example Screenshot

Installation

There are a few ways you can go about installing this plugin:

  1. If you have Vundle you can simply add:
    Plugin 'ntpeters/vim-better-whitespace'
    to your .vimrc file then run:
    :PluginInstall
  2. If you are using Pathogen, you can just run the following command:
    git clone git://github.com/ntpeters/vim-better-whitespace.git ~/.vim/bundle/vim-better-whitespace
    
  3. While this plugin can also be installed by copying its contents into your ~/.vim/ directory, I would highly recommend using one of the above methods as they make managing your Vim plugins painless.

Usage

Whitespace highlighting is enabled by default, with a highlight color of red.

  • To set a custom highlight color, just call:

    highlight ExtraWhitespace ctermbg=<desired_color>

    or

    let g:better_whitespace_ctermcolor='<desired_color>'

    Similarly, to set gui color:

    let g:better_whitespace_guicolor='<desired_color>'
  • To enable highlighting and stripping whitespace on save by default, use respectively

    let g:better_whitespace_enabled=1
    let g:strip_whitespace_on_save=1

    Set them to 0 to disable this default behaviour. See below for the blacklist of file types and per-buffer settings.

  • To enable/disable/toggle whitespace highlighting in a buffer, call one of:

    :EnableWhitespace
    :DisableWhitespace
    :ToggleWhitespace
  • The highlighting for the current line in normal mode can be disabled in two ways:

    • let g:current_line_whitespace_disabled_hard=1

      This will maintain whitespace highlighting as it is, but may cause a slow down in Vim since it uses the CursorMoved event to detect and exclude the current line.

    • let g:current_line_whitespace_disabled_soft=1

      This will use syntax based highlighting, so there shouldn't be a performance hit like with the hard option. The drawback is that this highlighting will have a lower priority and may be overwritten by higher priority highlighting.

  • To clean extra whitespace, call:

    :StripWhitespace

    By default this operates on the entire file. To restrict the portion of the file that it cleans, either give it a range or select a group of lines in visual mode and then execute it.

    • There is an operator (defaulting to <leader>s) to clean whitespace. For example, in normal mode, <leader>sip will remove trailing whitespace from the current paragraph.

      You can change the operator it, for example to set it to _s, using:

      let g:better_whitespace_operator='_s'

      Now <number>_s<space> strips whitespace on <number> lines, and _s<motion> on the lines affected by the motion given. Set to the empty string to deactivate the operator.

      Note: This operator will not be mapped if an existing, user-defined mapping is detected for the provided operator value.

  • To enable/disable stripping of extra whitespace on file save for a buffer, call one of:

    :EnableStripWhitespaceOnSave
    :DisableStripWhitespaceOnSave
    :ToggleStripWhitespaceOnSave

    This will strip all trailing whitespace everytime you save the file for all file types.

    • If you want this behaviour by default for all filetypes, add the following to your ~/.vimrc:

      let g:strip_whitespace_on_save = 1

      For exceptions of all see g:better_whitespace_filetypes_blacklist.

    • If you would prefer to only strip whitespace for certain filetypes, add the following to your ~/.vimrc:

      autocmd FileType <desired_filetypes> EnableStripWhitespaceOnSave

      where <desired_filetypes> is a comma separated list of the file types you want to be stripped of whitespace on file save ( ie. javascript,c,cpp,java,html,ruby )

    • If you want to disable automatically stripping whitespace for large files, you can specify a maximum number of lines (e.g. 1000) by adding the following to your ~/.vimrc:

      let g:strip_max_file_size = 1000

      This overrides let g:strip_whitespace_on_save but not :EnableStripWhitespaceOnSave. Set to 0 to deactivate.

    • By default, you will be asked for confirmation before whitespace is stripped when you save the file. This can be disabled by adding the following to your ~/.vimrc:

      let g:strip_whitespace_confirm=0
      
    • By default, all the lines in the file will have their trailing whitespace stripped when you save the file. This can be changed to only the modified lines, by adding the following to your ~/.vimrc:

      let g:strip_only_modified_lines=1
      
    • You can override the binary used to check which lines have been modified in the file. For example to force a 'diff' installed in a different prefix and ignoring the changes due to tab expansions, you can set the following:

      let g:diff_binary='/usr/local/bin/diff -E'
      
  • To disable the highlighting for specific file types, add the following to your ~/.vimrc:

    let g:better_whitespace_filetypes_blacklist=['<filetype1>', '<filetype2>', '<etc>']

    This replaces the filetypes from the default list of blacklisted filetypes. The default types that are blacklisted are:

    ['diff', 'git', 'gitcommit', 'unite', 'qf', 'help', 'markdown', 'fugitive']

    If you prefer to also keep these default filetypes ignored, simply include them in the blacklist:

    let g:better_whitespace_filetypes_blacklist=['<filetype1>', '<filetype2>', '<etc>',
                                            'diff', 'git', 'gitcommit', 'unite', 'qf', 'help', 'markdown', 'fugitive']

    This blacklist can be overriden on a per-buffer basis using the buffer toggle enable and disable commands presented above. For example:

    " highlight whitespace in markdown files, though stripping remains disabled by the blacklist
    :autocmd FileType markdown EnableWhitespace
    " Do not modify kernel files, even though their type is not blacklisted and highlighting is enabled
    :autocmd BufRead /usr/src/linux* DisableStripWhitespaceOnSave
  • To strip white lines at the end of the file when stripping whitespace, set this option in your .vimrc:

    let g:strip_whitelines_at_eof=1
  • To highlight space characters that appear before or in-between tabs, add the following to your .vimrc:

    let g:show_spaces_that_precede_tabs=1

    Such spaces can not be automatically removed by this plugin, though you can try = to fix indentation. You can still navigate to the highlighted spaces with Next/PrevTrailingWhitespace (see below), and fix them manually.

  • To ignore lines that contain only whitespace, set the following in your .vimrc:

    let g:better_whitespace_skip_empty_lines=1
  • To navigate to the previous or next trailing whitespace, you can use commands that you can map thusly in your .vimrc:

    nnoremap ]w :NextTrailingWhitespace<CR>
    nnoremap [w :PrevTrailingWhitespace<CR>

    Note: those command take an optional range as argument, so you can for example select some text in visual mode and search only inside it:

    :'<,'>NextTrailingWhitespace
  • To enable verbose output for each command, set verbosity in your .vimrc:

    let g:better_whitespace_verbosity=1

Supported Whitespace Characters

Due to the fact that the built-in whitespace character class for patterns (\s) only matches against tabs and spaces, this plugin defines its own list of horizontal whitespace characters to match for both highlighting and stripping.

This is list should match against all ASCII and Unicode horizontal whitespace characters:

    U+0009   TAB
    U+0020   SPACE
    U+00A0   NO-BREAK SPACE
    U+1680   OGHAM SPACE MARK
    U+180E   MONGOLIAN VOWEL SEPARATOR
    U+2000   EN QUAD
    U+2001   EM QUAD
    U+2002   EN SPACE
    U+2003   EM SPACE
    U+2004   THREE-PER-EM SPACE
    U+2005   FOUR-PER-EM SPACE
    U+2006   SIX-PER-EM SPACE
    U+2007   FIGURE SPACE
    U+2008   PUNCTUATION SPACE
    U+2009   THIN SPACE
    U+200A   HAIR SPACE
    U+200B   ZERO WIDTH SPACE
    U+202F   NARROW NO-BREAK SPACE
    U+205F   MEDIUM MATHEMATICAL SPACE
    U+3000   IDEOGRAPHIC SPACE
    U+FEFF   ZERO WIDTH NO-BREAK SPACE

A file is provided with samples of each of these characters to check the plugin working with them: whitespace_examples.txt

If you encounter any additional whitespace characters I have missed here, please submit a pull request.

Screenshots

Here are a couple more screenshots of the plugin at work.

This screenshot shows the current line not being highlighted in insert mode: Insert Screenthot

This screenshot shows the current line not being highlighted in normal mode(CurrentLineWhitespaceOff hard): Normal Screenshot

This screenshot shows that highlighting works fine for spaces, tabs, and a mixture of both: Tabs Screenshot

Frequently Asked Questions

Hopefully some of the most common questions will be answered here. If you still have a question that I have failed to address, please open an issue and ask it!

Q: Why is trailing whitespace such a big deal?

A: In most cases it is not a syntactical issue, but rather is a common annoyance among programmers.

Q: Why not just use listchars with SpecialKey highlighting?

A: I tried using listchars to show trail characters with SpecialKey highlighting applied. Using this method the characters would still show on the current line for me even when the SpecialKey foreground highlight matched the CursorLine background highlight.

Q: Okay, so listchars doesn't do exactly what you want, why not just use a match in your vimrc?

A: I am using match in this plugin, but I've also added a way to exclude the current line in insert mode and/or normal mode.

Q: If you just want to exclude the current line, why not just use syntax-based highlight rather than using match and CursorMoved events?

A: Syntax-based highlighting is an option in this plugin. It is used to omit the current line when using CurrentLineWhitespaceOff soft. The only issue with this method is that match highlighing takes higher priorty than syntax highlighting. For example, when using a plugin such as Indent Guides, syntax-based highlighting of extra whitespace will not highlight additional white space on emtpy lines.

Q: I already have my own method of removing white space, why is the method used in this plugin better?

A: It may not be, depending on the method you are using. The method used in this plugin strips extra white space and then restores the cursor position and last search history.

Q: Most of this is pretty easy to just add to users' vimrc files. Why make it a plugin?

A: It is true that a large part of this is fairly simple to make a part of an individuals configuration in their vimrc. I wanted to provide something that is easy to setup and use for both those new to Vim and others who don't want to mess around setting up this functionality in their vimrc.

Q: Can you add indentation highlighting for spaces/tabs? Can you add highlighting for other types of white space?

A: No, and no. Sorry, but both are outside the scope of this plugin. The purpose of this plugin is to provide a better experience for showing and dealing with extra white space. There is already an amazing plugin for showing indentation in Vim called Indent Guides. For other types of white space highlighting, listchars should be sufficient.

Q: I have a better way to do something in this plugin. OR You're doing something stupid/wrong/bad.

A: If you know of a better way to do something I am attempting in this plugin, or if I am doing something improperly/not reccomended then let me know! Please either open an issue informing me or make the changes yourself and open a pull request. If I am doing something that is bad or can be improved, I am more than willing to hear about it!

Deprecated commands

Toggling the current line whitespace mode is now a plugin configuration, and can not be done dynamically anymore. Thus the folowing commands are now deprecated:

:CurrentLineWhitespaceOff <level>

where <level> is either hard or soft, and:

:CurrentLineWhitespaceOn

If you really miss this feature, its withdrawal can easily be overriden by adding the following to the vimrc (after loading the plugin initially):

fun! BetterWhitespaceCurrentLineMode(type)
        " set setting to whatever was passed
        let g:current_line_whitespace_disabled_soft=a:type == 'soft'
        let g:current_line_whitespace_disabled_hard=a:type == 'hard'
        " reload plugin
        unlet! g:loaded_better_whitespace_plugin
        runtime plugin/better-whitespace.vim
        " Re-override the deprecated commands
        command! -nargs=1 CurrentLineWhitespaceOff call BetterWhitespaceCurrentLineMode(<f-args>)
        command! CurrentLineWhitespaceOn call BetterWhitespaceCurrentLineMode('off')
        " Manually trigger change for current buffer.
        " BufWinEnter will take care of the rest.
        filetype detect
endfun

" Override deprecated commands, after (!) loading plugin
command! -nargs=1 CurrentLineWhitespaceOff call BetterWhitespaceCurrentLineMode(<f-args>)
command! CurrentLineWhitespaceOn call BetterWhitespaceCurrentLineMode('off')

Promotion

If you like this plugin, please star it on Github and vote it up at Vim.org!

Repository exists at: http://github.com/ntpeters/vim-better-whitespace

Plugin also hosted at: http://www.vim.org/scripts/script.php?script_id=4859

Credits

Originally inspired by: https://github.com/bronson/vim-trailing-whitespace

Based on:

http://sartak.org/2011/03/end-of-line-whitespace-in-vim.html

http://vim.wikia.com/wiki/Highlight_unwanted_spaces

vim-better-whitespace's People

Contributors

blueyed avatar bryant1410 avatar charlesbjohnson avatar cimbali avatar crunkle avatar docwhat avatar elmar-hinz avatar farzat07 avatar gkaklas avatar hermes85pl avatar huangzonghao avatar jbylsma avatar jjeaton avatar jlmuir avatar joakin avatar matt1003 avatar nicdumz avatar ntpeters avatar pitkling avatar polyzen avatar robertaudi avatar sjmelia avatar skopciewski avatar thinuspollard 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

vim-better-whitespace's Issues

Feature: Option to not show trailing whitespace.

If I know that the white spaces are going to be removed on save, then I don't need to see that whitespace exists.

Therefore it would be good to have an option not to highlight the trailing whitespace

Error detected while processing function <SNR>31_InitVariable:

Yesterdays commits to this plugin completely broke it for me. Now when starting vim I am greeted with a pile of errors like:

Error detected while processing function <SNR>31_InitVariable:
line    2:
E730: using List as a String
E15: Invalid expression: 'let ' . a:var . ' = ' . a:value
Error detected while processing function <SNR>31_SetupAutoCommands:
line    5:
E121: Undefined variable: g:better_whitespace_filetypes_blacklist
E116: Invalid arguments for function index(g:better_whitespace_filetypes_blacklist, &ft) >= 0
E15: Invalid expression: index(g:better_whitespace_filetypes_blacklist, &ft) >= 0

...and so on for several pages. The end result is that vim runs but keeps throwing errors on various operations.

Backtracking two commits to 829d818 runs fine.

Add markdown filetype to blacklist

Markdown syntax depends on trailing whitespace for line breaks, so these files should not default to stripping trailing whitespace to preserve them.

Blacklist for actual whitespace stripping (question ^ feature request)

I added a filetype to the blacklist thinking it would blacklist that filetype from all plugin operations. However, this isn't the case. The blacklist only applies to the highlighting.

So my question xor feature request is: is there an in-plugin way to do this (i.e. not with a vimrc autocmd) and if not could such a feature be added.

Configuration parameters are not configurable

Hi,

First of all, this plugin is awesome. Thanks so much for this.

It looks like your configuration variables (ie. let g:better_whitespace_enabled = 1, etc) are not configurable from within a .vimrc and whatever values are used by default in your plugin are what the user is effectively stuck with.

I suggest a simple change so that the defaults are only assigned provided the user did not assign a value already. I've spent roughly 30 seconds trying something like what Valloric/YouCompleteMe does here and it seems to resolve this issue.

It seems that there are several other ways to do this but, as I know hardly anything about Vimscript, I don't know which is the most acceptable (if there is one). If you have any tips for this, I'd be happy to submit a pull request to fix this. See my pull request for my attempt at it.

Thanks.

Feature request: Display the result of toggling in case of ToggleWhitespace and ToggleStripWhitespaceOnSave

Hi,

It is more like a feature request not a bug. I am missing the feedback from the toggling functions. For example it is impossible to find out if StripWhitespaceOnSave is on/off without checking the g:strip_whitespace_on_save variable.
Therefore I have this in my vimrc:

function! ToggleStripWhitespaceOnSaveAndDisplay()
    echon "StripWhitespace on save "
    ToggleStripWhitespaceOnSave
    if (g:strip_whitespace_on_save)
        echon "ON"
    else
        echon "OFF"
    endif
endfunction
map <Leader>s :call ToggleStripWhitespaceOnSaveAndDisplay()<cr>
function! ToggleWhitespaceAndDisplay()
    echon "Whitespace highlighting "
    ToggleWhitespace
    if (g:better_whitespace_enabled)
        echon "ON"
    else
        echon "OFF"
    endif
endfunction
" unimpaired like toggling
map cows :call ToggleWhitespaceAndDisplay()<cr>

What is you opinion about adding functions like these, or modifiyng the original ToggleWhitespace and ToggleStripWhitespaceOnSave?

Thanks,
Gabor

Just updated, space doesn't function properly in normal mode

So I just updated all the plugins on my system. I have <Space> set as leader so space being broke in normal mode is a major bummer for me. I have showcmd set, so I can see in the gutter the keystrokes for different commands. One thing that I noticed is that all the commands that are bound to some key combination that includes the leader key don't work. When I pressed space, the gutter would show <20> instead of \ as it normally does for space. Trying to track down the problem, I disabled each plugin I use one by one until I disabled this one. The problem magically disappeared. Then, I re-enabled all the plugins except this one and again, everything worked! So it should be a problem with this plugin, right?

Regression in support for ignoring some filetypes, e.g. vimfiler

The fix for #21 introduced a regression: having configured vim-better-whitespace to ignore "vimfiler" filetype, I get all the trailing whitespace highlited when opening a vimfiler buffer for the first time by calling ":VimFiler -explorer" (this does not happen after closing the window and calling it again).

git-compatible whitespace checking?

Hi

This plugin is quite handy as it stands. I'm curious about what might be involved in adding support for mixed whitespace/tab indent detection a-la git log --check though. It's a source of irritating whitespace issues that I have to go through and fix up afterwards if I accidentally introduce them.

I can find them with :set list but of course that's cumbersome to edit with always enabled, and doesn't highlight just problems.

Do you think that's likely to be possible/practical? I'm not sure how to usefully express it as a highlight expression.

Default doesn't seem to turn on

After installing this using vundle, in order to get the highlighting to work I have to run :ToggleWhitespace twice. The first does nothing (presumably turning it off) and the second turns it on again.

This appears to be per-buffer behaviour as well that I have to do it rather than globally having it on or off.

I'm using powerline as well as solarized for themes (no real configuration of these beyond setting them).

Config below for any insights what may be conflicting:

"--- .vimrc
"--- Requires:
"----   Vundle (https://github.com/gmarik/vundle)
"---    Powerline (http://lokaltog.github.com/powerline)
"----       Used Ubuntu Mono font for Powerline. (added to repo)
"----       Used Patched monaco font for Mac
"----          https://gist.github.com/baopham/1838072
"
set nocompatible    


set t_Co=256

syntax on

filetype plugin indent on

set tabstop=4
set shiftwidth=4
set expandtab
set autoindent
set number
set numberwidth=4
set showcmd
set showmatch
set ignorecase
set hlsearch
set laststatus=2
set showtabline=2
set cursorline
set smarttab
set colorcolumn=80 " puts line at 80 char
set pastetoggle=<F2>
set bs=indent,eol,start "-- Backspace over everything in insert mode

"--------Cold folding --------------------
set foldmethod=indent
set foldlevel=99


"---- Other config ----------------
let mapleader = ","

let os = substitute(system('uname'), "\n", "", "")

"----   Set up all the vundle stuff
filetype off " required!

set rtp+=~/.vim/bundle/Vundle.vim
call vundle#begin()

" let Vundle manage Vundle
Plugin 'gmarik/Vundle.vim'

" Install relevant bundles.
Plugin 'tpope/vim-fugitive'
Plugin 'Lokaltog/powerline'
Plugin 'altercation/vim-colors-solarized'
Plugin 'ntpeters/vim-better-whitespace'

call vundle#end()

filetype plugin indent on     " required!

"----   Other config

"---- Add custom syntax handling
au BufRead,BufNewFile *.pde set filetype=arduino
au BufRead,BufNewFile *.ino set filetype=arduino

"---- Powerline -------------------------------------------------------
set rtp+=~/.vim/bundle/powerline/powerline/bindings/vim
let g:Powerline_symbols = 'fancy'
let g:Powerline_colorscheme = 'solarized256'

"----   Solarized
colorscheme solarized
set background=dark

set noshowmode "-- remove the bottom insert thingy

No whitespace highlighting when opening a split on the same buffer

Thanks for your work on this project!

I've encountered a small problem when opening a split on an existing buffer - the BufWinEnter event doesn't fire. (As expected from the docs here) To replicate:

  1. Open a file with trailing whitespace (it'll be highlighted)
  2. Create a split on the same buffer with sp

Expected: the new split will also contain highlighted whitespace
Actual: the split does not highlight the whitespace.

Ignore "^ $" with gitcommit buffers (gitcommitDiff syntax group, verbose diff)

With git commit -v (includes the patch) the single leading spaces in the verbose section are highlighted as errors.

The filetype is "gitcommit", and the syntax highlighting group for this section is gitcommitDiff.
Added/removed lines have the group diffAdded and diffRemoved additionally.

better-whitespace could

  1. ignore errors for ^ $ in the gitcommitDiff part.
  2. ignore any errors in gitcommitDiff, which is not also diffAdded or diffRemoved.

See also issue #3 (local settings) and #5 (filter/callback about what to handle).

Feature request: jump to next trailing white space

I think at least for folks using better-whitespace, the only place where the code would actually contain trailing whitespace (and be highlighted) is the lines that they are currently working on, so I figured it could be nice if there's a command that would allow one to quickly jump to highlighted whitespace in normal mode using :GoToNextTrailingWhitespace, that way one can quickly jump to trailing whitespaces in his code, which is exactly he's bee working on.

demo

step 1

def func1():
    return 23

def func2():
    # I'm just going to write a = func1()
    # but I decide that there's something wrong with func1
    # so I'm going to go back and fix func1 before I finish this line
    # while leaving the following line a highlighted whitespace
    a =โ—ผ๏ธŽ

step 2

def func1():
    # I now navigate to func1 to fix what's wrong
    # and note that func1 may be actually so far away that 
    # pressing `ctrl o` cannot take me back to func2
    return 42
    # now that func1 is fixed, I can use `:GoToNextTrailingWhitespace` to quickly jump to func2 (rather than pressing `ctrl o` for so many times
    # and continue to work with variable `a`


def func2():
    a =โ—ผ๏ธŽ

Improvements from my vimrc

Thanks for this plugin, which is similar to what I am using myself.

I will provide a pull request for this.

For reference, here it is:

" Trailing whitespace highlighting {{{2
" Map to toogle EOLWS syntax highlighting
  noremap <silent> <leader>se :let g:MyAuGroupEOLWSactive = (synIDattr(synIDtrans(hlID("EOLWS")), "bg", "cterm") == -1)<cr>
        \:call MyAuGroupEOLWS(mode())<cr>
  let g:MyAuGroupEOLWSactive = 0
  function! MyAuGroupEOLWS(mode)
    if g:MyAuGroupEOLWSactive && &buftype == ''
      hi EOLWS ctermbg=red guibg=red
      syn clear EOLWS
      " match whitespace not preceded by a backslash
      if a:mode == "i"
        syn match EOLWS excludenl /[\\]\@<!\s\+\%#\@!$/ containedin=ALL
      else
        syn match EOLWS excludenl /[\\]\@<!\s\+$\| \+\ze\t/ containedin=ALLBUT,gitcommitDiff |
      endif
    else
      syn clear EOLWS
      hi clear EOLWS
    endif
  endfunction
  augroup vimrcExEOLWS
    au!
    " highlight EOLWS ctermbg=red guibg=red
    " based on solarizedTrailingSpace
    highlight EOLWS term=underline cterm=underline ctermfg=1
    au InsertEnter * call MyAuGroupEOLWS("i")
    " highlight trailing whitespace, space before tab and tab not at the
    " beginning of the line (except in comments), only for normal buffers:
    au InsertLeave,BufWinEnter * call MyAuGroupEOLWS("n")
    " fails with gitcommit: filetype | syn match EOLWS excludenl /[^\t]\zs\t\+/ containedin=ALLBUT,gitcommitComment

    " IDEA: add this for Python (via python_highlight_all?!):
    " au FileType python
    " \ if g:MyAuGroupEOLWSactive |
    " \ syn match EOLWS excludenl /^\t\+/ containedin=ALL |
    " \ endif
  augroup END "}}}

(via https://github.com/blueyed/dotfiles/blob/master/vimrc#L701)

Unwanted highlighting while on insert mode

Sometimes, and I'm trying to understand when and how, the plugin starts highlighting end-of-line whitespace while on insert mode.
For example, if "" is the white space, then while on insert mode, I get a highlight of the last space on the following --> "I'm_writing_this_line".

The process would be (always while on insert mode):
I'm_writing --> no highlighting
I'm_writing_ --> highlights the last white space
I'm_writing_th --> no highlighting

This is pretty annoying because there is a red highlight moving everytime one presses the space bar.

I'm trying to reproduce the problem but can't figure it out what makes it happen.
Closing and open vim solves it.

Add the option to specify a filetypes blacklist

It would be cool if one could specify a filetypes blacklist, to disable whitespace highlighting in buffers of specific filetype. This is actually very annoying when I summon the unite to open files (a la Ctrl-P) because I end up having a file list that is mostly red...

Feature request: add an option to remove empty lines at the end of files.

Hey,
First of all thank you for making this plugin. I found it very helpful.

I used emacs before and recently moved to vim. In emacs, default whitespace behavior was to remove empty spaces at the end of each line and remove empty lines at the end of files. (empty lines at the end of files considered a lint error in most languages anyway.) With this plugin, I realized that it does a great job removing whitespace but it does not remove empty lines at the end of files.

I think it would be a good addition to this library to have empty line removal as well.

Toggling acts globally, but `:match` is local to windows

:DisableWhitespace leaves the matches in other windows around, from :echo getmatches():

{'group': 'ExtraWhitespace', 'pattern': '\s\+$', 'priority': 10, 'id': 1}

TEST CASE:

  1. vim -c 'EnableWhitespace' -c 'norm ifoo ' -c 'new' -c 'DisableWhitespace'

After this, the trailing space in the first window is still highlighted.

This is related to issue #3 (local settings per buffer/window).

Whitespace shown while in insert mode editing golang

Not sure what's causing this for me, but whitespace is being highlighted while insert mode, causing an annoying highlight while I'm editing a line. Strangely, I've been using this plugin for months and haven't seen it arise with any other language.

Any tips on how to fix this?

Should only handle regular files (&buftype == '')

With a &buftype like 'nofile', whitespace errors should not get highlighted (especially with (some of?) the Unite buffers, which appear to have trailing space to the window border).

The same is true for Vim help files etc.

[Clarification] colorscheme in the screenshot

Hey, thanks for this plugin.
It would be great if you could also link the colorscheme and configuration of the vim setup you show in the screenshot. i am specifically interested in the colorization of the different kinds of whitespaces.

Thanks!

Hide visualization of tabs before the line

There's a lot of source codes that uses tabs before the sentence, most of the times we are not authorized to rewrite the source files "as you think that is better", so it becomes annoying to visualize them

I have read the docs but i don't see any option for disable these ones (and only show the trailing ones), is it possible to do it? Can you add this option?

Thank you

Local settings per buffer / window

It would be useful to have a command, which toggles the highlighting.

This woulds basically change the global and trigger the autocmd setup/deletion.

It might be useful to have buffer and window local setting, so that it could be toggled per buffer or window or both.

Support for escaped whitespace?!

I am not sure if this is actually that useful, but escaped whitespace (\) at the end of a line should not get highlighted.

A use case might be a config file, where you have a space at the end of a config setting, which is not quoted, e.g.

mail_subject_prefix=Foo:\ 

On the other hand, with shell scripts, it would typically be an error to have an "escaped" space at the end, when you really want to escape the line break.

With 'syn match' it could be handled using [\\]\@<!.

Here is a part of the necessary patch:

diff --git a/plugin/better-whitespace.vim b/plugin/better-whitespace.vim
index c539162..9bdfd25 100644
--- a/plugin/better-whitespace.vim
+++ b/plugin/better-whitespace.vim
@@ -175,11 +175,11 @@ function! <SID>RunAutoCommands()
                 " Clear whitespace highlighting when leaving buffer
                 autocmd BufWinLeave * call clearmatches()
             else
-                " Highlight extraneous whitespace at the end of lines, but not the
-                " current line
+                " Highlight extraneous (un-escaped) whitespace at the end of
+                " lines, but not the current line.
                 syn clear ExtraWhitespace | syn match ExtraWhitespace excludenl /\s\+$/
-                autocmd InsertEnter * syn clear ExtraWhitespace | syn match ExtraWhitespace excludenl /\s\+\%#\@!$/ containedin=ALL
-                autocmd InsertLeave,BufReadPost * syn clear ExtraWhitespace | syn match ExtraWhitespace excludenl /\s\+$/ containedin=ALL
+                autocmd InsertEnter * syn clear ExtraWhitespace | syn match ExtraWhitespace excludenl /[\\]\@<!\s\+\%#\@!$/ containedin=ALL
+                autocmd InsertLeave,BufReadPost * syn clear ExtraWhitespace | syn match ExtraWhitespace excludenl /[\\]\@<!\s\+$/ containedin=ALL
             endif
         endif

Feel free to reject this, I am not really convinced myself.. :)

Significant slowdown

Hi,

(at least) on my ARMv7-Platform I realize a significant slowdown when I enable the plugin.

I go with the default setting, and have in addition

autocmd BufWritePre * StripWhitespace
let g:better_whitespace_filetypes_blacklist=['markdown', 'unite', 'qf', 'help']

Is this problem known?

With kind regards,
Daniel

Is it possible to start with whitespace highlighting disabled?

I tried to load the plugin like this:

Plug 'ntpeters/vim-better-whitespace'
    nnoremap <leader>w :ToggleWhitespace<cr>
    let g:better_whitespace_enabled = 0

With the idea to start with the plugin disabled and be able to start it on request, but it seems not to work. Any hint?

Can not execute command

Windows 7 64bit, vim 7.4, has python2.
While white space highlight works fine,
alt text
when I execute commands, it complains:

E116: Invalid arguments for function <SNR>125_ToggleWhitespace
E116: Invalid arguments for function <SNR>125_StripWhitespace

And in mingw64's vim command execution works fine.
I used plug.vim to install this plugin, anything I might do to get it working?
Thanks!

buftype=nofile still being hightlighted

I have a preview buffer open, which has some whitespace issues. I think bf6d1ec is supposed to skip highlighting in this buffer, but I still see it:

image

In the screenshot above, the [Scratch][-][Preview] buffer is the active one, and I have just executed set buftype? in that buffer.

White spaces are not visible

Hi guys,

This plugin just does not color my whitespaces.
Do I have some "bad" plugin that conflicts with
"vim-better-whitespace"?

This is my .vimrc

set nocompatible              " be iMproved, required
filetype off                  " required

" set the runtime path to include Vundle and initialize
set rtp+=~/.vim/bundle/Vundle.vim
call vundle#begin()
" alternatively, pass a path where Vundle should install plugins
"call vundle#begin('~/some/path/here')

" let Vundle manage Vundle, required
Plugin 'VundleVim/Vundle.vim'

Plugin 'tpope/vim-fugitive'
Plugin 'tpope/vim-surround'
Plugin 'tpope/vim-sleuth'
Plugin 'tpope/vim-sensible'
Plugin 'tpope/vim-obsession'
Plugin 'tpope/vim-flagship'
Plugin 'chazy/cscope_maps'
Plugin 'vim-scripts/ack.vim'
Plugin 'scrooloose/nerdtree'
Plugin 'scrooloose/nerdcommenter'
Plugin 'fatih/vim-go'
Plugin 'rogpeppe/godef'
Plugin 'nsf/gocode'
Plugin 'vim-scripts/Printer-Dialog'
Plugin 'vim-scripts/vim-auto-save'
Plugin 'jiangmiao/auto-pairs'
Plugin 'drmikehenry/vim-fontsize'
Plugin 'junegunn/fzf'
Plugin 'junegunn/fzf.vim'
Plugin 'ntpeters/vim-better-whitespace'
Plugin 'majutsushi/tagbar'
Plugin 'scrooloose/syntastic'
Plugin 'will133/vim-dirdiff'

Plugin 'ap/vim-css-color'
Plugin 'mattn/emmet-vim'
Plugin 'matchit.zip'

" Plugin 'jeetsukumaran/vim-buffergator'

" plugin from http://vim-scripts.org/vim/scripts.html
" Plugin 'L9'

" Plugin 'git://git.wincent.com/command-t.git'
" Plugin 'wincent/command-t'

" git repos on your local machine (i.e. when working on your own plugin)
" Plugin 'file:///home/gmarik/path/to/plugin'

" The sparkup vim script is in a subdirectory of this repo called vim.
" Pass the path to set the runtimepath properly.
" Plugin 'rstacruz/sparkup', {'rtp': 'vim/'}

" Install L9 and avoid a Naming conflict if you've already installed a
" different version somewhere else.
" Plugin 'ascenator/L9', {'name': 'newL9'}

" All of your Plugins must be added before the following line
call vundle#end()            " required
filetype plugin indent on    " required
" To ignore plugin indent changes, instead use:
"filetype plugin on
"
" Brief help
" :PluginList       - lists configured plugins
" :PluginInstall    - installs plugins; append `!` to update or just :PluginUpdate
" :PluginSearch foo - searches for foo; append `!` to refresh local cache
" :PluginClean      - confirms removal of unused plugins; append `!` to auto-approve removal
"
" see :h vundle for more details or wiki for FAQ
" Put your non-Plugin stuff after this line

""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" Sets how many lines of history VIM has to remember
set history=700

" Set to auto read when a file is changed from the outside
set autoread

" With a map leader it's possible to do extra key combinations
" like <leader>w saves the current file
let mapleader = ","
let g:mapleader = ","

" Fast saving
nmap <leader>w :w!<cr>
nmap <leader>c :copen<cr>

" Set 7 lines to the curors - when moving vertical..
set so=2

set wildmenu "Turn on WiLd menu

set ruler "Always show current position

set cmdheight=1 "The commandbar height

set hid "Change buffer - without saving

" Set backspace config
set backspace=eol,start,indent
set whichwrap+=<,>,h,l

set ignorecase "Ignore case when searching
set smartcase

set hlsearch "Highlight search things

set incsearch "Make search act like search in modern browsers

set magic "Set magic on, for regular expressions

set showmatch "Show matching bracets when text indicator is over them
set mat=2 "How many tenths of a second to blink

" No sound on errors
set noerrorbells
set novisualbell
set t_vb=
set tm=500

syntax enable "Enable syntax hl

set encoding=utf8
try
    lang en_US
catch
endtry

set ffs=unix,dos,mac "Default file types

" Turn backup off, since most stuff is in SVN, git anyway...
set nobackup
set nowb
set noswapfile

"Persistent undo
set undodir=~/.vim_runtime/undodir
set undofile

set noexpandtab
set shiftwidth=8
set tabstop=8
set smarttab

set lbr
set tw=500

set ai "Auto indent
set si "Smart indet
set nowrap "Wrap lines

" Close the current buffer
map <leader>bd :bd<cr>

" Close all the buffers
map <leader>ba :1,300 bd!<cr>

" Use the arrows to something usefull
" map <right> :tabn<cr>
" map <left> :tabp<cr>

" Tab configuration
" map <leader>tn :tabnew<cr>
" map <leader>te :tabedit
" map <leader>tc :tabclose<cr>
" map <leader>tm :tabmove

" When pressing <leader>cd switch to the directory of the open buffer
map <leader>cd :cd %:p:h<cr>

" Always hide the statusline
set laststatus=2

" Remove the Windows ^M - when the encodings gets messed up
noremap <Leader>m mmHmt:%s/<C-V><cr>//ge<cr>'tzt'm

set listchars=tab:>-
set nolist

" highlight word on double click
" http://stackoverflow.com/questions/6876850/how-to-highlight-all-occurrences-of-a-word-in-vim-on-double-clicking
" map <2-LeftMouse> #*
" imap <2-LeftMouse> <c-o>*

" https://stackoverflow.com/questions/6876850/how-to-highlight-all-occurrences-of-a-word-in-vim-on-double-clicking
nnoremap <silent> <2-LeftMouse> :let @/='\V\<'.escape(expand('<cword>'), '\').'\>'<cr>:set hls<cr>
noremap <LeftMouse> <LeftMouse> :let @/='\V\<'.escape(expand('<cword>'), '\').'\>'<cr>:set hls<cr>

map <F9> :set list!<CR>

set printoptions=paper:A4

set number

set mouse=a
nmap <leader>va :set mouse=a<cr>
nmap <leader>vv :set mouse=v<cr>

nnoremap <silent> <Esc><Esc> :qa<CR>
nnoremap <silent> <Esc><Esc><Esc> :qa!<CR>

set guifont=Ubuntu\ Mono\ 15
set guioptions+=b
color default

set linespace=5
set nospell

map <C-n> :NERDTreeToggle<CR>
" NERDTress File highlighting
function! NERDTreeHighlightFile(extension, fg, bg, guifg, guibg)
 exec 'autocmd filetype nerdtree highlight ' . a:extension .' ctermbg='. a:bg .' ctermfg='. a:fg .' guibg='. a:guibg .' guifg='. a:guifg
 exec 'autocmd filetype nerdtree syn match ' . a:extension .' #^\s\+.*'. a:extension .'$#'
endfunction

call NERDTreeHighlightFile('jade', 'green', 'none', 'green', '#151515')
call NERDTreeHighlightFile('ini', 'yellow', 'none', 'yellow', '#151515')
call NERDTreeHighlightFile('md', 'blue', 'none', '#3366FF', '#151515')
call NERDTreeHighlightFile('yml', 'yellow', 'none', 'yellow', '#151515')
call NERDTreeHighlightFile('config', 'yellow', 'none', 'yellow', '#151515')
call NERDTreeHighlightFile('conf', 'yellow', 'none', 'yellow', '#151515')
call NERDTreeHighlightFile('json', 'yellow', 'none', 'yellow', '#151515')
call NERDTreeHighlightFile('html', 'yellow', 'none', 'yellow', '#151515')
call NERDTreeHighlightFile('styl', 'cyan', 'none', 'cyan', '#151515')
call NERDTreeHighlightFile('css', 'cyan', 'none', 'cyan', '#151515')
call NERDTreeHighlightFile('coffee', 'Red', 'none', 'red', '#151515')
call NERDTreeHighlightFile('js', 'Red', 'none', '#ffa500', '#151515')
call NERDTreeHighlightFile('php', 'Magenta', 'none', '#ff00ff', '#151515')

set colorcolumn=80
highlight ColorColumn ctermbg=darkgray

"Here are some settings for diff mode, the colors are troublesome.
if &diff
    set diffopt=filler,iwhite,icase,context:6
    set guifont=Ubuntu\ Mono\ 12
    colorscheme peachpuff
endif

let NERDTreeShowHidden=1

if exists(":Tabularize")
    nmap <leader>a= :Tabularize /=<cr>
    vmap <leader>a= :Tabularize /=<cr>
    nmap <leader>a: :Tabularize /:\zs<cr>
    vmap <leader>a: :Tabularize /:\zs<cr>
endif

" https://gist.github.com/tpope/287147
" tpope/cucumbertables.vim
" http://vimcasts.org/episodes/aligning-text-with-tabular-vim/
inoremap <silent> <Bar>   <Bar><Esc>:call <SID>align()<CR>a

function! s:align()
  let p = '^\s*|\s.*\s|\s*$'
  if exists(':Tabularize') && getline('.') =~# '^\s*|' && (getline(line('.')-1) =~# p || getline(line('.')+1) =~# p)
    let column = strlen(substitute(getline('.')[0:col('.')],'[^|]','','g'))
    let position = strlen(matchstr(getline('.')[0:col('.')],'.*|\s*\zs.*'))
    Tabularize/|/l1
    normal! 0
    call search(repeat('[^|]*|',column).'\s\{-\}'.repeat('.',position),'ce',line('.'))
  endif
endfunction

" https://github.com/vim-scripts/vim-auto-save
let g:auto_save = 1
let g:auto_save_no_updatetime = 1
let g:auto_save_silent = 0
let g:auto_save_in_insert_mode = 0
au FocusLost * :wa
set autowriteall

set cursorline   " highlight current line
" set cursorcolumn " highlight current column

" autocmd CursorMoved * exe printf('match IncSearch /\V\c\<%s\>/', escape(expand('<cword>'), '/\'))
" autocmd CursorHold * exe printf('match IncSearch /\V\c\<%s\>/', escape(expand('<cword>'), '/\'))
set updatetime=1000
" 'ignorecase' does not apply, use |/\c| in the pattern to
" ignore case.  Otherwise case is not ignored.

" FZF keys
map <leader>f :Files .<CR>
map <leader>b :Buffers<CR>

nmap <leader>g :Ack <c-r>=expand("<cword>")<cr><CR>
nmap <leader>a :Ag <c-r>=expand("<cword>")<cr><CR>

nmap <F8> :TagbarToggle<CR>

nmap <F6> :set wrap!<cr>

let g:tagbar_type_cpp = {
    \ 'kinds' : [
        \ 'f:functions'
    \ ]
\ }

" http://vim.wikia.com/wiki/Saving_a_file
nmap <c-s> :w<CR>
vmap <c-s> <Esc><c-s>gv
imap <c-s> <Esc><c-s>

Thanks!

Highlight Color is not working for some reason

If i add 'highlight ExtraWhitespace ctermbg=red' to my vimrc, the plugin is not working at all. but if leave my .vimrc untouched, it works perfectly with red highlighting.

I thought maybe my other configuration was overriding the changes, so put that line at bottom of my vimrc , still no luck. Can you help me?

I think it is my problem, but i can not figure it out. thank you!

Blacklist doesn't work?

I'm having trouble getting the blacklist feature to work.
The only option I have added to my .vimrc is:

autocmd BufEnter * EnableStripWhitespaceOnSave

As expected, for most files trailing whitespaces are removed on save, without me needing to turn on the feature. However, what is unexpected is that this is also the case for Markdown files, which are supposed to be in the default blacklist.

I have tried editing the blacklist by adding

let g:better_whitespace_filetypes_blacklist=['markdown']

but I still see the same behavior.

After loading a Markdown file, I can turn off the whitespace striping with

ToggleStripWhitespaceOnSave

Am I interpreting the blacklist incorrectly? Or is there an issue with it? My Vim version is 8.0.710.

Thanks for the great plugin!

Highlighting of mixed indent (tabs after spaces)

Mixed indent (tabs after spaces) can be matched using \+\ze\t.

It would be nice to have a separate syntax group for it (because it's not "extra" whitespace), and a way to enable/disable it via configuration.

Feature request: adding an operator for `:StripWhitespace`

Hi,
thanks for the great plugin! What do you think about adding an operator that would work with :StripWhitespace command?

The end result would be something like this:

  • d<space>ip - would "StripWhitespace" for 'inner paragraph'
  • d<space>G - would strip whitespace till the end of the file
  • etc for all other vim motions

The d<space> operator would be nice because it's a mnemonic for "delete space" and fits nicely in vim's vocabulary.

This shouldn't be too hard to make and I'd gladly do it - if you think it's a feature worth accepting into the repo?

Thanks

'autocmd BufWritePre * StripWhitespace' breaks 'ToggleStripWhitespaceOnSave'

autocmd BufWritePre * StripWhitespace doesn't set g:strip_whitespace_on_save to 1. This breaks ToggleStripWhitespaceOnSave because it'll be the default (0).

How to reproduce

  1. Put autocmd BufWritePre * StripWhitespace in your .vimrc or .config/nvim/init.vim.
  2. Edit a file that isn't in the black list.
  3. :ToggleStripWhitespaceOnSave.
  4. Add trailing whitespace.
  5. Save (:w)

What happened

The whitespace was stripped on save.

What I expected

The whitespace should not be stripped because I toggled it from the default (enabled) state.

Unoptimized <SID>SetupAutoCommands() calls

I noticed <SID>SetupAutoCommands() gets called on vim startup at least four times in a row. Every other buffer switch causes it to be called another two times sequentially instead of a single call. Is that really necessary?

Confusing README regarding filetypes blacklisting

The following part of the README is a bit confusing

*  To enable/disable stripping of extra whitespace on file save, call:
    `:ToggleStripWhitespaceOnSave`
    This will strip all trailing whitespace everytime you save the file for all file types.
    *  If you want this behaviour by default for all filetypes, add the following to your `~/.vimrc`:
        `autocmd BufWritePre * StripWhitespace`
        For exceptions of all see `g:better_whitespace_filetypes_blacklist`.

I wanted to have the plugin strips all whitespaces on save, except for markdown files
so I thought that adding both
autocmd BufWritePre * StripWhitespace
and
let g:better_whitespace_filetypes_blacklist=['markdown']
would do the trick

Unfortunately this better_whitespace_filetypes_blacklist variable is only affecting the highlighting.
It's only used in https://github.com/ntpeters/vim-better-whitespace/blob/master/plugin/better-whitespace.vim#L172-L174 after initialization

It's actually fine to have this variable only affects highlighting
I want the highlighting of whitespaces in markdown too, but I just don't want them to be removed on saving

I only think the documentation should be more clear there

I ended up adding the following in my vimrc

" Don't strip whitespaces for certain filetypes
" the plugin better_whitespace_filetypes_blacklist variable
" only affects the usage of the highlighting
fun! FiletypeFilteredStripWhitespace()
  if &ft =~ 'markdown'
    return
  endif
  StripWhitespace
endfun

" Strip all whitespaces on saving based on filetype
autocmd BufWritePre * call FiletypeFilteredStripWhitespace()

whitespace still there?

after running :StripWhitespace and :ToggleWhitespace, there seems to be whitespace remaining that's also not being highlighted. i moved the setting of my highlight color in my .vimrc to the end of the file, just in case.

screen shot 2016-04-20 at 3 02 37 pm

enable ToggleStripWhitespaceOnSave in .vimrc

I would like to enable stripping of whitespace for all file types by default in my .vimrc, and putting ToggleStripWhitespaceOnSave in a line after Plugin 'ntpeters/vim-better-whitespace' does not work.

plugin overides :E command

After installing this plugin, executing the :E command (to browse the current directory), throws this error:

E464: Ambiguous use of user-defined command

That'd be great to fix. Thanks.

Whitespaces highlighted in unite buffers even when unite filetype is blacklisted

The Problem

From commit 8f488a4, whitespaces are highlighted in unite buffers. They were not before.

From what I read in the readme file, unite filetype shoud be blacklisted by default:

This replaces the filetypes from the default list of blacklisted filetypes. The default types that are blacklisted are:
['diff', 'gitcommit', 'unite', 'qf', 'help', 'markdown']

Vim version

VIM - Vi IMproved 7.4
Included patches: 1-1689
Extra patches: 8.0.0056

Minimal .vimrc

call plug#begin('~/.vim/plugged')
Plug 'Shougo/unite.vim'
Plug 'ntpeters/vim-better-whitespace'
call plug#end()

Screenshot before commit 8f488a4, using command :Unite

2018-02-27-131351_1404x739_scrot

Screenshot after commit 8f488a4, using command :Unite

2018-02-27-131427_1406x738_scrot

Manual blacklisting in .vimrc

I also tried just in case to blacklist unite filetype in the .vimrc (even if it should already be blacklisted by default) with:

let g:better_whitespace_filetypes_blacklist=['unite']

but it did not change anything.

If you need me to provide more information, do not hesitate to ask.

Extra whitespace not highlighted after `:split`

Hi,
this could be something related to my setup, but here's how I'm able to reproduce it:

  • Open a file that contains extra whitespace ($ vim foo.txt). All is good, extra whitespace is highlighted.
  • Invoke :split command (without arguments) to split the screen. A new buffer showing the same file foo.txt file will not have extra whitespace highlighted.

I'm running vim 7.4 with patch 891.
Can you reproduce this?

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.