Giter VIP home page Giter VIP logo

git-blame.nvim's Introduction

git-blame.nvim

A git blame plugin for Neovim written in Lua

Table of Contents

Installation

Using vim-plug

Plug 'f-person/git-blame.nvim'

Requirements

  • Neovim >= 0.5.0
  • git

The Why

There were several Vim plugins providing this functionality, but most of them were written in VimScript and didn't work well for me. coc-git also had option for showing blame info, it worked really well for me, I like it. However, recently I decided to switch to Neovim's builtin LSP instead of using CoC and having something running on Node.js just for git blame was not the best thing.

Demo

demo

Configuration

Using Lua

You can use setup to configure the plugin in Lua. This is the recommended way if you're using Lua for your configs. Read the documentation below to learn more about specific options (NOTE: options in the setup function don't have the gitblame_ prefix).

NOTE: you don't have to call setup if you don't want to customize the default behavior.

require('gitblame').setup {
     --Note how the `gitblame_` prefix is omitted in `setup`
    enabled = false,
}

Using lazy.nvim

return {
    "f-person/git-blame.nvim",
    -- load the plugin at startup
    event = "VeryLazy",
    -- Because of the keys part, you will be lazy loading this plugin.
    -- The plugin wil only load once one of the keys is used.
    -- If you want to load the plugin at startup, add something like event = "VeryLazy",
    -- or lazy = false. One of both options will work.
    opts = {
        -- your configuration comes here
        -- for example
        enabled = true,  -- if you want to enable the plugin
        message_template = " <summary> • <date> • <author> • <<sha>>", -- template for the blame message, check the Message template section for more options
        date_format = "%m-%d-%Y %H:%M:%S", -- template for the date, check Date format section for more options
        virtual_text_column = 1,  -- virtual text start column, check Start virtual text at column section for more options
    },
 
}

Enabled

Enables git-blame.nvim on Neovim startup. You can toggle git blame messages on/off with the :GitBlameToggle command.

Default: 1

let g:gitblame_enabled = 0

Message template

The template for the blame message that will be shown.

Default: ' <author> • <date> • <summary>'

Available options: <author>, <committer>, <date>, <committer-date>, <summary>, <sha>

let g:gitblame_message_template = '<summary> • <date> • <author>'

Date format

The format of the date fields.

Default: %c

Available options:

%r  relative date (e.g., 3 days ago)
%a  abbreviated weekday name (e.g., Wed)
%A  full weekday name (e.g., Wednesday)
%b  abbreviated month name (e.g., Sep)
%B  full month name (e.g., September)
%c  date and time (e.g., 09/16/98 23:48:10)
%d  day of the month (16) [01-31]
%H  hour, using a 24-hour clock (23) [00-23]
%I  hour, using a 12-hour clock (11) [01-12]
%M  minute (48) [00-59]
%m  month (09) [01-12]
%p  either "am" or "pm" (pm)
%S  second (10) [00-61]
%w  weekday (3) [0-6 = Sunday-Saturday]
%x  date (e.g., 09/16/98)
%X  time (e.g., 23:48:10)
%Y  full year (1998)
%y  two-digit year (98) [00-99]
%%  the character `%´
let g:gitblame_date_format = '%r'

Message when not committed yet

The blame message that will be shown when the current modification hasn't been committed yet.

Supports the same template options as g:gitblame_message_template.

Default: ' Not Committed Yet'

let g:gitblame_message_when_not_committed = 'Oh please, commit this !'

Highlight group

The highlight group for virtual text.

Default: Comment

let g:gitblame_highlight_group = "Question"

nvim_buf_set_extmark optional parameters

nvim_buf_set_extmark is the function used for setting the virtual text. You can view an up-to-date full list of options in the Neovim documentation.

Warning: overwriting id and virt_text will break the plugin behavior.

let g:gitblame_set_extmark_options = {
    \ 'priority': 7,
    \ }

Virtual text enabled

If the blame message should be displayed as virtual text.

You may want to disable this if you display the blame message in statusline.

Default: 1

let g:gitblame_display_virtual_text = 0

Ignore by Filetype

A list of filetypes for which gitblame information will not be displayed.

Default: []

let g:gitblame_ignored_filetypes = ['lua', 'c']

Visual delay for displaying the blame info

The delay in milliseconds after which the blame info will be displayed.

Note that this doesn't affect the performance of the plugin.

Default: 250

let g:gitblame_delay = 1000 " 1 second

Start virtual text at column

Have the blame message start at a given column instead of EOL. If the current line is longer than the specified column value the blame message will default to being displayed at EOL.

Default: v:null

let g:gitblame_virtual_text_column = 80

Better Performance

If you are experiencing poor performance (e.g. in particularly large projects) you can use CursorHold and CursorHoldI instead of the default CursorMoved and CursorMovedI autocommands to limit the frequency of events being run.

g:gitblame_schedule_event is used for scheduling events. See CursorMoved and CursorHold.

Default: CursorMoved

options: CursorMoved|CursorHold

g:gitblame_clear_event is used for clearing virtual text. See CursorMovedI and CursorHoldI.

Default: CursorMovedI

options: CursorMovedI|CursorHoldI

Use blame commit file URLs

By default the commands GitBlameOpenFileURL and GitBlameCopyFileURL open the current file at latest branch commit. If you would like to open these files at the latest blame commit (in other words, the commit marked by the blame), set this to true. For ranges, the blame selected will be the most recent blame from the range.

Default: false

vim.g.gitblame_use_blame_commit_file_urls = true

Configuring the clipboard register

By default the :GitBlameCopySHA, :GitBlameCopyFileURL and :GitBlameCopyCommitURL commands use the + register. Set this value if you would like to use a different register (such as *).

Default: +

let g:gitblame_clipboard_register = "*"

Commands

Open the commit URL in browser

:GitBlameOpenCommitURL opens the commit URL of commit under the cursor. Tested to work with GitHub and GitLab.

Enable/Disable git blame messages

  • :GitBlameToggle toggles git blame on/off,
  • :GitBlameEnable enables git blame messages,
  • :GitBlameDisable disables git blame messages.

Copy SHA hash

:GitBlameCopySHA copies the SHA hash of current line's commit into the system's clipboard.

Copy Commit URL

:GitBlameCopyCommitURL copies the commit URL of current line's commit into the system clipboard.

Open file URL in browser

:GitBlameOpenFileURL opens the file in the default browser.

The URL is scoped to the latest commit on the current branch and has a mark of the current line. (same is true for GitBlameCopyFileURL)

Copy file URL

:GitBlameCopyFileURL copies the file URL into the system clipboard.

Statusline integration

The plugin provides you with two functions which you can incorporate into your statusline of choice:

-- Lua
local git_blame = require('gitblame')

git_blame.is_blame_text_available() -- Returns a boolean value indicating whether blame message is available
git_blame.get_current_blame_text() --  Returns a string with blame message

Here is an example of integrating with lualine.nvim:

-- Lua
vim.g.gitblame_display_virtual_text = 0 -- Disable virtual text
local git_blame = require('gitblame')

require('lualine').setup({
    sections = {
            lualine_c = {
                { git_blame.get_current_blame_text, cond = git_blame.is_blame_text_available }
            }
    }
})

Changing the timeago-format language

The plugin uses lua-timeago for displaying commit dates in a relative time ago format. Take a look at the languages directory for a list of pre-installed languages. If you wish to use a language that's not built into lua-timeago, you can do that too; please consider opening a PR to lua-timeago if you choose to do so :)

To set a language, call the set_language method:

-- Lua
require('lua-timeago').set_language(require('lua-timeago/languages/hy'))
" Vimscript
:lua require('lua-timeago').set_language(require('lua-timeago/languages/hy'))

Thanks To

Contributors <3

Special kudos to Sam Bossley for maintaining the plugin! <3

Made with contrib.rocks.

Support

If you enjoy the plugin and want to support what I do

Buy Me A Coffee

git-blame.nvim's People

Contributors

aarondill avatar acksld avatar amaanq avatar anatolelucet avatar bodneyc avatar bossley9 avatar boundlesscalm avatar bsteffaniak avatar davidgao7 avatar dhananjaylatkar avatar eriedaberrie avatar f-person avatar filipkrayem avatar grnnja avatar gyl30 avatar ibotty avatar isaacwengler avatar jinzhongjia avatar kiddos avatar kskarthik avatar laurazard avatar mateuscelio avatar mike-ap-tc avatar miversen33 avatar moliva avatar pagliacii avatar sebastian-larsson 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

git-blame.nvim's Issues

Align virtual text

This is a solid plugin. Very fast.

Small request: would it be possible to add an option have the virtual text right justify itself? Currently the text appears immediately following the line you are on, with a single space separating the physical EOL and the beginning of the virtual text. It would be nice if there were a way to adjust that.

Plugin slows down file opening

With this plugin enabled, I notice a delay when opening files in a git repo that contains 19k+ files. Less than a second, but noticeable. In smaller repos, the delay is not that obvious.

Is there any aysnc trick we can use to make this delay go away?

I'm on archlinux, NVIM v0.5.0-844-g8c4648421

GitBlameOpenCommitURL doesn't work

First off, awesome plugin! It's very useful and responsive.

However I can't seem to work out why the openCommitURL command won't work.
I'm on a line that's having its commit blamed normally. I then run the command, and nothing happens. Is it supposed to open a browser tab to the url? Because it's not happening on my end.

Example for using lua based configs?

Hi F-person,
I really like your plugin, it makes checking git-blame lot better when it's easy to toggle it on and off.
But the problem well not exactly the problem, but can you give an example configuration way for setting this in more lua way like
git-blame.lua file?

For now I am setting it like this.

vim.cmd [[let g:gitblame_enabled = 0]]
vim.cmd [[let g:gitblame_message_template = ' <committer>•<date>•<summary>']]

Attempt to index field 'g' (a nil value) in init.lua

When I open up nvim after having installed the plugin, I get this error:

Error detected while processing function GitBlameInit:
line    5:
E5105: Error while calling lua chunk: ~/.vim/plugged/git-blame.nvim/lua/gitblame/init.lua:21: attempt to index field 'g' (a nil value)
Error detected while processing BufEnter Autocommands for "*":
Error detected while processing CursorMovedI Autocommands for "*":
E5105: Error while calling lua chunk: [string "<VimL compiled string>"]:1: loop or previous error loading module 'gitblame'
Press ENTER or type command to continue

I tried adding let g:gitblame_date_format = '%r' to my init.vim, but that didn't fix the issue. I assume this isn't intended behavior for lacking some value, though.

Virtual text overriding line highlight

It was working fine with neovim stable(0.5). Today I updated to the unstable version (0.6) and my line highlight messed up. I hope you can fix this soon or help me with a workaround pls.
image

Option to show blame in statusLine instead of virtualText

Thanks for this fast plugin!

Could you please add an option to show the blame in the statusLine instead of virtualText?

This is to allow keeping the blame text from interfering with the main code view. For now, I am relying on toggling blame on and off.

Disable in file tree viewer

I browsed the docs and hopefully I didn't miss it, but how do I disable blame in a file tree viewer? Thanks.

Screen Shot 2022-03-25 at 2 24 57 PM

Include support for untracked files

Cheers on the plugin. Blame lines are rapidly showing up, something that git-blame does better than other alternatives.

Would you be interested in adding support to show blame lines for untracked git files as well ? I've seen these being included with another plugin and found it helpful to know that the buffer you're working in is part of a git repository as it would show the changes are uncommited.

Setup function for config?

Sorry if this is a dumb question, I'm still relatively new to nvim etc.

Is it possible to configure the plugin with a setup function instead of using the vim commands? e.g:

require("git-blame").setup {
  message_template = '<author>, <date> | <summary>'
}

All of my other plugins are configured something like this, like I said, I'm relatively new to nvim and also using a distro (astronvim) as a base - but I'm not sure if the above is more of a modern way to configure nvim plugins etc (see telescope, cmp etc).

Thanks again! 💙

Request: Message format

Either allow to customize the message format, or change it so that the most important information (the message) comes first: message - date - author.

Option to show short commit sha

Would it possible to get the short commit sha added to the template options?

Something like this perhaps?

• 6 months ago d61a8ad7 You add hlwm config

several 'git blame' spawned when scroll the cursor at plugin load

If I toggle git-blame and immediately move up and down the line with the cursor, I am experiencing several git blame command spawned by the plugin.
The commands do not ever resolve and the CPU gets used at 100%.
The only solution is to quit nvim.

Any idea why this is happening? I may cook a patch if pointed in the right direction.

feat: blame information displays after a second or two...

Hello! Thanks for making and maintaining an awesome plugin.

My request seems so obvious I feel like I may be missing something obvious.

It would just be nice if the blame virtual text showed after a second or two so that when you're speeding up and down a doc it's not jumping with you the whole way.

I dunno, maybe nobody else wants that ¯_(ツ)_/¯

cheers

Fail to put gitblame in lualine.

Error message:

Error executing lua ...im/autoload/plugged/git-blame.nvim/lua/gitblame/init.lua:260: attempt to index upvalue 'date_for│~
mat' (a nil value)                                                                                                            │~
stack traceback:                                                                                                              │~
        ...im/autoload/plugged/git-blame.nvim/lua/gitblame/init.lua:260: in function 'init'                                   │~
        [string ":lua"]:1: in main chunk

My gitblame.lua config:

local status, git_blame = pcall(require, "gitblame")
if (not status) then return end


-- Disable virtual text
vim.g.gitblame_display_virtual_text = 0

vim.g.gitblame_date_format = '%Y-%m-%d %H:%M:%S'

require('lualine').setup({
  sections = {
    lualine_c = {
      { git_blame.get_current_blame_text, cond = git_blame.is_blame_text_available }
  }
  }
})

Neovim version:

NVIM v0.8.0-dev+374-ge13dcdf16
Build type: RelWithDebInfo
LuaJIT 2.1.0-beta3

OS: Ubuntu22.04 on wsl2


I also tried to comment the vim.g.gitblame_date_format, but the error remains.

Precedence of virtual text

Is there any way to set what displays first in virtual text?
I have a case where there is an LSP diagnostic, but it always appears AFTER the git blame text.
I'd prefer it to be the other way around since an LSP diagnostic is usually more actionable than the git blame text.

Example:
grim_01_11_22-13_33_36

"not committed yet" for all lines?

When I open a file as neovim command line argument, e.g. nvim go.mod in the kubernetes source tree, git-blames shows "not committed yet" for all lines in that buffer.

Usually this happens when:

  1. open files as command line argument of neovim. If I open the same file after I start neovim, the commit message is loaded correctly.
  2. in a large repo

error when moving cursor

I sometimes get an error when moving cursor:

Error detected while processing CursorMoved Autocommands for "*":
E5108: Error executing lua ../git-blame.nvim/lua/gitblame/init.lua:168: bad argument #2 to 'gsub' (string/funcion/table expected)

It doesn't happen every time I move my cursor, just occasionally.

Plugin opens a lot of weird buffers when opening a new file with fzf.vim

Hi,

after updating plugins few commits ago I have issue while working with larger projects with fzf.vim. When I open any file by fzf.vim when git-blame is enabled vim opens for me dozens of weird named buffers (which names regards to git-blame). It happens both on Linux and macOS. I'm running latest NVIM v0.5.0-828-g0a95549d6.

I upload gif demo.

gitblame_issue

With that problem I'm not able to use this plugin but I love it. Problem happens only when I have enabled git-blame.nvim in VimPlug.

Thanks.

Request: commands to enable/disable

I only need to see the blame when I'm working with codebases I don't know very well. It would be nice to be able to turn off the blames when I want.

Needs to be enabled to make the GitBlameCopySHA or GitBlameOpenCommitURL work

I disabled this plugin on startup since I don't want to have clutter:

let g:gitblame_enabled = 0

But when running :GitBlameCopySHA or :GitBlameOpenCommitURL, it will trigger this error and will not work:

Screen Shot 2022-04-27 at 2 40 25 AM

Apparently, I need to enable the plugin first (via :GitBlameEnable or :GitBlameToggle) before I could execute those 2 commands, which is not good UX I think. Ideally, the plugin should be enabled automatically when it's disabled before performing actions such as :GitBlameCopySHA or :GitBlameOpenCommitURL, then revert back to disabled after performing the actions.

I tried this also but it didn't work (same error):

function SampleFunc()
      :GitBlameEnable  " Make sure it's enabled.
      :GitBlameCopySHA
      :GitBlameDisable  " Revert back to disabled.
endfunction
nnoremap <Leader>gbs :call SampleFunc()<CR>

Am I missing something? Or could we have a flag/setting to have this kind of behavior? Thanks :)

feat: blame column

The problem:

  • often times I have long lines and cannot even see the content of the blame anymore, as it is appended to that line and disappearing to the right.
  • I only see the blame of the current line I'm on. If I have a chunk of code it's useful to see at a glance e.g. if the whole thing was committed by the same person
  • due to the blame being appended, it's position jumps around horizontally a lot. I constantly have to readjust where I'm looking at

The solution:

Similar to the signcolumn that gitgutter is using, this plugin could put the blame into a column to the left of the actual code. CLion does it this way. Ofc, it probably is not very useful to throw the whole thing (author, full date, commit headline) in there, but a shortened date (dd-mm-yyyy) + the last name of the author would work well to see things at a glance. Even if adding such a column will result in the line being cut off to the right, I usually don't mind because I care more about seeing who did what at which point in time for all the lines I currently investigate.

Error on specific line

Hi great work btw!
I get this error on random lines from time to time:

 Error executing lua ...config/nvim/plugged/git-blame.nvim/lua/gitblame/init.lua:168: bad argument #2 to 'gsub' (string/function/table expected)

Allow to change highlight group

Thanks for this cool plugin!
It would be pretty cool if you could make the highlight group configurable. I saw that it is linked to Comment for now.

git blame ignores g:gitblame_enabled

i installed gitblame through packer and config it in nvim through vim.g.gitblame_enabled = 0. But it will always show blame message on opening a file.

VIM v0.7.2
Build type: Release
LuaJIT 2.1.0-beta3
Compiled by runner@fv-az164-457

Copying the SHA of the line

Hey Arshak,
Thank for the plugin!
Do you think it is possible somehow to put the SHA to the system clipboard or somewhere where I can take it to another terminal to see the git show etc.? 🤔

Relative date not showing on MacOS

I don't know if this issue is related with MacOS because it was working before with the exact same configuration. The only thing I did was to change my package manager from packer to lazy.nvim. I've tried other date formats that worked, my guess is that it is only related to the relative date.

My git-blame configuration.

vim.g.gitblame_message_template = "      <author>, <date> • <summary>"
vim.g.gitblame_date_format = "%r"
vim.g.gitblame_ignored_filetypes = { "NvimTree", "netrw", "packer" }
vim.g.gitblame_set_extmark_options = {
  hl_mode = "combine",
  priority = 10000,
}

Screenshot of how blame is shown

image

Cursor movement performance

Hey,

I was testing your plugin and when it's on, it feels like the cursor performance is degraded. There is a small flicker for each movement as well as the performance issue. Is this something you have noticed? Are you updating the info synchronously?

Thanks

Breaks when spaces in filepath

Like the title says, the plugin works fine usually but ends up always saying "Not Committed Yet" whenever the filepath has spaces in it. It seems to be a fairly easy fix just by wrapping all the filepaths in vim.fn.shellescape().
(Maybe this is a sign that I should really stop using spaces in my git directory names.)

Template for not committed changes?

Hello,

I'm trying to configure the blame to match what I'm used to seeing in VSCode git lens.

I noticed that their message looks like this:

Screenshot 2023-01-31 at 07 12 21

I tried to replicate this with the following config, but it seems that gitblame_message_when_not_committed doesn't support templates? Is there a different config to use templates for not committed changes?

vim.g.gitblame_message_when_not_committed = "     <author>, <date> • Uncommitted changes"

Thanks!

Invalid Capture Index

Hey everybody,
I suddenly get the following error message:
Fehler beim Ausführen von "CursorMoved Autokommandos für "*"": E5108: Error executing lua .../share/nvim/plugged/git-blame.nvim/lua/gitblame/init.lua:237: invalid capture index stack traceback: [C]: in function 'gsub' .../share/nvim/plugged/git-blame.nvim/lua/gitblame/init.lua:237: in function 'get_blame_text' .../share/nvim/plugged/git-blame.nvim/lua/gitblame/init.lua:302: in function 'show_blame_info' [string ":lua"]:1: in main chunk

After a short exploration, the pattern where this happens, is the strage commit message, which is "Fixed %2f in urls". Maybe there is a need to escape special charackters for those cases.

OS: macOS Ventura 13.1
Version:
NVIM v0.8.1
Build type: Release
LuaJIT 2.1.0-beta3

Virtual text is not cleared if blame disabled in other buffer

Say, a user has two opened buffers representing two different files (let's call them A and B) and g:gitblame_enabled = 0. The user calls GitBlameEnable() in the A buffer, switches to the B buffer. So far so good. Then the user calls GitBlameDisable() in the B buffer and the virtual text clears off. However, the virtual text in the A buffer is not cleared and it won't be cleared even if I close it and open a new one. The only way to clear it is to do the following sequence for the A buffer:

:GitBlameEnable
:GitBlameDisable

[Feature] activate only on keybind

The plugin https://github.com/rhysd/git-messenger.vim is similar to this one, but has two main differences:

  1. It activates on a keybind (default: <leader>gm)
  2. It displays git information in a floating window

Personally, I'm to too interested in having a popup window; however, having git-blame only appear on-demand is the main think keeping me on git-messenger.

I could implement this in the coming week if you're interested.

Performance on big git projects

Thanks for working on the plugin. I like it.

In most cases I don't even bother, plugins works great, no performance impact whatsoever.

Though I noticed on huge projects like this one for example: https://github.com/NixOS/nixpkgs my laptop almost hangs, and I can relate to why.

So my first thought was can it auto-disable itself on huge git project. Maybe another way would be to change the workflow and toggle it manually, which is not really great, as I'm feeling used to it, once I tried it.

What do you think?

Date/Time Formatting

First let me say I love this plugin and it's worked flawlessly for me, thanks!

I've noticed two things about the date/time formatting though:

  1. component parts are not zero padded, e.g. 1.1.2020, 9:8 rather than 01.01.2020, 09:08
  2. this might be just my opinion but I think it's common for devs to prefer the ISO 8601 format for date/time e.g. 2020-01-01

I hacked the date/time formatting locally in order to address these two concerns of mine. I have zero lua experience so please forgive any convention violations.

        formatted_date = info.date.year .. '-'
                            .. string.format("%02d", info.date.month) .. '-'
                            .. string.format("%02d", info.date.day) .. ' '
                            .. string.format("%02d", info.date.hour) .. ':'
                            .. string.format("%02d", info.date.min)

incent-gem: nvim README md — nvim 2020-11-17 10-49-41

I'd be happy to open a PR if this change is of interest.

Incorrect output on last line of file without a line ending

This plugin gives the incorrect output (Not Committed Yet) on the last line of a file that is missing a line ending.

To reproduce find a file without a line end on the final line:

$ rg -l '[^\n]\z'

Open the file, (nvim file) enable the plugin if required (:GitBlameToggle), hit G. The blame line says Not Committed Yet. Quit (:q) and run git blame on the file (git blame file | tail -n 1), line shows commit (assuming you didn't actually open a file with an uncommitted final line)

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.