Coder Social home page Coder Social logo

zen-mode.nvim's Introduction

🧘 Zen Mode

Distraction-free coding for Neovim >= 0.5

image

✨ Features

  • opens the current buffer in a new full-screen floating window
  • doesn't mess with existing window layouts / splits
  • works correctly with other floating windows, like LSP hover, WhichKey, ...
  • you can dynamically change the window size
  • realigns when the editor or Zen window is resized
  • optionally shade the backdrop of the Zen window
  • always hides the status line
  • optionally hide the number column, sign column, fold column, ...
  • highly customizable with lua callbacks on_open, on_close
  • plugins:
    • disable gitsigns
    • hide tmux status line
    • increase Kitty font-size
    • increase Alacritty font-size
    • increase wezterm font-size
    • increase Neovide scale factor and disable animations
  • Zen Mode is automatically closed when a new non-floating window is opened
  • works well with plugins like Telescope to open a new buffer inside the Zen window
  • close the Zen window with :ZenMode, :close or :quit

⚡️ Requirements

  • Neovim >= 0.5.0
    • Zen Mode uses the new z-index option for floating windows
    • ❗ only builds newer than May 15, 2021 are supported
  • Twilight is optional to dim inactive portions of your code

📦 Installation

Install the plugin with your preferred package manager:

-- Lua
{
  "folke/zen-mode.nvim",
  opts = {
    -- your configuration comes here
    -- or leave it empty to use the default settings
    -- refer to the configuration section below
  }
}

⚙️ Configuration

Zen Mode comes with the following defaults:

{
  window = {
    backdrop = 0.95, -- shade the backdrop of the Zen window. Set to 1 to keep the same as Normal
    -- height and width can be:
    -- * an absolute number of cells when > 1
    -- * a percentage of the width / height of the editor when <= 1
    -- * a function that returns the width or the height
    width = 120, -- width of the Zen window
    height = 1, -- height of the Zen window
    -- by default, no options are changed for the Zen window
    -- uncomment any of the options below, or add other vim.wo options you want to apply
    options = {
      -- signcolumn = "no", -- disable signcolumn
      -- number = false, -- disable number column
      -- relativenumber = false, -- disable relative numbers
      -- cursorline = false, -- disable cursorline
      -- cursorcolumn = false, -- disable cursor column
      -- foldcolumn = "0", -- disable fold column
      -- list = false, -- disable whitespace characters
    },
  },
  plugins = {
    -- disable some global vim options (vim.o...)
    -- comment the lines to not apply the options
    options = {
      enabled = true,
      ruler = false, -- disables the ruler text in the cmd line area
      showcmd = false, -- disables the command in the last line of the screen
      -- you may turn on/off statusline in zen mode by setting 'laststatus' 
      -- statusline will be shown only if 'laststatus' == 3
      laststatus = 0, -- turn off the statusline in zen mode
    },
    twilight = { enabled = true }, -- enable to start Twilight when zen mode opens
    gitsigns = { enabled = false }, -- disables git signs
    tmux = { enabled = false }, -- disables the tmux statusline
    todo = { enabled = false }, -- if set to "true", todo-comments.nvim highlights will be disabled
    -- this will change the font size on kitty when in zen mode
    -- to make this work, you need to set the following kitty options:
    -- - allow_remote_control socket-only
    -- - listen_on unix:/tmp/kitty
    kitty = {
      enabled = false,
      font = "+4", -- font size increment
    },
    -- this will change the font size on alacritty when in zen mode
    -- requires  Alacritty Version 0.10.0 or higher
    -- uses `alacritty msg` subcommand to change font size
    alacritty = {
      enabled = false,
      font = "14", -- font size
    },
    -- this will change the font size on wezterm when in zen mode
    -- See alse also the Plugins/Wezterm section in this projects README
    wezterm = {
      enabled = false,
      -- can be either an absolute font size or the number of incremental steps
      font = "+4", -- (10% increase per step)
    },
    -- this will change the scale factor in Neovide when in zen mode
    -- See alse also the Plugins/Wezterm section in this projects README
    neovide = {
        enabled = false,
        -- Will multiply the current scale factor by this number
        scale = 1.2
        -- disable the Neovide animations while in Zen mode
        disable_animations = {
                neovide_animation_length = 0,
                neovide_cursor_animate_command_line = false,
                neovide_scroll_animation_length = 0,
                neovide_position_animation_length = 0,
                neovide_cursor_animation_length = 0,
                neovide_cursor_vfx_mode = "",
            }
    },
  },
  -- callback where you can add custom code when the Zen window opens
  on_open = function(win)
  end,
  -- callback where you can add custom code when the Zen window closes
  on_close = function()
  end,
}

🚀 Usage

Toggle Zen Mode with :ZenMode.

Alternatively you can start Zen Mode with the Lua API and pass any additional options:

require("zen-mode").toggle({
  window = {
    width = .85 -- width will be 85% of the editor width
  }
})

🧩 Plugins

Wezterm

In order to make the integration with wezterm work as intended, you need to add the following function to your wezterm config:

wezterm.on('user-var-changed', function(window, pane, name, value)
    local overrides = window:get_config_overrides() or {}
    if name == "ZEN_MODE" then
        local incremental = value:find("+")
        local number_value = tonumber(value)
        if incremental ~= nil then
            while (number_value > 0) do
                window:perform_action(wezterm.action.IncreaseFontSize, pane)
                number_value = number_value - 1
            end
            overrides.enable_tab_bar = false
        elseif number_value < 0 then
            window:perform_action(wezterm.action.ResetFontSize, pane)
            overrides.font_size = nil
            overrides.enable_tab_bar = true
        else
            overrides.font_size = number_value
            overrides.enable_tab_bar = false
        end
    end
    window:set_config_overrides(overrides)
end)

If you need this functionality within tmux, you need to add the following option to your tmux config:

set-option -g allow-passthrough on

See also: wez/wezterm#2550

Neovide

Neovide config will only be executed if vim variable g:neovide is set to 1, which Neovide does automatically on startup. By modifying table plugins.neovide.disable_animations, you can control which variables in g: namespace get temporarily overriden while in Zen mode. By default, all animations are disabled. See Neovide documentation for possible values.

Inspiration

zen-mode.nvim's People

Contributors

anatolelucet avatar cockytrumpet avatar coinator avatar ditsuke avatar ekorchmar avatar folke avatar github-actions[bot] avatar hasansujon786 avatar marcelbeumer avatar mattspalmer avatar meijieru avatar mendes-davi avatar mikesmithgh avatar mrossinek avatar nasanos avatar nmrnv avatar pbhdk avatar shiradofu avatar vladimir-popov avatar wieerd avatar xxiaoa 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

zen-mode.nvim's Issues

tmux in kitty

Hi,

if both kitty and tmux are enabled. Font size increase is not set if ZenMode is toggled in tmux in kitty. Font increase works if nvim is started directly in kitty. Statusline toggle in tmux also works.

plugins = {
  tmux = { enabled = true }, -- disables the tmux statusline
  kitty = {
    enabled = true,
    font = "+4", -- font size increment
  },
},

Great plugin, thank you!

Allow width / height to take functions that return a number

Since I sometimes have font size very small (when I'm working) and sometimes very big (when I'm streaming), it'd be nice to be able to have the default for width and height to be able to take a function that returns a number, so I can dynamically calculate the dimensions of the window.

I do this here: https://github.com/nvim-telescope/telescope.nvim/blob/master/lua/telescope/config/resolve.lua and would definitely consider moving this code out of here -> plenary if you wanted to re-use it and we thought it could be useful as a more general tool.

I think it's quite a fun little module :)

Segmentation fault when using with fzf

I am afraid that I get a segmentation fault with it and fzf.vim/fzf.

  1. open fzf history with :History!, open a file
  2. toggle zen mode on
  3. open fzf history with :History!, open a file

Segmentation fault (core dumped)

NVIM v0.5.0-dev+1326-ge0a01bdf7 (latest today)

Callback function from README example doesn't work

I'm trying to automatically toggle limelight.vim when entering and leaving Zen Mode. Using the example configuration from the README as the basis, here's the minimal init.vim I'm testing it with in Neovim v0.5.0-dev+1339-g5d9c56012:

let $PLUGIN_DIRECTORY = '~/.local/share/nvim/plugtest'
packadd zen-mode.nvim

lua << EOF
require("zen-mode").setup {
  window = {
    backdrop = 0.65, -- shade the backdrop of the Zen window. Set to 1 to keep the same as Normal
    width = 100, -- width of the Zen window
    height = 40, -- height of the Zen window
    options = {
      list = true, -- enable/disable whitespace characters
    },
  },
  plugins = {
    options = {
      enabled = true,
      ruler = false, -- disables the ruler text in the cmd line area
      showcmd = false, -- disables the command in the last line of the screen
    },
    gitsigns = { enabled = false }, -- disables git signs
    tmux = { enabled = false }, -- disables the tmux statusline
    kitty = {
      enabled = false,
    },
    -- callback where you can add custom code when the Zen window opens
    on_open = function(win)
      vim.cmd('Limelight')
    end,
    -- callback where you can add custom code when the Zen window closes
    on_close = function()
      vim.cmd('Limelight!')
    end,
  },
}
EOF

Whenever I start Neovim by running nvim -u ~/.config/nvim/init.test.vim --noplugin, I receive an error:

Error detected while processing /home/maxigaz/.config/nvim/init.test.vim:
line   35:
E5108: Error executing lua .../pack/packer/start/zen-mode.nvim/lua/zen-mode/config.lua:67: attempt to index a function value

I don't know what's wrong, but I don't get any errors if I remove both callback functions, and everything else works fine.

Correct behaviour with tmux

Hello.
I've noticed strange behaviour on tmux = { enable = trure} option.
My bottom tmux pane hide with statusline as well but zen-mode window is have some frame on top and bottom which could be the part of the buffer.
Take a look at the screencast please:

Peek.2021-06-18.15-08.mp4

Don't get me wrong I like hiding tmux panes feature when zenmode enable but could it be separate option?
Something like
tmux = { statusline = true, panes = true}
And could you fix it to show zen-buffer for whole height in this case?

LSP diagnostics and signature popup window has wrong background colour

Correct:
Screenshot from 2021-06-03 10-02-06
In zen mode there are grey bars on the left and right of the diagnostic window, and the background is now black instead of grey:
Screenshot from 2021-06-03 10-03-25
also the exact same thing with the signature completion:
Screenshot from 2021-06-03 10-08-01

I am using:

-- Show diagnostics on cursor over
vim.cmd [[autocmd CursorHold * lua vim.lsp.diagnostic.show_line_diagnostics()]]
-- Show function signature help while typing
vim.cmd [[autocmd CursorHoldI * silent! lua vim.lsp.buf.signature_help()]]

Add an option to enable tab bar/barbar.nvim

I looked through the configuration options and couldn't find an option to enable the tab bar, or in my case, I would like to use it in combination with https://github.com/romgrk/barbar.nvim. I would like to stay in ZenMode as much as possible but have to switch back and forth to see which buffer I'm currently in and to navigate to the buffer that I need.

Please, consider adding an option to support barbar (not sure if that's different from the tab bar).

Thanks for the great plugin though.

Zen Mode doesn't disable Gitsigns

Hey, thanks you this amazing plugin.

Gitsigns are not being disable, I'm just using the default config. Which is supposed to disable gitsigns by default.

2021-May-20_1

I'm don't have any custom settings , just installed the plugin and use it as it comes, also tried copying the default config from the README into my init.lua but that didn't work either.

I also updated with :PackerSync but still nothing, the gitsigns are still there.

Integration with lspconfig and lspsaga

Similarly to the gitsigns plugin, is there an integration with lsp to disable eg virtual text diagnostics and code action prompt from lspsaga in zen mode?

Zenmode overwrites vim.o.fillchars

I have in my init.lua

vim.o.fillchars = [[eob: ,fold: ,foldopen:,foldsep: ,foldclose:]]

zen-mode.nvim overwrites this.

How can I keep my setting active in :ZenMode?

Option to not disable status line? Or include word count?

Thanks for Zen Mode, I really love it for writing prose.

One thing I built for my lualine config is a word count for when I am in txt/md files. It shows the word count for the document, or if text is selected, the words in that selection:

image

Would you consider an option to enable a status line plugin like Lualine? Or perhaps a word count could be incorporated in Zen Mode?

Here is the little function I use:
https://gist.github.com/benfrain/97f2b91087121b2d4ba0dcc4202d252f#file-setup-lualine-lua-L1-L13

`require("gitsigns")._get_config()` is now deprecated

Hey @folke! just wanted to let you know that this is depracted (or will eventually be). I raised an issue in the authors' repo about exposing the config and he made this, which is what you are using now.

15 days ago (at the time of writing) he commented back this saying that there was a newer way of getting the config and that he was going to remove the older method eventually:

I plan to remove _get_config() soon just to be warned

I'm not sure if it's gone now, but you should probably update that as soon as possible 👍

Support cmd height > 1

When cmd height is bigger than 1, I can't see my code at the bottom, and the cursor is weird:

image

Synchronize scroll position with the original window

First off, this plugin is freaking gold, well done! I have been using it full time for about a week now and I can't go back.

One thing I have noticed that tends to put a stick in my wheels is that the scroll position of my original window doesn't change. It tends to go like this:

  • I need to focus on a specific window for a while, so I enter Zen mode
  • I spend 5 minutes writing a bunch of code
  • I now want to see my ALE Warnings and/or check the contents of a different window, so I exit Zen mode
  • The scroll position I had in the Zen window is lost
  • I spend 10 seconds trying to recover my scroll position, my flow completely broken 😄
  • (This is exacerbated by the fact that I unfortunately tend to work with large YANG models, which can easily be thousands of lines long)

I feel like it would be far more intuitive if the scroll position in the floating window was replicated in the original window.

This could be done continuously using the WinScrolled event, or the scroll position could be transferred once when Zen mode is closing.

The advantage of the former solution is that plugins that work by scroll position (such as dstein64/nvim-scrollview) might just work by default, since the scroll position of the original window is being updated continuously to reflect the Zen window.

Method For Quitting When Closing ZenMode Window?

Hello,

I use nvim for mostly writing not coding and am interested in using this plugin to have a more word processor feel when writing. The one big annoyance I have with using this plugin is that when I close the ZenMode window or use :q to exit it just toggles the ZenMode window instead of exiting from nvim. Is there any way to make it so that nvim exits instead of just toggling the window?

[Request] Remove global for `tmux set status off `

I have 2 tmux sessions open. When I enter tmux set -g status off in one of the sessions (outside of nvim), it doesn't switch off tmux status.
However, tmux set status off does work.

Would it be right to make that change from the plugin in zen-mode too? I removed -g from the plugins.lua in the zen-mode plugin and that does make the status line enable/disable as expected.

wirte area width problem

set width=70, but it`s not be 70. is it bug or my nvim setting problem?

iShot_2022-06-09_10.59.45.mp4

Help please: How to execute command on open/close?

I'm trying to disable scrollbars from https://github.com/dstein64/nvim-scrollview when zen-mode is activated. Here's what I came up with, but I can't get it work. What's wrong with my syntax?

    use {
      "folke/zen-mode.nvim",
      config = function()
        require("zen-mode").setup {
          on_open = function(win)
            vim.api.nvim_command('ScrollViewDisable')
          end,
          on_close = function()
            vim.api.nvim_command('ScrollViewEnable')
          end,
        }
      end
    }

EDIT: This issue seems to have resolved itself after I updated my packages with :PackerSync, and the on_open, on_close functions don't seem to be required. Perhaps it was an issue with a dependency

Closing ZenMode re-opens initial file, instead of current file

Steps to reproduce problem

  1. open any file
  2. call :ZenMode (to activate)
  3. open another file. This file will open in the same ZenMode window
  4. call :ZenMode (to deactivate)

expected result

When I deactivate ZenMode, I expect to see the file that I'm currently viewing (the last file I opened)

actual result

I see the first file I opened. The file which I had open when I activated ZenMode

Cursor does not jump to correct position when ZenMode is loaded with autocmd

Hello!

When using the following autocommand to turn on zenmode for a markdown file, the cursor visually appears in the wrong place relative to where it is on the current line (to the left or right of where it's supposed to be, depending on window size).

autocmd FileType markdown :ZenMode

edit: Running neovim 0.6.1

Number option fails to work

Copying the default config into my init.vim and editing it just to uncomment the number option, it fails to disable the numbers column even though number = false.

How to Exit ZenMode With ':q'?

I noticed that zen-mode simply untoggles itself when exiting a buffer running zen-mode with :q. This seems to be common in Goyo-like plugins, but as I use zen-mode for mainly writing this leads to me having to exit twice. Is there any official way to have :q and ZQ and such exit zen-mode instead of toggling it?

Treesitter error on empty buffer and markdown files

Maybe I'm ignoring something, but when I run ZenMode with a markdown file it throws me this error:

Error detected while processing WinScrolled Autocommands for "*":
E5108: Error executing lua /usr/share/nvim/runtime/lua/vim/treesitter/language.lua:25: no parser for 'markdown' language, see :help treesitter-parsers

And as far as I know there is no parser for markdown on neovim's treesitter.

Also when opening ZenMode on empty buffer it shows this:

Error detected while processing WinScrolled Autocommands for "*":
E5108: Error executing lua Failed to load parser: uv_dlopen: /home/luis/.local/share/nvim/site/pack/packer/start/nvim-treesitter/parser/.gitignore: file too short

I'm using neovim latest version 0.5.0 from the Arch Linux official repo

If the problem is on me, I'd appreciate any help. Thanks in advance.

Zen mode forgets the changelist of the previous window

I'm not sure if this is easily tackleable, however it is something that I would love to be added to zen-mode. I'd be happy to look into implementing this myself sometime in the coming week or two, as I use the g; command a lot to jump to my most recent edit. However when I toggle zen mode on/off, because it puts it in a new floating buffer the changelist of the previous window is forgotten. I'm mostly putting this here as a reminder to myself to look into trying to find a workaround to push as a PR for this, as I doubt many people use the g; command as heavily as I do. Thanks for all of your hard work on this plugin, lua-dev.nvim, and tokyonight! I've been loving using all of the above on a daily basis 😄

[BUG?] ZenMode doesnt disable GitSigns

Similarly to #11, entering ZenMode doesnt disable gitsigns for me. I've tried both gitsigns enabled = true and enabled = false just in case, but it doesnt make a difference. I've also tried loading the plugin after gitsigns in my packer config. The plugin that Im using is lewis6991/gitsigns.nvim.
Changing other settings like width or twilight work propperly.

image

PD: Im using Aniseed to configure vim in fennel. It should't make a difference at all.

Options passed to `toggle()` are not set

I’ve set default options for Zen Mode in my lua config, and a special call to require("zen-mode").toggle() for a special prose writing mode. However, when I use this mode, it seems that the only options set are the default ones.

Here’s an extract of my config:

map("n", "<leader>z", [[ <Cmd> ZenMode<CR>]], opt)
-- Writing mode
local writing_mode = false

function toggle_writing_mode()
  require("zen-mode").toggle({
    window = {width = 100},
    options = {signcolumn = "no", linebreak = true, cursorline = false, colorcolumn = false, spell=true},
  })
  if writing_mode then
    base16(base16.themes["solarized-dark"], true)
    set_highlights()
    writing_mode = false
  else
    base16(base16.themes["solarized-light"], true)
    writing_mode = true
  end
end

map("n", "<leader>Z", [[ <Cmd> lua toggle_writing_mode()<CR>]], opt)

-- Zenmode
require("zen-mode").setup {
  plugins = {
    kitty =  {
      enabled = true,
      font = "+2"
    }
  },
}

When using the toggle_writing_mode function, the colorscheme is correctly applied, but none of the options in the toggle() call. However, the custom width is applied.

Sync zen-window and source window after restoring

Hey. After closing zen-mode window restores with it previous state. I mean cursor position and buffer (file) content.
Is it possible to implement option to sync ordinary window with zen-window after restoring?
Imagine you go to definition from zen-mode buffer to another and then exit zen-mode. You will see your previous buffer...
Hope you'll get what I mean.

`window.width` not working in `setup` in LunarVim

I'm trying to custom window.width in LunarVim with the following:

-- Additional Plugins
lvim.plugins = {
  {
    "folke/zen-mode.nvim",
    config = function()
      require("zen-mode").setup {
        window = {
          width = 320,
        }
      }
    end
  }
}

Maybe I'm missing something. Any thoughts?

CoC popup location

(I don't know if this is a problem with zen-mode or something else.)

When using zen-mode with coc-clangd the popups are not displayed at the correct location. Instead of the position of the zen window, the underlying split position is used to compute the location.

In the image, the information from coc is shifted to the left. (The popup menu for autocompletion works fine.)
zen-mode

Provide on_open_pre, on_open_post, on_close_pre and on_close_post?

Hi. I wish to toggle xiyaowong/nvim-transparent OFF before entering ZenMode, and ON when exiting it. The currently provided hooks on_open and on_close are not working exactly as I wish. I need to require('transparent').toggle_transparent(0) before zen-mode.nvim applies any of its settings, otherwise I lose backdrop due to transparent background (zen-mode.nvim should not know about previous transparency at all and work as if I was just using opaque background). I had similar issues with Goyo and maintained a fork with a bunch of fixes, one of those was having clearer hooks on_open_pre, on_open_post, on_close_pre and on_close_post.

highlighting of current indention level

i'm a little behind the curb in keeping up with the latest neovim, but did notice in your README that you have highlighting of your current indention level when working with nested indention and indent lines.

is the highlighting specific to neovim ≥ 0.5 or can it be achieved with neovim 0.43 ? or it specific to this plugin? i viewed several source files but didn't see anything that jumped out at me. (no pun)

Please add ZenMode on/off switch.

ZenMode toggle does not always do the trick. One may want to simply switch it off in a script, without worrying if ZenMode is currently on. Hopefully I haven't missed something in docs.

`window.width` not quite matching the `col` setting

I've got my colorcolumn set to 80, and window.width set to 80 and the resulting window doesn't line up.

I'm going to do some more robust testing, but I think that the width calculation doesn't include the linenumber column… on files with 100+ lines, it's off by three characters.

Unable to autocommand ZenMode in init.lua (neovim 0.6.1)

Hi
I'd like to automatically start ZenMode everytime a markdown file is opened. To that end I wrote to my init.lua (neovim 0.6.1):

vim.cmd [[
au FileType markdown,mkd ZenMode
]]

When a markdown is opened the plugin starts but the buffer is limited to the first page, ie I am unable to scroll down the file.

How am I supposed to call ZenMode? How can I call it together with other plugins (like Pencil)?
This is my first init.lua, so hopefully the question does not sound too stupid.
Thanks for your help

Cursor jumps one line down when opening ZenMode

When I open ZenMode, the cursor seems to jump one line down each time.

I assume you're setting the cursor's position in the new buffer based on where the cursor was before opening ZenMode. But if it's really the case, I can't figure out where this is in the code.
I can try to fix this, but I might need a bit of help to find out where / how the cursor position is set in the code 🙂

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.