{"id":21304760,"url":"https://github.com/nrepl/incomplete","last_synced_at":"2025-08-27T19:13:19.025Z","repository":{"id":62433992,"uuid":"397168057","full_name":"nrepl/incomplete","owner":"nrepl","description":"A simple code completion library","archived":false,"fork":false,"pushed_at":"2022-06-21T04:39:53.000Z","size":25,"stargazers_count":45,"open_issues_count":0,"forks_count":0,"subscribers_count":5,"default_branch":"main","last_synced_at":"2025-08-21T13:41:57.845Z","etag":null,"topics":["clojure","code-completion"],"latest_commit_sha":null,"homepage":"","language":"Clojure","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/nrepl.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":".github/CONTRIBUTING.md","funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null},"funding":{"github":"bbatsov","patreon":"bbatsov","ko_fi":"bbatsov","open_collective":"nrepl","liberapay":"bbatsov","custom":"https://www.paypal.me/bbatsov"}},"created_at":"2021-08-17T08:18:39.000Z","updated_at":"2025-04-07T12:56:30.000Z","dependencies_parsed_at":"2022-11-01T20:45:52.876Z","dependency_job_id":null,"html_url":"https://github.com/nrepl/incomplete","commit_stats":null,"previous_names":[],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/nrepl/incomplete","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nrepl%2Fincomplete","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nrepl%2Fincomplete/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nrepl%2Fincomplete/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nrepl%2Fincomplete/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/nrepl","download_url":"https://codeload.github.com/nrepl/incomplete/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nrepl%2Fincomplete/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":272366742,"owners_count":24922218,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-08-27T02:00:09.397Z","response_time":76,"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":["clojure","code-completion"],"created_at":"2024-11-21T16:15:52.674Z","updated_at":"2025-08-27T19:13:18.992Z","avatar_url":"https://github.com/nrepl.png","language":"Clojure","funding_links":["https://github.com/sponsors/bbatsov","https://patreon.com/bbatsov","https://ko-fi.com/bbatsov","https://opencollective.com/nrepl","https://liberapay.com/bbatsov","https://www.paypal.me/bbatsov"],"categories":[],"sub_categories":[],"readme":"[![CircleCI](https://circleci.com/gh/nrepl/incomplete/tree/main.svg?style=svg)](https://circleci.com/gh/nrepl/incomplete/tree/main)\n[![Clojars Project](https://img.shields.io/clojars/v/org.nrepl/incomplete.svg)](https://clojars.org/org.nrepl/incomplete)\n[![cljdoc badge](https://cljdoc.org/badge/org.nrepl/incomplete)](https://cljdoc.org/d/org.nrepl/incomplete/CURRENT)\n[![downloads badge](https://versions.deps.co/org.nrepl/incomplete/downloads.svg)](https://clojars.org/org.nrepl/incomplete)\n\n# incomplete\n\nA simple Clojure library providing code completion.\nThe library was extracted from nREPL's codebase and\naims to replace [clojure-complete](https://github.com/ninjudd/clojure-complete).\n\n`incomplete`'s name refers to its basic nature and modest goals.\nIt doesn't aim to compete with the gold standard for completion [compliment](https://github.com/alexander-yakushev/compliment).\n\n## Rationale\n\n`clojure-complete` has several long-standing bugs and hasn't seen much love in recent years.\nStill, the project is extremely popular due to its simplicity and the fact that it's\nbundled with tools like Leiningen and REPLy.\n\n`incomplete` started its life inside nREPL, as the provider of nREPL's built-in code\ncompletion, but I decided it might be a useful standalone library as well.\nIt sits somewhere between `clojure-complete` and `compliment` in the sense that it has\nmore features (and less bugs) than the former, and it's much simpler and less capable than the\nlatter.\n\nHere's a list of the `incomplete`'s advantages over `clojure-complete`:\n\n* better completion of Java instance and static members\n* keyword completion in Clojure\n* candidate metadata (useful for tool authors)\n* cleaner codebase (subjective, of course)\n\nThe long term goal for the project is to replace `clojure-complete` in REPLy and Leiningen.\n\n**Updates:**\n\n* REPLy 0.5 is out and it uses `incomplete` (released on 2021-08-18)\n* Leiningen 2.9.7+ (released on 2021-09-15) uses REPLy 0.5 and `incomplete`\n\n## Usage\n\nYou need only one function from incomplete's API - `completions`.\n\n``` clojure\n(require 'incomplete.core)\n\n;; var completion\n(completions \"map\")\n({:candidate \"map\", :type :function}\n {:candidate \"map-entry?\", :type :function}\n {:candidate \"map-indexed\", :type :function}\n {:candidate \"map?\", :type :function}\n {:candidate \"mapcat\", :type :function}\n {:candidate \"mapv\", :type :function})\n\n;; ns completion\n(completions \"incomplete.co\")\n({:candidate \"incomplete.core\", :type :namespace}\n {:candidate \"incomplete.core-test\", :type :namespace})\n\n;; keyword completion\n(completions \":v\")\n({:candidate \":val\", :type :keyword}\n {:candidate \":valf\", :type :keyword}\n {:candidate \":valid\", :type :keyword}\n {:candidate \":validator\", :type :keyword}\n {:candidate \":value\", :type :keyword}\n {:candidate \":var\", :type :keyword}\n {:candidate \":var-form\", :type :keyword}\n {:candidate \":var-name\", :type :keyword}\n {:candidate \":var-params\", :type :keyword}\n {:candidate \":var-query\", :type :keyword}\n {:candidate \":varargs\", :type :keyword}\n {:candidate \":vector\", :type :keyword}\n {:candidate \":vector-long\", :type :keyword}\n {:candidate \":verbose\", :type :keyword}\n {:candidate \":verbose?\", :type :keyword}\n {:candidate \":version-string\", :type :keyword}\n {:candidate \":versions\", :type :keyword}\n {:candidate \":via\", :type :keyword}\n {:candidate \":volatile\", :type :keyword}\n {:candidate \":volatile-mutable\", :type :keyword})\n\n;; static method completion\n(completions \"Integer/re\")\n({:candidate \"Integer/remainderUnsigned\", :type :static-method}\n {:candidate \"Integer/reverse\", :type :static-method}\n {:candidate \"Integer/reverseBytes\", :type :static-method})\n\n;; instance method completion\n(completions \".to\")\n({:candidate \".toBinaryString\", :type :method}\n {:candidate \".toChars\", :type :method}\n {:candidate \".toCodePoint\", :type :method}\n {:candidate \".toDegrees\", :type :method}\n {:candidate \".toHexString\", :type :method}\n {:candidate \".toIntExact\", :type :method}\n {:candidate \".toLowerCase\", :type :method}\n {:candidate \".toOctalString\", :type :method}\n {:candidate \".toRadians\", :type :method}\n {:candidate \".toString\", :type :method}\n {:candidate \".toTitleCase\", :type :method}\n {:candidate \".toUnsignedInt\", :type :method}\n {:candidate \".toUnsignedLong\", :type :method}\n {:candidate \".toUnsignedString\", :type :method}\n {:candidate \".toUpperCase\", :type :method})\n```\n\nBy default the function operates on the current ns (`*ns*`), but you\ncan also specify an explicit namespace.\n\n``` clojure\n(completions \"ma\" 'clojure.core)\n```\n\nYou can also request additional metadata for the completion candidates:\n\n``` clojure\n(completions \"map\" *ns* {:extra-metadata #{:arglists :doc}})\n({:candidate \"map\", :type :function, :doc \"Returns a lazy sequence consisting of the result of applying f to\\n  the set of first items of each coll, followed by applying f to the\\n  set of second items in each coll, until any one of the colls is\\n  exhausted.  Any remaining items in other colls are ignored. Function\\n  f should accept number-of-colls arguments. Returns a transducer when\\n  no collection is provided.\", :arglists \"([f] [f coll] [f c1 c2] [f c1 c2 c3] [f c1 c2 c3 \u0026 colls])\"}\n {:candidate \"map-indexed\", :type :function, :doc \"Returns a lazy sequence consisting of the result of applying f to 0\\n  and the first item of coll, followed by applying f to 1 and the second\\n  item in coll, etc, until coll is exhausted. Thus function f should\\n  accept 2 arguments, index and item. Returns a stateful transducer when\\n  no collection is provided.\", :arglists \"([f] [f coll])\"}\n {:candidate \"map?\", :type :function, :doc \"Return true if x implements IPersistentMap\", :arglists \"([x])\"} {:candidate \"mapcat\", :type :function, :doc \"Returns the result of applying concat to the result of applying map\\n  to f and colls.  Thus function f should return a collection. Returns\\n  a transducer when no collections are provided\", :arglists \"([f] [f \u0026 colls])\"}\n {:candidate \"mapv\", :type :function, :doc \"Returns a vector consisting of the result of applying f to the\\n  set of first items of each coll, followed by applying f to the set\\n  of second items in each coll, until any one of the colls is\\n  exhausted.  Any remaining items in other colls are ignored. Function\\n  f should accept number-of-colls arguments.\", :arglists \"([f coll] [f c1 c2] [f c1 c2 c3] [f c1 c2 c3 \u0026 colls])\"})\n```\n\nThat's quite useful if you're working with a tool (e.g. an editor) that can display additional data together with the completion candidates.\n\n## License\n\nCopyright © 2021-2022 Bozhidar Batsov\n\nThis program and the accompanying materials are made available under the\nterms of the Eclipse Public License 2.0 which is available at\nhttp://www.eclipse.org/legal/epl-2.0.\n\nThis Source Code may also be made available under the following Secondary\nLicenses when the conditions for such availability set forth in the Eclipse\nPublic License, v. 2.0 are satisfied: GNU General Public License as published by\nthe Free Software Foundation, either version 2 of the License, or (at your\noption) any later version, with the GNU Classpath Exception which is available\nat https://www.gnu.org/software/classpath/license.html.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnrepl%2Fincomplete","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fnrepl%2Fincomplete","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnrepl%2Fincomplete/lists"}