{"id":24056823,"url":"https://github.com/jasonleelunn/present.nvim","last_synced_at":"2026-06-08T16:05:56.358Z","repository":{"id":271629680,"uuid":"914066598","full_name":"jasonleelunn/present.nvim","owner":"jasonleelunn","description":"Present markdown files inside of Neovim 📽️","archived":false,"fork":false,"pushed_at":"2025-10-17T19:54:42.000Z","size":923,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-10-18T01:58:17.913Z","etag":null,"topics":["lua","markdown","neovim-plugin"],"latest_commit_sha":null,"homepage":"","language":"Lua","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/jasonleelunn.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-01-08T22:08:20.000Z","updated_at":"2025-10-17T19:54:45.000Z","dependencies_parsed_at":null,"dependency_job_id":"688ea709-334f-4be0-bf88-8d05de2570fa","html_url":"https://github.com/jasonleelunn/present.nvim","commit_stats":null,"previous_names":["jasonleelunn/present.nvim"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/jasonleelunn/present.nvim","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jasonleelunn%2Fpresent.nvim","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jasonleelunn%2Fpresent.nvim/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jasonleelunn%2Fpresent.nvim/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jasonleelunn%2Fpresent.nvim/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/jasonleelunn","download_url":"https://codeload.github.com/jasonleelunn/present.nvim/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jasonleelunn%2Fpresent.nvim/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34069529,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-08T02:00:07.615Z","response_time":111,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["lua","markdown","neovim-plugin"],"created_at":"2025-01-09T05:27:11.115Z","updated_at":"2026-06-08T16:05:56.353Z","avatar_url":"https://github.com/jasonleelunn.png","language":"Lua","funding_links":[],"categories":[],"sub_categories":[],"readme":"# `present.nvim`\n\nA Neovim plugin for presenting markdown files as slideshows.\n\n![present.nvim GIF](./assets/present.gif)\n\n# Usage\n\nStart a presentation from the current buffer by calling `start_presentation` with no arguments, or optionally pass a table with a `filepath` field to present a specific file;\n\n```lua\nrequire(\"present\").start_presentation({\n    filepath = \"/path/to/file.md\" -- optional argument\n})\n```\n\nor just run the `:PresentStart \u003cfilepath?\u003e` command, optionally passing a file path to present\n\n# Configuration\n\nCalling the `setup` function is optional if you want to pass any configuration options, the following table shows all valid configuration options with their default values;\n\n```lua\nrequire(\"present\").setup({\n    -- whether the chosen separator character(s) should be removed from the slide header\n    hide_separator_in_title = true,\n    -- a list of lua matching patterns to use as slide boundaries\n    -- lines matching one of these separators will become slide titles in the header\n    separators = { \"^# \" },\n    -- options to control the text displayed in the footer\n    footer = {\n      -- the text displayed on the left side of the footer, defaults to the format shown\n      -- set this equal to an empty string for no text\n      left_text = \"\u003ccurrent_slide_number\u003e / \u003ctotal_slide_count\u003e | \u003cfilename\u003e\",\n      -- the text displayed on the right side of the footer, defaults to the current date in the format shown\n      -- set this equal to an empty string for no text\n      right_text = \"YYYY-MM-DD\",\n    },\n    -- the normal mode keymaps available while in presentation mode, see the `Keymaps` section below\n    keymaps = {\n      previous_slide = \"p\",\n      next_slide = \"n\",\n      first_slide = \"f\",\n      last_slide = \"e\",\n      end_presentation = \"q\",\n      execute_code_blocks = \"X\",\n      close_execution_output = \"x\",\n    },\n    -- vim options that will be modified when in presentation mode\n    -- you can pass any valid vim options here to customise how presentation mode behaves\n    -- see :help option-list to see all valid fields for this table\n    presentation_vim_options = {\n      cmdheight = 0,\n      conceallevel = 0,\n      hlsearch = false,\n      linebreak = true,\n      wrap = true,\n    },\n    -- the default code executors available, see the `Live Code Block Execution` section below\n    executors = {\n      go = execution.execute_go_code,\n      javascript = execution.create_system_executor(\"node\"),\n      lua = execution.execute_lua_code,\n      python = execution.create_system_executor(\"python\"),\n      rust = execution.execute_rust_code,\n    },\n})\n```\n\n# Live Code Block Execution\n\nYou can execute code inside markdown code blocks on a slide, e.g.\n\n```lua\nprint(\"Hello world!\")\n```\n\nand the result will be displayed in a floating window\n\n- Execution functions are provided for `lua`, `go`, `rust`, `python`, and `javascript` by default\n- You can add your own to the `executors` table in the `setup` config table\n- The default executors may not be compatible with your system and you may need to write a custom executor. See `lua/present/execution.lua` for example implementations\n- For interpreted languages, you can use the `create_system_executor` utility function provided by `present.nvim` to easily create a new executor;\n\n```lua\nlocal present = require(\"present\")\n\npresent.setup({\n    executors = {\n        ruby = present.create_system_executor(\"ruby\")\n    }\n})\n```\n\n# Keymaps\n\nThese keymaps are active in normal mode when presenting a file. You can customise them using the `keymaps` table in the config table passed to `setup` (see [Configuration](#configuration) above)\n\n| key | description                          |\n| --- | ------------------------------------ |\n| `p` | move to the previous slide           |\n| `n` | move to the next slide               |\n| `f` | move to the first slide              |\n| `e` | move to the last slide               |\n| `q` | quit the presentation                |\n| `X` | execute the code blocks on the slide |\n| `x` | close the code execution output      |\n\n# Developing locally\n\n- This project requires the following development dependencies to be installed:\n  - [`just`](https://github.com/casey/just) (command runner)\n  - [`watchexec`](https://github.com/watchexec/watchexec) (file watcher)\n  - [`plenary.nvim`](https://github.com/nvim-lua/plenary.nvim) plugin/library for testing\n    - the plenary repo must be cloned as a sibling directory to this repo by default, i.e. available at `../plenary.nvim/`\n    - alternatively the `PLENARY_NVIM_DIR` env var can be set to provide a different location on your system\n- Run the entire test suite with `just test`\n- Run the entire test suite in watch mode with `just test-watch`\n- Run `just --list` for optional arguments and more info\n\n# Acknowledgements\n\nInspired by and adapted from @tjdevries [\"Neovim Plugin from Scratch\" YouTube series](https://www.youtube.com/watch?v=VGid4aN25iI\u0026list=PLep05UYkc6wTyBe7kPjQFWVXTlhKeQejM\u0026index=18)\n\nSee also [tjdevries/present.nvim](https://github.com/tjdevries/present.nvim)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjasonleelunn%2Fpresent.nvim","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjasonleelunn%2Fpresent.nvim","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjasonleelunn%2Fpresent.nvim/lists"}