Giter VIP home page Giter VIP logo

snippets's Introduction

Doom Emacs

InstallDocumentationFAQScreenshotsContribute

Made with Doom Emacs Supports Emacs 27.1–29.3 Latest commit Build status: master Discord Server Discourse server

Doom Emacs Screenshot


Table of Contents

Introduction

It is a story as old as time. A stubborn, shell-dwelling, and melodramatic vimmer—envious of the features of modern text editors—spirals into despair before he succumbs to the dark side. This is his config.

Doom is a configuration framework for GNU Emacs tailored for Emacs bankruptcy veterans who want less framework in their frameworks, a modicum of stability (and reproducibility) from their package manager, and the performance of a hand rolled config (or better). It can be a foundation for your own config or a resource for Emacs enthusiasts to learn more about our favorite operating system.

Its design is guided by these mantras:

  • Gotta go fast. Startup and run-time performance are priorities. Doom goes beyond by modifying packages to be snappier and load lazier.
  • Close to metal. There's less between you and vanilla Emacs by design. That's less to grok and less to work around when you tinker. Internals ought to be written as if reading them were part of Doom's UX, and it is!
  • Opinionated, but not stubborn. Doom is about reasonable defaults and curated opinions, but use as little or as much of it as you like.
  • Your system, your rules. You know better. At least, Doom hopes so! It won't automatically install system dependencies (and will force plugins not to either). Rely on doom doctor to tell you what's missing.
  • Nix/Guix is a great idea! The Emacs ecosystem is temperamental. Things break and they break often. Disaster recovery should be a priority! Doom's package management should be declarative and your private config reproducible, and comes with a means to roll back releases and updates (still a WIP).

Check out the FAQ for answers to common questions about the project.

Features

  • Minimalistic good looks inspired by modern editors.
  • Curated and sane defaults for many packages, (major) OSes, and Emacs itself.
  • A modular organizational structure for separating concerns in your config.
  • A standard library designed to simplify your elisp bike shedding.
  • A declarative package management system (powered by straight.el) with a command line interface. Install packages from anywhere, not just (M)ELPA, and pin them to any commit.
  • Optional vim emulation powered by evil-mode, including ports of popular vim plugins like vim-sneak, vim-easymotion, vim-unimpaired and more!
  • Opt-in LSP integration for many languages, using lsp-mode or eglot
  • Support for many programming languages. Includes syntax highlighting, linters/checker integration, inline code evaluation, code completion (where possible), REPLs, documentation lookups, snippets, and more!
  • Support for many tools, like docker, pass, ansible, terraform, and more.
  • A Spacemacs-esque keybinding scheme, centered around leader and localleader prefix keys (SPC and SPCm for evil users, C-c and C-c l for vanilla users).
  • A rule-based popup manager to control how temporary buffers are displayed (and disposed of).
  • Per-file indentation style detection and editorconfig integration. Let someone else argue about tabs vs spaces.
  • Project-management tools and framework-specific minor modes with their own snippets libraries.
  • Project search (and replace) utilities, powered by ripgrep and ivy or helm.
  • Isolated and persistent workspaces (also substitutes for vim tabs).
  • Support for Chinese and Japanese input systems.
  • Save a snapshot of your shell environment to a file for Emacs to load at startup. No more struggling to get Emacs to inherit your PATH, among other things.

Prerequisites

  • Git 2.23+
  • Emacs 27.1–29.3 (Recommended: 29.3 + native-comp)
  • ripgrep 11.0+
  • GNU find
  • OPTIONAL: fd 7.3.0+ (improves file indexing performance for some commands)

Warning

Unstable and pre-release builds of Emacs -- which end in .50, .60, or .9X (e.g. 28.1.91) -- are not officially supported. There is some effort to support Emacs HEAD, however. Follow this Discourse post for details.

Important

Doom is comprised of ~150 optional modules, some of which may have additional dependencies. Visit their documentation or run bin/doom doctor to check for any that you may have missed.

Install

git clone --depth 1 https://github.com/doomemacs/doomemacs ~/.config/emacs
~/.config/emacs/bin/doom install

Then read our Getting Started guide to be walked through installing, configuring and maintaining Doom Emacs.

It's a good idea to add ~/.config/emacs/bin to your PATH! Other bin/doom commands you should know about:

  • doom sync to synchronize your private config with Doom by installing missing packages, removing orphaned packages, and regenerating caches. Run this whenever you modify your private init.el or packages.el, or install/remove an Emacs package through your OS package manager (e.g. mu4e or agda).
  • doom upgrade to update Doom to the latest release & all installed packages.
  • doom doctor to diagnose common issues with your system and config.
  • doom env to dump a snapshot of your shell environment to a file that Doom will load at startup. This allows Emacs to inherit your PATH, among other things.

Roadmap

Doom is an active and ongoing project. To make that development more transparent, its roadmap (and other concerns) are published across three github project boards and a newsletter:

  • Development Roadmap: roughly outlines our goals between release milestones and their progress.
  • Plugins under review: lists plugins we are watching and considering for inclusion, and what their status for inclusion is. Please consult this list before requesting new packages/features.
  • Upstream bugs: lists issues that originate from elsewhere, and whether or not we have local workarounds or temporary fixes for them.
  • Doom's newsletter (not finished) will contain changelogs in between releases.

Getting help

Emacs is no journey of a mere thousand miles. You will run into problems and mysterious errors. When you do, here are some places you can look for help:

  • Our documentation covers many use cases.
  • With Emacs built-in help system documentation is a keystroke away:
    • For functions: SPC h f or C-h f
    • For variables: SPC h v or C-h v
    • For a keybind: SPC h k or C-h k
    • To search available keybinds: SPC h b b or C-h b b
  • Run bin/doom doctor to detect common issues with your development environment and private config.
  • Check out the FAQ or Discourse FAQs, in case your question has already been answered.
  • Search Doom's issue tracker in case your issue was already reported.
  • Hop on our Discord server; it's active and friendly! Keep an eye on the #announcements channel, where I announce breaking updates and releases.

Contribute

PRs Welcome Elisp styleguide Donate on liberapay Donate on paypal

Doom is a labor of love and incurable madness, but I'm only one guy. Doom wouldn't be where it is today without your help. I welcome contributions of any kind!

  • I ❤️ pull requests and bug reports (see the Contributing Guidelines)!
  • Don't hesitate to tell me my Elisp-fu sucks, but please tell me why.
  • Hop on our Discord server and say hi! Help others, hang out or talk to me about Emacs, gamedev, programming, physics, pixel art, anime, gaming -- anything you like. Nourish this lonely soul.
  • If you'd like to support my work financially, buy me a drink through liberapay or paypal. My work contends with studies, adventures in indie gamedev and freelance work. Donations help me allocate more time to my Emacs and OSS capers.

snippets's People

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

snippets's Issues

snippets always append a new line even though I `require-final-newline` to nil

What were you expecting?

I'm trying adding an attribute snippet which should behave like this: <div new-snippet="here"></div>

What actually happened?

I instead got this:

<div new-snippet="here"
></div>

Steps to reproduce

This is my snippet (I made sure it does not contain a any line break/newline):

# -*- mode: snippet -*-
# name: d-tb
# key: d-tb
# --
data-table="$1" d-field="$2" d-type="$3" $0

To enforce that, I also applied this configuration using a heuristic approach since I don't know which works and none of them didn't yield any positive result:

(defun disable-final-newline ()
  "Disable the adding of final newlines in the current buffer."
  (interactive)
  (set (make-local-variable 'require-final-newline) nil))

(add-hook 'snippet-mode 'disable-final-newline)
(add-hook 'web-mode 'disable-final-newline)
(add-hook 'web-mode-hook 'disable-final-newline)
(add-hook 'web-mode-hook (lambda () (setq-local require-final-newline nil)))
(add-hook 'html-mode-hook (lambda () (setq-local require-final-newline nil)))
(customize-set-variable 'require-final-newline nil)

Operating system

Debian Bookworm

Emacs version

GNU Emacs 28.2 (build 2, x86_64-pc-linux-gnu, GTK+ Version 3.24.24, cairo version 1.16.0) of 2022-10-26

Installed commit of doom-snippets

90b1b221f

LaTeX module autocompletion breaks without enabling "snippets" module

What were you expecting?

Whatever auto-completion candidate available should work without problem

What actually happened?

In latex-mode with company completion enabled: hitting enter on a completion candidate pops the following error message:

company-call-backend-raw: Company: backend company-capf error "[yas] ‘yas-expand-snippet’ needs properly setup ‘yas-minor-mode’" with args (post-completion includegraphics)

This problem seems to be caused by three factors:

  1. yasnippets is recursively imported by company-auctex,
  2. yasnippets is not properly configured because snippets is not enabled,
  3. company-yas is included in company backends indiscriminately (this seems to be a problem for more than just latex-mode)

Steps to reproduce

  1. enable latex and company module, disable snippets module
  2. try auto-completion in latex-mode

Operating system

Fedora 39

Emacs version

Emacs 29.3 pgtk+nativecomp (custom built)

Installed commit of doom-snippets

N/A

Filenames are incompatible with Windows

When cloning to a Windows machine, the snippets with special characters don't clone correctly. Does the naming of the files impact functionality at all? If so would it be possible to rename the files. I can open a pull request if that helps? Here are the troublesome filenames:

error: unable to create file +php-laravel-mode/route->: Invalid argument
error: unable to create file go-mode/:=: Invalid argument
error: unable to create file lua-mode/?: Invalid argument
error: unable to create file lua-mode/self:: Invalid argument
error: unable to create file rust-mode/:: Invalid argument
error: unable to create file rust-mode/=>: Invalid argument
error: unable to create file sh-mode/<: Invalid argument
error: unable to create file sh-mode/>: Invalid argument

<s snippet does not expand in org-mode

When I try expanding <s in an org-mode buffer, it just ends up deleting the <s text and not replacing it with a #+BEGIN_SRC...#+END_SRC as expected. Expanding src works as expected, except it can't be undone (but that's a separate issue). Does the < in the key need to be escaped?

Can't undo snippets

This is actually related to the discussion of #6. When I expand a snippet using doom emacs (via TAB), it presents the snippet perfectly, but I can't undo the expansion of the snippet as #6 reported using the basic undo function.

I tried prettying ESC and C-g many times followed by many instances of undo, but the problem is that the snippet has created an undo branch point. In order to reverse it, we need to M-x undo-tree-visualize and then cursor through until we figure out where we intended to go.

I'm new to doom emacs as of yesterday - I've been using spacemacs with the same yasnippets ofr year (I literally copied over my snippets folder into my .doom.d), and in spacemacs I didn't I have problem using undoing.

Here's a gif of the expansion.

I spent far too many hours on this trying to diagnose the problem (avoiding grading finals...). Do you any advice about what to try?

Fundamental-mode snippets pi and phi conflict with julia-latexsub

The snippets pi and phi are defined for fundamental-mode to expand to their respective values (preceded by a #-*- mode: snippet -*- line, but that's a separate problem...).

However, in julia-mode, it's common practice to use LaTeX substitution to insert unicode characters (e.g. \theta followed by TAB runs julia-latexsub-or-indent to produce θ).

I'm not sure how common it is to insert the values of phi and pi in a buffer, but perhaps these could be revised somehow to avoid this conflict? I'm not a snippet master, but maybe there's a way to have them only work if they are whole words? Personally, I'd be inclined to redefine them to pival and phival or similar. Alternatively, is there a way to disable specific snippets without modifying the source of this package?

Chaining snippets

When using doom-snippets-expand to chain snippets

# -*- mode: snippet -*-
# name: imp
# key: imp
# uuid: imp
# condition: t
# --
import `(doom-snippets-expand :uuid "libs")`
# -*- mode: snippet -*-
# name: libs
# key: libs
# uuid: libs
# condition: t                                                    
# --
${1:$$(yas-choose-value '("numpy" "scipy" "matplotlib" "pandas"))}

An extra YY is added before the expansion, so if I select e.g scipy, I get:
import YYscipy

I don't know if this issue is related to the reference to the insertion of an extraneous Y in https://emacs.stackexchange.com/questions/24060/yasnippet-truncates-clipboard-contents

Isn't there a need for a "keyword list convention" or a contribution guide?

Lately, I was browsing the repo to get a gist of naming conventions.

For example, what to name my class snippet? class? Perhaps cls?

With a quick search, I realized that there is no conventions here.
Every contributor gets to make their own snippets the way they want.

This happens while there are tons of similar structures in different languages like the very class I mentioned before.
Why not to name them all cls instead of having all cls, class, cl, etc?
Should we use _ or - in snippet keys?

The other issue was with naming conventions. Some named their snippets like: class ... { ... } and others just class and other notations.

I believe this repo (unlike other repos) needs a convention/robust contribution guide.
It may not seem like a big deal but it is.
As an Emacs newbie, I know it's a turn off that every language has it's own snippet style and every mode has it's own key bindings. When I use cls in VSC, in every language it's cls. I bother myself with remembering every snippet for every langauge.

For me, Doom stood out among other configs because it managed these issues to some extent, most of things "just work" convinently.
However, most is not enough. Starting from this repo I think it would be fantastic if there were more common ground between different modes, languages, binds and snippets.

I assume a refactor + a contribution guide can fix the issue before it's too big and there are too many snippets to edit.
Although, there is the issue that probably old users are used to the old snippets and a changes in them won't be pleasing to them.


Anyways, I thought I need to share my idea on this issue here in the issue tracker rather than discord or somewhere else so it will remain intact and prevent further questions once concluded.

Pardon me for my bad English and if I'm propusing this in a wrong place or my argument is invalid I couldn't find related arguments in closed issues.

Editing or disabling some of the predefined snippets

Sorry for the elementary question.
I am trying to disable of edit one of the latex-mode snippets.
I am running yas-visit-snippet-file, and go to the wanted file (in my case it is the frame snippet). Then I try to edit it but I guess I can't because this snippet is locked. How can I still edit it or override it?

I have defined another snippet with the same key (fr) but now when I type fr TAB I need to choose which snippet I want to use which costs me an extra key. I would like it to insert my new snippet.

`org-mode/chinese_...` snippets evaluation error

What did you expect to happen?

Snippets do not through evaluation errors.

What actually happened?

org-mode/chinese_dollar and org-mode/chinese_link throw:

eval: Symbol’s function definition is void: fcitx--deactivate

Describe your attempts to resolve the issue

No response

Steps to reproduce

  1. Open an Org mode buffer.
  2. Insert the mentioned snippets.

Package commit

28a929663bc56f523bef5f0c8a364258b992f02c

System Information

No response

What is `(%$)` supposed to evaluate to?

Sorry, this is more of a question than an issue, but I noticed your snippets end with `(%$)`. I've pulled bits and pieces from your config, and when I expand one of these snippets, Emacs throws up an elisp error.

Thanks for responding to all of my issues and questions by the way, much appreciated.

No such file or directory doom-snippets-lib after requiring yasnippet from my package

melpa/melpa#6393

When I (require 'yasnippet) from my package first I get linting error "No such file or directory, yasnippet" in my buffer, and package-lint-current-buffer complaining that "Package yasnippet is not installable.", even though "/home/sooqua/.emacs.d/.local/straight/build/yasnippet" is in my load-path and the files are there. Then I'm getting this error when trying to install my package:

There was an unexpected error:
  Error in an autoloads file (doom-autoload-error)
  /home/sooqua/.emacs.d/.local/autoloads.pkg.el
  (file-missing Cannot open load file No such file or directory doom-snippets-lib)

Run the command again with the -d (or --debug) option to enable debug
mode and, hopefully, generate a stack trace. If you decide to file a bug
report, please include it!

Emacs outputs to standard error, so you’ll need to redirect stderr to
stdout to pipe this to a file or clipboard!

  e.g. doom -d install 2>&1 | clipboard-program
Error in Doom Emacs core: doom-autoload-error, "/home/sooqua/.emacs.d/.local/autoloads.pkg.el", (file-missing "Cannot open load file" "No such file or directory" "doom-snippets-lib")

Please help.

Missing plantuml-mode snippets

I'm adding this as a note for somebody to work on them.
They are very much needed honestly.

I'd like to do it myself very much but I don't have a "collection" yet.

[go] spurious space when using `const` snippet in go-mode

What were you expecting?

const [name] [type] = [value]

What actually happened?

const [name][ type] = [value]

The current snippet makes it stick to the const name. The space should not be part of the field.

Steps to reproduce

  1. type const
  2. press tab
  3. examine expansion

Operating system

Fedora Linux 37 amd64

Emacs version

Emacs 30.0.50 (master) w/ native-comp

Installed commit of doom-snippets

not sure, but bug is present in head

`bang` fundamental mode snippet only on first line

The bang fundamental mode snippet should only be available on the first line of a document, since that is the only place that it actually works. This can be achieved by adding # condition: (eq 1 (line-number-at-pos)) to the directives.

erlang-mode snippets

Describe your request

I would like snippets for Erlang. I think the defaults at yasnippets-snippets would be good start.

Briefly explain its use-case

To program comfortably in Erlang?

Accidently triggering nested snippets in LaTeX math

Example:
Say I wanted to write $\frac{c}{2}$. I would do the following:
$frac|$ -> TAB -> frac snippet expansion: $\frac{|}{}$
now I write c and press TAB to move the cursor to the denumenator:
$frac{c|}{}$ -> TAB -> $\frac{\cite{|}}{}$
The cite snippet expanded accidently!

This is solely an issue with a single-trigger-letter snippets inside math: pretty match only in math you'd write a single letter and press tab, NOT expecting the letter to expand into a snippet.

Possible workarounds:

  • Disable nested snippet expansion: inconvinient, they are generally very useful
  • Add a condition to the single-letter snippets so they don't expand in math envs:
    I tried Doing that using (texmathp) from auctex, but it doesn't work while inside a nested snippet; something in yasnippet messes that up. I haven't look into what exacly yet tho.
  • Change the trigger key of snippets cite, gls... not to be a single letter

Problem defining snippets

Snippets defined in .doom.d/snippets seem to work fine. However snippets defined using the yas-define-snippets function don't seem to be working properly. A minimum example file loaded from .doom.d/config.el is listed below to indicate how I am using it.

In python mode some snippets like np expands fine, but many of the other snippets defined do not expand, or trigger company completion.

In asy-mode only the snippets defined in the doom.d/snippets/asy-mode subdirectory seem to be recognized, even though a file with an asy extension opens correctly in asy-mode.

I prefer to use the yas-define-snippets function to collect together multiple snippets in one file and I have used this approach before. Would this be possible with doom-emacs? Thanks.

;;; ~/.doom.d/+yas.el -*- lexical-binding: t; -*-

(load! "lisp/asy-mode.el" )
(autoload 'asy-mode "asy-mode.el" "Asymptote major mode." t)
(add-to-list 'auto-mode-alist '("\\.asy$" . asy-mode))

(after! snippets
  (yas-define-snippets
   'python-mode
   '(
     ("pd" "import pandas as pd\n$0" "pandas")
     ("np" "import numpy as np\n$0" "numpy")
     ("sp" "import scipy as sp\n$0" "scipy")))
  (yas-define-snippets
   'asy-mode
   '(
     ("gm" "import geometry;\n$0" "i_geometry")
     ("PI" "path ${1:P} = ${2:pA}--${3:pB};\n$0" "pathI"))))

Labels in LaTeX snippets

Can you add a % at the end of the line preceding labels so chktex doesn't complain about potentially getting page numbers wrong?

doom sync is giving me "Symbol's function definition is void" when doing a fresh install

What did you expect to happen?

When doing doom sync i expected it to do a full sync.

What actually happened?

What i saw after doing a doom sync was a this error when compiling doom-snippets

Synchronizing your config with Doom Emacs...
Regenerating envvars file at "/.emacs.d/.local/env"
✓ Successfully generated "
/.emacs.d/.local/env"
Installing packages...
- Checked out doom-snippets: afe549b
→ Building doom-snippets...
x There was an unexpected error
Message: Symbol's function definition is void
Data: (void-function . emacs-lisp-mode-mode)
Backtrace:
(emacs-lisp-mode-mode)
(hack-one-local-variable mode emacs-lisp-mode)
(hack-local-variables-apply)
(hack-local-variables no-mode)
(normal-mode t)
(byte-compile-file "/home/mslot/.emacs.d/.local/straight/build-28.0.50/doo
(byte-recompile-file "/home/mslot/.emacs.d/.local/straight/build-28.0.50/d
(#[0 "\304\242\205\332\300\304\242@\240\210\312\313\300\242"\210\314\30
(byte-recompile-directory "/home/mslot/.emacs.d/.local/straight/build-28.0
(progn (fset #'write-region vnew) (ignore write-region) (byte-recompile-di

Describe your attempts to resolve the issue

I have tried to do a full reinstall:

  1. rm -rf ~/git/emacs
  2. git clone git://git.savannah.gnu.org/emacs.git ~/git/emacs
  3. ./autogen
  4. ./configure --with-native-compilation -with-json --with-modules --with-harfbuzz --with-compress-install \ --with-threads --with-included-regex --with-x-toolkit=lucid --with-zlib --with-jpeg --with-png --with-imagemagick --with-tiff --with-xpm --with-gnutls \ --with-xft --with-xml2 --with-mailutils
  5. make
  6. sudo make install
  7. git clone --depth 1 https://github.com/hlissner/doom-emacs ~/.emacs.d
  8. doom install - the bin is already in my path

This gives me the same error.

I have also tried to do a doom build followed by a doom sync. Still the same.

Steps to reproduce

  1. rm -rf ~/git/emacs
  2. git clone git://git.savannah.gnu.org/emacs.git ~/git/emacs
  3. ./autogen
  4. ./configure --with-native-compilation -with-json --with-modules --with-harfbuzz --with-compress-install \ --with-threads --with-included-regex --with-x-toolkit=lucid --with-zlib --with-jpeg --with-png --with-imagemagick --with-tiff --with-xpm --with-gnutls \ --with-xft --with-xml2 --with-mailutils
  5. make
  6. sudo make install
  7. git clone --depth 1 https://github.com/hlissner/doom-emacs ~/.emacs.d
  8. doom install - the bin is already in my path
  9. Optionally: doom build

System Information

https://pastebin.com/t1CPXhHT

Org mode: Duplicate snippets

What would you like to know?

Hi!

I was just working on cleaning the Org mode snippets, and realized that most of them are duplicates.

For example, the snippet begin_src calls the src snippet. In my opinion, we should remove all duplicates and stick to one naming scheme. Either, we use the begin_X snippets, or we use the X snippets. I prefer X without begin. I would be willing to implement these changes. I strongly believe that simplifying the snippets is better than maintaining duplicate snippets.

Please add uuid to all snippets

I don't want to ignore this package but I'm working on my snippets now and I find more and more of them conflicting with yours. Some of them are really unnecessary, for example javascript's "con" - it can stand for "constructor" and actually be useful, right now it just types "st" for me and lets me use tab instead of having to type " = ", and blocks me on the left side of semicolon;

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.