All Projects → gustavo-hms → luar

gustavo-hms / luar

Licence: LGPL-3.0 License
Script Kakoune using Lua

Programming Languages

lua
6591 projects
KakouneScript
24 projects

Projects that are alternatives of or similar to luar

Kakoune
mawww's experiment for a better code editor
Stars: ✭ 7,593 (+22909.09%)
Mutual labels:  kakoune
snippet.kak
Snippets integration for Kakoune
Stars: ✭ 23 (-30.3%)
Mutual labels:  kakoune
kakoune-ghci-bridge
Get intellisense for Haskell in Kakoune via ghci
Stars: ✭ 13 (-60.61%)
Mutual labels:  kakoune
kakoune-wiki
Personal wiki plugin for Kakoune
Stars: ✭ 53 (+60.61%)
Mutual labels:  kakoune
one.kak
Atom "One" color schemes for Kakoune.
Stars: ✭ 19 (-42.42%)
Mutual labels:  kakoune
kakoune-extra-filetypes
Extra highlighters for the Kakoune editor
Stars: ✭ 20 (-39.39%)
Mutual labels:  kakoune
kakoune-find
Find and replace on open buffers
Stars: ✭ 30 (-9.09%)
Mutual labels:  kakoune
kakoune-edit-or-dir
File browser for Kakoune
Stars: ✭ 18 (-45.45%)
Mutual labels:  kakoune
auto-pairs.kak
Auto-pairing of characters for Kakoune
Stars: ✭ 62 (+87.88%)
Mutual labels:  kakoune
kakoune-gdb
gdb integration plugin
Stars: ✭ 44 (+33.33%)
Mutual labels:  kakoune
powerline.kak
Kakoune modeline, but with passion
Stars: ✭ 49 (+48.48%)
Mutual labels:  kakoune
kak-ansi
Kakoune support for rendering ANSI-colored text.
Stars: ✭ 30 (-9.09%)
Mutual labels:  kakoune
kakboard
Clipboard integration for Kakoune
Stars: ✭ 49 (+48.48%)
Mutual labels:  kakoune
connect.kak
Connect a program to Kakoune clients
Stars: ✭ 80 (+142.42%)
Mutual labels:  kakoune
tagbar.kak
Tag viewer for Kakoune
Stars: ✭ 19 (-42.42%)
Mutual labels:  kakoune
kaktree
File explorer side panel for Kakoune
Stars: ✭ 39 (+18.18%)
Mutual labels:  kakoune
emmet-cli
Emmet command line interface
Stars: ✭ 27 (-18.18%)
Mutual labels:  kakoune
kakoune-snippets
Snippet support for kakoune
Stars: ✭ 35 (+6.06%)
Mutual labels:  kakoune
kakoune-themes
Color schemes for kakoune , extra syntax highlighting and my config
Stars: ✭ 25 (-24.24%)
Mutual labels:  kakoune
kakoune-sudo-write
Write to files using 'sudo'
Stars: ✭ 24 (-27.27%)
Mutual labels:  kakoune

Luar

Luar is a minimalist plugin to script Kakoune using Lua. It's not designed to expose Kakoune's internals like Vis or Neovim do. Instead, it's conceived with Kakoune's extension model in mind. It does so by defining a sole command (lua) which can execute whatever string is passed to it in an external lua interpreter. By doing so, it can act as a complement for the %sh{} expansion when you need to run some logic inside Kakoune.

Usage

First of all, require the provided module:

require-module luar

The luar module exports a lua command, which executes the code passed to it in an external lua interpreter. The code is interpreted as the body of an anonymous function, and whatever this anonymous function returns replaces the current selections. So, the following code:

lua %{
    return "Olá!"
}

replaces your selections with Olá!.

In the same vein, if you have, say, three selections, the code:

lua %{
    return 17, 19, 23
}

replaces each selection with 17, 19 and 23 respectivelly. The same can be achieved by returning a single table with three elements:

lua %{
    return {17, 19, 23}
}

The two forms are equivalent.

If, on the other hand, you return nothing, the content of the selections won't be modified:

lua %{
    if true then
        return
    end
}

The anonymous function can take arguments by passing values before the %{} block:

lua 17 19 %{
    return arg[1] + arg[2]
}

The above code will replace all the selections with 36. As you can see, the arguments can be accessed with the arg table.

As a convenience, you can use the provided args function to name your arguments:

lua 17 19 %{
    local first, second = args()
    return second - first
}

Since Kakoune does not process expansions inside these lua %{} blocks, you need to pass expansions as arguments if you need to inspect Kakoune's state:

lua %val{client} %{
    local client = args()
    return string.format("I'm client “%s”", client)
}

Finally, you can run all commands defined in Kakoune (including third party ones) from lua code using the provided kak module:

lua %{
    kak.set_register("/", "Search this!")
    kak.execute_keys('%s<ret>cSearch that!<esc>')
}

As you can see, hyphens are replaced by underscores in command names.

External modules

Since Lua modules are just plain tables and require is just a simple function, you can import modules everywhere in your program, not just at the beginning of a file. In particular, you can import external modules inside the :lua command. For instance, if you need to parse the contents of a file, you can use the elegant LPeg library:

lua %val{buffile} %{
    local lpeg = require "lpeg"

    local function parse(file)
        -- do the lpeg's magic here
    end

    local tree = parse(arg[1])
    -- ...
}

You can also use this functionality to split your plugin into separate modules and use :lua to glue them together. To make that easier, luar provides the addpackagepath convenience function. It configures the lua interpreter to search for lua modules in the provided directory. It's meant to be used like this:

declare-option -hidden str my_plugin_path %sh{ dirname $kak_source }

define-command my-command %{
    lua %opt{my_plugin_path} %{
        addpackagepath(arg[1])
        local module = require "my_local_module"
        -- ...
    }
}

Some examples

The following examples are for didactic purposes. There are other ways to achieve the same results.

Suppose you want to execute ctags-update-tags whenever you write to a file, but only if there's already a tags file in the current directory. Using :lua you can write the following lines to your kakrc:

hook global BufWritePost .* %{
    lua %{
        if io.open("tags") then kak.ctags_update_tags() end
    }
}

Now suppose you want to define a mapping to toggle the highlight of search patterns in the current window when you press F2. To achieve that, you can do something like this:

declare-option -hidden bool highlight_search_on false

define-command highlight-search-toggle %{
    lua %opt{highlight_search_on} %{
        local is_on = args()

        if is_on then
            kak.remove_highlighter("window/highlight-search")
        else
            kak.add_highlighter("window/highlight-search", "dynregex", "%reg{/}", "0:default,+ub")
        end

        kak.set_option("window", "highlight_search_on", not is_on)
    }
}

map global normal <F2> ': highlight-search-toggle<ret>'

You can find more examples searching Github by topic.

Installation

You must have a lua interpreter installed on your system. Then you can add the following line to your kakrc (supposing you use plug.kak):

plug "gustavo-hms/luar" %{
    require-module luar
}

Configuration

You can also change the Lua interpreter used by this plugin by changing the luar_interpreter option, e.g.:

# use luajit to run all Lua snippets
set-option global luar_interpreter luajit
Note that the project description data, including the texts, logos, images, and/or trademarks, for each open source project belongs to its rightful owner. If you wish to add or remove any projects, please contact us at [email protected].