Add reopen cmd and other encodings support

This commit is contained in:
Zachary Yedidia
2019-01-23 19:06:20 -05:00
parent ef3f081347
commit ad50d7aa56
11 changed files with 78 additions and 19 deletions

View File

@@ -12,13 +12,24 @@ import (
"time"
"unicode/utf8"
"github.com/saintfish/chardet"
"github.com/zyedidia/micro/cmd/micro/config"
"github.com/zyedidia/micro/cmd/micro/highlight"
"github.com/zyedidia/micro/cmd/micro/screen"
. "github.com/zyedidia/micro/cmd/micro/util"
"golang.org/x/text/encoding/htmlindex"
"golang.org/x/text/encoding/unicode"
"golang.org/x/text/transform"
)
var OpenBuffers []*Buffer
var (
OpenBuffers []*Buffer
detector *chardet.Detector // encoding detector
)
func init() {
detector = chardet.NewTextDetector()
}
// The BufType defines what kind of buffer this is
type BufType struct {
@@ -89,6 +100,8 @@ type Buffer struct {
// Settings customized by the user
Settings map[string]interface{}
Suggestions []string
Messages []*Message
}
@@ -132,7 +145,7 @@ func NewBufferFromString(text, path string, btype BufType) *Buffer {
// NewBuffer creates a new buffer from a given reader with a given path
// Ensure that ReadSettings and InitGlobalSettings have been called before creating
// a new buffer
func NewBuffer(reader io.Reader, size int64, path string, cursorPosition []string, btype BufType) *Buffer {
func NewBuffer(r io.Reader, size int64, path string, cursorPosition []string, btype BufType) *Buffer {
absPath, _ := filepath.Abs(path)
b := new(Buffer)
@@ -145,6 +158,14 @@ func NewBuffer(reader io.Reader, size int64, path string, cursorPosition []strin
}
config.InitLocalSettings(b.Settings, b.Path)
enc, err := htmlindex.Get(b.Settings["encoding"].(string))
if err != nil {
enc = unicode.UTF8
b.Settings["encoding"] = "utf-8"
}
reader := transform.NewReader(r, enc.NewDecoder())
found := false
if len(path) > 0 {
for _, buf := range OpenBuffers {
@@ -263,7 +284,18 @@ func (b *Buffer) FileType() string {
// ReOpen reloads the current buffer from disk
func (b *Buffer) ReOpen() error {
data, err := ioutil.ReadFile(b.Path)
file, err := os.Open(b.Path)
if err != nil {
return err
}
enc, err := htmlindex.Get(b.Settings["encoding"].(string))
if err != nil {
return err
}
reader := transform.NewReader(file, enc.NewDecoder())
data, err := ioutil.ReadAll(reader)
txt := string(data)
if err != nil {

View File

@@ -1,7 +1,6 @@
package buffer
import (
"bufio"
"bytes"
"errors"
"io"
@@ -12,6 +11,9 @@ import (
"github.com/zyedidia/micro/cmd/micro/config"
. "github.com/zyedidia/micro/cmd/micro/util"
"golang.org/x/text/encoding"
"golang.org/x/text/encoding/htmlindex"
"golang.org/x/text/transform"
)
// LargeFileThreshold is the number of bytes when fastdirty is forced
@@ -21,7 +23,7 @@ const LargeFileThreshold = 50000
// overwriteFile opens the given file for writing, truncating if one exists, and then calls
// the supplied function with the file as io.Writer object, also making sure the file is
// closed afterwards.
func overwriteFile(name string, fn func(io.Writer) error) (err error) {
func overwriteFile(name string, enc encoding.Encoding, fn func(io.Writer) error) (err error) {
var file *os.File
if file, err = os.OpenFile(name, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0644); err != nil {
@@ -34,13 +36,14 @@ func overwriteFile(name string, fn func(io.Writer) error) (err error) {
}
}()
w := bufio.NewWriter(file)
w := transform.NewWriter(file, enc.NewEncoder())
// w := bufio.NewWriter(file)
if err = fn(w); err != nil {
return
}
err = w.Flush()
// err = w.Flush()
return
}
@@ -105,7 +108,12 @@ func (b *Buffer) SaveAs(filename string) error {
var fileSize int
err := overwriteFile(absFilename, func(file io.Writer) (e error) {
enc, err := htmlindex.Get(b.Settings["encoding"].(string))
if err != nil {
return err
}
err = overwriteFile(absFilename, enc, func(file io.Writer) (e error) {
if len(b.lines) == 0 {
return
}

View File

@@ -9,6 +9,7 @@ import (
"github.com/zyedidia/micro/cmd/micro/config"
. "github.com/zyedidia/micro/cmd/micro/util"
"golang.org/x/text/encoding/unicode"
)
// The SerializedBuffer holds the types that get serialized when a buffer is saved
@@ -32,7 +33,7 @@ func (b *Buffer) Serialize() error {
name := config.ConfigDir + "/buffers/" + EscapePath(b.AbsPath)
return overwriteFile(name, func(file io.Writer) error {
return overwriteFile(name, unicode.UTF8, func(file io.Writer) error {
err := gob.NewEncoder(file).Encode(SerializedBuffer{
b.EventHandler,
b.GetActiveCursor().Loc,

View File

@@ -43,6 +43,8 @@ func (b *Buffer) SetOption(option, value string) error {
} else {
b.UpdateRules()
}
} else if option == "encoding" {
b.isModified = true
}
return nil