"regexp"
"runtime"
"sort"
+ "strconv"
"time"
"github.com/go-errors/errors"
}
files := make([]string, 0, len(args))
- flagStartPos := ""
- flagr := regexp.MustCompile(`^\+\d+(:\d+)?$`)
+ flagStartPos := buffer.Loc{-1, -1}
+ flagr := regexp.MustCompile(`^\+(\d+)(?::(\d+))?$`)
for _, a := range args {
- if flagr.MatchString(a) {
- flagStartPos = a[1:]
- } else {
- if flagStartPos != "" {
- files = append(files, a+":"+flagStartPos)
- flagStartPos = ""
- } else {
- files = append(files, a)
+ match := flagr.FindStringSubmatch(a)
+ if len(match) == 3 && match[2] != "" {
+ line, err := strconv.Atoi(match[1])
+ if err != nil {
+ screen.TermMessage(err)
+ continue
+ }
+ col, err := strconv.Atoi(match[2])
+ if err != nil {
+ screen.TermMessage(err)
+ continue
}
+ flagStartPos = buffer.Loc{col, line - 1}
+ } else if len(match) == 3 && match[2] == "" {
+ line, err := strconv.Atoi(match[1])
+ if err != nil {
+ screen.TermMessage(err)
+ continue
+ }
+ flagStartPos = buffer.Loc{0, line - 1}
+ } else {
+ files = append(files, a)
}
}
// Option 1
// We go through each file and load it
for i := 0; i < len(files); i++ {
- buf, err := buffer.NewBufferFromFile(files[i], btype)
+ buf, err := buffer.NewBufferFromFileAtLoc(files[i], btype, flagStartPos)
if err != nil {
screen.TermMessage(err)
continue
screen.TermMessage("Error reading from stdin: ", err)
input = []byte{}
}
- buffers = append(buffers, buffer.NewBufferFromString(string(input), filename, btype))
+ buffers = append(buffers, buffer.NewBufferFromStringAtLoc(string(input), filename, btype, flagStartPos))
} else {
// Option 3, just open an empty buffer
- buffers = append(buffers, buffer.NewBufferFromString(string(input), filename, btype))
+ buffers = append(buffers, buffer.NewBufferFromStringAtLoc(string(input), filename, btype, flagStartPos))
}
return buffers
StartCursor Loc
}
-// NewBufferFromFile opens a new buffer using the given path
-// It will also automatically handle `~`, and line/column with filename:l:c
-// It will return an empty buffer if the path does not exist
-// and an error if the file is a directory
-func NewBufferFromFile(path string, btype BufType) (*Buffer, error) {
+// NewBufferFromFileAtLoc opens a new buffer with a given cursor location
+// If cursorLoc is {-1, -1} the location does not overwrite what the cursor location
+// would otherwise be (start of file, or saved cursor position if `savecursor` is
+// enabled)
+func NewBufferFromFileAtLoc(path string, btype BufType, cursorLoc Loc) (*Buffer, error) {
var err error
- var cursorPos []string
filename := path
- if config.GetGlobalOption("parsecursor").(bool) {
- filename, cursorPos = util.GetPathAndCursorPosition(path)
+ if config.GetGlobalOption("parsecursor").(bool) && cursorLoc.X == -1 && cursorLoc.Y == -1 {
+ var cursorPos []string
+ filename, cursorPos = util.GetPathAndCursorPosition(filename)
+ cursorLoc, err = ParseCursorLocation(cursorPos)
+ if err != nil {
+ cursorLoc = Loc{-1, -1}
+ }
}
+
filename, err = util.ReplaceHome(filename)
if err != nil {
return nil, err
defer file.Close()
- cursorLoc, cursorerr := ParseCursorLocation(cursorPos)
- if cursorerr != nil {
- cursorLoc = Loc{-1, -1}
- }
-
var buf *Buffer
if err != nil {
// File does not exist -- create an empty buffer with that name
return buf, nil
}
+// NewBufferFromFile opens a new buffer using the given path
+// It will also automatically handle `~`, and line/column with filename:l:c
+// It will return an empty buffer if the path does not exist
+// and an error if the file is a directory
+func NewBufferFromFile(path string, btype BufType) (*Buffer, error) {
+ return NewBufferFromFileAtLoc(path, btype, Loc{-1, -1})
+}
+
+// NewBufferFromStringAtLoc creates a new buffer containing the given string with a cursor loc
+func NewBufferFromStringAtLoc(text, path string, btype BufType, cursorLoc Loc) *Buffer {
+ return NewBuffer(strings.NewReader(text), int64(len(text)), path, cursorLoc, btype)
+}
+
// NewBufferFromString creates a new buffer containing the given string
func NewBufferFromString(text, path string, btype BufType) *Buffer {
return NewBuffer(strings.NewReader(text), int64(len(text)), path, Loc{-1, -1}, btype)