commit 623b03e22e541803c5a77a0b08410ee15b0c2661 Author: Łukasz Pankowski Date: Sat Oct 4 09:52:30 2025 +0200 initial commit diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..6b5daa8 --- /dev/null +++ b/LICENSE @@ -0,0 +1,19 @@ +Copyright 2025 Łukasz Pankowski + +Permission is hereby granted, free of charge, to any person obtaining a +copy of this software and associated documentation files (the "Software"), +to deal in the Software without restriction, including without limitation +the rights to use, copy, modify, merge, publish, distribute, sublicense, +and/or sell copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. diff --git a/README.md b/README.md new file mode 100644 index 0000000..c878585 --- /dev/null +++ b/README.md @@ -0,0 +1,64 @@ +# vis-pin-files + +A [vis-plugin](https://github.com/martanne/vis/wiki/Plugins/) to pin a file to a number + with a key (default: `␣p1` ... `␣p9`). The number may be later used to bring back the file with another key (default: `␣1` ... `␣9`). + +Keys are configurable. The pins does not persist after editor restart (but both keys and files table are available in module namespace for customization). + +The plugin is basic implementation of the idea of [neovim](https://neovim.io/) plugin [harpoon](https://github.com/ThePrimeagen/harpoon/tree/harpoon2) +(there are also many other similar neovim plugins, such as [arrow](https://github.com/otavioschwanck/arrow.nvim)). + +The package could be used with its default settings by cloning the project directory +into the `plugins` subdirectory in the directory of your `visrc.lua` file and importing it +with + +```lua +require('plugins/vis-pin-files') +``` + +See the *Default keys and configuration* section for default key bindings and possible customization. + +## Commands + +The plugin adds single command `:pin-files [command] [num]` + +Where `[command]` is either: + +- `pin`, then the current file is pinned to the given number `[num]` (i.e., its path, if any, is stored for later use), or +- any other command (such as `e`, `o`, `split`, `vsplit`), in this case the command is called with the filename + pinned to the given `[num]` (or message is displayed that the pin is empty). + +Actually `[num]` is converted to a number if possible, otherwise it is used as a string. + +The `[num]` is optional, if not given the number should be given as the count argument of the command, if both are missing, only the info message is displayed +and nothing happens. + +## Default keys and configuration + +The default set of keys consists of two groups: +- `␣p1` ... `␣p9` -- pin current file to given number, +- `␣1` ... `␣9` -- switch to given file with `e` command, + +The default keys defined in the plugin are equivallent to the following +settings in your `visrc.lua`: +```lua +local pin = require('plugins/vis-pin-files') + +pin.keys = { + [' p%d'] = 'pin-files pin %d', + [' %d'] = 'pin-files e %d', +} +``` + +where keys with `%d` in them are filled with numbers from 1 to 9 in the key and in the command. +If `%d` is not found in the key then the single key (without number interpolation) is bind +to the given command. + +To remove the given key just set it to `nil`, for example: +```lua +pin.keys[' p%d'] = nil +``` +to remove all default keys (so you can set them yourself): +```lua +pin.keys = nil +``` diff --git a/init.lua b/init.lua new file mode 100644 index 0000000..2027b42 --- /dev/null +++ b/init.lua @@ -0,0 +1,55 @@ +local M = {} + +M.keys = { + [' p%d'] = 'pin-files pin %d', + [' %d'] = 'pin-files e %d', +} + +M.files = {} + +local function pin_file(num, file) + if file ~= nil then + M.files[num] = file + vis:info('[' .. num .. '] pin') + else + vis:info('Window has no file') + end +end + +local function open_file(num, cmd) + local file = M.files[num] + if not file then + vis:info('[' .. num .. '] empty') + elseif file == vis.win.file.path and cmd == 'e' then + vis:info('[' .. num .. '] already opened') + else + vis:info('[' .. num .. '] ' .. cmd) + vis:command(string.format('%s %q', cmd or 'o', file)) + end +end + +vis:command_register('pin-files', function(argv, force, win, selection, range) + local cmd = argv[1] or 'o' + local num = tonumber(argv[2]) or argv[2] or vis.count + if not num then + vis:info('No file number given') + elseif cmd == 'pin' then + pin_file(num, win.file.path) + else + open_file(num, cmd) + end +end) + +vis.events.subscribe(vis.events.INIT, function() + for key, cmd in pairs(M.keys or {}) do + if key:find('%%d') then + for num = 1, 9 do + vis:map(vis.modes.NORMAL, string.format(key, num), string.format(cmd, num)) + end + else + vis:map(vis.modes.NORMAL, key, cmd) + end + end +end) + +return M