This commit is contained in:
Zachary Yedidia 2020-12-17 21:55:59 -05:00
commit c13acf6b19
7 changed files with 92 additions and 2 deletions

View file

@ -144,6 +144,9 @@ func luaImportMicroUtil() *lua.LTable {
ulua.L.SetField(pkg, "GetLeadingWhitespace", luar.New(ulua.L, util.LuaGetLeadingWhitespace)) ulua.L.SetField(pkg, "GetLeadingWhitespace", luar.New(ulua.L, util.LuaGetLeadingWhitespace))
ulua.L.SetField(pkg, "IsWordChar", luar.New(ulua.L, util.LuaIsWordChar)) ulua.L.SetField(pkg, "IsWordChar", luar.New(ulua.L, util.LuaIsWordChar))
ulua.L.SetField(pkg, "String", luar.New(ulua.L, util.String)) ulua.L.SetField(pkg, "String", luar.New(ulua.L, util.String))
ulua.L.SetField(pkg, "Unzip", luar.New(ulua.L, util.Unzip))
ulua.L.SetField(pkg, "Version", luar.New(ulua.L, util.Version))
ulua.L.SetField(pkg, "SemVersion", luar.New(ulua.L, util.SemVersion))
ulua.L.SetField(pkg, "CharacterCountInString", luar.New(ulua.L, util.CharacterCountInString)) ulua.L.SetField(pkg, "CharacterCountInString", luar.New(ulua.L, util.CharacterCountInString))
ulua.L.SetField(pkg, "RuneStr", luar.New(ulua.L, func(r rune) string { ulua.L.SetField(pkg, "RuneStr", luar.New(ulua.L, func(r rune) string {
return string(r) return string(r)

View file

@ -4,6 +4,7 @@ import (
"flag" "flag"
"fmt" "fmt"
"io/ioutil" "io/ioutil"
"log"
"os" "os"
"os/signal" "os/signal"
"regexp" "regexp"
@ -351,7 +352,7 @@ func main() {
} }
if clipErr != nil { if clipErr != nil {
action.InfoBar.Error(clipErr, " or change 'clipboard' option") log.Println(clipErr, " or change 'clipboard' option")
} }
if a := config.GetGlobalOption("autosave").(float64); a > 0 { if a := config.GetGlobalOption("autosave").(float64); a > 0 {

View file

@ -42,6 +42,7 @@ func Initialize(m Method) error {
case External: case External:
err = clipboard.Initialize() err = clipboard.Initialize()
} }
CurrentMethod = Internal
return err return err
} }

View file

@ -1,6 +1,7 @@
package lua package lua
import ( import (
"archive/zip"
"bytes" "bytes"
"errors" "errors"
"fmt" "fmt"
@ -9,6 +10,7 @@ import (
"math" "math"
"math/rand" "math/rand"
"net" "net"
"net/http"
"os" "os"
"path" "path"
"path/filepath" "path/filepath"
@ -74,6 +76,10 @@ func Import(pkg string) *lua.LTable {
return importUtf8() return importUtf8()
case "humanize": case "humanize":
return importHumanize() return importHumanize()
case "net/http", "http":
return importHTTP()
case "archive/zip":
return importArchiveZip()
default: default:
return nil return nil
} }
@ -383,6 +389,7 @@ func importOs() *lua.LTable {
L.SetField(pkg, "Symlink", luar.New(L, os.Symlink)) L.SetField(pkg, "Symlink", luar.New(L, os.Symlink))
L.SetField(pkg, "TempDir", luar.New(L, os.TempDir)) L.SetField(pkg, "TempDir", luar.New(L, os.TempDir))
L.SetField(pkg, "Truncate", luar.New(L, os.Truncate)) L.SetField(pkg, "Truncate", luar.New(L, os.Truncate))
L.SetField(pkg, "UserHomeDir", luar.New(L, os.UserHomeDir))
return pkg return pkg
} }
@ -570,3 +577,22 @@ func importHumanize() *lua.LTable {
return pkg return pkg
} }
func importHTTP() *lua.LTable {
pkg := L.NewTable()
L.SetField(pkg, "Get", luar.New(L, http.Get))
L.SetField(pkg, "Post", luar.New(L, http.Post))
return pkg
}
func importArchiveZip() *lua.LTable {
pkg := L.NewTable()
L.SetField(pkg, "OpenReader", luar.New(L, zip.OpenReader))
L.SetField(pkg, "NewReader", luar.New(L, zip.NewReader))
L.SetField(pkg, "NewWriter", luar.New(L, zip.NewWriter))
return pkg
}

View file

@ -1,9 +1,11 @@
package util package util
import ( import (
"archive/zip"
"bytes" "bytes"
"errors" "errors"
"fmt" "fmt"
"io"
"os" "os"
"os/user" "os/user"
"path/filepath" "path/filepath"
@ -435,3 +437,56 @@ func ParseSpecial(s string) string {
func String(s []byte) string { func String(s []byte) string {
return string(s) return string(s)
} }
// Unzip unzips a file to given folder
func Unzip(src, dest string) error {
r, err := zip.OpenReader(src)
if err != nil {
return err
}
defer r.Close()
os.MkdirAll(dest, 0755)
// Closure to address file descriptors issue with all the deferred .Close() methods
extractAndWriteFile := func(f *zip.File) error {
rc, err := f.Open()
if err != nil {
return err
}
defer rc.Close()
path := filepath.Join(dest, f.Name)
// Check for ZipSlip (Directory traversal)
if !strings.HasPrefix(path, filepath.Clean(dest)+string(os.PathSeparator)) {
return fmt.Errorf("illegal file path: %s", path)
}
if f.FileInfo().IsDir() {
os.MkdirAll(path, f.Mode())
} else {
os.MkdirAll(filepath.Dir(path), f.Mode())
f, err := os.OpenFile(path, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, f.Mode())
if err != nil {
return err
}
defer f.Close()
_, err = io.Copy(f, rc)
if err != nil {
return err
}
}
return nil
}
for _, f := range r.File {
err := extractAndWriteFile(f)
if err != nil {
return err
}
}
return nil
}

View file

@ -87,7 +87,8 @@ These may vary widely based on the 16 colors selected for your terminal.
True color requires your terminal to support it. This means that the True color requires your terminal to support it. This means that the
environment variable `COLORTERM` should have the value `truecolor`, `24bit`, environment variable `COLORTERM` should have the value `truecolor`, `24bit`,
or `24-bit`. In addition, to enable true color in micro, the environment or `24-bit`. In addition, to enable true color in micro, the environment
variable `MICRO_TRUECOLOR` must be set to 1. variable `MICRO_TRUECOLOR` must be set to 1. Note that you have to create
and set this variable yourself.
* `solarized-tc`: this is the solarized colorscheme for true color. * `solarized-tc`: this is the solarized colorscheme for true color.
* `atom-dark-tc`: this colorscheme is based off of Atom's "dark" colorscheme. * `atom-dark-tc`: this colorscheme is based off of Atom's "dark" colorscheme.

View file

@ -285,6 +285,7 @@ The packages and functions are listed below (in Go type signatures):
string is a word character. string is a word character.
- `String(b []byte) string`: converts a byte array to a string. - `String(b []byte) string`: converts a byte array to a string.
- `RuneStr(r rune) string`: converts a rune to a string. - `RuneStr(r rune) string`: converts a rune to a string.
- `Unzip(src, dest string) error`: unzips a file to given folder.
This may seem like a small list of available functions but some of the objects This may seem like a small list of available functions but some of the objects
returned by the functions have many methods. The Lua plugin may access any returned by the functions have many methods. The Lua plugin may access any
@ -358,6 +359,8 @@ strings
regexp regexp
errors errors
time time
archive/zip
net/http
``` ```
For documentation for each of these functions, see the Go standard For documentation for each of these functions, see the Go standard