1
0
Fork 0
mirror of synced 2024-12-22 16:18:59 -05:00

Add micro config

This commit is contained in:
Nico Jensch 2020-11-10 09:45:58 +01:00
parent 7635edb0ae
commit c8671c2466
22 changed files with 1038 additions and 0 deletions

View file

@ -0,0 +1,21 @@
MIT License
Copyright (c) 2020 Ján Priner
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.

View file

@ -0,0 +1,4 @@
# Aspell plugin for Micro
This is a spellchecking plugin for [Micro](https://micro-editor.github.io/) editor.
For help see [the help file](help/aspell.md).

View file

@ -0,0 +1,637 @@
VERSION = "1.2.0"
local micro = import("micro")
local shell = import("micro/shell")
local buffer = import("micro/buffer")
local config = import("micro/config")
local util = import("micro/util")
local utf = import("unicode/utf8")
config.RegisterCommonOption("aspell", "check", "auto")
config.RegisterCommonOption("aspell", "lang", "")
config.RegisterCommonOption("aspell", "dict", "")
config.RegisterCommonOption("aspell", "sugmode", "normal")
config.RegisterCommonOption("aspell", "args", "")
function init()
config.MakeCommand("addpersonal", addpersonal, config.NoComplete)
config.MakeCommand("acceptsug", acceptsug, config.NoComplete)
config.AddRuntimeFile("aspell", config.RTHelp, "help/aspell.md")
end
local filterModes = {
xml = "sgml",
["c++"] = "ccpp",
c = "ccpp",
html = "html",
html4 = "html",
html5 = "html",
perl = "perl",
perl6 = "perl",
tex = "tex",
markdown = "markdown",
-- Aspell has comment mode, in which only lines starting with # are checked
-- but it doesn't work for some reason
}
local lock = false
local next = nil
function runAspell(buf, onExit, ...)
local text = util.String(buf:Bytes())
-- Escape for aspell (it interprets lines that start
-- with % @ ^ ! etc.)
text = text:gsub("\n", "\n^"):gsub("^", "^")
-- Enable terse mode
text = "!\n" .. text
-- Escape for shell
text = "'" .. text:gsub("'", "'\\''") .. "'"
local options = ""
-- FIXME: we should support non-utf8 encodings with '--encoding'
if filterModes[buf:FileType()] then
options = options .. " --mode=" .. filterModes[buf:FileType()]
end
if buf.Settings["aspell.lang"] ~= "" then
options = options .. " --lang=" .. buf.Settings["aspell.lang"]
end
if buf.Settings["aspell.dict"] ~= "" then
options = options .. " --master=" .. buf.Settings["aspell.dict"]
end
if buf.Settings["aspell.sugmode"] ~= "" then
options = options .. " --sug-mode=" .. buf.Settings["aspell.sugmode"]
end
if buf.Settings["aspell.args"] ~= "" then
options = options .. " " .. buf.Settings["aspell.args"]
end
shell.JobStart("printf %s " .. text .. " | aspell pipe" .. options, nil,
nil, onExit, buf, unpack(arg))
end
function spellcheck(buf)
local check = buf.Settings["aspell.check"]
if check == "on" or (check == "auto" and filterModes[buf:FileType()]) then
if lock then
next = buf
else
lock = true
runAspell(buf, highlight)
end
else
-- If we aren't supposed to spellcheck, clear the messages
buf:ClearMessages("aspell")
end
end
-- Parses the output of Aspell and returns the list of all misspells.
function parseOutput(out)
local patterns = {"^# (.-) (%d+)$", "^& (.-) %d+ (%d+): (.+)$"}
if out:find("command not found") then
micro.InfoBar():Error(
"Make sure that Aspell is installed and available in your PATH")
return {}
elseif not out:find("International Ispell Version") then
-- Something went wrong, we'll show what Aspell has to say
micro.InfoBar():Error("Aspell: " .. out)
return {}
end
local misspells = {}
local linenumber = 1
local lines = split(out, "\n")
for _, line in ipairs(lines) do
if line == "" then
linenumber = linenumber + 1
else
for _, pattern in ipairs(patterns) do
if string.find(line, pattern) then
local word, offset, suggestions = string.match(line, pattern)
offset = tonumber(offset)
local len = utf.RuneCountInString(word)
misspells[#misspells + 1] = {
word = word,
mstart = buffer.Loc(offset - 1, linenumber - 1),
mend = buffer.Loc(offset - 1 + len, linenumber - 1),
suggestions = suggestions and split(suggestions, ", ") or {},
}
end
end
end
end
return misspells
end
function highlight(out, args)
local buf = args[1]
buf:ClearMessages("aspell")
-- This is a hack that keeps the text shifted two columns to the right
-- even when no gutter messages are shown
local msg = "This message shouldn't be visible (Aspell plugin)"
local bmsg = buffer.NewMessageAtLine("aspell", msg, 0, buffer.MTError)
buf:AddMessage(bmsg)
for _, misspell in ipairs(parseOutput(out)) do
local msg = nil
if #(misspell.suggestions) > 0 then
msg = misspell.word .. " -> " .. table.concat(misspell.suggestions, ", ")
else
msg = misspell.word .. " ->X"
end
local bmsg = buffer.NewMessage("aspell", msg, misspell.mstart,
misspell.mend, buffer.MTWarning)
buf:AddMessage(bmsg)
end
lock = false
if next ~= nil then
spellcheck(next)
next = nil
end
end
function parseMessages(messages)
local patterns = {"^(.-) %-> (.+)$", "^(.-) %->X$"}
if messages == nil then
return {}
end
local misspells = {}
for i=1, #messages do
local message = messages[i]
if message.Owner == "aspell" then
for _, pattern in ipairs(patterns) do
if string.find(message.Msg, pattern) then
local word, suggestions = string.match(message.Msg, pattern)
misspells[#misspells + 1] = {
word = word,
mstart = -message.Start,
mend = -message.End,
suggestions = suggestions and split(suggestions, ", ") or {},
}
end
end
end
end
return misspells
end
function addpersonal(bp, args)
local buf = bp.Buf
local loc = buf:GetActiveCursor().Loc
for _, misspell in ipairs(parseMessages(buf.Messages)) do
local wordInBuf = util.String(buf:Substr(misspell.mstart, misspell.mend))
if loc:GreaterEqual(misspell.mstart) and loc:LessEqual(misspell.mend)
and wordInBuf == misspell.word then
local options = ""
if buf.Settings["aspell.lang"] ~= "" then
options = options .. " --lang="
.. buf.Settings["aspell.lang"]
end
if buf.Settings["aspell.dict"] ~= "" then
options = options .. " --master="
.. buf.Settings["aspell.dict"]
end
if buf.Settings["aspell.args"] ~= "" then
options = options .. " " .. buf.Settings["aspell.args"]
end
shell.ExecCommand("sh", "-c", "echo '*" .. misspell.word
.. "\n#\n' | aspell pipe" .. options)
spellcheck(buf)
if args then
return
end
return true
end
end
if args then
return
end
return false
end
function acceptsug(bp, args)
local buf = bp.Buf
local n = nil
if args and #args > 0 then
n = tonumber(args[1])
end
local loc = buf:GetActiveCursor().Loc
for _, misspell in ipairs(parseMessages(buf.Messages)) do
local wordInBuf = util.String(buf:Substr(misspell.mstart, misspell.mend))
if loc:GreaterEqual(misspell.mstart) and loc:LessEqual(misspell.mend)
and wordInBuf == misspell.word then
if misspell.suggestions[n] then
-- If n is in the range we'll accept n-th suggestion
buf:GetActiveCursor():GotoLoc(misspell.mend)
buf:Replace(misspell.mstart, misspell.mend, misspell.suggestions[n])
spellcheck(buf)
if args then
return
end
return true
elseif #(misspell.suggestions) > 0 then
-- If n is 0 indicating acceptsug was called with no arguments
-- we will cycle through the suggestions autocomplete-like
buf:GetActiveCursor():GotoLoc(misspell.mend)
buf:Remove(misspell.mstart, misspell.mend)
buf:Autocomplete(function ()
return misspell.suggestions, misspell.suggestions
end)
spellcheck(buf)
if args then
return
end
return true
end
end
end
if args then
return
end
return false
end
function split(str, pat)
local t = {}
local fpat = "(.-)" .. pat
local last_end = 1
local s, e, cap = str:find(fpat, 1)
while s do
if s ~= 1 or cap ~= "" then
table.insert(t, cap)
end
last_end = e+1
s, e, cap = str:find(fpat, last_end)
end
if last_end <= #str then
cap = str:sub(last_end)
table.insert(t, cap)
end
return t
end
-- We need to spellcheck every time, the buffer is modified. Sadly there's
-- no such thing as onBufferModified()
function onBufferOpen(buf)
spellcheck(buf)
end
-- The following callbacks are undocumented
function onRune(bp)
spellcheck(bp.Buf)
end
function onCycleAutocompleteBack(bp)
spellcheck(bp.Buf)
end
-- The following were copied from help keybindings
-- function onCursorUp(bp)
-- end
-- function onCursorDown(bp)
-- end
-- function onCursorPageUp(bp)
-- end
-- function onCursorPageDown(bp)
-- end
-- function onCursorLeft(bp)
-- end
-- function onCursorRight(bp)
-- end
-- function onCursorStart(bp)
-- end
-- function onCursorEnd(bp)
-- end
-- function onSelectToStart(bp)
-- end
-- function onSelectToEnd(bp)
-- end
-- function onSelectUp(bp)
-- end
-- function onSelectDown(bp)
-- end
-- function onSelectLeft(bp)
-- end
-- function onSelectRight(bp)
-- end
-- function onSelectToStartOfText(bp)
-- end
-- function onSelectToStartOfTextToggle(bp)
-- end
-- function onWordRight(bp)
-- end
-- function onWordLeft(bp)
-- end
-- function onSelectWordRight(bp)
-- end
-- function onSelectWordLeft(bp)
-- end
function onMoveLinesUp(bp)
spellcheck(bp.Buf)
end
function onMoveLinesDown(bp)
spellcheck(bp.Buf)
end
function onDeleteWordRight(bp)
spellcheck(bp.Buf)
end
function onDeleteWordLeft(bp)
spellcheck(bp.Buf)
end
-- function onSelectLine(bp)
-- end
-- function onSelectToStartOfLine(bp)
-- end
-- function onSelectToEndOfLine(bp)
-- end
function onInsertNewline(bp)
spellcheck(bp.Buf)
end
function onInsertSpace(bp)
spellcheck(bp.Buf)
end
function onBackspace(bp)
spellcheck(bp.Buf)
end
function onDelete(bp)
spellcheck(bp.Buf)
end
-- function onCenter(bp)
-- end
function onInsertTab(bp)
spellcheck(bp.Buf)
end
-- function onSave(bp)
-- end
-- function onSaveAll(bp)
-- end
-- function onSaveAs(bp)
-- end
-- function onFind(bp)
-- end
-- function onFindLiteral(bp)
-- end
-- function onFindNext(bp)
-- end
-- function onFindPrevious(bp)
-- end
function onUndo(bp)
spellcheck(bp.Buf)
end
function onRedo(bp)
spellcheck(bp.Buf)
end
-- function onCopy(bp)
-- end
-- function onCopyLine(bp)
-- end
function onCut(bp)
spellcheck(bp.Buf)
end
function onCutLine(bp)
spellcheck(bp.Buf)
end
function onDuplicateLine(bp)
spellcheck(bp.Buf)
end
function onDeleteLine(bp)
spellcheck(bp.Buf)
end
function onIndentSelection(bp)
spellcheck(bp.Buf)
end
function onOutdentSelection(bp)
spellcheck(bp.Buf)
end
function onOutdentLine(bp)
spellcheck(bp.Buf)
end
function onIndentLine(bp)
spellcheck(bp.Buf)
end
function onPaste(bp)
spellcheck(bp.Buf)
end
-- function onSelectAll(bp)
-- end
-- function onOpenFile(bp)
-- end
-- function onStart(bp)
-- end
-- function onEnd(bp)
-- end
-- function onPageUp(bp)
-- end
-- function onPageDown(bp)
-- end
-- function onSelectPageUp(bp)
-- end
-- function onSelectPageDown(bp)
-- end
-- function onHalfPageUp(bp)
-- end
-- function onHalfPageDown(bp)
-- end
-- function onStartOfLine(bp)
-- end
-- function onEndOfLine(bp)
-- end
-- function onStartOfText(bp)
-- end
-- function onStartOfTextToggle(bp)
-- end
-- function onParagraphPrevious(bp)
-- end
-- function onParagraphNext(bp)
-- end
-- function onToggleHelp(bp)
-- end
-- function onToggleDiffGutter(bp)
-- end
-- function onToggleRuler(bp)
-- end
-- function onJumpLine(bp)
-- end
-- function onClearStatus(bp)
-- end
-- function onShellMode(bp)
-- end
-- function onCommandMode(bp)
-- end
-- function onQuit(bp)
-- end
-- function onQuitAll(bp)
-- end
-- function onAddTab(bp)
-- end
-- function onPreviousTab(bp)
-- end
-- function onNextTab(bp)
-- end
-- function onNextSplit(bp)
-- end
-- function onUnsplit(bp)
-- end
-- function onVSplit(bp)
-- end
-- function onHSplit(bp)
-- end
-- function onPreviousSplit(bp)
-- end
-- function onToggleMacro(bp)
-- end
function onPlayMacro(bp)
spellcheck(bp.Buf)
end
-- function onSuspend(bp) -- Unix only
-- end
-- function onScrollUp(bp)
-- end
-- function onScrollDown(bp)
-- end
-- function onSpawnMultiCursor(bp)
-- end
-- function onSpawnMultiCursorUp(bp)
-- end
-- function onSpawnMultiCursorDown(bp)
-- end
-- function onSpawnMultiCursorSelect(bp)
-- end
-- function onRemoveMultiCursor(bp)
-- end
-- function onRemoveAllMultiCursors(bp)
-- end
-- function onSkipMultiCursor(bp)
-- end
-- function onNone(bp)
-- end
-- function onJumpToMatchingBrace(bp)
-- end
function onAutocomplete(bp)
spellcheck(bp.Buf)
end

View file

@ -0,0 +1,70 @@
# Aspell plugin
The text will be checked for misspells as you type. It understands the syntax
of XML, HTML, TeX and Markdown. On C++, C and Perl only comments and string
literals will be checked.
You need to have Aspell installed and available in your PATH. It does not come
with this plugin. This plugin also currently doesn't work on Windows.
## Options
* `aspell.check`: controls whether spellchecking is performed. Possible values
are `on`, `off` and `auto`. When set to `auto`, only XML, C++, C, HTML, Perl
TeX and Markdown documents will be spellchecked. Defaults to `auto`.
* `aspell.lang`: language to use. Two letter language code, optionally followed
by an underscore or a dash and a two letter country code. It will be passed
to Aspell in the `--lang` option.
* `aspell.dict`: dictionary to use. Run `aspell dicts` in a terminal to see
available dictionaries. It will be passed to Aspell in the `--master` option.
If both `aspell.dict` and `aspell.lang` are left empty (which is the default),
Aspell will follow locale settings.
* `aspell.sugmode`: one of `ultra`, `fast`, `normal`, `slow` or `bad-spellers`.
It will be passed to Aspell in the `--sug-mode` option. Defaults to `normal`.
You may wish to change it to `fast`, if you feel that the spellchecking is
too slow. For an explanation of what each option does, see
http://aspell.net/man-html/Notes-on-the-Different-Suggestion-Modes.html
* `aspell.args`: additional command line arguments, that will be passed to
Aspell.
When you change some of these settings while in Micro using `setlocal` or
`set`, you might not see the effect until you modify a buffer.
You can also disable or enable spellchecking for specific file types in your
`settings.json`:
```json
{
"*.txt": {
"aspell.check": "on"
},
"ft:markdown": {
"aspell.check": "off"
}
}
```
## Commands
* `addpersonal`: adds the word the cursor is on to your personal dictionary, so
that it won't be highlighted as a misspell anymore. You can bind it to a key
as `lua:aspell.addpersonal`.
* `acceptsug 'n'?`: accepts the nth suggestion for the word the cursor is on.
You can bind it to a key as `lua:aspell.acceptsug`. If `n` is not provided or
this command is invoked with a keyboard shortcut, it will start to cycle
through the suggestions. Use `Tab` and `Backtab` to cycle through them.
You can also use them in chain keybindings with `,`, `&` and `|` (see
`help keybindings`). Example `bindings.json`:
```json
{
"Tab": "Autocomplete|lua:aspell.acceptsug|IndentSelection|InsertTab"
}
```

View file

@ -0,0 +1,29 @@
[{
"Name": "aspell",
"Description": "Spellchecking with Aspell",
"Tags": ["spellchecking", "spelling", "aspell", "spellchecker"],
"Website": "https://github.com/priner/micro-aspell-plugin",
"Versions": [
{
"Version": "1.2.0",
"Url": "https://github.com/priner/micro-aspell-plugin/archive/v1.2.0.zip",
"Require": {
"micro": ">=2.0.0"
}
},
{
"Version": "1.1.0",
"Url": "https://github.com/priner/micro-aspell-plugin/archive/v1.1.0.zip",
"Require": {
"micro": ">=2.0.0"
}
},
{
"Version": "1.0.0",
"Url": "https://github.com/priner/micro-aspell-plugin/archive/v1.0.0.zip",
"Require": {
"micro": ">=2.0.0"
}
}
]
}]

View file

@ -0,0 +1 @@
Provides a `fzf` command in micro to open a file in the current pane using fzf.

View file

@ -0,0 +1,38 @@
VERSION = "1.1.1"
local micro = import("micro")
local shell = import("micro/shell")
local config = import("micro/config")
local buffer = import("micro/buffer")
function fzf(bp)
if shell.TermEmuSupported then
local err = shell.RunTermEmulator(bp, "fzf", false, true, fzfOutput, {bp})
if err ~= nil then
micro.InfoBar():Error(err)
end
else
local output, err = shell.RunInteractiveShell("fzf", false, true)
if err ~= nil then
micro.InfoBar():Error(err)
else
fzfOutput(output, {bp})
end
end
end
function fzfOutput(output, args)
local bp = args[1]
local strings = import("strings")
output = strings.TrimSpace(output)
if output ~= "" then
local buf, err = buffer.NewBufferFromFile(output)
if err == nil then
bp:OpenBuffer(buf)
end
end
end
function init()
config.MakeCommand("fzf", fzf, config.NoComplete)
end

View file

@ -0,0 +1,32 @@
[
{
"Name": "fzf",
"Description": "adds support to opening files via fzf",
"Website": "https://github.com/samdmarshall/micro-fzf-plugin",
"Tags": ["fzf"],
"Versions": [
{
"Version": "1.1.1",
"Url": "https://github.com/micro-editor/updated-plugins/releases/download/v1.0.0/fzf-1.1.1.zip",
"Require": {
"micro": ">=2.0.0-1"
}
},
{
"Version": "1.1.0",
"Url": "https://github.com/micro-editor/updated-plugins/releases/download/v1.0.0/fzf-1.1.0.zip",
"Require": {
"micro": ">=2.0.0-1"
}
},
{
"Version": "1.0.5",
"Url": "https://github.com/samdmarshall/micro-fzf-plugin/archive/v1.0.5.zip",
"Require": {
"micro": ">=1.1.2"
}
}
]
}
]

View file

@ -0,0 +1,7 @@
# Misspell Plugin for Micro
This repository holds the misspell plugin for micro.
Install with `> plugin install misspell`,
https://github.com/client9/misspell needs to be in your PATH.
This plugin will lint text for spelling mistakes.

View file

@ -0,0 +1,9 @@
VERSION = "0.2.0"
local config = import("micro/config")
function init()
-- uses the default linter plugin
-- matches any filetype
linter.makeLinter("misspell", "", "misspell", {"%f"}, "%f:%l:%c: %m", {}, false, true)
end

View file

@ -0,0 +1,22 @@
[{
"Name": "misspell",
"Description": "plugin that corrects commonly misspelled words",
"Tags": ["spell", "check", "misspell"],
"Website": "https://github.com/onodera-punpun/micro-misspell-plugin",
"Versions": [
{
"Version": "0.2.0",
"Url": "https://github.com/micro-editor/updated-plugins/releases/download/v1.0.0/misspell-0.2.0.zip",
"Require": {
"micro": ">=2.0.0-1"
}
},
{
"Version": "0.1.0",
"Url": "https://github.com/onodera-punpun/micro-misspell-plugin/archive/0.1.0.zip",
"Require": {
"micro": ">=1.0.3"
}
}
]
}]

View file

@ -0,0 +1,3 @@
VERSION = "0.1.0"
AddRuntimeFile("monokai-dark", "colorscheme", "monokai-dark.micro")

View file

@ -0,0 +1,21 @@
color-link default "#D5D8D6,#1D0000"
color-link comment "#75715E"
color-link identifier "#66D9EF"
color-link constant "#AE81FF"
color-link constant.string "#E6DB74"
color-link constant.string.char "#BDE6AD"
color-link statement "#F92672"
color-link preproc "#CB4B16"
color-link type "#66D9EF"
color-link special "#A6E22E"
color-link underlined "#D33682"
color-link error "bold #CB4B16"
color-link todo "bold #D33682"
color-link statusline "#282828,#F8F8F2"
color-link indent-char "#505050,#282828"
color-link line-number "#AAAAAA,#282828"
color-link current-line-number "#AAAAAA,#282828"
color-link gutter-error "#CB4B16"
color-link gutter-warning "#E6DB74"
color-link cursor-line "#323232"
color-link color-column "#323232"

View file

@ -0,0 +1,14 @@
[{
"Name": "monokai-dark",
"Description": "A dark monokai colorscheme for micro",
"Tags": ["colorscheme"],
"Versions": [
{
"Version": "0.1.0",
"Url": "https://github.com/theodus/monokai-dark/archive/0.1.0.zip",
"Require": {
"micro": ">=1.1.3"
}
}
]
}]

View file

@ -0,0 +1,6 @@
Version 1.2.1
* Fixed utf8 character count
Version 1.2.0
+ Now counts lines
+ Added Support for counting lines, words and characters in selection

View file

@ -0,0 +1,21 @@
MIT License
Copyright (c) 2020 bananaapple
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.

View file

@ -0,0 +1,4 @@
# Micro Word Count Plugin
Word, character and line counter for micro editor.
(forked from https://github.com/adamnpeace/micro-wc-plugin)

View file

@ -0,0 +1,25 @@
# WordCount (wc) Plugin #
The wc plugin provides the user with the ability to count either
characters or strings in any text being edited with micro.
A word is defined as a string of characters delimited by white
space characters. White space characters are the set of characters
for which the iswspace(3) function returns true.
A line is defined as a string of characters delimited by \n
characters, or by the beginning or end of the file. \r\n line
endings will be counted correctly as well, since there is only
one \n per \r\n.
Character count includes white space and newline characters.
To initiate the function, you can either:
Press "F5"
Or run:
```
> wc
```

View file

@ -0,0 +1,10 @@
{
"name": "wc",
"description": "Word count plugin",
"website": "",
"install": "",
"version": "1.2.1",
"require": [
"micro >= 2.0.0"
]
}

View file

@ -0,0 +1,22 @@
[{
"Name": "wc",
"Description": "Plugin to count words/characters in micro",
"Tags": ["wc", "word", "character", "count"],
"Website": "https://github.com/adamnpeace/micro-wc-plugin",
"Versions": [
{
"Version": "1.1.0",
"Url": "https://github.com/adamnpeace/micro-wc-plugin/archive/v1.1.0.zip",
"Require": {
"micro": ">=2.0.0-1"
}
},
{
"Version": "1.0.1",
"Url": "https://github.com/adamnpeace/micro-wc-plugin/archive/v1.0.1.zip",
"Require": {
"micro": ">=1.1.0"
}
}
]
}]

View file

@ -0,0 +1,37 @@
VERSION = "1.2.1"
local micro = import("micro")
local config = import("micro/config")
local util = import("micro/util")
local utf8 = import("unicode/utf8")
function init()
config.MakeCommand("wc", wordCount, config.NoComplete)
config.AddRuntimeFile("wc", config.RTHelp, "help/wc.md")
config.TryBindKey("F5", "lua:wc.wordCount", false)
end
function wordCount(bp)
-- Buffer of selection/whole document
local buffer
--Get active cursor (to get selection)
local cursor = bp.Buf:GetActiveCursor()
--If cursor exists and there is selection, convert selection byte[] to string
if cursor and cursor:HasSelection() then
buffer = util.String(cursor:GetSelection())
else
--no selection, convert whole buffer byte[] to string
buffer = util.String(bp.Buf:Bytes())
end
--length of the buffer/selection (string), utf8 friendly
charCount = utf8.RuneCountInString(buffer)
--Get word/line count using gsub's number of substitutions
-- number of substitutions, pattern: %S+ (more than one non-whitespace characters)
local _ , wordCount = buffer:gsub("%S+","")
-- number of substitutions, pattern: \n (number of newline characters)
local _, lineCount = buffer:gsub("\n", "")
--add one to line count (since we're counting separators not lines above)
lineCount = lineCount + 1
--display the message
micro.InfoBar():Message("Lines:" .. lineCount .. " Words:"..wordCount.." Characters:"..charCount)
end

View file

@ -0,0 +1,5 @@
{
"autosu": true,
"colorscheme": "monokai-dark",
"mkparents": true
}