Giter Club home page Giter Club logo

vim-crystal's Introduction

Vim Filetype Support for Crystal

CI

This is Vim filetype support for Crystal programming language.

  • crystal filetype detection
  • Syntax highlight
  • Indentation
  • eCrystal support
  • vim-matchit support
  • crystal tool integration (implementations, context, formatter, and so on)
  • crystal spec integration
  • Syntax check (Using Syntastic)
  • Completion (currently for variable names)

Installation

Please copy autoload, ftdetect, ftplugin, indent, plugin and syntax directories into your ~/.vim (or ~/vimfiles in Windows) directory.

$ cp -R autoload ftdetect ftplugin indent plugin syntax ~/.vim/

$ # If you use vim-syntastic
$ cp -R syntax_checkers ~/.vim/

If you use Vim8, :packadd is available to install. Please see :help packages for more details.

Otherwise, please use your favorite plugin manager like vim-plug.

Syntax Highlight

screenshot

This plugin was firstly imported from Ruby's filetype plugin. There are many differences between Ruby and Crystal but vim-crystal can't support all of them yet. In addition, Crystal is growing rapidly and being added many changes. If you've found some issues or points to improve, pull requests and issues are welcome.

Spec Integration

screen shot: run spec

Running spec(s) and show the result in Vim. The output is colorful if possible as executed in CLI.

:CrystalSpecSwitch (mapping to gss)

It switches current source file and its spec file. This command assumes the standard directory layout which crystal init generates.

If you don't set g:crystal_define_mappings to 0, you can use this feature with mapping gss.

:CrystalSpecRunAll (mapping to gsa)

It runs the all specs for current file's project.

If you don't set g:crystal_define_mappings to 0, you can use this feature with mapping gsa.

:CrystalSpecRunCurrent (mapping to gsc)

It runs spec for current buffer.

  1. When current buffer is a spec source, :CrystalSpecRunCurrent runs the spec under the cursor. You should execute this command after moving cursor to it ... do line or describe ... do line.
  2. When current buffer is not a spec source, :CrystalSpecRunCurrent finds corresponding spec source and runs all specs in the source.

If you don't set g:crystal_define_mappings to 0, you can use this feature with mapping gsc.

Formatter Integration

format screenshot

You can run formatter manually by :CrystalFormat or automatically at saving buffer.

When you set g:crystal_auto_format to 1, current buffer is automatically formatted on BufWritePre. The variable is set to 0 by default because crystal tool format currently seems buggy.

Tool Integration

:CrystalDef (mapping to gd)

It makes cursor jump to the definition of name under the cursor. This command uses crystal tool implementations.

screenshot

If you don't set g:crystal_define_mappings to 0, you can use this feature with mapping gd.

:CrystalContext (mapping to gc)

It shows the context under the cursor. Context includes variable names and their types.

screenshot

If you don't set g:crystal_define_mappings to 0, you can use this feature with mapping gc.

:CrystalHierarchy

It shows types hierarchy of current code.

screenshot

:CrystalImpl

It shows how the identifier under the cursor is implemented. For example, when the cursor is on some property of an object instance, :CrystalImpl would report where the property is defined with property macro.

:CrystalExpand

It expands macro invocation under the cursor.

Completion

Omni completion for crystal can be used by <C-x><C-o>. (Please see :help ins-completion)

screenshot

Currently you can complete only variable names. If you want more advanced completion, please consider to use a language server like crystalline.

If you want to disable this feature, set 0 to g:crystal_enable_completion.

Maintainers

License

This plugin is distributed under the MIT License. Please read LICENSE.txt.

vim-crystal's People

Contributors

bew avatar bjeanes avatar caspiano avatar chocolateboy avatar collidedscope avatar daviswahl avatar f avatar felixbuenemann avatar hkdnet avatar hovsater avatar hqm42 avatar kgautreaux avatar makenowjust avatar petertseng avatar rhysd avatar sudo-nice avatar tristil avatar veelenga 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

vim-crystal's Issues

Invalid argument: crystalExceptional

Error detected while processing /home/user/.local/share/nvim/plugged/vim-crystal/syntax/crystal.vim:
line  314:
E871: (NFA regexp) Can't have a multi follow a multi
E475: Invalid argument: crystalExceptional       "\<\%(\%(;\|^\)\s*\@<=rescue\|else\|ensure\)\>[?!]\@!" contained containedin=crystalBlockExpression
Press ENTER or type command to continue

Problem commit is 7d235e3

Faulty syntax highlighting for numbers

I recently noticed some small edge cases related to highlighting numbers that are not being handled properly, IMO:

  1. Certain notations are highlighted that don't actually compile in Crystal:

    • 0d- and 0D-style decimal integers: 0d123 0D123
    • 0X/0O/0B-style hexadecimal/octal/binary integers: 0XABC 0O123 0B101

    These notations are supported by Ruby, but not by Crystal. In my opinion, if they don't compile, they shouldn't be highlighted.

  2. -123 is highlighted as a crystalInteger, but +123 is not.

  3. For floats that use scientific notation, 123e-2 is highlighted correctly, but 123_e-2 isn't.

  4. 8-, 16-, and 128-bit integer literals aren't highlighted properly. For example, 1u32 and 1u64 are highlighted, but 1u8, 1u16, and 1u128 aren't.

I was wondering if you would accept a PR to fix these issues.

two splits on same file problem

When I have my window split into two viewports on the same file, and then save in one viewport, the other viewport jumps to the beginning of the file, losing my place.

I think this is because of the auto formatting, but I'm not sure.

Please let me know if you need any more information.

with vim-crystal + syntastic, first alias always says "alias X is already defined"

A minimal setup: I install pathogen (to save me the trouble when installing the other two things), syntastic, and vim-crystal only.

vimrc contains only the following two lines:

execute pathogen#infect()
syn on

With a file test.cr:

alias MyAlias = Int32

On writing the file, I get at line 1 alias MyType is already defined.

It's very strange and happens to me too for my normal setup and larger files too. I will see if I can investigate further on this.

CrystalFormat appends extra space to the head of buffer

Reported by @will in #21.
It caused on auto saving.

diff --git i/src/pg.cr w/src/pg.cr
index b4a8352..6229194 100644
--- i/src/pg.cr
+++ w/src/pg.cr
@@ -1,4 +1,4 @@
-require "./core_ext/*"
+ require "./core_ext/*"
 require "./pg/*"

 module PG
@@ -8,3 +8,4 @@ module PG
     conn
   end
 end
+

Option similar to ruby_indent_assignment_style

The Ruby Vim plugin includes an option called ruby_indent_assignment_style which determines the behavior of indenting after an assignment, commonly with begin, if, etc. Two different styles are shown below, each of which is supported by this option:

@var = if some_condition
  true
else
  false
end

###

@var = if some_condition
         true
       else
         false
       end

I greatly prefer the first style, but vim-crystal only appears to support the latter style. I'd love to see this option added.

commands and complete don't work with vim-polyglot

vim-polyglot adds lines:

if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'crystal') == -1
...
endif

above and below what's in crystal.vital.

vital.vim has a line return vital#_{substitute(ver[0], '\W', '', 'g')}#new() which looks at the first line in the file.

However, because vim-polyglot added those lines, it breaks vim-crystal and produces errors.

I was wondering if the first line in crystal.vital ever changed from 'crystal'.

If it doesn't, then there doesn't seem to be a need to read from the first line of the file and we can just use the a:name passed into the function vital#of(), which is 'crystal', to do the same thing.

This would preserve the functionality when vim-crystal is installed via vim-polyglot.

What are your thoughts on this change?

Don't always require all specs

For big project with a lot of spec files (like the crystal compiler), doing require "./spec/**" is overkill and takes a lot of time / memory / ...

I'd like something like b:crystal_spec_file per buffer to set the spec file to require for it. This way I can use :CrystalContext properly in the crystal compiler' sources without killing my laptop ๐Ÿ˜„

I did an implementation of this, will probably PR soon!

Latest commit throws error on ECR files

Output of vim --version or nvim --version

NVIM v0.4.4
Build type: Release
LuaJIT 2.0.5
Compilation: /usr/bin/cc -D_FORTIFY_SOURCE=2 -march=x86-64 -mtune=generic -O2 -pipe -fno-plt -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=1 -O2 -DNDEBUG -DMIN_LOG_LEVEL=3 -Wall -Wextra -pedantic -Wno-unused-parameter -Wstrict-prototypes -std=gnu99 -Wshadow -Wconversion -Wmissing-prototypes -Wimplicit-fallthrough -Wvla -fstack-protector-strong -fno-common -fdiagnostics-color=always -DINCLUDE_GENERATED_DECLARATIONS -D_GNU_SOURCE -DNVIM_MSGPACK_HAS_FLOAT32 -DNVIM_UNIBI_HAS_VAR_FROM -I/build/neovim/src/build/config -I/build/neovim/src/neovim-0.4.4/src -I/usr/include -I/build/neovim/src/build/src/nvim/auto -I/build/neovim/src/build/include
Compiled by builduser

Features: +acl +iconv +tui
See ":help feature-compile"

   system vimrc file: "$VIM/sysinit.vim"
  fall-back for $VIM: "/usr/share/nvim"

Run :checkhealth for more info

Steps to reproduce

  1. Open an ecr file
  2. save it
  3. see error from tool format

Expected behavior

It to not run on ecr files

Actual behavior

it runs on ecr files :(

Additional information

This functionality of not running the formatter on ecr files was removed with this merge request commit:
58e9ff9

Can't get omnicompletion to work

Hi there thanks for the plugin. but i cant seem to get the omnicompletion to work

I just installed it using Plug 'rhysd/vim-crystal'

when pressen <C-X><C-O> nothing happens, but it seems like the other functions are working
like, do I need to install other dependencies?

Arbitrary `undefined constant`

Example file structure:

src/
--my_lib.cr
--my_lib/
----a.cr
----a/
------b.cr

my_lib.cr

require "./my_lib/**"

module MyLib; end

my_lib/a/b.cr

module MyLib
  class A
    class B
       @example : String
    end
  end 
end

my_lib/a.cr

module MyLib
  class A
    @example : Array(MyLib::A::B)

    def initialize(@another : MyLib::A::B); end
  end 
end

When editing the a.cr file, the plugin generates an syntax error: undefined constant MyLib::A::B

Since probably the plugin is trying to compile/check the syntax only on this specific file, it is not able to find the reference to the class.

If I require my_lib/a/b.cr everything works well. Yet, on my_lib.cr all the files are required.

But the weirdest of all, is that this error does not occur on the initialize method reference to MyLib::A::B.

Manual installation instructions

I know people like using plugin managers. Not everybody and we should, always, be able to install stuff manually. Don't you think so?

Determine initial mode (script|template) based on filename extension

I noticed that syntax highlighting is turned off up until the first .template directive when editing GSL scripts (.gsl files). If I'm understanding the GSL documentation correctly, it depends on the filename given to gsl. So .gsl files start in script mode, .xml files start in template mode.

Not knowing much about Vimscript, let alone syntax highlighting rules, I poked around a bit in gsl.vim and found the following change to be helpful:

From:

syn region gslDefaultMode start="^."                    keepend end="^\s*\.template\>"    contains=gslTemplModeDirectives
syn region gslTemplMode   start="^\s*\.template\s\+1\>" keepend end="^\s*\.endtemplate\>" contains=gslTemplModeDirectives
syn region gslScriptMode  start="^\s*\.template\s\+0\>" keepend end="^\s*endtemplate\>"   contains=gslScriptModeDirectives

To (change is at the end of the first line):

syn region gslDefaultMode start="^."                    keepend end="^\s*\.template\>"    contains=gslScriptModeDirectives
syn region gslTemplMode   start="^\s*\.template\s\+1\>" keepend end="^\s*\.endtemplate\>" contains=gslTemplModeDirectives
syn region gslScriptMode  start="^\s*\.template\s\+0\>" keepend end="^\s*endtemplate\>"   contains=gslScriptModeDirectives

Now this works fine for me, since I don't usually edit template files (like .xml files). But I guess this change would negatively affect others. What's missing is a distinction of the filename extension of the currently open file.

Could somebody implement this? I guess it'd be enough if .gsl would mean "script mode", and anything else "template mode".

Thanks a lot.

highlight the `record` macro

the record macro is common way to define simple structs in Crystal, maybe it makes sense to highlight this macro

crdoc integration

crdoc is a command line tool to show Crystal document from command line.

I plan to add :CrystalDoc command and K mapping using crdoc.

  • :CrystalDoc keyword yields crdoc search keyword
  • K searches the keyword under cursor

CrystalFormat has not triggered for some split window

Hello, thank you for the plugin!

Steps to reproduce the issue:

  1. Create two files, say,

a.cr:

def foo
  "foo"
end

b.cr:

def bar
  "bar"
end
  1. Open the files with split windows:
    [n]vim -o a.cr b.cr

  2. Make some changes to file a.cr (e.g. change lines indentation) and save the buffer: :w.

Expected result: the CrystalFormat should be triggered and lines should be reindented.
Actual result: No format changes happened.

But for the file b.cr all works just fine.

I've tried Nvim 0.2.2 with this minimal config:

" initialize
call plug#begin('~/.config/nvim/plugged')

Plug 'rhysd/vim-crystal'
let g:crystal_auto_format = 1

" finalize
call plug#end()

macro 'end' highlighting regression

cr_regression_syn_hi

class Object
  macro const_get(const)
    {% begin %}      # <--- %} not highlighted
      {{@type}}::{{const.id}}
    {% end %}        # <--- end not highlighted
  end                # <--- end highlighted like begin instead of like macro
end

probably related to #80

Check syntax and semantics quickly and automatically

Crystal compiler can check syntax and semantics of the code using --no-codegen. I set the check on BufWritePost event here using vim-quickrun but it is incomplete because of the entry point of the program. (Pointed out in #15)

I think it is the best to generate temporary file which requires both current file and spec (if exists). vim-crystal can support it.

  • Add CrystalLint {file} command to use this feature explicitly.
  • Add auto linting at BufWritePost. It can be controlled by g:crystal_auto_lint.

Use crystal format

I think it would be nice to have an options that enable the crystal tools format, triggered every time.

Mostly because of the standards that are going to be imposed by the language, such as, e.g.:

Before:

....
{ 
  foo: Int32,
  bar: String 
}

After change:

....
{ 
  foo: Int32,
  bar: String,
  another: String 
}
...

After formatter:

....
{ 
  foo:     Int32,
  bar:     String,
  another: String 
}
...

Incorrect indentation for private classes

What it should look like:

private class R
  def initialize
  end
end

What it ends up looking like (gg=G):

private class R
def initialize
end
end

Upon experimentation, it seems to me that the indentation level isn't increased after a private class declaration. I'm sadly no Vim syntax highlighting wizard, so I haven't been able to thunk a fix.

Automatic formatting

Now Crystal compiler is planning to support formatting.

crystal-lang/crystal#309

After formatting branch is merged into master, I should start to integrate it to vim-crystal.

  • :CrystalFmt formats current buffer.
  • On BufWritePost, automatically formats current buffer. This behavior is controlled by g:crystal_auto_format.

Problems with crystal tools and Syntastic

Hi,

I can't use any crystal command like :CrystalFormat , :CrystalDef, etc. Also there is no checking when running :SyntasticCheck

I installed vim-crystal with Vundle Plugin
using Plugin 'https://github.com/rhysd/vim-crystal.git'. Im relative new to using vim so i need a little help to know what im doing wrong or if theres currently a problem with the pluggin.

Im using

Vim 
   VIM - Vi IMproved 8.0 (2016 Sep 12, compiled Sep 30 2017 18:21:38)

Crystal 
  Crystal 0.24.1 (2017-12-22)
  LLVM: 4.0.0
  Default target: x86_64-unknown-linux-gnu

OS 
  Debian GNU/Linux 9.3 (stretch) x86_64

an example of the erros I have when running :CrystalDef (gd) is:

Error detected while processing /home/nieto/.vim/bundle/vim-crystal/autoload/cry
stal_lang.vim:
line    4:
E117: Unknown function: vital#crystal#new
E15: Invalid expression: vital#crystal#new()
line    5:
E121: Undefined variable: s:V
E15: Invalid expression: s:V.import('Process')
line    6:
E121: Undefined variable: s:V
E15: Invalid expression: s:V.import('ColorEcho')
analyzing definitions under cursor...
Error detected while processing function crystal_lang#jump_to_definition[3]..cry
stal_lang#impl[1]..crystal_lang#tool[14]..<SNR>101_run_cmd:
line    4:
E121: Undefined variable: s:P
E15: Invalid expression: s:P.system(a:cmd)

Syntax checking with syntastic

It would be nice to highlight compile errors for crystal in vim.

We can compile sources written in crystal with command and parse it's output:

$ crystal build filename.cr

First that comes to the mind is integration with Syntastic. Good example of such approach is rust.vim.

Or we can supply it with syntastic directly. @rhysd, @scrooloose what can you say?

First argument of fun declaration is incorrectly highlighted.

The following code is an excerpt from a Crystal shard, which binds to a C lib. The first function parameter should not be highlighted blue.


fun intrflush(win : WindowPtr, bool : Bool) : Int32
fun keypad(win : WindowPtr, bool : Bool) : Int32
fun mouseinterval(v : Int32) : Int32
fun mvwaddstr(win : WindowPtr, y : Int32, x : Int32, str : LibC::Char*) : Int32
fun newwin(rows : Int32, cols : Int32, y : Int32, x : Int32) : WindowPtr

screen shot 2017-04-27 at 4 00 49 pm

Keywords as argnames in fun declarations

Crystal supports the use of keywords as arguments in method definitions (by using an external argument name) and also fun declarations (by just using it, using an external argument name results in compile-error).

Unfortunately, this makes the syntax highlighting trip. Here the issue with method definitions:

def foo(good : Bool, num : Int, alias s : String, property p : Symbol)
  puts "alias = #{s}"
  puts "num = #{num}"
  puts "property = #{p}"
end
foo good: true, num: 5, alias: "bla", property: :xyz

which looks like this on my machine:
screen shot 2016-08-14 at 02 19 37

And here the issue with fun declarations:

  fun zdir_resync(self : Void*, alias : LibC::Char*) : Void* # "LibC::Char*" has no color
  fun zframe_meta(self : Void*, property : LibC::Char*) : LibC::Char* # "property" wrongly has a color

Here's how it looks in my:
screen shot 2016-08-14 at 02 10 49

I just noticed these seem to be correctly recognized by Github's higlighting.

My vi -v says NVIM v0.1.5-719-gf1eb303.

Move to organization

Recently I'm not so active user of Crystal though I still maintain a few Crystal projects. To make it easy to improve this plugin, I'm considering to move this plugin to vim-crystal organization.

I continue to maintain this plugin after moving to org. And considering many and continuous contributions, I'm willing to invite @jlcrochet as maintainer. @jlcrochet, what do you think? Maintainer can add commits without review (of course making PR is also welcome for reviews by other maintainers).

If someone wants to join as maintainer, please let me know in this issue. Requirements for maintainers are:

  • familiar with Vim script and Crystal
  • have contributed to this plugin at least once (it means listed in contributors)

Crystal spec support

@rhysd Thanks for the work. It is great.

I really enjoy running specs within vim via vim-rspec. Don't we want to be able to run Crystal's built-in spec with vim-crystal ?

Shorthand null checking indents an extra unit

Minimum working example: See below

value : Int32 | Nil = 3

# expected:
if null_checked_value = value
  puts value + 2
  exit 0
end

# result:
if null_checked_value = value
    puts value + 2
  exit 0
end

Support to collapse / fold

Hi, vim-crystal is great and I love it. But when I trying to collapse(fold) my code using syntax mode, I mean the way described here with configuration like:

set foldmethod=syntax

I found it doesn't work at all. While the default indent mode doesn't work well, actually a way is absent to collapse Crystal code in Vim.

I love Vim and Crystal and thus this script, hoping the feature comes true one day.

Auto format should not block saving buffer

Currently, if the buffer has a syntax error it is impossible to save it if g:crystal_auto_format is set. This means you can't save your file to run the compiler to see what the error was.

I can get this behaviour by replacing the throw in crystal_lang#format_string with a return a:code but I'm fairly sure there is a better way of doing this (since I don't really know vimscript).

Thanks!

Wrong spec_helper path for nested specs

Consider the following project structure:

.
โ”œโ”€โ”€ spec
โ”‚  โ””โ”€โ”€ spec_helper.cr
โ””โ”€โ”€ src
   โ”œโ”€โ”€ foo
   โ”‚  โ””โ”€โ”€ bar.cr
   โ””โ”€โ”€ foo.cr

Now, if we open foo.cr end execute :CrystalSpecSwitch, we will correctly get the into foo_spec.cr with correct first line: require "./spec_helper".
But if we open bar.cr end execute :CrystalSpecSwitch, we will correctly get into bar_spec.cr and the require line will be again require "./spec_helper", but it rather should be require "../spec_helper". What do you think?

Problem with NERDTree

Hey, nice job with vim-crystal, i figured out about crystal-lang yesterday and the first think that i looked for was the plugin for vim.

So, my NERDTree became weird after the vim-crystal. The problem is, when I open the vim for the first time its normal, then I open a .cr file and the colours of the NERDTree still normal. The problem begins when I close the .cr file and open another .cr, the NERDTree loses all the colours and became green.

When I open the for the first time
screen shot 2015-07-27 at 9 55 36 am

When i close the file and open another
screen shot 2015-07-27 at 9 56 05 am

[feature request] Comment block editing mode

When editing Ruby files, if you start a comment block, any successive newlines will automatically start with a #. I would like to have the same functionality in vim-crystal.

Add support for `crystal tool expand`

This tool is used to show macro expansion for a given location.

Note: The usage is similar to the crystal tool context that is already supported by this plugin.

Regression in highlighting until...end

Please, consider the snippet:

def foo
  until true
    do_something
  end # <- wrong highlighting
end   # <- wrong highlighting

The same wrong highlighting happens for while block.

Git bisect blames the commit d2061b2

ECR files break formatting entirely until vim restart

Output of vim --version or nvim --version

NVIM v0.4.4
Build type: Release
LuaJIT 2.0.5
Compilation: /usr/bin/cc -D_FORTIFY_SOURCE=2 -march=x86-64 -mtune=generic -O2 -pipe -fno-plt -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=1 -O2 -DNDEBUG -DMIN_LOG_LEVEL=3 -Wall -Wextra -pedantic -Wno-unused-parameter -Wstrict-prototypes -std=gnu99 -Wshadow -Wconversion -Wmissing-prototypes -Wimplicit-fallthrough -Wvla -fstack-protector-strong -fno-common -fdiagnostics-color=always -DINCLUDE_GENERATED_DECLARATIONS -D_GNU_SOURCE -DNVIM_MSGPACK_HAS_FLOAT32 -DNVIM_UNIBI_HAS_VAR_FROM -I/build/neovim/src/build/config -I/build/neovim/src/neovim-0.4.4/src -I/usr/include -I/build/neovim/src/build/src/nvim/auto -I/build/neovim/src/build/include
Compiled by builduser

Features: +acl +iconv +tui
See ":help feature-compile"

   system vimrc file: "$VIM/sysinit.vim"
  fall-back for $VIM: "/usr/share/nvim"

Run :checkhealth for more info

Steps to reproduce

  1. Open a crystal file
  2. Split open an ECR file
  3. Try to format the crystal file
  4. Close ECR file and try to format again

Expected behavior

It should always format the CR file

Actual behavior

It stops formatting the CR files

Additional information

This only happens if you open a crystal file first, then split an ECR file.
Upon closing the ECR file buffer, the formatter continues to be broken and is not usable until a vim restart.

No error occurs, or none visible at least.

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.