Giter Club home page Giter Club logo

vim-abolish's Introduction

abolish.vim

I sat on this plugin for 3 years before releasing it, primarily because it's so gosh darn hard to explain. It's three superficially unrelated plugins in one that share a common theme: working with variants of a word.

Abbreviation

I know how to spell "separate". I know how to spell "desperate". My fingers, however, have trouble distinguishing between the two, and I invariably have a 50 percent chance of typing "seperate" or "desparate" each time one of these comes up. At first, I tried abbreviations:

:iabbrev  seperate  separate
:iabbrev desparate desperate

But this falls short at the beginning of a sentence.

:iabbrev  Seperate  Separate
:iabbrev Desparate Desperate

To be really thorough, we need uppercase too!

:iabbrev  SEPERATE  SEPARATE
:iabbrev DESPARATE DESPERATE

Oh, but consider the noun form, and the adverb form!

:iabbrev  seperation  separation
:iabbrev desparation desperation
:iabbrev  seperately  separately
:iabbrev desparately desperately
:iabbrev  Seperation  separation
:iabbrev Desparation Desperation
:iabbrev  Seperately  Separately
:iabbrev Desparately Desperately
:iabbrev  SEPERATION  SEPARATION
:iabbrev DESPARATION DESPERATION
:iabbrev  SEPERATELY  SEPARATELY
:iabbrev DESPARATELY DESPERATELY

Wait, there's also "separates", "separated", "separating", "separations", "separator"...

Abolish.vim provides a simpler way. The following one command produces 48 abbreviations including all of the above.

:Abolish {despa,sepe}rat{e,es,ed,ing,ely,ion,ions,or}  {despe,sepa}rat{}

My current configuration has 25 Abolish commands that create hundreds of corrections my fingers refuse to learn.

Substitution

One time I had an application with a domain model called "facility" that needed to be renamed to "building". So, a simple search and replace, right?

:%s/facility/building/g

Oh, but the case variants!

:%s/Facility/Building/g
:%s/FACILITY/BUILDING/g

Wait, the plural is more than "s" so we need to get that too!

:%s/facilities/buildings/g
:%s/Facilities/Buildings/g
:%s/FACILITIES/BUILDINGS/g

Abolish.vim has your back. One command to do all six, and you can repeat it with & too!

:%Subvert/facilit{y,ies}/building{,s}/g

From a conceptual level, one way to think about how this substitution works is to imagine that in the braces you are declaring the requirements for turning that word from singular to plural. In the facility example, the same base letters in both the singular and plural form of the word are facilit To turn "facility" to a plural word you must change the y to ies so you specify {y,ies} in the braces.

To convert the word "building" from singular to plural, again look at the common letters between the singular and plural forms: building. In this case you do not need to remove any letter from building to turn it into plural form and you need to add an s so the braces should be {,s}.

A few more examples:

Address to Reference

:Subvert/address{,es}/reference{,s}/g

Blog to Post (you can just do this with a regular :s also)

:Subvert/blog{,s}/post{,s}/g

Child to Adult

:Subvert/child{,ren}/adult{,s}/g

Be amazed as it correctly turns the word children into the word adults!

Die to Spinner

:Subvert/di{e,ce}/spinner{,s}/g

You can abbreviate it as :S, and it accepts the full range of flags including things like c (confirm).

There's also a variant for searching and a variant for grepping.

Coercion

Want to turn fooBar into foo_bar? Press crs (coerce to snake_case). MixedCase (crm), camelCase (crc), UPPER_CASE (cru), dash-case (cr-), and dot.case (cr.) are all just 3 keystrokes away.

Installation

Install using your favorite package manager, or use Vim's built-in package support:

mkdir -p ~/.vim/pack/tpope/start
cd ~/.vim/pack/tpope/start
git clone https://tpope.io/vim/abolish.git
vim -u NONE -c "helptags abolish/doc" -c q

Self-Promotion

Like abolish.vim? Follow the repository on GitHub and vote for it on vim.org. And if you're feeling especially charitable, follow tpope on Twitter and GitHub.

License

Copyright (c) Tim Pope. Distributed under the same terms as Vim itself. See :help license.

vim-abolish's People

Contributors

alvarosevilla95 avatar benelan avatar cbartlett avatar cehoffman avatar cenksoykan avatar effctcodes avatar emilyst avatar glts avatar hiberabyss avatar inkarkat avatar machellerogden avatar matteobaglini avatar snapshot avatar svermeulen avatar theleop avatar tommcdo avatar tpope 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  avatar  avatar  avatar  avatar

vim-abolish's Issues

loop through camelcase snakecase etc.

Wouldn't it be nice if you put a loop through these syntaxes? like cl changes snakecase to camelcase, camelcase to mixedcase mixedcase to snakecase..

add option to disable capital case abbreviations

Among the abbreviations created by :Abolish, the abbreviation where all letters are capital case is usually the least used and overrides common acronyms.
For example,

  Abolish -buffer ip in\ particular

creates the abbreviation IP which is a common acronym for Internet Protocol or Intellectual Property.
How about an option to disable the creation of the all capital case abbreviations?

Match inside variable names might not be complete.

Hi Tim,

This is a great plugin.
Though I think ,
Abolish -search -flags=v fooBar
should match all three below:

fooBar
FooBar
foo_bar

However this can be done only with a far more complex search like this:
Abolish -search {f,F}oo{,_}{b,B}ar
Maybe I am missing something, is there an easier way to match the 3 words above?

Thanks

Coerce mode from dash case not working

This is an awesome plugin, and I use the coercions all the time, in particular camel case to snake case and vice versa. Noticed today that when already in dash case (eg. this-is-in-dash-case), the commands to get out of that case don't work. The other way around does work, so I can successfully convert snake or camel case into dash case. Any ideas?

Other coercions still work elsewhere, and :messages gives no indication of an issue.
map cr- indicates n cr Coerce

Thanks to anyone if you can offer some ideas. When naming node.js git repos it would be useful to take the name out of package.json then convert from dash case to title case directly. Atm, i have to do a :s/-/_/g and then now with a working coercion, do a crt into title case.

Am using neovim..

It won't do swaps when <Word> is used

I'm trying to swap Foo with Bar, and Bar with Foo. I also have variables like fooTest and FooBar. I would not like to mutate those.

Therefore :%S /{Foo,Bar}/{Bar,Foo}/g wont quite do. I tried:
%S /<{Test,Foo}>/{Foo,Test}/g %S /<{Test,Foo}>/<{Foo,Test}>/g %S /{<Test>,<Foo>}/{Foo,Test}/g %S /{<Test>,<Foo>}/{<Foo>,<Test>}/g

All without success (nothing happens when <>'s are used). What am I doing wrong?

Extract code to autoload file similar to the recent commit in fugitive

The fugitive commit is tpope/vim-fugitive@5d11ff7

My current startup log lists

...
064.553  001.091  001.091: sourcing ~/.vim/pack/minpac/start/vim-abolish/plugin/abolish.vim
...
073.387  000.323  000.323: sourcing ~/.vim/pack/minpac/start/vim-fugitive/plugin/fugitive.vim
...

I use abolish less often than fugitive but abolish occupies unnecessarily more startup time.

Any chance you would do this extraction as well?

unexpected output if search string is lowercase and file uses snake case

If my document contains:

test_case
Test_Case

and I type:

:%S/test_case/foo_bar

then I get:

foo_bar
Test_Case

but if I type:

:%S/Test_Case/Foo_Bar/g

then I get:

foo_bar
Foo_Bar

If this is the intended behavior, then please document it. I read through the readme multiple times but perhaps I missed the discussion on behavior of capitalization.

mkdir not found

I'm trying to append some abbreviations using Abolish! and it gives me this error:
line 30:
E117: Unknown function: 17_mkdir

using the last version.

Completion when lazy loading with NeoBundleLazy

I'm trying to lazily load vim-abolish using NeoBundleLazy.
It allows me to specify a command for which the plugin should be loaded.
Also, since it works by defining dumb commands, I need to specify the complete function to be used.

However those functions are script-local. I need those functions to be global (maybe with a namespace, like abolish#... ?) to use them.

The code snippet I'm trying to use is:

  NeoBundleLazy 'tpope/vim-abolish', {
        \   'autoload': {
        \     'commands': [{
        \       'name': 'Abolish',
        \       'complete': 'custom,s:Complete',
        \     }, {
        \       'name': 'Subvert',
        \       'complete': 'custom,s:SubComplete',
        \     }, {
        \       'name': 'S',
        \       'complete': 'custom,s:SubComplete',
        \     },
        \       'Coerce'
        \     ],
        \   },
        \ }

However this will not work since the s:Complete, s:SubComplete functions are script-local.

multiple changes in one line

Tbh, I don't know enough about scripting vim to know if this is an issue with abolish or my setup, but here's what happened.

[thing_to_camelcase, another_thing, last_thing]

I used crm to camelcase all three of these. The first two worked, but the "last_thing" wouldn't camelcase and the cursor kept jumping back to "AnotherThing". When I tried camelcasing "last_thing" before "another_thing", it jumped back to "another_thing" and camelcased it instead.

Request: Enable search for all coercion cases

When searching with S /some_search_term, vim-abolish will match:

some_search_term
SOME_SEARCH_TERM
SomeSearchTerm

but not

someSearchTerm
some-search-term
some.search.term
some search term
Some Search Term

Ideally, the search tool would support all the same formats as the coercion feature: snake_case, MixedCase, camelCase, UPPER_CASE, dash-case, dot.case, space case, and Title Case

The Subvert name is fogged

I take the message which means "A tag name of :S is fogged with ~/.vim/bundle/.neobundle/doc/eregex.txt ".
So I think that those who managed to solve this problem you will be in good.

Coerce Problems

Nothing happens when I try a coerce command (cru, crc).
Thinking that something from my vimrc might be causing the problem I emptied that file and tried again with the same results. Any ideas on how to troubleshoot this?

Not an editor command.

For some odd reason, I get "E492: Not an editor command: Abolish isk idk" when I've added an abbrv to my vimrc. I know that this is the result of a newb error. But any pointers in the proper direction would be much appreciated.

Coerce: Keep cursor in the same place

Currently when I cr? it moves the cursor to the front of the WORD - Is this intended functionality? It would be nice to have an option that keeps the cursor in the same place.

My use case - I use Coerce most of the time in insert mode. I type a variable in camelCase and then immediately coerce it to UPPER_CASE without leaving insert mode, with <c-o>cru. I intend to keep writing at the end of the variable, but the cursor has moved to the start. Because I'm in insert mode the fix is not quite as simple as a W.

(Thanks for the great plugins!!)

Negative lookahead in subvert

Is it possible to do negative lookahead with the subvert command? Say I want to replace foo with quux but leave foobar alone- is there a way to get this to work?

Here was my attempt:

File:

foo
foobar

Command: :%S/foo\(bar\)\@!/quux/g
Result: E486: Pattern not found...

Abbreviating doesn't work with "space" key

Hi.
I am using the latest version of vim-abolish, and for some reason abbreviations doesn't expand after I press space key. But works after pressing Enter, ,, ., etc.
Can you help with this? Or I somehow need to turn of this space behavior?

Error with clipboard=unnamedplus

I find very useful both abolish-coersion and unnamedplus clipboard (because I'm tired to take care about paste/nopaste modes), but unfortunately coersion don't work with this option. Is there a way how to fix it?

(Feature request) Abriviations that works in camel and snake cases.

Hi Tim,

First of all, wanted to thank you for an excellent plugin.
I was lacking of such tool and was really close to write somethings like that.
You saved hours and hours of my life second time(first was about rails.vim).

Have you ever think about abbreviations that works in camelCase and snake_case.
For instance, after:
Abolish pr project
Abolish invn invitation
It would be cool to have 'PrInvn' expanded to 'ProjectInvitation'
As well as 'pr_invn' expanded to 'project_invitation'

Is that possible with Abolish?
Or is it possible to extend Abolish with some option to handle that?

Coercing too quickly?

First of all, this plugin has been an absolute life saver in my conversion of a large, CamelCase C++ project to snake_case C, so thank you very much indeed.

I've just got one weird problem with coerce - if I type crs very quickly, vim ends up substituting the current character instead (as if I'd just typed s). If I type c r s slowly, it works as expected.

I'm using MacVim 7.3, with your abolish, unimpaired and repeat plugins.

Can't Subvert expression with parentheses

I tried this command:
:309,409S/ccc3(25, {224,25}, {224,25})/ccDARKPINK/

and I get two errors:

E51: Too many (
E476: Invalid command

I tried to escape the characters with \ but it doesn't work either.

Abbreviations for words with a post/prefix?

This is not really an issue, but a question. Since there's no other place to ask - I thought about emailing you first, but then decided to ask here. Please let me know where do you prefer questions to be asked.

So I was wondering how to create an abbreviation from the word "reciever" to "receiver" when it might be pre/postfixed with other words, like IDamageReciever. Doing just Abolish reciever receiver doesn't take those cases into account ofc,

I tried Abolish {}reciever {}receiver but it told me the {} is invalid.

Thanks.

Request: text objects for partial words

Hi,

Just putting it out there, it would be nice to have motions &/or text objects for partials of various forms of words, like for {camel}Case, {snake}_case !?

Support Abolish RHS containing only braces

Would be nice to combine two separate :Abolish calls like these:

Abolish hte the
Abolish teh the

Into one:

Abolish {hte,teh} the

But Vim will complain about a RHS that contains only braces:

E474: Invalid argument (not a keyword: '{hte,teh}')

This is of course such a simple case that it may not really be what Abolish is intended for (you can just use raw :iabbrev for cases like this), but it might be nice to add some special casing to detect RHS like this and desugar them into separate calls.

Coerce to hyphen-separated case

I'd like to suggest adding functionality to support crh as "coerce to hyphen-separated case." Some programming languages support that for identifiers (CSS, HTML, Clojure are the main ones), and it'd be nice to be able to use that too.

Feature Request: Run Subvert for all defined Abolish pairs.

This plugin is great, I have the exact same problem.

It would be nice to be able to run the Subvert command for all patterns that are defined with the Abolish command. That way, if you have a file that was created without the plugin, or you update your Abolish list, you can quickly make the corrections on an entire file.

Abbreviations disappear after changing file

Hi,
I'm observing that the abbreviations that I defined with your plugin disappear after changing the file that I edit.
I have tracked it down to the following situation (15s video: http://gfycat.com/BonySmugIchthyostega )

I open a file, abbreviations are there, I change directory, open another file, abbreviations are gone.

Abbrevs are defined in .vim/after/plugin/abolish.vim, as recommended.
The config I'm testing with here is still fairly large and I haven't had time to test with a minimal one. I'll do that in a moment, however.

Do you have a gut feeling for what is causing this? My initial feeling was that it came from filetypes, but my investigations in that direction didn't really confirm that.

Best regards,
Matthias

[RFC] Coersion for inner and outer textobjects, WORD and visual mode

Currently coercion works always for the textobject iw. This is as far as I can see hardcoded into the s:coerce function as norm! yiw; let word = @@

I would like to have a more flexible way of deciding what coercion operates on:

  • cr<coercion char> invoked in visual mode operates on the visual selection.
    This could also allow the user to coerce non-reversible characters such as spaces, dots, dashes.
  • crip<coercion char>, crap<coercion char> textobjects starting with i/a.
  • cR<coercion char> operates on WORD (iW).
    UPDATE: This could also mean till end of line or whole line and use criW for WORD.

I have one particular example in mind for the visual mode operation. Consider this file:

"filename with spaces.txt"

I want to change the spaces within the double quotes to underscores. This feels like a task for abolish-coercion. I'd like to get following file with these commands vi" and cr_

"filename_with_spaces.txt"

I have implemented a first try for the visual mode operation, however, it does not work:

diff --git a/plugin/abolish.vim b/plugin/abolish.vim
index ea9c80f..f98c83a 100644
--- a/plugin/abolish.vim
+++ b/plugin/abolish.vim
@@ -572,6 +572,53 @@ call extend(Abolish.Coercions, {
       \ "function missing": s:function("s:unknown_coercion")
       \}, "keep")

+function! s:get_visual_selection()
+  let [lnum1, col1] = getpos("'<")[1:2]
+  let [lnum2, col2] = getpos("'>")[1:2]
+  let lines = getline(lnum1, lnum2)
+  let lines[-1] = lines[-1][: col2 - (&selection == 'inclusive' ? 1 : 2)]
+  let lines[0] = lines[0][col1 - 1:]
+  return join(lines, "\n")
+endfunction
+
+function! s:vcoerce(transformation)
+  " TODO: Are counts correctly considered? What are they for anyway?
+  " TODO: Does dot-repeat make sense?
+  " TODO: Cursor position as expected?
+  let clipboard = &clipboard
+  try
+    set clipboard=
+    let regbody = getreg('"')
+    let regtype = getregtype('"')
+    let c = v:count1
+    while c > 0
+      let c -= 1
+      " norm! yiw
+      let word = s:get_visual_selection()
+      let @@ = s:send(g:Abolish.Coercions,a:transformation,word)
+      if !exists('begin')
+        let begin = getpos("'[")
+      endif
+      if word !=# @@
+        let changed = 1
+        " norm! viwpw
+        norm! gvp
+        echom "paste new stuff"
+      " else
+      "   norm! w
+      endif
+    endwhile
+    call setreg('"',regbody,regtype)
+    call setpos("'[",begin)
+    call setpos(".",begin)
+    if exists("changed")
+      silent! call repeat#set("\<Plug>Coerce".a:transformation)
+    endif
+  finally
+    let &clipboard = clipboard
+  endtry
+endfunction
+
 function! s:coerce(transformation)
   let clipboard = &clipboard
   try
@@ -606,11 +653,13 @@ function! s:coerce(transformation)
 endfunction

 nnoremap <silent> <Plug>Coerce :<C-U>call <SID>coerce(nr2char(getchar()))<CR>
+xnoremap <silent> <Plug>VCoerce :<C-U>call <SID>vcoerce(nr2char(getchar()))<CR>

 " }}}1

 if !exists("g:abolish_no_mappings") || ! g:abolish_no_mappings
   nmap cr  <Plug>Coerce
+  xmap cr  <Plug>VCoerce
 endif

 command! -nargs=+ -bang -bar -range=0 -complete=custom,s:Complete Abolish

cursor location seems wonky after coercion

This might be too subtle/minor to bother with, but after I use one of the coercion functions in abolish.vim, the next time I use the 'j' key to go down a line the cursor appears in an odd location on the subsequent line. I can mitigate this by navigating along the current line (ie: with 'l' or 'h') before descending but it's a bit of a pain.

Why does Abolish use \k?

I'm getting "E474: Invalid argument (not a keyword: [thing])" for the following:

Abolish from-control form-control

I understand WHY. These lines check that the "bad" item matches only keyword characters and for most filetypes - is not part of isk. What I don't understand is why that's necessary. Is Abolish only intended to replace keywords (var, let, function, etc.)? Or is that a limitation of :abbrev? Because it seems like you might want to replace abbreviations in, for example, code comments or strings, which could be anything.

I don't think this is a bug cause I can just do

augroup AbolishByFiletype
  au!
  au FileType html,css setlocal isk+=45
augroup END

and it works. I'm just wondering why the check for '^\k\+$' is necessary.

Feature request: support for %S//sub/ syntax

the vim-bultin substitute command (:s) supports the syntax :%s//bar/, it replaces the pattern in the search register ('/') with bar, I use this syntax all the time, it would be useful to support this syntax for :Subvert too (:%S//bar/)

Can't coerce with mappings anymore

After updating my plugins today (PlugUpdate) I can't change casing via the coerce mappings anymore. Any cr<anything> mapping will just move the cursor to the end of the word and leave the casing unchanged.

The output of :verbose nmap crs seems fine to me: n cr <Plug>(abolish-coerce)iw

Did something change lately?

Coercion remapping

I'm using a keyboard layout where c is used in place of h. (and l in place of c)
Coercion is in conflict with that.

Currently, my (bad) solution was to comment the line 606 of plugin/abolish.vim file, and add this one in vimrc:

nmap lr <Plug>Coerce

How can i prevent the line commenting in plugin/abolish.vim file ?

Support for NeoVim inccommand

Live substitution with inccommand setting from NeoVim are really amazing.
Is it possible that Suvert support it?

Thanks

Allow abbreviating only commands, and only at the beginning of a line

I'm using the following at the moment to create case-ignorant shortcuts for some common commands:

" Replace a builtin command using cabbrev
" http://vim.wikia.com/wiki/Replace_a_builtin_command_using_cabbrev
function! CommandAbolish(abbreviation, expansion)
  execute 'cabbrev ' . a:abbreviation . ' <c-r>=getcmdpos() == 1 && getcmdtype() == ":" ? "' . a:expansion . '" : "' . a:abbreviation . '"<CR>'
endfunction
command! -nargs=+ CommandAbolish call CommandAbolish(<f-args>)

CommandAbolish E e
CommandAbolish Q Q
CommandAbolish QA qa
CommandAbolish Qa qa
CommandAbolish qA qa
CommandAbolish W w
CommandAbolish WQ wq
CommandAbolish Wq wq
CommandAbolish wQ wq

It would be great if something like this could be added to the Abolish command so I don't have to list all case combinations individually.

Unable to use or escape special characters in expression.

Say I have a list of items like so:

+ item 1
- item 2

and I want this:

* item 1
* item2 

I want to do something like S/{-,+}/* but the + gets treated like a special character. I haven't been able to make it work with any combination of backslashes before the + character.

This is the error message:

E866: (NFA regexp) Misplaced +
E64: + follows nothing
E476: Invalid command

Thank you for the wonderful plugin!

Problems with search and replace

Hi,

I've just installed abolish, but it doesn't seem to be working right.

This command: :S/sow/assignment/g only replaces the first occurrence, it doesn't replace globally.

This command: :S/sow/assignment/gc gives this error message E486: Pattern not found: \v\C%(SOW|Sow|sow)

I hope you can help me out because I have a lot of search and replace to do and this tool looks awesome!

This plugin is awesome.

And FTR, I honestly think seperate is the correct spelling every time I type it, and I cannot blame my fingers.

I'm not too hot on disparate either, but that one isn't high on my usage list.

Keep up the good work, you're practically a house-hold name... if you specify that only houses that contain vim users.

I found this plugin from your rails plugin, so the whole seperate separate thing is a total bonus.

Coerce to dot.case

Iā€™d love to see support for crd or similar to coerce camelCase and snake_case into dot.case.

I had hoped that it would be a simple change that I could fork and apply, but Iā€™m none too familiar to vimscript, and abolish.vim appeared complete greek to me. )=

Why is dashcase a one-way coercion?

Working with a lot of DOM manipulation in front-end web code I find myself having to convert data-attribute-name to dataAttributeName, or ng-anything to ngAnything and back again. However, coercion to dash-case is a one-way trip? Why is 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.