Provides Vim modal control for Atom, blending the best of Vim and Atom.
Current Status - DEPRECATED in favor of vim-mode-plus
We're not maintaining this package anymore, because vim-mode-plus
has more features and is very well maintained.
Next generation vim support for atom
License: MIT License
Provides Vim modal control for Atom, blending the best of Vim and Atom.
We're not maintaining this package anymore, because vim-mode-plus
has more features and is very well maintained.
In Vim, dj
and dk
deletes two lines, while yj
and yk
yanks two lines. d2j
affects three lines, and so on.
In Atom Vim mode it appears j
/k
is implemented the same as h
/l
and affects one less line than in Vim mode.
Tried to use
:s/Class/class/
but nothing showed up, Not sure if this text replace is implemented yet.
When using Vim in a terminal when exiting Insert Mode using esc the cursor is moved left one character.
You can see that the cursor is between 8 and 9 and that Vim is in insert mode.
But when ESC is pressed to go back to normal mode the cursor is shifted between 7 and 8.
Vim users are going to be used to this shift so implementing this in vim-mode might make the transition more attractive.
Unlike named buffers in vim-mode, it appears that the unnamed buffer that is used when you press yw
or Y
(and deletes) is tab-specific. In order to yank+put text across tabs, you must use a named buffer.
So vim has this concept of the unnamed register which automatically receives the contents of any delete operation. So if you delete a line with dd
it should copy the deleted line into the "
register.
Unfortunately when you call editor.delete()
it doesn't return the deleted text. When I talked to @probablycorey about this he mentioned that you can use the changed
event on TextBuffer and it will return the deleted text. Unfortunately this only works up to a point. You can capture the content fairly easily for a single dd
but it's difficult with repeated commands such as 5dd
as they decompose into 5 separate deletes on the editor.
@nathansobo would you be up for having the delete commands within atom return the values they've deleted?
In insert mode only, ctrl-n
and ctrl-p
attempt to complete the current word. ctrl-n
searches forward and ctrl-p
searches backward. In Vim the completion list is specified by the complete
option which by default completes words from every open buffer as well as the tag list.
http://vimhelp.appspot.com/insert.txt.html#i_CTRL-N
http://vimhelp.appspot.com/insert.txt.html#i_CTRL-P
So the current solution we use to block keystrokes in command mode isn't quite right.
https://github.com/atom/vim-mode/blob/5f4b47de/lib/vim-state.coffee#L36-L42
There are several issues:
Any ideas, @probablycorey ?
c c
currently removes the entire line. In vim, it will put the cursor at the first non-whitespace character, clear the rest of the line, and switch to insert mode.
I'm getting an activation failure on one machine. I have successfully installed on another with no issues. Thought I'd post the error here.
Failed to activate package named 'vim-mode' TypeError: Cannot call method 'each' of undefined
at VimState.module.exports.VimState.handleCommands (/Users/bjtitus/.atom/packages/vim-mode/lib/vim-state.coffee:121:7)
at VimState.module.exports.VimState.setupCommandMode (/Users/bjtitus/.atom/packages/vim-mode/lib/vim-state.coffee:68:6)
at new VimState (/Users/bjtitus/.atom/packages/vim-mode/lib/vim-state.coffee:24:6)
at /Users/bjtitus/.atom/packages/vim-mode/lib/vim-mode.coffee:10:33
at WorkspaceView.module.exports.WorkspaceView.eachEditorView (/Applications/Atom.app/Contents/Resources/app/src/workspace-view.js:455:9)
at Object.module.exports.activate (/Users/bjtitus/.atom/packages/vim-mode/lib/vim-mode.coffee:6:24)
at Package.module.exports.Package.activateNow (/Applications/Atom.app/Contents/Resources/app/src/package.js:161:27)
at /Applications/Atom.app/Contents/Resources/app/src/package.js:147:28
at Package.module.exports.Package.measure (/Applications/Atom.app/Contents/Resources/app/src/package.js:95:15)
at Package.module.exports.Package.activate (/Applications/Atom.app/Contents/Resources/app/src/package.js:141:14)
at PackageManager.module.exports.PackageManager.activatePackage (/Applications/Atom.app/Contents/Resources/app/src/package-manager.js:101:21)
at PackageManager.module.exports.PackageManager.activatePackages (/Applications/Atom.app/Contents/Resources/app/src/package-manager.js:90:14)
at PackageManager.module.exports.PackageManager.activate (/Applications/Atom.app/Contents/Resources/app/src/package-manager.js:77:19)
at Atom.module.exports.Atom.startEditorWindow (/Applications/Atom.app/Contents/Resources/app/src/atom.js:312:21)
at Object.<anonymous> (/Applications/Atom.app/Contents/Resources/app/src/window-bootstrap.js:14:8)
at Object.<anonymous> (/Applications/Atom.app/Contents/Resources/app/src/window-bootstrap.js:20:4)
at Module._compile (module.js:455:26)
at Object.Module._extensions..js (module.js:473:10)
at Module.load (/Applications/Atom.app/Contents/Resources/app/node_modules/coffee-script/lib/coffee-script/register.js:45:36)
at Function.Module._load (module.js:311:12)
at Module.require (module.js:363:17)
at require (module.js:379:17)
at window.onload (file:///Applications/Atom.app/Contents/Resources/app/static/index.html?load…C%22initialPath%22%3A%22%2FUsers%2Fbjtitus%2Ftest%22%7D:26:9)
I hope to look into this myself a little later today or tomorrow. If anyone else has time feel free to take a look.
When entering insert mode and then typing multiple characters 'u' will undo everything since entering insert mode.
atom currently will undo each character individually.
edit: Clarified first sentence.
I would really like to contribute to the f motion for vim-mode, since it is something I use often when coding. I'm not sure the best way to get started.
I see there is the concept of prefix to capture an argument for the number of times something should occur, but this motion will require information that is trailing the command to work
Any insights on how to approach this would be much appreciated.
If you are in command mode and press backspace then a character will be deleted. It is expected that backspace will behave like left arrow while in command mode.
If you go into insert mode, type something, go back to beginning of line and exit insert mode, the cursor goes at the end of the previous line. It should stay at the beginning of the current line.
Can we have a survey/poll to order the implementation of new features?
What makes me suggest this is: I use the "r" command in vim all the time. I'd love to see that ported to vim-mode. BUT - if I'm the only person who uses it, I'd rather have resources go into more widely used features first.
Obviously this is open-source so we can hopefully have the best of both worlds. If someone has an itch, they can scratch it. If they want to help in general, grab a top item on the ordered list.
Just my thoughts.
Installing '[email protected]' failed. Less…
npm http GET https://registry.npmjs.org/underscore-plus
npm http GET https://registry.npmjs.org/underscore-plus
npm http GET https://registry.npmjs.org/underscore-plus
npm http GET https://registry.npmjs.org/underscore
npm http GET https://registry.npmjs.org/underscore
npm http GET https://registry.npmjs.org/underscore
npm ERR! Error: SELF_SIGNED_CERT_IN_CHAIN
npm ERR! at TLSSocket. (_tls_wrap.js:777:36)
npm ERR! at TLSSocket.EventEmitter.emit (events.js:98:17)
npm ERR! at TLSSocket._finishInit (_tls_wrap.js:337:8)
npm ERR! If you need help, you may report this entire log,
npm ERR! including the npm and node versions, at:
npm ERR! http://github.com/isaacs/npm/issues
npm ERR! System Darwin 13.0.0
npm ERR! command "/Applications/Atom.app/Contents/Frameworks/Atom Helper.app/Contents/MacOS/Atom Helper" "/Applications/Atom.app/Contents/Resources/app/node_modules/atom-package-manager/node_modules/npm/bin/npm-cli.js" "--userconfig" "/Applications/Atom.app/Contents/Resources/app/node_modules/atom-package-manager/.apmrc" "install" "/Users/me/.atom/.node-gyp/.atom/.apm/vim-mode/0.7.1/package.tgz" "--target=0.11.10" "--arch=x64"
npm ERR! cwd /private/var/folders/ml/v3g3qb4s5xn4k_8n2gpk214w0000gn/T/apm-install-dir-114128-1809-1agfoj0
npm ERR! node -v v0.11.10
npm ERR! npm -v 1.3.18
npm ERR!
npm ERR! Additional logging details can be found in:
npm ERR! /private/var/folders/ml/v3g3qb4s5xn4k_8n2gpk214w0000gn/T/apm-install-dir-114128-1809-1agfoj0/npm-debug.log
npm ERR! not ok code 0
Maybe its just me? :(
npm http GET https://registry.npmjs.org/underscore-plus
npm http GET https://registry.npmjs.org/underscore-plus
npm http GET https://registry.npmjs.org/underscore-plus
npm ERR! Error: SELF_SIGNED_CERT_IN_CHAIN
npm ERR! at SecurePair.<anonymous> (tls.js:1370:32)
npm ERR! at SecurePair.EventEmitter.emit (events.js:92:17)
npm ERR! at SecurePair.maybeInitFinished (tls.js:982:10)
npm ERR! at CleartextStream.read [as _read] (tls.js:469:13)
npm ERR! at CleartextStream.Readable.read (_stream_readable.js:320:10)
npm ERR! at EncryptedStream.write [as _write] (tls.js:366:25)
npm ERR! at doWrite (_stream_writable.js:223:10)
npm ERR! at writeOrBuffer (_stream_writable.js:213:5)
npm ERR! at EncryptedStream.Writable.write (_stream_writable.js:180:11)
npm ERR! at write (_stream_readable.js:583:24)
npm ERR! If you need help, you may report this *entire* log,
npm ERR! including the npm and node versions, at:
npm ERR! <http://github.com/isaacs/npm/issues>
npm ERR! System Darwin 13.0.0
npm ERR! command "/usr/local/Cellar/node/0.10.25/bin/node" "/Applications/Atom.app/Contents/Resources/app/apm/node_modules/atom-package-manager/node_modules/npm/bin/npm-cli.js" "--userconfig" "/Applications/Atom.app/Contents/Resources/app/apm/node_modules/atom-package-manager/.apmrc" "install" "/Users/bemathis/.atom/.node-gyp/.atom/.apm/vim-mode/0.7.1/package.tgz" "--target=0.11.10" "--arch=x64"
npm ERR! cwd /private/var/folders/6n/twwjg6xn08n7mhv0c9vt3hzr0000gp/T/apm-install-dir-114128-28251-7y5l5h
npm ERR! node -v v0.10.25
npm ERR! npm -v 1.3.18
npm ERR!
npm ERR! Additional logging details can be found in:
npm ERR! /private/var/folders/6n/twwjg6xn08n7mhv0c9vt3hzr0000gp/T/apm-install-dir-114128-28251-7y5l5h/npm-debug.log
npm ERR! not ok code 0
It seems like Atom already has support for splitting windows (cmd-k + arrow key) but it would be nice if it was mapped to vim-style shortcuts.
ctrl-w v for vertical split
ctrl-w s for horizontal split
ctrl-w (motion letter - hjkl) to move between splits
And I can't tell if resizing splits is possible, but that would be nice too.
atom/find-and-replace#134 (comment)
So it turns out that find-and-replace allows you to dismiss the dialog by hitting escape from the text editor, but I didn't know this was the case because I use vim-mode. Not sure whose bug this is yet, but it's worth knowing about.
H, M and L should jump to High, Medium and Low positions respectively.
I'm trying to wrap my mind around how all of this is working, and I'm having trouble tracking down some of the APIs that are being used. For example, EditorView::preempt and EditorView::command don't appear to be documented. Does this package use undocumented APIs, and if so how do I find out about them? Otherwise, where are they documented?
These commands scroll the current line to some position in the editor view without moving the cursor:
zt
scrolls to the topzz
scrolls to the middlezb
scrolls to the bottomThere are corresponding commands z<enter>
z.
z-
that move the cursor to the first non-blank in the line.
It would be cool to have a fast way to enable/disable the plugin for situations when you are pairing with a non vimmer - it would make it easier for them to use my machine and for them to have the plugin installed (and dormant) on their machine.
Ideally this would be paired with some subtle visual cue in the UI about whether it is enabled or not e.g. beside the release-notes squirrel on bottom right.
I believe the fastest way to do this at the moment is to leave the vim-mode settings open in a tab and click the enable/disable button. It would be nice to have a keyboard shortcut for it.
Thoughts? I am happy to have a go at implementing it if it is something that the core team would consider.
Steps to reproduce:
This package isn't doing anything for me. As far as I can tell, it is in none of command-mode, visual-mode, insert-mode on startup, which is probably an issue. I'm on vim-mode 0.6.0, atom 0.60.0.
In my .vimrc, I have j and k remapped to gj and gk respectively. This makes it so that I can move up and down a display-line (that is, a line shown because the text is wrapping, it does not get its own line number). I'd love the ability to move up and down through my wrapped lines. Just including a call for these would allow me to map whatever keys I want to it.
I would appreciate if vim-mode could also support line numbers relative to the cursor when in normal mode; this avoids having to count lines when performing operations. Instead of 0
in normal mode, the cursor line number would show the true line number. Relative line numbers would also be an option in case some users don't want this enabled.
Normal mode:
2 |
1 | function foo(bar) {
256 | console.log(bar); // current line in normal mode.
1 | }
2 |
3 |
Insert mode:
254 |
255 | function foo(bar) {
256 | console.log(bar); // current line in insert mode.
257 | }
258 |
259 |
Thank you.
In command mode, *
over a word should jump to the next instance of that word in the buffer. I think this can piggyback on top of built-in search and replace without much trouble.
select whole lines (after merging #81) - y
ank them
then try p
asting them
expected: pastes onto a new line below current line
actual: pastes inline
note pasting inline is the expected behavior if you aren't yanking in linewise visual mode
Happens when launching the editor and after Window: Reload.
Failed to activate package named 'vim-mode' TypeError: Cannot call method 'each' of undefined
at VimState.module.exports.VimState.handleCommands (/Users/thoradam/.atom/packages/vim-mode/lib/vim-state.coffee:121:7)
at VimState.module.exports.VimState.setupCommandMode (/Users/thoradam/.atom/packages/vim-mode/lib/vim-state.coffee:68:6)
at new VimState (/Users/thoradam/.atom/packages/vim-mode/lib/vim-state.coffee:24:6)
at /Users/thoradam/.atom/packages/vim-mode/lib/vim-mode.coffee:10:33
at WorkspaceView.module.exports.WorkspaceView.eachEditorView (/Applications/Atom.app/Contents/Resources/app/src/workspace-view.js:455:9)
at Object.module.exports.activate (/Users/thoradam/.atom/packages/vim-mode/lib/vim-mode.coffee:6:24)
at Package.module.exports.Package.activateNow (/Applications/Atom.app/Contents/Resources/app/src/package.js:161:27)
at /Applications/Atom.app/Contents/Resources/app/src/package.js:147:28
at Package.module.exports.Package.measure (/Applications/Atom.app/Contents/Resources/app/src/package.js:95:15)
at Package.module.exports.Package.activate (/Applications/Atom.app/Contents/Resources/app/src/package.js:141:14)
at PackageManager.module.exports.PackageManager.activatePackage (/Applications/Atom.app/Contents/Resources/app/src/package-manager.js:101:21)
at PackageManager.module.exports.PackageManager.activatePackages (/Applications/Atom.app/Contents/Resources/app/src/package-manager.js:90:14)
at PackageManager.module.exports.PackageManager.activate (/Applications/Atom.app/Contents/Resources/app/src/package-manager.js:77:19)
at Atom.module.exports.Atom.startEditorWindow (/Applications/Atom.app/Contents/Resources/app/src/atom.js:312:21)
at Object.<anonymous> (/Applications/Atom.app/Contents/Resources/app/src/window-bootstrap.js:14:8)
at Object.<anonymous> (/Applications/Atom.app/Contents/Resources/app/src/window-bootstrap.js:20:4)
at Module._compile (module.js:455:26)
at Object.Module._extensions..js (module.js:473:10)
at Module.load (/Applications/Atom.app/Contents/Resources/app/node_modules/coffee-script/lib/coffee-script/register.js:45:36)
at Function.Module._load (module.js:311:12)
at Module.require (module.js:363:17)
at require (module.js:379:17)
at window.onload (file:///Applications/Atom.app/Contents/Resources/app/static/index.html?load…m%2Fdev%2Fweb%2Fsideline%2Fxpsweb%2Fapp%2Fscripts%2Fcontrollers%22%7D:26:9)
r
, or replace a single character, is a tricky one. It does not put you in input mode for a single character--you can easily do '5rx' to make the next 5 characters to the right into 'x'. But it takes whatever you press after it, and, if it's visible, replaces the character beneath it. Non-visible characters (such as the arrow keys or cmd-anything) end the mode and work correctly.
How do we implement the weird new input mode? Our hotkeys in vim mode will eat up any keypress after the 'r'. I'm happy to implement it if there's an approach that's okay.
Many of the ex
commands are critical to true vi
heritage, including :w
. From wikipedia's article on ex
:
ex was eventually given a screen oriented visual interface (adding to its command line oriented operation), thereby becoming the vi text editor.
We've got a lot of our movement commands, but it would be great to have our :w
, :%s
, :g
.
Most of the movement commands are there, so I'm generally having a good time. Thanks for this package!
In vim, you can only select line returns when in insert mode, as specified in this spec https://github.com/atom/vim-mode/blob/v0.1.0/spec/vim-mode-spec.coffee#L50-L59
I'm not exactly sure the best way to handle this given the current editor API. @probablycorey or @nathansobo any ideas on how to approach this?
Most of these commands involve selecting a visual block where you can change the case of everything selected. More examples of commands from the vim wiki on switching case:
~
Toggle case of the character under the cursor, or all visually-selected characters.
3~
Toggle case of the next three characters.
g~3w
Toggle case of the next three words.
g~iw
Toggle case of the current word (inner word – cursor anywhere in word).
g~$
Toggle case of all characters to end of line.
g~~
Toggle case of the current line (same as V~).
The above uses ~ to toggle case. In each example, you can replace ~ with u to convert to lowercase, or with U to convert to uppercase. For example:
U
Uppercase the visually-selected text.
First press v or V then move to select text.
If you don't select text, pressing U will undo all changes to the current line.
gUU
Change the current line to uppercase (same as VU).
gUiw
Change current word to uppercase.
u
Lowercase the visually-selected text.
If you don't select text, pressing u will undo the last change.
guu
Change the current line to lowercase (same as Vu).
Indenting or outdenting on the last line causes the line above it to move as well.
So I must be doing something wrong here. When I run apm publish
I get:
npm http PUT https://atom.iriscouch.com/registry/_design/app/_rewrite/vim-mode
npm http 500 https://atom.iriscouch.com/registry/_design/app/_rewrite/vim-mode
npm ERR! registry error parsing json
@kevinsawicki any ideas what could be going on?
If the file is only one line long and you yank the line with Y or yy, it misses the last character.
When trying to select a line of text in visual mode, the selection starts from where the cursor is, not the beginning of the line.
Thanks for working so hard on this! I love that there have been two updates between yesterday and today with usability fixes.
shift-v
for line select mode. The line is selected as expected.k
a number of times. Only the lines above the initially selected lines are now selected.Currently change, delete and yank in tag doesn't work. The "i" is interpreted as a normal insert command.
Great work with this btw!
When i open settings window, i got some tips at center of the window and cannot doing anything in the window (click buutons,switch tabs,command+w,etc),but menu items is ok.Then I can only use command+Q to quit application.
and error message in console
TypeError: Cannot call method 'each' of undefined at VimState.module.exports.VimState.handleCommands (/Users/axb-mac/.atom/packages/vim-mode/lib/vim-state.coffee:121:7) at VimState.module.exports.VimState.setupCommandMode (/Users/axb-mac/.atom/packages/vim-mode/lib/vim-state.coffee:68:6) at new VimState (/Users/axb-mac/.atom/packages/vim-mode/lib/vim-state.coffee:24:6) at /Users/axb-mac/.atom/packages/vim-mode/lib/vim-mode.coffee:10:33 at HTMLDivElement.attachedCallback (/Applications/Atom.app/Contents/Resources/app/src/workspace-view.js:458:16) at HTMLDivElement.jQuery.event.dispatch (/Applications/Atom.app/Contents/Resources/app/node_modules/space-pen/vendor/jquery.js:4676:9) at HTMLDivElement.elemData.handle (/Applications/Atom.app/Contents/Resources/app/node_modules/space-pen/vendor/jquery.js:4360:28) at Object.jQuery.event.trigger (/Applications/Atom.app/Contents/Resources/app/node_modules/space-pen/vendor/jquery.js:4594:12) at HTMLDivElement. (/Applications/Atom.app/Contents/Resources/app/node_modules/space-pen/vendor/jquery.js:5119:17) at Function.jQuery.extend.each (/Applications/Atom.app/Contents/Resources/app/node_modules/space-pen/vendor/jquery.js:590:23) at EditorView.jQuery.fn.jQuery.each (/Applications/Atom.app/Contents/Resources/app/node_modules/space-pen/vendor/jquery.js:237:17) at EditorView.jQuery.fn.extend.trigger (/Applications/Atom.app/Contents/Resources/app/node_modules/space-pen/vendor/jquery.js:5118:15) at EditorView.module.exports.EditorView.afterAttach (/Applications/Atom.app/Contents/Resources/app/src/editor-view.js:1063:19) at callAttachHook (/Applications/Atom.app/Contents/Resources/app/node_modules/space-pen/lib/space-pen.js:323:107) at [object Object].jQuery.fn.(anonymous function) [as append] (/Applications/Atom.app/Contents/Resources/app/node_modules/space-pen/lib/space-pen.js:339:9) at PaneView.module.exports.PaneView.onActiveItemChanged (/Applications/Atom.app/Contents/Resources/app/src/pane-view.js:284:24) at /Applications/Atom.app/Contents/Resources/app/src/pane-view.js:3:61 at /Applications/Atom.app/Contents/Resources/app/node_modules/emissary/lib/emitter.js:134:30 at Array.forEach (native) at Behavior.module.exports.Emitter.emit (/Applications/Atom.app/Contents/Resources/app/node_modules/emissary/lib/emitter.js:133:47) at Behavior.module.exports.Behavior.emit (/Applications/Atom.app/Contents/Resources/app/node_modules/emissary/lib/behavior.js:44:38) at Behavior.module.exports.Signal.emitValue (/Applications/Atom.app/Contents/Resources/app/node_modules/emissary/lib/signal.js:82:19) at Pane.module.exports.Model.set (/Applications/Atom.app/Contents/Resources/app/node_modules/theorist/lib/model.js:166:21) at Pane.accessor.set (/Applications/Atom.app/Contents/Resources/app/node_modules/theorist/lib/model.js:57:23) at Pane.module.exports.Pane.addItem (/Applications/Atom.app/Contents/Resources/app/src/pane.js:191:25) at Pane.module.exports.Pane.activateItem (/Applications/Atom.app/Contents/Resources/app/src/pane.js:176:14) at /Applications/Atom.app/Contents/Resources/app/src/workspace.js:187:16 at _fulfilled (/Applications/Atom.app/Contents/Resources/app/node_modules/q/q.js:797:54) at self.promiseDispatch.done (/Applications/Atom.app/Contents/Resources/app/node_modules/q/q.js:826:30) at Promise.promise.promiseDispatch (/Applications/Atom.app/Contents/Resources/app/node_modules/q/q.js:759:13) at /Applications/Atom.app/Contents/Resources/app/node_modules/q/q.js:573:44 at flush (/Applications/Atom.app/Contents/Resources/app/node_modules/q/q.js:108:17) at process._tickCallback (node.js:605:11) /Applications/Atom.app/Contents/Resources/app/src/workspace.js:196
So there are two unimplemented specs currently:
The issue is that the specs fail as currently written because the behavior of the atom is different than vim. I'm unsure if I should attempt to make the word movement methods within atom more flexible or whether I should reimplement them within the package.
My gut says that the word methods should be more flexible in the editor but I wanted to get your thoughts about it @probablycorey @nathansobo @kevinsawicki
I am by no stretch of the imagination a vim expert. I only know and use maybe 10 or 20 different commands. But one of the ones I use most is ciw
which to my limited knowledge stands for change inner word
. Basically it lets me have my cursor anywhere inside a word, and change that entire word.
As far as I can tell, when you hit the i
in ciw
, it jumps straight to insert mode. So it might be implemented, but just with a bug. I would love to try and implement it myself, but I couldn't figure out exactly what to do.
Any one have any thoughts on how to implement this? If someone could point me in the right direction, I don't have any aversion to doing it myself.
Currently you can jump to the top or bottom of the current document by typing either "gg" or "G", but you can't do this in conjunction with "v" to select from the current cursor position to the top or bottom.
That way you can interact with the system copy and paste functionality using only vim registers. Thanks for suggesting @bhuga I have to admit I didn't know macvim did that.
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.