{"id":13596206,"url":"https://github.com/tpope/timl","last_synced_at":"2025-04-09T16:31:52.136Z","repository":{"id":12024025,"uuid":"14607753","full_name":"tpope/timl","owner":"tpope","description":"Clojure like language which compiles down to VimL","archived":true,"fork":false,"pushed_at":"2015-01-19T23:00:29.000Z","size":1572,"stargazers_count":680,"open_issues_count":4,"forks_count":18,"subscribers_count":26,"default_branch":"master","last_synced_at":"2025-04-02T00:35:15.680Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"VimL","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/tpope.png","metadata":{"files":{"readme":"README.markdown","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2013-11-22T03:31:55.000Z","updated_at":"2024-12-12T08:26:07.000Z","dependencies_parsed_at":"2022-08-07T06:16:43.318Z","dependency_job_id":null,"html_url":"https://github.com/tpope/timl","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tpope%2Ftiml","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tpope%2Ftiml/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tpope%2Ftiml/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tpope%2Ftiml/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/tpope","download_url":"https://codeload.github.com/tpope/timl/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248067793,"owners_count":21042357,"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","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":[],"created_at":"2024-08-01T16:02:12.063Z","updated_at":"2025-04-09T16:31:47.421Z","avatar_url":"https://github.com/tpope.png","language":"VimL","funding_links":[],"categories":["VimL","Vim Script"],"sub_categories":[],"readme":"# Welcome to the future (of the past)\n\nTimL is a Lisp dialect implemented in and compiling down to VimL, the\nscripting language provided by the Vim text editor.  Think Clojure meets VimL.\n\n## Is this a joke?\n\nIf you mean the 6,000 lines of working code, then no, I poured hundreds upon\nhundreds of very serious hours into that.  But if you're referring to the fact\nit's woefully underdocumented, adds considerable overhead to an already slow\nhost platform, and ultimately unlikely to gain any traction, then yeah,\nprobably.\n\n## Language features\n\n* Clojure like syntax and API, including everything from rich syntax literals\n  to destructuring.\n* Namespaces, including `refer` and `alias`.\n* `timl.core`, a tiny but growing API resembling `clojure.core`.\n* The same persistent collection types and interfaces, including vectors, hash\n  maps, hash sets, lists, and lazy sequences.\n* Macros, including syntax quoting and the implicit `\u0026form` and `\u0026env`.\n* Metadata.  (Some collection types don't support it yet.)\n* Reference types, including vars, atoms, futures.\n* Extensible type system, including `defmethod` for duck typing.  (This is the\n  most significant departure from Clojure.)\n* Caching compiler generates real VimL.\n\n## VimL interop\n\n* TimL functions are actually VimL dictionaries (objects) containing a\n  dictionary function (method) and a reference to the enclosing scope.\n* Defining a symbol `baz` in namespace `foo.bar` actually defines\n  `g:foo#bar.baz`.  If that symbol refers to something callable (like a\n  function), calling `foo#bar#baz()` on the VimL side will invoke it.\n* Arbitrary Vim variables and options can be referred to using VimL notation:\n  `b:did_ftplugin`, `v:version`, `\u0026expandtab`. You can also change them with\n  `set!`: `(set! \u0026filetype \"timl\")`.\n* `#*function` returns a reference to a built-in or user defined function.\n  You can call it like any other function: `(#*toupper \"TimL is pretty neat\")`.\n* Interact with VimL exceptions with `throw`/`try`/`catch`/`finally`.\n* Call a Vim command with `execute`: `(execute \"wq\")`.\n* Lisp macros are a wonderful way to encapsulate and hide a lot of the pain\n  points of VimL.  The current standard library barely scratches the surface\n  here.\n\n## Getting started\n\nIf you don't have a preferred installation method, I recommend\ninstalling [pathogen.vim](https://github.com/tpope/vim-pathogen), and\nthen simply copy and paste:\n\n    cd ~/.vim/bundle\n    git clone git://github.com/tpope/timl.git\n\nOnce help tags have been generated, you can view the manual with `:help timl`.\nThere's not a whole lot there, yet.  If you know Clojure, you can probably\nguess a bunch of the function names.\n\nStart a repl with `:TLrepl`.  Tab complete is your friend.  The first time may\ntake several seconds (if your computer is a piece of shit), but compilation is\ncached, so subsequent invocations will be super quick, even if Vim is\nrestarted.\n\nThe familiar `ns` macro from Clojure is mostly identical in TimL. \n`:refer-clojure` is now `:refer-timl`, which is identical to \n`(refer 'timl.core opts)`. `:use` only supports symbol arguments.\n\n    (ns my.ns\n      (:refer-timl :exclude [+])\n      (:use timl.repl)\n      (:require [timl.file :as file]\n                [timl.test]))\n\nYou can use Clojure's `in-ns`, `require`, `refer`, `alias`, and `use`,\nhowever `use` and `require` are limited to a single argument.\n\n    (in-ns 'my.ns)\n    (use 'timl.repl)\n    (require 'timl.file)\n    (alias 'file 'timl.file)\n\nPut files in `autoload/*.tim` in the runtime path and they will be requirable.\n\n## License\n\nCopyright © Tim Pope.\n\nThe use and distribution terms for this software are covered by the [Eclipse\nPublic License 1.0](http://opensource.org/licenses/eclipse-1.0.php), which can\nbe found in the file epl-v10.html at the root of this distribution.\n\nBy using this software in any fashion, you are agreeing to be bound by the\nterms of this license.  You must not remove this notice, or any other, from\nthis software.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftpope%2Ftiml","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftpope%2Ftiml","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftpope%2Ftiml/lists"}