diff --git a/.gitattributes b/.gitattributes deleted file mode 100644 index 4be2b02..0000000 --- a/.gitattributes +++ /dev/null @@ -1,4 +0,0 @@ -backend/textmate/testdata/* -text -backend/testdata/* -text -backend/loaders/json/testdata/* -text -backend/loaders/plist/testdata/* -text diff --git a/.gitignore b/.gitignore deleted file mode 100644 index f2af033..0000000 --- a/.gitignore +++ /dev/null @@ -1,12 +0,0 @@ -*.sublime-workspace -*.sublime-project -build/* -!build/.gitkeep -out.txt -*.pyc -*.log -*.log.0* -.DS_Store -frontend/termbox/termbox -frontend/html/html -frontend/qml/qml diff --git a/.gitmodules b/.gitmodules deleted file mode 100644 index ec4598f..0000000 --- a/.gitmodules +++ /dev/null @@ -1,88 +0,0 @@ -[submodule "packages/c.tmbundle"] - path = packages/c.tmbundle - url = https://github.com/textmate/c.tmbundle -[submodule "packages/property-list.tmbundle"] - path = packages/property-list.tmbundle - url = https://github.com/textmate/property-list.tmbundle -[submodule "packages/monokai.tmbundle"] - path = packages/monokai.tmbundle - url = https://github.com/textmate/monokai.tmbundle -[submodule "packages/xml.tmbundle"] - path = packages/xml.tmbundle - url = https://github.com/textmate/xml.tmbundle.git -[submodule "packages/go.tmbundle"] - path = packages/go.tmbundle - url = https://github.com/AlanQuatermain/go-tmbundle.git -[submodule "packages/themes/TextMate-Themes"] - path = packages/themes/TextMate-Themes - url = https://github.com/filmgirl/TextMate-Themes.git -[submodule "packages/GoSublime"] - path = packages/GoSublime - url = https://github.com/DisposaBoy/GoSublime.git -[submodule "packages/Vintageous"] - path = packages/Vintageous - url = https://github.com/quarnster/Vintageous.git - ignore = dirty -[submodule "packages/themes/soda"] - path = packages/themes/soda - url = https://github.com/buymeasoda/soda-theme.git -[submodule "packages/python.tmbundle"] - path = packages/python.tmbundle - url = https://github.com/textmate/python.tmbundle.git -[submodule "packages/Diff.tmbundle"] - path = packages/Diff.tmbundle - url = https://github.com/textmate/Diff.tmbundle.git -[submodule "packages/ruby.tmbundle"] - path = packages/ruby.tmbundle - url = https://github.com/textmate/ruby.tmbundle.git -[submodule "packages/perl.tmbundle"] - path = packages/perl.tmbundle - url = https://github.com/textmate/perl.tmbundle.git -[submodule "packages/sql.tmbundle"] - path = packages/sql.tmbundle - url = https://github.com/textmate/sql.tmbundle.git -[submodule "packages/html.tmbundle"] - path = packages/html.tmbundle - url = https://github.com/textmate/html.tmbundle.git -[submodule "packages/php.tmbundle"] - path = packages/php.tmbundle - url = https://github.com/textmate/php.tmbundle.git -[submodule "packages/make.tmbundle"] - path = packages/make.tmbundle - url = https://github.com/textmate/make.tmbundle.git -[submodule "packages/java.tmbundle"] - path = packages/java.tmbundle - url = https://github.com/textmate/java.tmbundle.git -[submodule "packages/javascript.tmbundle"] - path = packages/javascript.tmbundle - url = https://github.com/textmate/javascript.tmbundle.git -[submodule "packages/css.tmbundle"] - path = packages/css.tmbundle - url = https://github.com/textmate/css.tmbundle.git -[submodule "packages/shellscript.tmbundle"] - path = packages/shellscript.tmbundle - url = https://github.com/textmate/shellscript.tmbundle.git -[submodule "packages/json.tmbundle"] - path = packages/json.tmbundle - url = https://github.com/textmate/json.tmbundle.git -[submodule "packages/markdown.tmbundle"] - path = packages/markdown.tmbundle - url = https://github.com/textmate/markdown.tmbundle.git -[submodule "packages/haskell.tmbundle"] - path = packages/haskell.tmbundle - url = https://github.com/textmate/haskell.tmbundle.git -[submodule "packages/lua.tmbundle"] - path = packages/lua.tmbundle - url = https://github.com/textmate/lua.tmbundle.git -[submodule "packages/yaml.tmbundle"] - path = packages/yaml.tmbundle - url = https://github.com/textmate/yaml.tmbundle.git -[submodule "packages/d.tmbundle"] - path = packages/d.tmbundle - url = https://github.com/textmate/d.tmbundle.git -[submodule "packages/cmake.tmbundle"] - path = packages/cmake.tmbundle - url = https://github.com/textmate/cmake.tmbundle.git -[submodule "packages/ini.tmbundle"] - path = packages/ini.tmbundle - url = https://github.com/textmate/ini.tmbundle.git diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index 59039ae..0000000 --- a/.travis.yml +++ /dev/null @@ -1,24 +0,0 @@ -os: - - osx - - linux - -language: go - -go: 1.4 - -install: - - ./tasks/ci/install.sh - -script: - - ./tasks/ci/run_tests.sh - - ./tasks/ci/build_frontends.sh - - ./tasks/ci/check_gen.sh - - ./tasks/ci/check_fmt.sh - -notifications: - webhooks: - urls: - - https://webhooks.gitter.im/e/3e692a5224c8490f19bd - on_success: change - on_failure: always - on_start: false diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index d6beadf..6c9bfd0 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -12,14 +12,14 @@ All issues reported here should result in code being changed, added and/or remov ### 3. Feature requests belong here, unless they can be implemented via a plugin. -If the feature can be implemented via a plugin it fails by proxy to satisfy [#2](https://github.com/limetext/lime/blob/master/CONTRIBUTING.md#2-issues-should-be-openened-up-in-the-correct-repository). +If the feature can be implemented via a plugin it fails by proxy to satisfy [#2](CONTRIBUTING.md#2-issues-should-be-openened-up-in-the-correct-repository). ### 4. Bug reports belong here. Bug reports should include a description of current behaviour and the expected behaviour in cases where this isn't obvious. -User errors where the error does not result in a code change count as support and fail to satisfy [#1](https://github.com/limetext/lime/blob/master/CONTRIBUTING.md#1-the-issues-list-is-for-development-purposes-only). +User errors where the error does not result in a code change count as support and fail to satisfy [#1](CONTRIBUTING.md#1-the-issues-list-is-for-development-purposes-only). ### 5. If you'd like to help but don't know how. diff --git a/LICENSE b/LICENSE index 9d8ff9b..45ecced 100644 --- a/LICENSE +++ b/LICENSE @@ -1,4 +1,4 @@ -Copyright (c) 2013 Fredrik Ehnbom and [contributors](https://github.com/limetext/lime/graphs/contributors) +Copyright (c) 2013 The lime Authors All rights reserved. Redistribution and use in source and binary forms, with or without diff --git a/README.md b/README.md index 71df7fe..32be323 100644 --- a/README.md +++ b/README.md @@ -1,15 +1,21 @@ -[![Build Status](https://travis-ci.org/limetext/lime.svg?branch=master)](https://travis-ci.org/limetext/lime) -[![Coverage Status](https://img.shields.io/coveralls/limetext/lime.svg?branch=master)](https://coveralls.io/r/limetext/lime?branch=master) -[![GoDoc](https://godoc.org/github.com/limetext/lime?status.svg)](https://godoc.org/github.com/limetext/lime) [![Bountysource Bounties](https://www.bountysource.com/badge/team?team_id=8742&style=bounties_received)](https://www.bountysource.com/teams/limetext/issues?utm_source=limetext&utm_medium=shield&utm_campaign=bounties_received) [![Bountysource Raised](https://www.bountysource.com/badge/team?team_id=8742&style=raised)](https://www.bountysource.com/teams/limetext?utm_source=limetext&utm_medium=shield&utm_campaign=raised) [![Gitter](https://badges.gitter.im/Join Chat.svg)](https://gitter.im/limetext/lime) +# lime + +Welcome to the meta project for Lime. + +For the backend, please see [limetext/lime-backend](https://github.com/limetext/lime-backend). + +There are also three frontends currently in development: [limetext/lime-qml](https://github.com/limetext/lime-qml), [limetext/lime-termbox](https://github.com/limetext/lime-termbox), and [limetext/lime-html](https://github.com/limetext/lime-html). + + # Status -The [frontends](https://github.com/limetext/lime/issues?direction=desc&labels=frontend) are **not** ready to replace your favourite editor, but the backend itself isn't too far away. +The frontends are **not** ready to replace your favourite editor, but the backend isn't too far away. If you want to help us build Lime, great! We'd love your help. See [here](https://github.com/limetext/lime#contributing) for how you could be most useful. @@ -54,11 +60,11 @@ If your pull request is not accepted on the first try, don't be discouraged! If Where is a good place to start? The [Contributing](https://github.com/limetext/lime/wiki/Contributing) page in the wiki has some suggestions. Think the [wiki](https://github.com/limetext/lime/wiki/_pages) needs clarifying, or something is missing? Go ahead and make the change. -Guidelines for making contributions can be found in [CONTRIBUTING.md](https://github.com/limetext/lime/blob/master/CONTRIBUTING.md). +Guidelines for making contributions can be found in [CONTRIBUTING.md](CONTRIBUTING.md). Want to chat? Find us on [Gitter](https://gitter.im/limetext/lime). # License -The license of the project is the [2-clause BSD license](https://github.com/limetext/lime/blob/master/LICENSE). +The license of the project is the [2-clause BSD license](LICENSE). diff --git a/backend/command.go b/backend/command.go deleted file mode 100644 index 262185f..0000000 --- a/backend/command.go +++ /dev/null @@ -1,127 +0,0 @@ -// Copyright 2013 The lime Authors. -// Use of this source code is governed by a 2-clause -// BSD-style license that can be found in the LICENSE file. - -package backend - -type ( - // The Args type is just a generic string key and interface{} value - // map type used to serialize command arguments. - Args map[string]interface{} - - // The CustomSet interface can be optionally implemented - // by struct members of a concrete command struct. - // - // If implemented, it'll be called by the default - // Command initialization code with the data gotten - // from the Args map. - CustomSet interface { - Set(v interface{}) error - } - - CustomDefault interface { - Default(key string) interface{} - } - - // The CustomInit interface can be optionally implemented - // by a Command and will be called instead of the default - // command initialization code. - CustomInit interface { - Init(args Args) error - } - - // The Command interface implements the basic interface - // that is shared between the different more specific - // command type interfaces. - // - // In the traditional Model-view-controller design, - // Commands are roughly equivalent to the action-taking - // controller piece. - Command interface { - // Returns whether the Command is enabled or not. - IsEnabled() bool - - // Returns whether the Command is visible in menus, - // the goto anything panel or other user interface - // that lists available commands. - IsVisible() bool - - // Returns the textual description of the command. - Description() string - - // Whether or not this Command bypasses the undo stack. - BypassUndo() bool - } - - // The WindowCommand interface extends the base Command interface - // with functionality specific for WindowCommands. - WindowCommand interface { - Command - - // Execute this command with the specified window as the - // argument - Run(*Window) error - } - - // The TextCommand interface extends the base Command interface - // with functionality specific for TextCommands. - TextCommand interface { - Command - - // Execute this command with the specified View and Edit object - // as the arguments - Run(*View, *Edit) error - } - - // The ApplicationCommand interface extends the base Command interface - // with functionality specific for ApplicationCommands. - ApplicationCommand interface { - Command - - // Execute this command - Run() error - - // Returns whether this command is checked or not. - // Used to display a checkbox in the user interface - // for boolean commands. - IsChecked() bool - } - - // The DefaultCommand implements the default operation - // of the basic Command interface and is recommended to - // be used as the base when creating new Commands. - DefaultCommand struct{} - - // The BypassUndoCommand is the same as the DefaultCommand - // type, except that its implementation of BypassUndo returns - // true rather than false. - BypassUndoCommand struct { - DefaultCommand - } -) - -// The default is to not bypass the undo stack. -func (d *DefaultCommand) BypassUndo() bool { - return false -} - -// By default a command is enabled. -func (d *DefaultCommand) IsEnabled() bool { - return true -} - -// By default a command is visible. -func (d *DefaultCommand) IsVisible() bool { - return true -} - -// By default the string "TODO" is return as the description. -func (d *DefaultCommand) Description() string { - return "TODO" -} - -// The BypassUndoCommand defaults to bypassing the -// undo stack. -func (b *BypassUndoCommand) BypassUndo() bool { - return true -} diff --git a/backend/command_test.go b/backend/command_test.go deleted file mode 100644 index c5a860a..0000000 --- a/backend/command_test.go +++ /dev/null @@ -1,49 +0,0 @@ -// Copyright 2014 The lime Authors. -// Use of this source code is governed by a 2-clause -// BSD-style license that can be found in the LICENSE file. - -package backend - -import ( - "testing" -) - -func TestDefaultCommand(t *testing.T) { - dc := DefaultCommand{} - - if dc.BypassUndo() != false { - t.Errorf("Expected BypassUndo to return false, but got %v", dc.BypassUndo()) - } - - if dc.IsEnabled() != true { - t.Errorf("Expected IsEnabled to return true, but got %v", dc.IsEnabled()) - } - - if dc.IsVisible() != true { - t.Errorf("Expected IsVisible to return true, but got %v", dc.IsVisible()) - } - - if dc.Description() != "TODO" { - t.Errorf("Expected Description to return \"TODO\", but got %v", dc.Description()) - } -} - -func TestBypassUndoCommand(t *testing.T) { - bc := BypassUndoCommand{} - - if bc.BypassUndo() != true { - t.Errorf("Expected BypassUndo to return true, but got %v", bc.BypassUndo()) - } - - if bc.IsEnabled() != true { - t.Errorf("Expected IsEnabled to return true, but got %v", bc.IsEnabled()) - } - - if bc.IsVisible() != true { - t.Errorf("Expected IsVisible to return true, but got %v", bc.IsVisible()) - } - - if bc.Description() != "TODO" { - t.Errorf("Expected Description to return \"TODO\", but got %v", bc.Description()) - } -} diff --git a/backend/commandhandler.go b/backend/commandhandler.go deleted file mode 100644 index 79a93c6..0000000 --- a/backend/commandhandler.go +++ /dev/null @@ -1,204 +0,0 @@ -// Copyright 2013 The lime Authors. -// Use of this source code is governed by a 2-clause -// BSD-style license that can be found in the LICENSE file. - -package backend - -import ( - "fmt" - "github.com/limetext/lime/backend/log" - . "github.com/limetext/lime/backend/util" - "reflect" - "strings" - "time" -) - -type ( - CommandHandler interface { - Unregister(string) error - RegisterWithDefault(cmd interface{}) error - Register(name string, cmd interface{}) error - // TODO(q): Do the commands need to be split in separate lists? - RunWindowCommand(*Window, string, Args) error - RunTextCommand(*View, string, Args) error - RunApplicationCommand(string, Args) error - } - - appcmd map[string]Command - textcmd map[string]Command - wndcmd map[string]Command - commandHandler struct { - ApplicationCommands appcmd - TextCommands textcmd - WindowCommands wndcmd - log bool - verbose bool - } -) - -func DefaultName(cmd interface{}) string { - name := reflect.TypeOf(cmd).Elem().Name() - return PascalCaseToSnakeCase(strings.TrimSuffix(name, "Command")) -} - -// If the cmd implements the CustomInit interface, its Init function -// is called, otherwise the fields of the cmd's underlying struct type -// will be enumerated and match against the dictionary keys in args, -// or if the key isn't provided in args, the Zero value will be used. -func (ch *commandHandler) init(cmd interface{}, args Args) error { - if in, ok := cmd.(CustomInit); ok { - return in.Init(args) - } - v := reflect.ValueOf(cmd).Elem() - t := v.Type() - for i := 0; i < v.NumField(); i++ { - ft := t.Field(i) - f := v.Field(i) - if ft.Anonymous || !f.CanSet() { - continue - } - key := PascalCaseToSnakeCase(ft.Name) - fv, ok := args[key] - if !ok { - fv = reflect.Zero(ft.Type).Interface() - if def, ok := cmd.(CustomDefault); ok { - if val := def.Default(key); val != nil { - fv = val - } - } - } - if f.CanAddr() { - if f2, ok := f.Addr().Interface().(CustomSet); ok { - if err := f2.Set(fv); err != nil { - return err - } - continue - } - } - f.Set(reflect.ValueOf(fv)) - } - return nil -} - -func (ch *commandHandler) RunWindowCommand(wnd *Window, name string, args Args) error { - lvl := log.FINE - p := Prof.Enter("wc") - defer p.Exit() - if ch.log { - lvl = log.DEBUG - } - log.Logf(lvl, "Running window command: %s %v", name, args) - t := time.Now() - if c, ok := ch.WindowCommands[name].(WindowCommand); c != nil && ok { - if err := ch.init(c, args); err != nil && ch.verbose { - log.Debug("Command initialization failed: %s", err) - return err - } else if err := wnd.runCommand(c, name); err != nil { - log.Logf(lvl+1, "Command execution failed: %s", err) - return err - } else { - log.Logf(lvl, "Ran Window command: %s %s", name, time.Since(t)) - } - } else { - log.Logf(lvl, "No such window command: %s", name) - } - return nil -} - -func (ch *commandHandler) RunTextCommand(view *View, name string, args Args) error { - lvl := log.FINE - p := Prof.Enter("tc") - defer p.Exit() - t := time.Now() - if ch.log { - lvl = log.DEBUG - } - log.Logf(lvl, "Running text command: %s %v", name, args) - if c, ok := ch.TextCommands[name].(TextCommand); c != nil && ok { - if err := ch.init(c, args); err != nil && ch.verbose { - log.Debug("Command initialization failed: %s", err) - return err - } else if err := view.runCommand(c, name); err != nil { - log.Logf(lvl, "Command execution failed: %s", err) - return err - } - } else if w := view.Window(); w != nil { - if c, ok := ch.WindowCommands[name].(WindowCommand); c != nil && ok { - if err := w.runCommand(c, name); err != nil { - log.Logf(lvl, "Command execution failed: %s", err) - return err - } - } - } - log.Logf(lvl, "Ran text command: %s %s", name, time.Since(t)) - return nil -} - -func (ch *commandHandler) RunApplicationCommand(name string, args Args) error { - p := Prof.Enter("ac") - defer p.Exit() - if ch.log { - log.Info("Running application command: %s %v", name, args) - } else { - log.Fine("Running application command: %s %v", name, args) - } - if c, ok := ch.ApplicationCommands[name].(ApplicationCommand); c != nil && ok { - if err := ch.init(c, args); err != nil && ch.verbose { - log.Debug("Command initialization failed: %s", err) - return err - } else if err := c.Run(); err != nil && ch.verbose { - log.Debug("Command execution failed: %s", err) - return err - } - } - return nil -} - -func (ch *commandHandler) Unregister(name string) error { - if _, ok := ch.ApplicationCommands[name]; ok { - ch.ApplicationCommands[name] = nil - } else if _, ok := ch.WindowCommands[name]; ok { - ch.WindowCommands[name] = nil - } else if _, ok := ch.TextCommands[name]; ok { - ch.TextCommands[name] = nil - } else { - return fmt.Errorf("%s wasn't a registered command", name) - } - return nil -} - -func (ch *commandHandler) RegisterWithDefault(cmd interface{}) error { - return ch.Register(DefaultName(cmd), cmd) -} - -func (ch *commandHandler) Register(name string, cmd interface{}) error { - var r = false - log.Finest("Want to register %s", name) - if ac, ok := cmd.(ApplicationCommand); ok { - if _, ok := ch.ApplicationCommands[name]; ok { - return fmt.Errorf("%s is already a registered command", name) - } - r = true - ch.ApplicationCommands[name] = ac - } - if wc, ok := cmd.(WindowCommand); ok { - if _, ok := ch.WindowCommands[name]; ok { - return fmt.Errorf("%s is already a registered command", name) - } - r = true - ch.WindowCommands[name] = wc - } - if tc, ok := cmd.(TextCommand); ok { - if _, ok := ch.TextCommands[name]; ok { - return fmt.Errorf("%s is already a registered command", name) - } - r = true - ch.TextCommands[name] = tc - } - if !r { - return fmt.Errorf("Command wasn't registered in any list: %s", name) - } else if ch.verbose { - log.Finest("Successfully registered command %s", name) - } - return nil -} diff --git a/backend/commandhandler_test.go b/backend/commandhandler_test.go deleted file mode 100644 index 9a37451..0000000 --- a/backend/commandhandler_test.go +++ /dev/null @@ -1,220 +0,0 @@ -// Copyright 2014 The lime Authors. -// Use of this source code is governed by a 2-clause -// BSD-style license that can be found in the LICENSE file. - -package backend - -import ( - "fmt" - "testing" -) - -type ( - DummyApplicationCommand struct { - DefaultCommand - } - - DummyWindowCommand struct { - DefaultCommand - } - - DummyTextCommand struct { - DefaultCommand - } -) - -func (c *DummyApplicationCommand) Run() error { - return fmt.Errorf("Ran") -} - -func (c *DummyApplicationCommand) IsChecked() bool { - return false -} - -func (c *DummyWindowCommand) Run(w *Window) error { - return fmt.Errorf("Ran") -} - -func (c *DummyTextCommand) Run(v *View, e *Edit) error { - return fmt.Errorf("Ran") -} - -func TestDefaultName(t *testing.T) { - n := DefaultName(&DummyApplicationCommand{}) - - if n != "dummy_application" { - t.Errorf("Expected %s, but got %s", "dummy_application", n) - } -} - -func TestRegisterAndRunApplicationCommand(t *testing.T) { - name := "app_test" - ac := DummyApplicationCommand{} - ch := GetEditor().CommandHandler() - - err := ch.Register(name, &ac) - - if err != nil { - t.Errorf("Got error while registering: %s", err) - } - - err = ch.RunApplicationCommand(name, Args{}) - - if err == nil { - t.Errorf("Expected %s to run, but it didn't", name) - } else if err.Error() != "Ran" { - t.Errorf("Expected %s to run, but it got an error: %v", name, err) - } -} - -func TestRegisterAndRunWindowCommand(t *testing.T) { - ed := GetEditor() - - name := "wnd_test" - wc := DummyWindowCommand{} - ch := ed.CommandHandler() - - err := ch.Register(name, &wc) - - if err != nil { - t.Errorf("Got error while registering: %s", err) - } - - w := ed.NewWindow() - defer w.Close() - - err = ch.RunWindowCommand(w, name, Args{}) - - if err == nil { - t.Errorf("Expected %s to run, but it didn't", name) - } else if err.Error() != "Ran" { - t.Errorf("Expected %s to run, but it got an error: %v", name, err) - } -} - -func TestRegisterAndRunTextCommand(t *testing.T) { - ed := GetEditor() - - name := "text_test" - tc := DummyTextCommand{} - ch := ed.CommandHandler() - - err := ch.Register(name, &tc) - - if err != nil { - t.Errorf("Got error while registering: %s", err) - } - - w := ed.NewWindow() - defer w.Close() - - v := w.NewFile() - defer v.Close() - - err = ch.RunTextCommand(v, name, Args{}) - - if err == nil { - t.Errorf("Expected %s to run, but it didn't", name) - } else if err.Error() != "Ran" { - t.Errorf("Expected %s to run, but it got an error: %v", name, err) - } -} - -func TestRegisterAndRunDefaultNamedCommand(t *testing.T) { - ac := DummyApplicationCommand{} - ch := GetEditor().CommandHandler() - - err := ch.RegisterWithDefault(&ac) - - if err != nil { - t.Errorf("Got error while registering: %s", err) - } - - name := DefaultName(&ac) - err = ch.RunApplicationCommand(name, Args{}) - - if err == nil { - t.Errorf("Expected %s to run, but it didn't", name) - } else if err.Error() != "Ran" { - t.Errorf("Expected %s to run, but it got an error: %v", name, err) - } -} - -func TestUnregisterAndRunApplicationCommand(t *testing.T) { - name := "app_test_unregister" - ac := DummyApplicationCommand{} - ch := GetEditor().CommandHandler() - - _ = ch.Register(name, &ac) - err := ch.Unregister(name) - - if err != nil { - t.Errorf("Got error while unregistering: %s", err) - } - - err = ch.RunApplicationCommand(name, Args{}) - - if err != nil { - t.Errorf("Expected %s not to run, but it did", name) - if err.Error() != "Ran" { - t.Errorf("Expected %s not to run, but it got an error: %v", name, err) - } - } -} - -func TestUnregisterAndRunWindowCommand(t *testing.T) { - ed := GetEditor() - - name := "wnd_test_unregister" - wc := DummyWindowCommand{} - ch := ed.CommandHandler() - - _ = ch.Register(name, &wc) - err := ch.Unregister(name) - - if err != nil { - t.Errorf("Got error while unregistering: %s", err) - } - - w := ed.NewWindow() - defer w.Close() - - err = ch.RunWindowCommand(w, name, Args{}) - - if err != nil { - t.Errorf("Expected %s not to run, but it did", name) - if err.Error() != "Ran" { - t.Errorf("Expected %s not to run, but it got an error: %v", name, err) - } - } -} - -func TestUnregisterAndRunTextCommand(t *testing.T) { - ed := GetEditor() - - name := "text_test" - tc := DummyTextCommand{} - ch := ed.CommandHandler() - - _ = ch.Register(name, &tc) - err := ch.Unregister(name) - - if err != nil { - t.Errorf("Got error while unregistering: %s", err) - } - - w := ed.NewWindow() - defer w.Close() - - v := w.NewFile() - defer v.Close() - - err = ch.RunTextCommand(v, name, Args{}) - - if err != nil { - t.Errorf("Expected %s not to run, but it did", name) - if err.Error() != "Ran" { - t.Errorf("Expected %s not to run, but it got an error: %v", name, err) - } - } -} diff --git a/backend/commands/case.go b/backend/commands/case.go deleted file mode 100644 index 3680b4a..0000000 --- a/backend/commands/case.go +++ /dev/null @@ -1,112 +0,0 @@ -// Copyright 2013 The lime Authors. -// Use of this source code is governed by a 2-clause -// BSD-style license that can be found in the LICENSE file. - -package commands - -import ( - . "github.com/limetext/lime/backend" - "strings" - "unicode" -) - -type ( - // The TitleCaseCommand transforms all selections - // to be in Title Case. For instance, the text: - // "this is some sample text" - // turns in to: - // "This Is Some Sample Text" - TitleCaseCommand struct { - DefaultCommand - } - - // The SwapCaseCommand transforms all selections - // so that each character in the selection - // is the opposite case. For example, the text: - // "Hello, World!" - // turns in to: - // "hELLO, wORLD!" - SwapCaseCommand struct { - DefaultCommand - } - - // The UpperCaseCommand transforms all selections - // so that each character in the selection - // is in its upper case equivalent (if any.) - UpperCaseCommand struct { - DefaultCommand - } - - // The LowerCaseCommand transforms all selections - // so that each character in the selection - // is in its lower case equivalent - LowerCaseCommand struct { - DefaultCommand - } -) - -func (c *TitleCaseCommand) Run(v *View, e *Edit) error { - sel := v.Sel() - for i := 0; i < sel.Len(); i++ { - r := sel.Get(i) - if r.Size() != 0 { - t := v.Buffer().Substr(r) - v.Replace(e, r, strings.Title(t)) - } - } - return nil -} - -func (c *SwapCaseCommand) Run(v *View, e *Edit) error { - sel := v.Sel() - for i := 0; i < sel.Len(); i++ { - r := sel.Get(i) - if r.Size() == 0 { - continue - } - text := v.Buffer().Substr(r) - swapped := make([]rune, 0) - for _, c := range text { - if unicode.IsUpper(c) { - swapped = append(swapped, unicode.ToLower(c)) - } else { - swapped = append(swapped, unicode.ToUpper(c)) - } - } - v.Replace(e, r, string(swapped)) - } - return nil -} - -func (c *UpperCaseCommand) Run(v *View, e *Edit) error { - sel := v.Sel() - for i := 0; i < sel.Len(); i++ { - r := sel.Get(i) - if r.Size() != 0 { - t := v.Buffer().Substr(r) - v.Replace(e, r, strings.ToUpper(t)) - } - } - return nil -} - -func (c *LowerCaseCommand) Run(v *View, e *Edit) error { - sel := v.Sel() - for i := 0; i < sel.Len(); i++ { - r := sel.Get(i) - if r.Size() != 0 { - t := v.Buffer().Substr(r) - v.Replace(e, r, strings.ToLower(t)) - } - } - return nil -} - -func init() { - register([]Command{ - &TitleCaseCommand{}, - &SwapCaseCommand{}, - &UpperCaseCommand{}, - &LowerCaseCommand{}, - }) -} diff --git a/backend/commands/case_test.go b/backend/commands/case_test.go deleted file mode 100644 index 85a6a1a..0000000 --- a/backend/commands/case_test.go +++ /dev/null @@ -1,201 +0,0 @@ -// Copyright 2013 The lime Authors. -// Use of this source code is governed by a 2-clause -// BSD-style license that can be found in the LICENSE file. - -package commands - -import ( - . "github.com/limetext/lime/backend" - . "github.com/limetext/text" - "testing" -) - -type caseTest struct { - in_region []Region - in string - exp string -} - -func runCaseTest(command string, testsuite *[]caseTest, t *testing.T) { - ed := GetEditor() - w := ed.NewWindow() - defer w.Close() - - for i, test := range *testsuite { - v := w.NewFile() - defer func() { - v.SetScratch(true) - v.Close() - }() - - e := v.BeginEdit() - v.Insert(e, 0, test.in) - v.EndEdit(e) - - v.Sel().Clear() - if test.in_region != nil { - for _, r := range test.in_region { - v.Sel().Add(r) - } - } - ed.CommandHandler().RunTextCommand(v, command, nil) - sr := v.Buffer().Substr(Region{0, v.Buffer().Size()}) - if sr != test.exp { - t.Errorf("%s test %d failed: %v, %+v", command, i, sr, test) - } - } -} - -func TestTitleCase(t *testing.T) { - tests := []caseTest{ - /*single selection*/ - { - // Please note the bizarre capitalization of the first L in he'Ll... This is due to a bug in go's strings - // library. I'm going to try to get them to fix it... If not, maybe we'll have - // to write our own Title Casing function. - []Region{{24, 51}}, - - "Give a man a match, and he'll be warm for a minute, but set him on fire, and he'll be warm for the rest of his life.", - "Give a man a match, and He'Ll Be Warm For A Minute, but set him on fire, and he'll be warm for the rest of his life.", - }, - /*multiple selection*/ - { - []Region{{0, 17}, {52, 71}}, - - "Give a man a match, and he'll be warm for a minute, but set him on fire, and he'll be warm for the rest of his life.", - "Give A Man A Match, and he'll be warm for a minute, But Set Him On Fire, and he'll be warm for the rest of his life.", - }, - /*no selection*/ - { - nil, - - "Give a man a match, and he'll be warm for a minute, but set him on fire, and he'll be warm for the rest of his life.", - "Give a man a match, and he'll be warm for a minute, but set him on fire, and he'll be warm for the rest of his life.", - }, - /*unicode*/ - { - []Region{{0, 12}}, - - "ничего себе!", - "Ничего Себе!", - }, - /*asian characters*/ - { - []Region{{0, 9}}, - - "千里之行﹐始于足下", - "千里之行﹐始于足下", - }, - } - - runCaseTest("title_case", &tests, t) -} - -func TestSwapCase(t *testing.T) { - tests := []caseTest{ - { - []Region{{0, 0}}, - - "", - "", - }, - { - []Region{{0, 13}}, - - "Hello, World!", - "hELLO, wORLD!", - }, - { - []Region{{0, 11}}, - - "ПрИвЕт, МиР", - "пРиВеТ, мИр", - }, - } - - runCaseTest("swap_case", &tests, t) -} - -func TestUpperCase(t *testing.T) { - tests := []caseTest{ - /*single selection*/ - { - []Region{{0, 76}}, - - "Try not to become a man of success, but rather try to become a man of value.", - "TRY NOT TO BECOME A MAN OF SUCCESS, BUT RATHER TRY TO BECOME A MAN OF VALUE.", - }, - /*multiple selection*/ - { - []Region{{0, 20}, {74, 76}}, - - "Try not to become a man of success, but rather try to become a man of value.", - "TRY NOT TO BECOME A man of success, but rather try to become a man of valuE.", - }, - /*no selection*/ - { - nil, - - "Try not to become a man of success, but rather try to become a man of value.", - "Try not to become a man of success, but rather try to become a man of value.", - }, - /*unicode*/ - { - []Region{{0, 74}}, - - "чем больше законов и постановлений, тем больше разбойников и преступлений!", - "ЧЕМ БОЛЬШЕ ЗАКОНОВ И ПОСТАНОВЛЕНИЙ, ТЕМ БОЛЬШЕ РАЗБОЙНИКОВ И ПРЕСТУПЛЕНИЙ!", - }, - /*asian characters*/ - { - []Region{{0, 9}}, - - "千里之行﹐始于足下", - "千里之行﹐始于足下", - }, - } - - runCaseTest("upper_case", &tests, t) -} - -func TestLowerCase(t *testing.T) { - tests := []caseTest{ - /*single selection*/ - { - []Region{{0, 76}}, - - "TRY NOT TO BECOME A MAN OF SUCCESS, BUT RATHER TRY TO BECOME A MAN OF VALUE.", - "try not to become a man of success, but rather try to become a man of value.", - }, - /*multiple selection*/ - { - []Region{{0, 20}, {74, 76}}, - - "TRY NOT TO BECOME A MAN OF SUCCESS, BUT RATHER TRY TO BECOME A MAN OF VALUE.", - "try not to become a MAN OF SUCCESS, BUT RATHER TRY TO BECOME A MAN OF VALUe.", - }, - /*no selection*/ - { - nil, - - "Try not to become a man of success, but rather try to become a man of value.", - "Try not to become a man of success, but rather try to become a man of value.", - }, - /*unicode*/ - { - []Region{{0, 74}}, - - "ЧЕМ БОЛЬШЕ ЗАКОНОВ И ПОСТАНОВЛЕНИЙ, ТЕМ БОЛЬШЕ РАЗБОЙНИКОВ И ПРЕСТУПЛЕНИЙ!", - "чем больше законов и постановлений, тем больше разбойников и преступлений!", - }, - /*asian characters*/ - { - []Region{{0, 9}}, - - "千里之行﹐始于足下", - "千里之行﹐始于足下", - }, - } - - runCaseTest("lower_case", &tests, t) -} diff --git a/backend/commands/comment.go b/backend/commands/comment.go deleted file mode 100644 index 89cd674..0000000 --- a/backend/commands/comment.go +++ /dev/null @@ -1,53 +0,0 @@ -// Copyright 2015 The lime Authors. -// Use of this source code is governed by a 2-clause -// BSD-style license that can be found in the LICENSE file. - -package commands - -import ( - . "github.com/limetext/lime/backend" - "strings" - "unicode" -) - -type ( - ToggleCommentCommand struct { - DefaultCommand - } -) - -func (c *ToggleCommentCommand) Run(v *View, e *Edit) error { - // TODO: Comment the line if we only have a cursor. - // TODO: Expand the selection after altering it. - // TODO: Align the comment characters for multiline selections. - // TODO: Get the comment value from the Textmate files. - comm := "//" - - for _, r := range v.Sel().Regions() { - if r.Size() != 0 { - t := v.Buffer().Substr(r) - - trim := strings.TrimLeftFunc(t, unicode.IsSpace) - if strings.HasPrefix(trim, comm) { - repl := comm - if strings.HasPrefix(trim, comm+" ") { - repl += " " - } - - t = strings.Replace(t, repl, "", 1) - } else { - t = strings.Replace(t, trim, comm+" "+trim, 1) - } - - v.Replace(e, r, t) - } - } - - return nil -} - -func init() { - register([]Command{ - &ToggleCommentCommand{}, - }) -} diff --git a/backend/commands/comment_test.go b/backend/commands/comment_test.go deleted file mode 100644 index 3be7cb0..0000000 --- a/backend/commands/comment_test.go +++ /dev/null @@ -1,120 +0,0 @@ -// Copyright 2015 The lime Authors. -// Use of this source code is governed by a 2-clause -// BSD-style license that can be found in the LICENSE file. - -package commands - -import ( - . "github.com/limetext/lime/backend" - "github.com/limetext/text" - "testing" -) - -func TestToggleComment(t *testing.T) { - tests := []struct { - r []text.Region - in string - exp string - }{ - { - []text.Region{{0, 3}}, - - "test", - "// test", - }, - { - []text.Region{{0, 6}}, - - "// test", - "test", - }, - { - []text.Region{{0, 5}}, - - "//test", - "test", - }, - { - []text.Region{{0, 8}}, - - "// test", - " test", - }, - { - []text.Region{{0, 7}}, - - " test", - " // test", - }, - { - []text.Region{{0, 10}}, - - " // test", - " test", - }, - { - []text.Region{{0, 9}}, - - " //test", - " test", - }, - { - []text.Region{{0, 12}}, - - " // test", - " test", - }, - { - []text.Region{{0, 8}}, - - "\t test", - "\t // test", - }, - { - []text.Region{{0, 11}}, - - "\t // test", - "\t test", - }, - { - []text.Region{{0, 10}}, - - "\t //test", - "\t test", - }, - { - []text.Region{{0, 13}}, - - "\t // test", - "\t test", - }, - } - - ed := GetEditor() - w := ed.NewWindow() - defer w.Close() - - for i, test := range tests { - v := w.NewFile() - defer func() { - v.SetScratch(true) - v.Close() - }() - - e := v.BeginEdit() - v.Insert(e, 0, test.in) - v.EndEdit(e) - - v.Sel().Clear() - if test.r != nil { - for _, r := range test.r { - v.Sel().Add(r) - } - } - ed.CommandHandler().RunTextCommand(v, "toggle_comment", nil) - sr := v.Buffer().Substr(text.Region{0, v.Buffer().Size()}) - if sr != test.exp { - t.Errorf("%s test %d failed: %v, %+v", "toggle_comment", i, sr, test) - } - } -} diff --git a/backend/commands/copycutpaste.go b/backend/commands/copycutpaste.go deleted file mode 100644 index 7b2dc53..0000000 --- a/backend/commands/copycutpaste.go +++ /dev/null @@ -1,107 +0,0 @@ -// Copyright 2014 The lime Authors. -// Use of this source code is governed by a 2-clause -// BSD-style license that can be found in the LICENSE file. - -package commands - -import ( - . "github.com/limetext/lime/backend" - "github.com/limetext/text" - "sort" - "strings" -) - -type ( - CopyCommand struct { - DefaultCommand - } - - CutCommand struct { - DefaultCommand - } - - PasteCommand struct { - DefaultCommand - } -) - -func getRegions(v *View, cut bool) *text.RegionSet { - rs := &text.RegionSet{} - regions := v.Sel().Regions() - sort.Sort(regionSorter(regions)) - rs.AddAll(regions) - - he, ae := rs.HasEmpty(), !rs.HasNonEmpty() || cut - for _, r := range rs.Regions() { - if ae && r.Empty() { - rs.Add(v.Buffer().FullLineR(r)) - } else if he && r.Empty() { - rs.Substract(r) - } - } - - return rs -} - -func getSelSubstrs(v *View, rs *text.RegionSet) []string { - var add, s1 string - s := make([]string, len(rs.Regions())) - for i, r := range rs.Regions() { - add = "" - s1 = v.Buffer().Substr(r) - if !v.Sel().HasNonEmpty() && !strings.HasSuffix(s1, "\n") { - add = "\n" - } - s[i] = s1 + add - } - return s -} - -func (c *CopyCommand) Run(v *View, e *Edit) error { - rs := getRegions(v, false) - s := getSelSubstrs(v, rs) - - GetEditor().SetClipboard(strings.Join(s, "\n")) - - return nil -} - -func (c *CutCommand) Run(v *View, e *Edit) error { - s := getSelSubstrs(v, getRegions(v, false)) - - rs := getRegions(v, true) - regions := rs.Regions() - sort.Sort(sort.Reverse(regionSorter(regions))) - for _, r := range regions { - v.Erase(e, r) - } - - GetEditor().SetClipboard(strings.Join(s, "\n")) - - return nil -} - -func (c *PasteCommand) Run(v *View, e *Edit) error { - // TODO: Paste the entire line on the line before the cursor if a - // line was autocopied. - - ed := GetEditor() - - rs := &text.RegionSet{} - regions := v.Sel().Regions() - sort.Sort(sort.Reverse(regionSorter(regions))) - rs.AddAll(regions) - for _, r := range rs.Regions() { - v.Replace(e, r, ed.GetClipboard()) - } - - return nil -} - -func init() { - register([]Command{ - &CopyCommand{}, - &CutCommand{}, - &PasteCommand{}, - }) -} diff --git a/backend/commands/copycutpaste_test.go b/backend/commands/copycutpaste_test.go deleted file mode 100644 index c402da7..0000000 --- a/backend/commands/copycutpaste_test.go +++ /dev/null @@ -1,267 +0,0 @@ -// Copyright 2014 The lime Authors. -// Use of this source code is governed by a 2-clause -// BSD-style license that can be found in the LICENSE file. - -package commands - -import ( - . "github.com/limetext/lime/backend" - "github.com/limetext/text" - "testing" -) - -type copyTest struct { - buf string - clip string - regions []text.Region - expClip string - expBuf string -} - -var dummyClipboard string - -func runCopyTest(command string, tests *[]copyTest, t *testing.T) { - ed := GetEditor() - ed.SetClipboardFuncs(func(n string) (err error) { - dummyClipboard = n - return nil - }, func() (string, error) { - return dummyClipboard, nil - }) - defer ed.Init() - - w := ed.NewWindow() - defer w.Close() - - for i, test := range *tests { - v := w.NewFile() - defer func() { - v.SetScratch(true) - v.Close() - }() - - v.Buffer().Insert(0, test.buf) - v.Sel().Clear() - - ed.SetClipboard(test.clip) - - for _, r := range test.regions { - v.Sel().Add(r) - } - - ed.CommandHandler().RunTextCommand(v, command, nil) - - if ed.GetClipboard() != test.expClip { - t.Errorf("Test %d: Expected clipboard to be %q, but got %q", i, test.expClip, ed.GetClipboard()) - } - - b := v.Buffer().Substr(text.Region{A: 0, B: v.Buffer().Size()}) - - if b != test.expBuf { - t.Errorf("Test %d: Expected buffer to be %q, but got %q", i, test.expBuf, b) - } - } -} - -func TestCopy(t *testing.T) { - tests := []copyTest{ - { - "test string", - "", - []text.Region{{1, 3}}, - "es", - "test string", - }, - { - "test\nstring", - "", - []text.Region{{3, 6}}, - "t\ns", - "test\nstring", - }, - { - "test string", - "", - []text.Region{{3, 3}}, - "test string\n", - "test string", - }, - { - "test string", - "", - []text.Region{{1, 3}, {5, 6}}, - "es\ns", - "test string", - }, - { - "test\nstring", - "", - []text.Region{{1, 3}, {5, 6}}, - "es\ns", - "test\nstring", - }, - { - "test\nstring", - "", - []text.Region{{1, 1}, {7, 7}}, - "test\n\nstring\n", - "test\nstring", - }, - { - "test\nstring", - "", - []text.Region{{3, 6}, {9, 10}}, - "t\ns\nn", - "test\nstring", - }, - { - "test string", - "", - []text.Region{{5, 6}, {1, 3}}, - "es\ns", - "test string", - }, - { - "test string", - "", - []text.Region{{1, 1}, {6, 7}}, - "t", - "test string", - }, - } - - runCopyTest("copy", &tests, t) -} - -func TestCut(t *testing.T) { - tests := []copyTest{ - { - "test string", - "", - []text.Region{{1, 3}}, - "es", - "tt string", - }, - { - "test\nstring", - "", - []text.Region{{3, 6}}, - "t\ns", - "testring", - }, - { - "test string", - "", - []text.Region{{3, 3}}, - "test string\n", - "", - }, - { - "test string", - "", - []text.Region{{5, 6}, {1, 3}}, - "es\ns", - "tt tring", - }, - { - "test\nstring", - "", - []text.Region{{1, 3}, {5, 6}}, - "es\ns", - "tt\ntring", - }, - { - "test\nstring", - "", - []text.Region{{1, 1}, {7, 7}}, - "test\n\nstring\n", - "", - }, - { - "test\nstring", - "", - []text.Region{{3, 6}, {9, 10}}, - "t\ns\nn", - "testrig", - }, - { - "test string", - "", - []text.Region{{5, 6}, {1, 3}}, - "es\ns", - "tt tring", - }, - { - "test string", - "", - []text.Region{{6, 7}, {1, 1}}, - "t", - "", - }, - { - "test\nstring", - "", - []text.Region{{1, 1}, {6, 7}}, - "t", - "sring", - }, - } - - runCopyTest("cut", &tests, t) -} - -func TestPaste(t *testing.T) { - tests := []copyTest{ - { - "test string", - "test", - []text.Region{{1, 1}}, - "test", - "ttestest string", - }, - { - "test string", - "test", - []text.Region{{1, 3}}, - "test", - "ttestt string", - }, - { - "test\nstring", - "test", - []text.Region{{3, 6}}, - "test", - "testesttring", - }, - { - "test string", - "test", - []text.Region{{1, 3}, {5, 6}}, - "test", - "ttestt testtring", - }, - { - "test\nstring", - "test", - []text.Region{{1, 3}, {5, 6}}, - "test", - "ttestt\ntesttring", - }, - { - "test\nstring", - "test", - []text.Region{{3, 6}, {9, 10}}, - "test", - "testesttritestg", - }, - { - "test\nstring", - "test", - []text.Region{{9, 10}, {3, 6}}, - "test", - "testesttritestg", - }, - } - - runCopyTest("paste", &tests, t) -} diff --git a/backend/commands/doc.go b/backend/commands/doc.go deleted file mode 100644 index 647dacc..0000000 --- a/backend/commands/doc.go +++ /dev/null @@ -1,15 +0,0 @@ -// Copyright 2014 The lime Authors. -// Use of this source code is governed by a 2-clause -// BSD-style license that can be found in the LICENSE file. - -// This package implements a couple of standard commands -// available to the editor. -// -// Typically the package is imported by a frontend via -// import ( -// _ "github.com/limetext/lime/backend/commands" -// ) -// -// See the wiki page for more details on implementing commands: -// https://github.com/limetext/lime/wiki/Implementing-commands -package commands diff --git a/backend/commands/file.go b/backend/commands/file.go deleted file mode 100644 index 7ed4e87..0000000 --- a/backend/commands/file.go +++ /dev/null @@ -1,38 +0,0 @@ -// Copyright 2014 The lime Authors. -// Use of this source code is governed by a 2-clause -// BSD-style license that can be found in the LICENSE file. - -package commands - -import ( - . "github.com/limetext/lime/backend" -) - -type ( - NewFileCommand struct { - DefaultCommand - } - - OpenFileCommand struct { - DefaultCommand - Path string - } -) - -func (c *NewFileCommand) Run(w *Window) error { - ed := GetEditor() - ed.ActiveWindow().NewFile() - return nil -} - -func (o *OpenFileCommand) Run(w *Window) error { - w.OpenFile(o.Path, 0) - return nil -} - -func init() { - register([]Command{ - &NewFileCommand{}, - &OpenFileCommand{}, - }) -} diff --git a/backend/commands/file_test.go b/backend/commands/file_test.go deleted file mode 100644 index ec6a5b5..0000000 --- a/backend/commands/file_test.go +++ /dev/null @@ -1,59 +0,0 @@ -// Copyright 2014 The lime Authors. -// Use of this source code is governed by a 2-clause -// BSD-style license that can be found in the LICENSE file. - -package commands - -import ( - . "github.com/limetext/lime/backend" - "path/filepath" - "testing" -) - -func TestNewFile(t *testing.T) { - ed := GetEditor() - - w := ed.NewWindow() - defer w.Close() - - l := len(w.Views()) - - ed.CommandHandler().RunWindowCommand(w, "new_file", nil) - - if len(w.Views()) != l+1 { - t.Errorf("Expected %d views, but got %d", l+1, len(w.Views())) - } - - for _, v := range w.Views() { - v.SetScratch(true) - v.Close() - } -} - -func TestOpenFile(t *testing.T) { - ed := GetEditor() - - w := ed.NewWindow() - defer w.Close() - - l := len(w.Views()) - - testPath := "open_file_test.go" - ed.CommandHandler().RunWindowCommand(w, "open_file", Args{"path": testPath}) - - if len(w.Views()) != l+1 { - t.Errorf("Expected %d views, but got %d", l+1, len(w.Views())) - } - exp, err := filepath.Abs(testPath) - if err != nil { - exp = testPath - } - if w.Views()[l].Buffer().FileName() != exp { - t.Errorf("Expected %s as FileName, but got %s", testPath, w.Views()[l].Buffer().FileName()) - } - - for _, v := range w.Views() { - v.SetScratch(true) - v.Close() - } -} diff --git a/backend/commands/findreplace.go b/backend/commands/findreplace.go deleted file mode 100644 index 4ca5b46..0000000 --- a/backend/commands/findreplace.go +++ /dev/null @@ -1,140 +0,0 @@ -// Copyright 2013 The lime Authors. -// Use of this source code is governed by a 2-clause -// BSD-style license that can be found in the LICENSE file. - -package commands - -import ( - "errors" - . "github.com/limetext/lime/backend" - . "github.com/limetext/text" -) - -type ( - // The FindUnderExpandCommand extends the selection to the current word - // if the current selection region is empty. - // If one character or more is selected, the text buffer is scanned for - // the next occurrence of the selection and that region too is added to - // the selection set. - FindUnderExpandCommand struct { - DefaultCommand - } - // The FindNext command searches for the last search term, starting at - // the end of the last selection in the buffer, and wrapping around. If - // it finds the term, it clears the current selections and selects the - // newly-found regions. - FindNextCommand struct { - DefaultCommand - } - - // The ReplaceNextCommand searches for the "old" argument text, - // and at the first occurance of the text, replaces it with the - // "new" argument text. If there are multiple regions, the find - // starts from the max region. - ReplaceNextCommand struct { - DefaultCommand - } -) - -var ( - // Remembers the last sequence of runes searched for. - lastSearch []rune - replaceText string -) - -func (c *FindUnderExpandCommand) Run(v *View, e *Edit) error { - sel := v.Sel() - rs := sel.Regions() - - if sel.HasEmpty() { - for i, r := range rs { - if r2 := v.Buffer().Word(r.A); r2.Size() > r.Size() { - rs[i] = r2 - } - } - sel.Clear() - sel.AddAll(rs) - b := v.Buffer() - lastSearch = b.SubstrR(rs[len(rs)-1]) - return nil - } - last := rs[len(rs)-1] - b := v.Buffer() - lastSearch = b.SubstrR(last) - r := v.Find(string(lastSearch), last.End(), IGNORECASE|LITERAL) - if r.A != -1 { - sel.Add(r) - } - return nil -} - -func nextSelection(v *View, search string) (Region, error) { - sel := v.Sel() - rs := sel.Regions() - last := 0 - wrap, _ := v.Settings().Get("find_wrap").(bool) - - // Regions are not sorted, so finding the last one requires a search. - for _, r := range rs { - last = Max(last, r.End()) - } - - // Start the search right after the last selection. - start := last - r := v.Find(search, start, IGNORECASE|LITERAL) - // If not found yet and find_wrap setting is true, search - // from the start of the buffer to our original starting point. - if r.A == -1 && wrap { - r = v.Find(search, 0, IGNORECASE|LITERAL) - } - // If we found our string, select it. - if r.A != -1 { - return r, nil - } - return Region{-1, -1}, errors.New("Selection not Found") -} - -func (c *FindNextCommand) Run(v *View, e *Edit) error { - /* - Correct behavior of FindNext: - - If there is no previous search, do nothing - - Find the last region in the buffer, start the - search immediately after that. - - If the search term is found, clear any existing - selections, and select the newly-found region. - - Right now this is doing a case-sensitive search. In ST3 - that's a setting. - */ - - // If there is no last search term, nothing to do here. - if len(lastSearch) == 0 { - return nil - } - newr, err := nextSelection(v, string(lastSearch)) - if err != nil { - return err - } - sel := v.Sel() - sel.Clear() - sel.Add(newr) - return nil -} - -func (c *ReplaceNextCommand) Run(v *View, e *Edit) error { - // use selection function from find.go to get the next region - selection, err := nextSelection(v, string(lastSearch)) - if err != nil { - return err - } - v.Erase(e, selection) - v.Insert(e, selection.Begin(), replaceText) - return nil -} - -func init() { - register([]Command{ - &FindUnderExpandCommand{}, - &FindNextCommand{}, - &ReplaceNextCommand{}, - }) -} diff --git a/backend/commands/findreplace_test.go b/backend/commands/findreplace_test.go deleted file mode 100644 index 6b19dad..0000000 --- a/backend/commands/findreplace_test.go +++ /dev/null @@ -1,193 +0,0 @@ -// Copyright 2013 The lime Authors. -// Use of this source code is governed by a 2-clause -// BSD-style license that can be found in the LICENSE file. - -package commands - -import ( - . "github.com/limetext/lime/backend" - . "github.com/limetext/text" - "reflect" - "testing" -) - -type findTest struct { - text string - in []Region - exp []Region - fw bool -} - -func runFindTest(tests []findTest, t *testing.T, commands ...string) { - ed := GetEditor() - w := ed.NewWindow() - defer w.Close() - - v := w.NewFile() - defer func() { - v.SetScratch(true) - v.Close() - }() - - for i, test := range tests { - e := v.BeginEdit() - v.Insert(e, 0, test.text) - v.EndEdit(e) - v.Sel().Clear() - for _, r := range test.in { - v.Sel().Add(r) - } - - v.Settings().Set("find_wrap", test.fw) - - for _, command := range commands { - ed.CommandHandler().RunTextCommand(v, command, nil) - } - if sr := v.Sel().Regions(); !reflect.DeepEqual(sr, test.exp) { - t.Errorf("Test %d: Expected %s, but got %s", i, test.exp, sr) - } - e = v.BeginEdit() - v.Erase(e, Region{0, v.Buffer().Size()}) - v.EndEdit(e) - } -} - -func TestFindUnderExpand(t *testing.T) { - tests := []findTest{ - { - "Hello World!\nTest123123\nAbrakadabra\n", - []Region{{0, 0}}, - []Region{{0, 5}}, - true, - }, - { - "Hello World!\nTest123123\nAbrakadabra\n", - []Region{{19, 20}}, - []Region{{19, 20}, {22, 23}}, - true, - }, - } - - runFindTest(tests, t, "find_under_expand") -} - -func TestFindNext(t *testing.T) { - tests := []findTest{ - { - "Hello World!\nTest123123\nAbrakadabra\n", - []Region{{17, 20}}, - []Region{{17, 20}}, - true, - }, - // test find_wrap setting true - { - "Hello World!\nTest123123\nAbrakadabra\n", - []Region{{21, 23}}, - []Region{{18, 20}}, - true, - }, - // test find_wrap setting false - { - "Hello World!\nTest123123\nAbrakadabra\n", - []Region{{21, 23}}, - []Region{{21, 23}}, - false, - }, - } - - runFindTest(tests, t, "find_under_expand", "find_next") -} - -type replaceTest struct { - cursors []Region - in string - exp string - fw bool -} - -func runReplaceTest(tests []replaceTest, t *testing.T, commands ...string) { - ed := GetEditor() - w := ed.NewWindow() - defer w.Close() - - v := w.NewFile() - defer func() { - v.SetScratch(true) - v.Close() - }() - - for i, test := range tests { - e := v.BeginEdit() - v.Insert(e, 0, test.in) - v.EndEdit(e) - v.Sel().Clear() - - for _, r := range test.cursors { - v.Sel().Add(r) - } - - v.Settings().Set("find_wrap", test.fw) - - replaceText = "f" - for _, command := range commands { - ed.CommandHandler().RunTextCommand(v, command, nil) - } - if out := v.Buffer().Substr(Region{0, v.Buffer().Size()}); out != test.exp { - t.Errorf("Test %d failed: %s, %+v", i, out, test) - } - e = v.BeginEdit() - v.Erase(e, Region{0, v.Buffer().Size()}) - v.EndEdit(e) - } -} - -func TestReplaceNext(t *testing.T) { - tests := []replaceTest{ - { - []Region{{1, 1}, {2, 2}, {3, 3}}, - "abc abc bac abc abc", - "abc f bac abc abc", - true, - }, - { - []Region{{0, 0}, {4, 4}, {8, 8}, {12, 13}}, - "abc abc bac abc abc", - "abc abc bac abc f", - true, - }, - { - []Region{{12, 13}, {8, 8}, {4, 4}, {1, 0}}, - "abc abc bac abc abc", - "abc abc bac abc f", - true, - }, - { - []Region{{15, 15}}, - "abc abc bac abc abc", - "abc abc bac abc f", - true, - }, - { - []Region{{0, 0}}, - "abc abc bac abc abc", - "abc f bac abc abc", - true, - }, - // test find_wrap setting true - { - []Region{{16, 19}}, - "abc abc bac abc abc", - "f abc bac abc abc", - true, - }, - // test find_wrap setting false - { - []Region{{16, 19}}, - "abc abc bac abc abc", - "abc abc bac abc abc", - false, - }, - } - - runReplaceTest(tests, t, "find_under_expand", "replace_next") -} diff --git a/backend/commands/glue.go b/backend/commands/glue.go deleted file mode 100644 index 1114343..0000000 --- a/backend/commands/glue.go +++ /dev/null @@ -1,80 +0,0 @@ -// Copyright 2013 The lime Authors. -// Use of this source code is governed by a 2-clause -// BSD-style license that can be found in the LICENSE file. - -package commands - -import ( - "fmt" - . "github.com/limetext/lime/backend" -) - -const lime_cmd_mark = "lime.cmd.mark" - -type ( - // The MarkUndoGroupsForGluingCommand marks the current position - // in the undo stack as the start of commands to glue, potentially - // overwriting any existing marks. - MarkUndoGroupsForGluingCommand struct { - BypassUndoCommand - } - - // The GlueMarkedUndoGroupsCommand merges commands from the previously - // marked undo stack location to the current location into a single - // entry in the undo stack. - GlueMarkedUndoGroupsCommand struct { - BypassUndoCommand - } - - // The MaybeMarkUndoGroupsForGluingCommand is similar to - // MarkUndoGroupsForGluingCommand with the exception that if there - // is already a mark set, it is not overwritten. - MaybeMarkUndoGroupsForGluingCommand struct { - BypassUndoCommand - } - - // The UnmarkUndoGroupsForGluingCommand removes the glue mark set by - // either MarkUndoGroupsForGluingCommand or MaybeMarkUndoGroupsForGluingCommand - // if it was set. - UnmarkUndoGroupsForGluingCommand struct { - BypassUndoCommand - } -) - -func (c *MarkUndoGroupsForGluingCommand) Run(v *View, e *Edit) error { - v.Settings().Set(lime_cmd_mark, v.UndoStack().Position()) - return nil -} - -func (c *UnmarkUndoGroupsForGluingCommand) Run(v *View, e *Edit) error { - v.Settings().Erase(lime_cmd_mark) - return nil -} - -func (c *GlueMarkedUndoGroupsCommand) Run(v *View, e *Edit) error { - pos := v.UndoStack().Position() - mark, ok := v.Settings().Get(lime_cmd_mark).(int) - if !ok { - return fmt.Errorf("No mark in the current view") - } - if l, p := pos-mark, mark; p != -1 && (l-p) > 1 { - v.UndoStack().GlueFrom(mark) - } - return nil -} - -func (c *MaybeMarkUndoGroupsForGluingCommand) Run(v *View, e *Edit) error { - if !v.Settings().Has(lime_cmd_mark) { - v.Settings().Set(lime_cmd_mark, v.UndoStack().Position()) - } - return nil -} - -func init() { - register([]Command{ - &MarkUndoGroupsForGluingCommand{}, - &GlueMarkedUndoGroupsCommand{}, - &MaybeMarkUndoGroupsForGluingCommand{}, - &UnmarkUndoGroupsForGluingCommand{}, - }) -} diff --git a/backend/commands/glue_test.go b/backend/commands/glue_test.go deleted file mode 100644 index a697832..0000000 --- a/backend/commands/glue_test.go +++ /dev/null @@ -1,106 +0,0 @@ -// Copyright 2013 The lime Authors. -// Use of this source code is governed by a 2-clause -// BSD-style license that can be found in the LICENSE file. - -package commands - -import ( - . "github.com/limetext/lime/backend" - "github.com/limetext/text" - "testing" -) - -func TestGlueCmds(t *testing.T) { - ed := GetEditor() - ch := ed.CommandHandler() - w := ed.NewWindow() - defer w.Close() - - v := w.NewFile() - defer func() { - v.SetScratch(true) - v.Close() - }() - - v.SetScratch(true) - e := v.BeginEdit() - v.Insert(e, 0, "Hello World!\nTest123123\nAbrakadabra\n") - v.EndEdit(e) - v.SetScratch(false) - ch.RunTextCommand(v, "mark_undo_groups_for_gluing", nil) - ch.RunTextCommand(v, "insert", Args{"characters": "a"}) - ch.RunTextCommand(v, "insert", Args{"characters": "b"}) - ch.RunTextCommand(v, "insert", Args{"characters": "c"}) - ch.RunTextCommand(v, "glue_marked_undo_groups", nil) - if v.UndoStack().Position() != 1 { - t.Error(v.UndoStack().Position()) - } else if d := v.Buffer().Substr(text.Region{A: 0, B: v.Buffer().Size()}); d != "Hello World!\nTest123123\nAbrakadabra\nabc" { - t.Error(d) - } - ch.RunTextCommand(v, "undo", nil) - if d := v.Buffer().Substr(text.Region{A: 0, B: v.Buffer().Size()}); d != "Hello World!\nTest123123\nAbrakadabra\n" { - t.Error(d) - } - ch.RunTextCommand(v, "redo", nil) - if d := v.Buffer().Substr(text.Region{A: 0, B: v.Buffer().Size()}); d != "Hello World!\nTest123123\nAbrakadabra\nabc" { - t.Error(d) - } - if v.UndoStack().Position() != 1 { - t.Error(v.UndoStack().Position()) - } else if d := v.Buffer().Substr(text.Region{A: 0, B: v.Buffer().Size()}); d != "Hello World!\nTest123123\nAbrakadabra\nabc" { - t.Error(d) - } - ch.RunTextCommand(v, "undo", nil) - if d := v.Buffer().Substr(text.Region{A: 0, B: v.Buffer().Size()}); d != "Hello World!\nTest123123\nAbrakadabra\n" { - t.Error(d) - } - - ch.RunTextCommand(v, "maybe_mark_undo_groups_for_gluing", nil) - ch.RunTextCommand(v, "insert", Args{"characters": "a"}) - ch.RunTextCommand(v, "maybe_mark_undo_groups_for_gluing", nil) - ch.RunTextCommand(v, "insert", Args{"characters": "b"}) - ch.RunTextCommand(v, "maybe_mark_undo_groups_for_gluing", nil) - ch.RunTextCommand(v, "insert", Args{"characters": "c"}) - ch.RunTextCommand(v, "maybe_mark_undo_groups_for_gluing", nil) - ch.RunTextCommand(v, "glue_marked_undo_groups", nil) - if v.UndoStack().Position() != 1 { - t.Error(v.UndoStack().Position()) - } else if d := v.Buffer().Substr(text.Region{A: 0, B: v.Buffer().Size()}); d != "Hello World!\nTest123123\nAbrakadabra\nabc" { - t.Error(d) - } - ch.RunTextCommand(v, "undo", nil) - if d := v.Buffer().Substr(text.Region{A: 0, B: v.Buffer().Size()}); d != "Hello World!\nTest123123\nAbrakadabra\n" { - t.Error(d) - } - ch.RunTextCommand(v, "redo", nil) - if d := v.Buffer().Substr(text.Region{A: 0, B: v.Buffer().Size()}); d != "Hello World!\nTest123123\nAbrakadabra\nabc" { - t.Error(d) - } - if v.UndoStack().Position() != 1 { - t.Error(v.UndoStack().Position()) - } else if d := v.Buffer().Substr(text.Region{A: 0, B: v.Buffer().Size()}); d != "Hello World!\nTest123123\nAbrakadabra\nabc" { - t.Error(d) - } - - ch.RunTextCommand(v, "mark_undo_groups_for_gluing", nil) - ch.RunTextCommand(v, "move", Args{"forward": false, "extend": true, "by": "lines"}) - ch.RunTextCommand(v, "move", Args{"forward": false, "extend": true, "by": "lines"}) - ch.RunTextCommand(v, "move", Args{"forward": false, "extend": true, "by": "lines"}) - ch.RunTextCommand(v, "left_delete", nil) - ch.RunTextCommand(v, "insert", Args{"characters": "a"}) - ch.RunTextCommand(v, "insert", Args{"characters": "b"}) - ch.RunTextCommand(v, "insert", Args{"characters": "c"}) - ch.RunTextCommand(v, "glue_marked_undo_groups", nil) - if v.UndoStack().Position() != 2 { - t.Error(v.UndoStack().Position()) - } else if d := v.Buffer().Substr(text.Region{A: 0, B: v.Buffer().Size()}); d != "Helabc" { - t.Error(d) - } - - ch.RunTextCommand(v, "undo", nil) - if v.UndoStack().Position() != 1 { - t.Error(v.UndoStack().Position()) - } else if d := v.Buffer().Substr(text.Region{A: 0, B: v.Buffer().Size()}); d != "Hello World!\nTest123123\nAbrakadabra\nabc" { - t.Error(d) - } -} diff --git a/backend/commands/indent.go b/backend/commands/indent.go deleted file mode 100644 index 8f5a727..0000000 --- a/backend/commands/indent.go +++ /dev/null @@ -1,103 +0,0 @@ -// Copyright 2013 The lime Authors. -// Use of this source code is governed by a 2-clause -// BSD-style license that can be found in the LICENSE file. - -package commands - -import ( - . "github.com/limetext/lime/backend" - . "github.com/limetext/text" - "strings" -) - -type ( - // The IndentCommand increments indentation of selection. - IndentCommand struct { - DefaultCommand - } - - // The UnindentCommand decrements indentation of selection. - UnindentCommand struct { - DefaultCommand - } -) - -func (c *IndentCommand) Run(v *View, e *Edit) error { - indent := "\t" - if t, ok := v.Settings().Get("translate_tabs_to_spaces", false).(bool); ok && t { - indent = strings.Repeat(" ", getTabSize(v)) - } - sel := v.Sel() - - // Keep track of the indented lines - // (go has no set collections, use that instead - struct{} doesn't take up space) - indented_rows := map[int]struct{}{} - - for i := 0; i < sel.Len(); i++ { - r := sel.Get(i) - start_row, _ := v.Buffer().RowCol(r.Begin()) - end_row, _ := v.Buffer().RowCol(r.End()) - for row := start_row; row <= end_row; row++ { - if _, ok := indented_rows[row]; !ok { - // Insert an indent at the beginning of the line - pos := v.Buffer().TextPoint(row, 0) - v.Insert(e, pos, indent) - indented_rows[row] = struct{}{} - } - } - } - return nil -} - -func (c *UnindentCommand) Run(v *View, e *Edit) error { - tab_size := getTabSize(v) - sel := v.Sel() - unindented_rows := map[int]struct{}{} - for i := 0; i < sel.Len(); i++ { - r := sel.Get(i) - start_row, _ := v.Buffer().RowCol(r.Begin()) - end_row, _ := v.Buffer().RowCol(r.End()) - for row := start_row; row <= end_row; row++ { - if _, ok := unindented_rows[row]; !ok { - pos := v.Buffer().TextPoint(row, 0) - // Get the first at the beginning of the line (as many as defined by tab_size) - sub := v.Buffer().Substr(Region{pos, pos + tab_size}) - if len(sub) == 0 { - continue - } - to_remove := 0 - if sub[0] == byte('\t') { - // Case 1: the first character is a tab, remove only it - to_remove = 1 - } else if sub[0] == byte(' ') { - // Case 2: the first character is a space, we remove as much spaces as we can - to_remove = 1 - for to_remove < len(sub) && sub[to_remove] == byte(' ') { - to_remove++ - } - } - if to_remove > 0 { - v.Buffer().Erase(pos, to_remove) - } - unindented_rows[row] = struct{}{} - } - } - } - return nil -} - -// Return the tab size from the settings, defaulting to 4 if not found. -func getTabSize(v *View) int { - tab_size := 4 - if t, ok := v.Settings().Get("tab_size", tab_size).(int); ok { - tab_size = t - } - return tab_size -} - -func init() { - register([]Command{ - &IndentCommand{}, - &UnindentCommand{}, - }) -} diff --git a/backend/commands/indent_test.go b/backend/commands/indent_test.go deleted file mode 100644 index 6db4522..0000000 --- a/backend/commands/indent_test.go +++ /dev/null @@ -1,167 +0,0 @@ -// Copyright 2013 The lime Authors. -// Use of this source code is governed by a 2-clause -// BSD-style license that can be found in the LICENSE file. - -package commands - -import ( - . "github.com/limetext/lime/backend" - . "github.com/limetext/text" - "testing" -) - -type indentTest struct { - text string - translate_tabs_to_spaces interface{} - tab_size interface{} - sel []Region - expect string -} - -func runIndentTest(t *testing.T, tests []indentTest, command string) { - ed := GetEditor() - w := ed.NewWindow() - defer w.Close() - - for i, test := range tests { - v := w.NewFile() - defer func() { - v.SetScratch(true) - v.Close() - }() - - e := v.BeginEdit() - v.Insert(e, 0, test.text) - v.EndEdit(e) - - v.Sel().Clear() - for _, r := range test.sel { - v.Sel().Add(r) - } - v.Settings().Set("translate_tabs_to_spaces", test.translate_tabs_to_spaces) - v.Settings().Set("tab_size", test.tab_size) - - ed.CommandHandler().RunTextCommand(v, command, nil) - if d := v.Buffer().Substr(Region{0, v.Buffer().Size()}); d != test.expect { - t.Errorf("Test %d: Expected \n%s, but got \n%s", i, test.expect, d) - } - } -} - -func TestIndent(t *testing.T) { - tests := []indentTest{ - { // translate_tabs_to_spaces = false - // indent should be "\t" - "a\n b\n c\n d\n", - false, - 4, - []Region{{0, 1}}, - "\ta\n b\n c\n d\n", - }, - { // translate_tabs_to_spaces = nil - // indent should be "\t" - "a\n b\n c\n d\n", - nil, - 1, - []Region{{0, 1}}, - "\ta\n b\n c\n d\n", - }, - { // translate_tabs_to_spaces = true and tab_size = 2 - // indent should be " " - "a\n b\n c\n d\n", - true, - 2, - []Region{{0, 1}}, - " a\n b\n c\n d\n", - }, - { // translate_tabs_to_spaces = true and tab_size = nil - // indent should be " " - "a\n b\n c\n d\n", - true, - nil, - []Region{{0, 1}}, - " a\n b\n c\n d\n", - }, - { // region include the 1st line and the 4th line - // indent should add to the begining of 1st and 4th line - "a\n b\n c\n d\n", - false, - 1, - []Region{{0, 1}, {11, 12}}, - "\ta\n b\n c\n\t d\n", - }, - { // region selected reversely - // should perform indent - "a\n b\n c\n d\n", - false, - 1, - []Region{{3, 0}}, - "\ta\n\t b\n c\n d\n", - }, - } - - runIndentTest(t, tests, "indent") -} - -func TestUnindent(t *testing.T) { - tests := []indentTest{ - { // translate_tabs_to_spaces = false - // indent should be "\t" - "\ta\n b\n c\n\t d\n", - false, - 4, - []Region{{0, 19}}, - "a\nb\n c\n d\n", - }, - { // translate_tabs_to_spaces = nil - // indent should be "\t" - "\ta\n b\n c\n d\n", - nil, - 1, - []Region{{0, 1}}, - "a\n b\n c\n d\n", - }, - { // translate_tabs_to_spaces = true and tab_size = 2 - // indent should be " " - " a\n b\n c\n d\n", - true, - 2, - []Region{{0, 1}}, - "a\n b\n c\n d\n", - }, - { // translate_tabs_to_spaces = true and tab_size = nil - // indent should be " " - " a\n b\n c\n d\n", - true, - nil, - []Region{{0, 1}}, - "a\n b\n c\n d\n", - }, - { // region include the 1st line and the 4th line - // unindent should remove from the begining of 1st and 4th line - "\ta\n b\n c\n \t d\n", - false, - 1, - []Region{{0, 1}, {11, 12}}, - "a\n b\n c\n\t d\n", - }, - { // region selected reversely - // should perform unindent - "\ta\n\t b\n c\n d\n", - false, - 4, - []Region{{3, 0}}, - "a\n b\n c\n d\n", - }, - { // empty strings - // should perform unindent - "", - false, - nil, - []Region{{0, 0}}, - "", - }, - } - - runIndentTest(t, tests, "unindent") -} diff --git a/backend/commands/insdel.go b/backend/commands/insdel.go deleted file mode 100644 index 035e56b..0000000 --- a/backend/commands/insdel.go +++ /dev/null @@ -1,198 +0,0 @@ -// Copyright 2013 The lime Authors. -// Use of this source code is governed by a 2-clause -// BSD-style license that can be found in the LICENSE file. - -package commands - -import ( - . "github.com/limetext/lime/backend" - "github.com/limetext/text" - "strings" -) - -type ( - // The InsertCommand inserts the given characters, at all - // of the current selection locations, possibly replacing - // text if the selection area covers one or more characters. - InsertCommand struct { - DefaultCommand - // The characters to insert - Characters string - } - - // The LeftDeleteCommand deletes characters to the left of the - // current selection or the current selection if it is not empty. - LeftDeleteCommand struct { - DefaultCommand - } - - // The RightDeleteCommand deletes characters to the right of the - // current selection or the current selection if it is not empty. - RightDeleteCommand struct { - DefaultCommand - } - - // The DeleteWordCommand deletes one word to right or left - // depending on forward variable - DeleteWordCommand struct { - DefaultCommand - Forward bool - } -) - -func (c *InsertCommand) Run(v *View, e *Edit) error { - sel := v.Sel() - for i := 0; i < sel.Len(); i++ { - r := sel.Get(i) - if r.Size() == 0 { - v.Insert(e, r.B, c.Characters) - } else { - v.Replace(e, r, c.Characters) - } - } - return nil -} - -func (c *LeftDeleteCommand) Run(v *View, e *Edit) error { - trim_space := false - tab_size := 4 - if t, ok := v.Settings().Get("translate_tabs_to_spaces", false).(bool); ok && t { - if t, ok := v.Settings().Get("use_tab_stops", true).(bool); ok && t { - trim_space = true - tab_size, ok = v.Settings().Get("tab_size", 4).(int) - if !ok { - tab_size = 4 - } - } - } - - sel := v.Sel() - hasNonEmpty := sel.HasNonEmpty() - i := 0 - for { - l := sel.Len() - if i >= l { - break - } - r := sel.Get(i) - if r.A == r.B && !hasNonEmpty { - if trim_space { - _, col := v.Buffer().RowCol(r.A) - prev_col := r.A - (col - (col-tab_size+(tab_size-1))&^(tab_size-1)) - if prev_col < 0 { - prev_col = 0 - } - d := v.Buffer().SubstrR(text.Region{A: prev_col, B: r.A}) - i := len(d) - 1 - for r.A > prev_col && i >= 0 && d[i] == ' ' { - r.A-- - i-- - } - } - if r.A == r.B { - r.A-- - } - } - v.Erase(e, r) - if sel.Len() != l { - continue - } - i++ - } - return nil -} - -func (c *RightDeleteCommand) Run(v *View, e *Edit) error { - sel := v.Sel() - hasNonEmpty := sel.HasNonEmpty() - i := 0 - for { - l := sel.Len() - if i >= l { - break - } - r := sel.Get(i) - if r.A == r.B && !hasNonEmpty { - r.B++ - } - v.Erase(e, r) - if sel.Len() != l { - continue - } - i++ - } - return nil -} - -func (c *DeleteWordCommand) Run(v *View, e *Edit) error { - var class int - if c.Forward { - class = CLASS_WORD_END | CLASS_PUNCTUATION_END | CLASS_LINE_START - } else { - class = CLASS_WORD_START | CLASS_PUNCTUATION_START | CLASS_LINE_END | CLASS_LINE_START - } - - sel := v.Sel() - var rs []text.Region - for i := 0; i < sel.Len(); i++ { - r := sel.Get(i) - if r.Empty() { - p := c.findByClass(r.A, class, v) - if c.Forward { - r = text.Region{A: r.A, B: p} - } else { - r = text.Region{A: p, B: r.A} - } - } - rs = append(rs, r) - } - sel.Clear() - sel.AddAll(rs) - if c.Forward { - GetEditor().CommandHandler().RunTextCommand(v, "right_delete", nil) - } else { - GetEditor().CommandHandler().RunTextCommand(v, "left_delete", nil) - } - return nil -} - -func (c *DeleteWordCommand) findByClass(point int, class int, v *View) int { - var end, d int - if c.Forward { - d = 1 - end = v.Buffer().Size() - if point > end { - point = end - } - s := v.Buffer().Substr(text.Region{A: point, B: point + 2}) - if strings.Contains(s, "\t") && strings.Contains(s, " ") { - class = CLASS_WORD_START | CLASS_PUNCTUATION_START | CLASS_LINE_END - } - } else { - d = -1 - end = 0 - if point < end { - point = end - } - s := v.Buffer().Substr(text.Region{A: point - 2, B: point}) - if strings.Contains(s, "\t") && strings.Contains(s, " ") { - class = CLASS_WORD_END | CLASS_PUNCTUATION_END | CLASS_LINE_START - } - } - point += d - for ; point != end; point += d { - if v.Classify(point)&class != 0 { - return point - } - } - return point -} - -func init() { - register([]Command{ - &InsertCommand{}, - &LeftDeleteCommand{}, - &RightDeleteCommand{}, - &DeleteWordCommand{}, - }) -} diff --git a/backend/commands/insdel_test.go b/backend/commands/insdel_test.go deleted file mode 100644 index 95a7473..0000000 --- a/backend/commands/insdel_test.go +++ /dev/null @@ -1,335 +0,0 @@ -// Copyright 2013 The lime Authors. -// Use of this source code is governed by a 2-clause -// BSD-style license that can be found in the LICENSE file. - -package commands - -import ( - . "github.com/limetext/lime/backend" - . "github.com/limetext/text" - "reflect" - "strings" - "testing" -) - -func TestBasic(t *testing.T) { - data := `Hello world -Test -Goodbye world -` - ed := GetEditor() - w := ed.NewWindow() - defer w.Close() - - v := w.NewFile() - defer func() { - v.SetScratch(true) - v.Close() - }() - - e := v.BeginEdit() - v.Insert(e, 0, data) - v.EndEdit(e) - - v.Sel().Clear() - v.Sel().Add(Region{11, 11}) - v.Sel().Add(Region{16, 16}) - v.Sel().Add(Region{30, 30}) - ed.CommandHandler().RunTextCommand(v, "left_delete", nil) - if v.Buffer().Substr(Region{0, v.Buffer().Size()}) != `Hello worl -Tes -Goodbye worl -` { - t.Error(v.Buffer().Substr(Region{0, v.Buffer().Size()})) - } - ed.CommandHandler().RunTextCommand(v, "insert", Args{"characters": "a"}) - if d := v.Buffer().Substr(Region{0, v.Buffer().Size()}); d != "Hello worla\nTesa\nGoodbye worla\n" { - lines := strings.Split(v.Buffer().Substr(Region{0, v.Buffer().Size()}), "\n") - for _, l := range lines { - t.Errorf("%d: '%s'", len(l), l) - } - } - - v.Settings().Set("translate_tabs_to_spaces", true) - ed.CommandHandler().RunTextCommand(v, "insert", Args{"characters": "\t"}) - if v.Buffer().Substr(Region{0, v.Buffer().Size()}) != "Hello worla \nTesa \nGoodbye worla \n" { - lines := strings.Split(v.Buffer().Substr(Region{0, v.Buffer().Size()}), "\n") - for _, l := range lines { - t.Errorf("%d: '%s'", len(l), l) - } - } - ed.CommandHandler().RunTextCommand(v, "left_delete", nil) - if d := v.Buffer().Substr(Region{0, v.Buffer().Size()}); d != "Hello worla\nTesa\nGoodbye worla\n" { - lines := strings.Split(v.Buffer().Substr(Region{0, v.Buffer().Size()}), "\n") - for _, l := range lines { - t.Errorf("%d: '%s'", len(l), l) - } - } - - ed.CommandHandler().RunTextCommand(v, "left_delete", nil) - if d := v.Buffer().Substr(Region{0, v.Buffer().Size()}); d != "Hello worl\nTes\nGoodbye worl\n" { - lines := strings.Split(v.Buffer().Substr(Region{0, v.Buffer().Size()}), "\n") - for _, l := range lines { - t.Errorf("%d: '%s'", len(l), l) - } - } - - ed.CommandHandler().RunTextCommand(v, "insert", Args{"characters": "\t"}) - if d := v.Buffer().Substr(Region{0, v.Buffer().Size()}); d != "Hello worl \nTes \nGoodbye worl \n" { - lines := strings.Split(v.Buffer().Substr(Region{0, v.Buffer().Size()}), "\n") - for _, l := range lines { - t.Errorf("%d: '%s'", len(l), l) - } - } - - ed.CommandHandler().RunTextCommand(v, "left_delete", nil) - if v.Buffer().Substr(Region{0, v.Buffer().Size()}) != "Hello worl\nTes\nGoodbye worl\n" { - lines := strings.Split(v.Buffer().Substr(Region{0, v.Buffer().Size()}), "\n") - for _, l := range lines { - t.Errorf("%d: '%s'", len(l), l) - } - } - - v.Buffer().Erase(0, len(v.Buffer().Substr(Region{0, v.Buffer().Size()}))) - v.Buffer().Insert(0, "€þıœəßðĸʒ×ŋµåäö𝄞") - orig := "€þıœəßðĸʒ×ŋµåäö𝄞" - if d := v.Buffer().Substr(Region{0, v.Buffer().Size()}); d != orig { - t.Errorf("%s\n\t%v\n\t%v", d, []byte(d), []byte(orig)) - } - - v.Sel().Clear() - v.Sel().Add(Region{3, 3}) - v.Sel().Add(Region{6, 6}) - v.Sel().Add(Region{9, 9}) - ed.CommandHandler().RunTextCommand(v, "left_delete", nil) - exp := "€þœəðĸ×ŋµåäö𝄞" - if d := v.Buffer().Substr(Region{0, v.Buffer().Size()}); d != exp { - t.Errorf("%s\n\t%v\n\t%v", d, []byte(d), []byte(exp)) - } -} - -type deleteTest struct { - in, out []Region - text string - ins string -} - -func runDeleteTest(command string, tests *[]deleteTest, t *testing.T) { - ed := GetEditor() - w := ed.NewWindow() - - for i, test := range *tests { - v := w.NewFile() - defer func() { - v.SetScratch(true) - v.Close() - }() - - e := v.BeginEdit() - v.Insert(e, 0, test.ins) - v.EndEdit(e) - - v.Sel().Clear() - for _, r := range test.in { - v.Sel().Add(r) - } - var s2 RegionSet - for _, r := range test.out { - s2.Add(r) - } - - ed.CommandHandler().RunTextCommand(v, command, nil) - if d := v.Buffer().Substr(Region{0, v.Buffer().Size()}); d != test.text { - t.Errorf("Test %02d: Expected %s, but got %s", i, test.text, d) - } else if !reflect.DeepEqual(*v.Sel(), s2) { - t.Errorf("Test %02d: Expected %v, but have %v", i, s2, v.Sel()) - } - } - -} - -func TestLeftDelete(t *testing.T) { - tests := []deleteTest{ - { - []Region{{1, 1}, {2, 2}, {3, 3}, {4, 4}}, - []Region{{0, 0}}, - "5678", - "12345678", - }, - { - []Region{{1, 1}, {3, 3}, {5, 5}, {7, 7}}, - []Region{{0, 0}, {1, 1}, {2, 2}, {3, 3}}, - "2468", - "12345678", - }, - { - []Region{{1, 3}}, - []Region{{1, 1}}, - "145678", - "12345678", - }, - { - []Region{{3, 1}}, - []Region{{1, 1}}, - "145678", - "12345678", - }, - { - []Region{{100, 5}}, - []Region{{93, 5}}, - "abc\nd", - "abc\ndef\nghi\n", - }, // Yes, this is indeed what ST3 does too. - } - - runDeleteTest("left_delete", &tests, t) -} - -func TestRightDelete(t *testing.T) { - tests := []deleteTest{ - { - []Region{{0, 0}, {1, 1}, {2, 2}, {3, 3}}, - []Region{{0, 0}}, - "5678", - "12345678", - }, - { - []Region{{1, 1}, {3, 3}, {5, 5}, {7, 7}}, - []Region{{1, 1}, {2, 2}, {3, 3}, {4, 4}}, - "1357", - "12345678", - }, - { - []Region{{1, 3}}, - []Region{{1, 1}}, - "145678", - "12345678", - }, - { - []Region{{3, 1}}, - []Region{{1, 1}}, - "145678", - "12345678", - }, - } - - runDeleteTest("right_delete", &tests, t) -} - -func TestInsert(t *testing.T) { - ed := GetEditor() - ch := ed.CommandHandler() - w := ed.NewWindow() - defer w.Close() - - v := w.NewFile() - defer func() { - v.SetScratch(true) - v.Close() - }() - - e := v.BeginEdit() - v.Insert(e, 0, "Hello World!\nTest123123\nAbrakadabra\n") - v.EndEdit(e) - - type Test struct { - in []Region - data string - expd string - expr []Region - } - - tests := []Test{ - { - []Region{{1, 1}, {3, 3}, {6, 6}}, - "a", - "Haelalo aWorld!\nTest123123\nAbrakadabra\n", - []Region{{2, 2}, {5, 5}, {9, 9}}, - }, - { - []Region{{1, 1}, {3, 3}, {6, 9}}, - "a", - "Haelalo ald!\nTest123123\nAbrakadabra\n", - []Region{{2, 2}, {5, 5}, {9, 9}}, - }, - { - []Region{{1, 1}, {3, 3}, {6, 9}}, - "€þıœəßðĸʒ×ŋµåäö𝄞", - "H€þıœəßðĸʒ×ŋµåäö𝄞el€þıœəßðĸʒ×ŋµåäö𝄞lo €þıœəßðĸʒ×ŋµåäö𝄞ld!\nTest123123\nAbrakadabra\n", - []Region{{17, 17}, {35, 35}, {54, 54}}, - }, - } - - for i, test := range tests { - v.Sel().Clear() - for _, r := range test.in { - v.Sel().Add(r) - } - ed.CommandHandler().RunTextCommand(v, "insert", Args{"characters": test.data}) - if d := v.Buffer().Substr(Region{0, v.Buffer().Size()}); d != test.expd { - t.Errorf("Insert test %d failed: %s", i, d) - } - if sr := v.Sel().Regions(); !reflect.DeepEqual(sr, test.expr) { - t.Errorf("Insert test %d failed: %v", i, sr) - } - ch.RunTextCommand(v, "undo", nil) - } -} - -func TestDeleteWord(t *testing.T) { - tests := []struct { - text string - sel []Region - forward bool - expect string - }{ - { - "word", - []Region{{4, 4}}, - false, - "", - }, - { - "'(}[word", - []Region{{7, 7}, {4, 4}}, - false, - "d", - }, - { - "testing forwar|d\ndelete word", - []Region{{0, 2}, {11, 11}, {16, 16}}, - true, - "sting for|ddelete word", - }, - { - "simple test on outside", - []Region{{-1, -1}, {6, 6}, {13, 13}, {54, 33}, {31, 31}}, - true, - "simpletest outside", - }, - } - - ed := GetEditor() - w := ed.NewWindow() - defer w.Close() - - for i, test := range tests { - v := w.NewFile() - defer func() { - v.SetScratch(true) - v.Close() - }() - - e := v.BeginEdit() - v.Insert(e, 0, test.text) - v.EndEdit(e) - - v.Sel().Clear() - v.Sel().AddAll(test.sel) - - ed.CommandHandler().RunTextCommand(v, "delete_word", Args{"forward": test.forward}) - if d := v.Buffer().Substr(Region{0, v.Buffer().Size()}); d != test.expect { - t.Errorf("Test %d:\nExcepted: '%s' but got: '%s'", i, test.expect, d) - } - } -} diff --git a/backend/commands/line.go b/backend/commands/line.go deleted file mode 100644 index 0d70168..0000000 --- a/backend/commands/line.go +++ /dev/null @@ -1,176 +0,0 @@ -// Copyright 2013 The lime Authors. -// Use of this source code is governed by a 2-clause -// BSD-style license that can be found in the LICENSE file. - -package commands - -import ( - . "github.com/limetext/lime/backend" - . "github.com/limetext/text" - "strings" -) - -type ( - // JoinCommand removes every new line in the - // selections and the first new line after - JoinCommand struct { - DefaultCommand - } - - SelectLinesCommand struct { - DefaultCommand - Forward bool - } - - SwapLineUpCommand struct { - DefaultCommand - } - - SwapLineDownCommand struct { - DefaultCommand - } - - SplitSelectionIntoLinesCommand struct { - DefaultCommand - } -) - -func (c *JoinCommand) Run(v *View, e *Edit) error { - sel := v.Sel() - for i := 0; i < sel.Len(); i++ { - r := sel.Get(i) - // Removing new line and triming in the selection - t := v.Buffer().Substr(r) - t = strings.Replace(t, "\r", "\n", -1) - slice := strings.Split(t, "\n") - t = "" - for j, s := range slice { - if j == 0 { - t += s - continue - } - t += " " + strings.TrimLeft(s, " \t") - } - v.Replace(e, r, t) - // Removing the first new line after selection - liner := v.Buffer().FullLine(r.End()) - line := v.Buffer().Substr(liner) - line = strings.Replace(line, "\n", "", -1) - line = strings.Replace(line, "\r", "", -1) - line = strings.TrimRight(line, " \t") - // Triming the line after - nextline := liner.End() + 1 - nextliner := v.Buffer().FullLine(nextline) - nline := v.Buffer().Substr(nextliner) - if nline != "" { - v.Replace(e, nextliner, " "+strings.TrimLeft(nline, " \t")) - } - v.Replace(e, liner, line) - } - - return nil -} - -func (c *SwapLineUpCommand) Run(v *View, e *Edit) error { - sel := v.Sel() - for i := 0; i < sel.Len(); i++ { - r := sel.Get(i) - // Expand to all lines under selection - fline := v.Buffer().Line(r.Begin()) - lline := v.Buffer().Line(r.End()) - r = Region{fline.Begin(), lline.End()} - t := v.Buffer().Substr(r) - // Select line before region - bline := v.Buffer().Line(r.Begin() - 1) - bt := v.Buffer().Substr(bline) - v.Replace(e, r, bt) - v.Replace(e, bline, t) - } - - return nil -} - -func (c *SwapLineDownCommand) Run(v *View, e *Edit) error { - sel := v.Sel() - for i := 0; i < sel.Len(); i++ { - r := sel.Get(i) - // Expand to all lines under selection - fline := v.Buffer().Line(r.Begin()) - lline := v.Buffer().Line(r.End()) - r = Region{fline.Begin(), lline.End()} - t := v.Buffer().Substr(r) - // Select line before region - nline := v.Buffer().Line(r.End() + 1) - nt := v.Buffer().Substr(nline) - v.Replace(e, nline, t) - v.Replace(e, r, nt) - } - - return nil -} - -func (c *SelectLinesCommand) Run(v *View, e *Edit) error { - var ( - rs []Region - line, l Region - d int - ) - - sel := v.Sel() - for i := 0; i < sel.Len(); i++ { - r := sel.Get(i) - // Get the distance of the selection to the begining of line - if c.Forward { - line = v.Buffer().FullLine(r.End()) - l = v.Buffer().Line(line.End() + 1) - d = r.End() - line.Begin() - } else { - line = v.Buffer().FullLine(r.Begin()) - l = v.Buffer().Line(line.Begin() - 1) - d = r.Begin() - line.Begin() - } - // If the next line lenght is more than the calculated distance - // Put new region at the exact distance - // If not put region at the end of the next|before line - if l.Size() < d { - rs = append(rs, Region{l.End(), l.End()}) - } else { - rs = append(rs, Region{l.Begin() + d, l.Begin() + d}) - } - } - v.Sel().AddAll(rs) - - return nil -} - -func (c *SplitSelectionIntoLinesCommand) Run(v *View, e *Edit) error { - var rs []Region - - sel := v.Sel() - for i := 0; i < sel.Len(); i++ { - r := sel.Get(i) - lines := v.Buffer().Lines(r) - for i := 0; i < len(lines); i++ { - if i != 0 { - // Remove line endings - r2 := v.Buffer().FullLine(lines[i-1].End()) - lines[i] = lines[i].Clip(r2) - } - rs = append(rs, lines[i].Intersection(r)) - } - } - v.Sel().Clear() - v.Sel().AddAll(rs) - - return nil -} - -func init() { - register([]Command{ - &JoinCommand{}, - &SelectLinesCommand{}, - &SwapLineUpCommand{}, - &SwapLineDownCommand{}, - &SplitSelectionIntoLinesCommand{}, - }) -} diff --git a/backend/commands/line_test.go b/backend/commands/line_test.go deleted file mode 100644 index 1a608c0..0000000 --- a/backend/commands/line_test.go +++ /dev/null @@ -1,294 +0,0 @@ -// Copyright 2013 The lime Authors. -// Use of this source code is governed by a 2-clause -// BSD-style license that can be found in the LICENSE file. - -package commands - -import ( - . "github.com/limetext/lime/backend" - . "github.com/limetext/text" - "testing" -) - -func TestJoin(t *testing.T) { - type JoinTest struct { - text string - sel []Region - expect string - } - - tests := []JoinTest{ - { - "a\n\t bc", - []Region{{1, 1}}, - "a bc", - }, - { - "abc\r\n\tde", - []Region{{0, 0}}, - "abc de", - }, - { - "testing \t\t\n join", - []Region{{9, 8}}, - "testing join", - }, - { - "test\n join\n command\n whith\n multiple\n regions", - []Region{{2, 17}, {34, 40}}, - "test join command whith\n multiple regions", - }, - } - - ed := GetEditor() - w := ed.NewWindow() - defer w.Close() - - for i, test := range tests { - v := w.NewFile() - defer func() { - v.SetScratch(true) - v.Close() - }() - - e := v.BeginEdit() - v.Insert(e, 0, test.text) - v.EndEdit(e) - - v.Sel().Clear() - v.Sel().AddAll(test.sel) - - ed.CommandHandler().RunTextCommand(v, "join", nil) - if d := v.Buffer().Substr(Region{0, v.Buffer().Size()}); d != test.expect { - t.Errorf("Test %d:\nExcepted: '%s'\nbut got: '%s'", i, test.expect, d) - } - } -} - -func TestSelectLines(t *testing.T) { - type SelectLinesTest struct { - text string - sel []Region - forward bool - expect []Region - } - - tests := []SelectLinesTest{ - { - "abc\ndefg", - []Region{{1, 1}}, - true, - []Region{{1, 1}, {5, 5}}, - }, - { - "abcde\nfg", - []Region{{4, 4}}, - true, - []Region{{4, 4}, {8, 8}}, - }, - { - "Testing select lines command\nin\nlime text", - []Region{{8, 14}, {30, 30}}, - true, - []Region{{8, 14}, {30, 30}, {31, 31}, {33, 33}}, - }, - { - "abc\n\ndefg", - []Region{{6, 6}}, - false, - []Region{{6, 6}, {4, 4}}, - }, - { - "Testing select lines command\nin\nlime text", - []Region{{30, 36}, {29, 29}}, - false, - []Region{{30, 36}, {29, 29}, {0, 0}, {1, 1}}, - }, - } - - ed := GetEditor() - w := ed.NewWindow() - defer w.Close() - - for i, test := range tests { - v := w.NewFile() - defer func() { - v.SetScratch(true) - v.Close() - }() - - e := v.BeginEdit() - v.Insert(e, 0, test.text) - v.EndEdit(e) - - v.Sel().Clear() - v.Sel().AddAll(test.sel) - - ed.CommandHandler().RunTextCommand(v, "select_lines", Args{"forward": test.forward}) - // Comparing regions - d := v.Sel() - if d.Len() != len(test.expect) { - t.Errorf("Test %d: Excepted '%d' regions, but got '%d' regions", i, len(test.expect), d.Len()) - t.Errorf("%+v, %+v", test.expect, d.Regions()) - } else { - var found bool - for _, r := range test.expect { - found = false - for _, r2 := range d.Regions() { - if r2 == r { - found = true - break - } - } - if !found { - t.Errorf("Test %d:\nRegion %+v not found in view regions: %+v", i, r, d.Regions()) - } - } - } - } -} - -func TestSwapLine(t *testing.T) { - type SwapLineTest struct { - text string - sel []Region - expect string - } - - uptests := []SwapLineTest{ - { - "a\nb", - []Region{{2, 2}}, - "b\na", - }, - { - "Testing swap line up\ncommand whit multiple\nregions selected\nTesting swap line up\ncommand whit multiple\nregions selected", - []Region{{25, 53}, {86, 95}}, - "command whit multiple\nregions selected\nTesting swap line up\ncommand whit multiple\nTesting swap line up\nregions selected", - }, - } - - dwtests := []SwapLineTest{ - { - "a\nb", - []Region{{1, 1}}, - "b\na", - }, - { - "Testing swap line up\ncommand whit multiple\nregions selected\nTesting swap line up\ncommand whit multiple\nregions selected", - []Region{{25, 53}, {86, 95}}, - "Testing swap line up\nTesting swap line up\ncommand whit multiple\nregions selected\nregions selected\ncommand whit multiple", - }, - } - - ed := GetEditor() - w := ed.NewWindow() - defer w.Close() - - for i, test := range uptests { - v := w.NewFile() - defer func() { - v.SetScratch(true) - v.Close() - }() - - e := v.BeginEdit() - v.Insert(e, 0, test.text) - v.EndEdit(e) - - v.Sel().Clear() - v.Sel().AddAll(test.sel) - - ed.CommandHandler().RunTextCommand(v, "swap_line_up", nil) - if d := v.Buffer().Substr(Region{0, v.Buffer().Size()}); d != test.expect { - t.Errorf("Test %d:\nExcepted: '%s'\nbut got: '%s'", i, test.expect, d) - } - } - - for i, test := range dwtests { - v := w.NewFile() - defer func() { - v.SetScratch(true) - v.Close() - }() - - e := v.BeginEdit() - v.Insert(e, 0, test.text) - v.EndEdit(e) - - v.Sel().Clear() - v.Sel().AddAll(test.sel) - - ed.CommandHandler().RunTextCommand(v, "swap_line_down", nil) - if d := v.Buffer().Substr(Region{0, v.Buffer().Size()}); d != test.expect { - t.Errorf("Test %d:\nExcepted: '%s'\nbut got: '%s'", i, test.expect, d) - } - } -} - -func TestSplitToLines(t *testing.T) { - type SplitToLinesTest struct { - text string - sel []Region - expect []Region - } - - tests := []SplitToLinesTest{ - { - "ab\ncd\nef", - []Region{{4, 7}}, - []Region{{4, 5}, {6, 7}}, - }, - { - "ab\ncd\nef", - []Region{{0, 8}}, - []Region{{0, 2}, {3, 5}, {6, 8}}, - }, - { - "ab\ncd\nef", - []Region{{0, 4}, {4, 7}}, - []Region{{0, 2}, {3, 4}, {4, 5}, {6, 7}}, - }, - } - - ed := GetEditor() - w := ed.NewWindow() - defer w.Close() - - for i, test := range tests { - v := w.NewFile() - defer func() { - v.SetScratch(true) - v.Close() - }() - - e := v.BeginEdit() - v.Insert(e, 0, test.text) - v.EndEdit(e) - - v.Sel().Clear() - v.Sel().AddAll(test.sel) - - ed.CommandHandler().RunTextCommand(v, "split_selection_into_lines", nil) - // Comparing regions - d := v.Sel() - if d.Len() != len(test.expect) { - t.Errorf("Test %d: Excepted '%d' regions, but got '%d' regions", i, len(test.expect), d.Len()) - t.Errorf("%+v, %+v", test.expect, d.Regions()) - } else { - var found bool - for _, r := range test.expect { - found = false - for _, r2 := range d.Regions() { - if r2 == r { - found = true - break - } - } - if !found { - t.Errorf("Test %d:\nRegion %+v not found in view regions: %+v", i, r, d.Regions()) - } - } - } - } -} diff --git a/backend/commands/move.go b/backend/commands/move.go deleted file mode 100644 index 9ad74f3..0000000 --- a/backend/commands/move.go +++ /dev/null @@ -1,384 +0,0 @@ -// Copyright 2013 The lime Authors. -// Use of this source code is governed by a 2-clause -// BSD-style license that can be found in the LICENSE file. - -package commands - -import ( - "fmt" - . "github.com/limetext/lime/backend" - "github.com/limetext/lime/backend/util" - "github.com/limetext/text" - "strings" -) - -const ( - // Beginning of line - BOL MoveToType = iota - // End of line - EOL - // Beginning of file - BOF - // End of file - EOF - // Current level close bracket - Brackets -) - -const ( - // Move by Characters - Characters MoveByType = iota - // Move by Stops (TODO(.): what exactly is a stop?) - Stops - // Move by Lines - Lines - // Move by Words - Words - // Move by Word Ends - WordEnds - // Move by Sub Words - SubWords - // Move by Sub Word Ends - SubWordEnds - // Move by Page - Pages -) - -type ( - // The MoveCommand moves the current selection - MoveCommand struct { - DefaultCommand - // Specifies the type of "move" operation - By MoveByType - // Whether the current selection should be extended or not - Extend bool - // Whether to move forward or backwards - Forward bool - // Used together with By=Stops, extends "word_separators" defined by settings - Separators string - // Used together with By=Stops, go to word begin - WordBegin bool - // Used together with By=Stops, go to word end - WordEnd bool - // Used together with By=Stops, go to punctuation begin - PunctBegin bool - // Used together with By=Stops, go to punctuation end - PunctEnd bool - // Used together with By=Stops, go to an empty line - EmptyLine bool - // Used together with By=Stops, TODO: ??? - ClipToLine bool - } - - // Specifies the type of "move" operation - MoveByType int - - // Specifies the type of "move_to" operation to perform - MoveToType int - - // The MoveToCommand moves or extends the current selection to the specified location - MoveToCommand struct { - DefaultCommand - // The type of "move_to" operation to perform - To MoveToType - // Whether the current selection should be extended or not - Extend bool - } - - // The ScrollLinesCommand moves the viewpoint "Amount" lines from the current location - ScrollLinesCommand struct { - BypassUndoCommand - // The number of lines to scroll (positive or negative direction) - Amount int - } -) - -func move_action(v *View, extend bool, transform func(r text.Region) int) { - sel := v.Sel() - r := sel.Regions() - bs := v.Buffer().Size() - for i := range r { - r[i].B = transform(r[i]) - if r[i].B < 0 { - r[i].B = 0 - } else if r[i].B > bs { - // Yes > the size, and not size-1 because the cursor being at "size" - // is the position it will be at when we are appending - // to the buffer - r[i].B = bs - } - - if !extend { - r[i].A = r[i].B - } - } - sel.Clear() - sel.AddAll(r) -} - -func (mt *MoveToType) Set(v interface{}) error { - switch to := v.(string); to { - case "eol": - *mt = EOL - case "bol": - *mt = BOL - case "bof": - *mt = BOF - case "eof": - *mt = EOF - case "brackets": - *mt = Brackets - default: - return fmt.Errorf("move_to: Unimplemented 'to' type: %s", to) - } - return nil -} - -func (c *MoveToCommand) Run(v *View, e *Edit) error { - switch c.To { - case EOL: - move_action(v, c.Extend, func(r text.Region) int { - line := v.Buffer().Line(r.B) - return line.B - }) - case BOL: - move_action(v, c.Extend, func(r text.Region) int { - line := v.Buffer().Line(r.B) - return line.A - }) - case BOF: - move_action(v, c.Extend, func(r text.Region) int { - return 0 - }) - case EOF: - move_action(v, c.Extend, func(r text.Region) int { - return v.Buffer().Size() - }) - case Brackets: - move_action(v, c.Extend, func(r text.Region) (pos int) { - var ( - of int - co = 1 - str, br, rv string - opening = "([{" - closing = ")]}" - ) - pos = r.B - - // next and before character - n := v.Buffer().Substr(text.Region{r.B, r.B + 1}) - b := v.Buffer().Substr(text.Region{r.B, r.B - 1}) - if strings.ContainsAny(n, opening) { - // TODO: Maybe it's better to use sth like view.FindByClass or even - // view.FindByClass() function itself instead of getting whole text - // and looping through it. With using view.FindByClass() function - // backward we won't need to reverse the text anymore - str = v.Buffer().Substr(text.Region{r.B + 1, v.Buffer().Size()}) - br = n - rv = revert(n) - of = 2 - } else if strings.ContainsAny(b, closing) { - // TODO: same as above - str = v.Buffer().Substr(text.Region{0, r.B - 1}) - br = b - rv = revert(b) - str = reverse(str) - co = -1 - of = -2 - } else if strings.ContainsAny(n, closing) { - // TODO: same as above - str = v.Buffer().Substr(text.Region{0, r.B - 1}) - br = n - rv = revert(n) - str = reverse(str) - co = -1 - of = -1 - } else { - // TODO: same as above - str = v.Buffer().Substr(text.Region{r.B, v.Buffer().Size()}) - bef := v.Buffer().Substr(text.Region{0, r.B}) - if p := strings.LastIndexAny(bef, opening); p == -1 { - return - } else { - br = string(bef[p]) - rv = revert(br) - } - } - count := 1 - for i, c := range str { - if ch := string(c); ch == br { - count++ - } else if ch == rv { - count-- - } - if count == 0 { - return i*co + r.B + of - } - } - return - }) - default: - return fmt.Errorf("move_to: Unimplemented 'to' action: %d", c.To) - } - return nil -} - -func (m *MoveByType) Set(v interface{}) error { - switch by := v.(string); by { - case "lines": - *m = Lines - case "characters": - *m = Characters - case "stops": - *m = Stops - case "words": - *m = Words - case "word_ends": - *m = WordEnds - case "subwords": - *m = SubWords - case "subword_ends": - *m = SubWordEnds - case "pages": - *m = Pages - default: - return fmt.Errorf("move: Unimplemented 'by' action: %s", by) - } - return nil -} - -func (c *MoveCommand) Run(v *View, e *Edit) error { - p := util.Prof.Enter("move.run.init") - - p.Exit() - p = util.Prof.Enter("move.run.action") - defer p.Exit() - - switch c.By { - case Characters: - dir := 1 - if !c.Forward { - dir = -1 - } - move_action(v, c.Extend, func(r text.Region) int { - return r.B + dir - }) - case Stops: - move_action(v, c.Extend, func(in text.Region) int { - tmp := v.Settings().Get("word_separators", DEFAULT_SEPARATORS).(string) - defer v.Settings().Set("word_separators", tmp) - v.Settings().Set("word_separators", c.Separators) - - classes := 0 - if c.WordBegin { - classes |= CLASS_WORD_START - } - if c.WordEnd { - classes |= CLASS_WORD_END - } - if c.PunctBegin { - classes |= CLASS_PUNCTUATION_START - } - if c.PunctEnd { - classes |= CLASS_PUNCTUATION_END - } - if c.EmptyLine { - classes |= CLASS_EMPTY_LINE - } - return v.FindByClass(in.B, c.Forward, classes) - }) - case Lines: - move_action(v, c.Extend, func(in text.Region) int { - r, col := v.Buffer().RowCol(in.B) - _ = r - if !c.Forward { - r-- - } else { - r++ - } - return v.Buffer().TextPoint(r, col) - }) - case Words: - move_action(v, c.Extend, func(in text.Region) int { - return v.FindByClass(in.B, c.Forward, CLASS_WORD_START| - CLASS_LINE_END|CLASS_LINE_START) - }) - case WordEnds: - move_action(v, c.Extend, func(in text.Region) int { - return v.FindByClass(in.B, c.Forward, CLASS_WORD_END| - CLASS_LINE_END|CLASS_LINE_START) - }) - case SubWords: - move_action(v, c.Extend, func(in text.Region) int { - return v.FindByClass(in.B, c.Forward, CLASS_SUB_WORD_START| - CLASS_WORD_START|CLASS_PUNCTUATION_START|CLASS_LINE_END| - CLASS_LINE_START) - }) - case SubWordEnds: - move_action(v, c.Extend, func(in text.Region) int { - return v.FindByClass(in.B, c.Forward, CLASS_SUB_WORD_END| - CLASS_WORD_END|CLASS_PUNCTUATION_END|CLASS_LINE_END| - CLASS_LINE_START) - }) - case Pages: - // TODO: Should know how many lines does the frontend show in one page - } - return nil -} - -func (c *MoveCommand) Default(key string) interface{} { - if key == "separators" { - return DEFAULT_SEPARATORS - } - return nil -} - -func revert(c string) string { - switch c { - case "(": - return ")" - case ")": - return "(" - case "[": - return "]" - case "]": - return "[" - case "{": - return "}" - case "}": - return "{" - } - return "" -} - -func reverse(s string) string { - r := []rune(s) - for i, j := 0, len(r)-1; i < len(r)/2; i, j = i+1, j-1 { - r[i], r[j] = r[j], r[i] - } - return string(r) -} - -func (c *ScrollLinesCommand) Run(v *View, e *Edit) error { - fe := GetEditor().Frontend() - vr := fe.VisibleRegion(v) - var r int - if c.Amount >= 0 { - r, _ = v.Buffer().RowCol(vr.Begin()) - r -= c.Amount - } else { - r, _ = v.Buffer().RowCol(vr.End() - 1) - r -= c.Amount - } - r = v.Buffer().TextPoint(r, 0) - fe.Show(v, text.Region{A: r, B: r}) - return nil -} - -func init() { - register([]Command{ - &MoveCommand{}, - &MoveToCommand{}, - &ScrollLinesCommand{}, - }) -} diff --git a/backend/commands/move_test.go b/backend/commands/move_test.go deleted file mode 100644 index f7c298e..0000000 --- a/backend/commands/move_test.go +++ /dev/null @@ -1,1731 +0,0 @@ -// Copyright 2013 The lime Authors. -// Use of this source code is governed by a 2-clause -// BSD-style license that can be found in the LICENSE file. - -package commands - -import ( - . "github.com/limetext/lime/backend" - . "github.com/limetext/text" - "reflect" - "testing" -) - -type MoveTest struct { - in []Region - by string - extend bool - forward bool - exp []Region - args Args -} - -func runMoveTest(tests []MoveTest, t *testing.T, text string) { - ed := GetEditor() - w := ed.NewWindow() - v := w.NewFile() - - defer func() { - v.SetScratch(true) - v.Close() - w.Close() - }() - - e := v.BeginEdit() - v.Insert(e, 0, text) - v.EndEdit(e) - - for i, test := range tests { - v.Sel().Clear() - for _, r := range test.in { - v.Sel().Add(r) - } - args := Args{"by": test.by, "extend": test.extend, "forward": test.forward} - if test.args != nil { - for k, v := range test.args { - args[k] = v - } - } - ed.CommandHandler().RunTextCommand(v, "move", args) - if sr := v.Sel().Regions(); !reflect.DeepEqual(sr, test.exp) { - t.Errorf("Test %d failed. Expected %v, but got %v: %+v", i, test.exp, sr, test) - } - } -} - -func TestMove(t *testing.T) { - tests := []MoveTest{ - { - []Region{{1, 1}, {3, 3}, {6, 6}}, - "characters", - false, - true, - []Region{{2, 2}, {4, 4}, {7, 7}}, - nil, - }, - { - []Region{{1, 1}, {3, 3}, {6, 6}}, - "characters", - false, - false, - []Region{{0, 0}, {2, 2}, {5, 5}}, - nil, - }, - { - []Region{{1, 1}, {3, 3}, {10, 6}}, - "characters", - false, - true, - []Region{{2, 2}, {4, 4}, {7, 7}}, - nil, - }, - { - []Region{{1, 1}, {3, 3}, {10, 6}}, - "characters", - false, - false, - []Region{{0, 0}, {2, 2}, {5, 5}}, - nil, - }, - { - []Region{{1, 1}, {3, 3}, {10, 6}}, - "characters", - true, - true, - []Region{{1, 2}, {3, 4}, {10, 7}}, - nil, - }, - { - []Region{{1, 1}, {3, 3}, {10, 6}}, - "characters", - true, - false, - []Region{{1, 0}, {3, 2}, {10, 5}}, - nil, - }, - { - []Region{{1, 3}, {3, 5}, {10, 7}}, - "characters", - true, - true, - []Region{{1, 6}, {10, 8}}, - nil, - }, - { - []Region{{1, 1}}, - "stops", - true, - true, - []Region{{1, 5}}, - Args{"word_end": true}, - }, - { - []Region{{1, 1}}, - "stops", - false, - true, - []Region{{6, 6}}, - Args{"word_begin": true}, - }, - { - []Region{{6, 6}}, - "stops", - false, - false, - []Region{{0, 0}}, - Args{"word_begin": true}, - }, - { - []Region{{34, 34}}, - "lines", - false, - false, - []Region{{23, 23}}, - nil, - }, - { - []Region{{23, 23}}, - "lines", - false, - false, - []Region{{10, 10}}, - nil, - }, - { - []Region{{100, 100}}, - "lines", - false, - false, - []Region{{24, 24}}, - nil, - }, - { - []Region{{1, 1}}, - "words", - true, - true, - []Region{{1, 6}}, - nil, - }, - { - []Region{{5, 5}}, - "words", - false, - true, - []Region{{6, 6}}, - nil, - }, - { - []Region{{6, 6}, {13, 15}}, - "words", - false, - true, - []Region{{12, 12}, {23, 23}}, - nil, - }, - { - []Region{{13, 13}}, - "words", - false, - false, - []Region{{12, 12}}, - nil, - }, - { - []Region{{1, 1}}, - "word_ends", - true, - true, - []Region{{1, 5}}, - nil, - }, - { - []Region{{5, 5}}, - "word_ends", - false, - true, - []Region{{11, 11}}, - nil, - }, - { - []Region{{11, 11}, {13, 15}}, - "word_ends", - false, - true, - []Region{{12, 12}, {23, 23}}, - nil, - }, - { - []Region{{13, 13}}, - "word_ends", - false, - false, - []Region{{12, 12}}, - nil, - }, - { - []Region{{1, 1}}, - "subwords", - true, - true, - []Region{{1, 6}}, - nil, - }, - { - []Region{{5, 5}}, - "subwords", - false, - true, - []Region{{6, 6}}, - nil, - }, - { - []Region{{6, 6}, {13, 15}}, - "subwords", - false, - true, - []Region{{11, 11}, {23, 23}}, - nil, - }, - { - []Region{{13, 13}}, - "subwords", - false, - false, - []Region{{12, 12}}, - nil, - }, - { - []Region{{1, 1}}, - "subword_ends", - true, - true, - []Region{{1, 5}}, - nil, - }, - { - []Region{{5, 5}}, - "subword_ends", - false, - true, - []Region{{6, 6}}, - nil, - }, - { - []Region{{6, 6}, {13, 15}}, - "subword_ends", - false, - true, - []Region{{11, 11}, {23, 23}}, - nil, - }, - { - []Region{{13, 13}}, - "subword_ends", - false, - false, - []Region{{12, 12}}, - nil, - }, - // Try moving outside the buffer - { - []Region{{0, 0}}, - "lines", - false, - false, - []Region{{0, 0}}, - nil, - }, - { - []Region{{36, 36}}, - "lines", - false, - true, - []Region{{36, 36}}, - nil, - }, - { - []Region{{0, 0}}, - "characters", - false, - false, - []Region{{0, 0}}, - nil, - }, - { - []Region{{36, 36}}, - "characters", - false, - true, - []Region{{36, 36}}, - nil, - }, - } - runMoveTest(tests, t, "Hello World!\nTest123123\nAbrakadabra\n") -} - -func TestMoveByStops(t *testing.T) { - tests := []MoveTest{ - { - []Region{{45, 45}}, - "stops", - false, - true, - []Region{{56, 56}}, - Args{"word_end": true}, - }, - { - []Region{{45, 45}}, - "stops", - false, - true, - []Region{{46, 46}}, - Args{"word_end": true, "separators": ""}, - }, - { - []Region{{8, 8}}, - "stops", - false, - true, - []Region{{24, 24}}, - Args{"empty_line": true}, - }, - { - []Region{{0, 0}}, - "stops", - false, - true, - []Region{{4, 4}}, - Args{"word_begin": true, "separators": "l"}, - }, - { - []Region{{58, 58}}, - "stops", - false, - true, - []Region{{61, 61}}, - Args{"punct_begin": true}, - }, - { - []Region{{7, 7}}, - "stops", - false, - true, - []Region{{12, 12}}, - Args{"punct_end": true}, - }, - } - runMoveTest(tests, t, "Hello WorLd!\nTest12312{\n\n3Stop (testing) tada}\n Abr_akad[abra") -} - -type MoveToTest struct { - in []Region - to string - extend bool - exp []Region -} - -func runMoveToTest(tests []MoveToTest, t *testing.T, text string) { - ed := GetEditor() - w := ed.NewWindow() - defer w.Close() - - v := w.NewFile() - defer func() { - v.SetScratch(true) - v.Close() - }() - - e := v.BeginEdit() - - v.Insert(e, 0, text) - v.EndEdit(e) - - for i, test := range tests { - v.Sel().Clear() - for _, r := range test.in { - v.Sel().Add(r) - } - args := Args{"to": test.to, "extend": test.extend} - ed.CommandHandler().RunTextCommand(v, "move_to", args) - if sr := v.Sel().Regions(); !reflect.DeepEqual(sr, test.exp) { - t.Errorf("Test %d failed. Expected %v, but got %v: %+v", i, test.exp, sr, test) - } - } -} - -func TestMoveTo(t *testing.T) { - /* - Correct behavior of MoveTo: - - Moves each cursor directly to the indicated position. - - If extend, the selection will be extended in the direction of movement - */ - - singleCursor := []Region{{16, 16}} - - sameLineCursors := []Region{{16, 16}, {17, 17}} - sameLineCursorsReversed := []Region{{17, 17}, {16, 16}} - - diffLineCursors := []Region{{3, 3}, {17, 17}} - diffLineCursorsReversed := []Region{{17, 17}, {3, 3}} - - singleForwardSelection := []Region{{15, 18}} - singleBackwardSelection := []Region{{18, 15}} - - sameLineForwardSelections := []Region{{15, 18}, {20, 21}} - sameLineForwardSelectionsReversed := []Region{{20, 21}, {15, 18}} - sameLineBackwardSelections := []Region{{18, 15}, {21, 20}} - sameLineBackwardSelectionsReversed := []Region{{21, 20}, {18, 15}} - sameLineForwardThenBackwardSelections := []Region{{15, 18}, {21, 20}} - sameLineForwardThenBackwardSelectionsReversed := []Region{{21, 20}, {15, 18}} - sameLineBackwardThenForwardSelections := []Region{{18, 15}, {20, 21}} - sameLineBackwardThenForwardSelectionsReversed := []Region{{20, 21}, {18, 15}} - - diffLineForwardSelections := []Region{{4, 6}, {20, 21}} - diffLineForwardSelectionsReversed := []Region{{20, 21}, {4, 6}} - diffLineBackwardSelections := []Region{{6, 4}, {21, 20}} - diffLineBackwardSelectionsReversed := []Region{{21, 20}, {6, 4}} - diffLineForwardThenBackwardSelections := []Region{{4, 6}, {21, 20}} - diffLineForwardThenBackwardSelectionsReversed := []Region{{21, 20}, {4, 6}} - diffLineBackwardThenForwardSelections := []Region{{6, 4}, {20, 21}} - diffLineBackwardThenForwardSelectionsReversed := []Region{{20, 21}, {6, 4}} - - text := "Hello World!\nTest123123\nAbrakadabra\n" - vbufflen := 36 - - tests := []MoveToTest{ - // BOF move - { - singleCursor, - "bof", - false, - []Region{{0, 0}}, - }, - { - sameLineCursors, - "bof", - false, - []Region{{0, 0}}, - }, - { - sameLineCursorsReversed, - "bof", - false, - []Region{{0, 0}}, - }, - { - diffLineCursors, - "bof", - false, - []Region{{0, 0}}, - }, - { - diffLineCursorsReversed, - "bof", - false, - []Region{{0, 0}}, - }, - { - singleForwardSelection, - "bof", - false, - []Region{{0, 0}}, - }, - { - singleBackwardSelection, - "bof", - false, - []Region{{0, 0}}, - }, - { - sameLineForwardSelections, - "bof", - false, - []Region{{0, 0}}, - }, - { - sameLineForwardSelectionsReversed, - "bof", - false, - []Region{{0, 0}}, - }, - { - sameLineBackwardSelections, - "bof", - false, - []Region{{0, 0}}, - }, - { - sameLineBackwardSelectionsReversed, - "bof", - false, - []Region{{0, 0}}, - }, - { - sameLineForwardThenBackwardSelections, - "bof", - false, - []Region{{0, 0}}, - }, - { - sameLineForwardThenBackwardSelectionsReversed, - "bof", - false, - []Region{{0, 0}}, - }, - { - sameLineBackwardThenForwardSelections, - "bof", - false, - []Region{{0, 0}}, - }, - { - sameLineBackwardThenForwardSelectionsReversed, - "bof", - false, - []Region{{0, 0}}, - }, - { - diffLineForwardSelections, - "bof", - false, - []Region{{0, 0}}, - }, - { - diffLineForwardSelectionsReversed, - "bof", - false, - []Region{{0, 0}}, - }, - { - diffLineBackwardSelections, - "bof", - false, - []Region{{0, 0}}, - }, - { - diffLineBackwardSelectionsReversed, - "bof", - false, - []Region{{0, 0}}, - }, - { - diffLineForwardThenBackwardSelections, - "bof", - false, - []Region{{0, 0}}, - }, - { - diffLineForwardThenBackwardSelectionsReversed, - "bof", - false, - []Region{{0, 0}}, - }, - { - diffLineBackwardThenForwardSelections, - "bof", - false, - []Region{{0, 0}}, - }, - { - diffLineBackwardThenForwardSelectionsReversed, - "bof", - false, - []Region{{0, 0}}, - }, - - // BOF extend - { - singleCursor, - "bof", - true, - []Region{{16, 0}}, - }, - { - sameLineCursors, - "bof", - true, - []Region{{17, 0}}, - }, - { - sameLineCursorsReversed, - "bof", - true, - []Region{{17, 0}}, - }, - { - diffLineCursors, - "bof", - true, - []Region{{17, 0}}, - }, - { - diffLineCursorsReversed, - "bof", - true, - []Region{{17, 0}}, - }, - { - singleForwardSelection, - "bof", - true, - []Region{{15, 0}}, - }, - { - singleBackwardSelection, - "bof", - true, - []Region{{18, 0}}, - }, - { - sameLineForwardSelections, - "bof", - true, - []Region{{20, 0}}, - }, - { - sameLineForwardSelectionsReversed, - "bof", - true, - []Region{{20, 0}}, - }, - { - sameLineBackwardSelections, - "bof", - true, - []Region{{21, 0}}, - }, - { - sameLineBackwardSelectionsReversed, - "bof", - true, - []Region{{21, 0}}, - }, - { - sameLineForwardThenBackwardSelections, - "bof", - true, - []Region{{21, 0}}, - }, - { - sameLineForwardThenBackwardSelectionsReversed, - "bof", - true, - []Region{{21, 0}}, - }, - { - sameLineBackwardThenForwardSelections, - "bof", - true, - []Region{{20, 0}}, - }, - { - sameLineBackwardThenForwardSelectionsReversed, - "bof", - true, - []Region{{20, 0}}, - }, - { - diffLineForwardSelections, - "bof", - true, - []Region{{20, 0}}, - }, - { - diffLineForwardSelectionsReversed, - "bof", - true, - []Region{{20, 0}}, - }, - { - diffLineBackwardSelections, - "bof", - true, - []Region{{21, 0}}, - }, - { - diffLineBackwardSelectionsReversed, - "bof", - true, - []Region{{21, 0}}, - }, - { - diffLineForwardThenBackwardSelections, - "bof", - true, - []Region{{21, 0}}, - }, - { - diffLineForwardThenBackwardSelectionsReversed, - "bof", - true, - []Region{{21, 0}}, - }, - { - diffLineBackwardThenForwardSelections, - "bof", - true, - []Region{{20, 0}}, - }, - { - diffLineBackwardThenForwardSelectionsReversed, - "bof", - true, - []Region{{20, 0}}, - }, - - // EOF move - { - singleCursor, - "eof", - false, - []Region{{vbufflen, vbufflen}}, - }, - { - sameLineCursors, - "eof", - false, - []Region{{vbufflen, vbufflen}}, - }, - { - sameLineCursorsReversed, - "eof", - false, - []Region{{vbufflen, vbufflen}}, - }, - { - diffLineCursors, - "eof", - false, - []Region{{vbufflen, vbufflen}}, - }, - { - diffLineCursorsReversed, - "eof", - false, - []Region{{vbufflen, vbufflen}}, - }, - { - singleForwardSelection, - "eof", - false, - []Region{{vbufflen, vbufflen}}, - }, - { - singleBackwardSelection, - "eof", - false, - []Region{{vbufflen, vbufflen}}, - }, - { - sameLineForwardSelections, - "eof", - false, - []Region{{vbufflen, vbufflen}}, - }, - { - sameLineForwardSelectionsReversed, - "eof", - false, - []Region{{vbufflen, vbufflen}}, - }, - { - sameLineBackwardSelections, - "eof", - false, - []Region{{vbufflen, vbufflen}}, - }, - { - sameLineBackwardSelectionsReversed, - "eof", - false, - []Region{{vbufflen, vbufflen}}, - }, - { - sameLineForwardThenBackwardSelections, - "eof", - false, - []Region{{vbufflen, vbufflen}}, - }, - { - sameLineForwardThenBackwardSelectionsReversed, - "eof", - false, - []Region{{vbufflen, vbufflen}}, - }, - { - sameLineBackwardThenForwardSelections, - "eof", - false, - []Region{{vbufflen, vbufflen}}, - }, - { - sameLineBackwardThenForwardSelectionsReversed, - "eof", - false, - []Region{{vbufflen, vbufflen}}, - }, - { - diffLineForwardSelections, - "eof", - false, - []Region{{vbufflen, vbufflen}}, - }, - { - diffLineForwardSelectionsReversed, - "eof", - false, - []Region{{vbufflen, vbufflen}}, - }, - { - diffLineBackwardSelections, - "eof", - false, - []Region{{vbufflen, vbufflen}}, - }, - { - diffLineBackwardSelectionsReversed, - "eof", - false, - []Region{{vbufflen, vbufflen}}, - }, - { - diffLineForwardThenBackwardSelections, - "eof", - false, - []Region{{vbufflen, vbufflen}}, - }, - { - diffLineForwardThenBackwardSelectionsReversed, - "eof", - false, - []Region{{vbufflen, vbufflen}}, - }, - { - diffLineBackwardThenForwardSelections, - "eof", - false, - []Region{{vbufflen, vbufflen}}, - }, - { - diffLineBackwardThenForwardSelectionsReversed, - "eof", - false, - []Region{{vbufflen, vbufflen}}, - }, - - // EOF extend - { - singleCursor, - "eof", - true, - []Region{{16, vbufflen}}, - }, - { - sameLineCursors, - "eof", - true, - []Region{{16, vbufflen}}, - }, - { - sameLineCursorsReversed, - "eof", - true, - []Region{{16, vbufflen}}, - }, - { - diffLineCursors, - "eof", - true, - []Region{{3, vbufflen}}, - }, - { - diffLineCursorsReversed, - "eof", - true, - []Region{{3, vbufflen}}, - }, - { - singleForwardSelection, - "eof", - true, - []Region{{15, vbufflen}}, - }, - { - singleBackwardSelection, - "eof", - true, - []Region{{18, vbufflen}}, - }, - { - sameLineForwardSelections, - "eof", - true, - []Region{{15, vbufflen}}, - }, - { - sameLineForwardSelectionsReversed, - "eof", - true, - []Region{{15, vbufflen}}, - }, - { - sameLineBackwardSelections, - "eof", - true, - []Region{{18, vbufflen}}, - }, - { - sameLineBackwardSelectionsReversed, - "eof", - true, - []Region{{18, vbufflen}}, - }, - { - sameLineForwardThenBackwardSelections, - "eof", - true, - []Region{{15, vbufflen}}, - }, - { - sameLineForwardThenBackwardSelectionsReversed, - "eof", - true, - []Region{{15, vbufflen}}, - }, - { - sameLineBackwardThenForwardSelections, - "eof", - true, - []Region{{18, vbufflen}}, - }, - { - sameLineBackwardThenForwardSelectionsReversed, - "eof", - true, - []Region{{18, vbufflen}}, - }, - { - diffLineForwardSelections, - "eof", - true, - []Region{{4, vbufflen}}, - }, - { - diffLineForwardSelectionsReversed, - "eof", - true, - []Region{{4, vbufflen}}, - }, - { - diffLineBackwardSelections, - "eof", - true, - []Region{{6, vbufflen}}, - }, - { - diffLineBackwardSelectionsReversed, - "eof", - true, - []Region{{6, vbufflen}}, - }, - { - diffLineForwardThenBackwardSelections, - "eof", - true, - []Region{{4, vbufflen}}, - }, - { - diffLineForwardThenBackwardSelectionsReversed, - "eof", - true, - []Region{{4, vbufflen}}, - }, - { - diffLineBackwardThenForwardSelections, - "eof", - true, - []Region{{6, vbufflen}}, - }, - { - diffLineBackwardThenForwardSelectionsReversed, - "eof", - true, - []Region{{6, vbufflen}}, - }, - - // BOL move - { - singleCursor, - "bol", - false, - []Region{{13, 13}}, - }, - { - sameLineCursors, - "bol", - false, - []Region{{13, 13}}, - }, - { - sameLineCursorsReversed, - "bol", - false, - []Region{{13, 13}}, - }, - { - diffLineCursors, - "bol", - false, - []Region{{0, 0}, {13, 13}}, - }, - { - diffLineCursorsReversed, - "bol", - false, - []Region{{13, 13}, {0, 0}}, - }, - { - singleForwardSelection, - "bol", - false, - []Region{{13, 13}}, - }, - { - singleBackwardSelection, - "bol", - false, - []Region{{13, 13}}, - }, - { - sameLineForwardSelections, - "bol", - false, - []Region{{13, 13}}, - }, - { - sameLineForwardSelectionsReversed, - "bol", - false, - []Region{{13, 13}}, - }, - { - sameLineBackwardSelections, - "bol", - false, - []Region{{13, 13}}, - }, - { - sameLineBackwardSelectionsReversed, - "bol", - false, - []Region{{13, 13}}, - }, - { - sameLineForwardThenBackwardSelections, - "bol", - false, - []Region{{13, 13}}, - }, - { - sameLineForwardThenBackwardSelectionsReversed, - "bol", - false, - []Region{{13, 13}}, - }, - { - sameLineBackwardThenForwardSelections, - "bol", - false, - []Region{{13, 13}}, - }, - { - sameLineBackwardThenForwardSelectionsReversed, - "bol", - false, - []Region{{13, 13}}, - }, - { - diffLineForwardSelections, - "bol", - false, - []Region{{0, 0}, {13, 13}}, - }, - { - diffLineForwardSelectionsReversed, - "bol", - false, - []Region{{13, 13}, {0, 0}}, - }, - { - diffLineBackwardSelections, - "bol", - false, - []Region{{0, 0}, {13, 13}}, - }, - { - diffLineBackwardSelectionsReversed, - "bol", - false, - []Region{{13, 13}, {0, 0}}, - }, - { - diffLineForwardThenBackwardSelections, - "bol", - false, - []Region{{0, 0}, {13, 13}}, - }, - { - diffLineForwardThenBackwardSelectionsReversed, - "bol", - false, - []Region{{13, 13}, {0, 0}}, - }, - { - diffLineBackwardThenForwardSelections, - "bol", - false, - []Region{{0, 0}, {13, 13}}, - }, - { - diffLineBackwardThenForwardSelectionsReversed, - "bol", - false, - []Region{{13, 13}, {0, 0}}, - }, - - // BOL extend - { - singleCursor, - "bol", - true, - []Region{{16, 13}}, - }, - { - sameLineCursors, - "bol", - true, - []Region{{17, 13}}, - }, - { - sameLineCursorsReversed, - "bol", - true, - []Region{{17, 13}}, - }, - { - diffLineCursors, - "bol", - true, - []Region{{3, 0}, {17, 13}}, - }, - { - diffLineCursorsReversed, - "bol", - true, - []Region{{17, 13}, {3, 0}}, - }, - { - singleForwardSelection, - "bol", - true, - []Region{{15, 13}}, - }, - { - singleBackwardSelection, - "bol", - true, - []Region{{18, 13}}, - }, - { - sameLineForwardSelections, - "bol", - true, - []Region{{20, 13}}, - }, - { - sameLineForwardSelectionsReversed, - "bol", - true, - []Region{{20, 13}}, - }, - { - sameLineBackwardSelections, - "bol", - true, - []Region{{21, 13}}, - }, - { - sameLineBackwardSelectionsReversed, - "bol", - true, - []Region{{21, 13}}, - }, - { - sameLineForwardThenBackwardSelections, - "bol", - true, - []Region{{21, 13}}, - }, - { - sameLineForwardThenBackwardSelectionsReversed, - "bol", - true, - []Region{{21, 13}}, - }, - { - sameLineBackwardThenForwardSelections, - "bol", - true, - []Region{{20, 13}}, - }, - { - sameLineBackwardThenForwardSelectionsReversed, - "bol", - true, - []Region{{20, 13}}, - }, - { - diffLineForwardSelections, - "bol", - true, - []Region{{4, 0}, {20, 13}}, - }, - { - diffLineForwardSelectionsReversed, - "bol", - true, - []Region{{20, 13}, {4, 0}}, - }, - { - diffLineBackwardSelections, - "bol", - true, - []Region{{6, 0}, {21, 13}}, - }, - { - diffLineBackwardSelectionsReversed, - "bol", - true, - []Region{{21, 13}, {6, 0}}, - }, - { - diffLineForwardThenBackwardSelections, - "bol", - true, - []Region{{4, 0}, {21, 13}}, - }, - { - diffLineForwardThenBackwardSelectionsReversed, - "bol", - true, - []Region{{21, 13}, {4, 0}}, - }, - { - diffLineBackwardThenForwardSelections, - "bol", - true, - []Region{{6, 0}, {20, 13}}, - }, - { - diffLineBackwardThenForwardSelectionsReversed, - "bol", - true, - []Region{{20, 13}, {6, 0}}, - }, - - // EOL move - { - singleCursor, - "eol", - false, - []Region{{23, 23}}, - }, - { - sameLineCursors, - "eol", - false, - []Region{{23, 23}}, - }, - { - sameLineCursorsReversed, - "eol", - false, - []Region{{23, 23}}, - }, - { - diffLineCursors, - "eol", - false, - []Region{{12, 12}, {23, 23}}, - }, - { - diffLineCursorsReversed, - "eol", - false, - []Region{{23, 23}, {12, 12}}, - }, - { - singleForwardSelection, - "eol", - false, - []Region{{23, 23}}, - }, - { - singleBackwardSelection, - "eol", - false, - []Region{{23, 23}}, - }, - { - sameLineForwardSelections, - "eol", - false, - []Region{{23, 23}}, - }, - { - sameLineForwardSelectionsReversed, - "eol", - false, - []Region{{23, 23}}, - }, - { - sameLineBackwardSelections, - "eol", - false, - []Region{{23, 23}}, - }, - { - sameLineBackwardSelectionsReversed, - "eol", - false, - []Region{{23, 23}}, - }, - { - sameLineForwardThenBackwardSelections, - "eol", - false, - []Region{{23, 23}}, - }, - { - sameLineForwardThenBackwardSelectionsReversed, - "eol", - false, - []Region{{23, 23}}, - }, - { - sameLineBackwardThenForwardSelections, - "eol", - false, - []Region{{23, 23}}, - }, - { - sameLineBackwardThenForwardSelectionsReversed, - "eol", - false, - []Region{{23, 23}}, - }, - { - diffLineForwardSelections, - "eol", - false, - []Region{{12, 12}, {23, 23}}, - }, - { - diffLineForwardSelectionsReversed, - "eol", - false, - []Region{{23, 23}, {12, 12}}, - }, - { - diffLineBackwardSelections, - "eol", - false, - []Region{{12, 12}, {23, 23}}, - }, - { - diffLineBackwardSelectionsReversed, - "eol", - false, - []Region{{23, 23}, {12, 12}}, - }, - { - diffLineForwardThenBackwardSelections, - "eol", - false, - []Region{{12, 12}, {23, 23}}, - }, - { - diffLineForwardThenBackwardSelectionsReversed, - "eol", - false, - []Region{{23, 23}, {12, 12}}, - }, - { - diffLineBackwardThenForwardSelections, - "eol", - false, - []Region{{12, 12}, {23, 23}}, - }, - { - diffLineBackwardThenForwardSelectionsReversed, - "eol", - false, - []Region{{23, 23}, {12, 12}}, - }, - - // EOL extend - { - singleCursor, - "eol", - true, - []Region{{16, 23}}, - }, - { - sameLineCursors, - "eol", - true, - []Region{{16, 23}}, - }, - { - sameLineCursorsReversed, - "eol", - true, - []Region{{16, 23}}, - }, - { - diffLineCursors, - "eol", - true, - []Region{{3, 12}, {17, 23}}, - }, - { - diffLineCursorsReversed, - "eol", - true, - []Region{{17, 23}, {3, 12}}, - }, - { - singleForwardSelection, - "eol", - true, - []Region{{15, 23}}, - }, - { - singleBackwardSelection, - "eol", - true, - []Region{{18, 23}}, - }, - { - sameLineForwardSelections, - "eol", - true, - []Region{{15, 23}}, - }, - { - sameLineForwardSelectionsReversed, - "eol", - true, - []Region{{15, 23}}, - }, - { - sameLineBackwardSelections, - "eol", - true, - []Region{{18, 23}}, - }, - { - sameLineBackwardSelectionsReversed, - "eol", - true, - []Region{{18, 23}}, - }, - { - sameLineForwardThenBackwardSelections, - "eol", - true, - []Region{{15, 23}}, - }, - { - sameLineForwardThenBackwardSelectionsReversed, - "eol", - true, - []Region{{15, 23}}, - }, - { - sameLineBackwardThenForwardSelections, - "eol", - true, - []Region{{18, 23}}, - }, - { - sameLineBackwardThenForwardSelectionsReversed, - "eol", - true, - []Region{{18, 23}}, - }, - { - diffLineForwardSelections, - "eol", - true, - []Region{{4, 12}, {20, 23}}, - }, - { - diffLineForwardSelectionsReversed, - "eol", - true, - []Region{{20, 23}, {4, 12}}, - }, - { - diffLineBackwardSelections, - "eol", - true, - []Region{{6, 12}, {21, 23}}, - }, - { - diffLineBackwardSelectionsReversed, - "eol", - true, - []Region{{21, 23}, {6, 12}}, - }, - { - diffLineForwardThenBackwardSelections, - "eol", - true, - []Region{{4, 12}, {21, 23}}, - }, - { - diffLineForwardThenBackwardSelectionsReversed, - "eol", - true, - []Region{{21, 23}, {4, 12}}, - }, - { - diffLineBackwardThenForwardSelections, - "eol", - true, - []Region{{6, 12}, {20, 23}}, - }, - { - diffLineBackwardThenForwardSelectionsReversed, - "eol", - true, - []Region{{20, 23}, {6, 12}}, - }, - } - - runMoveToTest(tests, t, text) - - tests = []MoveToTest{ - // Brackets move - { - []Region{{1, 1}}, - "brackets", - false, - []Region{{1, 1}}, - }, - { - []Region{{7, 7}}, - "brackets", - false, - []Region{{31, 31}}, - }, - { - []Region{{5, 5}}, - "brackets", - false, - []Region{{32, 32}}, - }, - { - []Region{{9, 9}, {14, 14}}, - "brackets", - false, - []Region{{31, 31}, {16, 16}}, - }, - { - []Region{{16, 16}}, - "brackets", - false, - []Region{{13, 13}}, - }, - { - []Region{{32, 32}}, - "brackets", - false, - []Region{{5, 5}}, - }, - { - []Region{{32, 12}}, - "brackets", - false, - []Region{{17, 17}}, - }, - { - []Region{{35, 35}}, - "brackets", - false, - // Sublime text 3 result is []Region{{35, 35}} - // but i think this is a bug - []Region{{38, 38}}, - }, - { - []Region{{8, 9}, {10, 10}}, - "brackets", - false, - []Region{{31, 31}}, - }, - { - []Region{{33, 33}}, - "brackets", - false, - // Sublime text 3 result is []Region{{33, 33}} - // but i think this is a bug - []Region{{39, 39}}, - }, - { - []Region{{36, 36}}, - "brackets", - false, - []Region{{36, 36}}, - }, - { - []Region{{38, 38}}, - "brackets", - false, - []Region{{34, 34}}, - }, - // Breackets extend - { - []Region{{8, 9}, {10, 10}}, - "brackets", - true, - []Region{{8, 31}}, - }, - { - []Region{{17, 17}}, - "brackets", - true, - []Region{{17, 24}}, - }, - { - []Region{{1, 1}, {14, 14}}, - "brackets", - true, - []Region{{1, 1}, {14, 16}}, - }, - } - - runMoveToTest(tests, t, "test (moveto(abc){\ntada}Test123)1{23)a}baraba") -} - -type scfe struct { - DummyFrontend - show Region -} - -func (f *scfe) VisibleRegion(v *View) Region { - s := v.Buffer().Line(v.Buffer().TextPoint(3*3, 1)) - e := v.Buffer().Line(v.Buffer().TextPoint(6*3, 1)) - return Region{s.Begin(), e.End()} -} - -func (f *scfe) Show(v *View, r Region) { - f.show = r -} - -func TestScrollLines(t *testing.T) { - var fe scfe - ed := GetEditor() - ed.SetFrontend(&fe) - ch := ed.CommandHandler() - w := ed.NewWindow() - defer w.Close() - - v := w.NewFile() - defer func() { - v.SetScratch(true) - v.Close() - }() - - e := v.BeginEdit() - for i := 0; i < 10; i++ { - v.Insert(e, 0, "Hello World!\nTest123123\nAbrakadabra\n") - } - v.EndEdit(e) - ch.RunTextCommand(v, "scroll_lines", Args{"amount": 0}) - - if c := v.Buffer().Line(v.Buffer().TextPoint(3*3, 1)); fe.show.Begin() != c.Begin() { - t.Errorf("Expected %v, but got %v", c, fe.show) - } - - ch.RunTextCommand(v, "scroll_lines", Args{"amount": 1}) - if c := v.Buffer().Line(v.Buffer().TextPoint(3*3-1, 1)); fe.show.Begin() != c.Begin() { - t.Errorf("Expected %v, but got %v", c, fe.show) - } - t.Log(fe.VisibleRegion(v), v.Buffer().Line(v.Buffer().TextPoint(6*3+1, 1))) - ch.RunTextCommand(v, "scroll_lines", Args{"amount": -1}) - if c := v.Buffer().Line(v.Buffer().TextPoint(6*3+1, 1)); fe.show.Begin() != c.Begin() { - t.Errorf("Expected %v, but got %v", c, fe.show) - } -} diff --git a/backend/commands/nop.go b/backend/commands/nop.go deleted file mode 100644 index 63e791a..0000000 --- a/backend/commands/nop.go +++ /dev/null @@ -1,43 +0,0 @@ -// Copyright 2014 The lime Authors. -// Use of this source code is governed by a 2-clause -// BSD-style license that can be found in the LICENSE file. - -package commands - -import ( - . "github.com/limetext/lime/backend" -) - -type ( - NopApplicationCommand struct { - BypassUndoCommand - } - - NopWindowCommand struct { - BypassUndoCommand - } - - NopTextCommand struct { - BypassUndoCommand - } -) - -func (c *NopApplicationCommand) Run() error { - return nil -} - -func (c *NopWindowCommand) Run(w *Window) error { - return nil -} - -func (c *NopTextCommand) Run(v *View, e *Edit) error { - return nil -} - -func init() { - registerByName([]namedCmd{ - {"nop", &NopApplicationCommand{}}, - {"nop", &NopWindowCommand{}}, - {"nop", &NopTextCommand{}}, - }) -} diff --git a/backend/commands/nop_test.go b/backend/commands/nop_test.go deleted file mode 100644 index ebb05d4..0000000 --- a/backend/commands/nop_test.go +++ /dev/null @@ -1,35 +0,0 @@ -// Copyright 2014 The lime Authors. -// Use of this source code is governed by a 2-clause -// BSD-style license that can be found in the LICENSE file. - -package commands - -import ( - . "github.com/limetext/lime/backend" - "testing" -) - -func TestRunApplicationCommand(t *testing.T) { - nopApplicationCommand := NopApplicationCommand{} - - if nopApplicationCommand.Run() != nil { - t.Error("No op application command running returns not nil") - } - -} - -func TestRunNopWindowCommand(t *testing.T) { - nopWindowCommand := NopWindowCommand{} - - if nopWindowCommand.Run(&Window{}) != nil { - t.Error("No op window command running returns not nil") - } -} - -func TestRunNopTextCommand(t *testing.T) { - nopTextCommand := NopTextCommand{} - - if nopTextCommand.Run(&View{}, &Edit{}) != nil { - t.Error("No op text command running returns not nil") - } -} diff --git a/backend/commands/register.go b/backend/commands/register.go deleted file mode 100644 index daef252..0000000 --- a/backend/commands/register.go +++ /dev/null @@ -1,33 +0,0 @@ -// Copyright 2013 The lime Authors. -// Use of this source code is governed by a 2-clause -// BSD-style license that can be found in the LICENSE file. - -package commands - -import ( - "github.com/limetext/lime/backend" - "github.com/limetext/lime/backend/log" -) - -type namedCmd struct { - name string - cmd backend.Command -} - -func registerByName(cmds []namedCmd) { - ch := backend.GetEditor().CommandHandler() - for _, cmd := range cmds { - if err := ch.Register(cmd.name, cmd.cmd); err != nil { - log.Errorf("Failed to register command %s: %s", cmd.name, err) - } - } -} - -func register(cmds []backend.Command) { - ch := backend.GetEditor().CommandHandler() - for _, cmd := range cmds { - if err := ch.RegisterWithDefault(cmd); err != nil { - log.Errorf("Failed to register command: %s", err) - } - } -} diff --git a/backend/commands/register_test.go b/backend/commands/register_test.go deleted file mode 100644 index 7ed12a2..0000000 --- a/backend/commands/register_test.go +++ /dev/null @@ -1,59 +0,0 @@ -// Copyright 2014 The lime Authors. -// Use of this source code is governed by a 2-clause -// BSD-style license that can be found in the LICENSE file. - -package commands - -import ( - "fmt" - . "github.com/limetext/lime/backend" - "testing" -) - -type DummyApplicationCommand struct { - DefaultCommand -} - -func (c *DummyApplicationCommand) Run() error { - return fmt.Errorf("Ran") -} - -func (c *DummyApplicationCommand) IsChecked() bool { - return false -} - -func TestRegisterByName(t *testing.T) { - ed := GetEditor() - - name := "dummy" - - registerByName([]namedCmd{ - {name, &DummyApplicationCommand{}}, - }) - - err := ed.CommandHandler().RunApplicationCommand(name, nil) - - if err == nil { - t.Errorf("Expected %s to run, but it didn't", name) - } else if err.Error() != "Ran" { - t.Errorf("Expected %s to run, but it got an error: %v", name, err) - } -} - -func TestRegister(t *testing.T) { - ed := GetEditor() - ac := &DummyApplicationCommand{} - - register([]Command{ - ac, - }) - - name := DefaultName(ac) - err := ed.CommandHandler().RunApplicationCommand(name, nil) - - if err == nil { - t.Errorf("Expected %s to run, but it didn't", name) - } else if err.Error() != "Ran" { - t.Errorf("Expected %s to run, but it got an error: %v", name, err) - } -} diff --git a/backend/commands/save.go b/backend/commands/save.go deleted file mode 100644 index 632a9e9..0000000 --- a/backend/commands/save.go +++ /dev/null @@ -1,61 +0,0 @@ -// Copyright 2013 The lime Authors. -// Use of this source code is governed by a 2-clause -// BSD-style license that can be found in the LICENSE file. - -package commands - -import ( - "fmt" - . "github.com/limetext/lime/backend" -) - -type ( - SaveCommand struct { - DefaultCommand - } - - SaveAsCommand struct { - DefaultCommand - Name string - } - - SaveAllCommand struct { - DefaultCommand - } -) - -func (c *SaveCommand) Run(v *View, e *Edit) error { - err := v.Save() - if err != nil { - GetEditor().Frontend().ErrorMessage(fmt.Sprintf("Failed to save %s:n%s", v.Buffer().FileName(), err)) - return err - } - return nil -} - -func (c *SaveAsCommand) Run(v *View, e *Edit) error { - err := v.SaveAs(c.Name) - if err != nil { - GetEditor().Frontend().ErrorMessage(fmt.Sprintf("Failed to save as %s:n%s", c.Name, err)) - return err - } - return nil -} - -func (c *SaveAllCommand) Run(w *Window) error { - for _, v := range w.Views() { - if err := v.Save(); err != nil { - GetEditor().Frontend().ErrorMessage(fmt.Sprintf("Failed to save %s:n%s", v.Buffer().FileName(), err)) - return err - } - } - return nil -} - -func init() { - register([]Command{ - &SaveCommand{}, - &SaveAsCommand{}, - &SaveAllCommand{}, - }) -} diff --git a/backend/commands/save_test.go b/backend/commands/save_test.go deleted file mode 100644 index 4cb84e2..0000000 --- a/backend/commands/save_test.go +++ /dev/null @@ -1,177 +0,0 @@ -// Copyright 2013 The lime Authors. -// Use of this source code is governed by a 2-clause -// BSD-style license that can be found in the LICENSE file. - -package commands - -import ( - . "github.com/limetext/lime/backend" - "io/ioutil" - "os" - "testing" -) - -var testfile string = "testdata/save_test.txt" - -func TestSave(t *testing.T) { - hold, err := ioutil.ReadFile(testfile) - if err != nil { - t.Fatalf("Couldn't read test file %s", testfile) - } - if err := ioutil.WriteFile(testfile, []byte("Before text"), 0644); err != nil { - t.Fatalf("Couldn't write test file %s", testfile) - } - - tests := []struct { - text string - expect string - }{ - { - " ab\ncd", - "Before text ab\ncd", - }, - { - "\n", - "Before text\n", - }, - } - - ed := GetEditor() - w := ed.NewWindow() - defer w.Close() - - for i, test := range tests { - err := ioutil.WriteFile(testfile, []byte("Before text"), 0644) - if err != nil { - t.Fatal("Could not write to test file") - } - - v := w.OpenFile(testfile, 0) - e := v.BeginEdit() - v.Insert(e, v.Buffer().Size(), test.text) - v.EndEdit(e) - - ed.CommandHandler().RunTextCommand(v, "save", nil) - if v.IsDirty() { - t.Errorf("Test %d: Expected the view to be clean, but it wasn't", i) - } - - if data, _ := ioutil.ReadFile(testfile); test.expect != string(data) { - t.Errorf("Test %d: Expected %s, but got %s", i, test.expect, string(data)) - } - - v.Close() - - if err := ioutil.WriteFile(testfile, hold, 0644); err != nil { - t.Fatalf("Couldn't write back test file %s", testfile) - } - } -} - -func TestSaveAs(t *testing.T) { - hold, err := ioutil.ReadFile(testfile) - if err != nil { - t.Fatalf("Couldn't read test file %s", testfile) - } - if err := ioutil.WriteFile(testfile, []byte(""), 0644); err != nil { - t.Fatalf("Couldn't write test file %s", testfile) - } - - ed := GetEditor() - w := ed.NewWindow() - // defer w.Close() - - v := w.OpenFile(testfile, 0) - e := v.BeginEdit() - v.Insert(e, 0, "Testing save_as command") - v.BeginEdit() - - name := "testdata/save_as_test.txt" - - ed.CommandHandler().RunTextCommand(v, "save_as", Args{"name": name}) - - if v.IsDirty() { - t.Error("Expected the view to be clean, but it wasn't") - } - - if _, err := os.Stat(name); os.IsNotExist(err) { - t.Errorf("The new test file %s wasn't created", name) - } - if data, _ := ioutil.ReadFile(name); "Testing save_as command" != string(data) { - t.Errorf("Expected %s, but got %s", "Testing save_as command", string(data)) - } - - // v.Close() - - if err := os.Remove(name); err != nil { - t.Errorf("Couldn't remove test file %s", name) - } - if err := ioutil.WriteFile(testfile, hold, 0644); err != nil { - t.Fatalf("Couldn't write back test file %s", testfile) - } -} - -func TestSaveAll(t *testing.T) { - var err error - holds := make(map[int][]byte) - views := make(map[int]View) - files := []struct { - file string - expect string - }{ - { - "testdata/save_all_test.txt", - "Testing save all 1", - }, - { - "testdata/save_another_all_test.txt", - "Testing save all 2", - }, - } - - ed := GetEditor() - fe := ed.Frontend() - if dfe, ok := fe.(*DummyFrontend); ok { - // Make it *not* reload the file - dfe.SetDefaultAction(false) - } - - w := ed.NewWindow() - // defer w.Close() - - for i, f := range files { - holds[i], err = ioutil.ReadFile(f.file) - if err != nil { - t.Fatalf("Test %d: Couldn't read file %s", i, f.file) - } - if err := ioutil.WriteFile(f.file, []byte(""), 0644); err != nil { - t.Fatalf("Test %d: Couldn't write test file %s", i, f.file) - } - - v := w.OpenFile(f.file, 0) - views[i] = *v - - e := v.BeginEdit() - v.Insert(e, 0, f.expect) - v.EndEdit(e) - } - - if err := ed.CommandHandler().RunWindowCommand(w, "save_all", nil); err != nil { - t.Errorf("failed to run save_all: %s", err) - } - - for i, f := range files { - if data, err := ioutil.ReadFile(f.file); err != nil { - t.Errorf("failed to read in file: %s", err) - } else if s := string(data); s != f.expect { - t.Errorf("Test %d: Expected to get `%s`, but got `%s`", i, f.expect, s) - } - } - - for i, f := range files { - // v := views[i] - // v.SetScratch(true) - // v.Close() - ioutil.WriteFile(f.file, holds[i], 0644) - } -} diff --git a/backend/commands/select.go b/backend/commands/select.go deleted file mode 100644 index 02f9544..0000000 --- a/backend/commands/select.go +++ /dev/null @@ -1,53 +0,0 @@ -// Copyright 2013 The lime Authors. -// Use of this source code is governed by a 2-clause -// BSD-style license that can be found in the LICENSE file. - -package commands - -import ( - . "github.com/limetext/lime/backend" - . "github.com/limetext/text" -) - -type ( - // The SingleSelectionCommand merges multiple cursors - // into a single one. - SingleSelectionCommand struct { - DefaultCommand - } - // The SelectAllCommand selects the whole buffer of the current file - SelectAllCommand struct { - DefaultCommand - } -) - -func (c *SingleSelectionCommand) Run(v *View, e *Edit) error { - /* - Correct behavior of SingleSelect: - - Remove all selection regions but the first. - */ - - r := v.Sel().Get(0) - v.Sel().Clear() - v.Sel().Add(r) - return nil -} - -func (c *SelectAllCommand) Run(v *View, e *Edit) error { - /* - Correct behavior of SelectAll: - - Select a single region of (0, view.buffersize()) - */ - - r := Region{0, v.Buffer().Size()} - v.Sel().Clear() - v.Sel().Add(r) - return nil -} - -func init() { - register([]Command{ - &SingleSelectionCommand{}, - &SelectAllCommand{}, - }) -} diff --git a/backend/commands/select_test.go b/backend/commands/select_test.go deleted file mode 100644 index 2ed4856..0000000 --- a/backend/commands/select_test.go +++ /dev/null @@ -1,60 +0,0 @@ -// Copyright 2013 The lime Authors. -// Use of this source code is governed by a 2-clause -// BSD-style license that can be found in the LICENSE file. - -package commands - -import ( - . "github.com/limetext/text" - "testing" -) - -func TestSingleSelection(t *testing.T) { - tests := []findTest{ - { - "Hello World!\nTest123123\nAbrakadabra\n", - []Region{{1, 1}, {2, 2}, {3, 3}, {6, 6}}, - []Region{{1, 1}}, - false, - }, - { - "Hello World!\nTest123123\nAbrakadabra\n", - []Region{{2, 2}, {3, 3}, {6, 6}}, - []Region{{2, 2}}, - false, - }, - { - "Hello World!\nTest123123\nAbrakadabra\n", - []Region{{5, 5}}, - []Region{{5, 5}}, - false, - }, - } - - runFindTest(tests, t, "single_selection") -} - -func TestSelectAll(t *testing.T) { - tests := []findTest{ - { - "Hello World!\nTest123123\nAbrakadabra\n", - []Region{{1, 1}, {2, 2}, {3, 3}, {6, 6}}, - []Region{{0, 36}}, - false, - }, - { - "Hello World!\nTest123123\nAbrakadabra\n", - []Region{{2, 2}, {3, 3}, {6, 6}}, - []Region{{0, 36}}, - false, - }, - { - "Hello World!\nTest123123\nAbrakadabra\n", - []Region{{5, 5}}, - []Region{{0, 36}}, - false, - }, - } - - runFindTest(tests, t, "select_all") -} diff --git a/backend/commands/settings.go b/backend/commands/settings.go deleted file mode 100644 index 8a3e53c..0000000 --- a/backend/commands/settings.go +++ /dev/null @@ -1,46 +0,0 @@ -// Copyright 2013 The lime Authors. -// Use of this source code is governed by a 2-clause -// BSD-style license that can be found in the LICENSE file. - -package commands - -import ( - . "github.com/limetext/lime/backend" -) - -type ( - // The ToggleSettingCommand toggles the value of a setting, - // making it false when it was true or true when it was false. - ToggleSettingCommand struct { - BypassUndoCommand - Setting string - } - - // The SetSettingCommand set the value of a setting. - SetSettingCommand struct { - BypassUndoCommand - Setting string - Value interface{} - } -) - -func (c *ToggleSettingCommand) Run(v *View, e *Edit) error { - setting := c.Setting - prev, boolean := v.Settings().Get(setting, false).(bool) - // if the setting was non-boolean, it is set to true, else it is toggled - v.Settings().Set(setting, !boolean || !prev) - return nil -} - -func (c *SetSettingCommand) Run(v *View, e *Edit) error { - setting := c.Setting - v.Settings().Set(setting, c.Value) - return nil -} - -func init() { - register([]Command{ - &ToggleSettingCommand{}, - &SetSettingCommand{}, - }) -} diff --git a/backend/commands/settings_test.go b/backend/commands/settings_test.go deleted file mode 100644 index 65d5ea5..0000000 --- a/backend/commands/settings_test.go +++ /dev/null @@ -1,71 +0,0 @@ -// Copyright 2013 The lime Authors. -// Use of this source code is governed by a 2-clause -// BSD-style license that can be found in the LICENSE file. - -package commands - -import ( - . "github.com/limetext/lime/backend" - "testing" -) - -func TestToggleSetting(t *testing.T) { - ed := GetEditor() - w := ed.NewWindow() - defer w.Close() - - v := w.NewFile() - defer func() { - v.SetScratch(true) - v.Close() - }() - - v.Settings().Set("duck", true) - v.Settings().Set("witch", false) - v.Settings().Set("favorite_color", "blue") - - // non-existant -> true - ed.CommandHandler().RunTextCommand(v, "toggle_setting", Args{"setting": "rabbit"}) - if val, ok := v.Settings().Get("rabbit").(bool); !ok || !val { - t.Errorf("Toggling an non-existant setting should make it true") - } - - // non-bool -> true - ed.CommandHandler().RunTextCommand(v, "toggle_setting", Args{"setting": "favorite_color"}) - if val, ok := v.Settings().Get("favorite_color").(bool); !ok || !val { - t.Errorf("Toggling an non-bool setting should make it true") - } - - // bool: true -> false - ed.CommandHandler().RunTextCommand(v, "toggle_setting", Args{"setting": "duck"}) - if val, ok := v.Settings().Get("duck").(bool); !ok || val { - t.Errorf("Setting should be toggled from true to false") - } - - // bool: false -> true - ed.CommandHandler().RunTextCommand(v, "toggle_setting", Args{"setting": "witch"}) - if val, ok := v.Settings().Get("witch").(bool); !ok || !val { - t.Errorf("Setting should be toggled from false to true") - } -} - -func TestSetSetting(t *testing.T) { - ed := GetEditor() - w := ed.NewWindow() - defer w.Close() - - v := w.NewFile() - defer func() { - v.SetScratch(true) - v.Close() - }() - - v.Settings().Set("favorite_color", "blue") - - exp := "red" - ed.CommandHandler().RunTextCommand(v, "set_setting", Args{"setting": "favorite_color", "value": exp}) - val := v.Settings().Get("favorite_color") - if s, ok := val.(string); !ok || s != exp { - t.Errorf("Expecting setting value to be %#v, was %#v", exp, val) - } -} diff --git a/backend/commands/sort.go b/backend/commands/sort.go deleted file mode 100644 index 40f5b0e..0000000 --- a/backend/commands/sort.go +++ /dev/null @@ -1,191 +0,0 @@ -// Copyright 2014 The lime Authors. -// Use of this source code is governed by a 2-clause -// BSD-style license that can be found in the LICENSE file. - -package commands - -import ( - . "github.com/limetext/lime/backend" - . "github.com/limetext/text" - "sort" - "strings" -) - -type ( - // The SortLinesCommand sorts all lines - // intersecting a selection region - SortLinesCommand struct { - DefaultCommand - CaseSensitive bool - Reverse bool - RemoveDuplicates bool - } - - // The SortSelectionCommand sorts contents - // of each selection region with respect to - // each other - SortSelectionCommand struct { - DefaultCommand - CaseSensitive bool - Reverse bool - RemoveDuplicates bool - } - - // Helper type to sort Regions by theirs positions - regionSorter []Region - - // Helper struct to sort strings - textSorter struct { - texts []string - caseSensitive bool - reverse bool - } -) - -// regionSorter implements sort.Interface -func (s regionSorter) Len() int { return len(s) } -func (s regionSorter) Swap(i, j int) { - s[i], s[j] = s[j], s[i] -} -func (s regionSorter) Less(i, j int) bool { - return s[i].Begin() < s[j].Begin() -} - -// stringSorter implements sort.Interface -func (s textSorter) Len() int { return len(s.texts) } -func (s textSorter) Swap(i, j int) { - s.texts[i], s.texts[j] = s.texts[j], s.texts[i] -} -func (s textSorter) Less(i, j int) bool { - textA := s.texts[i] - textB := s.texts[j] - - if !s.caseSensitive { - textA = strings.ToLower(textA) - textB = strings.ToLower(textB) - } - - if s.reverse { - return textA > textB - } - return textA < textB -} - -func (c *SortLinesCommand) Run(v *View, e *Edit) error { - sel := v.Sel() - buf := v.Buffer() - - // Used as a set of int - sorted_rows := make(map[int]bool) - - regions := []Region{} - texts := []string{} - for i := 0; i < sel.Len(); i++ { - // Get regions containing each line. - for _, r := range buf.Lines(sel.Get(i)) { - if ok := sorted_rows[r.Begin()]; !ok { - sorted_rows[r.Begin()] = true - regions = append(regions, r) - texts = append(texts, buf.Substr(r)) - } - } - } - - sort.Sort(textSorter{ - texts: texts, - caseSensitive: c.CaseSensitive, - reverse: c.Reverse, - }) - if c.RemoveDuplicates { - texts = removeDuplicates(c.CaseSensitive, texts) - } - - sort.Sort(regionSorter(regions)) - - offset := 0 - for i, r := range regions { - r = Region{r.A + offset, r.B + offset} - if i < len(texts) { - v.Replace(e, r, texts[i]) - offset += len(texts[i]) - r.Size() - } else { - // Erase the line and its ending - fullLine := buf.FullLineR(r) - v.Erase(e, fullLine) - offset -= fullLine.Size() - } - } - - return nil -} - -func (c *SortSelectionCommand) Run(v *View, e *Edit) error { - sel := v.Sel() - buf := v.Buffer() - - regions := make([]Region, sel.Len()) - texts := make([]string, sel.Len()) - for i := 0; i < sel.Len(); i++ { - regions[i] = sel.Get(i) - texts[i] = buf.Substr(regions[i]) - } - - sort.Sort(textSorter{ - texts: texts, - caseSensitive: c.CaseSensitive, - reverse: c.Reverse, - }) - if c.RemoveDuplicates { - texts = removeDuplicates(c.CaseSensitive, texts) - } - - sort.Sort(regionSorter(regions)) - - offset := 0 - for i, r := range regions { - r = Region{r.A + offset, r.B + offset} - if i < len(texts) { - v.Replace(e, r, texts[i]) - offset += len(texts[i]) - r.Size() - } else { - v.Erase(e, r) - offset -= r.Size() - } - } - - return nil -} - -// Remove duplicate ones from a sorted slice of string -func removeDuplicates(caseSensitive bool, xs []string) []string { - var i, j int - for j < len(xs) { - var accept bool - if i > 0 { - prev := xs[i-1] - curr := xs[j] - if !caseSensitive { - prev = strings.ToLower(prev) - curr = strings.ToLower(curr) - } - accept = (prev != curr) - } else { - accept = true - } - if accept { - xs[i] = xs[j] - i++ - j++ - } else { - j++ - } - } - return xs[:i] -} - -func init() { - register([]Command{ - &SortLinesCommand{}, - &SortSelectionCommand{}, - }) -} diff --git a/backend/commands/sort_test.go b/backend/commands/sort_test.go deleted file mode 100644 index e93bf62..0000000 --- a/backend/commands/sort_test.go +++ /dev/null @@ -1,196 +0,0 @@ -// Copyright 2014 The lime Authors. -// Use of this source code is governed by a 2-clause -// BSD-style license that can be found in the LICENSE file. - -package commands - -import ( - . "github.com/limetext/lime/backend" - . "github.com/limetext/text" - "testing" -) - -type sortTest struct { - text string - caseSensitive bool - reverse bool - removeDuplicates bool - sel []Region - expect string -} - -func runSortTest(command string, tests []sortTest, t *testing.T) { - ed := GetEditor() - w := ed.NewWindow() - defer w.Close() - - for i, test := range tests { - v := w.NewFile() - defer func() { - v.SetScratch(true) - v.Close() - }() - - e := v.BeginEdit() - v.Insert(e, 0, test.text) - v.EndEdit(e) - - v.Sel().Clear() - for _, r := range test.sel { - v.Sel().Add(r) - } - - args := Args{ - "case_sensitive": test.caseSensitive, - "reverse": test.reverse, - "remove_duplicates": test.removeDuplicates, - } - ed.CommandHandler().RunTextCommand(v, command, args) - - if d := v.Buffer().Substr(Region{0, v.Buffer().Size()}); d != test.expect { - t.Errorf("Test %d: Excepted %#v,\n but got %#v", i, test.expect, d) - } - } -} - -func TestSortLines(t *testing.T) { - tests := []sortTest{ - { // Case sensitive - "B\nc\na", - true, - false, - false, - []Region{{0, 5}}, - "B\na\nc", - }, - { // Case insensitive - "text\nSublime\nlime", - false, - false, - false, - []Region{{0, 17}}, - "lime\nSublime\ntext", - }, - { // Reverse - "b\nc\na", - true, - true, - false, - []Region{{0, 5}}, - "c\nb\na", - }, - { // Noncontinuous selection - "b\nc\na", - true, - false, - false, - []Region{{0, 1}, {4, 5}}, - "a\nc\nb", - }, - { // Noncontinuous selection, out of order - "b\nc\na", - true, - false, - false, - []Region{{4, 5}, {0, 1}}, - "a\nc\nb", - }, - { // Remove duplicates - "a\nb\na", - true, - false, - true, - []Region{{0, 5}}, - "a\nb\n", - }, - { // Remove duplicates case insensitive - "a\nb\nA", - false, - false, - true, - []Region{{0, 5}}, - "a\nb\n", - }, - { // No duplicates removal - "c\nb\na\nc\n", - true, - false, - false, - []Region{{0, 8}}, - "a\nb\nc\nc\n", - }, - } - - runSortTest("sort_lines", tests, t) -} - -func TestSortSelection(t *testing.T) { - tests := []sortTest{ - { // Case sensitive - "Bca", - true, - false, - false, - []Region{{0, 1}, {1, 2}, {2, 3}}, - "Bac", - }, - { // Case insensitive - "textSublimelime", - false, - false, - false, - []Region{{0, 4}, {4, 11}, {11, 15}}, - "limeSublimetext", - }, - { // Reverse - "bca", - true, - true, - false, - []Region{{0, 1}, {1, 2}, {2, 3}}, - "cba", - }, - { // Noncontinuous selection - "bca", - true, - false, - false, - []Region{{0, 1}, {2, 3}}, - "acb", - }, - { // Noncontinuous selection, out of order - "bca", - true, - false, - false, - []Region{{2, 3}, {0, 1}}, - "acb", - }, - { // Remove duplicates - "aba", - true, - false, - true, - []Region{{0, 1}, {1, 2}, {2, 3}}, - "ab", - }, - { // Remove duplicates case insensitive - "abA", - false, - false, - true, - []Region{{0, 1}, {1, 2}, {2, 3}}, - "ab", - }, - { // No duplicates removal - "cbac", - true, - false, - false, - []Region{{0, 1}, {1, 2}, {2, 3}, {3, 4}}, - "abcc", - }, - } - - runSortTest("sort_selection", tests, t) -} diff --git a/backend/commands/testdata/save_all_test.txt b/backend/commands/testdata/save_all_test.txt deleted file mode 100644 index 5b1dd02..0000000 --- a/backend/commands/testdata/save_all_test.txt +++ /dev/null @@ -1 +0,0 @@ -Some Text diff --git a/backend/commands/testdata/save_another_all_test.txt b/backend/commands/testdata/save_another_all_test.txt deleted file mode 100644 index c3d7ab3..0000000 --- a/backend/commands/testdata/save_another_all_test.txt +++ /dev/null @@ -1 +0,0 @@ -Some More Text diff --git a/backend/commands/testdata/save_test.txt b/backend/commands/testdata/save_test.txt deleted file mode 100644 index d54f8ba..0000000 --- a/backend/commands/testdata/save_test.txt +++ /dev/null @@ -1 +0,0 @@ -Some Text \ No newline at end of file diff --git a/backend/commands/transpose.go b/backend/commands/transpose.go deleted file mode 100644 index 90f0576..0000000 --- a/backend/commands/transpose.go +++ /dev/null @@ -1,98 +0,0 @@ -// Copyright 2014 The lime Authors. -// Use of this source code is governed by a 2-clause -// BSD-style license that can be found in the LICENSE file. - -package commands - -import ( - . "github.com/limetext/lime/backend" - . "github.com/limetext/text" -) - -type ( - // Transpose: Swap the characters on either side of the cursor, - // then move the cursor forward one character. - TransposeCommand struct { - DefaultCommand - } -) - -func (c *TransposeCommand) Run(v *View, e *Edit) error { - /* - Correct behavior of Transpose: - - ...is actually surprisingly complicated. - - Transpose behaves differently depending on whether any non-empty - region is selected. - - If there are no non-empty regions, it will swap the characters on - either side of the cursor(s), then move all cursors forward one - character. - - If one region is selected, do nothing. - - If a region is selected and there is another cursor position, - expand the cursor to a word and swap them. - - If two regions are selected, swap them. - - If more than two regions are selected, rotate them forward. - - See transpose_test.go for examples. - */ - - rsnew := RegionSet{} - rs := v.Sel().Regions() - - if v.Sel().HasNonEmpty() { - // Build a list of transpose regions based on the current selected regions - trs := RegionSet{} - for _, r := range rs { - if r.Empty() { - trs.Add(v.Buffer().Word(r.A)) - } else { - trs.Add(r) - } - } - if trs.Len() < 2 { - return nil - } - - srcr := trs.Regions()[trs.Len()-1] - stxt := v.Buffer().Substr(srcr) - slen := srcr.Size() - for i := 0; i < trs.Len(); i++ { - r := trs.Regions()[i] - dtxt := v.Buffer().Substr(r) - dlen := r.Size() - v.Replace(e, r, stxt) - trs.Adjust(r.Begin()+1, slen-dlen) - rsnew.Add(Region{r.Begin(), r.Begin() + slen}) - stxt, slen = dtxt, dlen - } - - } else { - for i, r := range rs { - if i > 0 && r.A-1 == v.Sel().Regions()[i-1].A { - continue - } - rsnew.Add(Region{r.A + 1, r.B + 1}) - if r.A == 0 || r.A >= v.Buffer().Size() { - continue - } - r1 := Region{r.A - 1, r.A} - r2 := Region{r.A, r.A + 1} - s1 := v.Buffer().Substr(r1) - s2 := v.Buffer().Substr(r2) - v.Replace(e, r1, s2) - v.Replace(e, r2, s1) - } - } - - // Rebuild the active selections - v.Sel().Clear() - for _, r := range rsnew.Regions() { - v.Sel().Add(Region{r.A, r.B}) - } - - return nil -} - -func init() { - register([]Command{ - &TransposeCommand{}, - }) -} diff --git a/backend/commands/transpose_test.go b/backend/commands/transpose_test.go deleted file mode 100644 index 83af6ec..0000000 --- a/backend/commands/transpose_test.go +++ /dev/null @@ -1,132 +0,0 @@ -// Copyright 2014 The lime Authors. -// Use of this source code is governed by a 2-clause -// BSD-style license that can be found in the LICENSE file. - -package commands - -import ( - . "github.com/limetext/lime/backend" - . "github.com/limetext/text" - "testing" -) - -func TestTranspose(t *testing.T) { - ed := GetEditor() - - w := ed.NewWindow() - defer w.Close() - - v := w.NewFile() - defer func() { - v.SetScratch(true) - v.Close() - }() - - type Test struct { - start string - regions []Region - expect string - newregions []Region - } - - // Test results produced using ST3, and commands like: - // >>> rs.add_all([sublime.Region(0,0),sublime.Region(4,7),sublime.Region(9,9),sublime.Region(15,16)]) - // >>> v.run_command("transpose") - // >>> print([a for a in v.sel()]) - tests := []Test{ - { - // Simple test with just one cursor position - "one", - []Region{{1, 1}}, - "noe", - []Region{{2, 2}}, - }, - { - // Test with several cursors, including one at the beginning of - // the buffer, which doesn't transpose, and one beyond the end. - "one two three four", - []Region{{0, 0}, {2, 2}, {5, 5}, {20, 20}}, - "oen wto three four", - []Region{{1, 1}, {3, 3}, {6, 6}, {21, 21}}, - }, - { - // Similar test, but with two adjacent cursors. The second one gets - // dropped, and doesn't transpose. - "one two three four", - []Region{{0, 0}, {1, 1}, {5, 5}}, - "one wto three four", - []Region{{1, 1}, {6, 6}}, - }, - { - // Test with a single region. This should do nothing. - "one two three four", - []Region{{6, 10}}, - "one two three four", - []Region{{6, 10}}, - }, - { - // Test with two regions of different sizes - "one two three four", - []Region{{4, 7}, {8, 13}}, - "one three two four", - []Region{{4, 9}, {10, 13}}, - }, - { - // Test with four regions - "one two three four", - []Region{{0, 3}, {4, 7}, {8, 13}, {14, 18}}, - "four one two three", - []Region{{0, 4}, {5, 8}, {9, 12}, {13, 18}}, - }, - { - // Test with one region and three cursors. The newline at the end - // of these lines is a workaround for a bug in the Buffer.Word() - // call, which currently has problems if it finds EOF at the end - // of the word. - "one two three four\n", - []Region{{0, 0}, {4, 7}, {9, 9}, {16, 16}}, - "four one two three\n", - []Region{{0, 4}, {5, 8}, {9, 12}, {13, 18}}, - }, - { - // Test with two regions and two cursors - "one two three four", - []Region{{0, 0}, {4, 7}, {9, 9}, {15, 16}}, - "o one two fthreeur", - []Region{{0, 1}, {2, 5}, {6, 9}, {11, 16}}, - }, - } - - for i, test := range tests { - // Load the starting text into the buffer - e := v.BeginEdit() - v.Erase(e, Region{0, v.Buffer().Size()}) - v.Insert(e, 0, test.start) - v.EndEdit(e) - - // Add the starting selections - v.Sel().Clear() - for _, r := range test.regions { - v.Sel().Add(r) - } - - ed.CommandHandler().RunTextCommand(v, "transpose", nil) - - b := v.Buffer().Substr(Region{0, v.Buffer().Size()}) - if b != test.expect { - t.Errorf("Test %d: Expected %q; got %q", i, test.expect, b) - } - rs := v.Sel() - if rs.Len() == 0 { - t.Errorf("Test %d: No regions after transpose!", i) - } - for ir, r := range v.Sel().Regions() { - if r != test.newregions[ir] { - t.Logf("Expected: %s", test.newregions) - t.Logf("Got : %s", v.Sel().Regions()) - t.Errorf("Test %d: Selected regions wrong after transpose", i) - break - } - } - } -} diff --git a/backend/commands/undoredo.go b/backend/commands/undoredo.go deleted file mode 100644 index ef65c26..0000000 --- a/backend/commands/undoredo.go +++ /dev/null @@ -1,42 +0,0 @@ -// Copyright 2013 The lime Authors. -// Use of this source code is governed by a 2-clause -// BSD-style license that can be found in the LICENSE file. - -package commands - -import ( - . "github.com/limetext/lime/backend" -) - -type ( - UndoCommand struct { - BypassUndoCommand - hard bool - } - RedoCommand struct { - BypassUndoCommand - hard bool - } -) - -func (c *UndoCommand) Run(v *View, e *Edit) error { - v.UndoStack().Undo(c.hard) - return nil -} - -func (c *RedoCommand) Run(v *View, e *Edit) error { - v.UndoStack().Redo(c.hard) - return nil -} - -func init() { - register([]Command{ - &UndoCommand{hard: true}, - &RedoCommand{hard: true}, - }) - - registerByName([]namedCmd{ - {"soft_undo", &UndoCommand{}}, - {"soft_redo", &RedoCommand{}}, - }) -} diff --git a/backend/commands/undoredo_test.go b/backend/commands/undoredo_test.go deleted file mode 100644 index 22f006e..0000000 --- a/backend/commands/undoredo_test.go +++ /dev/null @@ -1,108 +0,0 @@ -// Copyright 2013 The lime Authors. -// Use of this source code is governed by a 2-clause -// BSD-style license that can be found in the LICENSE file. - -package commands - -import ( - . "github.com/limetext/lime/backend" - . "github.com/limetext/text" - "testing" -) - -func TestUndoRedoCommands(t *testing.T) { - ed := GetEditor() - ch := ed.CommandHandler() - w := ed.NewWindow() - defer w.Close() - - v := w.NewFile() - defer func() { - v.SetScratch(true) - v.Close() - }() - - edit := v.BeginEdit() - v.Insert(edit, 0, "abcd") - v.EndEdit(edit) - v.Sel().Clear() - r := []Region{ - {0, 0}, - {1, 1}, - {2, 2}, - {3, 3}, - } - for _, r2 := range r { - v.Sel().Add(r2) - } - - edit = v.BeginEdit() - for _, ins := range "1234" { - for i := 0; i < v.Sel().Len(); i++ { - v.Insert(edit, v.Sel().Get(i).Begin(), string(ins)) - } - } - v.EndEdit(edit) - - if v.Buffer().Substr(Region{0, v.Buffer().Size()}) != "1234a1234b1234c1234d" { - t.Error(v.Buffer().Substr(Region{0, v.Buffer().Size()})) - } - ch.RunTextCommand(v, "undo", nil) - if v.Buffer().Substr(Region{0, v.Buffer().Size()}) != "abcd" { - t.Error("expected 'abcd', but got: ", v.Buffer().Substr(Region{0, v.Buffer().Size()})) - } - ch.RunTextCommand(v, "redo", nil) - if v.Buffer().Substr(Region{0, v.Buffer().Size()}) != "1234a1234b1234c1234d" { - t.Error("expected '1234a1234b1234c1234d', but got: ", v.Buffer().Substr(Region{0, v.Buffer().Size()})) - } - - v.Sel().Clear() - r = []Region{ - {0, 0}, - {5, 5}, - {10, 10}, - {15, 15}, - } - for _, r2 := range r { - v.Sel().Add(r2) - } - - edit = v.BeginEdit() - for _, ins := range []string{"hello ", "world"} { - for i := 0; i < v.Sel().Len(); i++ { - v.Insert(edit, v.Sel().Get(i).Begin(), ins) - } - } - v.EndEdit(edit) - - if v.Buffer().Substr(Region{0, v.Buffer().Size()}) != "hello world1234ahello world1234bhello world1234chello world1234d" { - t.Error(v.Buffer().Substr(Region{0, v.Buffer().Size()})) - } - ch.RunTextCommand(v, "undo", nil) - - if v.Buffer().Substr(Region{0, v.Buffer().Size()}) != "1234a1234b1234c1234d" { - t.Error("expected '1234a1234b1234c1234d', but got: ", v.Buffer().Substr(Region{0, v.Buffer().Size()})) - } - ch.RunTextCommand(v, "undo", nil) - if v.Buffer().Substr(Region{0, v.Buffer().Size()}) != "abcd" { - t.Error("expected 'abcd', but got: ", v.Buffer().Substr(Region{0, v.Buffer().Size()})) - } - ch.RunTextCommand(v, "undo", nil) - if v.Buffer().Substr(Region{0, v.Buffer().Size()}) != "" { - t.Error("expected '', but got: ", v.Buffer().Substr(Region{0, v.Buffer().Size()})) - } - v.UndoStack().Redo(true) - if v.Buffer().Substr(Region{0, v.Buffer().Size()}) != "abcd" { - t.Error("expected 'abcd', but got: ", v.Buffer().Substr(Region{0, v.Buffer().Size()})) - } - - v.UndoStack().Redo(true) - if v.Buffer().Substr(Region{0, v.Buffer().Size()}) != "1234a1234b1234c1234d" { - t.Error("expected '1234a1234b1234c1234d', but got: ", v.Buffer().Substr(Region{0, v.Buffer().Size()})) - } - - v.UndoStack().Redo(true) - if v.Buffer().Substr(Region{0, v.Buffer().Size()}) != "hello world1234ahello world1234bhello world1234chello world1234d" { - t.Error(v.Buffer().Substr(Region{0, v.Buffer().Size()})) - } -} diff --git a/backend/commands/view.go b/backend/commands/view.go deleted file mode 100644 index 83fc3b4..0000000 --- a/backend/commands/view.go +++ /dev/null @@ -1,77 +0,0 @@ -// Copyright 2014 The lime Authors. -// Use of this source code is governed by a 2-clause -// BSD-style license that can be found in the LICENSE file. - -package commands - -import ( - . "github.com/limetext/lime/backend" -) - -type ( - CloseViewCommand struct { - DefaultCommand - } - - NextViewCommand struct { - DefaultCommand - } - - PrevViewCommand struct { - DefaultCommand - } - - SetFileTypeCommand struct { - DefaultCommand - Syntax string - } -) - -func (c *CloseViewCommand) Run(w *Window) error { - w.ActiveView().Close() - return nil -} - -func (c *NextViewCommand) Run(w *Window) error { - for i, v := range w.Views() { - if v == w.ActiveView() { - i++ - if i == len(w.Views()) { - i = 0 - } - w.SetActiveView(w.Views()[i]) - break - } - } - - return nil -} - -func (c *PrevViewCommand) Run(w *Window) error { - for i, v := range w.Views() { - if v == w.ActiveView() { - if i == 0 { - i = len(w.Views()) - } - i-- - w.SetActiveView(w.Views()[i]) - break - } - } - - return nil -} - -func (c *SetFileTypeCommand) Run(v *View, e *Edit) error { - v.SetSyntaxFile(c.Syntax) - return nil -} - -func init() { - register([]Command{ - &CloseViewCommand{}, - &NextViewCommand{}, - &PrevViewCommand{}, - &SetFileTypeCommand{}, - }) -} diff --git a/backend/commands/view_test.go b/backend/commands/view_test.go deleted file mode 100644 index e02dd1d..0000000 --- a/backend/commands/view_test.go +++ /dev/null @@ -1,127 +0,0 @@ -// Copyright 2014 The lime Authors. -// Use of this source code is governed by a 2-clause -// BSD-style license that can be found in the LICENSE file. - -package commands - -import ( - . "github.com/limetext/lime/backend" - "testing" -) - -func TestCloseView(t *testing.T) { - ed := GetEditor() - - w := ed.NewWindow() - defer w.Close() - - l := len(w.Views()) - testPath := "open_file_test.go" - ed.CommandHandler().RunWindowCommand(w, "open_file", Args{"path": testPath}) - ed.CommandHandler().RunWindowCommand(w, "close_view", nil) - - if len(w.Views()) != l { - t.Errorf("Expected %d view, but got %d", l, len(w.Views())) - } - - for _, v := range w.Views() { - v.SetScratch(true) - v.Close() - } -} - -func TestNextView(t *testing.T) { - ed := GetEditor() - w := ed.NewWindow() - defer w.Close() - - v0 := w.NewFile() - defer func() { - v0.SetScratch(true) - v0.Close() - }() - - v1 := w.NewFile() - defer func() { - v1.SetScratch(true) - v1.Close() - }() - - v2 := w.NewFile() - defer func() { - v2.SetScratch(true) - v2.Close() - }() - - v3 := w.NewFile() - defer func() { - v3.SetScratch(true) - v3.Close() - }() - - w.SetActiveView(v1) - - ed.CommandHandler().RunWindowCommand(w, "next_view", nil) - - av := w.ActiveView() - if av != v2 { - t.Error("Expected to get v2, but didn't") - } - - w.SetActiveView(v3) - - ed.CommandHandler().RunWindowCommand(w, "next_view", nil) - - av = w.ActiveView() - if av != v0 { - t.Error("Expected to get v0, but didn't") - } -} - -func TestPrevView(t *testing.T) { - ed := GetEditor() - w := ed.NewWindow() - defer w.Close() - - v0 := w.NewFile() - defer func() { - v0.SetScratch(true) - v0.Close() - }() - - v1 := w.NewFile() - defer func() { - v1.SetScratch(true) - v1.Close() - }() - - v2 := w.NewFile() - defer func() { - v2.SetScratch(true) - v2.Close() - }() - - v3 := w.NewFile() - defer func() { - v3.SetScratch(true) - v3.Close() - }() - - w.SetActiveView(v2) - - ed.CommandHandler().RunWindowCommand(w, "prev_view", nil) - - av := w.ActiveView() - if av != v1 { - t.Error("Expected to get v1, but didn't") - } - - w.SetActiveView(v0) - - ed.CommandHandler().RunWindowCommand(w, "prev_view", nil) - - av = w.ActiveView() - if av != v3 { - t.Error("Expected to get v3, but didn't") - } -} diff --git a/backend/commands/window.go b/backend/commands/window.go deleted file mode 100644 index 134c927..0000000 --- a/backend/commands/window.go +++ /dev/null @@ -1,81 +0,0 @@ -// Copyright 2013 The lime Authors. -// Use of this source code is governed by a 2-clause -// BSD-style license that can be found in the LICENSE file. - -package commands - -import ( - . "github.com/limetext/lime/backend" -) - -type ( - NewWindowCommand struct { - DefaultCommand - } - - CloseAllCommand struct { - DefaultCommand - } - - CloseWindowCommand struct { - DefaultCommand - } - - NewWindowAppCommand struct { - DefaultCommand - } - - CloseWindowAppCommand struct { - DefaultCommand - } -) - -func (c *NewWindowCommand) Run(w *Window) error { - ed := GetEditor() - ed.SetActiveWindow(ed.NewWindow()) - return nil -} - -func (c *CloseAllCommand) Run(w *Window) error { - w.CloseAllViews() - return nil -} - -func (c *CloseWindowCommand) Run(w *Window) error { - ed := GetEditor() - ed.ActiveWindow().Close() - return nil -} - -func (c *NewWindowAppCommand) Run() error { - ed := GetEditor() - ed.SetActiveWindow(ed.NewWindow()) - return nil -} - -func (c *CloseWindowAppCommand) Run() error { - ed := GetEditor() - ed.ActiveWindow().Close() - return nil -} - -func (c *NewWindowAppCommand) IsChecked() bool { - return false -} - -func (c *CloseWindowAppCommand) IsChecked() bool { - return false -} - -func init() { - register([]Command{ - &NewWindowCommand{}, - &CloseAllCommand{}, - &CloseWindowCommand{}, - }) - - registerByName([]namedCmd{ - {"new_window", &NewWindowAppCommand{}}, - {"close_window", &CloseWindowAppCommand{}}, - }) -} diff --git a/backend/commands/window_test.go b/backend/commands/window_test.go deleted file mode 100644 index 77bf58f..0000000 --- a/backend/commands/window_test.go +++ /dev/null @@ -1,69 +0,0 @@ -// Copyright 2013 The lime Authors. -// Use of this source code is governed by a 2-clause -// BSD-style license that can be found in the LICENSE file. - -package commands - -import ( - . "github.com/limetext/lime/backend" - "testing" -) - -func TestNewWindow(t *testing.T) { - ed := GetEditor() - l := len(ed.Windows()) - ed.CommandHandler().RunWindowCommand(ed.ActiveWindow(), "new_window", nil) - - if len(ed.Windows()) != l+1 { - t.Errorf("Expected %d window, but got %d", l+1, len(ed.Windows())) - } -} - -func TestCloseAll(t *testing.T) { - ed := GetEditor() - - w := ed.NewWindow() - defer w.Close() - - ed.CommandHandler().RunWindowCommand(w, "new_file", nil) - ed.CommandHandler().RunWindowCommand(w, "new_file", nil) - ed.CommandHandler().RunWindowCommand(w, "new_file", nil) - - ed.CommandHandler().RunWindowCommand(w, "close_all", nil) - - if len(w.Views()) != 0 { - t.Errorf("Expected no views, but got %d", len(w.Views())) - } -} - -func TestCloseWindow(t *testing.T) { - ed := GetEditor() - w := ed.NewWindow() - l := len(ed.Windows()) - ed.CommandHandler().RunWindowCommand(w, "close_window", nil) - - if len(ed.Windows()) != l-1 { - t.Errorf("Expected %d window, but got %d", l-1, len(ed.Windows())) - } -} - -func TestNewAppWindow(t *testing.T) { - ed := GetEditor() - l := len(ed.Windows()) - ed.CommandHandler().RunApplicationCommand("new_window", nil) - - if len(ed.Windows()) != l+1 { - t.Errorf("Expected %d window, but got %d", l+1, len(ed.Windows())) - } -} - -func TestCloseAppWindow(t *testing.T) { - ed := GetEditor() - _ = ed.NewWindow() - l := len(ed.Windows()) - ed.CommandHandler().RunApplicationCommand("close_window", nil) - - if len(ed.Windows()) != l-1 { - t.Errorf("Expected %d window, but got %d", l-1, len(ed.Windows())) - } -} diff --git a/backend/doc.go b/backend/doc.go deleted file mode 100644 index 52e88fa..0000000 --- a/backend/doc.go +++ /dev/null @@ -1,72 +0,0 @@ -// Copyright 2014 The lime Authors. -// Use of this source code is governed by a 2-clause -// BSD-style license that can be found in the LICENSE file. - -// The backend package defines the very soul of Lime. -// -// Some highlevel concepts follow. -// -// Frontend -// -// Lime is designed with the goal of having a clear frontend -// and backend separation to allow and hopefully simplify -// the creation of multiple frontend versions. -// -// The two most active frontends are at the time of writing this -// one for terminals based on termbox-go and a GUI application -// based on Qt's QML scripting language. -// -// There's also a Proof of Concept html frontend. -// -// Editor -// -// The Editor singleton represents the most fundamental interface -// that frontends use to access the backend. It keeps a list of -// editor windows, handles input, detects file changes as well -// as communicate back to the frontend as needed. -// -// Window -// -// At any time there can be multiple windows of the editor open. -// Each Window can have a different layout, settings and status. -// -// View -// -// The View class defines a "view" into a specific backing buffer. -// Multiple views can share the same backing buffer. For instance -// viewing the same buffer in split view, or viewing the buffer -// with one syntax definition in one view and another syntax -// definition in the other. -// -// It is very closely related to the view defined in -// the Model-view-controller paradigm, and contains settings -// pertaining to exactly how a buffer is shown to the user. -// -// Command -// -// The command interface defines actions to be executed either -// for the whole application, a specific window or a specific -// view. -// -// Key bindings -// -// Key bindings define a sequence of key-presses, a Command and -// the command's arguments to be executed upon that sequence having -// been pressed. -// -// Key bindings can optionally have multiple contexts associated with it -// which allows the exact same key sequence to have different meaning -// depending on context. -// -// See http://godoc.org/github.com/limetext/lime/backend#QueryContextCallback -// for details. -// -// Settings -// -// Many of the components have their own key-value Settings object associated with -// it, but settings are also nested. In other words, if the settings key does not -// exist in the current object's settings, its parent's settings object is queried -// next which in turn will query its parent if its settings object didn't contain the -// key neither. -// -package backend diff --git a/backend/edit.go b/backend/edit.go deleted file mode 100644 index 11b9678..0000000 --- a/backend/edit.go +++ /dev/null @@ -1,58 +0,0 @@ -// Copyright 2013 The lime Authors. -// Use of this source code is governed by a 2-clause -// BSD-style license that can be found in the LICENSE file. - -package backend - -import ( - "fmt" - . "github.com/limetext/text" -) - -type ( - // The Edit object is an internal type passed as an argument - // to a TextCommand. All text operations need to be associated - // with a valid Edit object. - // - // Think of it a bit like an SQL transaction. - Edit struct { - invalid bool - composite CompositeAction - savedSel RegionSet - savedCount int - command string - args Args - v *View - bypassUndo bool - } -) - -func newEdit(v *View) *Edit { - ret := &Edit{ - v: v, - savedCount: v.buffer.ChangeCount(), - } - for _, r := range v.Sel().Regions() { - ret.savedSel.Add(r) - } - return ret -} - -// Returns a string describing this Edit object. Should typically not be manually called. -func (e *Edit) String() string { - return fmt.Sprintf("%s: %v, %v, %v", e.command, e.args, e.bypassUndo, e.composite) -} - -// Applies the action of this Edit object. Should typically not be manually called. -func (e *Edit) Apply() { - e.composite.Apply() -} - -// Reverses the application of this Edit object. Should typically not be manually called. -func (e *Edit) Undo() { - e.composite.Undo() - e.v.Sel().Clear() - for _, r := range e.savedSel.Regions() { - e.v.Sel().Add(r) - } -} diff --git a/backend/editor.go b/backend/editor.go deleted file mode 100644 index 7a1f924..0000000 --- a/backend/editor.go +++ /dev/null @@ -1,432 +0,0 @@ -// Copyright 2013 The lime Authors. -// Use of this source code is governed by a 2-clause -// BSD-style license that can be found in the LICENSE file. - -package backend - -import ( - "fmt" - "github.com/atotto/clipboard" - "github.com/limetext/lime/backend/keys" - "github.com/limetext/lime/backend/log" - "github.com/limetext/lime/backend/packages" - . "github.com/limetext/lime/backend/util" - "github.com/limetext/lime/backend/watch" - . "github.com/limetext/text" - "path" - "runtime" - "runtime/debug" - "sync" -) - -func init() { - runtime.GOMAXPROCS(runtime.NumCPU()) - GetEditor() -} - -type ( - Editor struct { - HasSettings - keys.HasKeyBindings - *watch.Watcher - windows []*Window - activeWindow *Window - logInput bool - cmdHandler commandHandler - console *View - frontend Frontend - keyInput chan (keys.KeyPress) - clipboardSetter func(string) error - clipboardGetter func() (string, error) - clipboard string - defaultSettings *HasSettings - platformSettings *HasSettings - defaultBindings *keys.HasKeyBindings - platformBindings *keys.HasKeyBindings - userBindings *keys.HasKeyBindings - } - - // The Frontend interface defines the API - // for functionality that is frontend specific. - Frontend interface { - // Probe the frontend for the currently - // visible region of the given view. - VisibleRegion(v *View) Region - - // Make the frontend show the specified region of the - // given view. - Show(v *View, r Region) - - // Sets the status message shown in the status bar - StatusMessage(string) - - // Displays an error message to the user - ErrorMessage(string) - - // Displays a message dialog to the user - MessageDialog(string) - - // Displays an ok / cancel dialog to the user. - // "okname" if provided will be used as the text - // instead of "Ok" for the ok button. - // Returns true when ok was pressed, and false when - // cancel was pressed. - OkCancelDialog(msg string, okname string) bool - } - - DummyFrontend struct { - m sync.Mutex - // Default return value for OkCancelDialog - defaultAction bool - } -) - -var ( - LIME_USER_PACKAGES_PATH = path.Join("..", "..", "packages", "User") - LIME_PACKAGES_PATH = path.Join("..", "..", "packages") - LIME_DEFAULTS_PATH = path.Join("..", "..", "packages", "Default") -) - -func (h *DummyFrontend) SetDefaultAction(action bool) { - h.m.Lock() - defer h.m.Unlock() - h.defaultAction = action -} -func (h *DummyFrontend) StatusMessage(msg string) { log.Info(msg) } -func (h *DummyFrontend) ErrorMessage(msg string) { log.Error(msg) } -func (h *DummyFrontend) MessageDialog(msg string) { log.Info(msg) } -func (h *DummyFrontend) OkCancelDialog(msg string, button string) bool { - log.Info(msg) - h.m.Lock() - defer h.m.Unlock() - return h.defaultAction -} -func (h *DummyFrontend) Show(v *View, r Region) {} -func (h *DummyFrontend) VisibleRegion(v *View) Region { return Region{} } - -var ( - ed *Editor - edl sync.Mutex -) - -func GetEditor() *Editor { - edl.Lock() - defer edl.Unlock() - if ed == nil { - ed = &Editor{ - cmdHandler: commandHandler{ - ApplicationCommands: make(appcmd), - TextCommands: make(textcmd), - WindowCommands: make(wndcmd), - verbose: true, - }, - frontend: &DummyFrontend{}, - console: &View{ - buffer: NewBuffer(), - scratch: true, - }, - keyInput: make(chan keys.KeyPress, 32), - } - var err error - if ed.Watcher, err = watch.NewWatcher(); err != nil { - log.Errorf("Couldn't create watcher: %s", err) - } - ed.console.Settings().Set("is_widget", true) - ed.defaultSettings = new(HasSettings) - ed.platformSettings = new(HasSettings) - ed.Settings() // Just to initialize it - ed.defaultBindings = new(keys.HasKeyBindings) - ed.platformBindings = new(keys.HasKeyBindings) - ed.userBindings = new(keys.HasKeyBindings) - log.AddFilter("console", log.DEBUG, log.NewLogWriter(ed.handleLog)) - go ed.inputthread() - go ed.Observe() - } - return ed -} - -func (e *Editor) Frontend() Frontend { - return e.frontend -} - -func (e *Editor) SetFrontend(f Frontend) { - e.frontend = f -} - -func setClipboard(n string) error { - return clipboard.WriteAll(n) -} - -func getClipboard() (string, error) { - return clipboard.ReadAll() -} - -func (e *Editor) Init() { - log.Info("Initializing") - e.SetClipboardFuncs(setClipboard, getClipboard) - e.loadKeyBindings() - e.loadSettings() - OnInit.call() -} - -func (e *Editor) SetClipboardFuncs(setter func(string) error, getter func() (string, error)) { - e.clipboardSetter = setter - e.clipboardGetter = getter -} - -func (e *Editor) load(pkg *packages.Packet) { - if err := pkg.Load(); err != nil { - log.Errorf("Failed to load packet %s: %s", pkg.Name(), err) - } else { - log.Info("Loaded %s", pkg.Name()) - if err := e.Watch(pkg.Name(), pkg); err != nil { - log.Warn("Couldn't watch %s: %s", pkg.Name(), err) - } - } -} - -func (e *Editor) loadKeyBindings() { - e.KeyBindings().SetParent(e.userBindings) - e.userBindings.KeyBindings().SetParent(e.platformBindings) - e.platformBindings.KeyBindings().SetParent(e.defaultBindings) - - p := path.Join(LIME_DEFAULTS_PATH, "Default.sublime-keymap") - defPckt := packages.NewPacket(p, e.defaultBindings.KeyBindings()) - e.load(defPckt) - - p = path.Join(LIME_DEFAULTS_PATH, "Default ("+e.Plat()+").sublime-keymap") - platPckt := packages.NewPacket(p, e.platformBindings.KeyBindings()) - e.load(platPckt) - - p = path.Join(LIME_USER_PACKAGES_PATH, "Default.sublime-keymap") - usrPckt := packages.NewPacket(p, e.userBindings.KeyBindings()) - e.load(usrPckt) - - p = path.Join(LIME_USER_PACKAGES_PATH, "Default ("+e.Plat()+").sublime-keymap") - usrPlatPckt := packages.NewPacket(p, e.KeyBindings()) - e.load(usrPlatPckt) -} - -func (e *Editor) loadSettings() { - e.platformSettings.Settings().SetParent(e.defaultSettings) - e.Settings().SetParent(e.platformSettings) - - p := path.Join(LIME_DEFAULTS_PATH, "Preferences.sublime-settings") - defPckt := packages.NewPacket(p, e.defaultSettings.Settings()) - e.load(defPckt) - - p = path.Join(LIME_DEFAULTS_PATH, "Preferences ("+e.Plat()+").sublime-settings") - platPckt := packages.NewPacket(p, e.platformSettings.Settings()) - e.load(platPckt) - - p = path.Join(LIME_USER_PACKAGES_PATH, "Preferences.sublime-settings") - usrPckt := packages.NewPacket(p, e.Settings()) - e.load(usrPckt) -} - -func (e *Editor) PackagesPath() string { - return LIME_PACKAGES_PATH -} - -func (e *Editor) Console() *View { - return e.console -} - -func (e *Editor) Windows() []*Window { - edl.Lock() - defer edl.Unlock() - ret := make([]*Window, len(e.windows)) - copy(ret, e.windows) - return ret -} - -func (e *Editor) SetActiveWindow(w *Window) { - e.activeWindow = w -} - -func (e *Editor) ActiveWindow() *Window { - return e.activeWindow -} - -func (e *Editor) NewWindow() *Window { - edl.Lock() - e.windows = append(e.windows, &Window{}) - w := e.windows[len(e.windows)-1] - edl.Unlock() - w.Settings().SetParent(e) - e.SetActiveWindow(w) - OnNewWindow.Call(w) - return w -} - -func (e *Editor) remove(w *Window) { - edl.Lock() - defer edl.Unlock() - for i, ww := range e.windows { - if w == ww { - end := len(e.windows) - 1 - if i != end { - copy(e.windows[i:], e.windows[i+1:]) - } - e.windows = e.windows[:end] - return - } - } - log.Errorf("Wanted to remove window %+v, but it doesn't appear to be a child of this editor", w) -} - -func (e *Editor) Arch() string { - return runtime.GOARCH -} - -func (e *Editor) Platform() string { - return runtime.GOOS -} - -func (e *Editor) Plat() string { - switch e.Platform() { - case "windows": - return "Windows" - case "darwin": - return "OSX" - } - return "Linux" -} - -func (e *Editor) Version() string { - return "0" -} - -func (e *Editor) CommandHandler() CommandHandler { - return &e.cmdHandler -} - -func (e *Editor) HandleInput(kp keys.KeyPress) { - e.keyInput <- kp -} - -func (e *Editor) inputthread() { - pc := 0 - var lastBindings keys.KeyBindings - doinput := func(kp keys.KeyPress) { - defer func() { - if r := recover(); r != nil { - log.Errorf("Panic in inputthread: %v\n%s", r, string(debug.Stack())) - if pc > 0 { - panic(r) - } - pc++ - } - }() - p := Prof.Enter("hi") - defer p.Exit() - - lvl := log.FINE - if e.logInput { - lvl++ - } - log.Logf(lvl, "Key: %v", kp) - if lastBindings.SeqIndex() == 0 { - lastBindings = *e.KeyBindings() - } - try_again: - possible_actions := lastBindings.Filter(kp) - lastBindings = possible_actions - - // TODO? - var ( - wnd *Window - v *View - ) - if wnd = e.ActiveWindow(); wnd != nil { - v = wnd.ActiveView() - } - - qc := func(key string, operator Op, operand interface{}, match_all bool) bool { - return OnQueryContext.Call(v, key, operator, operand, match_all) == True - } - - if action := possible_actions.Action(qc); action != nil { - p2 := Prof.Enter("hi.perform") - e.RunCommand(action.Command, action.Args) - p2.Exit() - } else if possible_actions.SeqIndex() > 1 { - // TODO: this disables having keyBindings with more than 2 key sequence - lastBindings = *e.KeyBindings() - goto try_again - } else if kp.IsCharacter() { - p2 := Prof.Enter("hi.character") - log.Finest("[editor.inputthread] kp: |%s|, pos: %v", kp.Text, possible_actions) - if err := e.CommandHandler().RunTextCommand(v, "insert", Args{"characters": kp.Text}); err != nil { - log.Debug("Couldn't run textcommand: %s", err) - } - p2.Exit() - } - } - for kp := range e.keyInput { - doinput(kp) - } -} - -func (e *Editor) LogInput(l bool) { - e.logInput = l -} - -func (e *Editor) LogCommands(l bool) { - e.cmdHandler.log = l -} - -func (e *Editor) RunCommand(name string, args Args) { - // TODO? - var ( - wnd *Window - v *View - ) - if wnd = e.ActiveWindow(); wnd != nil { - v = wnd.ActiveView() - } - - // TODO: what's the command precedence? - if c := e.cmdHandler.TextCommands[name]; c != nil { - if err := e.CommandHandler().RunTextCommand(v, name, args); err != nil { - log.Debug("Couldn't run textcommand: %s", err) - } - } else if c := e.cmdHandler.WindowCommands[name]; c != nil { - if err := e.CommandHandler().RunWindowCommand(wnd, name, args); err != nil { - log.Debug("Couldn't run windowcommand: %s", err) - } - } else if c := e.cmdHandler.ApplicationCommands[name]; c != nil { - if err := e.CommandHandler().RunApplicationCommand(name, args); err != nil { - log.Debug("Couldn't run applicationcommand: %s", err) - } - } else { - log.Debug("Couldn't find command to run") - } -} - -func (e *Editor) SetClipboard(n string) { - if err := e.clipboardSetter(n); err != nil { - log.Errorf("Could not set clipboard: %v", err) - } - - // Keep a local copy in case the system clipboard isn't working - e.clipboard = n -} - -func (e *Editor) GetClipboard() string { - if n, err := e.clipboardGetter(); err == nil { - return n - } else { - log.Errorf("Could not get clipboard: %v", err) - } - - return e.clipboard -} - -func (e *Editor) handleLog(s string) { - c := e.Console() - f := fmt.Sprintf("%08d %d %s", c.Buffer().Size(), len(s), s) - edit := c.BeginEdit() - c.Insert(edit, c.Buffer().Size(), f) - c.EndEdit(edit) -} diff --git a/backend/editor_test.go b/backend/editor_test.go deleted file mode 100644 index dfa49dc..0000000 --- a/backend/editor_test.go +++ /dev/null @@ -1,201 +0,0 @@ -// Copyright 2013 The lime Authors. -// Use of this source code is governed by a 2-clause -// BSD-style license that can be found in the LICENSE file. - -package backend - -import ( - "github.com/limetext/lime/backend/keys" - "github.com/limetext/lime/backend/packages" - "path" - "testing" -) - -func init() { - LIME_PACKAGES_PATH = path.Join("..", "packages") - LIME_USER_PACKAGES_PATH = path.Join("..", "packages", "User") - LIME_DEFAULTS_PATH = path.Join("..", "packages", "Default") -} - -func TestGetEditor(t *testing.T) { - editor := GetEditor() - if editor == nil { - t.Error("Expected an editor, but got nil") - } -} - -func TestLoadKeyBinding(t *testing.T) { - editor := GetEditor() - pkg := packages.NewPacket("testdata/Default.sublime-keymap", editor.KeyBindings()) - editor.load(pkg) - - kb := editor.KeyBindings().Filter(keys.KeyPress{Key: 'i'}) - if expectedLen := 3; kb.Len() != expectedLen { - t.Errorf("Expected to have %d keys in the filter, but it had %d", expectedLen, kb.Len()) - } -} - -func TestLoadKeyBindings(t *testing.T) { - editor := GetEditor() - editor.loadKeyBindings() - - if editor.defaultBindings.KeyBindings().Len() <= 0 { - t.Errorf("Expected editor to have some keys bound, but it didn't") - } -} - -func TestLoadSetting(t *testing.T) { - editor := GetEditor() - editor.load(packages.NewPacket("testdata/Default.sublime-settings", editor.Settings())) - - if editor.Settings().Has("tab_size") != true { - t.Error("Expected editor settings to have tab_size, but it didn't") - } - - tab_size := editor.Settings().Get("tab_size").(float64) - if tab_size != 4 { - t.Errorf("Expected tab_size to equal 4, got: %v", tab_size) - } -} - -func TestLoadSettings(t *testing.T) { - editor := GetEditor() - editor.loadSettings() - - if editor.Settings().Has("tab_size") != true { - t.Error("Expected editor settings to have tab_size, but it didn't") - } - - plat := editor.Settings().Parent() - switch editor.Platform() { - case "windows": - if plat.Settings().Get("font_face", "") != "Consolas" { - t.Errorf("Expected windows font_face be Consolas, but is %s", plat.Settings().Get("font_face", "")) - } - case "darwin": - if plat.Settings().Get("font_face", "") != "Menlo" { - t.Errorf("Expected OSX font_face be Menlo, but is %s", plat.Settings().Get("font_face", "")) - } - default: - if plat.Settings().Get("font_face", "") != "Monospace" { - t.Errorf("Expected Linux font_face be Monospace, but is %s", plat.Settings().Get("font_face", "")) - } - } -} - -func TestInit(t *testing.T) { - editor := GetEditor() - editor.Init() - - if editor.defaultBindings.KeyBindings().Len() <= 0 { - t.Errorf("Expected editor to have some keys bound, but it didn't") - } - - if editor.Settings().Parent().Settings().Parent().Settings().Has("tab_size") != true { - t.Error("Expected editor settings to have tab_size, but it didn't") - } -} - -func TestNewWindow(t *testing.T) { - editor := GetEditor() - l := len(editor.Windows()) - - w := editor.NewWindow() - defer w.Close() - - if len(editor.Windows()) != l+1 { - t.Errorf("Expected 1 window, but got %d", len(editor.Windows())) - } -} - -func TestRemoveWindow(t *testing.T) { - editor := GetEditor() - l := len(editor.Windows()) - - w0 := editor.NewWindow() - defer w0.Close() - - editor.remove(w0) - - if len(editor.Windows()) != l { - t.Errorf("Expected the window to be removed, but %d still remain", len(editor.Windows())) - } - - w1 := editor.NewWindow() - defer w1.Close() - - w2 := editor.NewWindow() - defer w2.Close() - - editor.remove(w1) - - if len(editor.Windows()) != l+1 { - t.Errorf("Expected the window to be removed, but %d still remain", len(editor.Windows())) - } -} - -func TestSetActiveWindow(t *testing.T) { - editor := GetEditor() - - w1 := editor.NewWindow() - defer w1.Close() - - w2 := editor.NewWindow() - defer w2.Close() - - if editor.ActiveWindow() != w2 { - t.Error("Expected the newest window to be active, but it wasn't") - } - - editor.SetActiveWindow(w1) - - if editor.ActiveWindow() != w1 { - t.Error("Expected the first window to be active, but it wasn't") - } -} - -func TestSetFrontend(t *testing.T) { - f := DummyFrontend{} - - editor := GetEditor() - editor.SetFrontend(&f) - - if editor.Frontend() != &f { - t.Errorf("Expected a DummyFrontend to be set, but got %T", editor.Frontend()) - } -} - -func TestClipboard(t *testing.T) { - editor := GetEditor() - - // Put back whatever was already there. - clip := editor.GetClipboard() - defer editor.SetClipboard(clip) - - s := "test0" - - editor.SetClipboard(s) - - if editor.GetClipboard() != s { - t.Errorf("Expected %q to be on the clipboard, but got %q", s, editor.GetClipboard()) - } - - s = "test1" - - editor.SetClipboard(s) - - if editor.GetClipboard() != s { - t.Errorf("Expected %q to be on the clipboard, but got %q", s, editor.GetClipboard()) - } -} - -func TestHandleInput(t *testing.T) { - editor := GetEditor() - kp := keys.KeyPress{Key: 'i'} - - editor.HandleInput(kp) - - if ki := <-editor.keyInput; ki != kp { - t.Errorf("Expected %s to be on the input buffer, but got %s", kp, ki) - } -} diff --git a/backend/events.go b/backend/events.go deleted file mode 100644 index 3545f78..0000000 --- a/backend/events.go +++ /dev/null @@ -1,191 +0,0 @@ -// Copyright 2013 The lime Authors. -// Use of this source code is governed by a 2-clause -// BSD-style license that can be found in the LICENSE file. - -package backend - -import ( - "github.com/limetext/lime/backend/log" - "github.com/limetext/lime/backend/util" - "strings" -) - -type ( - // An event callback dealing with View events. - ViewEventCallback func(v *View) - // A ViewEvent is simply a bunch of ViewEventCallbacks. - ViewEvent []ViewEventCallback - - // The return value returned from a QueryContextCallback. - QueryContextReturn int - - // The context is queried when trying to figure out what action should be performed when - // certain conditions are met. - // - // Context is just a string identifier, an optional comparison operator, an optional operand, and an optional - // match_all boolean. The data of the context is optionally provided together with a key binding and the key's - // action will only be considered if the context conditions are met. - // - // Exactly how these values are interpreted is up to the individual context handlers, which may be fully - // customized by implementing the callback in a plugin. - // - // For instance pressing the key 'j' will have a different meaning when in a VI command mode emulation - // and when in a VI insert mode emulation. A plugin would then define two key binding entries for 'j', - // describe the key binding context to be able to discern which action is appropriate when 'j' is then pressed. - QueryContextCallback func(v *View, key string, operator util.Op, operand interface{}, match_all bool) QueryContextReturn - - // A QueryContextEvent is simply a bunch of QueryContextCallbacks. - QueryContextEvent []QueryContextCallback - - // A WindowEventCallback deals with Window events. - WindowEventCallback func(w *Window) - // A WindowEvent is simply a bunch of WindowEventCallbacks. - WindowEvent []WindowEventCallback - - // The InitCallback allows complex (i.e. time consuming) - // initiation code to be deferred until after the UI is up and running. - InitCallback func() - - // The InitEvent is executed once at startup, after the UI is up and running and - // is typically used by feature modules to defer heavy initialization work - // such as scanning for plugins, loading key bindings, macros etc. - InitEvent []InitCallback -) - -const ( - True QueryContextReturn = iota //< Returned when the context query matches. - False //< Returned when the context query does not match. - Unknown //< Returned when the QueryContextCallback does not know how to deal with the given context. -) - -// Add the InitCallback to the InitEvent to be called during initialization. -// This should be called in a module's init() function. -func (ie *InitEvent) Add(i InitCallback) { - *ie = append(*ie, i) -} - -// Execute the InitEvent. -func (ie *InitEvent) call() { - log.Debug("OnInit callbacks executing") - defer log.Debug("OnInit callbacks finished") - for _, ev := range *ie { - ev() - } -} - -// Add the provided ViewEventCallback to this ViewEvent -// TODO(.): Support removing ViewEventCallbacks? -func (ve *ViewEvent) Add(cb ViewEventCallback) { - *ve = append(*ve, cb) -} - -// Trigger this ViewEvent by calling all the registered callbacks in order of registration. -func (ve *ViewEvent) Call(v *View) { - log.Finest("%s(%v)", evNames[ve], v.Id()) - for _, ev := range *ve { - ev(v) - } -} - -// Add the provided QueryContextCallback to the QueryContextEvent. -// TODO(.): Support removing QueryContextCallbacks? -func (qe *QueryContextEvent) Add(cb QueryContextCallback) { - *qe = append(*qe, cb) -} - -// Searches for a QueryContextCallback and returns the result of the first callback being able to deal with this -// context, or Unknown if no such callback was found. -func (qe QueryContextEvent) Call(v *View, key string, operator util.Op, operand interface{}, match_all bool) QueryContextReturn { - log.Fine("Query context: %s, %v, %v, %v", key, operator, operand, match_all) - for i := range qe { - r := qe[i](v, key, operator, operand, match_all) - if r != Unknown { - return r - } - } - log.Fine("Unknown context: %s", key) - return Unknown -} - -// Add the provided WindowEventCallback to this WindowEvent. -// TODO(.): Support removing WindowEventCallbacks? -func (we *WindowEvent) Add(cb WindowEventCallback) { - *we = append(*we, cb) -} - -// Trigger this WindowEvent by calling all the registered callbacks in order of registration. -func (we *WindowEvent) Call(w *Window) { - log.Finest("%s(%v)", wevNames[we], w.Id()) - for _, ev := range *we { - ev(w) - } -} - -var ( - OnNew ViewEvent //< Called when a new view is created - OnLoad ViewEvent //< Called when loading a view's buffer has finished - OnActivated ViewEvent //< Called when a view gains input focus. - OnDeactivated ViewEvent //< Called when a view loses input focus. - OnPreClose ViewEvent //< Called when a view is about to be closed. - OnClose ViewEvent //< Called when a view has been closed. - OnPreSave ViewEvent //< Called just before a view's buffer is saved. - OnPostSave ViewEvent //< Called after a view's buffer has been saved. - OnModified ViewEvent //< Called when the contents of a view's underlying buffer has changed. - OnSelectionModified ViewEvent //< Called when a view's Selection/cursor has changed. - - OnNewWindow WindowEvent //< Called when a new window has been created. - OnQueryContext QueryContextEvent //< Called when context is being queried. - OnInit InitEvent //< Called once at program startup -) - -var ( - evNames = map[*ViewEvent]string{ - &OnNew: "OnNew", - &OnLoad: "OnLoad", - &OnActivated: "OnActivated", - &OnDeactivated: "OnDeactivated", - &OnPreClose: "OnPreClose", - &OnClose: "OnClose", - &OnPreSave: "OnPreSave", - &OnPostSave: "OnPostSave", - &OnModified: "OnModified", - &OnSelectionModified: "OnSelectionModified", - } - wevNames = map[*WindowEvent]string{ - &OnNewWindow: "OnNewWindow", - } -) - -func init() { - // Register functionality dealing with a couple of built in contexts - OnQueryContext.Add(func(v *View, key string, operator util.Op, operand interface{}, match_all bool) QueryContextReturn { - if strings.HasPrefix(key, "setting.") && operator == util.OpEqual { - c, ok := v.Settings().Get(key[8:]).(bool) - if c && ok { - return True - } - return False - } else if key == "num_selections" { - opf, _ := operand.(float64) - op := int(opf) - - switch operator { - case util.OpEqual: - if op == v.Sel().Len() { - return True - } - return False - case util.OpNotEqual: - if op != v.Sel().Len() { - return True - } - return False - } - } - return Unknown - }) - - OnLoad.Add(func(v *View) { - GetEditor().Watch(v.Buffer().FileName(), v) - }) -} diff --git a/backend/events_test.go b/backend/events_test.go deleted file mode 100644 index be91974..0000000 --- a/backend/events_test.go +++ /dev/null @@ -1,145 +0,0 @@ -// Copyright 2013 The lime Authors. -// Use of this source code is governed by a 2-clause -// BSD-style license that can be found in the LICENSE file. - -package backend - -import ( - . "github.com/limetext/text" - "os" - "reflect" - "testing" -) - -func TestOnSelectionModified(t *testing.T) { - var res *RegionSet - - callCount := 0 - - w := GetEditor().NewWindow() - defer w.Close() - - v := w.NewFile() - defer func() { - v.SetScratch(true) - v.Close() - }() - - OnSelectionModified.Add(func(v *View) { - res = v.Sel() - callCount++ - }) - - edit := v.BeginEdit() - v.Insert(edit, 0, "abcd") - v.EndEdit(edit) - if callCount != 1 { - t.Fatalf("%d != 1", callCount) - } - if !reflect.DeepEqual(res.Regions(), []Region{{4, 4}}) { - t.Errorf("%v", res.Regions()) - } - - edit = v.BeginEdit() - v.Sel().Adjust(4, -1) - v.EndEdit(edit) - - if callCount != 2 { - t.Fatalf("%d != 2", callCount) - } - if !reflect.DeepEqual(res.Regions(), []Region{{3, 3}}) { - t.Errorf("%v", res.Regions()) - } - - edit = v.BeginEdit() - v.EndEdit(edit) - - if callCount != 2 { - t.Fatalf("%d != 2", callCount) - } - if !reflect.DeepEqual(res.Regions(), []Region{{3, 3}}) { - t.Errorf("%v", res.Regions()) - } -} - -func TestOnPreSave(t *testing.T) { - testfile := "testdata/test_event.txt" - callCount := 0 - - w := GetEditor().NewWindow() - defer w.Close() - - v := w.NewFile() - defer v.Close() - - OnPreSave.Add(func(v *View) { - callCount++ - }) - edit := v.BeginEdit() - v.Insert(edit, 0, "abcd") - v.EndEdit(edit) - if err := v.SaveAs(testfile); err != nil { - t.Fatal("Could not save the view") - } - if callCount != 1 { - t.Fatalf("%d != 1", callCount) - } - v.Buffer().SetFileName(testfile) - if err := v.Save(); err != nil { - t.Fatalf("Could not save the view %s", err) - } - if callCount != 2 { - t.Fatalf("%d != 2", callCount) - } - if err := os.Remove(testfile); err != nil { - t.Errorf("Couldn't remove test file %s", testfile) - } -} - -func TestOnPostSave(t *testing.T) { - testfile := "testdata/test_event.txt" - callCount := 0 - - w := GetEditor().NewWindow() - defer w.Close() - - v := w.NewFile() - defer v.Close() - - OnPostSave.Add(func(v *View) { - callCount++ - }) - edit := v.BeginEdit() - v.Insert(edit, 0, "abcd") - v.EndEdit(edit) - if err := v.SaveAs(testfile); err != nil { - t.Fatal("Could not save the view") - } - if callCount != 1 { - t.Fatalf("%d != 1", callCount) - } - if err := v.Save(); err != nil { - t.Fatalf("Could not save the view: %s", err) - } - if callCount != 2 { - t.Fatalf("%d != 2", callCount) - } - if err := os.Remove(testfile); err != nil { - t.Errorf("Couldn't remove test file %s", testfile) - } -} - -func TestOnNewWindow(t *testing.T) { - callCount := 0 - - OnNewWindow.Add(func(w *Window) { - callCount++ - }) - - w := GetEditor().NewWindow() - defer w.Close() - - if callCount != 1 { - t.Fatalf("%d != 1", callCount) - } -} diff --git a/backend/keys/key.go b/backend/keys/key.go deleted file mode 100644 index 605f825..0000000 --- a/backend/keys/key.go +++ /dev/null @@ -1,140 +0,0 @@ -// Copyright 2013 The lime Authors. -// Use of this source code is governed by a 2-clause -// BSD-style license that can be found in the LICENSE file. - -package keys - -import ( - "unicode" -) - -type ( - Key rune -) - -const ( - Left Key = 0x2190 + iota - Up - Right - Down - - Enter = '\n' - Escape = 0x001B - Backspace = 0x0008 - Delete = 0x007F - KeypadEnter = '\n' -) - -const ( - // map to dingbats... - F1 Key = 0x2701 + iota - F2 - F3 - F4 - F5 - F6 - F7 - F8 - F9 - F10 - F11 - F12 - Insert - PageUp - PageDown - Home - End - Break - Any Key = unicode.MaxRune -) - -const ( - shift = (1 << (29 - iota)) - ctrl - alt - super -) - -var keylut = map[string]Key{ - "up": Up, - "left": Left, - "right": Right, - "down": Down, - "enter": Enter, - "tab": '\t', - "escape": Escape, - "space": ' ', - "f1": F1, - "f2": F2, - "f3": F3, - "f4": F4, - "f5": F5, - "f6": F6, - "f7": F7, - "f8": F8, - "f9": F9, - "f10": F10, - "f11": F11, - "f12": F12, - "backspace": Backspace, - "delete": Delete, - "keypad_enter": KeypadEnter, - "insert": Insert, - "pageup": PageUp, - "pagedown": PageDown, - "home": Home, - "end": End, - "break": Break, - "forward_slash": '/', - "backquote": '`', - "\\\"": '"', - "plus": '+', - "minus": '-', - "equals": '=', - "": Any, -} - -var rkeylut = map[Key]string{ - Up: "up", - Left: "left", - Right: "right", - Down: "down", - Enter: "enter", - '\t': "tab", - Escape: "escape", - ' ': "space", - F1: "f1", - F2: "f2", - F3: "f3", - F4: "f4", - F5: "f5", - F6: "f6", - F7: "f7", - F8: "f8", - F9: "f9", - F10: "f10", - F11: "f11", - F12: "f12", - Backspace: "backspace", - Delete: "delete", - Insert: "insert", - PageUp: "pageup", - PageDown: "pagedown", - Home: "home", - End: "end", - Break: "break", - '/': "forward_slash", - '`': "backquote", - '"': "\\\"", - '+': "plus", - '-': "minus", - '=': "equals", - Any: "", -} - -func (k Key) String() string { - if v, ok := rkeylut[k]; ok { - return v - } - return string(k) -} diff --git a/backend/keys/key_test.go b/backend/keys/key_test.go deleted file mode 100644 index 0c21f95..0000000 --- a/backend/keys/key_test.go +++ /dev/null @@ -1,21 +0,0 @@ -// Copyright 2014 The lime Authors. -// Use of this source code is governed by a 2-clause -// BSD-style license that can be found in the LICENSE file. - -package keys - -import ( - "testing" -) - -func TestKeyString(t *testing.T) { - k := Key('i') - if k.String() != "i" { - t.Errorf("Expected %q but got %q", "i", k.String()) - } - - k = Key(Home) - if k.String() != "home" { - t.Errorf("Expected %q but got %q", "home", k.String()) - } -} diff --git a/backend/keys/keybinding.go b/backend/keys/keybinding.go deleted file mode 100644 index 13b3ea4..0000000 --- a/backend/keys/keybinding.go +++ /dev/null @@ -1,187 +0,0 @@ -// Copyright 2013 The lime Authors. -// Use of this source code is governed by a 2-clause -// BSD-style license that can be found in the LICENSE file. - -package keys - -import ( - "bytes" - "encoding/json" - "fmt" - . "github.com/limetext/lime/backend/util" - "sort" -) - -type ( - // A single KeyBinding for which after pressing the given - // sequence of Keys, and the Context matches, - // the Command will be invoked with the provided Args. - KeyBinding struct { - Keys []KeyPress - Command string - Args map[string]interface{} - Context []KeyContext - priority int - } - - // An utility struct that(same as HasSettings ) is typically embedded in - // other type structs to make that type implement the KeyBindingsInterface - HasKeyBindings struct { - keybindings KeyBindings - } - - // Defines an interface for types that have keybindings - KeyBindingsInterface interface { - KeyBindings() *KeyBindings - } - - KeyBindings struct { - Bindings []*KeyBinding - seqIndex int // The index we are in a multiple key sequence keybinding - parent KeyBindingsInterface - } -) - -func (k *HasKeyBindings) KeyBindings() *KeyBindings { - return &k.keybindings -} - -// Returns the number of KeyBindings. -func (k *KeyBindings) Len() int { - return len(k.Bindings) -} - -// Compares one KeyBinding to another for sorting purposes. -func (k *KeyBindings) Less(i, j int) bool { - return k.Bindings[i].Keys[k.seqIndex].Index() < k.Bindings[j].Keys[k.seqIndex].Index() -} - -// Swaps the two KeyBindings at the given positions. -func (k *KeyBindings) Swap(i, j int) { - k.Bindings[i], k.Bindings[j] = k.Bindings[j], k.Bindings[i] -} - -// Drops all KeyBindings that are a sequence of key presses less or equal -// to the given number. -func (k *KeyBindings) DropLessEqualKeys(count int) { - for { - for i := 0; i < len(k.Bindings); { - if len(k.Bindings[i].Keys) <= count { - k.Bindings[i] = k.Bindings[len(k.Bindings)-1] - k.Bindings = k.Bindings[:len(k.Bindings)-1] - } else { - i++ - } - } - sort.Sort(k) - if k.parent == nil { - break - } - k = k.parent.KeyBindings() - } -} - -func (k *KeyBindings) UnmarshalJSON(d []byte) error { - if err := json.Unmarshal(d, &k.Bindings); err != nil { - return err - } - for i := range k.Bindings { - k.Bindings[i].priority = i - } - k.DropLessEqualKeys(0) - return nil -} - -func (k *KeyBindings) SetParent(p KeyBindingsInterface) { - k.parent = p - // All parents and childs seqIndex must be equal - p.KeyBindings().seqIndex = k.seqIndex -} - -func (k *KeyBindings) Parent() KeyBindingsInterface { - return k.parent -} - -func (k *KeyBindings) filter(ki int, ret *KeyBindings) { - for { - idx := sort.Search(k.Len(), func(i int) bool { - return k.Bindings[i].Keys[k.seqIndex].Index() >= ki - }) - for i := idx; i < len(k.Bindings) && k.Bindings[i].Keys[k.seqIndex].Index() == ki; i++ { - ret.Bindings = append(ret.Bindings, k.Bindings[i]) - } - if k.parent == nil { - break - } - k = k.parent.KeyBindings() - if ret.parent == nil { - ret.SetParent(new(HasKeyBindings)) - } - ret = ret.parent.KeyBindings() - } -} - -// Filters the KeyBindings, returning a new KeyBindings object containing -// a subset of matches for the given key press. -func (k *KeyBindings) Filter(kp KeyPress) (ret KeyBindings) { - p := Prof.Enter("key.filter") - defer p.Exit() - - kp.fix() - k.DropLessEqualKeys(k.seqIndex) - ret.seqIndex = k.seqIndex + 1 - ki := kp.Index() - - k.filter(ki, &ret) - - if kp.IsCharacter() { - k.filter(int(Any), &ret) - } - return -} - -// Tries to resolve all the current KeyBindings in k to a single -// action. If any action is appropriate as determined by context, -// the return value will be the specific KeyBinding that is possible -// to execute now, otherwise it is nil. -func (k *KeyBindings) Action(qc func(key string, operator Op, operand interface{}, match_all bool) bool) (kb *KeyBinding) { - p := Prof.Enter("key.action") - defer p.Exit() - - for { - for i := range k.Bindings { - if len(k.Bindings[i].Keys) > k.seqIndex { - // This key binding is of a key sequence longer than what is currently - // probed for. For example, the binding is for the sequence ['a','b','c'], but - // the user has only pressed ['a','b'] so far. - continue - } - for _, c := range k.Bindings[i].Context { - if !qc(c.Key, c.Operator, c.Operand, c.MatchAll) { - goto skip - } - } - if kb == nil || kb.priority < k.Bindings[i].priority { - kb = k.Bindings[i] - } - skip: - } - if kb != nil || k.parent == nil { - break - } - k = k.parent.KeyBindings() - } - return -} - -func (k *KeyBindings) SeqIndex() int { - return k.seqIndex -} - -func (k KeyBindings) String() string { - var buf bytes.Buffer - for _, b := range k.Bindings { - buf.WriteString(fmt.Sprintf("%+v\n", b)) - } - return buf.String() -} diff --git a/backend/keys/keybinding_test.go b/backend/keys/keybinding_test.go deleted file mode 100644 index 6a3b645..0000000 --- a/backend/keys/keybinding_test.go +++ /dev/null @@ -1,245 +0,0 @@ -// Copyright 2014 The lime Authors. -// Use of this source code is governed by a 2-clause -// BSD-style license that can be found in the LICENSE file. - -package keys - -import ( - "io/ioutil" - "testing" - - "github.com/limetext/lime/backend/loaders" - "github.com/limetext/lime/backend/util" -) - -func TestLoadKeyBindingsFromJSON(t *testing.T) { - tests := []string{ - "testdata/Default.sublime-keymap", - } - for i, fn := range tests { - if d, err := ioutil.ReadFile(fn); err != nil { - t.Errorf("Test %d: Couldn't load file %s: %s", i, fn, err) - } else { - var bindings KeyBindings - if err := loaders.LoadJSON(d, &bindings); err != nil { - t.Errorf("Test %d: Error on LoadJSON: %s", i, err) - } - } - } -} - -func TestUnmarshalError(t *testing.T) { - var bindings KeyBindings - if err := bindings.UnmarshalJSON([]byte(``)); err == nil { - t.Errorf("Expected error on loading empty string") - } -} - -func TestDropLessEqualKeys(t *testing.T) { - fn := "testdata/Default.sublime-keymap" - d, err := ioutil.ReadFile(fn) - if err != nil { - t.Fatalf("Couldn't read %s: %s", fn, err) - } - - var bd KeyBindings - if err = loaders.LoadJSON(d, &bd); err != nil { - t.Fatalf("Error loading json: %s", err) - } - bd.DropLessEqualKeys(1) - if cmd := bd.Bindings[0].Command; cmd != "test2" { - t.Errorf("Expected Command %s, but got %s", "test2", cmd) - } -} - -func TestSetParent(t *testing.T) { - fn := "testdata/Default.sublime-keymap" - fnp := "testdata/test.sublime-keymap" - var ( - bd KeyBindings - p HasKeyBindings - ) - - d, err := ioutil.ReadFile(fn) - if err != nil { - t.Fatalf("Couldn't read %s: %s", fn, err) - } - if err = loaders.LoadJSON(d, &bd); err != nil { - t.Fatalf("Error loading json: %s", err) - } - d, err = ioutil.ReadFile(fnp) - if err != nil { - t.Fatalf("Couldn't read %s: %s", fn, err) - } - if err = loaders.LoadJSON(d, p.KeyBindings()); err != nil { - t.Fatalf("Error loading json: %s", err) - } - - p.KeyBindings().seqIndex = 10 - bd.SetParent(&p) - if bd.seqIndex != p.KeyBindings().seqIndex { - t.Fatalf("Expected parent and child seqIndex be equal %d != %d", p.KeyBindings().seqIndex, bd.seqIndex) - } - - ret := bd.Filter(KeyPress{Key: 'd', Ctrl: true}) - if ret.Len() != 1 { - t.Fatalf("Expected ret keyBindings len %d, but got %d", 1, ret.Len()) - } - if ret.parent.KeyBindings().Len() != 1 { - t.Fatalf("Expected ret parent keyBindings len %d, but got %d", 1, ret.parent.KeyBindings().Len()) - } - if cmd := ret.Bindings[0].Command; cmd != "test4" { - t.Errorf("Expected Command %s, but got %s", "test4", cmd) - } - if cmd := ret.parent.KeyBindings().Bindings[0].Command; cmd != "t1" { - t.Errorf("Expected Command %s, but got %s", "t1", cmd) - } -} - -func TestParent(t *testing.T) { - fn := "testdata/Default.sublime-keymap" - fnp := "testdata/test.sublime-keymap" - var ( - bd KeyBindings - p HasKeyBindings - ) - - d, err := ioutil.ReadFile(fn) - if err != nil { - t.Fatalf("Couldn't read %s: %s", fn, err) - } - if err = loaders.LoadJSON(d, &bd); err != nil { - t.Fatalf("Error loading json: %s", err) - } - - d, err = ioutil.ReadFile(fnp) - if err != nil { - t.Fatalf("Couldn't read %s: %s", fn, err) - } - if err = loaders.LoadJSON(d, p.KeyBindings()); err != nil { - t.Fatalf("Error loading json: %s", err) - } - - bd.SetParent(&p) - - if cmd := bd.Parent().KeyBindings().Bindings[0].Command; cmd != "t2" { - t.Errorf("Expected Command %s, but got %s", "t2", cmd) - } -} - -func TestKeyBindingsFilter(t *testing.T) { - tests := []struct { - kp KeyPress - count int - }{ - { - KeyPress{Key: 'i', Ctrl: true}, - 2, - }, - { - KeyPress{Key: 'i'}, - 1, - }, - } - - if d, err := ioutil.ReadFile("testdata/Default.sublime-keymap"); err != nil { - t.Fatal(err) - } else { - var bindings KeyBindings - loaders.LoadJSON(d, &bindings) - - for i, test := range tests { - if b := bindings.Filter(test.kp); b.Len() != test.count { - t.Errorf("Test %d: Expected %d bindings, but got %d", i, test.count, b.Len()) - } - } - } -} - -func TestKeyBindingsAction(t *testing.T) { - tests := []struct { - kp KeyPress - retNil bool - ck string - }{ - { - KeyPress{Key: 'i'}, - false, - "test3", - }, - { - KeyPress{Key: 'p'}, - false, - "t2", - }, - { - KeyPress{Key: 'i', Ctrl: true}, - true, - "", - }, - { - KeyPress{Key: 'c'}, - false, - "t5", - }, - } - - if d, err := ioutil.ReadFile("testdata/Default.sublime-keymap"); err != nil { - t.Fatal(err) - } else { - var ( - bindings KeyBindings - p HasKeyBindings - ) - loaders.LoadJSON(d, &bindings) - - if d, err = ioutil.ReadFile("testdata/test.sublime-keymap"); err != nil { - t.Fatal(err) - } - loaders.LoadJSON(d, p.KeyBindings()) - bindings.SetParent(&p) - - for i, test := range tests { - qc := func(key string, operator util.Op, operand interface{}, match_all bool) bool { - return key == test.ck - } - b := bindings.Filter(test.kp) - if a := b.Action(qc); test.retNil { - if a != nil { - t.Errorf("Test %d: Expected action to be nil but got %v", i, a) - } - } else if a.Context[0].Key != test.ck { - t.Errorf("Test %d: Expected %s, but got %s", i, test.ck, a.Context[0].Key) - } - } - } -} - -func TestSeqIndex(t *testing.T) { - var bd KeyBindings - bd.seqIndex = 3 - if bd.SeqIndex() != 3 { - t.Errorf("Expected SeqIndex %d, but got %d", 3, bd.SeqIndex()) - } -} - -func TestKeyBindingsString(t *testing.T) { - fn := "testdata/test.sublime-keymap" - var bd KeyBindings - - d, err := ioutil.ReadFile(fn) - if err != nil { - t.Fatalf("Couldn't read %s: %s", fn, err) - } - if err = loaders.LoadJSON(d, &bd); err != nil { - t.Fatalf("Error loading json: %s", err) - } - - expected := - `&{Keys:[p] Command:t2 Args:map[] Context:[{rawKeyContext:{Key:t2 Operator:0 Operand:true MatchAll:false}}] priority:1} -&{Keys:[ctrl+d ctrl+k] Command:t1 Args:map[] Context:[{rawKeyContext:{Key:t1 Operator:0 Operand:true MatchAll:false}}] priority:0} -` - if bd.String() != expected { - t.Errorf("Expected String %s, but got %s", expected, bd.String()) - } -} diff --git a/backend/keys/keycontext.go b/backend/keys/keycontext.go deleted file mode 100644 index 2422ca2..0000000 --- a/backend/keys/keycontext.go +++ /dev/null @@ -1,44 +0,0 @@ -// Copyright 2013 The lime Authors. -// Use of this source code is governed by a 2-clause -// BSD-style license that can be found in the LICENSE file. - -package keys - -import ( - "encoding/json" - "github.com/limetext/lime/backend/util" -) - -type ( - // A Context definition for which a key binding - // is to be considered. - KeyContext struct { - rawKeyContext - } - - // TODO(.): HACK. This is because I want to use the default UnmarshalJSON - // behaviour on most of the struct member, but then also do some custom - // handling too. - // - // So the publicly exported KeyContext implements a custom UnmarshalJSON, - // which then invokes the default UnMarshalJSON handling on the embedded - // rawKeyContext, and then does it's own custom code after that. - // - // Is there a better way to do this? - rawKeyContext struct { - Key string //< The context's name. - Operator util.Op //< The operation to perform. - Operand interface{} //< The operand on which this operation should be performed. - MatchAll bool `json:"match_all"` //< Whether all selections should match the context or if it's enough for just one to match. - } -) - -func (k *KeyContext) UnmarshalJSON(d []byte) error { - if err := json.Unmarshal(d, &k.rawKeyContext); err != nil { - return err - } - if k.Operand == nil { - k.Operand = true - } - return nil -} diff --git a/backend/keys/keycontext_test.go b/backend/keys/keycontext_test.go deleted file mode 100644 index a050495..0000000 --- a/backend/keys/keycontext_test.go +++ /dev/null @@ -1,14 +0,0 @@ -// Copyright 2014 The lime Authors. -// Use of this source code is governed by a 2-clause -// BSD-style license that can be found in the LICENSE file. - -package keys - -import "testing" - -func TestKeyContextUnmarshalError(t *testing.T) { - var context KeyContext - if err := context.UnmarshalJSON([]byte(``)); err == nil { - t.Errorf("Expected error on loading empty string") - } -} diff --git a/backend/keys/keypress.go b/backend/keys/keypress.go deleted file mode 100644 index 5c9c099..0000000 --- a/backend/keys/keypress.go +++ /dev/null @@ -1,104 +0,0 @@ -// Copyright 2013 The lime Authors. -// Use of this source code is governed by a 2-clause -// BSD-style license that can be found in the LICENSE file. - -package keys - -import ( - "fmt" - "github.com/limetext/lime/backend/log" - "strings" - "unicode" -) - -// KeyPress describes a key press event. -// Note that Key does not distinguish between capital and non-capital letters; -// use the Text property for this purpose. -type KeyPress struct { - Text string // the text representation of the key - Key Key // the code for the key that was pressed - Shift, Super, Alt, Ctrl bool // true if modifier key was pressed -} - -// Returns an index used for sorting key presses. -// TODO(.): This is in no way a unique index with quite a lot of collisions and potentially resulting -// in bad lookups. -func (k KeyPress) Index() (ret int) { - ret = int(k.Key) - if k.Shift { - ret += shift - } - if k.Alt { - ret += alt - } - if k.Ctrl { - ret += ctrl - } - if k.Super { - ret += super - } - return -} - -// Returns whether this KeyPress is a print character or not. -func (k KeyPress) IsCharacter() bool { - return unicode.IsPrint(rune(k.Key)) && !k.Super && !k.Ctrl -} - -// Modifies the KeyPress so that it's Key is a unicode lower case -// rune and if it was in uppercase before this modification, the -// "Shift" modifier is also enabled. -func (k *KeyPress) fix() { - lower := Key(unicode.ToLower(rune(k.Key))) - if lower != k.Key { - k.Shift = true - k.Key = lower - } -} - -func (k *KeyPress) UnmarshalJSON(d []byte) error { - combo := strings.Split(string(d[1:len(d)-1]), "+") - for _, c := range combo { - lower := strings.ToLower(c) - switch lower { - case "super": - k.Super = true - case "ctrl": - k.Ctrl = true - case "alt": - k.Alt = true - case "shift": - k.Shift = true - default: - if v, ok := keylut[lower]; ok { - k.Key = v - } else { - r := []Key(c) - if len(r) != 1 { - log.Warn("Unknown key value with %d bytes: %s", len(c), c) - return nil - } - k.Key = Key(c[0]) - k.fix() - } - } - } - return nil -} - -func (k KeyPress) String() (ret string) { - if k.Super { - ret += "super+" - } - if k.Ctrl { - ret += "ctrl+" - } - if k.Alt { - ret += "alt+" - } - if k.Shift { - ret += "shift+" - } - ret += fmt.Sprintf("%s", k.Key) - return -} diff --git a/backend/keys/keypress_test.go b/backend/keys/keypress_test.go deleted file mode 100644 index f2fc2b6..0000000 --- a/backend/keys/keypress_test.go +++ /dev/null @@ -1,109 +0,0 @@ -// Copyright 2014 The lime Authors. -// Use of this source code is governed by a 2-clause -// BSD-style license that can be found in the LICENSE file. - -package keys - -import ( - "testing" -) - -func TestKeyPressIndex(t *testing.T) { - tests := []struct { - kp KeyPress - exp int - }{ - { - KeyPress{Key: 'a', Shift: false, Super: false, Alt: false, Ctrl: false}, - int('a'), - }, - { - KeyPress{Key: 'a', Shift: true, Super: false, Alt: false, Ctrl: false}, - int('a') + shift, - }, - { - KeyPress{Key: 'a', Shift: true, Super: true, Alt: false, Ctrl: false}, - int('a') + shift + super, - }, - { - KeyPress{Key: 'a', Shift: true, Super: true, Alt: true, Ctrl: false}, - int('a') + shift + super + alt, - }, - { - KeyPress{Key: 'a', Shift: true, Super: true, Alt: true, Ctrl: true}, - int('a') + shift + super + alt + ctrl, - }, - } - - for i, test := range tests { - if test.kp.Index() != test.exp { - t.Errorf("Test %d: Expected %d, but got %d", i, test.exp, test.kp.Index()) - } - } -} - -func TestKeyPressIsCharacter(t *testing.T) { - tests := []struct { - kp KeyPress - exp bool - }{ - { - KeyPress{Key: 'a', Shift: false, Super: false, Alt: false, Ctrl: false}, - true, - }, - { - KeyPress{Key: 'a', Shift: true, Super: false, Alt: false, Ctrl: false}, - true, - }, - { - KeyPress{Key: 'a', Shift: false, Super: true, Alt: false, Ctrl: false}, - false, - }, - { - KeyPress{Key: 'a', Shift: false, Super: false, Alt: false, Ctrl: true}, - false, - }, - // { - // KeyPress{Key: F1, Shift: false, Super: false, Alt: false, Ctrl: false}, - // false, - // }, - } - - for i, test := range tests { - if test.kp.IsCharacter() != test.exp { - t.Errorf("Test %d: Expected %v, but got %v", i, test.exp, test.kp.IsCharacter()) - } - } -} - -func TestKeyPressFix(t *testing.T) { - k := KeyPress{"A", 'A', false, false, false, false} - k.fix() - if k.Key != 'a' { - t.Errorf("Expected the key to be %q, but it was %q", 'a', k.Key) - } - if !k.Shift { - t.Error("Expected the shift modifier to be active, but it wasn't") - } -} - -func TestKeyPressUnmarshalJSON(t *testing.T) { - var k KeyPress - d := `"super+ctrl+alt+shift+f1+λλλ"` - err := k.UnmarshalJSON([]byte(d)) - if err != nil { - t.Error(err) - } -} - -func TestKeyPressString(t *testing.T) { - k1 := KeyPress{"a", 'a', true, true, false, false} - if k1.String() != "super+shift+a" { - t.Errorf("Expected %q, but got %q", "super+shift+a", k1.String()) - } - - k2 := KeyPress{"b", 'b', true, false, true, true} - if k2.String() != "ctrl+alt+shift+b" { - t.Errorf("Expected %q, but got %q", "ctrl+alt+shift+b", k2.String()) - } -} diff --git a/backend/keys/testdata/Default.sublime-keymap b/backend/keys/testdata/Default.sublime-keymap deleted file mode 100644 index cb66d60..0000000 --- a/backend/keys/testdata/Default.sublime-keymap +++ /dev/null @@ -1,8 +0,0 @@ -[ - { "keys": ["ctrl+i", "j"], "command": "test1", "context": [{ "key": "test1" }] }, - { "keys": ["ctrl+i", "k"], "command": "test2", "context": [{ "key": "test2" }] }, - { "keys": ["i"], "command": "test3", "context": [{ "key": "test3" }] }, - { "keys": ["ctrl+d"], "command": "test4", "context": [{ "key": "test4" }] }, - { "keys": ["c"], "command": "test5", "context": [{ "key": "t5" }] }, - { "keys": ["c"], "command": "test5", "context": [{ "key": "test5" }] }, -] diff --git a/backend/keys/testdata/test.sublime-keymap b/backend/keys/testdata/test.sublime-keymap deleted file mode 100644 index f0ddc5e..0000000 --- a/backend/keys/testdata/test.sublime-keymap +++ /dev/null @@ -1,4 +0,0 @@ -[ - { "keys": ["ctrl+d", "ctrl+k"], "command": "t1", "context": [{ "key": "t1" }] }, - { "keys": ["p"], "command": "t2", "context": [{ "key": "t2" }] }, -] diff --git a/backend/loaders/json.go b/backend/loaders/json.go deleted file mode 100644 index 677e5ea..0000000 --- a/backend/loaders/json.go +++ /dev/null @@ -1,76 +0,0 @@ -// Copyright 2013 The lime Authors. -// Use of this source code is governed by a 2-clause -// BSD-style license that can be found in the LICENSE file. - -package loaders - -import ( - sj "encoding/json" - "errors" - "fmt" - "github.com/limetext/lime/backend/loaders/json" - . "github.com/limetext/text" -) - -type regionSetAdjuster struct { - Set *RegionSet -} - -func (adjuster *regionSetAdjuster) Erased(changed_buffer Buffer, region_removed Region, data_removed []rune) { - adjuster.Set.Adjust(region_removed.B, region_removed.A-region_removed.B) -} - -func (adjuster *regionSetAdjuster) Inserted(changed_buffer Buffer, region_inserted Region, data_inserted []rune) { - adjuster.Set.Adjust(region_inserted.A, region_inserted.B-region_inserted.A) -} - -func LoadJSON(data []byte, intf interface{}) error { - var ( - b = NewBuffer() - p json.JSON - set RegionSet - ) - defer b.Close() - str := string(data) - b.Insert(0, str) - - // Lime works with rune indices, but the parser works with byte indices - // so we need to create a lookup table to map these correctly. - lut := make([]int, len(str)) - runeidx := 0 - for i := range str { - lut[i] = runeidx - runeidx++ - } - - if !p.Parse(str) { - return fmt.Errorf("%s, %s", p.Error(), p.RootNode()) - } - root := p.RootNode() - for _, child := range root.Children { - switch child.Name { - case "BlockComment", "LineComment", "EndOfFile", "JunkComma": - if child.Range.End() < len(lut) { - set.Add(Region{lut[child.Range.Begin()], lut[child.Range.End()]}) - } - default: - return errors.New("Unhandled node: " + child.Name) - } - } - b.AddObserver(®ionSetAdjuster{Set: &set}) - i := 0 - for { - l := set.Len() - if i >= l { - break - } - r := set.Get(i) - b.Erase(r.Begin(), r.Size()) - if l2 := set.Len(); l2 != l { - continue - } - i++ - } - // TODO(q): Map any line/column errors to the actual file's line/column - return sj.Unmarshal([]byte(b.Substr(Region{0, b.Size()})), intf) -} diff --git a/backend/loaders/json/json.peg b/backend/loaders/json/json.peg deleted file mode 100644 index 0296b25..0000000 --- a/backend/loaders/json/json.peg +++ /dev/null @@ -1,22 +0,0 @@ -# Sublime Text allows "//" and "/* */" style comments as well as extra commas, so isn't "pure" json - -JsonFile <- Values EndOfFile? -Values <- Spacing? Value Spacing? (',' Spacing? Value Spacing?)* JunkComma -Value <- (Dictionary / Array / QuotedText / Float / Integer / Boolean / Null) -Null <- "null" -Dictionary <- '{' KeyValuePairs* Spacing? JunkComma '}' -Array <- '[' Values* Spacing? ']' -KeyValuePairs <- Spacing? KeyValuePair Spacing? (',' Spacing? KeyValuePair Spacing?)* -KeyValuePair <- QuotedText ':' Spacing? Value -QuotedText <- '"' Text? '"' -Text <- &'"' / ('\\' . / (!'"' .))+ -Integer <- '-'? '0' ![0-9] / '-'? [1-9] [0-9]* -Float <- '-'? [0-9]* '.' [0-9]+ ([Ee] [-+]? [0-9]*)? / '-'? [0-9]+ [Ee] [-+]? [0-9]+ -Boolean <- "true" / "false" -Spacing <- (Comment / [ \t\n\r])+ -EndOfFile <- !. - -JunkComma <- (Spacing? ',' Spacing?)? -Comment <- LineComment / BlockComment -LineComment <- "//" (![\n\r] .)* [\n\r] -BlockComment <- "/*" (!"*/" .)* "*/" diff --git a/backend/loaders/json/json_generated.go b/backend/loaders/json/json_generated.go deleted file mode 100644 index 03fe64d..0000000 --- a/backend/loaders/json/json_generated.go +++ /dev/null @@ -1,1386 +0,0 @@ -// Copyright 2015 The lime Authors. -// Use of this source code is governed by a 2-clause -// BSD-style license that can be found in the LICENSE file. - -// This file was generated by tasks/build/gen_loaders.go and shouldn't be manually modified - -package json - -import ( - "github.com/limetext/text" - . "github.com/quarnster/parser" -) - -type JSON struct { - ParserData Reader - IgnoreRange text.Region - Root Node - LastError int -} - -func (p *JSON) RootNode() *Node { - return &p.Root -} - -func (p *JSON) SetData(data string) { - p.ParserData = NewReader(data) - p.Root = Node{Name: "JSON", P: p} - p.IgnoreRange = text.Region{} - p.LastError = 0 -} - -func (p *JSON) Parse(data string) bool { - p.SetData(data) - ret := p.realParse() - p.Root.UpdateRange() - return ret -} - -func (p *JSON) Data(start, end int) string { - return p.ParserData.Substring(start, end) -} - -func (p *JSON) Error() Error { - errstr := "" - line, column := p.ParserData.LineCol(p.LastError) - - if p.LastError == p.ParserData.Len() { - errstr = "Unexpected EOF" - } else { - p.ParserData.Seek(p.LastError) - if r := p.ParserData.Read(); r == '\r' || r == '\n' { - errstr = "Unexpected new line" - } else { - errstr = "Unexpected " + string(r) - } - } - return NewError(line, column, errstr) -} - -func (p *JSON) realParse() bool { - return p.JsonFile() -} -func (p *JSON) JsonFile() bool { - // JsonFile <- Values EndOfFile? - accept := false - accept = true - start := p.ParserData.Pos() - { - save := p.ParserData.Pos() - accept = p.Values() - if accept { - accept = p.EndOfFile() - accept = true - if accept { - } - } - if !accept { - if p.LastError < p.ParserData.Pos() { - p.LastError = p.ParserData.Pos() - } - p.ParserData.Seek(save) - } - } - if accept && start != p.ParserData.Pos() { - if start < p.IgnoreRange.A || p.IgnoreRange.A == 0 { - p.IgnoreRange.A = start - } - p.IgnoreRange.B = p.ParserData.Pos() - } - return accept -} - -func (p *JSON) Values() bool { - // Values <- Spacing? Value Spacing? (',' Spacing? Value Spacing?)* JunkComma - accept := false - accept = true - start := p.ParserData.Pos() - { - save := p.ParserData.Pos() - accept = p.Spacing() - accept = true - if accept { - accept = p.Value() - if accept { - accept = p.Spacing() - accept = true - if accept { - { - accept = true - for accept { - { - save := p.ParserData.Pos() - if p.ParserData.Read() != ',' { - p.ParserData.UnRead() - accept = false - } else { - accept = true - } - if accept { - accept = p.Spacing() - accept = true - if accept { - accept = p.Value() - if accept { - accept = p.Spacing() - accept = true - if accept { - } - } - } - } - if !accept { - if p.LastError < p.ParserData.Pos() { - p.LastError = p.ParserData.Pos() - } - p.ParserData.Seek(save) - } - } - } - accept = true - } - if accept { - accept = p.JunkComma() - if accept { - } - } - } - } - } - if !accept { - if p.LastError < p.ParserData.Pos() { - p.LastError = p.ParserData.Pos() - } - p.ParserData.Seek(save) - } - } - if accept && start != p.ParserData.Pos() { - if start < p.IgnoreRange.A || p.IgnoreRange.A == 0 { - p.IgnoreRange.A = start - } - p.IgnoreRange.B = p.ParserData.Pos() - } - return accept -} - -func (p *JSON) Value() bool { - // Value <- (Dictionary / Array / QuotedText / Float / Integer / Boolean / Null) - accept := false - accept = true - start := p.ParserData.Pos() - { - save := p.ParserData.Pos() - accept = p.Dictionary() - if !accept { - accept = p.Array() - if !accept { - accept = p.QuotedText() - if !accept { - accept = p.Float() - if !accept { - accept = p.Integer() - if !accept { - accept = p.Boolean() - if !accept { - accept = p.Null() - if !accept { - } - } - } - } - } - } - } - if !accept { - p.ParserData.Seek(save) - } - } - if accept && start != p.ParserData.Pos() { - if start < p.IgnoreRange.A || p.IgnoreRange.A == 0 { - p.IgnoreRange.A = start - } - p.IgnoreRange.B = p.ParserData.Pos() - } - return accept -} - -func (p *JSON) Null() bool { - // Null <- "null" - accept := false - accept = true - start := p.ParserData.Pos() - { - accept = true - s := p.ParserData.Pos() - if p.ParserData.Read() != 'n' || p.ParserData.Read() != 'u' || p.ParserData.Read() != 'l' || p.ParserData.Read() != 'l' { - p.ParserData.Seek(s) - accept = false - } - } - if accept && start != p.ParserData.Pos() { - if start < p.IgnoreRange.A || p.IgnoreRange.A == 0 { - p.IgnoreRange.A = start - } - p.IgnoreRange.B = p.ParserData.Pos() - } - return accept -} - -func (p *JSON) Dictionary() bool { - // Dictionary <- '{' KeyValuePairs* Spacing? JunkComma '}' - accept := false - accept = true - start := p.ParserData.Pos() - { - save := p.ParserData.Pos() - if p.ParserData.Read() != '{' { - p.ParserData.UnRead() - accept = false - } else { - accept = true - } - if accept { - { - accept = true - for accept { - accept = p.KeyValuePairs() - } - accept = true - } - if accept { - accept = p.Spacing() - accept = true - if accept { - accept = p.JunkComma() - if accept { - if p.ParserData.Read() != '}' { - p.ParserData.UnRead() - accept = false - } else { - accept = true - } - if accept { - } - } - } - } - } - if !accept { - if p.LastError < p.ParserData.Pos() { - p.LastError = p.ParserData.Pos() - } - p.ParserData.Seek(save) - } - } - if accept && start != p.ParserData.Pos() { - if start < p.IgnoreRange.A || p.IgnoreRange.A == 0 { - p.IgnoreRange.A = start - } - p.IgnoreRange.B = p.ParserData.Pos() - } - return accept -} - -func (p *JSON) Array() bool { - // Array <- '[' Values* Spacing? ']' - accept := false - accept = true - start := p.ParserData.Pos() - { - save := p.ParserData.Pos() - if p.ParserData.Read() != '[' { - p.ParserData.UnRead() - accept = false - } else { - accept = true - } - if accept { - { - accept = true - for accept { - accept = p.Values() - } - accept = true - } - if accept { - accept = p.Spacing() - accept = true - if accept { - if p.ParserData.Read() != ']' { - p.ParserData.UnRead() - accept = false - } else { - accept = true - } - if accept { - } - } - } - } - if !accept { - if p.LastError < p.ParserData.Pos() { - p.LastError = p.ParserData.Pos() - } - p.ParserData.Seek(save) - } - } - if accept && start != p.ParserData.Pos() { - if start < p.IgnoreRange.A || p.IgnoreRange.A == 0 { - p.IgnoreRange.A = start - } - p.IgnoreRange.B = p.ParserData.Pos() - } - return accept -} - -func (p *JSON) KeyValuePairs() bool { - // KeyValuePairs <- Spacing? KeyValuePair Spacing? (',' Spacing? KeyValuePair Spacing?)* - accept := false - accept = true - start := p.ParserData.Pos() - { - save := p.ParserData.Pos() - accept = p.Spacing() - accept = true - if accept { - accept = p.KeyValuePair() - if accept { - accept = p.Spacing() - accept = true - if accept { - { - accept = true - for accept { - { - save := p.ParserData.Pos() - if p.ParserData.Read() != ',' { - p.ParserData.UnRead() - accept = false - } else { - accept = true - } - if accept { - accept = p.Spacing() - accept = true - if accept { - accept = p.KeyValuePair() - if accept { - accept = p.Spacing() - accept = true - if accept { - } - } - } - } - if !accept { - if p.LastError < p.ParserData.Pos() { - p.LastError = p.ParserData.Pos() - } - p.ParserData.Seek(save) - } - } - } - accept = true - } - if accept { - } - } - } - } - if !accept { - if p.LastError < p.ParserData.Pos() { - p.LastError = p.ParserData.Pos() - } - p.ParserData.Seek(save) - } - } - if accept && start != p.ParserData.Pos() { - if start < p.IgnoreRange.A || p.IgnoreRange.A == 0 { - p.IgnoreRange.A = start - } - p.IgnoreRange.B = p.ParserData.Pos() - } - return accept -} - -func (p *JSON) KeyValuePair() bool { - // KeyValuePair <- QuotedText ':' Spacing? Value - accept := false - accept = true - start := p.ParserData.Pos() - { - save := p.ParserData.Pos() - accept = p.QuotedText() - if accept { - if p.ParserData.Read() != ':' { - p.ParserData.UnRead() - accept = false - } else { - accept = true - } - if accept { - accept = p.Spacing() - accept = true - if accept { - accept = p.Value() - if accept { - } - } - } - } - if !accept { - if p.LastError < p.ParserData.Pos() { - p.LastError = p.ParserData.Pos() - } - p.ParserData.Seek(save) - } - } - if accept && start != p.ParserData.Pos() { - if start < p.IgnoreRange.A || p.IgnoreRange.A == 0 { - p.IgnoreRange.A = start - } - p.IgnoreRange.B = p.ParserData.Pos() - } - return accept -} - -func (p *JSON) QuotedText() bool { - // QuotedText <- '"' Text? '"' - accept := false - accept = true - start := p.ParserData.Pos() - { - save := p.ParserData.Pos() - if p.ParserData.Read() != '"' { - p.ParserData.UnRead() - accept = false - } else { - accept = true - } - if accept { - accept = p.Text() - accept = true - if accept { - if p.ParserData.Read() != '"' { - p.ParserData.UnRead() - accept = false - } else { - accept = true - } - if accept { - } - } - } - if !accept { - if p.LastError < p.ParserData.Pos() { - p.LastError = p.ParserData.Pos() - } - p.ParserData.Seek(save) - } - } - if accept && start != p.ParserData.Pos() { - if start < p.IgnoreRange.A || p.IgnoreRange.A == 0 { - p.IgnoreRange.A = start - } - p.IgnoreRange.B = p.ParserData.Pos() - } - return accept -} - -func (p *JSON) Text() bool { - // Text <- &'"' / ('\\' . / (!'"' .))+ - accept := false - accept = true - start := p.ParserData.Pos() - { - save := p.ParserData.Pos() - s := p.ParserData.Pos() - if p.ParserData.Read() != '"' { - p.ParserData.UnRead() - accept = false - } else { - accept = true - } - p.ParserData.Seek(s) - p.Root.Discard(s) - if !accept { - { - save := p.ParserData.Pos() - { - save := p.ParserData.Pos() - { - save := p.ParserData.Pos() - if p.ParserData.Read() != '\\' { - p.ParserData.UnRead() - accept = false - } else { - accept = true - } - if accept { - if p.ParserData.Pos() >= p.ParserData.Len() { - accept = false - } else { - p.ParserData.Read() - accept = true - } - if accept { - } - } - if !accept { - if p.LastError < p.ParserData.Pos() { - p.LastError = p.ParserData.Pos() - } - p.ParserData.Seek(save) - } - } - if !accept { - { - save := p.ParserData.Pos() - s := p.ParserData.Pos() - if p.ParserData.Read() != '"' { - p.ParserData.UnRead() - accept = false - } else { - accept = true - } - p.ParserData.Seek(s) - p.Root.Discard(s) - accept = !accept - if accept { - if p.ParserData.Pos() >= p.ParserData.Len() { - accept = false - } else { - p.ParserData.Read() - accept = true - } - if accept { - } - } - if !accept { - if p.LastError < p.ParserData.Pos() { - p.LastError = p.ParserData.Pos() - } - p.ParserData.Seek(save) - } - } - if !accept { - } - } - if !accept { - p.ParserData.Seek(save) - } - } - if !accept { - p.ParserData.Seek(save) - } else { - for accept { - { - save := p.ParserData.Pos() - { - save := p.ParserData.Pos() - if p.ParserData.Read() != '\\' { - p.ParserData.UnRead() - accept = false - } else { - accept = true - } - if accept { - if p.ParserData.Pos() >= p.ParserData.Len() { - accept = false - } else { - p.ParserData.Read() - accept = true - } - if accept { - } - } - if !accept { - if p.LastError < p.ParserData.Pos() { - p.LastError = p.ParserData.Pos() - } - p.ParserData.Seek(save) - } - } - if !accept { - { - save := p.ParserData.Pos() - s := p.ParserData.Pos() - if p.ParserData.Read() != '"' { - p.ParserData.UnRead() - accept = false - } else { - accept = true - } - p.ParserData.Seek(s) - p.Root.Discard(s) - accept = !accept - if accept { - if p.ParserData.Pos() >= p.ParserData.Len() { - accept = false - } else { - p.ParserData.Read() - accept = true - } - if accept { - } - } - if !accept { - if p.LastError < p.ParserData.Pos() { - p.LastError = p.ParserData.Pos() - } - p.ParserData.Seek(save) - } - } - if !accept { - } - } - if !accept { - p.ParserData.Seek(save) - } - } - } - accept = true - } - } - if !accept { - } - } - if !accept { - p.ParserData.Seek(save) - } - } - if accept && start != p.ParserData.Pos() { - if start < p.IgnoreRange.A || p.IgnoreRange.A == 0 { - p.IgnoreRange.A = start - } - p.IgnoreRange.B = p.ParserData.Pos() - } - return accept -} - -func (p *JSON) Integer() bool { - // Integer <- '-'? '0' ![0-9] / '-'? [1-9] [0-9]* - accept := false - accept = true - start := p.ParserData.Pos() - { - save := p.ParserData.Pos() - { - save := p.ParserData.Pos() - if p.ParserData.Read() != '-' { - p.ParserData.UnRead() - accept = false - } else { - accept = true - } - accept = true - if accept { - if p.ParserData.Read() != '0' { - p.ParserData.UnRead() - accept = false - } else { - accept = true - } - if accept { - s := p.ParserData.Pos() - c := p.ParserData.Read() - if c >= '0' && c <= '9' { - accept = true - } else { - p.ParserData.UnRead() - accept = false - } - p.ParserData.Seek(s) - p.Root.Discard(s) - accept = !accept - if accept { - } - } - } - if !accept { - if p.LastError < p.ParserData.Pos() { - p.LastError = p.ParserData.Pos() - } - p.ParserData.Seek(save) - } - } - if !accept { - { - save := p.ParserData.Pos() - if p.ParserData.Read() != '-' { - p.ParserData.UnRead() - accept = false - } else { - accept = true - } - accept = true - if accept { - c := p.ParserData.Read() - if c >= '1' && c <= '9' { - accept = true - } else { - p.ParserData.UnRead() - accept = false - } - if accept { - { - accept = true - for accept { - c := p.ParserData.Read() - if c >= '0' && c <= '9' { - accept = true - } else { - p.ParserData.UnRead() - accept = false - } - } - accept = true - } - if accept { - } - } - } - if !accept { - if p.LastError < p.ParserData.Pos() { - p.LastError = p.ParserData.Pos() - } - p.ParserData.Seek(save) - } - } - if !accept { - } - } - if !accept { - p.ParserData.Seek(save) - } - } - if accept && start != p.ParserData.Pos() { - if start < p.IgnoreRange.A || p.IgnoreRange.A == 0 { - p.IgnoreRange.A = start - } - p.IgnoreRange.B = p.ParserData.Pos() - } - return accept -} - -func (p *JSON) Float() bool { - // Float <- '-'? [0-9]* '.' [0-9]+ ([Ee] [-+]? [0-9]*)? / '-'? [0-9]+ [Ee] [-+]? [0-9]+ - accept := false - accept = true - start := p.ParserData.Pos() - { - save := p.ParserData.Pos() - { - save := p.ParserData.Pos() - if p.ParserData.Read() != '-' { - p.ParserData.UnRead() - accept = false - } else { - accept = true - } - accept = true - if accept { - { - accept = true - for accept { - c := p.ParserData.Read() - if c >= '0' && c <= '9' { - accept = true - } else { - p.ParserData.UnRead() - accept = false - } - } - accept = true - } - if accept { - if p.ParserData.Read() != '.' { - p.ParserData.UnRead() - accept = false - } else { - accept = true - } - if accept { - { - save := p.ParserData.Pos() - c := p.ParserData.Read() - if c >= '0' && c <= '9' { - accept = true - } else { - p.ParserData.UnRead() - accept = false - } - if !accept { - p.ParserData.Seek(save) - } else { - for accept { - c := p.ParserData.Read() - if c >= '0' && c <= '9' { - accept = true - } else { - p.ParserData.UnRead() - accept = false - } - } - accept = true - } - } - if accept { - { - save := p.ParserData.Pos() - { - accept = false - c := p.ParserData.Read() - if c == 'E' || c == 'e' { - accept = true - } else { - p.ParserData.UnRead() - } - } - if accept { - { - accept = false - c := p.ParserData.Read() - if c == '-' || c == '+' { - accept = true - } else { - p.ParserData.UnRead() - } - } - accept = true - if accept { - { - accept = true - for accept { - c := p.ParserData.Read() - if c >= '0' && c <= '9' { - accept = true - } else { - p.ParserData.UnRead() - accept = false - } - } - accept = true - } - if accept { - } - } - } - if !accept { - if p.LastError < p.ParserData.Pos() { - p.LastError = p.ParserData.Pos() - } - p.ParserData.Seek(save) - } - } - accept = true - if accept { - } - } - } - } - } - if !accept { - if p.LastError < p.ParserData.Pos() { - p.LastError = p.ParserData.Pos() - } - p.ParserData.Seek(save) - } - } - if !accept { - { - save := p.ParserData.Pos() - if p.ParserData.Read() != '-' { - p.ParserData.UnRead() - accept = false - } else { - accept = true - } - accept = true - if accept { - { - save := p.ParserData.Pos() - c := p.ParserData.Read() - if c >= '0' && c <= '9' { - accept = true - } else { - p.ParserData.UnRead() - accept = false - } - if !accept { - p.ParserData.Seek(save) - } else { - for accept { - c := p.ParserData.Read() - if c >= '0' && c <= '9' { - accept = true - } else { - p.ParserData.UnRead() - accept = false - } - } - accept = true - } - } - if accept { - { - accept = false - c := p.ParserData.Read() - if c == 'E' || c == 'e' { - accept = true - } else { - p.ParserData.UnRead() - } - } - if accept { - { - accept = false - c := p.ParserData.Read() - if c == '-' || c == '+' { - accept = true - } else { - p.ParserData.UnRead() - } - } - accept = true - if accept { - { - save := p.ParserData.Pos() - c := p.ParserData.Read() - if c >= '0' && c <= '9' { - accept = true - } else { - p.ParserData.UnRead() - accept = false - } - if !accept { - p.ParserData.Seek(save) - } else { - for accept { - c := p.ParserData.Read() - if c >= '0' && c <= '9' { - accept = true - } else { - p.ParserData.UnRead() - accept = false - } - } - accept = true - } - } - if accept { - } - } - } - } - } - if !accept { - if p.LastError < p.ParserData.Pos() { - p.LastError = p.ParserData.Pos() - } - p.ParserData.Seek(save) - } - } - if !accept { - } - } - if !accept { - p.ParserData.Seek(save) - } - } - if accept && start != p.ParserData.Pos() { - if start < p.IgnoreRange.A || p.IgnoreRange.A == 0 { - p.IgnoreRange.A = start - } - p.IgnoreRange.B = p.ParserData.Pos() - } - return accept -} - -func (p *JSON) Boolean() bool { - // Boolean <- "true" / "false" - accept := false - accept = true - start := p.ParserData.Pos() - { - save := p.ParserData.Pos() - { - accept = true - s := p.ParserData.Pos() - if p.ParserData.Read() != 't' || p.ParserData.Read() != 'r' || p.ParserData.Read() != 'u' || p.ParserData.Read() != 'e' { - p.ParserData.Seek(s) - accept = false - } - } - if !accept { - { - accept = true - s := p.ParserData.Pos() - if p.ParserData.Read() != 'f' || p.ParserData.Read() != 'a' || p.ParserData.Read() != 'l' || p.ParserData.Read() != 's' || p.ParserData.Read() != 'e' { - p.ParserData.Seek(s) - accept = false - } - } - if !accept { - } - } - if !accept { - p.ParserData.Seek(save) - } - } - if accept && start != p.ParserData.Pos() { - if start < p.IgnoreRange.A || p.IgnoreRange.A == 0 { - p.IgnoreRange.A = start - } - p.IgnoreRange.B = p.ParserData.Pos() - } - return accept -} - -func (p *JSON) Spacing() bool { - // Spacing <- (Comment / [ \t\n\r])+ - accept := false - accept = true - start := p.ParserData.Pos() - { - save := p.ParserData.Pos() - { - save := p.ParserData.Pos() - accept = p.Comment() - if !accept { - { - accept = false - c := p.ParserData.Read() - if c == ' ' || c == '\t' || c == '\n' || c == '\r' { - accept = true - } else { - p.ParserData.UnRead() - } - } - if !accept { - } - } - if !accept { - p.ParserData.Seek(save) - } - } - if !accept { - p.ParserData.Seek(save) - } else { - for accept { - { - save := p.ParserData.Pos() - accept = p.Comment() - if !accept { - { - accept = false - c := p.ParserData.Read() - if c == ' ' || c == '\t' || c == '\n' || c == '\r' { - accept = true - } else { - p.ParserData.UnRead() - } - } - if !accept { - } - } - if !accept { - p.ParserData.Seek(save) - } - } - } - accept = true - } - } - if accept && start != p.ParserData.Pos() { - if start < p.IgnoreRange.A || p.IgnoreRange.A == 0 { - p.IgnoreRange.A = start - } - p.IgnoreRange.B = p.ParserData.Pos() - } - return accept -} - -func (p *JSON) EndOfFile() bool { - // EndOfFile <- !. - accept := false - accept = true - start := p.ParserData.Pos() - s := p.ParserData.Pos() - if p.ParserData.Pos() >= p.ParserData.Len() { - accept = false - } else { - p.ParserData.Read() - accept = true - } - p.ParserData.Seek(s) - p.Root.Discard(s) - accept = !accept - end := p.ParserData.Pos() - if accept { - node := p.Root.Cleanup(start, end) - node.Name = "EndOfFile" - node.P = p - node.Range = node.Range.Clip(p.IgnoreRange) - p.Root.Append(node) - } else { - p.Root.Discard(start) - } - if p.IgnoreRange.A >= end || p.IgnoreRange.B <= start { - p.IgnoreRange = text.Region{} - } - return accept -} - -func (p *JSON) JunkComma() bool { - // JunkComma <- (Spacing? ',' Spacing?)? - accept := false - accept = true - start := p.ParserData.Pos() - { - save := p.ParserData.Pos() - accept = p.Spacing() - accept = true - if accept { - if p.ParserData.Read() != ',' { - p.ParserData.UnRead() - accept = false - } else { - accept = true - } - if accept { - accept = p.Spacing() - accept = true - if accept { - } - } - } - if !accept { - if p.LastError < p.ParserData.Pos() { - p.LastError = p.ParserData.Pos() - } - p.ParserData.Seek(save) - } - } - accept = true - end := p.ParserData.Pos() - if accept { - node := p.Root.Cleanup(start, end) - node.Name = "JunkComma" - node.P = p - node.Range = node.Range.Clip(p.IgnoreRange) - p.Root.Append(node) - } else { - p.Root.Discard(start) - } - if p.IgnoreRange.A >= end || p.IgnoreRange.B <= start { - p.IgnoreRange = text.Region{} - } - return accept -} - -func (p *JSON) Comment() bool { - // Comment <- LineComment / BlockComment - accept := false - accept = true - start := p.ParserData.Pos() - { - save := p.ParserData.Pos() - accept = p.LineComment() - if !accept { - accept = p.BlockComment() - if !accept { - } - } - if !accept { - p.ParserData.Seek(save) - } - } - if accept && start != p.ParserData.Pos() { - if start < p.IgnoreRange.A || p.IgnoreRange.A == 0 { - p.IgnoreRange.A = start - } - p.IgnoreRange.B = p.ParserData.Pos() - } - return accept -} - -func (p *JSON) LineComment() bool { - // LineComment <- "//" (![\n\r] .)* [\n\r] - accept := false - accept = true - start := p.ParserData.Pos() - { - save := p.ParserData.Pos() - { - accept = true - s := p.ParserData.Pos() - if p.ParserData.Read() != '/' || p.ParserData.Read() != '/' { - p.ParserData.Seek(s) - accept = false - } - } - if accept { - { - accept = true - for accept { - { - save := p.ParserData.Pos() - s := p.ParserData.Pos() - { - accept = false - c := p.ParserData.Read() - if c == '\n' || c == '\r' { - accept = true - } else { - p.ParserData.UnRead() - } - } - p.ParserData.Seek(s) - p.Root.Discard(s) - accept = !accept - if accept { - if p.ParserData.Pos() >= p.ParserData.Len() { - accept = false - } else { - p.ParserData.Read() - accept = true - } - if accept { - } - } - if !accept { - if p.LastError < p.ParserData.Pos() { - p.LastError = p.ParserData.Pos() - } - p.ParserData.Seek(save) - } - } - } - accept = true - } - if accept { - { - accept = false - c := p.ParserData.Read() - if c == '\n' || c == '\r' { - accept = true - } else { - p.ParserData.UnRead() - } - } - if accept { - } - } - } - if !accept { - if p.LastError < p.ParserData.Pos() { - p.LastError = p.ParserData.Pos() - } - p.ParserData.Seek(save) - } - } - end := p.ParserData.Pos() - if accept { - node := p.Root.Cleanup(start, end) - node.Name = "LineComment" - node.P = p - node.Range = node.Range.Clip(p.IgnoreRange) - p.Root.Append(node) - } else { - p.Root.Discard(start) - } - if p.IgnoreRange.A >= end || p.IgnoreRange.B <= start { - p.IgnoreRange = text.Region{} - } - return accept -} - -func (p *JSON) BlockComment() bool { - // BlockComment <- "/*" (!"*/" .)* "*/" - accept := false - accept = true - start := p.ParserData.Pos() - { - save := p.ParserData.Pos() - { - accept = true - s := p.ParserData.Pos() - if p.ParserData.Read() != '/' || p.ParserData.Read() != '*' { - p.ParserData.Seek(s) - accept = false - } - } - if accept { - { - accept = true - for accept { - { - save := p.ParserData.Pos() - s := p.ParserData.Pos() - { - accept = true - s := p.ParserData.Pos() - if p.ParserData.Read() != '*' || p.ParserData.Read() != '/' { - p.ParserData.Seek(s) - accept = false - } - } - p.ParserData.Seek(s) - p.Root.Discard(s) - accept = !accept - if accept { - if p.ParserData.Pos() >= p.ParserData.Len() { - accept = false - } else { - p.ParserData.Read() - accept = true - } - if accept { - } - } - if !accept { - if p.LastError < p.ParserData.Pos() { - p.LastError = p.ParserData.Pos() - } - p.ParserData.Seek(save) - } - } - } - accept = true - } - if accept { - { - accept = true - s := p.ParserData.Pos() - if p.ParserData.Read() != '*' || p.ParserData.Read() != '/' { - p.ParserData.Seek(s) - accept = false - } - } - if accept { - } - } - } - if !accept { - if p.LastError < p.ParserData.Pos() { - p.LastError = p.ParserData.Pos() - } - p.ParserData.Seek(save) - } - } - end := p.ParserData.Pos() - if accept { - node := p.Root.Cleanup(start, end) - node.Name = "BlockComment" - node.P = p - node.Range = node.Range.Clip(p.IgnoreRange) - p.Root.Append(node) - } else { - p.Root.Discard(start) - } - if p.IgnoreRange.A >= end || p.IgnoreRange.B <= start { - p.IgnoreRange = text.Region{} - } - return accept -} diff --git a/backend/loaders/json/json_generated_test.go b/backend/loaders/json/json_generated_test.go deleted file mode 100644 index 9bd50a4..0000000 --- a/backend/loaders/json/json_generated_test.go +++ /dev/null @@ -1,87 +0,0 @@ -// Copyright 2015 The lime Authors. -// Use of this source code is governed by a 2-clause -// BSD-style license that can be found in the LICENSE file. - -package json - -import ( - "archive/zip" - "io/ioutil" - "net/http" - "strings" - "testing" - "time" -) - -var _ = time.Time{} - -const testname = "testdata/Default (OSX).sublime-keymap" - -func loadData(path string) (retdata string, err error) { - var data []byte - if strings.HasPrefix(path, "http://") { - p2 := strings.Replace(strings.Replace(path, "http://", "http_", -1), "/", "_", -1) - if retdata, err = loadData(p2); err != nil { - if res, err := http.Get(path); err != nil { - return "", err - } else { - defer res.Body.Close() - if data, err = ioutil.ReadAll(res.Body); err != nil { - return "", err - } else if err = ioutil.WriteFile(p2, data, 0644); err != nil { - return "", err - } else { - return loadData(p2) - } - } - } else { - return - } - } else if strings.HasSuffix(path, ".zip") { - if zf, err := zip.OpenReader(path); err != nil { - return "", err - } else { - defer zf.Close() - f, err := zf.File[0].Open() - if err != nil { - return "", err - } - defer f.Close() - if data, err = ioutil.ReadAll(f); err != nil { - return "", err - } - } - } else { - data, err = ioutil.ReadFile(path) - } - return string(data), err -} - -func TestParser(t *testing.T) { - var p JSON - if data, err := loadData(testname); err != nil { - t.Fatal(err) - } else { - root := p.RootNode() - if !p.Parse(data) { - - t.Fatalf("Didn't parse correctly: %s\n", p.Error()) - } else { - - if root.Range.B != p.ParserData.Len() { - t.Fatalf("Parsing didn't finish: %v\n%s", root, p.Error()) - } - } - } -} - -func BenchmarkParser(b *testing.B) { - var p JSON - if data, err := loadData(testname); err != nil { - b.Fatal(err) - } else { - for i := 0; i < b.N; i++ { - p.Parse(data) - } - } -} diff --git a/backend/loaders/json/testdata/Default (OSX).sublime-keymap b/backend/loaders/json/testdata/Default (OSX).sublime-keymap deleted file mode 100644 index 7536a27..0000000 --- a/backend/loaders/json/testdata/Default (OSX).sublime-keymap +++ /dev/null @@ -1,79 +0,0 @@ -[ - { "keys": ["super+shift+7"], "command": "toggle_comment", "args": { "block": false } }, - { "keys": ["super+shift+r"], "command": "show_overlay", "args": {"overlay": "goto", "text": "#"} }, - //{ "keys": ["super+shift+v"], "command": "paste" }, - //{ "keys": ["super+v"], "command": "paste_and_indent" }, - { "keys": ["ctrl+§"], "command": "show_panel", "args": {"panel": "console", "toggle": true} }, - { "keys": ["super+shift+b"], "command": "show_panel", "args": {"panel": "output.exec", "toggle": true} }, - { "keys": ["super+shift+w"], "command": "close_all" }, - - { "keys": ["ctrl+k"], "command": "move", "args": {"by": "lines", "forward": false} }, - /* -// { "keys": ["ctrl+j"], "command": "move", "args": {"by": "lines", "forward": true} }, -// /*/ - { "keys": ["ctrl+alt+f"], "command": "astyleformat" }, - { "keys": ["super+alt+f"], "command": "show_panel", "args": {"panel": "replace"} }, - - //{"keys": ["ctrl+t"], "command": "toggle_setting", "args": {"setting": "vintage_lines.force_mode"}}, - - {"keys": ["ctrl+j", "d"], "command": "open_java_doc", "args": {"under_cursor": true }}, - {"keys": ["ctrl+j", "s"], "command": "open_java_source", "args": {"under_cursor": true }}, - {"keys": ["ctrl+j", "i"], "command": "import_java_class"}, - { - "keys": ["ctrl+r"], - "command": "gs_shell", - "args": {"run": "go play"}, - "context": [{ "key": "selector", "operator": "equal", "operand": "source.go" }] - }, - - {"keys": ["ctrl+alt+s"], "command": "toggle_setting", "args": {"setting": "adb_auto_scroll"}}, - - // {"keys": ["ctrl+t"], "command": "set_setting", "args": {"setting": "draw_white_space", "value": "all"}, - // "context": [{ "key": "setting.draw_white_space", "operator": "not_equal", "operand": "all" }] - // }, - // {"keys": ["ctrl+t"], "command": "set_setting", "args": {"setting": "draw_white_space", "value": "none"}, - // "context": [{ "key": "setting.draw_white_space", "operator": "equal", "operand": "all" }] - // }, - - // { "keys": ["alt+o"], "command": "my_open_file"}, - // { "keys": ["ctrl+b"], "command": "wrap_text", "args": {"tag": "b"}}, - // { "keys": ["alt+i"], "command": "wrap_text", "args": {"start": ""}}, -/* - - { "keys": ["tab"], "command": "insert", "args": {"characters": "\t"} }, - { "keys": ["tab"], "command": "insert_best_completion", "args": {"default": "\t", "exact": true} }, - - { "keys": ["tab"], "command": "indent", "context": - [ - { "key": "text", "operator": "regex_contains", "operand": "\n" } - ] - }, - { "keys": ["tab"], "command": "next_field", "context": - [ - { "key": "has_next_field", "operator": "equal", "operand": true } - ] - }, - { "keys": ["tab"], "command": "auto_complete", "context": - [{ "key": "preceding_text", "operator": "regex_contains", "operand": "[a-zA-Z0-9_]+$", "match_all": true }, - { "key": "auto_complete_visible", "operator": "equal", "operand": false}, - { "key": "last_command", "operator": "not_equal", "operand": "commit_completion" }, - { "key": "last_command", "operator": "not_equal", "operand": "auto_complete" }, - { "key": "last_command", "operator": "not_equal", "operand": "insert_snippet" }, - { "key": "has_next_field", "operator": "equal", "operand": false }, - { "key": "selection_empty", "operator": "equal", "operand": true, "match_all": true } - ] - }, - - { "keys": ["tab"], "command": "commit_completion", "context": - [ - { "key": "auto_complete_visible" }, - { "key": "setting.auto_complete_commit_on_tab" } - ] - }, - */ - - { "keys": ["enter"], "command": "commit_completion", "context": [{ "key": "auto_complete_visible" }] }, - { "keys": ["super+q"], "command": "nop"}, - { "keys": ["super+m"], "command": "toggle_minimap"} - -] diff --git a/backend/loaders/json_test.go b/backend/loaders/json_test.go deleted file mode 100644 index 88cd689..0000000 --- a/backend/loaders/json_test.go +++ /dev/null @@ -1,5 +0,0 @@ -// Copyright 2014 The lime Authors. -// Use of this source code is governed by a 2-clause -// BSD-style license that can be found in the LICENSE file. - -package loaders diff --git a/backend/loaders/plist.go b/backend/loaders/plist.go deleted file mode 100644 index 33e353b..0000000 --- a/backend/loaders/plist.go +++ /dev/null @@ -1,78 +0,0 @@ -// Copyright 2013 The lime Authors. -// Use of this source code is governed by a 2-clause -// BSD-style license that can be found in the LICENSE file. - -package loaders - -import ( - "bytes" - "errors" - "fmt" - "github.com/limetext/lime/backend/loaders/plist" - "github.com/quarnster/parser" - "strings" -) - -func plistconv(buf *bytes.Buffer, node *parser.Node) error { - switch node.Name { - case "Key": - buf.WriteString("\"" + node.Data() + "\": ") - case "String": - n := node.Data() - n = strings.Replace(n, "\\", "\\\\", -1) - n = strings.Replace(n, "\"", "\\\"", -1) - n = strings.Replace(n, "\n", "\\n", -1) - n = strings.Replace(n, "\t", "\\t", -1) - n = strings.Replace(n, ">", ">", -1) - n = strings.Replace(n, "<", "<", -1) - buf.WriteString("\"" + n + "\"") - case "Dictionary": - buf.WriteString("{\n\t") - for i, child := range node.Children { - if i != 0 && i&1 == 0 { - buf.WriteString(",\n\t") - } - if err := plistconv(buf, child); err != nil { - return err - } - } - - buf.WriteString("}\n") - case "Array": - buf.WriteString("[\n\t") - for i, child := range node.Children { - if i != 0 { - buf.WriteString(",\n\t") - } - - if err := plistconv(buf, child); err != nil { - return err - } - } - - buf.WriteString("]\n\t") - case "EndOfFile": - default: - return errors.New(fmt.Sprintf("Unhandled node: %s", node.Name)) - } - return nil -} - -func LoadPlist(data []byte, intf interface{}) error { - var ( - p plist.PLIST - ) - if !p.Parse(strings.Replace(string(data), "\r", "", -1)) { - return p.Error() - } - var ( - root = p.RootNode() - buf bytes.Buffer - ) - for _, child := range root.Children { - if err := plistconv(&buf, child); err != nil { - return err - } - } - return LoadJSON(buf.Bytes(), intf) -} diff --git a/backend/loaders/plist/plist.peg b/backend/loaders/plist/plist.peg deleted file mode 100644 index 4329955..0000000 --- a/backend/loaders/plist/plist.peg +++ /dev/null @@ -1,15 +0,0 @@ -PlistFile <- "" .)+ "?>" Spacing* "' .)+ '>' Spacing* Plist Spacing* EndOfFile? -Plist <- "" Values "" - -Dictionary <- "" KeyValuePair+ "" / "" -KeyValuePair <- Spacing* KeyTag Spacing* Value Spacing* -KeyTag <- "" Key "" -Key <- (!'<' .)* -StringTag <- "" String "" -String <- (!'<' .)* -Value <- Array / StringTag / Dictionary -Values <- (Spacing* Value Spacing*)* -Array <- "" Values "" / "" - -Spacing <- [ \t\n\r]+ -EndOfFile <- !. diff --git a/backend/loaders/plist/plist_generated.go b/backend/loaders/plist/plist_generated.go deleted file mode 100644 index bf2f4eb..0000000 --- a/backend/loaders/plist/plist_generated.go +++ /dev/null @@ -1,911 +0,0 @@ -// Copyright 2015 The lime Authors. -// Use of this source code is governed by a 2-clause -// BSD-style license that can be found in the LICENSE file. - -// This file was generated by tasks/build/gen_loaders.go and shouldn't be manually modified - -package plist - -import ( - "github.com/limetext/text" - . "github.com/quarnster/parser" -) - -type PLIST struct { - ParserData Reader - IgnoreRange text.Region - Root Node - LastError int -} - -func (p *PLIST) RootNode() *Node { - return &p.Root -} - -func (p *PLIST) SetData(data string) { - p.ParserData = NewReader(data) - p.Root = Node{Name: "PLIST", P: p} - p.IgnoreRange = text.Region{} - p.LastError = 0 -} - -func (p *PLIST) Parse(data string) bool { - p.SetData(data) - ret := p.realParse() - p.Root.UpdateRange() - return ret -} - -func (p *PLIST) Data(start, end int) string { - return p.ParserData.Substring(start, end) -} - -func (p *PLIST) Error() Error { - errstr := "" - line, column := p.ParserData.LineCol(p.LastError) - - if p.LastError == p.ParserData.Len() { - errstr = "Unexpected EOF" - } else { - p.ParserData.Seek(p.LastError) - if r := p.ParserData.Read(); r == '\r' || r == '\n' { - errstr = "Unexpected new line" - } else { - errstr = "Unexpected " + string(r) - } - } - return NewError(line, column, errstr) -} - -func (p *PLIST) realParse() bool { - return p.PlistFile() -} -func (p *PLIST) PlistFile() bool { - // PlistFile <- "" .)+ "?>" Spacing* "' .)+ '>' Spacing* Plist Spacing* EndOfFile? - accept := false - accept = true - start := p.ParserData.Pos() - { - save := p.ParserData.Pos() - { - accept = true - s := p.ParserData.Pos() - if p.ParserData.Read() != '<' || p.ParserData.Read() != '?' || p.ParserData.Read() != 'x' || p.ParserData.Read() != 'm' || p.ParserData.Read() != 'l' { - p.ParserData.Seek(s) - accept = false - } - } - if accept { - { - save := p.ParserData.Pos() - { - save := p.ParserData.Pos() - s := p.ParserData.Pos() - { - accept = true - s := p.ParserData.Pos() - if p.ParserData.Read() != '?' || p.ParserData.Read() != '>' { - p.ParserData.Seek(s) - accept = false - } - } - p.ParserData.Seek(s) - p.Root.Discard(s) - accept = !accept - if accept { - if p.ParserData.Pos() >= p.ParserData.Len() { - accept = false - } else { - p.ParserData.Read() - accept = true - } - if accept { - } - } - if !accept { - if p.LastError < p.ParserData.Pos() { - p.LastError = p.ParserData.Pos() - } - p.ParserData.Seek(save) - } - } - if !accept { - p.ParserData.Seek(save) - } else { - for accept { - { - save := p.ParserData.Pos() - s := p.ParserData.Pos() - { - accept = true - s := p.ParserData.Pos() - if p.ParserData.Read() != '?' || p.ParserData.Read() != '>' { - p.ParserData.Seek(s) - accept = false - } - } - p.ParserData.Seek(s) - p.Root.Discard(s) - accept = !accept - if accept { - if p.ParserData.Pos() >= p.ParserData.Len() { - accept = false - } else { - p.ParserData.Read() - accept = true - } - if accept { - } - } - if !accept { - if p.LastError < p.ParserData.Pos() { - p.LastError = p.ParserData.Pos() - } - p.ParserData.Seek(save) - } - } - } - accept = true - } - } - if accept { - { - accept = true - s := p.ParserData.Pos() - if p.ParserData.Read() != '?' || p.ParserData.Read() != '>' { - p.ParserData.Seek(s) - accept = false - } - } - if accept { - { - accept = true - for accept { - accept = p.Spacing() - } - accept = true - } - if accept { - { - accept = true - s := p.ParserData.Pos() - if p.ParserData.Read() != '<' || p.ParserData.Read() != '!' || p.ParserData.Read() != 'D' || p.ParserData.Read() != 'O' || p.ParserData.Read() != 'C' || p.ParserData.Read() != 'T' || p.ParserData.Read() != 'Y' || p.ParserData.Read() != 'P' || p.ParserData.Read() != 'E' { - p.ParserData.Seek(s) - accept = false - } - } - if accept { - { - save := p.ParserData.Pos() - { - save := p.ParserData.Pos() - s := p.ParserData.Pos() - if p.ParserData.Read() != '>' { - p.ParserData.UnRead() - accept = false - } else { - accept = true - } - p.ParserData.Seek(s) - p.Root.Discard(s) - accept = !accept - if accept { - if p.ParserData.Pos() >= p.ParserData.Len() { - accept = false - } else { - p.ParserData.Read() - accept = true - } - if accept { - } - } - if !accept { - if p.LastError < p.ParserData.Pos() { - p.LastError = p.ParserData.Pos() - } - p.ParserData.Seek(save) - } - } - if !accept { - p.ParserData.Seek(save) - } else { - for accept { - { - save := p.ParserData.Pos() - s := p.ParserData.Pos() - if p.ParserData.Read() != '>' { - p.ParserData.UnRead() - accept = false - } else { - accept = true - } - p.ParserData.Seek(s) - p.Root.Discard(s) - accept = !accept - if accept { - if p.ParserData.Pos() >= p.ParserData.Len() { - accept = false - } else { - p.ParserData.Read() - accept = true - } - if accept { - } - } - if !accept { - if p.LastError < p.ParserData.Pos() { - p.LastError = p.ParserData.Pos() - } - p.ParserData.Seek(save) - } - } - } - accept = true - } - } - if accept { - if p.ParserData.Read() != '>' { - p.ParserData.UnRead() - accept = false - } else { - accept = true - } - if accept { - { - accept = true - for accept { - accept = p.Spacing() - } - accept = true - } - if accept { - accept = p.Plist() - if accept { - { - accept = true - for accept { - accept = p.Spacing() - } - accept = true - } - if accept { - accept = p.EndOfFile() - accept = true - if accept { - } - } - } - } - } - } - } - } - } - } - } - if !accept { - if p.LastError < p.ParserData.Pos() { - p.LastError = p.ParserData.Pos() - } - p.ParserData.Seek(save) - } - } - if accept && start != p.ParserData.Pos() { - if start < p.IgnoreRange.A || p.IgnoreRange.A == 0 { - p.IgnoreRange.A = start - } - p.IgnoreRange.B = p.ParserData.Pos() - } - return accept -} - -func (p *PLIST) Plist() bool { - // Plist <- "" Values "" - accept := false - accept = true - start := p.ParserData.Pos() - { - save := p.ParserData.Pos() - { - accept = true - s := p.ParserData.Pos() - if p.ParserData.Read() != '<' || p.ParserData.Read() != 'p' || p.ParserData.Read() != 'l' || p.ParserData.Read() != 'i' || p.ParserData.Read() != 's' || p.ParserData.Read() != 't' || p.ParserData.Read() != ' ' || p.ParserData.Read() != 'v' || p.ParserData.Read() != 'e' || p.ParserData.Read() != 'r' || p.ParserData.Read() != 's' || p.ParserData.Read() != 'i' || p.ParserData.Read() != 'o' || p.ParserData.Read() != 'n' || p.ParserData.Read() != '=' || p.ParserData.Read() != '"' || p.ParserData.Read() != '1' || p.ParserData.Read() != '.' || p.ParserData.Read() != '0' || p.ParserData.Read() != '"' || p.ParserData.Read() != '>' { - p.ParserData.Seek(s) - accept = false - } - } - if accept { - accept = p.Values() - if accept { - { - accept = true - s := p.ParserData.Pos() - if p.ParserData.Read() != '<' || p.ParserData.Read() != '/' || p.ParserData.Read() != 'p' || p.ParserData.Read() != 'l' || p.ParserData.Read() != 'i' || p.ParserData.Read() != 's' || p.ParserData.Read() != 't' || p.ParserData.Read() != '>' { - p.ParserData.Seek(s) - accept = false - } - } - if accept { - } - } - } - if !accept { - if p.LastError < p.ParserData.Pos() { - p.LastError = p.ParserData.Pos() - } - p.ParserData.Seek(save) - } - } - if accept && start != p.ParserData.Pos() { - if start < p.IgnoreRange.A || p.IgnoreRange.A == 0 { - p.IgnoreRange.A = start - } - p.IgnoreRange.B = p.ParserData.Pos() - } - return accept -} - -func (p *PLIST) Dictionary() bool { - // Dictionary <- "" KeyValuePair+ "" / "" - accept := false - accept = true - start := p.ParserData.Pos() - { - save := p.ParserData.Pos() - { - save := p.ParserData.Pos() - { - accept = true - s := p.ParserData.Pos() - if p.ParserData.Read() != '<' || p.ParserData.Read() != 'd' || p.ParserData.Read() != 'i' || p.ParserData.Read() != 'c' || p.ParserData.Read() != 't' || p.ParserData.Read() != '>' { - p.ParserData.Seek(s) - accept = false - } - } - if accept { - { - save := p.ParserData.Pos() - accept = p.KeyValuePair() - if !accept { - p.ParserData.Seek(save) - } else { - for accept { - accept = p.KeyValuePair() - } - accept = true - } - } - if accept { - { - accept = true - s := p.ParserData.Pos() - if p.ParserData.Read() != '<' || p.ParserData.Read() != '/' || p.ParserData.Read() != 'd' || p.ParserData.Read() != 'i' || p.ParserData.Read() != 'c' || p.ParserData.Read() != 't' || p.ParserData.Read() != '>' { - p.ParserData.Seek(s) - accept = false - } - } - if accept { - } - } - } - if !accept { - if p.LastError < p.ParserData.Pos() { - p.LastError = p.ParserData.Pos() - } - p.ParserData.Seek(save) - } - } - if !accept { - { - accept = true - s := p.ParserData.Pos() - if p.ParserData.Read() != '<' || p.ParserData.Read() != 'd' || p.ParserData.Read() != 'i' || p.ParserData.Read() != 'c' || p.ParserData.Read() != 't' || p.ParserData.Read() != '/' || p.ParserData.Read() != '>' { - p.ParserData.Seek(s) - accept = false - } - } - if !accept { - } - } - if !accept { - p.ParserData.Seek(save) - } - } - end := p.ParserData.Pos() - if accept { - node := p.Root.Cleanup(start, end) - node.Name = "Dictionary" - node.P = p - node.Range = node.Range.Clip(p.IgnoreRange) - p.Root.Append(node) - } else { - p.Root.Discard(start) - } - if p.IgnoreRange.A >= end || p.IgnoreRange.B <= start { - p.IgnoreRange = text.Region{} - } - return accept -} - -func (p *PLIST) KeyValuePair() bool { - // KeyValuePair <- Spacing* KeyTag Spacing* Value Spacing* - accept := false - accept = true - start := p.ParserData.Pos() - { - save := p.ParserData.Pos() - { - accept = true - for accept { - accept = p.Spacing() - } - accept = true - } - if accept { - accept = p.KeyTag() - if accept { - { - accept = true - for accept { - accept = p.Spacing() - } - accept = true - } - if accept { - accept = p.Value() - if accept { - { - accept = true - for accept { - accept = p.Spacing() - } - accept = true - } - if accept { - } - } - } - } - } - if !accept { - if p.LastError < p.ParserData.Pos() { - p.LastError = p.ParserData.Pos() - } - p.ParserData.Seek(save) - } - } - if accept && start != p.ParserData.Pos() { - if start < p.IgnoreRange.A || p.IgnoreRange.A == 0 { - p.IgnoreRange.A = start - } - p.IgnoreRange.B = p.ParserData.Pos() - } - return accept -} - -func (p *PLIST) KeyTag() bool { - // KeyTag <- "" Key "" - accept := false - accept = true - start := p.ParserData.Pos() - { - save := p.ParserData.Pos() - { - accept = true - s := p.ParserData.Pos() - if p.ParserData.Read() != '<' || p.ParserData.Read() != 'k' || p.ParserData.Read() != 'e' || p.ParserData.Read() != 'y' || p.ParserData.Read() != '>' { - p.ParserData.Seek(s) - accept = false - } - } - if accept { - accept = p.Key() - if accept { - { - accept = true - s := p.ParserData.Pos() - if p.ParserData.Read() != '<' || p.ParserData.Read() != '/' || p.ParserData.Read() != 'k' || p.ParserData.Read() != 'e' || p.ParserData.Read() != 'y' || p.ParserData.Read() != '>' { - p.ParserData.Seek(s) - accept = false - } - } - if accept { - } - } - } - if !accept { - if p.LastError < p.ParserData.Pos() { - p.LastError = p.ParserData.Pos() - } - p.ParserData.Seek(save) - } - } - if accept && start != p.ParserData.Pos() { - if start < p.IgnoreRange.A || p.IgnoreRange.A == 0 { - p.IgnoreRange.A = start - } - p.IgnoreRange.B = p.ParserData.Pos() - } - return accept -} - -func (p *PLIST) Key() bool { - // Key <- (!'<' .)* - accept := false - accept = true - start := p.ParserData.Pos() - { - accept = true - for accept { - { - save := p.ParserData.Pos() - s := p.ParserData.Pos() - if p.ParserData.Read() != '<' { - p.ParserData.UnRead() - accept = false - } else { - accept = true - } - p.ParserData.Seek(s) - p.Root.Discard(s) - accept = !accept - if accept { - if p.ParserData.Pos() >= p.ParserData.Len() { - accept = false - } else { - p.ParserData.Read() - accept = true - } - if accept { - } - } - if !accept { - if p.LastError < p.ParserData.Pos() { - p.LastError = p.ParserData.Pos() - } - p.ParserData.Seek(save) - } - } - } - accept = true - } - end := p.ParserData.Pos() - if accept { - node := p.Root.Cleanup(start, end) - node.Name = "Key" - node.P = p - node.Range = node.Range.Clip(p.IgnoreRange) - p.Root.Append(node) - } else { - p.Root.Discard(start) - } - if p.IgnoreRange.A >= end || p.IgnoreRange.B <= start { - p.IgnoreRange = text.Region{} - } - return accept -} - -func (p *PLIST) StringTag() bool { - // StringTag <- "" String "" - accept := false - accept = true - start := p.ParserData.Pos() - { - save := p.ParserData.Pos() - { - accept = true - s := p.ParserData.Pos() - if p.ParserData.Read() != '<' || p.ParserData.Read() != 's' || p.ParserData.Read() != 't' || p.ParserData.Read() != 'r' || p.ParserData.Read() != 'i' || p.ParserData.Read() != 'n' || p.ParserData.Read() != 'g' || p.ParserData.Read() != '>' { - p.ParserData.Seek(s) - accept = false - } - } - if accept { - accept = p.String() - if accept { - { - accept = true - s := p.ParserData.Pos() - if p.ParserData.Read() != '<' || p.ParserData.Read() != '/' || p.ParserData.Read() != 's' || p.ParserData.Read() != 't' || p.ParserData.Read() != 'r' || p.ParserData.Read() != 'i' || p.ParserData.Read() != 'n' || p.ParserData.Read() != 'g' || p.ParserData.Read() != '>' { - p.ParserData.Seek(s) - accept = false - } - } - if accept { - } - } - } - if !accept { - if p.LastError < p.ParserData.Pos() { - p.LastError = p.ParserData.Pos() - } - p.ParserData.Seek(save) - } - } - if accept && start != p.ParserData.Pos() { - if start < p.IgnoreRange.A || p.IgnoreRange.A == 0 { - p.IgnoreRange.A = start - } - p.IgnoreRange.B = p.ParserData.Pos() - } - return accept -} - -func (p *PLIST) String() bool { - // String <- (!'<' .)* - accept := false - accept = true - start := p.ParserData.Pos() - { - accept = true - for accept { - { - save := p.ParserData.Pos() - s := p.ParserData.Pos() - if p.ParserData.Read() != '<' { - p.ParserData.UnRead() - accept = false - } else { - accept = true - } - p.ParserData.Seek(s) - p.Root.Discard(s) - accept = !accept - if accept { - if p.ParserData.Pos() >= p.ParserData.Len() { - accept = false - } else { - p.ParserData.Read() - accept = true - } - if accept { - } - } - if !accept { - if p.LastError < p.ParserData.Pos() { - p.LastError = p.ParserData.Pos() - } - p.ParserData.Seek(save) - } - } - } - accept = true - } - end := p.ParserData.Pos() - if accept { - node := p.Root.Cleanup(start, end) - node.Name = "String" - node.P = p - node.Range = node.Range.Clip(p.IgnoreRange) - p.Root.Append(node) - } else { - p.Root.Discard(start) - } - if p.IgnoreRange.A >= end || p.IgnoreRange.B <= start { - p.IgnoreRange = text.Region{} - } - return accept -} - -func (p *PLIST) Value() bool { - // Value <- Array / StringTag / Dictionary - accept := false - accept = true - start := p.ParserData.Pos() - { - save := p.ParserData.Pos() - accept = p.Array() - if !accept { - accept = p.StringTag() - if !accept { - accept = p.Dictionary() - if !accept { - } - } - } - if !accept { - p.ParserData.Seek(save) - } - } - if accept && start != p.ParserData.Pos() { - if start < p.IgnoreRange.A || p.IgnoreRange.A == 0 { - p.IgnoreRange.A = start - } - p.IgnoreRange.B = p.ParserData.Pos() - } - return accept -} - -func (p *PLIST) Values() bool { - // Values <- (Spacing* Value Spacing*)* - accept := false - accept = true - start := p.ParserData.Pos() - { - accept = true - for accept { - { - save := p.ParserData.Pos() - { - accept = true - for accept { - accept = p.Spacing() - } - accept = true - } - if accept { - accept = p.Value() - if accept { - { - accept = true - for accept { - accept = p.Spacing() - } - accept = true - } - if accept { - } - } - } - if !accept { - if p.LastError < p.ParserData.Pos() { - p.LastError = p.ParserData.Pos() - } - p.ParserData.Seek(save) - } - } - } - accept = true - } - if accept && start != p.ParserData.Pos() { - if start < p.IgnoreRange.A || p.IgnoreRange.A == 0 { - p.IgnoreRange.A = start - } - p.IgnoreRange.B = p.ParserData.Pos() - } - return accept -} - -func (p *PLIST) Array() bool { - // Array <- "" Values "" / "" - accept := false - accept = true - start := p.ParserData.Pos() - { - save := p.ParserData.Pos() - { - save := p.ParserData.Pos() - { - accept = true - s := p.ParserData.Pos() - if p.ParserData.Read() != '<' || p.ParserData.Read() != 'a' || p.ParserData.Read() != 'r' || p.ParserData.Read() != 'r' || p.ParserData.Read() != 'a' || p.ParserData.Read() != 'y' || p.ParserData.Read() != '>' { - p.ParserData.Seek(s) - accept = false - } - } - if accept { - accept = p.Values() - if accept { - { - accept = true - s := p.ParserData.Pos() - if p.ParserData.Read() != '<' || p.ParserData.Read() != '/' || p.ParserData.Read() != 'a' || p.ParserData.Read() != 'r' || p.ParserData.Read() != 'r' || p.ParserData.Read() != 'a' || p.ParserData.Read() != 'y' || p.ParserData.Read() != '>' { - p.ParserData.Seek(s) - accept = false - } - } - if accept { - } - } - } - if !accept { - if p.LastError < p.ParserData.Pos() { - p.LastError = p.ParserData.Pos() - } - p.ParserData.Seek(save) - } - } - if !accept { - { - accept = true - s := p.ParserData.Pos() - if p.ParserData.Read() != '<' || p.ParserData.Read() != 'a' || p.ParserData.Read() != 'r' || p.ParserData.Read() != 'r' || p.ParserData.Read() != 'a' || p.ParserData.Read() != 'y' || p.ParserData.Read() != '/' || p.ParserData.Read() != '>' { - p.ParserData.Seek(s) - accept = false - } - } - if !accept { - } - } - if !accept { - p.ParserData.Seek(save) - } - } - end := p.ParserData.Pos() - if accept { - node := p.Root.Cleanup(start, end) - node.Name = "Array" - node.P = p - node.Range = node.Range.Clip(p.IgnoreRange) - p.Root.Append(node) - } else { - p.Root.Discard(start) - } - if p.IgnoreRange.A >= end || p.IgnoreRange.B <= start { - p.IgnoreRange = text.Region{} - } - return accept -} - -func (p *PLIST) Spacing() bool { - // Spacing <- [ \t\n\r]+ - accept := false - accept = true - start := p.ParserData.Pos() - { - save := p.ParserData.Pos() - { - accept = false - c := p.ParserData.Read() - if c == ' ' || c == '\t' || c == '\n' || c == '\r' { - accept = true - } else { - p.ParserData.UnRead() - } - } - if !accept { - p.ParserData.Seek(save) - } else { - for accept { - { - accept = false - c := p.ParserData.Read() - if c == ' ' || c == '\t' || c == '\n' || c == '\r' { - accept = true - } else { - p.ParserData.UnRead() - } - } - } - accept = true - } - } - if accept && start != p.ParserData.Pos() { - if start < p.IgnoreRange.A || p.IgnoreRange.A == 0 { - p.IgnoreRange.A = start - } - p.IgnoreRange.B = p.ParserData.Pos() - } - return accept -} - -func (p *PLIST) EndOfFile() bool { - // EndOfFile <- !. - accept := false - accept = true - start := p.ParserData.Pos() - s := p.ParserData.Pos() - if p.ParserData.Pos() >= p.ParserData.Len() { - accept = false - } else { - p.ParserData.Read() - accept = true - } - p.ParserData.Seek(s) - p.Root.Discard(s) - accept = !accept - end := p.ParserData.Pos() - if accept { - node := p.Root.Cleanup(start, end) - node.Name = "EndOfFile" - node.P = p - node.Range = node.Range.Clip(p.IgnoreRange) - p.Root.Append(node) - } else { - p.Root.Discard(start) - } - if p.IgnoreRange.A >= end || p.IgnoreRange.B <= start { - p.IgnoreRange = text.Region{} - } - return accept -} diff --git a/backend/loaders/plist/plist_generated_test.go b/backend/loaders/plist/plist_generated_test.go deleted file mode 100644 index ab98418..0000000 --- a/backend/loaders/plist/plist_generated_test.go +++ /dev/null @@ -1,87 +0,0 @@ -// Copyright 2015 The lime Authors. -// Use of this source code is governed by a 2-clause -// BSD-style license that can be found in the LICENSE file. - -package plist - -import ( - "archive/zip" - "io/ioutil" - "net/http" - "strings" - "testing" - "time" -) - -var _ = time.Time{} - -const testname = "testdata/C.plist" - -func loadData(path string) (retdata string, err error) { - var data []byte - if strings.HasPrefix(path, "http://") { - p2 := strings.Replace(strings.Replace(path, "http://", "http_", -1), "/", "_", -1) - if retdata, err = loadData(p2); err != nil { - if res, err := http.Get(path); err != nil { - return "", err - } else { - defer res.Body.Close() - if data, err = ioutil.ReadAll(res.Body); err != nil { - return "", err - } else if err = ioutil.WriteFile(p2, data, 0644); err != nil { - return "", err - } else { - return loadData(p2) - } - } - } else { - return - } - } else if strings.HasSuffix(path, ".zip") { - if zf, err := zip.OpenReader(path); err != nil { - return "", err - } else { - defer zf.Close() - f, err := zf.File[0].Open() - if err != nil { - return "", err - } - defer f.Close() - if data, err = ioutil.ReadAll(f); err != nil { - return "", err - } - } - } else { - data, err = ioutil.ReadFile(path) - } - return string(data), err -} - -func TestParser(t *testing.T) { - var p PLIST - if data, err := loadData(testname); err != nil { - t.Fatal(err) - } else { - root := p.RootNode() - if !p.Parse(data) { - - t.Fatalf("Didn't parse correctly: %s\n", p.Error()) - } else { - - if root.Range.B != p.ParserData.Len() { - t.Fatalf("Parsing didn't finish: %v\n%s", root, p.Error()) - } - } - } -} - -func BenchmarkParser(b *testing.B) { - var p PLIST - if data, err := loadData(testname); err != nil { - b.Fatal(err) - } else { - for i := 0; i < b.N; i++ { - p.Parse(data) - } - } -} diff --git a/backend/loaders/plist/testdata/C.plist b/backend/loaders/plist/testdata/C.plist deleted file mode 100644 index 06ba0a7..0000000 --- a/backend/loaders/plist/testdata/C.plist +++ /dev/null @@ -1,1202 +0,0 @@ - - - - - fileTypes - - c - h - - firstLineMatch - -[*]-( Mode:)? C -[*]- - keyEquivalent - ^~C - name - C - patterns - - - include - #preprocessor-rule-enabled - - - include - #preprocessor-rule-disabled - - - include - #preprocessor-rule-other - - - include - #comments - - - match - \b(break|case|continue|default|do|else|for|goto|if|_Pragma|return|switch|while)\b - name - keyword.control.c - - - match - \b(asm|__asm__|auto|bool|_Bool|char|_Complex|double|enum|float|_Imaginary|int|long|short|signed|struct|typedef|union|unsigned|void)\b - name - storage.type.c - - - match - \b(const|extern|register|restrict|static|volatile|inline)\b - name - storage.modifier.c - - - comment - common C constant naming idiom -- kConstantVariable - match - \bk[A-Z]\w*\b - name - constant.other.variable.mac-classic.c - - - match - \bg[A-Z]\w*\b - name - variable.other.readwrite.global.mac-classic.c - - - match - \bs[A-Z]\w*\b - name - variable.other.readwrite.static.mac-classic.c - - - match - \b(NULL|true|false|TRUE|FALSE)\b - name - constant.language.c - - - include - #sizeof - - - match - \b((0(x|X)[0-9a-fA-F]*)|(([0-9]+\.?[0-9]*)|(\.[0-9]+))((e|E)(\+|-)?[0-9]+)?)(L|l|UL|ul|u|U|F|f|ll|LL|ull|ULL)?\b - name - constant.numeric.c - - - begin - " - beginCaptures - - 0 - - name - punctuation.definition.string.begin.c - - - end - " - endCaptures - - 0 - - name - punctuation.definition.string.end.c - - - name - string.quoted.double.c - patterns - - - include - #string_escaped_char - - - include - #string_placeholder - - - - - begin - ' - beginCaptures - - 0 - - name - punctuation.definition.string.begin.c - - - end - ' - endCaptures - - 0 - - name - punctuation.definition.string.end.c - - - name - string.quoted.single.c - patterns - - - include - #string_escaped_char - - - - - begin - (?x) - ^\s*\#\s*(define)\s+ # define - ((?<id>[a-zA-Z_][a-zA-Z0-9_]*)) # macro name - (?: # and optionally: - (\() # an open parenthesis - ( - \s* \g<id> \s* # first argument - ((,) \s* \g<id> \s*)* # additional arguments - (?:\.\.\.)? # varargs ellipsis? - ) - (\)) # a close parenthesis - )? - - beginCaptures - - 1 - - name - keyword.control.import.define.c - - 2 - - name - entity.name.function.preprocessor.c - - 4 - - name - punctuation.definition.parameters.begin.c - - 5 - - name - variable.parameter.preprocessor.c - - 7 - - name - punctuation.separator.parameters.c - - 8 - - name - punctuation.definition.parameters.end.c - - - end - (?=(?://|/\*))|$ - name - meta.preprocessor.macro.c - patterns - - - match - (?>\\\s*\n) - name - punctuation.separator.continuation.c - - - include - $base - - - - - begin - ^\s*#\s*(error|warning)\b - captures - - 1 - - name - keyword.control.import.error.c - - - end - $ - name - meta.preprocessor.diagnostic.c - patterns - - - match - (?>\\\s*\n) - name - punctuation.separator.continuation.c - - - - - begin - ^\s*#\s*(include|import)\b\s+ - captures - - 1 - - name - keyword.control.import.include.c - - - end - (?=(?://|/\*))|$ - name - meta.preprocessor.c.include - patterns - - - match - (?>\\\s*\n) - name - punctuation.separator.continuation.c - - - begin - " - beginCaptures - - 0 - - name - punctuation.definition.string.begin.c - - - end - " - endCaptures - - 0 - - name - punctuation.definition.string.end.c - - - name - string.quoted.double.include.c - - - begin - < - beginCaptures - - 0 - - name - punctuation.definition.string.begin.c - - - end - > - endCaptures - - 0 - - name - punctuation.definition.string.end.c - - - name - string.quoted.other.lt-gt.include.c - - - - - include - #pragma-mark - - - begin - ^\s*#\s*(define|defined|elif|else|if|ifdef|ifndef|line|pragma|undef)\b - captures - - 1 - - name - keyword.control.import.c - - - end - (?=(?://|/\*))|$ - name - meta.preprocessor.c - patterns - - - match - (?>\\\s*\n) - name - punctuation.separator.continuation.c - - - - - match - \b(u_char|u_short|u_int|u_long|ushort|uint|u_quad_t|quad_t|qaddr_t|caddr_t|daddr_t|dev_t|fixpt_t|blkcnt_t|blksize_t|gid_t|in_addr_t|in_port_t|ino_t|key_t|mode_t|nlink_t|id_t|pid_t|off_t|segsz_t|swblk_t|uid_t|id_t|clock_t|size_t|ssize_t|time_t|useconds_t|suseconds_t)\b - name - support.type.sys-types.c - - - match - \b(pthread_attr_t|pthread_cond_t|pthread_condattr_t|pthread_mutex_t|pthread_mutexattr_t|pthread_once_t|pthread_rwlock_t|pthread_rwlockattr_t|pthread_t|pthread_key_t)\b - name - support.type.pthread.c - - - match - \b(int8_t|int16_t|int32_t|int64_t|uint8_t|uint16_t|uint32_t|uint64_t|int_least8_t|int_least16_t|int_least32_t|int_least64_t|uint_least8_t|uint_least16_t|uint_least32_t|uint_least64_t|int_fast8_t|int_fast16_t|int_fast32_t|int_fast64_t|uint_fast8_t|uint_fast16_t|uint_fast32_t|uint_fast64_t|intptr_t|uintptr_t|intmax_t|intmax_t|uintmax_t|uintmax_t)\b - name - support.type.stdint.c - - - match - \b(noErr|kNilOptions|kInvalidID|kVariableLengthArray)\b - name - support.constant.mac-classic.c - - - match - \b(AbsoluteTime|Boolean|Byte|ByteCount|ByteOffset|BytePtr|CompTimeValue|ConstLogicalAddress|ConstStrFileNameParam|ConstStringPtr|Duration|Fixed|FixedPtr|Float32|Float32Point|Float64|Float80|Float96|FourCharCode|Fract|FractPtr|Handle|ItemCount|LogicalAddress|OptionBits|OSErr|OSStatus|OSType|OSTypePtr|PhysicalAddress|ProcessSerialNumber|ProcessSerialNumberPtr|ProcHandle|Ptr|ResType|ResTypePtr|ShortFixed|ShortFixedPtr|SignedByte|SInt16|SInt32|SInt64|SInt8|Size|StrFileName|StringHandle|StringPtr|TimeBase|TimeRecord|TimeScale|TimeValue|TimeValue64|UInt16|UInt32|UInt64|UInt8|UniChar|UniCharCount|UniCharCountPtr|UniCharPtr|UnicodeScalarValue|UniversalProcHandle|UniversalProcPtr|UnsignedFixed|UnsignedFixedPtr|UnsignedWide|UTF16Char|UTF32Char|UTF8Char)\b - name - support.type.mac-classic.c - - - include - #block - - - begin - (?x) - (?: ^ # begin-of-line - | - (?: (?= \s ) (?<!else|new|return) (?<=\w) # or word + space before name - | (?= \s*[A-Za-z_] ) (?<!&&) (?<=[*&>]) # or type modifier before name - ) - ) - (\s*) (?!(while|for|do|if|else|switch|catch|enumerate|return|[cr]?iterate)\s*\() - ( - (?: [A-Za-z_][A-Za-z0-9_]*+ | :: )++ | # actual name - (?: (?<=operator) (?: [-*&<>=+!]+ | \(\) | \[\] ) ) # if it is a C++ operator - ) - \s*(?=\() - beginCaptures - - 1 - - name - punctuation.whitespace.function.leading.c - - 3 - - name - entity.name.function.c - - 4 - - name - punctuation.definition.parameters.c - - - end - (?<=\})|(?=#)|(;) - name - meta.function.c - patterns - - - include - #comments - - - include - #parens - - - match - \bconst\b - name - storage.modifier.c - - - include - #block - - - - - repository - - access - - captures - - 1 - - name - punctuation.separator.variable-access.c - - 2 - - name - variable.other.dot-access.c - - - match - (\.)([a-zA-Z_][a-zA-Z_0-9]*)\b(?!\s*\() - - block - - patterns - - - begin - \{ - beginCaptures - - 0 - - name - punctuation.section.block.begin.c - - - end - \} - endCaptures - - 0 - - name - punctuation.section.block.end.c - - - name - meta.block.c - patterns - - - include - #block_innards - - - - - - block_innards - - patterns - - - include - #preprocessor-rule-enabled-block - - - include - #preprocessor-rule-disabled-block - - - include - #preprocessor-rule-other-block - - - include - #sizeof - - - include - #access - - - include - #libc - - - include - #c_function_call - - - captures - - 1 - - name - variable.other.c - - 2 - - name - punctuation.definition.parameters.c - - - match - (?x) - (?x) - (?: - (?: (?= \s ) (?<!else|new|return) (?<=\w)\s+ # or word + space before name - ) - ) - ( - (?: [A-Za-z_][A-Za-z0-9_]*+ | :: )++ | # actual name - (?: (?<=operator) (?: [-*&<>=+!]+ | \(\) | \[\] ) )? # if it is a C++ operator - ) - \s*(\() - name - meta.initialization.c - - - include - #block - - - include - $base - - - - c_function_call - - captures - - 1 - - name - punctuation.whitespace.function-call.leading.c - - 2 - - name - support.function.any-method.c - - 3 - - name - punctuation.definition.parameters.c - - - match - (?x) (?: (?= \s ) (?:(?<=else|new|return) | (?<!\w)) (\s+))? - (\b - (?!(while|for|do|if|else|switch|catch|enumerate|return|[cr]?iterate)\s*\()(?:(?!NS)[A-Za-z_][A-Za-z0-9_]*+\b | :: )++ # actual name - ) - \s*(\() - name - meta.function-call.c - - comments - - patterns - - - captures - - 1 - - name - meta.toc-list.banner.block.c - - - match - ^/\* =(\s*.*?)\s*= \*/$\n? - name - comment.block.c - - - begin - /\* - beginCaptures - - 0 - - name - punctuation.definition.comment.begin.c - - - end - \*/ - endCaptures - - 0 - - name - punctuation.definition.comment.end.c - - - name - comment.block.c - - - match - \*/.*\n - name - invalid.illegal.stray-comment-end.c - - - captures - - 1 - - name - meta.toc-list.banner.line.c - - - match - ^// =(\s*.*?)\s*=\s*$\n? - name - comment.line.banner.c++ - - - begin - (^[ \t]+)?(?=//) - beginCaptures - - 1 - - name - punctuation.whitespace.comment.leading.c++ - - - end - (?!\G) - patterns - - - begin - // - beginCaptures - - 0 - - name - punctuation.definition.comment.c++ - - - end - \n - name - comment.line.double-slash.c++ - patterns - - - match - (?>\\\s*\n) - name - punctuation.separator.continuation.c++ - - - - - - - - disabled - - begin - ^\s*#\s*if(n?def)?\b.*$ - comment - eat nested preprocessor if(def)s - end - ^\s*#\s*endif\b - patterns - - - include - #disabled - - - include - #pragma-mark - - - - libc - - captures - - 1 - - name - punctuation.whitespace.support.function.leading.c - - 2 - - name - support.function.C99.c - - - match - (\s*)\b(hypot(f|l)?|s(scanf|ystem|nprintf|ca(nf|lb(n(f|l)?|ln(f|l)?))|i(n(h(f|l)?|f|l)?|gn(al|bit))|tr(s(tr|pn)|nc(py|at|mp)|c(spn|hr|oll|py|at|mp)|to(imax|d|u(l(l)?|max)|k|f|l(d|l)?)|error|pbrk|ftime|len|rchr|xfrm)|printf|et(jmp|vbuf|locale|buf)|qrt(f|l)?|w(scanf|printf)|rand)|n(e(arbyint(f|l)?|xt(toward(f|l)?|after(f|l)?))|an(f|l)?)|c(s(in(h(f|l)?|f|l)?|qrt(f|l)?)|cos(h(f)?|f|l)?|imag(f|l)?|t(ime|an(h(f|l)?|f|l)?)|o(s(h(f|l)?|f|l)?|nj(f|l)?|pysign(f|l)?)|p(ow(f|l)?|roj(f|l)?)|e(il(f|l)?|xp(f|l)?)|l(o(ck|g(f|l)?)|earerr)|a(sin(h(f|l)?|f|l)?|cos(h(f|l)?|f|l)?|tan(h(f|l)?|f|l)?|lloc|rg(f|l)?|bs(f|l)?)|real(f|l)?|brt(f|l)?)|t(ime|o(upper|lower)|an(h(f|l)?|f|l)?|runc(f|l)?|gamma(f|l)?|mp(nam|file))|i(s(space|n(ormal|an)|cntrl|inf|digit|u(nordered|pper)|p(unct|rint)|finite|w(space|c(ntrl|type)|digit|upper|p(unct|rint)|lower|al(num|pha)|graph|xdigit|blank)|l(ower|ess(equal|greater)?)|al(num|pha)|gr(eater(equal)?|aph)|xdigit|blank)|logb(f|l)?|max(div|abs))|di(v|fftime)|_Exit|unget(c|wc)|p(ow(f|l)?|ut(s|c(har)?|wc(har)?)|error|rintf)|e(rf(c(f|l)?|f|l)?|x(it|p(2(f|l)?|f|l|m1(f|l)?)?))|v(s(scanf|nprintf|canf|printf|w(scanf|printf))|printf|f(scanf|printf|w(scanf|printf))|w(scanf|printf)|a_(start|copy|end|arg))|qsort|f(s(canf|e(tpos|ek))|close|tell|open|dim(f|l)?|p(classify|ut(s|c|w(s|c))|rintf)|e(holdexcept|set(e(nv|xceptflag)|round)|clearexcept|testexcept|of|updateenv|r(aiseexcept|ror)|get(e(nv|xceptflag)|round))|flush|w(scanf|ide|printf|rite)|loor(f|l)?|abs(f|l)?|get(s|c|pos|w(s|c))|re(open|e|ad|xp(f|l)?)|m(in(f|l)?|od(f|l)?|a(f|l|x(f|l)?)?))|l(d(iv|exp(f|l)?)|o(ngjmp|cal(time|econv)|g(1(p(f|l)?|0(f|l)?)|2(f|l)?|f|l|b(f|l)?)?)|abs|l(div|abs|r(int(f|l)?|ound(f|l)?))|r(int(f|l)?|ound(f|l)?)|gamma(f|l)?)|w(scanf|c(s(s(tr|pn)|nc(py|at|mp)|c(spn|hr|oll|py|at|mp)|to(imax|d|u(l(l)?|max)|k|f|l(d|l)?|mbs)|pbrk|ftime|len|r(chr|tombs)|xfrm)|to(b|mb)|rtomb)|printf|mem(set|c(hr|py|mp)|move))|a(s(sert|ctime|in(h(f|l)?|f|l)?)|cos(h(f|l)?|f|l)?|t(o(i|f|l(l)?)|exit|an(h(f|l)?|2(f|l)?|f|l)?)|b(s|ort))|g(et(s|c(har)?|env|wc(har)?)|mtime)|r(int(f|l)?|ound(f|l)?|e(name|alloc|wind|m(ove|quo(f|l)?|ainder(f|l)?))|a(nd|ise))|b(search|towc)|m(odf(f|l)?|em(set|c(hr|py|mp)|move)|ktime|alloc|b(s(init|towcs|rtowcs)|towc|len|r(towc|len))))\b - - parens - - begin - \( - beginCaptures - - 0 - - name - punctuation.section.parens.begin.c - - - end - \) - endCaptures - - 0 - - name - punctuation.section.parens.end.c - - - name - meta.parens.c - patterns - - - include - $base - - - - pragma-mark - - captures - - 1 - - name - meta.preprocessor.c - - 2 - - name - keyword.control.import.pragma.c - - 3 - - name - meta.toc-list.pragma-mark.c - - - match - ^\s*(#\s*(pragma\s+mark)\s+(.*)) - name - meta.section - - preprocessor-rule-disabled - - begin - ^\s*(#(if)\s+(0)\b).* - captures - - 1 - - name - meta.preprocessor.c - - 2 - - name - keyword.control.import.if.c - - 3 - - name - constant.numeric.preprocessor.c - - - end - ^\s*(#\s*(endif)\b) - patterns - - - begin - ^\s*(#\s*(else)\b) - captures - - 1 - - name - meta.preprocessor.c - - 2 - - name - keyword.control.import.else.c - - - end - (?=^\s*#\s*endif\b) - patterns - - - include - $base - - - - - begin - - end - (?=^\s*#\s*(else|endif)\b) - name - comment.block.preprocessor.if-branch - patterns - - - include - #disabled - - - include - #pragma-mark - - - - - - preprocessor-rule-disabled-block - - begin - ^\s*(#(if)\s+(0)\b).* - captures - - 1 - - name - meta.preprocessor.c - - 2 - - name - keyword.control.import.if.c - - 3 - - name - constant.numeric.preprocessor.c - - - end - ^\s*(#\s*(endif)\b) - patterns - - - begin - ^\s*(#\s*(else)\b) - captures - - 1 - - name - meta.preprocessor.c - - 2 - - name - keyword.control.import.else.c - - - end - (?=^\s*#\s*endif\b) - patterns - - - include - #block_innards - - - - - begin - - end - (?=^\s*#\s*(else|endif)\b) - name - comment.block.preprocessor.if-branch.in-block - patterns - - - include - #disabled - - - include - #pragma-mark - - - - - - preprocessor-rule-enabled - - begin - ^\s*(#(if)\s+(0*1)\b) - captures - - 1 - - name - meta.preprocessor.c - - 2 - - name - keyword.control.import.if.c - - 3 - - name - constant.numeric.preprocessor.c - - - end - ^\s*(#\s*(endif)\b) - patterns - - - begin - ^\s*(#\s*(else)\b).* - captures - - 1 - - name - meta.preprocessor.c - - 2 - - name - keyword.control.import.else.c - - - contentName - comment.block.preprocessor.else-branch - end - (?=^\s*#\s*endif\b) - patterns - - - include - #disabled - - - include - #pragma-mark - - - - - begin - - end - (?=^\s*#\s*(else|endif)\b) - patterns - - - include - $base - - - - - - preprocessor-rule-enabled-block - - begin - ^\s*(#(if)\s+(0*1)\b) - captures - - 1 - - name - meta.preprocessor.c - - 2 - - name - keyword.control.import.if.c - - 3 - - name - constant.numeric.preprocessor.c - - - end - ^\s*(#\s*(endif)\b) - patterns - - - begin - ^\s*(#\s*(else)\b).* - captures - - 1 - - name - meta.preprocessor.c - - 2 - - name - keyword.control.import.else.c - - - contentName - comment.block.preprocessor.else-branch.in-block - end - (?=^\s*#\s*endif\b) - patterns - - - include - #disabled - - - include - #pragma-mark - - - - - begin - - end - (?=^\s*#\s*(else|endif)\b) - patterns - - - include - #block_innards - - - - - - preprocessor-rule-other - - begin - ^\s*(#\s*(if(n?def)?)\b.*?(?:(?=(?://|/\*))|$)) - captures - - 1 - - name - meta.preprocessor.c - - 2 - - name - keyword.control.import.c - - - end - ^\s*(#\s*(endif)\b) - patterns - - - include - $base - - - - preprocessor-rule-other-block - - begin - ^\s*(#\s*(if(n?def)?)\b.*?(?:(?=(?://|/\*))|$)) - captures - - 1 - - name - meta.preprocessor.c - - 2 - - name - keyword.control.import.c - - - end - ^\s*(#\s*(endif)\b) - patterns - - - include - #block_innards - - - - sizeof - - match - \b(sizeof)\b - name - keyword.operator.sizeof.c - - string_escaped_char - - patterns - - - match - \\(\\|[abefnprtv'"?]|[0-3]\d{,2}|[4-7]\d?|x[a-fA-F0-9]{,2}|u[a-fA-F0-9]{,4}|U[a-fA-F0-9]{,8}) - name - constant.character.escape.c - - - match - \\. - name - invalid.illegal.unknown-escape.c - - - - string_placeholder - - patterns - - - match - (?x)% - (\d+\$)? # field (argument #) - [#0\- +']* # flags - [,;:_]? # separator character (AltiVec) - ((-?\d+)|\*(-?\d+\$)?)? # minimum field width - (\.((-?\d+)|\*(-?\d+\$)?)?)? # precision - (hh|h|ll|l|j|t|z|q|L|vh|vl|v|hv|hl)? # length modifier - [diouxXDOUeEfFgGaACcSspn%] # conversion type - - name - constant.other.placeholder.c - - - match - % - name - invalid.illegal.placeholder.c - - - - - scopeName - source.c - uuid - 25066DC2-6B1D-11D9-9D5B-000D93589AF6 - - diff --git a/backend/log/consolelogwriter.go b/backend/log/consolelogwriter.go deleted file mode 100644 index bddc4b0..0000000 --- a/backend/log/consolelogwriter.go +++ /dev/null @@ -1,33 +0,0 @@ -// Copyright 2014 The lime Authors. -// Use of this source code is governed by a 2-clause -// BSD-style license that can be found in the LICENSE file. - -package log - -import ( - "github.com/limetext/log4go" -) - -type ( - consoleLogWriter struct { - logWriter - writer log4go.ConsoleLogWriter - } -) - -func NewConsoleLogWriter() *consoleLogWriter { - ret := &consoleLogWriter{ - writer: log4go.NewConsoleLogWriter(), - } - return ret -} - -// Implement LogWriter - -func (l *consoleLogWriter) LogWrite(rec *log4go.LogRecord) { - l.writer.LogWrite(rec) -} - -func (l *consoleLogWriter) Close() { - l.writer.Close() -} diff --git a/backend/log/consolelogwriter_test.go b/backend/log/consolelogwriter_test.go deleted file mode 100644 index 929ec82..0000000 --- a/backend/log/consolelogwriter_test.go +++ /dev/null @@ -1,25 +0,0 @@ -// Copyright 2014 The lime Authors. -// Use of this source code is governed by a 2-clause -// BSD-style license that can be found in the LICENSE file. - -package log - -import ( - "github.com/limetext/log4go" - "testing" -) - -func TestNewConsoleLogWriter(t *testing.T) { - l := NewConsoleLogWriter() - if l == nil { - t.Error("NewConsoleLogWriter produced a nil") - } - l.Close() -} - -func TestConsoleLogWriterLogWrite(t *testing.T) { - l := NewConsoleLogWriter() - logRecord := &log4go.LogRecord{} - l.LogWrite(logRecord) // Void function. Testing for coverage. - l.Close() -} diff --git a/backend/log/filelogwriter.go b/backend/log/filelogwriter.go deleted file mode 100644 index 3fc3777..0000000 --- a/backend/log/filelogwriter.go +++ /dev/null @@ -1,33 +0,0 @@ -// Copyright 2014 The lime Authors. -// Use of this source code is governed by a 2-clause -// BSD-style license that can be found in the LICENSE file. - -package log - -import ( - "github.com/limetext/log4go" -) - -type ( - fileLogWriter struct { - logWriter - writer *log4go.FileLogWriter - } -) - -func NewFileLogWriter(fname string, rotate bool) *fileLogWriter { - ret := &fileLogWriter{ - writer: log4go.NewFileLogWriter(fname, rotate), - } - return ret -} - -// Implement LogWriter - -func (l *fileLogWriter) LogWrite(rec *log4go.LogRecord) { - l.writer.LogWrite(rec) -} - -func (l *fileLogWriter) Close() { - l.writer.Close() -} diff --git a/backend/log/filelogwriter_test.go b/backend/log/filelogwriter_test.go deleted file mode 100644 index 56dc04c..0000000 --- a/backend/log/filelogwriter_test.go +++ /dev/null @@ -1,30 +0,0 @@ -// Copyright 2014 The lime Authors. -// Use of this source code is governed by a 2-clause -// BSD-style license that can be found in the LICENSE file. - -package log - -import ( - "github.com/limetext/log4go" - "os" - "testing" -) - -const logfn = "some file" - -func TestNewFileLogWriter(t *testing.T) { - l := NewFileLogWriter(logfn, true) - defer os.Remove(logfn) - if l == nil { - t.Error("NewFileLogWriter produced a nil") - } - l.Close() -} - -func TestFileLogWriterLogWrite(t *testing.T) { - l := NewFileLogWriter(logfn, true) - defer os.Remove(logfn) - logRecord := &log4go.LogRecord{} - l.LogWrite(logRecord) // Void function. Testing for coverage. - l.Close() -} diff --git a/backend/log/global.go b/backend/log/global.go deleted file mode 100644 index 178a043..0000000 --- a/backend/log/global.go +++ /dev/null @@ -1,68 +0,0 @@ -// Copyright 2014 The lime Authors. -// Use of this source code is governed by a 2-clause -// BSD-style license that can be found in the LICENSE file. - -package log - -import ( - "github.com/limetext/log4go" -) - -var ( - Global *Logger -) - -func init() { - log4go.Global.Close() - Global = &Logger{ - logger: log4go.Global, - } -} - -func AddFilter(name string, level Level, writer LogWriter) { - Global.AddFilter(name, level, writer) -} - -func Finest(arg0 interface{}, args ...interface{}) { - Global.Finest(arg0, args...) -} - -func Fine(arg0 interface{}, args ...interface{}) { - Global.Fine(arg0, args...) -} - -func Debug(arg0 interface{}, args ...interface{}) { - Global.Debug(arg0, args...) -} - -func Trace(arg0 interface{}, args ...interface{}) { - Global.Trace(arg0, args...) -} - -func Info(arg0 interface{}, args ...interface{}) { - Global.Info(arg0, args...) -} - -func Warn(arg0 interface{}, args ...interface{}) { - Global.Warn(arg0, args...) -} - -func Error(arg0 interface{}, args ...interface{}) { - Global.Error(arg0, args...) -} - -func Errorf(format string, args ...interface{}) { - Global.Errorf(format, args...) -} - -func Critical(arg0 interface{}, args ...interface{}) { - Global.Critical(arg0, args...) -} - -func Logf(level Level, format string, args ...interface{}) { - Global.Logf(level, format, args...) -} - -func Close(args ...interface{}) { - Global.Close(args...) -} diff --git a/backend/log/global_test.go b/backend/log/global_test.go deleted file mode 100644 index c030a46..0000000 --- a/backend/log/global_test.go +++ /dev/null @@ -1,22 +0,0 @@ -// Copyright 2014 The lime Authors. -// Use of this source code is governed by a 2-clause -// BSD-style license that can be found in the LICENSE file. - -package log - -import ( - "testing" -) - -func TestGlobalFunctions(t *testing.T) { - AddFilter("add filter", FINE, testlogger(func(str string) {})) - Finest("testing finest") - Fine("testing fine") - Debug("testing debug") - Trace("testing trace") - Warn("testing warn") - Error("testing error") - Critical("testing critical") - Logf(FINE, "testing logf") - Close("testing close") -} diff --git a/backend/log/level.go b/backend/log/level.go deleted file mode 100644 index c43dd74..0000000 --- a/backend/log/level.go +++ /dev/null @@ -1,20 +0,0 @@ -// Copyright 2014 The lime Authors. -// Use of this source code is governed by a 2-clause -// BSD-style license that can be found in the LICENSE file. - -package log - -type ( - Level int -) - -const ( - FINEST Level = iota - FINE - DEBUG - TRACE - INFO - WARNING - ERROR - CRITICAL -) diff --git a/backend/log/logger.go b/backend/log/logger.go deleted file mode 100644 index 975937a..0000000 --- a/backend/log/logger.go +++ /dev/null @@ -1,113 +0,0 @@ -// Copyright 2014 The lime Authors. -// Use of this source code is governed by a 2-clause -// BSD-style license that can be found in the LICENSE file. - -package log - -import ( - "github.com/limetext/log4go" -) - -type ( - Logger struct { - logger log4go.Logger - } -) - -func NewLogger() *Logger { - l := &Logger{ - logger: make(log4go.Logger), - } - return l -} - -func (l *Logger) AddFilter(name string, level Level, writer LogWriter) { - lvl := log4go.INFO - switch level { - case FINEST: - lvl = log4go.FINEST - case FINE: - lvl = log4go.FINE - case DEBUG: - lvl = log4go.DEBUG - case TRACE: - lvl = log4go.TRACE - case INFO: - lvl = log4go.INFO - case WARNING: - lvl = log4go.WARNING - case ERROR: - lvl = log4go.ERROR - case CRITICAL: - lvl = log4go.CRITICAL - default: - } - l.logger.AddFilter(name, lvl, writer) -} - -func (l *Logger) Finest(arg0 interface{}, args ...interface{}) { - l.logger.Finest(arg0, args...) -} - -func (l *Logger) Fine(arg0 interface{}, args ...interface{}) { - l.logger.Fine(arg0, args...) -} - -func (l *Logger) Debug(arg0 interface{}, args ...interface{}) { - l.logger.Debug(arg0, args...) -} - -func (l *Logger) Trace(arg0 interface{}, args ...interface{}) { - l.logger.Trace(arg0, args...) -} - -func (l *Logger) Info(arg0 interface{}, args ...interface{}) { - l.logger.Info(arg0, args...) -} - -func (l *Logger) Warn(arg0 interface{}, args ...interface{}) { - l.logger.Warn(arg0, args...) -} - -func (l *Logger) Error(arg0 interface{}, args ...interface{}) { - l.logger.Error(arg0, args...) -} - -func (l *Logger) Errorf(format string, args ...interface{}) { - l.Logf(ERROR, format, args...) -} - -func (l *Logger) Critical(arg0 interface{}, args ...interface{}) { - l.logger.Critical(arg0, args...) -} - -func (l *Logger) Logf(level Level, format string, args ...interface{}) { - lvl := log4go.INFO - switch level { - case FINEST: - lvl = log4go.FINEST - case FINE: - lvl = log4go.FINE - case DEBUG: - lvl = log4go.DEBUG - case TRACE: - lvl = log4go.TRACE - case INFO: - lvl = log4go.INFO - case WARNING: - lvl = log4go.WARNING - case ERROR: - lvl = log4go.ERROR - case CRITICAL: - lvl = log4go.CRITICAL - default: - } - l.logger.Logf(lvl, format, args...) -} - -func (l *Logger) Close(args ...interface{}) { - if len(args) > 0 { - l.Error(args) - } - l.logger.Close() -} diff --git a/backend/log/logger_test.go b/backend/log/logger_test.go deleted file mode 100644 index 315e585..0000000 --- a/backend/log/logger_test.go +++ /dev/null @@ -1,84 +0,0 @@ -// Copyright 2014 The lime Authors. -// Use of this source code is governed by a 2-clause -// BSD-style license that can be found in the LICENSE file. - -package log - -import ( - "github.com/limetext/log4go" - "sync" - "testing" - "time" -) - -type testlogger func(string) - -func (l testlogger) LogWrite(rec *log4go.LogRecord) { - l(rec.Message) -} - -func (l testlogger) Close() {} - -func TestGlobalLog(t *testing.T) { - var wg sync.WaitGroup - Global.Close() - Global.AddFilter("globaltest", FINEST, testlogger(func(str string) { - if str != "Testing: hello world" { - t.Errorf("got: %s", str) - } - wg.Done() - })) - wg.Add(1) - Info("Testing: %s %s", "hello", "world") - wg.Wait() -} - -func TestLogf(t *testing.T) { - l := NewLogger() - - // Log a message at each level. Because we cannot access the internals of the logger, - // we assume that this test succeeds if it does not cause an error (although we cannot - // actually look inside and see if the level was changed) - for _, test_lvl := range []Level{FINEST, FINE, DEBUG, TRACE, INFO, WARNING, ERROR, CRITICAL, 999} { - l.Logf(test_lvl, time.Now().String()) - } -} - -func TestClose(t *testing.T) { - l := NewLogger() - l.Close() - m := NewLogger() - m.Close("something wrong") -} - -func TestNewLogger(t *testing.T) { - l := NewLogger() - if l == nil { - t.Error("Returned a nil logger") - } -} - -func TestLogLevels(t *testing.T) { - l := NewLogger() - - // Again, because we cannot access the internals of log this will - // succeed as long there is no error - for _, test_lvl := range []Level{FINEST, FINE, DEBUG, TRACE, INFO, WARNING, ERROR, CRITICAL, 999} { - // Use a random-ish string (the current time) - l.AddFilter(time.Now().String(), test_lvl, testlogger(func(str string) {})) - } -} - -func TestLogFunctions(t *testing.T) { - l := NewLogger() - - l.Finest(time.Now().String()) - l.Fine(time.Now().String()) - l.Debug(time.Now().String()) - l.Trace(time.Now().String()) - l.Warn(time.Now().String()) - l.Error(time.Now().String()) - l.Errorf("%v", time.Now().String()) - l.Critical(time.Now().String()) - -} diff --git a/backend/log/logwriter.go b/backend/log/logwriter.go deleted file mode 100644 index b07969f..0000000 --- a/backend/log/logwriter.go +++ /dev/null @@ -1,56 +0,0 @@ -// Copyright 2014 The lime Authors. -// Use of this source code is governed by a 2-clause -// BSD-style license that can be found in the LICENSE file. - -package log - -import ( - . "github.com/limetext/lime/backend/util" - "github.com/limetext/log4go" - "sync" -) - -type ( - LogWriter interface { - log4go.LogWriter - } - - logWriter struct { - LogWriter - log chan string - handler func(string) - lock sync.Mutex - } -) - -func NewLogWriter(h func(string)) *logWriter { - ret := &logWriter{ - log: make(chan string, 100), - handler: h, - } - go ret.handle() - return ret -} - -func (l *logWriter) handle() { - for fl := range l.log { - l.handler(fl) - } -} - -// Implement LogWriter - -func (l *logWriter) LogWrite(rec *log4go.LogRecord) { - p := Prof.Enter("log") - defer p.Exit() - l.lock.Lock() - defer l.lock.Unlock() - fl := log4go.FormatLogRecord(log4go.FORMAT_DEFAULT, rec) - l.log <- fl -} - -func (l *logWriter) Close() { - l.lock.Lock() - defer l.lock.Unlock() - close(l.log) -} diff --git a/backend/log/logwriter_test.go b/backend/log/logwriter_test.go deleted file mode 100644 index 88b2281..0000000 --- a/backend/log/logwriter_test.go +++ /dev/null @@ -1,26 +0,0 @@ -// Copyright 2014 The lime Authors. -// Use of this source code is governed by a 2-clause -// BSD-style license that can be found in the LICENSE file. - -package log - -import ( - "fmt" - "github.com/limetext/log4go" - "testing" -) - -func TestNewLogWriter(t *testing.T) { - l := NewLogWriter(func(str string) {}) - if l == nil { - t.Error("NewLogWriter produced a nil") - } - l.Close() -} - -func TestLogWrite(t *testing.T) { - l := NewLogWriter(func(str string) { fmt.Print(str) }) - logRecord := &log4go.LogRecord{} - l.LogWrite(logRecord) // Void function. Testing for coverage. - l.Close() -} diff --git a/backend/packages/package.go b/backend/packages/package.go deleted file mode 100644 index 3ea89e0..0000000 --- a/backend/packages/package.go +++ /dev/null @@ -1,26 +0,0 @@ -// Copyright 2013 The lime Authors. -// Use of this source code is governed by a 2-clause -// BSD-style license that can be found in the LICENSE file. - -package packages - -type ( - Package interface { - // Returns the path of the package - Name() string - - // Depending on the implemented package - // returns useful data for python plugin is - // python files for setting is file content - Get() interface{} - - // Reloads package data - Reload() - } -) - -// This is useful when we are loading new plugin or -// scanning for user settings, snippets and etc we -// will add files which their suffix contains one of -// these keywords -var types = []string{"settings", "keymap"} diff --git a/backend/packages/packet.go b/backend/packages/packet.go deleted file mode 100644 index d8b6a65..0000000 --- a/backend/packages/packet.go +++ /dev/null @@ -1,98 +0,0 @@ -// Copyright 2013 The lime Authors. -// Use of this source code is governed by a 2-clause -// BSD-style license that can be found in the LICENSE file. - -package packages - -import ( - "encoding/json" - "github.com/limetext/lime/backend/loaders" - "github.com/limetext/lime/backend/log" - "io/ioutil" - "os" - "path/filepath" - "strings" -) - -type ( - // Packets are small Packages containing 1 file. - // Individual settings, keymaps, snippets, etc. are Packets - Packet struct { - path string - // the Packet content will be Unmarshal to this variable - // so on reload we know where we should unmarshal it again - marshalTo json.Unmarshaler - } - - // Useful for managing packets for plugins - // and loading user packets for editor - Packets []*Packet -) - -// Initializes new packet with specific path -func NewPacket(path string, marshal json.Unmarshaler) *Packet { - return &Packet{path, marshal} -} - -func (p *Packet) Name() string { - return p.path -} - -// Returns packet file data if any error occurred -// on reading file we will return nil -func (p *Packet) Get() interface{} { - e := []byte(`{}`) - if p.group() == "keymap" { - e = []byte(`[]`) - } - - if _, err := os.Stat(p.path); os.IsNotExist(err) { - log.Finest("%s doesn't exist yet", p.path) - return e - } - - d, err := ioutil.ReadFile(p.path) - if err != nil { - log.Errorf("Couldn't read file: %s", err) - return e - } - return d -} - -// Forces editor to load the packet again -func (p *Packet) FileChanged(name string) { - p.Load() -} - -func (p *Packet) Load() error { - return loaders.LoadJSON(p.Get().([]byte), p) -} - -func (p *Packet) MarshalTo() json.Unmarshaler { - return p.marshalTo -} - -func (p *Packet) UnmarshalJSON(data []byte) error { - return p.marshalTo.UnmarshalJSON(data) -} - -// Returns packet type(settings, commands, keymaps, ...) -func (p *Packet) group() string { - for _, key := range types { - if strings.Contains(filepath.Ext(p.Name()), key) { - return key - } - } - return "" -} - -// Returns Packets with specific type -func (p Packets) Filter(key string) Packets { - var pckts Packets - for _, pckt := range p { - if strings.Contains(filepath.Ext(pckt.Name()), key) { - pckts = append(pckts, pckt) - } - } - return pckts -} diff --git a/backend/packages/packet_test.go b/backend/packages/packet_test.go deleted file mode 100644 index cdf991c..0000000 --- a/backend/packages/packet_test.go +++ /dev/null @@ -1,84 +0,0 @@ -// Copyright 2014 The lime Authors. -// Use of this source code is governed by a 2-clause -// BSD-style license that can be found in the LICENSE file. - -package packages - -import ( - "io/ioutil" - "testing" -) - -func TestPacket(t *testing.T) { - tests := []struct { - path string - data string - }{ - { - "testdata/Vintage/Vintageous.sublime-settings", - "Testing packages", - }, - } - for i, test := range tests { - s := NewPacket(test.path, nil) - d, err := ioutil.ReadFile(test.path) - if err != nil { - t.Fatalf("Test %d: Can't read file: %s", i, err) - } - if d1 := s.Get().([]byte); string(d) != string(d1) { - t.Errorf("Test %d: Expected %v but, got %s", i, d, string(d1)) - } - if err := ioutil.WriteFile(test.path, []byte(test.data), 0644); err != nil { - t.Fatalf("Test %d: Can't write file: %s", i, err) - } - s.Load() - if d1 := s.Get().([]byte); test.data != string(d1) { - t.Errorf("Test %d: Expected %s but, got %s", i, test.data, string(d1)) - } - if err := ioutil.WriteFile(test.path, d, 0644); err != nil { - t.Fatalf("Test %d: Can't write back file: %s", i, err) - } - } -} - -func TestPackets(t *testing.T) { - test := struct { - pckts []string - expect map[string][]string - }{ - []string{ - "testdata/Default.sublime-settings", - "testdata/Vintage/Default.sublime-keymap", - "testdata/Vintage/Vintageous.sublime-settings", - }, - map[string][]string{ - "setting": { - "testdata/Default.sublime-settings", - "testdata/Vintage/Vintageous.sublime-settings", - }, - "keymap": { - "testdata/Vintage/Default.sublime-keymap", - }, - }, - } - - packets := Packets{} - for _, p := range test.pckts { - packets = append(packets, NewPacket(p, nil)) - } - for key, ns := range test.expect { - ps := packets.Filter(key) - for _, p := range ns { - found := false - for _, p1 := range ps { - if p == p1.Name() { - found = true - break - } - } - if !found { - t.Errorf("Expected to find %s in %s plugin packets", p, ps) - } - } - } -} diff --git a/backend/packages/plugin.go b/backend/packages/plugin.go deleted file mode 100644 index 3fe759b..0000000 --- a/backend/packages/plugin.go +++ /dev/null @@ -1,122 +0,0 @@ -// Copyright 2013 The lime Authors. -// Use of this source code is governed by a 2-clause -// BSD-style license that can be found in the LICENSE file. - -package packages - -import ( - "github.com/limetext/lime/backend/keys" - "github.com/limetext/lime/backend/log" - "github.com/limetext/text" - "os" - pt "path" - "strings" -) - -type ( - // Plugin is a Package type containing some files - // with specific suffix that could be interpreted by - // lime text api(currently python) and some - // settings, snippets, commands and etc as packets - Plugin struct { - text.HasSettings - keys.HasKeyBindings - path string - suffix string - files []os.FileInfo - defaultSettings *text.HasSettings - platformSettings *text.HasSettings - defaultBindings *keys.HasKeyBindings - } -) - -// Initializes a new plugin whith loading all of the -// settings, keymaps and etc. Suffix variable show's -// which file types we need for plugin for example if -// the plugin is written in python the suffix should -// be ".py". We will use this function at initialization -// to add user plugins and on new_plugin command -func NewPlugin(path string, suffix string) (p *Plugin) { - p = &Plugin{path: path, suffix: suffix} - p.defaultSettings = new(text.HasSettings) - p.platformSettings = new(text.HasSettings) - p.defaultBindings = new(keys.HasKeyBindings) - - p.Settings().SetParent(p.platformSettings) - p.platformSettings.Settings().SetParent(p.defaultSettings) - - p.KeyBindings().SetParent(p.defaultBindings) - return -} - -func (p *Plugin) Name() string { - return p.path -} - -// Returns slice of files with plugin suffix -// loaded at initialization -func (p *Plugin) Get() interface{} { - return p.files -} - -// On plugin reload we will scan for plugin files -// and packets in plugin path -func (p *Plugin) Reload() { - var files []os.FileInfo - log.Info("Reloading plugin %s", p.Name()) - f, err := os.Open(p.path) - if err != nil { - log.Errorf("Couldn't open dir: %s", err) - return - } - defer f.Close() - fi, err := f.Readdir(-1) - if err != nil { - log.Errorf("Couldn't read dir: %s", err) - return - } - for _, f := range fi { - if p.suffix != "" && strings.HasSuffix(f.Name(), p.suffix) { - files = append(files, f) - } - } - p.files = files -} - -// Scaning path for finding plugins that contain files -// whith specific suffix -func ScanPlugins(path string, suffix string) []*Plugin { - var plugins []*Plugin - f, err := os.Open(path) - if err != nil { - log.Warn(err) - return nil - } - defer f.Close() - dirs, err := f.Readdirnames(-1) - if err != nil { - log.Warn(err) - return nil - } - for _, dir := range dirs { - dir2 := pt.Join(path, dir) - f2, err := os.Open(dir2) - if err != nil { - log.Warn(err) - continue - } - defer f2.Close() - fi, err := f2.Readdir(-1) - if err != nil { - continue - } - for _, f := range fi { - fn := f.Name() - if strings.HasSuffix(fn, suffix) { - plugins = append(plugins, NewPlugin(dir2, suffix)) - break - } - } - } - return plugins -} diff --git a/backend/packages/plugin_test.go b/backend/packages/plugin_test.go deleted file mode 100644 index 4534785..0000000 --- a/backend/packages/plugin_test.go +++ /dev/null @@ -1,102 +0,0 @@ -// Copyright 2014 The lime Authors. -// Use of this source code is governed by a 2-clause -// BSD-style license that can be found in the LICENSE file. - -package packages - -import ( - "io/ioutil" - "os" - "testing" -) - -func TestPlugin(t *testing.T) { - tests := []struct { - path string - suffix string - files []string - }{ - { - "testdata/Vintage", - ".py", - []string{"action_cmds.py", "state.py", "transformers.py"}, - }, - } - for i, test := range tests { - p := NewPlugin(test.path, test.suffix) - p.Reload() - if p.Name() != test.path { - t.Errorf("Test %d: Expected plugin name %s but, got %s", i, test.path, p.Name()) - } - for _, f := range test.files { - found := false - for _, fi := range p.Get().([]os.FileInfo) { - if f == fi.Name() { - found = true - break - } - } - if !found { - t.Errorf("Test %d: Expected to find %s in %s plugin", i, f, p.Name()) - } - } - } -} - -func TestPluginReload(t *testing.T) { - p := NewPlugin("testdata/Closetag", ".vim") - if err := ioutil.WriteFile("testdata/Closetag/test.vim", []byte("testing"), 0644); err != nil { - t.Fatalf("Couldn't write file: %s", err) - } - p.Reload() - fi := p.Get().([]os.FileInfo) - found := false - for _, f := range fi { - if f.Name() == "test.vim" { - found = true - break - } - } - if !found { - t.Errorf("Expected to find test.vim file in %s", p.Name()) - } - os.Remove("testdata/Closetag/test.vim") -} - -func TestScanPlugins(t *testing.T) { - tests := []struct { - path string - suffix string - expect []string - }{ - { - "testdata/", - ".py", - []string{ - "testdata/Vintage", - }, - }, - { - "testdata/", - ".vim", - []string{ - "testdata/Closetag", - }, - }, - } - for i, test := range tests { - plugins := ScanPlugins(test.path, test.suffix) - for _, f := range test.expect { - found := false - for _, p := range plugins { - if f == p.Name() { - found = true - break - } - } - if !found { - t.Errorf("Test %d: Expected ScanPlugins find %s plugin", i, f) - } - } - } -} diff --git a/backend/packages/testdata/Closetag/closetag.vim b/backend/packages/testdata/Closetag/closetag.vim deleted file mode 100644 index acaa99f..0000000 --- a/backend/packages/testdata/Closetag/closetag.vim +++ /dev/null @@ -1,334 +0,0 @@ -" File: closetag.vim -" Summary: Functions and mappings to close open HTML/XML tags -" Uses: -- close matching open tag -" Author: Steven Mueller -" Last Modified: Tue May 24 13:29:48 PDT 2005 -" Version: 0.9.1 -" XXX - breaks if close attempted while XIM is in preedit mode -" TODO - allow usability as a global plugin - -" Add g:unaryTagsStack - always contains html tags settings -" and g:closetag_default_xml - user should define this to default to xml -" When a close is attempted but b:unaryTagsStack undefined, -" use b:closetag_html_style to determine if the file is to be treated -" as html or xml. Failing that, check the filetype for xml or html. -" Finally, default to g:closetag_html_style. -" If the file is html, let b:unaryTagsStack=g:unaryTagsStack -" otherwise, let b:unaryTagsStack="" -" TODO - make matching work for all comments -" -- kinda works now, but needs syn sync minlines to be very long -" -- Only check whether in syntax in the beginning, then store comment tags -" in the tagstacks to determine whether to move into or out of comment mode -" TODO - The new normal mode mapping clears recent messages with its , and -" it doesn't fix the null-undo issue for vim 5.7 anyway. -" TODO - make use of the following neat features: -" -- the ternary ?: operator -" -- :echomsg and :echoerr -" -- curly brace expansion for variables and function name definitions? -" -- check up on map \FuncName -" -" Description: -" This script eases redundant typing when writing html or xml files (even if -" you're very good with ctrl-p and ctrl-n :). Hitting ctrl-_ will initiate a -" search for the most recent open tag above that is not closed in the -" intervening space and then insert the matching close tag at the cursor. In -" normal mode, the close tag is inserted one character after cursor rather than -" at it, as if a had been used. This allows putting close tags at the -" ends of lines while in normal mode, but disallows inserting them in the -" first column. -" -" For HTML, a configurable list of tags are ignored in the matching process. -" By default, the following tags will not be matched and thus not closed -" automatically: area, base, br, dd, dt, hr, img, input, link, meta, and -" param. -" -" For XML, all tags must have a closing match or be terminated by />, as in -" . These empty element tags are ignored for matching. -" -" Comment checking is now handled by vim's internal syntax checking. If tag -" closing is initiated outside a comment, only tags outside of comments will -" be matched. When closing tags in comments, only tags within comments will -" be matched, skipping any non-commented out code (wee!). However, the -" process of determining the syntax ID of an arbitrary position can still be -" erroneous if a comment is not detected because the syntax highlighting is -" out of sync, or really slow if syn sync minlines is large. -" Set the b:closetag_disable_synID variable to disable this feature if you -" have really big chunks of comment in your code and closing tags is too slow. -" -" If syntax highlighting is not enabled, comments will not be handled very -" well. Commenting out HTML in certain ways may cause a "tag mismatch" -" message and no completion. For example, '' -" between the cursor and the most recent unclosed open tag above causes -" trouble. Properly matched well formed tags in comments don't cause a -" problem. -" -" Install: -" To use, place this file in your standard vim scripts directory, and source -" it while editing the file you wish to close tags in. If the filetype is not -" set or the file is some sort of template with embedded HTML, you may force -" HTML style tag matching by first defining the b:closetag_html_style buffer -" variable. Otherwise, the default is XML style tag matching. -" -" Example: -" :let b:closetag_html_style=1 -" :source ~/.vim/scripts/closetag.vim -" -" For greater convenience, load this script in an autocommand: -" :au Filetype html,xml,xsl source ~/.vim/scripts/closetag.vim -" -" Also, set noignorecase for html files or edit b:unaryTagsStack to match your -" capitalization style. You may set this variable before or after loading the -" script, or simply change the file itself. -" -" Configuration Variables: -" -" b:unaryTagsStack Buffer local string containing a whitespace -" seperated list of element names that should be -" ignored while finding matching closetags. Checking -" is done according to the current setting of the -" ignorecase option. -" -" b:closetag_html_style Define this (as with let b:closetag_html_style=1) -" and source the script again to set the -" unaryTagsStack to its default value for html. -" -" b:closetag_disable_synID Define this to disable comment checking if tag -" closing is too slow. This can be set or unset -" without having to source again. -" -" Changelog: -" May 24, 2005 Tuesday -" * Changed function names to be script-local to avoid conflicts with other -" scripts' stack implementations. -" -" June 07, 2001 Thursday -" * Added comment handling. Currently relies on synID, so if syn sync -" minlines is small, the chance for failure is high, but if minlines is -" large, tagclosing becomes rather slow... -" -" * Changed normal mode closetag mapping to use in insert mode -" rather than p in normal mode. This has 2 implications: -" - Tag closing no longer clobbers the unnamed register -" - When tag closing fails or finds no match, no longer adds to the undo -" buffer for recent vim 6.0 development versions. -" - However, clears the last message when closing tags in normal mode -" -" * Changed the closetag_html_style variable to be buffer-local rather than -" global. -" -" * Expanded documentation - -"------------------------------------------------------------------------------ -" User configurable settings -"------------------------------------------------------------------------------ - -" if html, don't close certain tags. Works best if ignorecase is set. -" otherwise, capitalize these elements according to your html editing style -if !exists("b:unaryTagsStack") || exists("b:closetag_html_style") - if &filetype == "html" || exists("b:closetag_html_style") - let b:unaryTagsStack="area base br dd dt hr img input link meta param" - else " for xsl and xsl - let b:unaryTagsStack="" - endif -endif - -" Has this already been loaded? -if exists("loaded_closetag") - finish -endif -let loaded_closetag=1 - -" set up mappings for tag closing -inoremap =GetCloseTag() -map a - -"------------------------------------------------------------------------------ -" Tag closer - uses the stringstack implementation below -"------------------------------------------------------------------------------ - -" Returns the most recent unclosed tag-name -" (ignores tags in the variable referenced by a:unaryTagsStack) -function! GetLastOpenTag(unaryTagsStack) - " Search backwards through the file line by line using getline() - " Overall strategy (moving backwards through the file from the cursor): - " Push closing tags onto a stack. - " On an opening tag, if the tag matches the stack top, discard both. - " -- if the tag doesn't match, signal an error. - " -- if the stack is empty, use this tag - let linenum=line(".") - let lineend=col(".") - 1 " start: cursor position - let first=1 " flag for first line searched - let b:TagStack="" " main stack of tags - let startInComment=s:InComment() - - let tagpat='' - " Search for: closing tags - while (linenum>0) - " Every time we see an end-tag, we push it on the stack. When we see an - " open tag, if the stack isn't empty, we pop it and see if they match. - " If no, signal an error. - " If yes, continue searching backwards. - " If stack is empty, return this open tag as the one that needs closing. - let line=getline(linenum) - if first - let line=strpart(line,0,lineend) - else - let lineend=strlen(line) - endif - let b:lineTagStack="" - let mpos=0 - let b:TagCol=0 - " Search the current line in the forward direction, pushing any tags - " onto a special stack for the current line - while (mpos > -1) - let mpos=matchend(line,tagpat) - if mpos > -1 - let b:TagCol=b:TagCol+mpos - let tag=matchstr(line,tagpat) - - if exists("b:closetag_disable_synID") || startInComment==s:InCommentAt(linenum, b:TagCol) - let b:TagLine=linenum - call s:Push(matchstr(tag,'[^<>]\+'),"b:lineTagStack") - endif - "echo "Tag: ".tag." ending at position ".mpos." in '".line."'." - let lineend=lineend-mpos - let line=strpart(line,mpos,lineend) - endif - endwhile - " Process the current line stack - while (!s:EmptystackP("b:lineTagStack")) - let tag=s:Pop("b:lineTagStack") - if match(tag, "^/") == 0 "found end tag - call s:Push(tag,"b:TagStack") - "echo linenum." ".b:TagStack - elseif s:EmptystackP("b:TagStack") && !s:Instack(tag, a:unaryTagsStack) "found unclosed tag - return tag - else - let endtag=s:Peekstack("b:TagStack") - if endtag == "/".tag || endtag == "/" - call s:Pop("b:TagStack") "found a open/close tag pair - "echo linenum." ".b:TagStack - elseif !s:Instack(tag, a:unaryTagsStack) "we have a mismatch error - echohl Error - echon "\rError:" - echohl None - echo " tag mismatch: <".tag."> doesn't match <".endtag.">. (Line ".linenum." Tagstack: ".b:TagStack.")" - return "" - endif - endif - endwhile - let linenum=linenum-1 | let first=0 - endwhile - " At this point, we have exhausted the file and not found any opening tag - echo "No opening tags." - return "" -endfunction - -" Returns closing tag for most recent unclosed tag, respecting the -" current setting of b:unaryTagsStack for tags that should not be closed -function! GetCloseTag() - if !exists("b:unaryTagsStack") || exists("b:closetag_html_style") - if &filetype == "html" || exists("b:closetag_html_style") - let b:unaryTagsStack="area base br dd dt hr img input link meta param" - else " for xsl and xsl - let b:unaryTagsStack="" - endif - endif - let tag=GetLastOpenTag("b:unaryTagsStack") - if tag == "" - return "" - else - return "" - endif -endfunction - -" return 1 if the cursor is in a syntactically identified comment field -" (fails for empty lines: always returns not-in-comment) -function! s:InComment() - return synIDattr(synID(line("."), col("."), 0), "name") =~ 'Comment' -endfunction - -" return 1 if the position specified is in a syntactically identified comment field -function! s:InCommentAt(line, col) - return synIDattr(synID(a:line, a:col, 0), "name") =~ 'Comment' -endfunction - -"------------------------------------------------------------------------------ -" String Stacks -"------------------------------------------------------------------------------ -" These are strings of whitespace-separated elements, matched using the \< and -" \> patterns after setting the iskeyword option. -" -" The sname argument should contain a symbolic reference to the stack variable -" on which method should operate on (i.e., sname should be a string containing -" a fully qualified (ie: g:, b:, etc) variable name.) - -" Helper functions -function! s:SetKeywords() - let g:IsKeywordBak=&iskeyword - let &iskeyword="33-255" -endfunction - -function! s:RestoreKeywords() - let &iskeyword=g:IsKeywordBak -endfunction - -" Push el onto the stack referenced by sname -function! s:Push(el, sname) - if !s:EmptystackP(a:sname) - exe "let ".a:sname."=a:el.' '.".a:sname - else - exe "let ".a:sname."=a:el" - endif -endfunction - -" Check whether the stack is empty -function! s:EmptystackP(sname) - exe "let stack=".a:sname - if match(stack,"^ *$") == 0 - return 1 - else - return 0 - endif -endfunction - -" Return 1 if el is in stack sname, else 0. -function! s:Instack(el, sname) - exe "let stack=".a:sname - call s:SetKeywords() - let m=match(stack, "\\<".a:el."\\>") - call s:RestoreKeywords() - if m < 0 - return 0 - else - return 1 - endif -endfunction - -" Return the first element in the stack -function! s:Peekstack(sname) - call s:SetKeywords() - exe "let stack=".a:sname - let top=matchstr(stack, "\\<.\\{-1,}\\>") - call s:RestoreKeywords() - return top -endfunction - -" Remove and return the first element in the stack -function! s:Pop(sname) - if s:EmptystackP(a:sname) - echo "Error! Stack ".a:sname." is empty and can't be popped." - return "" - endif - exe "let stack=".a:sname - " Find the first space, loc is 0-based. Marks the end of 1st elt in stack. - call s:SetKeywords() - let loc=matchend(stack,"\\<.\\{-1,}\\>") - exe "let ".a:sname."=strpart(stack, loc+1, strlen(stack))" - let top=strpart(stack, match(stack, "\\<"), loc) - call s:RestoreKeywords() - return top -endfunction - -function! s:Clearstack(sname) - exe "let ".a:sname."=''" -endfunction diff --git a/backend/packages/testdata/Default.sublime-keymap b/backend/packages/testdata/Default.sublime-keymap deleted file mode 100644 index 82cefed..0000000 --- a/backend/packages/testdata/Default.sublime-keymap +++ /dev/null @@ -1,5 +0,0 @@ -[ - { "keys": ["i"], "command": "test1", "context": [{ "key": "test1" }] }, - { "keys": ["i"], "command": "test2", "context": [{ "key": "test2" }] }, - { "keys": ["i"], "command": "test3", "context": [{ "key": "test3" }] }, -] diff --git a/backend/packages/testdata/Vintage/Default.sublime-commands b/backend/packages/testdata/Vintage/Default.sublime-commands deleted file mode 100644 index 1ddff64..0000000 --- a/backend/packages/testdata/Vintage/Default.sublime-commands +++ /dev/null @@ -1,3 +0,0 @@ -[ - { "caption": "Vintageous: Run Tests...", "command": "show_vintageous_test_suites" } -] \ No newline at end of file diff --git a/backend/packages/testdata/Vintage/Default.sublime-keymap b/backend/packages/testdata/Vintage/Default.sublime-keymap deleted file mode 100644 index fb99adf..0000000 --- a/backend/packages/testdata/Vintage/Default.sublime-keymap +++ /dev/null @@ -1,240 +0,0 @@ -// -// Basic rule to add new key bindings: -// -// Given two identical 'keys', the last one wins, even if its context is less strict. -// - -[ - { "keys": ["escape"], "command": "set_action", "args": {"action": "vi_esc"}, "context": [{"key": "vi_must_change_mode"}, {"key": "vi_is_buffer"}] }, - - { "keys": ["R"], "command": "set_action", "args": {"action": "vi_enter_replace_mode"}, "context": [{"key": "vi_mode_normal"}, {"key": "vi_is_buffer"}] }, - - { "keys": ["i"], "command": "set_action", "args": {"action": "vi_enter_insert_mode"}, "context": [{"key": "setting.command_mode"}, {"key": "vi_mode_visual_any", "operand": false}] }, - - // This allows insertions such as 5ifoobar\n. Macros help with this, but we should prevent the user from - // requesting a macro recording until after is pressed. TODO: Maybe create a context like "vi_in_normal_insert_mode"? - { "keys": ["i"], "command": "vi_enter_normal_insert_mode", "context": [{"key": "setting.command_mode"}, {"key": "vi_has_motion_count"}] }, - { "keys": ["a"], "command": "set_action", "args": {"action": "vi_a"}, "context": [{"key": "setting.command_mode"}, {"key": "vi_mode_visual_any", "operand": false}] }, - - { "keys": ["h"], "command": "set_motion", "args": {"motion": "vi_h"}, "context": [{"key": "vi_mode_normal_or_visual"}] }, - { "keys": ["j"], "command": "set_motion", "args": {"motion": "vi_j"}, "context": [{"key": "setting.command_mode"}] }, - { "keys": ["k"], "command": "set_motion", "args": {"motion": "vi_k"}, "context": [{"key": "setting.command_mode"}] }, - { "keys": ["l"], "command": "set_motion", "args": {"motion": "vi_l"}, "context": [{"key": "vi_mode_normal_or_visual"}] }, - - { "keys": ["down"], "command": "set_motion", "args": {"motion": "vi_j"}, "context": [{"key": "setting.command_mode"}] }, - { "keys": ["up"], "command": "set_motion", "args": {"motion": "vi_k"}, "context": [{"key": "setting.command_mode"}] }, - - { "keys": ["left"], "command": "set_motion", "args": {"motion": "vi_h"}, "context": [{"key": "vi_mode_normal_or_visual"}] }, - { "keys": ["right"], "command": "set_motion", "args": {"motion": "vi_l"}, "context": [{"key": "vi_mode_normal_or_visual"}] }, - - { "keys": ["w"], "command": "set_motion", "args": {"motion": "vi_w"}, "context": [{"key": "vi_mode_normal_or_visual"}] }, - { "keys": ["e"], "command": "set_motion", "args": {"motion": "vi_e"}, "context": [{"key": "vi_mode_normal_or_visual"}] }, - { "keys": ["b"], "command": "set_motion", "args": {"motion": "vi_b"}, "context": [{"key": "vi_mode_normal_or_visual"}] }, - - { "keys": ["W"], "command": "set_motion", "args": {"motion": "vi_big_w"}, "context": [{"key": "vi_mode_normal_or_visual"}] }, - { "keys": ["E"], "command": "set_motion", "args": {"motion": "vi_big_e"}, "context": [{"key": "vi_mode_normal_or_visual"}] }, - { "keys": ["B"], "command": "set_motion", "args": {"motion": "vi_big_b"}, "context": [{"key": "vi_mode_normal_or_visual"}] }, - - { "keys": ["$"], "command": "set_motion", "args": {"motion": "vi_dollar"}, "context": [{"key": "vi_mode_normal_or_visual"}] }, - { "keys": ["_"], "command": "set_motion", "args": {"motion": "vi_underscore"}, "context": [{"key": "vi_mode_normal_or_visual"}] }, - { "keys": ["^"], "command": "set_motion", "args": {"motion": "vi_underscore"}, "context": [{"key": "vi_mode_normal_or_visual"}] }, - - { "keys": ["{"], "command": "set_motion", "args": {"motion": "vi_left_brace"}, "context": [{"key": "vi_mode_normal_or_any_visual"}] }, - { "keys": ["}"], "command": "set_motion", "args": {"motion": "vi_right_brace"}, "context": [{"key": "vi_mode_normal_or_any_visual"}] }, - - { "keys": ["("], "command": "set_motion", "args": {"motion": "vi_left_parenthesis"}, "context": [{"key": "vi_mode_normal_or_visual"}] }, - { "keys": [")"], "command": "set_motion", "args": {"motion": "vi_right_parenthesis"}, "context": [{"key": "vi_mode_normal_or_visual"}] }, - - { "keys": ["I"], "command": "set_action", "args": {"action": "vi_big_i"}, "context": [{"key": "setting.command_mode"}] }, - { "keys": ["A"], "command": "set_action", "args": {"action": "vi_big_a"}, "context": [{"key": "setting.command_mode"}] }, - - { "keys": ["G"], "command": "set_motion", "args": {"motion": "vi_big_g"}, "context": [{"key": "setting.command_mode"}] }, - { "keys": ["%"], "command": "set_motion", "args": {"motion": "vi_percent"}, "context": [{"key": "setting.command_mode"}] }, - - // TODO: They don't work in VISUALLINEMODE. - { "keys": ["H"], "command": "set_motion", "args": {"motion": "vi_big_h"}, "context": [{"key": "setting.command_mode"}] }, - { "keys": ["M"], "command": "set_motion", "args": {"motion": "vi_big_m"}, "context": [{"key": "setting.command_mode"}] }, - { "keys": ["L"], "command": "set_motion", "args": {"motion": "vi_big_l"}, "context": [{"key": "setting.command_mode"}] }, - - { "keys": ["*"], "command": "set_motion", "args": {"motion": "vi_star"}, "context": [{"key": "setting.command_mode"}] }, - { "keys": ["#"], "command": "set_motion", "args": {"motion": "vi_octothorp"}, "context": [{"key": "setting.command_mode"}] }, - - // TODO: Do the same as for ESC and fold all v commands into a single one. - { "keys": ["v"], "command": "set_action", "args": {"action": "vi_enter_visual_mode"}, "context": [{"key": "vi_mode_normal"}, {"key": "vi_can_enter_any_visual_mode"}] }, - { "keys": ["v"], "command": "set_action", "args": {"action": "vi_enter_normal_mode"}, "context": [{"key": "vi_mode_visual"}] }, - { "keys": ["v"], "command": "set_action", "args": {"action": "vi_enter_visual_mode"}, "context": [{"key": "vi_mode_visual_line"}] }, - - { "keys": ["V"], "command": "set_action", "args": {"action": "vi_enter_visual_line_mode"}, "context": [{"key": "setting.command_mode"}, {"key": "vi_can_enter_any_visual_mode"}] }, - { "keys": ["V"], "command": "set_action", "args": {"action": "vi_enter_normal_mode"}, "context": [{"key": "vi_mode_visual_line"}] }, - - - { "keys": ["1"], "command": "vi_push_digit", "args": {"digit": "1"}, "context": [{"key": "vi_mode_can_push_digit"}, {"key": "setting.command_mode"}] }, - { "keys": ["2"], "command": "vi_push_digit", "args": {"digit": "2"}, "context": [{"key": "vi_mode_can_push_digit"}, {"key": "setting.command_mode"}] }, - { "keys": ["3"], "command": "vi_push_digit", "args": {"digit": "3"}, "context": [{"key": "vi_mode_can_push_digit"}, {"key": "setting.command_mode"}] }, - { "keys": ["4"], "command": "vi_push_digit", "args": {"digit": "4"}, "context": [{"key": "vi_mode_can_push_digit"}, {"key": "setting.command_mode"}] }, - { "keys": ["5"], "command": "vi_push_digit", "args": {"digit": "5"}, "context": [{"key": "vi_mode_can_push_digit"}, {"key": "setting.command_mode"}] }, - { "keys": ["6"], "command": "vi_push_digit", "args": {"digit": "6"}, "context": [{"key": "vi_mode_can_push_digit"}, {"key": "setting.command_mode"}] }, - { "keys": ["7"], "command": "vi_push_digit", "args": {"digit": "7"}, "context": [{"key": "vi_mode_can_push_digit"}, {"key": "setting.command_mode"}] }, - { "keys": ["8"], "command": "vi_push_digit", "args": {"digit": "8"}, "context": [{"key": "vi_mode_can_push_digit"}, {"key": "setting.command_mode"}] }, - { "keys": ["9"], "command": "vi_push_digit", "args": {"digit": "9"}, "context": [{"key": "vi_mode_can_push_digit"}, {"key": "setting.command_mode"}] }, - { "keys": ["0"], "command": "vi_push_digit", "args": {"digit": "0"}, "context": [{"key": "vi_mode_can_push_digit"}, {"key": "setting.command_mode"}] }, - - { "keys": ["0"], "command": "set_motion", "args": {"motion": "vi_zero"}, "context": [{"key": "setting.command_mode"}, {"key": "vi_mode_cannot_push_zero"}] }, - - // ** Actions ** - - // This one is run directly so we don't overwrite the command we want repeated. - { "keys": ["."], "command": "_vi_repeat", "context": [{"key": "setting.command_mode"}]}, - - // In Vim, u only works in NORMALMODE. - // TODO: Does it take counts? - { "keys": ["u"], "command": "_vi_undo", "context": [{"key": "vi_mode_normal"}] }, - // TODO: implement counts for redo and make it go through all the normal machinery. - { "keys": ["ctrl+r"], "command": "redo", "context": [{"key": "vi_mode_normal"}, {"key": "vi_use_ctrl_keys"}] }, - - // TODO: Do we really want to use the built-in jump list? Do we have are own? - { "keys": ["ctrl+o"], "command": "jump_back", "context": [{"key": "vi_mode_normal"}, {"key": "vi_use_ctrl_keys"}] }, - { "keys": ["ctrl+i"], "command": "jump_forward", "context": [{"key": "vi_mode_normal"}, {"key": "vi_use_ctrl_keys"}] }, - - // Ctrl+f in Vim cannot be used as a motion for an action. - { "keys": ["ctrl+f"], "command": "set_motion", "args": {"motion": "vi_ctrl_f"}, "context": [{"key": "vi_mode_normal_or_any_visual"}, {"key": "vi_use_ctrl_keys"}] }, - { "keys": ["ctrl+b"], "command": "set_motion", "args": {"motion": "vi_ctrl_b"}, "context": [{"key": "vi_mode_normal_or_any_visual"}, {"key": "vi_use_ctrl_keys"}] }, - - { "keys": ["d"], "command": "set_action", "args": {"action": "vi_d"}, "context": [{"key": "setting.command_mode"}] }, - { "keys": ["s"], "command": "set_action", "args": {"action": "vi_s"}, "context": [{"key": "setting.command_mode"}] }, - { "keys": ["S"], "command": "set_action", "args": {"action": "vi_big_s"}, "context": [{"key": "setting.command_mode"}] }, - { "keys": ["c"], "command": "set_action", "args": {"action": "vi_c"}, "context": [{"key": "setting.command_mode"}] }, - { "keys": ["C"], "command": "set_action", "args": {"action": "vi_big_c"}, "context": [{"key": "setting.command_mode"}] }, - - { "keys": ["o"], "command": "set_action", "args": {"action": "vi_o"}, "context": [{"key": "setting.command_mode"}] }, - { "keys": ["O"], "command": "set_action", "args": {"action": "vi_big_o"}, "context": [{"key": "setting.command_mode"}] }, - - { "keys": ["J"], "command": "set_action", "args": {"action": "vi_big_j"}, "context": [{"key": "setting.command_mode"}] }, - - // This is a fake action that allows gg to be issued. - { "keys": ["g"], "command": "set_action", "args": {"action": "vi_g_action"}, "context": [{"key": "setting.command_mode"}] }, - - // gg can either be an action or a motion. It's a motion when there's a true action primed. - // TODO: Improve this. XXX This is obsolete? - { "keys": ["g", "g"], "command": "set_motion", "args": {"motion": "vi_gg"}, "context": [{"key": "vi_has_action"}] }, - - { "keys": ["D"], "command": "set_action", "args": {"action": "vi_big_d"}, "context": [{"key": "setting.command_mode"}] }, - - // gg can either be an action or a motion. It's an action when there is no actual action. - { "keys": ["g"], "command": "set_action", "args": {"action": "vi_gg"}, "context": [{"key": "setting.command_mode"}, {"key": "vi_has_incomplete_action"}] }, - { "keys": ["d"], "command": "set_action", "args": {"action": "vi_g_d"}, "context": [{"key": "setting.command_mode"}, {"key": "vi_has_incomplete_action"}] }, - { "keys": ["D"], "command": "set_action", "args": {"action": "vi_g_big_d"}, "context": [{"key": "setting.command_mode"}, {"key": "vi_has_incomplete_action"}] }, - - { "keys": ["U"], "command": "set_action", "args": {"action": "vi_g_big_u"}, "context": [{"key": "setting.command_mode"}, {"key": "vi_has_incomplete_action"}] }, - { "keys": ["u"], "command": "set_action", "args": {"action": "vi_g_u"}, "context": [{"key": "setting.command_mode"}, {"key": "vi_has_incomplete_action"}] }, - { "keys": ["q"], "command": "set_action", "args": {"action": "vi_g_q"}, "context": [{"key": "setting.command_mode"}, {"key": "vi_has_incomplete_action"}] }, - { "keys": ["*"], "command": "set_action", "args": {"action": "vi_g_star"}, "context": [{"key": "setting.command_mode"}, {"key": "vi_has_incomplete_action"}] }, - { "keys": ["#"], "command": "set_action", "args": {"action": "vi_g_octothorp"}, "context": [{"key": "setting.command_mode"}, {"key": "vi_has_incomplete_action"}] }, - { "keys": ["v"], "command": "set_action", "args": {"action": "vi_g_v"}, "context": [{"key": "vi_mode_normal"}, {"key": "vi_has_incomplete_action"}] }, - - { "keys": ["U"], "command": "set_action", "args": {"action": "vi_big_u"}, "context": [{"key": "vi_mode_visual_any"}] }, - { "keys": ["u"], "command": "set_action", "args": {"action": "vi_u"}, "context": [{"key": "vi_mode_visual_any"}] }, - - { "keys": ["="], "command": "set_action", "args": {"action": "vi_equals"}, "context": [{"key": "vi_mode_normal_or_any_visual"}] }, - - // These come after the ones above so we don't need extra context checks. - { "keys": ["o"], "command": "set_action", "args": {"action": "vi_visual_o"}, "context": [{"key": "vi_mode_visual_any"}] }, - - { "keys": ["y"], "command": "set_action", "args": {"action": "vi_y"}, "context": [{"key": "setting.command_mode"}] }, - { "keys": ["x"], "command": "set_action", "args": {"action": "vi_x"}, "context": [{"key": "setting.command_mode"}] }, - // FIXME: X behaves linewise in visual mode. The following command is wrong at the moment. - { "keys": ["X"], "command": "set_action", "args": {"action": "vi_big_x"}, "context": [{"key": "setting.command_mode"}] }, - - { "keys": ["Y"], "command": "set_action", "args": {"action": "vi_yy"}, "context": [{"key": "setting.command_mode"}] }, - - { "keys": ["p"], "command": "set_action", "args": {"action": "vi_p"}, "context": [{"key": "setting.command_mode"}] }, - { "keys": ["P"], "command": "set_action", "args": {"action": "vi_big_p"}, "context": [{"key": "setting.command_mode"}] }, - - // TODO: Restrict this to when there's no count, action or motion. - { "keys": ["\""], "command": "set_register", "context": [{"key": "setting.command_mode"}] }, - { "keys": [""], "command": "set_register", "context": [{"key": "setting.command_mode", "key": "vi_state_expecting_register"}] }, - - // Twofold process: First set the motion, then collect user input and run global state. - { "keys": ["f"], "command": "vi_f", "context": [{"key": "vi_mode_normal"}] }, - { "keys": ["f"], "command": "vi_f", "context": [{"key": "vi_mode_visual"}] }, - // TODO: Is the following key binding needed? - { "keys": [""], "command": "vi_f", "context": [{"key": "setting.command_mode", "key": "vi_state_expecting_user_input"}] }, - - { "keys": ["m"], "command": "vi_m", "context": [{"key": "vi_mode_normal_or_visual"}] }, - { "keys": ["'"], "command": "vi_quote", "context": [{"key": "vi_mode_normal_or_visual"}] }, - - // Repeats f - { "keys": [","], "command": "set_motion", "args":{"motion": "vi_comma"}, "context": [{"key": "vi_mode_normal"}] }, - { "keys": [","], "command": "set_motion", "args":{"motion": "vi_comma"}, "context": [{"key": "vi_mode_visual"}] }, - - // Repeats f backward - { "keys": [";"], "command": "set_motion", "args":{"motion": "vi_semicolon"}, "context": [{"key": "vi_mode_normal"}] }, - { "keys": [";"], "command": "set_motion", "args":{"motion": "vi_semicolon"}, "context": [{"key": "vi_mode_visual"}] }, - - // Twofold process: First set the motion, then collect user input and run global state. - { "keys": ["t"], "command": "vi_t", "context": [{"key": "vi_mode_normal"},] }, - { "keys": ["t"], "command": "vi_t", "context": [{"key": "vi_mode_visual"},] }, - - // Twofold process: First set the motion, then collect user input and run global state. - { "keys": ["T"], "command": "vi_big_t", "context": [{"key": "vi_mode_normal"}] }, - { "keys": ["T"], "command": "vi_big_t", "context": [{"key": "vi_mode_visual"}] }, - - // Twofold process: First set the motion, then collect user input and run global state. - { "keys": ["F"], "command": "vi_big_f", "context": [{"key": "vi_mode_normal"}] }, - { "keys": ["F"], "command": "vi_big_f", "context": [{"key": "vi_mode_visual"}] }, - - { "keys": ["/"], "command": "vi_buffer_search", "context": [{"key": "setting.command_mode"}] }, - { "keys": ["?"], "command": "vi_buffer_reverse_search", "context": [{"key": "setting.command_mode"}] }, - - { "keys": ["n"], "command": "set_motion", "args": {"motion": "vi_n"}, "context": [{"key": "setting.command_mode"}] }, - { "keys": ["N"], "command": "set_motion", "args": {"motion": "vi_big_n"}, "context": [{"key": "setting.command_mode"}] }, - - // Twofold process: First set the motion, then collect user input and run global state. - // Text objects like di". - // TODO: This naming is utterly confusing: There's a vi_i function and a ViI command. Change this. - { "keys": ["i"], "command": "vi_i", "args": {"inclusive": false}, "context": [{"key": "vi_mode_normal"}, {"key": "vi_has_action"}] }, - { "keys": ["i"], "command": "vi_i", "args": {"inclusive": false}, "context": [{"key": "vi_mode_visual"},] }, - - // Twofold process: First set the motion, then collect user input and run global state. - // Text objects like da". - // TODO: This naming is utterly confusing: There's a vi_a function and a ViA command. Change this. - { "keys": ["a"], "command": "vi_i", "args": {"inclusive": true}, "context": [{"key": "vi_mode_normal"}, {"key": "vi_has_action"}] }, - { "keys": ["a"], "command": "vi_i", "args": {"inclusive": true}, "context": [{"key": "vi_mode_visual"},] }, - - { "keys": ["r"], "command": "vi_r", "context": [{"key": "vi_mode_normal"}, {"key": "vi_mode_normal"}] }, - - { "keys": [">"], "command": "set_action", "args": {"action": "vi_lambda"}, "context": [{"key": "setting.command_mode"}] }, - { "keys": ["<"], "command": "set_action", "args": {"action": "vi_antilambda"}, "context": [{"key": "setting.command_mode"}] }, - - // This is a fake action that allows zz to be issued. - // Ordering matters: To avoid conflicts with t and possibly other key bindings with less restrictive contexts, place these after them. - { "keys": ["z"], "command": "set_action", "args": {"action": "vi_z_action"}, "context": [{"key": "setting.command_mode"}] }, - { "keys": ["enter"], "command": "set_action", "args": {"action": "vi_z_enter"}, "context": [{"key": "setting.command_mode"}, {"key": "vi_has_incomplete_action"}] }, - { "keys": ["-"], "command": "set_action", "args": {"action": "vi_z_minus"}, "context": [{"key": "setting.command_mode"}, {"key": "vi_has_incomplete_action"}] }, - { "keys": ["z"], "command": "set_action", "args": {"action": "vi_zz"}, "context": [{"key": "setting.command_mode"}, {"key": "vi_has_incomplete_action"}] }, - { "keys": ["b"], "command": "set_action", "args": {"action": "vi_z_b"}, "context": [{"key": "setting.command_mode"}, {"key": "vi_has_incomplete_action"}] }, - { "keys": ["t"], "command": "set_action", "args": {"action": "vi_z_t"}, "context": [{"key": "setting.command_mode"}, {"key": "vi_has_incomplete_action"}] }, - - { "keys": ["q"], "command": "vi_q", "context": [{"key": "setting.command_mode"}] }, - { "keys": ["q"], "command": "_vi_q", "context": [{"key": "vi_is_recording_macro"}] }, - - { "keys": ["@"], "command": "vi_at", "context": [{"key": "vi_mode_normal"}] }, - - // Pane management - { "keys": ["ctrl+w"], "command": "set_action", "args": {"action": "vi_ctrl_w_action"}, "context": [{"key": "setting.command_mode"}]}, - { "keys": ["ctrl+v"], "command": "set_action", "args": {"action": "vi_ctrl_w_v"}, "context": [{"key": "setting.command_mode"}, {"key": "vi_has_incomplete_action"}]}, - // FIXME: This one interferes with g,v, so disable this one for now. We need a notion of "keybinding namespace". - // { "keys": ["v"], "command": "set_action", "args": {"action": "vi_ctrl_w_v"}, "context": [{"key": "setting.command_mode"}, {"key": "vi_has_incomplete_action"}]}, - - // TODO: Simplify the logic needed to make the expression register work in INSERTMODE. - { "keys": ["ctrl+r"], "command": "set_action", "args": {"action": "vi_ctrl_r_action"}, "context": [{"key": "vi_use_ctrl_keys"}, {"key": "setting.command_mode", "operator": "equal", "operand": false}]}, - { "keys": ["="], "command": "set_action", "args": {"action": "vi_ctrl_r_equals"}, "context": [{"key": "setting.command_mode"}, {"key": "vi_has_incomplete_action"}]}, - - { "keys": ["ctrl+a"], "command": "set_action", "args": {"action": "vi_ctrl_a"}, "context": [{"key": "vi_use_ctrl_keys"}, {"key": "setting.command_mode"}]}, - { "keys": ["ctrl+x"], "command": "set_action", "args": {"action": "vi_ctrl_x"}, "context": [{"key": "vi_use_ctrl_keys"}, {"key": "setting.command_mode"}]}, - - - // Collects user input for commands such as t, f, T, F. - // XXX: Seems to need to come after every other key binding so it will catch every character. Investigate this. - { "keys": [""], "command": "collect_user_input", "context": [{"key": "setting.command_mode", "key": "vi_state_expecting_user_input"}] }, -] diff --git a/backend/packages/testdata/Vintage/Vintageous.sublime-settings b/backend/packages/testdata/Vintage/Vintageous.sublime-settings deleted file mode 100644 index 08e809e..0000000 --- a/backend/packages/testdata/Vintage/Vintageous.sublime-settings +++ /dev/null @@ -1,8 +0,0 @@ -{ - // If true, debug information will be printed to the console. - "vintageous_verbose": false, - - // If true, some key bindings prefaced by the CTRL modifier will override default Sublime Text - // key bindings. - "vintageous_use_ctrl_keys": false -} \ No newline at end of file diff --git a/backend/packages/testdata/Vintage/action_cmds.py b/backend/packages/testdata/Vintage/action_cmds.py deleted file mode 100644 index 38f52a4..0000000 --- a/backend/packages/testdata/Vintage/action_cmds.py +++ /dev/null @@ -1,803 +0,0 @@ -import sublime -import sublime_plugin - -from Vintageous.state import IrreversibleTextCommand -from Vintageous.state import VintageState -from Vintageous.vi import utils -from Vintageous.vi.constants import _MODE_INTERNAL_NORMAL -from Vintageous.vi.constants import MODE_INSERT -from Vintageous.vi.constants import MODE_NORMAL -from Vintageous.vi.constants import MODE_VISUAL -from Vintageous.vi.constants import MODE_VISUAL_LINE -from Vintageous.vi.constants import regions_transformer -from Vintageous.vi.registers import REG_EXPRESSION - - -class ViEditAtEol(sublime_plugin.TextCommand): - def run(self, edit, extend=False): - state = VintageState(self.view) - state.enter_insert_mode() - - self.view.run_command('collapse_to_direction') - - sels = list(self.view.sel()) - self.view.sel().clear() - - new_sels = [] - for s in sels: - hard_eol = self.view.line(s.b).end() - new_sels.append(sublime.Region(hard_eol, hard_eol)) - - for s in new_sels: - self.view.sel().add(s) - - -class ViEditAfterCaret(sublime_plugin.TextCommand): - def run(self, edit, extend=False): - state = VintageState(self.view) - state.enter_insert_mode() - - visual = self.view.has_non_empty_selection_region() - - sels = list(self.view.sel()) - self.view.sel().clear() - - new_sels = [] - for s in sels: - if visual: - new_sels.append(sublime.Region(s.end(), s.end())) - else: - if not utils.is_at_eol(self.view, s): - new_sels.append(sublime.Region(s.end() + 1, s.end() + 1)) - else: - new_sels.append(sublime.Region(s.end(), s.end())) - - for s in new_sels: - self.view.sel().add(s) - - -class _vi_big_i(sublime_plugin.TextCommand): - def run(self, edit, extend=False): - def f(view, s): - line = view.line(s.b) - pt = utils.next_non_white_space_char(view, line.a) - return sublime.Region(pt, pt) - - state = VintageState(self.view) - state.enter_insert_mode() - - regions_transformer(self.view, f) - - -class ViPaste(sublime_plugin.TextCommand): - def run(self, edit, register=None, count=1): - state = VintageState(self.view) - - if register: - fragments = state.registers[register] - else: - # TODO: There should be a simpler way of getting the unnamed register's content. - fragments = state.registers['"'] - if not fragments: - print("Vintageous: Nothing in register \".") - # XXX: This won't ever be printed because it will be overwritten by other status - # messages printed right after this one. - sublime.status_message("Vintageous: Nothing in register \".") - return - - sels = list(self.view.sel()) - - if len(sels) == len(fragments): - sel_frag = zip(sels, fragments) - else: - sel_frag = zip(sels, [fragments[0],] * len(sels)) - - offset = 0 - for s, text in sel_frag: - text = self.prepare_fragment(text) - if text.startswith('\n'): - if utils.is_at_eol(self.view, s) or utils.is_at_bol(self.view, s): - self.paste_all(edit, s, self.view.line(s.b).b, text, count) - else: - self.paste_all(edit, s, self.view.line(s.b - 1).b, text, count) - else: - # XXX: Refactor this whole class. It's getting out of hand. - if self.view.substr(s.b) == '\n': - self.paste_all(edit, s, s.b + offset, text, count) - else: - self.paste_all(edit, s, s.b + offset + 1, text, count) - offset += len(text) * count - - def prepare_fragment(self, text): - if text.endswith('\n') and text != '\n': - text = '\n' + text[0:-1] - return text - - # TODO: Improve this signature. - def paste_all(self, edit, sel, at, text, count): - state = VintageState(self.view) - if state.mode not in (MODE_VISUAL, MODE_VISUAL_LINE): - # TODO: generate string first, then insert? - # Make sure we can paste at EOF. - at = at if at <= self.view.size() else self.view.size() - for x in range(count): - self.view.insert(edit, at, text) - else: - if text.startswith('\n'): - text = text * count - if not text.endswith('\n'): - text = text + '\n' - else: - text = text * count - - if state.mode == MODE_VISUAL_LINE: - if text.startswith('\n'): - text = text[1:] - - self.view.replace(edit, sel, text) - - -class ViPasteBefore(sublime_plugin.TextCommand): - def run(self, edit, register=None, count=1): - state = VintageState(self.view) - - if register: - fragments = state.registers[register] - else: - # TODO: There should be a simpler way of getting the unnamed register's content. - fragments = state.registers['"'] - - sels = list(self.view.sel()) - - if len(sels) == len(fragments): - sel_frag = zip(sels, fragments) - else: - sel_frag = zip(sels, [fragments[0],] * len(sels)) - - offset = 0 - for s, text in sel_frag: - if text.endswith('\n'): - if utils.is_at_eol(self.view, s) or utils.is_at_bol(self.view, s): - self.paste_all(edit, s, self.view.line(s.b).a, text, count) - else: - self.paste_all(edit, s, self.view.line(s.b - 1).a, text, count) - else: - self.paste_all(edit, s, s.b + offset, text, count) - offset += len(text) * count - - def paste_all(self, edit, sel, at, text, count): - # for x in range(count): - # self.view.insert(edit, at, text) - state = VintageState(self.view) - if state.mode not in (MODE_VISUAL, MODE_VISUAL_LINE): - for x in range(count): - self.view.insert(edit, at, text) - else: - if text.endswith('\n'): - text = text * count - if not text.startswith('\n'): - text = '\n' + text - else: - text = text * count - self.view.replace(edit, sel, text) - - -class ViEnterNormalMode(sublime_plugin.TextCommand): - def run(self, edit): - state = VintageState(self.view) - - if state.mode == MODE_VISUAL: - state.store_visual_selections() - - self.view.run_command('collapse_to_direction') - self.view.run_command('dont_stay_on_eol_backward') - state.enter_normal_mode() - - -class ViEnterNormalModeFromInsertMode(sublime_plugin.TextCommand): - def run(self, edit): - sels = list(self.view.sel()) - self.view.sel().clear() - - new_sels = [] - for s in sels: - if s.a <= s.b: - if (self.view.line(s.a).a != s.a): - new_sels.append(sublime.Region(s.a - 1, s.a - 1)) - else: - new_sels.append(sublime.Region(s.a, s.a)) - else: - new_sels.append(s) - - for s in new_sels: - self.view.sel().add(s) - - state = VintageState(self.view) - state.enter_normal_mode() - self.view.window().run_command('hide_auto_complete') - - -class ViEnterInsertMode(sublime_plugin.TextCommand): - def run(self, edit): - state = VintageState(self.view) - state.enter_insert_mode() - self.view.run_command('collapse_to_direction') - - -class ViEnterVisualMode(sublime_plugin.TextCommand): - def run(self, edit): - state = VintageState(self.view) - state.enter_visual_mode() - self.view.run_command('extend_to_minimal_width') - - -class ViEnterVisualLineMode(sublime_plugin.TextCommand): - def run(self, edit): - state = VintageState(self.view) - state.enter_visual_line_mode() - - -class ViEnterReplaceMode(sublime_plugin.TextCommand): - def run(self, edit): - state = VintageState(self.view) - state.enter_replace_mode() - self.view.run_command('collapse_to_direction') - state.reset() - - -class SetAction(IrreversibleTextCommand): - def __init__(self, view): - IrreversibleTextCommand.__init__(self, view) - - def run(self, action): - state = VintageState(self.view) - state.action = action - state.eval() - - -class SetMotion(IrreversibleTextCommand): - def __init__(self, view): - IrreversibleTextCommand.__init__(self, view) - - def run(self, motion): - state = VintageState(self.view) - state.motion = motion - state.eval() - - -class ViPushDigit(sublime_plugin.TextCommand): - def run(self, edit, digit): - state = VintageState(self.view) - if not (state.action or state.motion): - state.push_motion_digit(digit) - elif state.action: - state.push_action_digit(digit) - - -class ViReverseCaret(sublime_plugin.TextCommand): - def run(self, edit): - sels = list(self.view.sel()) - self.view.sel().clear() - - new_sels = [] - for s in sels: - new_sels.append(sublime.Region(s.b, s.a)) - - for s in new_sels: - self.view.sel().add(s) - - -class ViEnterNormalInsertMode(sublime_plugin.TextCommand): - def run(self, edit): - state = VintageState(self.view) - state.enter_normal_insert_mode() - - # FIXME: We can't repeat 5ifoo - self.view.run_command('mark_undo_groups_for_gluing') - # ...User types text... - - -class ViRunNormalInsertModeActions(sublime_plugin.TextCommand): - def run(self, edit): - state = VintageState(self.view) - # We've recorded what the user has typed into the buffer. Turn macro recording off. - self.view.run_command('glue_marked_undo_groups') - - # FIXME: We can't repeat 5ifoo after we're done. - for i in range(state.count - 1): - self.view.run_command('repeat') - - # Ensure the count will be deleted. - state.mode = MODE_NORMAL - # Delete the count now. - state.reset() - - self.view.run_command('vi_enter_normal_mode_from_insert_mode') - - -class SetRegister(sublime_plugin.TextCommand): - def run(self, edit, character=None): - state = VintageState(self.view) - if character is None: - state.expecting_register = True - else: - if character not in (REG_EXPRESSION,): - state.register = character - state.expecting_register = False - else: - self.view.run_command('vi_expression_register') - - -class ViExpressionRegister(sublime_plugin.TextCommand): - def run(self, edit, insert=False, next_mode=None): - def on_done(s): - state = VintageState(self.view) - try: - rv = [str(eval(s, None, None)),] - if not insert: - # TODO: We need to sort out the values received and sent to registers. When pasting, - # we assume a list... This should be encapsulated in Registers. - state.registers[REG_EXPRESSION] = rv - else: - self.view.run_command('insert_snippet', {'contents': str(rv[0])}) - state.reset() - except: - sublime.status_message("Vintageous: Invalid expression.") - on_cancel() - - def on_cancel(): - state = VintageState(self.view) - state.reset() - - self.view.window().show_input_panel('', '', on_done, None, on_cancel) - - -class ViR(sublime_plugin.TextCommand): - def run(self, edit, character=None): - state = VintageState(self.view) - if character is None: - state.action = 'vi_r' - state.expecting_user_input = True - else: - state.user_input = character - state.expecting_user_input= False - state.eval() - - -class ViM(sublime_plugin.TextCommand): - def run(self, edit, character=None): - state = VintageState(self.view) - state.action = 'vi_m' - state.expecting_user_input = True - - -class _vi_m(sublime_plugin.TextCommand): - def run(self, edit, character=None): - state = VintageState(self.view) - state.marks.add(character, self.view) - - -class ViQuote(sublime_plugin.TextCommand): - def run(self, edit, character=None): - state = VintageState(self.view) - state.motion = 'vi_quote' - state.expecting_user_input = True - - -class _vi_quote(sublime_plugin.TextCommand): - def run(self, edit, mode=None, character=None, extend=False): - def f(view, s): - if mode == MODE_VISUAL: - if s.a <= s.b: - if address.b < s.b: - return sublime.Region(s.a + 1, address.b) - else: - return sublime.Region(s.a, address.b) - else: - return sublime.Region(s.a + 1, address.b) - elif mode == MODE_NORMAL: - return address - elif mode == _MODE_INTERNAL_NORMAL: - return sublime.Region(s.a, address.b) - - return s - - state = VintageState(self.view) - address = state.marks.get_as_encoded_address(character) - - if address is None: - return - - if isinstance(address, str): - if not address.startswith(' - self.view.run_command(address.split(' ')[1][:-1]) - return - - # This is a motion in a composite command. - regions_transformer(self.view, f) - - -class ViF(sublime_plugin.TextCommand): - def run(self, edit, character=None): - state = VintageState(self.view) - if character is None: - state.motion = 'vi_f' - state.expecting_user_input = True - else: - # FIXME: Dead code? - state.user_input = character - state.expecting_user_input= False - state.eval() - - -class ViT(IrreversibleTextCommand): - def __init__(self, view): - IrreversibleTextCommand.__init__(self, view) - - # XXX: Compare to ViBigF. - def run(self, character=None): - state = VintageState(self.view) - if character is None: - state.motion = 'vi_t' - state.expecting_user_input = True - else: - state.user_input = character - state.expecting_user_input= False - state.eval() - - -class ViBigT(IrreversibleTextCommand): - def __init__(self, view): - IrreversibleTextCommand.__init__(self, view) - - # XXX: Compare to ViBigF. - def run(self, character=None): - state = VintageState(self.view) - if character is None: - state.motion = 'vi_big_t' - state.expecting_user_input = True - else: - state.user_input = character - state.expecting_user_input= False - state.eval() - - -class ViBigF(IrreversibleTextCommand): - def __init__(self, view): - IrreversibleTextCommand.__init__(self, view) - - def run(self): - state = VintageState(self.view) - state.motion = 'vi_big_f' - state.expecting_user_input = True - - -class ViI(IrreversibleTextCommand): - def __init__(self, view): - IrreversibleTextCommand.__init__(self, view) - - def run(self, inclusive=False): - state = VintageState(self.view) - if inclusive: - state.motion = 'vi_inclusive_text_object' - else: - state.motion = 'vi_exclusive_text_object' - state.expecting_user_input = True - - -class CollectUserInput(IrreversibleTextCommand): - def __init__(self, view): - IrreversibleTextCommand.__init__(self, view) - - def run(self, character=None): - state = VintageState(self.view) - state.user_input = character - state.expecting_user_input= False - state.eval() - - -class _vi_z_enter(IrreversibleTextCommand): - def __init__(self, view): - IrreversibleTextCommand.__init__(self, view) - - def run(self): - first_sel = self.view.sel()[0] - current_row = self.view.rowcol(first_sel.b)[0] - 1 - - topmost_visible_row, _ = self.view.rowcol(self.view.visible_region().a) - - self.view.run_command('scroll_lines', {'amount': (topmost_visible_row - current_row)}) - - -class _vi_z_minus(IrreversibleTextCommand): - def __init__(self, view): - IrreversibleTextCommand.__init__(self, view) - - def run(self): - first_sel = self.view.sel()[0] - current_row = self.view.rowcol(first_sel.b)[0] - - bottommost_visible_row, _ = self.view.rowcol(self.view.visible_region().b) - - number_of_lines = (bottommost_visible_row - current_row) - 1 - - if number_of_lines > 1: - self.view.run_command('scroll_lines', {'amount': number_of_lines}) - - -class _vi_zz(IrreversibleTextCommand): - def __init__(self, view): - IrreversibleTextCommand.__init__(self, view) - - def run(self): - first_sel = self.view.sel()[0] - current_row = self.view.rowcol(first_sel.b)[0] - - topmost_visible_row, _ = self.view.rowcol(self.view.visible_region().a) - bottommost_visible_row, _ = self.view.rowcol(self.view.visible_region().b) - - middle_row = (topmost_visible_row + bottommost_visible_row) / 2 - - self.view.run_command('scroll_lines', {'amount': (middle_row - current_row)}) - - -class _vi_r(sublime_plugin.TextCommand): - def run(self, edit, character=None, mode=None): - if mode == _MODE_INTERNAL_NORMAL: - for s in self.view.sel(): - self.view.replace(edit, s, character * s.size()) - - -class _vi_undo(IrreversibleTextCommand): - """Once the latest vi command has been undone, we might be left with non-empty selections. - This is due to the fact that Vintageous defines selections in a separate step to the actual - command running. For example, v,e,d,u would undo the deletion operation and restore the - selection that v,e had created. - - Assuming that after an undo we're back in normal mode, we can take for granted that any leftover - selections must be destroyed. I cannot think of any situation where Vim would have to restore - selections after *u*, but it may well happen under certain circumstances I'm not aware of. - - Note 1: We are also relying on Sublime Text to restore the v or V selections existing at the - time the edit command was run. This seems to be safe, but we're blindly relying on it. - - Note 2: Vim knows the position the caret was in before creating the visual selection. In - Sublime Text we lose that information (at least it doesn't seem to be straightforward to - obtain). - """ - # !!! This is a special command that does not go through the usual processing. !!! - # !!! It must skip the undo stack. !!! - - # TODO: It must be possible store or retrieve the actual position of the caret before the - # visual selection performed by the user. - def run(self): - # We define our own transformer here because we want to handle undo as a special case. - # TODO: I don't know if it needs to be an special case in reality. - def f(view, s): - # Compensates the move issued below. - if s.a < s.b : - return sublime.Region(s.a + 1, s.a + 1) - else: - return sublime.Region(s.a, s.a) - - state = VintageState(self.view) - for i in range(state.count): - self.view.run_command('undo') - - if self.view.has_non_empty_selection_region(): - regions_transformer(self.view, f) - # !! HACK !! ///////////////////////////////////////////////////////// - # This is a hack to work around an issue in Sublime Text: - # When undoing in normal mode, Sublime Text seems to prime a move by chars - # forward that has never been requested by the user or Vintageous. - # As far as I can tell, Vintageous isn't at fault here, but it seems weird - # to think that Sublime Text is wrong. - self.view.run_command('move', {'by': 'characters', 'forward': False}) - # //////////////////////////////////////////////////////////////////// - - state.update_xpos() - # Ensure that we wipe the count, if any. - state.reset() - - -class _vi_repeat(IrreversibleTextCommand): - """Vintageous manages the repeat operation on its own to ensure that we always use the latest - modifying command, instead of being tied to the undo stack (as Sublime Text is by default). - """ - - # !!! This is a special command that does not go through the usual processing. !!! - # !!! It must skip the undo stack. !!! - - def run(self): - state = VintageState(self.view) - - try: - cmd, args, _ = state.repeat_command - except TypeError: - # Unreachable. - return - - if not cmd: - return - elif cmd == 'vi_run': - args['next_mode'] = MODE_NORMAL - args['follow_up_mode'] = 'vi_enter_normal_mode' - args['count'] = state.count * args['count'] - self.view.run_command(cmd, args) - elif cmd == 'sequence': - for i, _ in enumerate(args['commands']): - # Access this shape: {"commands":[['vi_run', {"foo": 100}],...]} - args['commands'][i][1]['next_mode'] = MODE_NORMAL - args['commands'][i][1]['follow_up_mode'] = 'vi_enter_normal_mode' - - # TODO: Implement counts properly for 'sequence' command. - for i in range(state.count): - self.view.run_command(cmd, args) - - # Ensure we wipe count data if any. - state.reset() - # XXX: Needed here? Maybe enter_... type commands should be IrreversibleCommands so we - # must/can call them whenever we need them withouth affecting the undo stack. - self.view.run_command('vi_enter_normal_mode') - - -class _vi_ctrl_w_v_action(sublime_plugin.TextCommand): - def run(self, edit): - self.view.window().run_command('new_pane', {}) - - -class Sequence(sublime_plugin.TextCommand): - """Required so that mark_undo_groups_for_gluing and friends work. - """ - def run(self, edit, commands): - for cmd, args in commands: - self.view.run_command(cmd, args) - - # XXX: Sequence is a special case in that it doesn't run through vi_run, so we need to - # ensure the next mode is correct. Maybe we can improve this by making it more similar to - # regular commands? - state = VintageState(self.view) - state.enter_normal_mode() - - -class _vi_big_j(sublime_plugin.TextCommand): - def run(self, edit, mode=None): - def f(view, s): - if mode == _MODE_INTERNAL_NORMAL: - full_current_line = view.full_line(s.b) - target = full_current_line.b - 1 - full_next_line = view.full_line(full_current_line.b) - two_lines = sublime.Region(full_current_line.a, full_next_line.b) - - # Text without \n. - first_line_text = view.substr(view.line(full_current_line.a)) - next_line_text = view.substr(full_next_line) - - if len(next_line_text) > 1: - next_line_text = next_line_text.lstrip() - - sep = '' - if first_line_text and not first_line_text.endswith(' '): - sep = ' ' - - view.replace(edit, two_lines, first_line_text + sep + next_line_text) - - if first_line_text: - return sublime.Region(target, target) - return s - else: - return s - - regions_transformer(self.view, f) - - -class _vi_ctrl_a(sublime_plugin.TextCommand): - def run(self, edit, count=1, mode=None): - def f(view, s): - if mode == _MODE_INTERNAL_NORMAL: - word = view.word(s.a) - new_digit = int(view.substr(word)) + count - view.replace(edit, word, str(new_digit)) - - return s - - if mode != _MODE_INTERNAL_NORMAL: - return - - # TODO: Deal with octal, hex notations. - # TODO: Improve detection of numbers. - # TODO: Find the next numeric word in the line if none is found under the caret. - words = [self.view.substr(self.view.word(s)) for s in self.view.sel()] - if not all([w.isdigit() for w in words]): - utils.blink() - return - - regions_transformer(self.view, f) - - -class _vi_ctrl_x(sublime_plugin.TextCommand): - def run(self, edit, count=1, mode=None): - def f(view, s): - if mode == _MODE_INTERNAL_NORMAL: - word = view.word(s.a) - new_digit = int(view.substr(word)) - count - view.replace(edit, word, str(new_digit)) - - return s - - if mode != _MODE_INTERNAL_NORMAL: - return - - # TODO: Deal with octal, hex notations. - # TODO: Improve detection of numbers. - # TODO: Find the next numeric word in the line if none is found under the caret. - words = [self.view.substr(self.view.word(s)) for s in self.view.sel()] - if not all([w.isdigit() for w in words]): - utils.blink() - return - - regions_transformer(self.view, f) - - -class _vi_g_v(IrreversibleTextCommand): - def run(self): - # Assume normal mode. - regs = (self.view.get_regions('vi_visual_selections') or - list(self.view.sel())) - - self.view.sel().clear() - for r in regs: - self.view.sel().add(r) - - -class ViQ(IrreversibleTextCommand): - def run(self): - state = VintageState(self.view) - state.action = 'vi_q' - state.expecting_user_input = True - - -class _vi_q(IrreversibleTextCommand): - def run(self, name=None): - state = VintageState(self.view) - - if name == None and not state.is_recording: - return - - if not state.is_recording: - state._latest_macro_name = name - state.is_recording = True - self.view.run_command('start_record_macro') - return - - if state.is_recording: - self.view.run_command('stop_record_macro') - state.is_recording = False - state.reset() - - # Store the macro away. - modifying_cmd = self.view.command_history(0, True) - state.latest_macro = modifying_cmd - - -class _vi_run_macro(IrreversibleTextCommand): - def run(self, name=None): - if not (name and VintageState(self.view).latest_macro): - return - - if name == '@': - # Run the macro recorded latest. - self.view.run_command('run_macro') - else: - # TODO: Implement macro registers. - self.view.run_command('run_command') - - -class ViAt(IrreversibleTextCommand): - def run(self): - state = VintageState(self.view) - state.action = 'vi_at' - state.expecting_user_input = True diff --git a/backend/packages/testdata/Vintage/state.py b/backend/packages/testdata/Vintage/state.py deleted file mode 100644 index f14abbb..0000000 --- a/backend/packages/testdata/Vintage/state.py +++ /dev/null @@ -1,758 +0,0 @@ -import sublime -import sublime_plugin - -import threading - -from Vintageous.vi import actions -from Vintageous.vi import constants -from Vintageous.vi import motions -from Vintageous.vi import registers -from Vintageous.vi import utils -from Vintageous.vi.cmd_data import CmdData -from Vintageous.vi.constants import _MODE_INTERNAL_NORMAL -from Vintageous.vi.constants import ACTIONS_EXITING_TO_INSERT_MODE -from Vintageous.vi.constants import DIGRAPH_MOTION -from Vintageous.vi.constants import digraphs -from Vintageous.vi.constants import MODE_INSERT -from Vintageous.vi.constants import MODE_NORMAL -from Vintageous.vi.constants import MODE_NORMAL_INSERT -from Vintageous.vi.constants import MODE_REPLACE -from Vintageous.vi.constants import mode_to_str -from Vintageous.vi.constants import MODE_VISUAL -from Vintageous.vi.constants import MODE_VISUAL_LINE -from Vintageous.vi.contexts import KeyContext -from Vintageous.vi.marks import Marks -from Vintageous.vi.registers import Registers -from Vintageous.vi.settings import SettingsManager -from Vintageous.vi.settings import SublimeSettings -from Vintageous.vi.settings import VintageSettings - - -# Some commands gather user input through input panels. An input panel is just a view, so when it -# closes, the previous view gets activated and, consequently, Vintageous init code runs. However, -# if we're exiting from an input panel, we most likely want the global state to remain unchanged. -# This variable helps to signal this. For example, see the 'ViBufferSearch' command. -# -# XXX: Make this a class-level attribute of VintageState (had some trouble with it last time I tried). -# XXX Is there anything weird with ST and using class-level attributes from different modules? -_dont_reset_during_init = False - - -def _init_vintageous(view): - """Initialize global data. Runs at startup and every time a view gets activated. - """ - global _dont_reset_during_init - - # Abort if we didn't get a real view. - if (not getattr(view, 'settings', None) or - view.settings().get('is_widget')): - return - - if _dont_reset_during_init: - # We are probably coming from an input panel, like when using '/'. We don't want to reset - # the global state, as it main contain data needed to complete the command that's being - # built. - _dont_reset_during_init = False - return - - state = VintageState(view) - - if state.mode in (MODE_VISUAL, MODE_VISUAL_LINE): - view.run_command('enter_normal_mode') - elif state.mode in (MODE_INSERT, MODE_REPLACE): - view.run_command('vi_enter_normal_mode_from_insert_mode') - elif state.mode == MODE_NORMAL_INSERT: - view.run_command('vi_run_normal_insert_mode_actions') - else: - # XXX: When is this run? Only at startup? - state.enter_normal_mode() - - state.reset() - - -# TODO: Test me. -def plugin_loaded(): - view = sublime.active_window().active_view() - _init_vintageous(view) - - -# TODO: Test me. -def unload_handler(): - for w in sublime.windows(): - for v in w.views(): - v.settings().set('command_mode', False) - v.settings().set('inverse_caret_state', False) - v.settings().set('vintage', {}) - - -class VintageState(object): - """ Stores per-view state using View.Settings() for storage. - """ - - registers = Registers() - context = KeyContext() - marks = Marks() - macros = {} - - # Let's imitate Sublime Text's .command_history() 'null' value. - _latest_repeat_command = ('', None, 0) - - # Stores the latest recorded macro. - _latest_macro = None - _is_recording = False - - def __init__(self, view): - self.view = view - # We have two types of settings: vi-specific (settings.vi) and regular ST view settings - # (settings.view). - self.settings = SettingsManager(self.view) - - def enter_normal_mode(self): - self.settings.view['command_mode'] = True - self.settings.view['inverse_caret_state'] = True - # Xpos must be updated every time we return to normal mode, because it doesn't get - # updated while in insert mode. - self.xpos = None if not self.view.sel() else self.view.rowcol(self.view.sel()[0].b)[1] - - if self.view.overwrite_status(): - self.view.set_overwrite_status(False) - - # Clear regions outlined by buffer search commands. - self.view.erase_regions('vi_search') - - if not self.buffer_was_changed_in_visual_mode(): - # We've been in some visual mode, but we haven't modified the buffer at all. - self.view.run_command('unmark_undo_groups_for_gluing') - else: - # Either we haven't been in any visual mode or we've modified the buffer while in - # any visual mode. - self.view.run_command('glue_marked_undo_groups') - - self.mode = MODE_NORMAL - - def enter_visual_line_mode(self): - self.mode = MODE_VISUAL_LINE - - def enter_insert_mode(self): - self.settings.view['command_mode'] = False - self.settings.view['inverse_caret_state'] = False - self.mode = MODE_INSERT - - def enter_visual_mode(self): - self.mode = MODE_VISUAL - - def enter_normal_insert_mode(self): - # This is the mode we enter when we give i a count, as in 5ifoobar. - self.mode = MODE_NORMAL_INSERT - self.settings.view['command_mode'] = False - self.settings.view['inverse_caret_state'] = False - - def enter_replace_mode(self): - self.mode = MODE_REPLACE - self.settings.view['command_mode'] = False - self.settings.view['inverse_caret_state'] = False - self.view.set_overwrite_status(True) - - def store_visual_selections(self): - self.view.add_regions('vi_visual_selections', list(self.view.sel())) - - def buffer_was_changed_in_visual_mode(self): - """Returns `True` if we've changed the buffer while in visual mode. - """ - # XXX: What if we used view.is_dirty() instead? That should be simpler? - # XXX: If we can be sure that every modifying command will leave the buffer in a dirty - # state, we could go for this solution. - - # 'maybe_mark_undo_groups_for_gluing' and 'glue_marked_undo_groups' seem to add an entry - # to the undo stack regardless of whether intervening modifying-commands have been - # issued. - # - # Example: - # 1) We enter visual mode by pressing 'v'. - # 2) We exit visual mode by pressing 'v' again. - # - # Since before the first 'v' and after the second we've called the aforementioned commands, - # respectively, we'd now have a new (useless) entry in the undo stack, and the redo stack - # would be empty. This would be undesirable, so we need to find out whether marked groups - # in visual mode actually need to be glued or not and act based on that information. - - # FIXME: Design issue. This method won't work always. We have actions like yy that - # will make this method return true, while it should return False (since yy isn't a - # modifying command). However, yy signals in its own way that it's a non-modifying command. - # I don't think this redundancy will cause any bug, but we need to unify nevetheless. - - if self.mode == MODE_VISUAL: - visual_cmd = 'vi_enter_visual_mode' - elif self.mode == MODE_VISUAL_LINE: - visual_cmd = 'vi_enter_visual_line_mode' - else: - return True - - cmds = [] - # Set an upper limit to look-ups in the undo stack. - for i in range(0, -249, -1): - cmd_name, args, _ = self.view.command_history(i) - if (cmd_name == 'vi_run' and args['action'] and - args['action']['command'] == visual_cmd): - break - - # Sublime Text returns ('', None, 0) when we hit the undo stack's bottom. - if not cmd_name: - break - - cmds.append((cmd_name, args)) - - # If we have an action between v..v calls (or visual line), we have modified the buffer - # (most of the time, anyway, there are exceptions that we're not covering here). - # TODO: Cover exceptions too, like yy (non-modifying command, though has the shape of a - # modifying command). - was_modifed = [name for (name, data) in cmds - if data and data.get('action')] - - return bool(was_modifed) - - @property - def mode(self): - """The current mode. - """ - return self.settings.vi['mode'] - - @mode.setter - def mode(self, value): - self.settings.vi['mode'] = value - - @property - def cancel_action(self): - """Returns `True` if the current action must be cancelled. - """ - # If we can't find a suitable action, we should cancel. - return self.settings.vi['cancel_action'] - - @cancel_action.setter - def cancel_action(self, value): - self.settings.vi['cancel_action'] = value - - @property - def action(self): - """Command's action; must be the name of a function in the `actions` module. - """ - return self.settings.vi['action'] - - @action.setter - def action(self, name): - action = self.settings.vi['action'] - target = 'action' - - # Check for digraphs like cc, dd, yy. - if action and name: - name, type_ = digraphs.get((action, name), ('', None)) - # Some motion digraphs are captured as actions, but need to be stored as motions - # instead so that the vi command is evaluated correctly. - if type_ == DIGRAPH_MOTION: - target = 'motion' - self.settings.vi['action'] = None - - # Avoid recursion. The .reset() method will try to set this property to None, not ''. - if name == '': - # The chord is invalid, so notify that we need to cancel the command in .eval(). - self.cancel_action = True - return - - self.settings.vi[target] = name - - @property - def motion(self): - """Command's motion; must be the name of a function in the `motions` module. - """ - return self.settings.vi['motion'] - - @motion.setter - def motion(self, name): - self.settings.vi['motion'] = name - - @property - def motion_digits(self): - """Count for the motion, like in 3k. - """ - return self.settings.vi['motion_digits'] or [] - - @motion_digits.setter - def motion_digits(self, value): - self.settings.vi['motion_digits'] = value - - def push_motion_digit(self, value): - digits = self.settings.vi['motion_digits'] - if not digits: - self.settings.vi['motion_digits'] = [value] - return - digits.append(value) - self.settings.vi['motion_digits'] = digits - - @property - def action_digits(self): - """Count for the action, as in 3dd. - """ - return self.settings.vi['action_digits'] or [] - - @action_digits.setter - def action_digits(self, value): - self.settings.vi['action_digits'] = value - - def push_action_digit(self, value): - digits = self.settings.vi['action_digits'] - if not digits: - self.settings.vi['action_digits'] = [value] - return - digits.append(value) - self.settings.vi['action_digits'] = digits - - @property - def count(self): - """Computes and returns the final count, defaulting to 1 if the user - didn't provide one. - """ - motion_count = self.motion_digits and int(''.join(self.motion_digits)) or 1 - action_count = self.action_digits and int(''.join(self.action_digits)) or 1 - - return (motion_count * action_count) - - @property - def user_provided_count(self): - """Returns the actual count provided by the user, which may be `None`. - """ - if not (self.motion_digits or self.action_digits): - return None - - return self.count - - @property - def expecting_register(self): - """Signals that we need more input from the user before evaluating the global data. - """ - return self.settings.vi['expecting_register'] - - @expecting_register.setter - def expecting_register(self, value): - self.settings.vi['expecting_register'] = value - - @property - def register(self): - """Name of the register provided by the user, as in "ayy. - """ - return self.settings.vi['register'] or None - - @register.setter - def register(self, name): - # TODO: Check for valid register name. - self.settings.vi['register'] = name - self.expecting_register = False - - @property - def expecting_user_input(self): - """Signals that we need more input from the user before evaluating the global data. - """ - return self.settings.vi['expecting_user_input'] - - @expecting_user_input.setter - def expecting_user_input(self, value): - self.settings.vi['expecting_user_input'] = value - - @property - def user_input(self): - """Additional data provided by the user, as 'a' in @a. - """ - return self.settings.vi['user_input'] or None - - @user_input.setter - def user_input(self, value): - self.settings.vi['user_input'] = value - self.expecting_user_input = False - - @property - def last_buffer_search(self): - """Returns the latest buffer search string or `None`. Used by the n and N commands. - """ - return self.settings.vi['last_buffer_search'] or None - - @last_buffer_search.setter - def last_buffer_search(self, value): - self.settings.vi['last_buffer_search'] = value - - @property - def last_character_search(self): - """Returns the latest character search or `None`. Used by the , and ; commands. - """ - return self.settings.vi['last_character_search'] or None - - @last_character_search.setter - def last_character_search(self, value): - # TODO: Should this piece of data be global instead of local to each buffer? - self.settings.vi['last_character_search'] = value - - @property - def xpos(self): - """Maintains the current column for the caret in normal and visual mode. - """ - xpos = self.settings.vi['xpos'] - return xpos if isinstance(xpos, int) else None - - @xpos.setter - def xpos(self, value): - self.settings.vi['xpos'] = value - - @property - def next_mode(self): - """Mode to transition to after the command has been run. For example, ce needs to change - to insert mode after it's run. - """ - next_mode = self.settings.vi['next_mode'] or MODE_NORMAL - return next_mode - - @next_mode.setter - def next_mode(self, value): - self.settings.vi['next_mode'] = value - - @property - def next_mode_command(self): - """Command to make the transitioning to the next mode. - """ - next_mode_command = self.settings.vi['next_mode_command'] - return next_mode_command - - @next_mode_command.setter - def next_mode_command(self, value): - self.settings.vi['next_mode_command'] = value - - @property - def repeat_command(self): - """Latest modifying command performed. Accessed via '.'. - """ - # This property is volatile. It won't be persisted between sessions. - return VintageState._latest_repeat_command - - @repeat_command.setter - def repeat_command(self, value): - VintageState._latest_repeat_command = value - - @property - def latest_macro(self): - """Latest macro recorded. Accessed via @@. - """ - return VintageState._latest_macro - - @latest_macro.setter - def latest_macro(self, value): - VintageState._latest_macro = value - - @property - def is_recording(self): - """Signals that we're recording a macro. - """ - return VintageState._is_recording - - @is_recording.setter - def is_recording(self, value): - VintageState._is_recording = value - - def parse_motion(self): - """Returns a CmdData instance with parsed motion data. - """ - vi_cmd_data = CmdData(self) - - # This should happen only at initialization. - # XXX: This is effectively zeroing xpos. Shouldn't we move this into new_vi_cmd_data()? - # XXX: REFACTOR - if vi_cmd_data['xpos'] is None: - xpos = 0 - if self.view.sel(): - xpos = self.view.rowcol(self.view.sel()[0].b) - self.xpos = xpos - vi_cmd_data['xpos'] = xpos - - # Actions originating in normal mode are run in a pseudomode that helps to distiguish - # between visual mode and this case (both use selections, either implicitly or - # explicitly). - if self.action and (self.mode == MODE_NORMAL): - vi_cmd_data['mode'] = _MODE_INTERNAL_NORMAL - - motion = self.motion - motion_func = None - if motion: - try: - motion_func = getattr(motions, self.motion) - except AttributeError: - raise AttributeError("Vintageous: Unknown motion: '{0}'".format(self.motion)) - - if motion_func: - vi_cmd_data = motion_func(vi_cmd_data) - - return vi_cmd_data - - def parse_action(self, vi_cmd_data): - """Updates and returns the passed-in CmdData instance using parsed data about the action. - """ - try: - action_func = getattr(actions, self.action) - except AttributeError: - raise AttributeError("Vintageous: Unknown action: '{0}'".format(self.action)) - except TypeError: - raise TypeError("Vintageous: parse_action requires an action be specified.") - - if action_func: - vi_cmd_data = action_func(vi_cmd_data) - - # Notify global state to go ahead with the command if there are selections and the action - # is ready to be run (which is almost always the case except for some digraphs). - # NOTE: By virtue of checking for non-empty selections instead of an explicit mode, - # the user can run actions on selections created outside of Vintageous. - # This seems to work well. - if (self.view.has_non_empty_selection_region() and - # XXX: This check is pretty useless, because we abort early in .run() anyway. - # Logically, it makes sense, however. - not vi_cmd_data['is_digraph_start']): - vi_cmd_data['motion_required'] = False - - return vi_cmd_data - - def eval_cancel_action(self): - """Cancels the whole run of the command. - """ - # TODO: add a .parse() method that includes boths steps? - vi_cmd_data = self.parse_motion() - vi_cmd_data = self.parse_action(vi_cmd_data) - if vi_cmd_data['must_blink_on_error']: - utils.blink() - # Modify the data that determines the mode we'll end up in when the command finishes. - self.next_mode = vi_cmd_data['_exit_mode'] - # Since we are exiting early, ensure we leave the selections as the commands wants them. - if vi_cmd_data['_exit_mode_command']: - self.view.run_command(vi_cmd_data['_exit_mode_command']) - - def eval_full_command(self): - """Evaluates a command like 3dj, where there is an action as well as a motion. - """ - vi_cmd_data = self.parse_motion() - vi_cmd_data = self.parse_action(vi_cmd_data) - - if not vi_cmd_data['is_digraph_start']: - # We are about to run an action, so let Sublime Text know we want all editing - # steps folded into a single sequence. "All editing steps" means slightly different - # things depending on the mode we are in. - if vi_cmd_data['_mark_groups_for_gluing']: - self.view.run_command('maybe_mark_undo_groups_for_gluing') - self.view.run_command('vi_run', vi_cmd_data) - self.reset() - else: - # If we have a digraph start, the global data is in an invalid state because we - # are still missing the complete digraph. Abort and clean up. - if vi_cmd_data['_exit_mode'] == MODE_INSERT: - # We've been requested to change to this mode. For example, we're looking at - # CTRL+r,j in INSERTMODE, which is an invalid sequence. - # !!! This could be simplified using parameters in .reset(), but then it - # wouldn't be obvious what was going on. Don't refactor. !!! - utils.blink() - self.reset() - self.enter_insert_mode() - elif self.mode != MODE_NORMAL: - # Normally we'd go back to normal mode. - self.enter_normal_mode() - self.reset() - - def eval_lone_action(self): - """Evaluate lone action like in 'd' or 'esc'. Some actions can be run without a motion. - """ - vi_cmd_data = self.parse_motion() - vi_cmd_data = self.parse_action(vi_cmd_data) - - if vi_cmd_data['is_digraph_start']: - # XXX: When does this happen? Why are we only interested in MODE_NORMAL? - # XXX In response to the above, this must be due to Ctrl+r. - if vi_cmd_data['_change_mode_to'] == MODE_NORMAL: - self.enter_normal_mode() - # We know we are not ready. - return - - if not vi_cmd_data['motion_required']: - # We are about to run an action, so let Sublime Text know we want all editing - # steps folded into a single sequence. "All editing steps" means slightly different - # things depending on the mode we are in. - if vi_cmd_data['_mark_groups_for_gluing']: - self.view.run_command('maybe_mark_undo_groups_for_gluing') - self.view.run_command('vi_run', vi_cmd_data) - self.reset() - - self.update_status() - - # TODO: Test me. - # TODO: Refactor so that .reset and update_status() are called in the separate methods. - def eval(self): - """Examines the current state and decides whether to actually run the action/motion. - """ - - if self.cancel_action: - self.eval_cancel_action() - self.reset() - - # Action + motion, like in '3dj'. - elif self.action and self.motion: - self.eval_full_command() - - # Motion only, like in '3j'. - elif self.motion: - vi_cmd_data = self.parse_motion() - self.view.run_command('vi_run', vi_cmd_data) - self.reset() - self.update_status() - - # Action only, like in 'd' or 'esc'. Some actions can be executed without a motion. - elif self.action: - self.eval_lone_action() - - def reset(self): - """Reset global state. - """ - had_action = self.action - - self.motion = None - self.action = None - - self.register = None - self.user_input = None - self.expecting_register = False - self.expecting_user_input = False - self.cancel_action = False - - # In MODE_NORMAL_INSERT, we temporarily exit NORMAL mode, but when we get back to - # it, we need to know the repeat digits, so keep them. An example command for this case - # would be 5ifoobar\n starting in NORMAL mode. - if self.mode == MODE_NORMAL_INSERT: - return - - self.motion_digits = [] - self.action_digits = [] - - if self.next_mode in (MODE_NORMAL, MODE_INSERT): - if self.next_mode_command: - self.view.run_command(self.next_mode_command) - - # Sometimes we'll reach this point after performing motions. If we have a stored repeat - # command in view A, we switch to view B and do a motion, we don't want .update_repeat_command() - # to inspect view B's undo stack and grab its latest modifying command; we want to keep - # view A's instead, which is what's stored in _latest_repeat_command. We only want to - # update this when there is a new action. - # FIXME: Even that will fail when we perform an action that does not modify the buffer, - # like splitting the window. The current view's latest modifying command will overwrite - # the genuine _latest_repeat_command. The correct solution seems to be to tag every single - # modifying command with a 'must_update_repeat_command' attribute. - if had_action: - self.update_repeat_command() - - self.next_mode = MODE_NORMAL - self.next_mode_command = None - - def update_repeat_command(self): - """Vintageous manages the repeat command on its own. Vim stores away the latest modifying - command as the repeat command, and does not wipe it when undoing. On the contrary, - Sublime Text will update the repeat command as soon as you undo past the current one. - The then previous latest modifying command becomes the new repeat command, and so on. - """ - cmd, args, times = self.view.command_history(0, True) - - if not cmd: - return - elif cmd == 'vi_run' and args.get('action'): - self.repeat_command = cmd, args, times - elif cmd == 'sequence': - # XXX: We are assuming every 'sequence' command is a modifying command, which seems - # to be reasonable, but I dunno. - self.repeat_command = cmd, args, times - elif cmd != 'vi_run': - # XXX: We are assuming every 'native' command is a modifying commmand, but it doesn't - # feel right... - self.repeat_command = cmd, args, times - - # TODO: Test me. - def update_xpos(self): - first_sel = self.view.sel()[0] - xpos = 0 - if self.mode == MODE_VISUAL: - if first_sel.a < first_sel.b: - xpos = self.view.rowcol(first_sel.b - 1)[1] - elif first_sel.a > first_sel.b: - xpos = self.view.rowcol(first_sel.b)[1] - - elif self.mode == MODE_NORMAL: - xpos = self.view.rowcol(first_sel.b)[1] - - self.xpos = xpos - - # TODO: Test me. - def update_status(self): - """Print to Sublime Text's status bar. - """ - mode_name = mode_to_str(self.mode) or "" - mode_name = "-- %s --" % mode_name if mode_name else "" - sublime.status_message(mode_name) - - -# TODO: Test me. -class VintageStateTracker(sublime_plugin.EventListener): - def on_load(self, view): - _init_vintageous(view) - - def on_post_save(self, view): - # Ensure the carets are within valid bounds. For instance, this is a concern when - # `trim_trailing_white_space_on_save` is set to true. - state = VintageState(view) - view.run_command('_vi_adjust_carets', {'mode': state.mode}) - - def on_query_context(self, view, key, operator, operand, match_all): - vintage_state = VintageState(view) - return vintage_state.context.check(key, operator, operand, match_all) - - -# TODO: Test me. -class ViFocusRestorerEvent(sublime_plugin.EventListener): - def __init__(self): - self.timer = None - - def action(self): - self.timer = None - - def on_activated(self, view): - if self.timer: - # Switching to a different view; enter normal mode. - self.timer.cancel() - _init_vintageous(view) - else: - # Switching back from another application. Ignore. - pass - - def on_deactivated(self, view): - self.timer = threading.Timer(0.25, self.action) - self.timer.start() - - -# TODO: Test me. -class IrreversibleTextCommand(sublime_plugin.TextCommand): - """ Base class. - - The undo stack will ignore commands derived from this class. This is - useful to prevent global state management commands from shadowing - commands performing edits to the buffer, which are the important ones - to keep in the undo history. - """ - def __init__(self, view): - sublime_plugin.TextCommand.__init__(self, view) - - def run_(self, edit_token, kwargs): - if kwargs and 'event' in kwargs: - del kwargs['event'] - - if kwargs: - self.run(**kwargs) - else: - self.run() - - def run(self, **kwargs): - pass diff --git a/backend/packages/testdata/Vintage/transformers.py b/backend/packages/testdata/Vintage/transformers.py deleted file mode 100644 index db0dbf0..0000000 --- a/backend/packages/testdata/Vintage/transformers.py +++ /dev/null @@ -1,67 +0,0 @@ -import sublime -import sublime_plugin - -from Vintageous.vi.constants import regions_transformer -from Vintageous.vi.utils import back_one_char -from Vintageous.vi.utils import forward_one_char -from Vintageous.vi.utils import is_at_bol -from Vintageous.vi.utils import is_at_eol -from Vintageous.vi.utils import is_at_hard_eol -from Vintageous.vi.utils import is_line_empty -from Vintageous.vi.utils import is_on_empty_line -from Vintageous.vi.utils import next_non_white_space_char - - -class ClipEndToLine(sublime_plugin.TextCommand): - def run(self, edit): - def f(view, s): - if not is_on_empty_line(self.view, s) and is_at_eol(self.view, s): - return back_one_char(s) - else: - return s - - regions_transformer(self.view, f) - - -class DontStayOnEolForward(sublime_plugin.TextCommand): - def run(self, edit, **kwargs): - def f(view, s): - if is_at_eol(self.view, s): - return forward_one_char(s) - else: - return s - - regions_transformer(self.view, f) - - -class DontStayOnEolBackward(sublime_plugin.TextCommand): - def run(self, edit, **kwargs): - def f(view, s): - if is_at_eol(self.view, s) and not self.view.line(s.b).empty(): - return back_one_char(s) - else: - return s - - regions_transformer(self.view, f) - - -class _vi_d_post_action(sublime_plugin.TextCommand): - def run(self, edit, **kwargs): - def f(view, s): - if is_at_eol(self.view, s) and not self.view.line(s.b).empty(): - s = back_one_char(s) - # s = next_non_white_space_char(self.view, s.b) - return s - - regions_transformer(self.view, f) - - -class DontOvershootLineLeft(sublime_plugin.TextCommand): - def run(self, edit, **kwargs): - def f(view, s): - if view.size() > 0 and is_at_eol(self.view, s): - return forward_one_char(s) - else: - return s - - regions_transformer(self.view, f) \ No newline at end of file diff --git a/backend/parser/parser.go b/backend/parser/parser.go deleted file mode 100644 index 2f7d6f0..0000000 --- a/backend/parser/parser.go +++ /dev/null @@ -1,194 +0,0 @@ -// Copyright 2013 The lime Authors. -// Use of this source code is governed by a 2-clause -// BSD-style license that can be found in the LICENSE file. - -// The parser package defines interfaces responsible for creating -// an Abstract Syntax Tree like structure of a text document. -// -// It should then be possible to query this structure for -// the name and extend of the various code scopes defined within it. -// -// TODO: -// It should be possible to hook in for example libclang, -// go/ast and other "proper" code parsers. Do these interfaces -// make sense for those or should they be changed? - -package parser - -import ( - "bytes" - "github.com/limetext/lime/backend/render" - "github.com/limetext/text" - "github.com/quarnster/parser" - "sort" - "sync" -) - -type ( - // The Parser interface is responsible for creating - // a parser.Node structure of a given text data. - Parser interface { - Parse() (*parser.Node, error) - } - - // The SyntaxHighlighter interface is responsible for - // identifying the extent and name of code scopes given - // a position in the code buffer this specific SyntaxHighlighter - // is responsible for. - // - // It's expected that the syntax highlighter monkey patches its existing - // scope data rather than performing a full reparse when the underlying - // buffer changes. - // - // This is because a full reparse, for which the Parser interface is responsible, - // will be going on in parallel in a separate thread and the "monkey patch" - // will allow some accuracy in the meantime until the Parse operation has finished. - SyntaxHighlighter interface { - // Adjust is called when the underlying text buffer changes at "position" - // with a change of "delta" characters either being inserted or removed. - // - // See note above regarding "monkey patching". - Adjust(position, delta int) - - // Returns the Region of the inner most Scope extent which contains "point". - // - // This method can be called a lot by plugins, and should therefore be as - // fast as possible. - ScopeExtent(point int) text.Region - - // Returns the full concatenated nested scope name of the scope(s) containing "point". - // - // This method can be called a lot by plugins, and should therefore be as - // fast as possible. - ScopeName(point int) string - - // Flatten creates a map where the key is the concatenated nested scope names - // and the key is the render.ViewRegions associated with that key. - // - // This function is only called once by the View, which merges - // the regions into its own region map and adjusts them as appropriate. - Flatten() render.ViewRegionMap - } - - nodeHighlighter struct { - rootNode *parser.Node - lastScopeNode *parser.Node - lastScopeBuf bytes.Buffer - lastScopeName string - sync.Mutex - } -) - -// Creates a new default implementation of SyntaxHighlighter operating -// on the AST created by "p"'s Parse(). -func NewSyntaxHighlighter(p Parser) (SyntaxHighlighter, error) { - if rn, err := p.Parse(); err != nil { - return nil, err - } else { - return &nodeHighlighter{rootNode: rn}, nil - } -} - -// Given a text region, returns the innermost node covering that region. -// Side-effects: Writes to nh.lastScopeBuf... -func (nh *nodeHighlighter) findScope(search text.Region, node *parser.Node) *parser.Node { - idx := sort.Search(len(node.Children), func(i int) bool { - return node.Children[i].Range.A >= search.A || node.Children[i].Range.Covers(search) - }) - for idx < len(node.Children) { - c := node.Children[idx] - if c.Range.A > search.B { - break - } - if c.Range.Covers(search) { - if node.Name != "" && node != nh.lastScopeNode { - if nh.lastScopeBuf.Len() > 0 { - nh.lastScopeBuf.WriteByte(' ') - } - nh.lastScopeBuf.WriteString(node.Name) - } - return nh.findScope(search, node.Children[idx]) - } - idx++ - } - if node != nh.lastScopeNode && node.Range.Covers(search) && node.Name != "" { - if nh.lastScopeBuf.Len() > 0 { - nh.lastScopeBuf.WriteByte(' ') - } - nh.lastScopeBuf.WriteString(node.Name) - return node - } - return nil -} - -// Caches the full concatenated nested scope name and the innermost node that covers "point". -// TODO: multiple cursors being in different scopes is harsh on the cache... -func (nh *nodeHighlighter) updateScope(point int) { - if nh.rootNode == nil { - return - } - - search := text.Region{A: point, B: point + 1} - if nh.lastScopeNode != nil && nh.lastScopeNode.Range.Covers(search) { - if len(nh.lastScopeNode.Children) != 0 { - if no := nh.findScope(search, nh.lastScopeNode); no != nh.lastScopeNode && no != nil { - nh.lastScopeNode = no - nh.lastScopeName = nh.lastScopeBuf.String() - } - } - return - } - nh.lastScopeNode = nil - nh.lastScopeBuf.Reset() - nh.lastScopeNode = nh.findScope(search, nh.rootNode) - nh.lastScopeName = nh.lastScopeBuf.String() -} - -func (nh *nodeHighlighter) ScopeExtent(point int) text.Region { - nh.updateScope(point) - if nh.lastScopeNode != nil { - r := nh.lastScopeNode.Range - return text.Region{A: r.A, B: r.B} - } - return text.Region{} -} - -func (nh *nodeHighlighter) ScopeName(point int) string { - nh.updateScope(point) - return nh.lastScopeName -} - -func (nh *nodeHighlighter) flatten(vrmap render.ViewRegionMap, scopename string, node *parser.Node) { - scopename += " " + node.Name - cur := node.Range - - for _, c := range node.Children { - if cur.A <= c.Range.A { - reg := vrmap[scopename] - reg.Flags |= render.DRAW_TEXT - reg.Scope = scopename - reg.Regions.Add(text.Region{A: cur.A, B: c.Range.A}) - vrmap[scopename] = reg - } - cur.A = c.Range.B - nh.flatten(vrmap, scopename, c) - } - // Just add the last region if it's not zero sized - if cur.A != cur.B { - reg := vrmap[scopename] - reg.Flags |= render.DRAW_TEXT - reg.Scope = scopename - reg.Regions.Add(text.Region{A: cur.A, B: cur.B}) - vrmap[scopename] = reg - } -} - -func (nh *nodeHighlighter) Adjust(position, delta int) { - nh.rootNode.Adjust(position, delta) -} - -func (nh *nodeHighlighter) Flatten() (ret render.ViewRegionMap) { - ret = make(render.ViewRegionMap) - nh.flatten(ret, "lime.syntax", nh.rootNode) - return -} diff --git a/backend/parser/parser_test.go b/backend/parser/parser_test.go deleted file mode 100644 index 69fc44d..0000000 --- a/backend/parser/parser_test.go +++ /dev/null @@ -1,5 +0,0 @@ -// Copyright 2014 The lime Authors. -// Use of this source code is governed by a 2-clause -// BSD-style license that can be found in the LICENSE file. - -package parser diff --git a/backend/render/doc.go b/backend/render/doc.go deleted file mode 100644 index 8ff219f..0000000 --- a/backend/render/doc.go +++ /dev/null @@ -1,8 +0,0 @@ -// Copyright 2014 The lime Authors. -// Use of this source code is governed by a 2-clause -// BSD-style license that can be found in the LICENSE file. - -// The render package defines interfaces and functions -// to stylize a View's contents with colours, fonts -// and other metadata. -package render diff --git a/backend/render/font.go b/backend/render/font.go deleted file mode 100644 index 929e5e2..0000000 --- a/backend/render/font.go +++ /dev/null @@ -1,28 +0,0 @@ -// Copyright 2013 The lime Authors. -// Use of this source code is governed by a 2-clause -// BSD-style license that can be found in the LICENSE file. - -package render - -const ( - Italic FontStyle = (1 << iota) - Bold - Underline -) - -type ( - FontStyle int - Font struct { - Name string - Size float64 - Style FontStyle - } - - FontMeasurement struct { - Width, Height int - } - - FontMetrics interface { - Measure(Font, []rune) FontMeasurement - } -) diff --git a/backend/render/renderer.go b/backend/render/renderer.go deleted file mode 100644 index 5084f06..0000000 --- a/backend/render/renderer.go +++ /dev/null @@ -1,143 +0,0 @@ -// Copyright 2013 The lime Authors. -// Use of this source code is governed by a 2-clause -// BSD-style license that can be found in the LICENSE file. - -package render - -import ( - "github.com/limetext/lime/backend/util" - "github.com/limetext/text" - "image/color" - "sort" -) - -type ( - // Colour represented by a underlying color.RGBA structure - Colour color.RGBA - - // The Flavour struct contains the specific settings - // used to style a particular Region. - Flavour struct { - Background Colour - Foreground Colour - Font Font - Flags ViewRegionFlags - } - - // The Recipe type groups text.RegionSets by their Flavour. - // The idea is to allow large groups of text be rendered as - // a single batch without any state changes inbetween the - // batches. - Recipe map[Flavour]text.RegionSet - - // A RenderUnit is just a Flavour and an associated Region. - RenderUnit struct { - Flavour Flavour - Region text.Region - } - - // A TranscribedRecipe is a linear (in text.Regions) representation of a Recipe - TranscribedRecipe []RenderUnit - - ColourScheme interface { - // Takes a ViewRegions pointer as input and uses the data contained in it - // to determine the Flavour it should be rendered with. - Spice(*ViewRegions) Flavour - } - - Renderer interface { - // Renders the given Recipe - Render(Recipe) - } -) - -// Transform takes a ColourScheme, a ViewRegionMap and a viewport as input. -// -// The viewport would be the text.Region of the current buffer that is visible to the user -// and any ViewRegions outside of this area are not forwarded for further processing. -// -// The remaining ViewRegions are then passed on to the ColourScheme for determining the exact Flavour -// for which that RegionSet should be styled, adding Regions of the same Flavour to the same RegionSet. -// -// Typically there are more ViewRegions available in a text buffer than there are unique Flavours in -// a ColourScheme, so this operation can be viewed as reducing the number of state changes required to -// display the text to the user. -// -// The final output, the Recipe, contains a mapping of all unique Flavours and that Flavour's -// associated RegionSet. -func Transform(scheme ColourScheme, data ViewRegionMap, viewport text.Region) Recipe { - pe := util.Prof.Enter("render.Transform") - defer pe.Exit() - // TODO: - // caret_blink := true - // if b, ok := v.Settings().Get("caret_blink", true).(bool); ok { - // caret_blink = b - // } - // - // highlight_line := false - // if b, ok := v.Settings().Get("highlight_line", highlight_line).(bool); ok { - // highlight_line = b - // } - // if b, ok := v.Settings().Get("inverse_caret_state", false).(bool); !b && ok { - // if caret_style == termbox.AttrReverse { - // caret_style = termbox.AttrUnderline - // } else { - // caret_style = termbox.AttrReverse - // } - // } - // caret_style := termbox.AttrUnderline - // if b, ok := v.Settings().Get("caret_style", "underline").(string); ok { - // if b == "block" { - // caret_style = termbox.AttrReverse - // } - // } - - data.Cull(viewport) - recipe := make(Recipe) - for _, v := range data { - k := scheme.Spice(&v) - rs := recipe[k] - a := util.Prof.Enter("render.Transform.(Regions)") - r := v.Regions.Regions() - a.Exit() - a = util.Prof.Enter("render.Transform.(AddAll)") - rs.AddAll(r) - a.Exit() - recipe[k] = rs - } - return recipe -} - -// Transcribing the Recipe creates a linear step-by-step -// representation of it, which might or might not -// make it easier for Renderers to work with. -func (r Recipe) Transcribe() (ret TranscribedRecipe) { - pe := util.Prof.Enter("render.Transcribe") - defer pe.Exit() - for flav, set := range r { - for _, r := range set.Regions() { - ret = append(ret, RenderUnit{Flavour: flav, Region: r}) - } - } - sort.Sort(&ret) - return -} - -// Just used to satisfy the sort.Interface interface, typically not used otherwise. -func (r *TranscribedRecipe) Len() int { - return len(*r) -} - -// Just used to satisfy the sort.Interface interface, typically not used otherwise. -func (r *TranscribedRecipe) Less(i, j int) bool { - a, b := (*r)[i].Region, (*r)[j].Region - if a.Begin() == b.Begin() { - return a.End() < b.End() - } - return a.Begin() < b.Begin() -} - -// Just used to satisfy the sort.Interface interface, typically not used otherwise. -func (r *TranscribedRecipe) Swap(i, j int) { - (*r)[i], (*r)[j] = (*r)[j], (*r)[i] -} diff --git a/backend/render/renderer_test.go b/backend/render/renderer_test.go deleted file mode 100644 index 726a038..0000000 --- a/backend/render/renderer_test.go +++ /dev/null @@ -1,163 +0,0 @@ -// Copyright 2014 The lime Authors. -// Use of this source code is governed by a 2-clause -// BSD-style license that can be found in the LICENSE file. - -package render - -import ( - "github.com/limetext/text" - "reflect" - "testing" -) - -type ( - DummyColourScheme struct { - ColourScheme - } -) - -var ( - flavourDef = Flavour{Background: Colour{0, 0, 0, 0}} - flavourA = Flavour{Background: Colour{1, 0, 0, 0}} - flavourB = Flavour{Background: Colour{0, 1, 0, 0}} - flavourC = Flavour{Background: Colour{0, 0, 1, 0}} -) - -func (cs DummyColourScheme) Spice(vr *ViewRegions) (f Flavour) { - switch vr.Scope { - case "A": - f = flavourA - case "B": - f = flavourB - case "C": - f = flavourC - default: - f = flavourDef - } - - return -} - -func TestTransform(t *testing.T) { - tests := []struct { - vrmap ViewRegionMap - rmap map[string][]text.Region - viewport text.Region - expflav []Flavour - notflav []Flavour - }{ - { - ViewRegionMap{"A": {Scope: "A"}}, - map[string][]text.Region{"A": {{0, 1}}}, - text.Region{A: 0, B: 1}, - []Flavour{flavourA}, - []Flavour{flavourDef}, - }, - { - ViewRegionMap{"A": {Scope: "A"}, "B": {Scope: "B"}}, - map[string][]text.Region{"A": {{0, 1}}}, - text.Region{A: 0, B: 1}, - []Flavour{flavourA}, - []Flavour{flavourB}, - }, - { - ViewRegionMap{"A": {Scope: "A"}, "B": {Scope: "B"}}, - map[string][]text.Region{"B": {{0, 1}}}, - text.Region{A: 0, B: 1}, - []Flavour{flavourB}, - []Flavour{flavourA}, - }, - { - ViewRegionMap{"A": {Scope: "A"}, "B": {Scope: "B"}}, - map[string][]text.Region{"A": {{0, 1}}, "B": {{0, 1}}}, - text.Region{A: 0, B: 1}, - []Flavour{flavourA, flavourB}, - []Flavour{}, - }, - { - ViewRegionMap{"A": {Scope: "A"}, "B": {Scope: "B"}}, - map[string][]text.Region{"A": {{10, 11}}, "B": {{0, 1}}}, - text.Region{A: 0, B: 1}, - []Flavour{flavourB}, - []Flavour{flavourA}, - }, - { - ViewRegionMap{"A": {Scope: "A"}, "B": {Scope: "B"}}, - map[string][]text.Region{"A": {{10, 11}}, "B": {{20, 21}}}, - text.Region{A: 0, B: 1}, - []Flavour{}, - []Flavour{flavourA, flavourB}, - }, - } - - for i, test := range tests { - for k, reg := range test.rmap { - if vr, ok := test.vrmap[k]; ok { - vr.Regions.AddAll(reg) - test.vrmap[k] = vr - } - } - - rec := Transform(DummyColourScheme{}, test.vrmap, test.viewport) - - for _, f := range test.expflav { - if _, ok := rec[f]; !ok { - t.Errorf("Test %d: Expected Recipe to contain %#v, but it didn't", i, f) - } - } - - for _, f := range test.notflav { - if _, ok := rec[f]; ok { - t.Errorf("Test %d: Expected Recipe to not contain %#v, but it did", i, f) - } - } - } -} - -func TestRecipeTranscribe(t *testing.T) { - tests := []struct { - rec Recipe - rmap map[Flavour][]text.Region - exp TranscribedRecipe - }{ - { - Recipe{flavourA: text.RegionSet{}}, - map[Flavour][]text.Region{flavourA: {{0, 1}}}, - TranscribedRecipe{{flavourA, text.Region{A: 0, B: 1}}}, - }, - { - Recipe{flavourA: text.RegionSet{}}, - map[Flavour][]text.Region{flavourA: {{0, 1}, {10, 11}}}, - TranscribedRecipe{{flavourA, text.Region{A: 0, B: 1}}, {flavourA, text.Region{A: 10, B: 11}}}, - }, - { - Recipe{flavourA: text.RegionSet{}, flavourB: text.RegionSet{}}, - map[Flavour][]text.Region{flavourA: {{0, 1}}}, - TranscribedRecipe{{flavourA, text.Region{A: 0, B: 1}}}, - }, - { - Recipe{flavourA: text.RegionSet{}, flavourB: text.RegionSet{}}, - map[Flavour][]text.Region{flavourA: {{0, 1}}, flavourB: {{10, 11}}}, - TranscribedRecipe{{flavourA, text.Region{A: 0, B: 1}}, {flavourB, text.Region{A: 10, B: 11}}}, - }, - { - Recipe{flavourA: text.RegionSet{}, flavourB: text.RegionSet{}}, - map[Flavour][]text.Region{flavourA: {{0, 11}}, flavourB: {{0, 1}}}, - TranscribedRecipe{{flavourB, text.Region{A: 0, B: 1}}, {flavourA, text.Region{A: 0, B: 11}}}, - }, - } - - for i, test := range tests { - for k, reg := range test.rmap { - if rs, ok := test.rec[k]; ok { - rs.AddAll(reg) - test.rec[k] = rs - } - } - - tr := test.rec.Transcribe() - if !reflect.DeepEqual(tr, test.exp) { - t.Errorf("Test %d: Expected %#v, but got %#v", i, test.exp, tr) - } - } -} diff --git a/backend/render/textmate/syntax.go b/backend/render/textmate/syntax.go deleted file mode 100644 index fa99bf8..0000000 --- a/backend/render/textmate/syntax.go +++ /dev/null @@ -1,27 +0,0 @@ -// Copyright 2013 The lime Authors. -// Use of this source code is governed by a 2-clause -// BSD-style license that can be found in the LICENSE file. - -// +build nope - -package textmate - -import ( - "github.com/limetext/lime/backend/render" - "github.com/limetext/lime/backend/textmate" - "github.com/limetext/text" - "github.com/quarnster/parser" - "sync" -) - -type ( - TextmateSyntax struct { - textmate.LanguageParser - } -) - -func (ts *TextmateSyntax) PrepareForRendering(text.Region) []render.ViewRegions { - ts.Lock() - defer ts.Unlock() - return ts.flatten([]render.ViewRegions{}, "", ts.RootNode()) -} diff --git a/backend/render/textmate/syntax_test.go b/backend/render/textmate/syntax_test.go deleted file mode 100644 index e775695..0000000 --- a/backend/render/textmate/syntax_test.go +++ /dev/null @@ -1,5 +0,0 @@ -// Copyright 2014 The lime Authors. -// Use of this source code is governed by a 2-clause -// BSD-style license that can be found in the LICENSE file. - -package textmate diff --git a/backend/render/view.go b/backend/render/view.go deleted file mode 100644 index 6220de9..0000000 --- a/backend/render/view.go +++ /dev/null @@ -1,100 +0,0 @@ -// Copyright 2013 The lime Authors. -// Use of this source code is governed by a 2-clause -// BSD-style license that can be found in the LICENSE file. - -package render - -import ( - "github.com/limetext/lime/backend/util" - "github.com/limetext/text" -) - -const ( - DRAW_EMPTY ViewRegionFlags = (1 << iota) // Draw a vertical line for an empty (zero area) region - HIDE_ON_MINIMAP // Don't draw this region in the minimap - DRAW_EMPTY_AS_OVERWRITE // Rather than a vertical line, draw empty regions as a horizontal one - DRAW_NO_FILL // Don't draw the filling of the region - DRAW_NO_OUTLINE // Don't draw the outline of the region - DRAW_SOLID_UNDERLINE // Draw a solid underline under the whole region - DRAW_STIPPLED_UNDERLINE // Draw a stippled underline under the whole region - DRAW_SQUIGGLY_UNDERLINE // Draw a squiggly underline under the whole region - PERSISTENT // Region is saved with the session - HIDDEN // Region is not rendered - SELECTION // This Region is part of selected text - HIGHLIGHT // This Region is part of highlighted text - DRAW_TEXT // The actual text contained in the region should be rendered - DEFAULT ViewRegionFlags = 0 // No flags at all, only draw the region itself and not the text -) - -type ( - // A set of ViewRegions associated by a string identifier key. - // The name of the key itself has no special meaning other than for - // being able set, retrieve and update *your* set of ViewRegions. - ViewRegionMap map[string]ViewRegions - - // Flags used to hint at how the region should be rendered. - ViewRegionFlags int - - // The ViewRegions object contains information - // related to the rendering of a specific RegionSet - // and can be set both by a https://godoc.org/github.com/limetext/lime/backend/parser#SyntaxHighlighter - // and from plugins via https://godoc.org/github.com/limetext/lime/backend#View.AddRegions. - // - // Turning this information into a concrete https://godoc.org/github.com/limetext/lime/backend/render#Flavour - // is the job of the https://godoc.org/github.com/limetext/lime/backend/render#ColourScheme interface. - ViewRegions struct { - // The Regions this ViewRegions object is relevant to. - Regions text.RegionSet - // The scope identifier is used to determine colour and other style options. - Scope string - // Gutter icon (displayed next to line numbers) URI. - Icon string - // Flags used to hint at how the region should be rendered. - Flags ViewRegionFlags - } -) - -// Calls Cull on each ViewRegions object contained in the map, -// removing all entries that are outside of the viewport. -func (vrm *ViewRegionMap) Cull(viewport text.Region) { - pe := util.Prof.Enter("render.vrm.Cull") - defer pe.Exit() - rm := []string{} - for k, v := range *vrm { - v.Cull(viewport) - if v.Regions.Len() == 0 { - rm = append(rm, k) - } else { - (*vrm)[k] = v - } - } - for _, r := range rm { - delete(*vrm, r) - } -} - -// Removes any regions that are outside of the given viewport, -// and clips the regions that are intersecting it so that -// all regions remaining are fully contained inside of the viewport. -func (vr *ViewRegions) Cull(viewport text.Region) { - pe := util.Prof.Enter("render.vr.Cull") - defer pe.Exit() - nr := []text.Region{} - for _, r := range vr.Regions.Regions() { - if viewport.Intersects(r) { - in := viewport.Intersection(r) - if in.Size() != 0 { - nr = append(nr, in) - } - } - } - vr.Regions.Clear() - vr.Regions.AddAll(nr) -} - -// Creates a copy of this ViewRegions object. -func (vr *ViewRegions) Clone() *ViewRegions { - ret := ViewRegions{Scope: vr.Scope, Icon: vr.Icon, Flags: vr.Flags} - ret.Regions.AddAll(vr.Regions.Regions()) - return &ret -} diff --git a/backend/render/view_test.go b/backend/render/view_test.go deleted file mode 100644 index 22a5ab4..0000000 --- a/backend/render/view_test.go +++ /dev/null @@ -1,216 +0,0 @@ -// Copyright 2014 The lime Authors. -// Use of this source code is governed by a 2-clause -// BSD-style license that can be found in the LICENSE file. - -package render - -import ( - "github.com/limetext/text" - "reflect" - "testing" -) - -func TestViewRegionMapCull(t *testing.T) { - tests := []struct { - regionsA []text.Region - regionsB []text.Region - cull text.Region - expA []text.Region - expB []text.Region - }{ - { - []text.Region{}, - []text.Region{}, - text.Region{}, - nil, - nil, - }, - { - []text.Region{{A: 100, B: 200}}, - []text.Region{}, - text.Region{}, - nil, - nil, - }, - { - []text.Region{}, - []text.Region{}, - text.Region{A: 0, B: 50}, - nil, - nil, - }, - { - []text.Region{{A: 100, B: 200}}, - []text.Region{}, - text.Region{A: 0, B: 50}, - nil, - nil, - }, - { - []text.Region{{A: 100, B: 200}}, - []text.Region{{A: 300, B: 400}}, - text.Region{A: 0, B: 50}, - nil, - nil, - }, - { - []text.Region{{A: 100, B: 200}}, - []text.Region{{A: 300, B: 400}}, - text.Region{A: 0, B: 150}, - []text.Region{{A: 100, B: 150}}, - nil, - }, - { - []text.Region{{A: 100, B: 200}}, - []text.Region{{A: 300, B: 400}}, - text.Region{A: 150, B: 350}, - []text.Region{{A: 150, B: 200}}, - []text.Region{{A: 300, B: 350}}, - }, - } - - for i, test := range tests { - vrm := ViewRegionMap{} - - vrA := ViewRegions{} - vrA.Regions.AddAll(test.regionsA) - vrm["A"] = vrA - - vrB := ViewRegions{} - vrB.Regions.AddAll(test.regionsB) - vrm["B"] = vrB - - vrm.Cull(test.cull) - - if test.expA != nil { - rA := vrA.Regions.Regions() - - if !reflect.DeepEqual(rA, test.expA) { - t.Errorf("Test %d: Expected %s, but got %s", i, test.expA, rA) - } - } else if _, ok := vrm["A"]; ok { - t.Errorf("Test %d: Expected %s, but got %v", i, test.expA, vrm["A"]) - } - - if test.expB != nil { - rB := vrB.Regions.Regions() - - if !reflect.DeepEqual(rB, test.expB) { - t.Errorf("Test %d: Expected %s, but got %s", i, test.expB, rB) - } - } else if _, ok := vrm["B"]; ok { - t.Errorf("Test %d: Expected %s, but got %v", i, test.expB, vrm["B"]) - } - } -} - -func TestViewRegionsCull(t *testing.T) { - tests := []struct { - regions []text.Region - cull text.Region - exp []text.Region - }{ - { - []text.Region{{A: 100, B: 200}}, - text.Region{A: 0, B: 50}, - []text.Region{}, - }, - { - []text.Region{{A: 100, B: 100}}, - text.Region{A: 100, B: 100}, - []text.Region{}, - }, - { - []text.Region{{A: 100, B: 100}}, - text.Region{A: 95, B: 105}, - []text.Region{}, - }, - { - []text.Region{{A: 100, B: 100}}, - text.Region{A: 95, B: 100}, - []text.Region{}, - }, - { - []text.Region{{A: 100, B: 200}}, - text.Region{A: 150, B: 150}, - []text.Region{}, - }, - { - []text.Region{{A: 100, B: 200}}, - text.Region{A: 90, B: 100}, - []text.Region{}, - }, - { - []text.Region{{A: 100, B: 200}}, - text.Region{A: 100, B: 150}, - []text.Region{{A: 100, B: 150}}, - }, - { - []text.Region{{A: 100, B: 200}}, - text.Region{A: 150, B: 175}, - []text.Region{{A: 150, B: 175}}, - }, - { - []text.Region{{A: 100, B: 200}}, - text.Region{A: 0, B: 150}, - []text.Region{{A: 100, B: 150}}, - }, - { - []text.Region{{A: 100, B: 200}}, - text.Region{A: 150, B: 250}, - []text.Region{{A: 150, B: 200}}, - }, - { - []text.Region{{A: 100, B: 200}}, - text.Region{A: 0, B: 250}, - []text.Region{{A: 100, B: 200}}, - }, - { - []text.Region{{A: 100, B: 200}, {A: 300, B: 400}}, - text.Region{A: 0, B: 500}, - []text.Region{{A: 100, B: 200}, {A: 300, B: 400}}, - }, - { - []text.Region{{A: 100, B: 200}, {A: 300, B: 400}}, - text.Region{A: 150, B: 350}, - []text.Region{{A: 150, B: 200}, {A: 300, B: 350}}, - }, - { - []text.Region{{A: 100, B: 200}, {A: 300, B: 400}}, - text.Region{A: 150, B: 250}, - []text.Region{{A: 150, B: 200}}, - }, - { - []text.Region{{A: 100, B: 200}, {A: 300, B: 400}}, - text.Region{A: 250, B: 350}, - []text.Region{{A: 300, B: 350}}, - }, - } - - for i, test := range tests { - vr := ViewRegions{} - vr.Regions.AddAll(test.regions) - - vr.Cull(test.cull) - - r := vr.Regions.Regions() - - if !reflect.DeepEqual(r, test.exp) { - t.Errorf("Test %d: Expected %s, but got %s", i, test.exp, r) - } - } -} - -func TestViewRegionsClone(t *testing.T) { - vr := &ViewRegions{ - Scope: "testScope", - Icon: "testIcon", - Flags: 100, - } - vr.Regions.AddAll([]text.Region{{A: 0, B: 0}, {A: 120, B: 300}, {A: 24, B: 34}, {A: 45, B: 40}}) - - c := vr.Clone() - if !reflect.DeepEqual(c, vr) { - t.Errorf("Expected %+v, but got %+v", vr, c) - } -} diff --git a/backend/sublime/commands_generated.go b/backend/sublime/commands_generated.go deleted file mode 100644 index 4fca300..0000000 --- a/backend/sublime/commands_generated.go +++ /dev/null @@ -1,82 +0,0 @@ -// Copyright 2015 The lime Authors. -// Use of this source code is governed by a 2-clause -// BSD-style license that can be found in the LICENSE file. - -// This file was generated by tasks/build/gen_python_api.go and shouldn't be manually modified - -package sublime - -import ( - "fmt" - "github.com/limetext/gopy/lib" - "github.com/limetext/lime/backend" - "github.com/limetext/text" -) - -var ( - _ = backend.View{} - _ = text.Region{} - _ = fmt.Errorf -) - -func sublime_Register(tu *py.Tuple) (py.Object, error) { - var ( - arg1 string - arg2 interface{} - ) - if v, err := tu.GetItem(0); err != nil { - return nil, err - } else { - if v3, err2 := fromPython(v); err2 != nil { - return nil, err2 - } else { - if v2, ok := v3.(string); !ok { - return nil, fmt.Errorf("Expected type string for backend.commandHandler.Register() arg1, not %s", v.Type()) - } else { - arg1 = v2 - } - } - } - if v, err := tu.GetItem(1); err != nil { - return nil, err - } else { - if v3, err2 := fromPython(v); err2 != nil { - return nil, err2 - } else { - if v2, ok := v3.(interface{}); !ok { - return nil, fmt.Errorf("Expected type interface {} for backend.commandHandler.Register() arg2, not %s", v.Type()) - } else { - arg2 = v2 - } - } - } - if err := backend.GetEditor().CommandHandler().Register(arg1, arg2); err != nil { - return nil, err - } else { - return toPython(nil) - } -} - -func sublime_Unregister(tu *py.Tuple) (py.Object, error) { - var ( - arg1 string - ) - if v, err := tu.GetItem(0); err != nil { - return nil, err - } else { - if v3, err2 := fromPython(v); err2 != nil { - return nil, err2 - } else { - if v2, ok := v3.(string); !ok { - return nil, fmt.Errorf("Expected type string for backend.commandHandler.Unregister() arg1, not %s", v.Type()) - } else { - arg1 = v2 - } - } - } - if err := backend.GetEditor().CommandHandler().Unregister(arg1); err != nil { - return nil, err - } else { - return toPython(nil) - } -} diff --git a/backend/sublime/commands_manual.go b/backend/sublime/commands_manual.go deleted file mode 100644 index df63096..0000000 --- a/backend/sublime/commands_manual.go +++ /dev/null @@ -1,297 +0,0 @@ -// Copyright 2013 The lime Authors. -// Use of this source code is governed by a 2-clause -// BSD-style license that can be found in the LICENSE file. - -package sublime - -import ( - "fmt" - "github.com/limetext/gopy/lib" - "github.com/limetext/lime/backend" - "github.com/limetext/lime/backend/log" - "github.com/limetext/lime/backend/util" - "github.com/limetext/text" -) - -var ( - _ = backend.View{} - _ = text.Region{} -) - -var ( - _windowCommandGlueClass = py.Class{ - Name: "sublime.WindowCommandGlue", - Pointer: (*WindowCommandGlue)(nil), - } - _textCommandGlueClass = py.Class{ - Name: "sublime.TextCommandGlue", - Pointer: (*TextCommandGlue)(nil), - } - _applicationCommandGlueClass = py.Class{ - Name: "sublime.ApplicationCommandGlue", - Pointer: (*ApplicationCommandGlue)(nil), - } -) - -type ( - CommandGlue struct { - py.BaseObject - inner py.Object - args backend.Args - } - WindowCommandGlue struct { - py.BaseObject - CommandGlue - } - TextCommandGlue struct { - py.BaseObject - CommandGlue - } - ApplicationCommandGlue struct { - py.BaseObject - CommandGlue - } -) - -func (c *CommandGlue) Init(args backend.Args) error { - c.args = args - return nil -} - -func (c *CommandGlue) BypassUndo() bool { - return false -} - -func (c *CommandGlue) PyInit(args *py.Tuple, kwds *py.Dict) error { - if args.Size() != 1 { - return fmt.Errorf("Expected only 1 argument not %d", args.Size()) - } - if v, err := args.GetItem(0); err != nil { - return pyError(err) - } else { - c.inner = v - } - c.inner.Incref() - return nil -} - -func (c *CommandGlue) CreatePyArgs(args backend.Args) (ret *py.Dict, err error) { - if r, err := toPython(args); err != nil { - return nil, err - } else { - return r.(*py.Dict), nil - } -} - -func (c *CommandGlue) callBool(name string, args backend.Args) bool { - gs := py.GilState_Ensure() - defer gs.Release() - - var ( - pyargs, r py.Object - err error - ) - if pyargs, err = c.CreatePyArgs(args); err != nil { - log.Error(err) - return false - } - defer pyargs.Decref() - - if r, err = c.CallMethodObjArgs(name, pyargs); err != nil { - log.Error(err) - return true - } - defer r.Decref() - if r, ok := r.(*py.Bool); ok { - return r.Bool() - } - return true -} - -func (c *CommandGlue) IsEnabled() bool { - return c.callBool("is_enabled", c.args) -} - -func (c *CommandGlue) IsVisible() bool { - return c.callBool("is_visible", c.args) -} - -func (c *CommandGlue) Description() string { - gs := py.GilState_Ensure() - defer gs.Release() - - var ( - pyargs, r py.Object - err error - ) - if pyargs, err = c.CreatePyArgs(c.args); err != nil { - log.Error(err) - return "" - } - defer pyargs.Decref() - - if r, err = c.CallMethodObjArgs("description", pyargs); err != nil { - log.Error(err) - return "" - } - defer r.Decref() - if r, ok := r.(*py.Unicode); ok { - return r.String() - } - return "" -} - -func pyError(err error) error { - // if m, err := py.Import("sys"); err == nil { - // defer m.Decref() - // if i, err := m.Dict().GetItemString("last_traceback"); err == nil { - // defer i.Decref() - // log.LogDebug("%v", i) - // } - // } - return fmt.Errorf("%v", err) -} - -func (c *TextCommandGlue) Run(v *backend.View, e *backend.Edit) error { - l := py.NewLock() - defer l.Unlock() - - p0 := util.Prof.Enter("tc.run") - defer p0.Exit() - var ( - pyv, pye, pyargs, obj py.Object - err error - ) - if pyv, err = toPython(v); err != nil { - return pyError(err) - } - defer pyv.Decref() - - if pye, err = toPython(e); err != nil { - return pyError(err) - } - defer pye.Decref() - - if pyargs, err = c.CreatePyArgs(c.args); err != nil { - return pyError(err) - } - defer pyargs.Decref() - - init := util.Prof.Enter("tc.init") - if obj, err = c.inner.Base().CallFunctionObjArgs(pyv); err != nil { - return pyError(err) - } - defer obj.Decref() - init.Exit() - // interrupt := true - // defer func() { interrupt = false }() - // go func() { - // <-time.After(time.Second * 5) - // if interrupt { - // py.SetInterrupt() - // } - // }() - exec := util.Prof.Enter("tc.exec") - defer exec.Exit() - if obj.Base().HasAttrString("run_") { - // The plugin is probably trying to bypass the undostack... - old := v.IsScratch() - v.SetScratch(true) - log.Finest("Discarded: %s", e) - v.EndEdit(e) - v.SetScratch(old) - ret, err := obj.Base().CallMethodObjArgs("run_", pye, pyargs) - if ret != nil { - ret.Decref() - } - if err != nil { - return pyError(err) - } - return nil - } - ret, err := obj.Base().CallMethodObjArgs("run__", pye, pyargs) - if ret != nil { - ret.Decref() - } - if err != nil { - return pyError(err) - } - return nil -} - -func (c *WindowCommandGlue) Run(w *backend.Window) error { - l := py.NewLock() - defer l.Unlock() - - var ( - pyw, pyargs, obj py.Object - err error - ) - log.Debug("WindowCommand: %v", c.args) - if pyw, err = toPython(w); err != nil { - return pyError(err) - } - defer pyw.Decref() - - if pyargs, err = c.CreatePyArgs(c.args); err != nil { - return pyError(err) - } - defer pyargs.Decref() - // interrupt := true - // defer func() { interrupt = false }() - // go func() { - // <-time.After(time.Second * 5) - // if interrupt { - // py.SetInterrupt() - // } - // }() - - if obj, err = c.inner.Base().CallFunctionObjArgs(pyw); err != nil { - return pyError(err) - } - defer obj.Decref() - if ret, err := obj.Base().CallMethodObjArgs("run_", pyargs); err != nil { - return pyError(err) - } else { - ret.Decref() - } - return nil -} - -func (c *ApplicationCommandGlue) Run() error { - l := py.NewLock() - defer l.Unlock() - - var ( - pyargs py.Object - err error - ) - if pyargs, err = c.CreatePyArgs(c.args); err != nil { - return pyError(err) - } - defer pyargs.Decref() - // interrupt := true - // defer func() { interrupt = false }() - // go func() { - // <-time.After(time.Second * 5) - // if interrupt { - // py.SetInterrupt() - // } - // }() - - obj, err := c.inner.Base().CallFunctionObjArgs() - if err != nil { - return pyError(err) - } - defer obj.Decref() - if ret, err := obj.Base().CallMethodObjArgs("run", pyargs); err != nil { - return pyError(err) - } else { - ret.Decref() - } - return nil -} - -func (c *ApplicationCommandGlue) IsChecked(args backend.Args) bool { - return c.callBool("is_checked", args) -} diff --git a/backend/sublime/commands_test.go b/backend/sublime/commands_test.go deleted file mode 100644 index 00f320c..0000000 --- a/backend/sublime/commands_test.go +++ /dev/null @@ -1,36 +0,0 @@ -// Copyright 2015 The lime Authors. -// Use of this source code is governed by a 2-clause -// BSD-style license that can be found in the LICENSE file. - -package sublime - -import ( - "reflect" - "testing" - - "github.com/limetext/lime/backend" -) - -func TestCommandGlueInit(t *testing.T) { - var c CommandGlue - - args := backend.Args{ - "testarg": true, - } - - if err := c.Init(args); err == nil { - if !reflect.DeepEqual(c.args, args) { - t.Error("Expected args to be set, but they weren't") - } - } else { - t.Error(err) - } -} - -func TestCommandGlueBypassUndo(t *testing.T) { - var c CommandGlue - - if c.BypassUndo() { - t.Error("Expected false, but got true") - } -} diff --git a/backend/sublime/conversion_manual.go b/backend/sublime/conversion_manual.go deleted file mode 100644 index c4912b6..0000000 --- a/backend/sublime/conversion_manual.go +++ /dev/null @@ -1,241 +0,0 @@ -// Copyright 2013 The lime Authors. -// Use of this source code is governed by a 2-clause -// BSD-style license that can be found in the LICENSE file. - -package sublime - -import ( - "fmt" - "github.com/limetext/gopy/lib" - "github.com/limetext/lime/backend" - "github.com/limetext/text" - "reflect" -) - -type ( - Tuple []interface{} - List []interface{} -) - -func toPython(r interface{}) (py.Object, error) { - if v := reflect.ValueOf(r); !v.IsValid() || (v.Kind() == reflect.Ptr && v.IsNil()) { - py.None.Incref() - return py.None, nil - } - switch t := r.(type) { - case nil: - py.None.Incref() - return py.None, nil - case bool: - if t { - py.True.Incref() - return py.True, nil - } - py.False.Incref() - return py.False, nil - case int: - return py.NewLong(int64(t)), nil - case int64: - return py.NewLong(t), nil - case string: - return py.NewUnicode(t) - case float64: - return py.NewFloat(t) - case *text.Settings: - pyret0, err := _settingsClass.Alloc(1) - if err != nil { - return nil, err - } else if v2, ok := pyret0.(*Settings); !ok { - return nil, fmt.Errorf("Unable to convert return value to the right type?!: %s", pyret0.Type()) - } else { - v2.data = t - return v2, nil - } - case *backend.Edit: - pyret0, err := _editClass.Alloc(1) - if err != nil { - return nil, err - } else if v2, ok := pyret0.(*Edit); !ok { - return nil, fmt.Errorf("Unable to convert return value to the right type?!: %s", pyret0.Type()) - } else { - v2.data = t - return v2, nil - } - case *backend.View: - pyret0, err := _viewClass.Alloc(1) - if err != nil { - return nil, err - } else if v2, ok := pyret0.(*View); !ok { - return nil, fmt.Errorf("Unable to convert return value to the right type?!: %s", pyret0.Type()) - } else { - v2.data = t - return v2, nil - } - case text.Region: - pyret0, err := _regionClass.Alloc(1) - if err != nil { - return nil, err - } else if v2, ok := pyret0.(*Region); !ok { - return nil, fmt.Errorf("Unable to convert return value to the right type?!: %s", pyret0.Type()) - } else { - v2.data = t - return v2, nil - } - case *text.RegionSet: - pyret0, err := _region_setClass.Alloc(1) - if err != nil { - return nil, err - } else if v2, ok := pyret0.(*RegionSet); !ok { - return nil, fmt.Errorf("Unable to convert return value to the right type?!: %s", pyret0.Type()) - } else { - v2.data = t - return v2, nil - } - case *backend.Window: - if t == nil { - panic(t) - } - pyret0, err := _windowClass.Alloc(1) - if err != nil { - return nil, err - } else if v2, ok := pyret0.(*Window); !ok { - return nil, fmt.Errorf("Unable to convert return value to the right type?!: %s", pyret0.Type()) - } else { - v2.data = t - return v2, nil - } - case List: - ret, err := py.NewList(int64(len(t))) - if err != nil { - return nil, err - } - for k, v := range t { - if p, err := toPython(v); err != nil { - ret.Decref() - return nil, err - } else if err := ret.SetItem(int64(k), p); err != nil { - ret.Decref() - return nil, err - } - } - return ret, nil - case Tuple: - ret, err := py.NewTuple(int64(len(t))) - if err != nil { - return nil, err - } - for k, v := range t { - if p, err := toPython(v); err != nil { - ret.Decref() - return nil, err - } else if err := ret.SetItem(int64(k), p); err != nil { - ret.Decref() - return nil, err - } - } - return ret, nil - case backend.Args: - ret, err := py.NewDict() - if err != nil { - return nil, err - } - for k, v := range t { - if p, err := toPython(v); err != nil { - ret.Decref() - return nil, err - } else if err := ret.SetItemString(k, p); err != nil { - p.Decref() - ret.Decref() - return nil, err - } else { - p.Decref() - } - } - return ret, nil - default: - switch t := reflect.ValueOf(r); t.Kind() { - case reflect.Int: - return toPython(t.Int()) - case reflect.Slice: - ret, err := py.NewList(int64(t.Len())) - if err != nil { - return nil, err - } - for i := 0; i < t.Len(); i++ { - if p, err := toPython(t.Index(i).Interface()); err != nil { - ret.Decref() - return nil, err - } else if err := ret.SetItem(int64(i), p); err != nil { - ret.Decref() - return nil, err - } - } - return ret, nil - } - return nil, fmt.Errorf("Can't return type %v from go to python", reflect.TypeOf(t)) - } -} - -func fromPython(r py.Object) (interface{}, error) { - switch t := r.(type) { - case *py.NoneObject: - return nil, nil - case *py.Long: - return int(t.Int64()), nil - case *py.Bool: - return t.Bool(), nil - case *py.Unicode: - return t.String(), nil - case *py.Float: - return t.Float64(), nil - case *Edit: - return t.data, nil - case *Region: - return t.data, nil - case *py.List: - g := make(List, t.Size()) - for i, r := range t.Slice() { - if v, err := fromPython(r); err != nil { - return nil, err - } else { - g[i] = v - } - } - return g, nil - case *TextCommandGlue: - t.Incref() - return t, nil - case *WindowCommandGlue: - t.Incref() - return t, nil - case *ApplicationCommandGlue: - t.Incref() - return t, nil - case *py.Tuple: - g := make(Tuple, t.Size()) - for i, r := range t.Slice() { - if v, err := fromPython(r); err != nil { - return nil, err - } else { - g[i] = v - } - } - return g, nil - case *py.Dict: - ms, err := t.MapString() - if err != nil { - return nil, err - } - m2 := make(backend.Args) - for k, v := range ms { - if v2, err := fromPython(v); err != nil { - return nil, err - } else { - m2[k] = v2 - } - } - return m2, nil - default: - return nil, fmt.Errorf("Cannot convert type %s from python to go", r.Type()) - } -} diff --git a/backend/sublime/doc.go b/backend/sublime/doc.go deleted file mode 100644 index 10974fc..0000000 --- a/backend/sublime/doc.go +++ /dev/null @@ -1,11 +0,0 @@ -// Copyright 2014 The lime Authors. -// Use of this source code is governed by a 2-clause -// BSD-style license that can be found in the LICENSE file. - -// This package enables support for Sublime Text 3 -// python plugins and is an optional import for -// frontends. -// -// Most of the code here is generated (See: https://github.com/limetext/lime/blob/master/tasks/build/gen_python_api.go) -// and should not be changed manually. -package sublime diff --git a/backend/sublime/edit_generated.go b/backend/sublime/edit_generated.go deleted file mode 100644 index e9fa1f5..0000000 --- a/backend/sublime/edit_generated.go +++ /dev/null @@ -1,37 +0,0 @@ -// Copyright 2015 The lime Authors. -// Use of this source code is governed by a 2-clause -// BSD-style license that can be found in the LICENSE file. - -// This file was generated by tasks/build/gen_python_api.go and shouldn't be manually modified - -package sublime - -import ( - "fmt" - "github.com/limetext/gopy/lib" - "github.com/limetext/lime/backend" - "github.com/limetext/text" -) - -var ( - _ = backend.View{} - _ = text.Region{} - _ = fmt.Errorf -) - -var _editClass = py.Class{ - Name: "sublime.Edit", - Pointer: (*Edit)(nil), -} - -type Edit struct { - py.BaseObject - data *backend.Edit -} - -func (o *Edit) PyInit(args *py.Tuple, kwds *py.Dict) error { - return fmt.Errorf("Can't initialize type Edit") -} -func (o *Edit) PyStr() string { - return o.data.String() -} diff --git a/backend/sublime/events_manual.go b/backend/sublime/events_manual.go deleted file mode 100644 index 2e738b6..0000000 --- a/backend/sublime/events_manual.go +++ /dev/null @@ -1,184 +0,0 @@ -// Copyright 2013 The lime Authors. -// Use of this source code is governed by a 2-clause -// BSD-style license that can be found in the LICENSE file. - -package sublime - -import ( - "fmt" - "github.com/limetext/gopy/lib" - "github.com/limetext/lime/backend" - "github.com/limetext/lime/backend/log" - "github.com/limetext/lime/backend/util" - "github.com/limetext/text" -) - -var ( - _ = backend.View{} - _ = text.Region{} -) - -var ( - _onQueryContextGlueClass = py.Class{ - Name: "sublime.OnQueryContextGlue", - Pointer: (*OnQueryContextGlue)(nil), - } - _viewEventGlueClass = py.Class{ - Name: "sublime.ViewEventGlue", - Pointer: (*ViewEventGlue)(nil), - } -) - -type ( - OnQueryContextGlue struct { - py.BaseObject - inner py.Object - } - ViewEventGlue struct { - py.BaseObject - inner py.Object - } -) - -var evmap = map[string]*backend.ViewEvent{ - "on_new": &backend.OnNew, - "on_load": &backend.OnLoad, - "on_activated": &backend.OnActivated, - "on_deactivated": &backend.OnDeactivated, - "on_pre_close": &backend.OnPreClose, - "on_close": &backend.OnClose, - "on_pre_save": &backend.OnPreSave, - "on_post_save": &backend.OnPostSave, - "on_modified": &backend.OnModified, - "on_selection_modified": &backend.OnSelectionModified, -} - -func (c *ViewEventGlue) PyInit(args *py.Tuple, kwds *py.Dict) error { - if args.Size() != 2 { - return fmt.Errorf("Expected 2 arguments not %d", args.Size()) - } - if v, err := args.GetItem(0); err != nil { - return err - } else { - c.inner = v - } - if v, err := args.GetItem(1); err != nil { - return err - } else if v2, ok := v.(*py.Unicode); !ok { - return fmt.Errorf("Second argument not a string: %v", v) - } else { - ev := evmap[v2.String()] - if ev == nil { - return fmt.Errorf("Unknown event: %s", v2) - } - ev.Add(c.onEvent) - c.inner.Incref() - c.Incref() - } - return nil -} - -func (c *ViewEventGlue) onEvent(v *backend.View) { - l := py.NewLock() - defer l.Unlock() - pv, err := toPython(v) - if err != nil { - log.Error(err) - } - defer pv.Decref() - log.Fine("onEvent: %v, %v, %v", c, c.inner, pv) - // interrupt := true - // defer func() { interrupt = false }() - // go func() { - // <-time.After(time.Second * 5) - // if interrupt { - // py.SetInterrupt() - // } - // }() - - if ret, err := c.inner.Base().CallFunctionObjArgs(pv); err != nil { - log.Error(err) - } else if ret != nil { - ret.Decref() - } -} - -func (c *OnQueryContextGlue) PyInit(args *py.Tuple, kwds *py.Dict) error { - if args.Size() != 1 { - return fmt.Errorf("Expected only 1 argument not %d", args.Size()) - } - if v, err := args.GetItem(0); err != nil { - return err - } else { - c.inner = v - } - c.inner.Incref() - c.Incref() - - backend.OnQueryContext.Add(c.onQueryContext) - return nil -} - -func (c *OnQueryContextGlue) onQueryContext(v *backend.View, key string, operator util.Op, operand interface{}, match_all bool) backend.QueryContextReturn { - l := py.NewLock() - defer l.Unlock() - - var ( - pv, pk, po, poa, pm, ret py.Object - err error - ) - if pv, err = toPython(v); err != nil { - log.Error(err) - return backend.Unknown - } - defer pv.Decref() - - if pk, err = toPython(key); err != nil { - log.Error(err) - return backend.Unknown - } - defer pk.Decref() - - if po, err = toPython(operator); err != nil { - log.Error(err) - return backend.Unknown - } - defer po.Decref() - - if poa, err = toPython(operand); err != nil { - log.Error(err) - return backend.Unknown - } - defer poa.Decref() - - if pm, err = toPython(match_all); err != nil { - log.Error(err) - return backend.Unknown - } - defer pm.Decref() - // interrupt := true - // defer func() { interrupt = false }() - // go func() { - // <-time.After(time.Second * 5) - // if interrupt { - // py.SetInterrupt() - // } - // }() - - if ret, err = c.inner.Base().CallFunctionObjArgs(pv, pk, po, poa, pm); err != nil { - log.Error(err) - return backend.Unknown - } - defer ret.Decref() - - if r2, ok := ret.(*py.Bool); ok { - if r2.Bool() { - return backend.True - } else { - return backend.False - } - } else { - log.Fine("other: %v", ret) - } - return backend.Unknown -} diff --git a/backend/sublime/frontend_generated.go b/backend/sublime/frontend_generated.go deleted file mode 100644 index 04145c9..0000000 --- a/backend/sublime/frontend_generated.go +++ /dev/null @@ -1,125 +0,0 @@ -// Copyright 2015 The lime Authors. -// Use of this source code is governed by a 2-clause -// BSD-style license that can be found in the LICENSE file. - -// This file was generated by tasks/build/gen_python_api.go and shouldn't be manually modified - -package sublime - -import ( - "fmt" - "github.com/limetext/gopy/lib" - "github.com/limetext/lime/backend" - "github.com/limetext/text" -) - -var ( - _ = backend.View{} - _ = text.Region{} - _ = fmt.Errorf -) - -func sublime_ErrorMessage(tu *py.Tuple) (py.Object, error) { - var ( - arg1 string - ) - if v, err := tu.GetItem(0); err != nil { - return nil, err - } else { - if v3, err2 := fromPython(v); err2 != nil { - return nil, err2 - } else { - if v2, ok := v3.(string); !ok { - return nil, fmt.Errorf("Expected type string for backend.DummyFrontend.ErrorMessage() arg1, not %s", v.Type()) - } else { - arg1 = v2 - } - } - } - backend.GetEditor().Frontend().ErrorMessage(arg1) - return toPython(nil) -} - -func sublime_MessageDialog(tu *py.Tuple) (py.Object, error) { - var ( - arg1 string - ) - if v, err := tu.GetItem(0); err != nil { - return nil, err - } else { - if v3, err2 := fromPython(v); err2 != nil { - return nil, err2 - } else { - if v2, ok := v3.(string); !ok { - return nil, fmt.Errorf("Expected type string for backend.DummyFrontend.MessageDialog() arg1, not %s", v.Type()) - } else { - arg1 = v2 - } - } - } - backend.GetEditor().Frontend().MessageDialog(arg1) - return toPython(nil) -} - -func sublime_OkCancelDialog(tu *py.Tuple) (py.Object, error) { - var ( - arg1 string - arg2 string - ) - if v, err := tu.GetItem(0); err != nil { - return nil, err - } else { - if v3, err2 := fromPython(v); err2 != nil { - return nil, err2 - } else { - if v2, ok := v3.(string); !ok { - return nil, fmt.Errorf("Expected type string for backend.DummyFrontend.OkCancelDialog() arg1, not %s", v.Type()) - } else { - arg1 = v2 - } - } - } - if v, err := tu.GetItem(1); err != nil { - return nil, err - } else { - if v3, err2 := fromPython(v); err2 != nil { - return nil, err2 - } else { - if v2, ok := v3.(string); !ok { - return nil, fmt.Errorf("Expected type string for backend.DummyFrontend.OkCancelDialog() arg2, not %s", v.Type()) - } else { - arg2 = v2 - } - } - } - ret0 := backend.GetEditor().Frontend().OkCancelDialog(arg1, arg2) - var err error - var pyret0 py.Object - - pyret0, err = toPython(ret0) - if err != nil { - return nil, err - } - return pyret0, err -} - -func sublime_StatusMessage(tu *py.Tuple) (py.Object, error) { - var ( - arg1 string - ) - if v, err := tu.GetItem(0); err != nil { - return nil, err - } else { - if v3, err2 := fromPython(v); err2 != nil { - return nil, err2 - } else { - if v2, ok := v3.(string); !ok { - return nil, fmt.Errorf("Expected type string for backend.DummyFrontend.StatusMessage() arg1, not %s", v.Type()) - } else { - arg1 = v2 - } - } - } - backend.GetEditor().Frontend().StatusMessage(arg1) - return toPython(nil) -} diff --git a/backend/sublime/region_generated.go b/backend/sublime/region_generated.go deleted file mode 100644 index 3a6420f..0000000 --- a/backend/sublime/region_generated.go +++ /dev/null @@ -1,335 +0,0 @@ -// Copyright 2015 The lime Authors. -// Use of this source code is governed by a 2-clause -// BSD-style license that can be found in the LICENSE file. - -// This file was generated by tasks/build/gen_python_api.go and shouldn't be manually modified - -package sublime - -import ( - "fmt" - "github.com/limetext/gopy/lib" - "github.com/limetext/lime/backend" - "github.com/limetext/text" -) - -var ( - _ = backend.View{} - _ = text.Region{} - _ = fmt.Errorf -) - -var _regionClass = py.Class{ - Name: "sublime.Region", - Pointer: (*Region)(nil), -} - -type Region struct { - py.BaseObject - data text.Region -} - -func (o *Region) PyInit(args *py.Tuple, kwds *py.Dict) error { - if args.Size() > 2 { - return fmt.Errorf("Expected at most 2 arguments") - } - - if args.Size() > 0 { - if v, err := args.GetItem(0); err != nil { - return err - } else { - if v3, err2 := fromPython(v); err2 != nil { - return err2 - } else { - if v2, ok := v3.(int); !ok { - return fmt.Errorf("Expected type int for Region.A, not %s", v.Type()) - } else { - o.data.A = v2 - } - } - } - } - - if args.Size() > 1 { - if v, err := args.GetItem(1); err != nil { - return err - } else { - if v3, err2 := fromPython(v); err2 != nil { - return err2 - } else { - if v2, ok := v3.(int); !ok { - return fmt.Errorf("Expected type int for Region.B, not %s", v.Type()) - } else { - o.data.B = v2 - } - } - } - } - - return nil -} -func (o *Region) Py_begin() (py.Object, error) { - ret0 := o.data.Begin() - var err error - var pyret0 py.Object - - pyret0, err = toPython(ret0) - if err != nil { - return nil, err - } - return pyret0, err -} - -func (o *Region) Py_clip(tu *py.Tuple) (py.Object, error) { - var ( - arg1 text.Region - ) - if v, err := tu.GetItem(0); err != nil { - return nil, err - } else { - if v3, err2 := fromPython(v); err2 != nil { - return nil, err2 - } else { - if v2, ok := v3.(text.Region); !ok { - return nil, fmt.Errorf("Expected type text.Region for text.Region.Clip() arg1, not %s", v.Type()) - } else { - arg1 = v2 - } - } - } - ret0 := o.data.Clip(arg1) - var err error - var pyret0 py.Object - - pyret0, err = toPython(ret0) - if err != nil { - return nil, err - } - return pyret0, err -} - -func (o *Region) Py_contains(tu *py.Tuple) (py.Object, error) { - var ( - arg1 int - ) - if v, err := tu.GetItem(0); err != nil { - return nil, err - } else { - if v3, err2 := fromPython(v); err2 != nil { - return nil, err2 - } else { - if v2, ok := v3.(int); !ok { - return nil, fmt.Errorf("Expected type int for text.Region.Contains() arg1, not %s", v.Type()) - } else { - arg1 = v2 - } - } - } - ret0 := o.data.Contains(arg1) - var err error - var pyret0 py.Object - - pyret0, err = toPython(ret0) - if err != nil { - return nil, err - } - return pyret0, err -} - -func (o *Region) Py_cover(tu *py.Tuple) (py.Object, error) { - var ( - arg1 text.Region - ) - if v, err := tu.GetItem(0); err != nil { - return nil, err - } else { - if v3, err2 := fromPython(v); err2 != nil { - return nil, err2 - } else { - if v2, ok := v3.(text.Region); !ok { - return nil, fmt.Errorf("Expected type text.Region for text.Region.Cover() arg1, not %s", v.Type()) - } else { - arg1 = v2 - } - } - } - ret0 := o.data.Cover(arg1) - var err error - var pyret0 py.Object - - pyret0, err = toPython(ret0) - if err != nil { - return nil, err - } - return pyret0, err -} - -func (o *Region) Py_covers(tu *py.Tuple) (py.Object, error) { - var ( - arg1 text.Region - ) - if v, err := tu.GetItem(0); err != nil { - return nil, err - } else { - if v3, err2 := fromPython(v); err2 != nil { - return nil, err2 - } else { - if v2, ok := v3.(text.Region); !ok { - return nil, fmt.Errorf("Expected type text.Region for text.Region.Covers() arg1, not %s", v.Type()) - } else { - arg1 = v2 - } - } - } - ret0 := o.data.Covers(arg1) - var err error - var pyret0 py.Object - - pyret0, err = toPython(ret0) - if err != nil { - return nil, err - } - return pyret0, err -} - -func (o *Region) Py_empty() (py.Object, error) { - ret0 := o.data.Empty() - var err error - var pyret0 py.Object - - pyret0, err = toPython(ret0) - if err != nil { - return nil, err - } - return pyret0, err -} - -func (o *Region) Py_end() (py.Object, error) { - ret0 := o.data.End() - var err error - var pyret0 py.Object - - pyret0, err = toPython(ret0) - if err != nil { - return nil, err - } - return pyret0, err -} - -func (o *Region) Py_intersection(tu *py.Tuple) (py.Object, error) { - var ( - arg1 text.Region - ) - if v, err := tu.GetItem(0); err != nil { - return nil, err - } else { - if v3, err2 := fromPython(v); err2 != nil { - return nil, err2 - } else { - if v2, ok := v3.(text.Region); !ok { - return nil, fmt.Errorf("Expected type text.Region for text.Region.Intersection() arg1, not %s", v.Type()) - } else { - arg1 = v2 - } - } - } - ret0 := o.data.Intersection(arg1) - var err error - var pyret0 py.Object - - pyret0, err = toPython(ret0) - if err != nil { - return nil, err - } - return pyret0, err -} - -func (o *Region) Py_intersects(tu *py.Tuple) (py.Object, error) { - var ( - arg1 text.Region - ) - if v, err := tu.GetItem(0); err != nil { - return nil, err - } else { - if v3, err2 := fromPython(v); err2 != nil { - return nil, err2 - } else { - if v2, ok := v3.(text.Region); !ok { - return nil, fmt.Errorf("Expected type text.Region for text.Region.Intersects() arg1, not %s", v.Type()) - } else { - arg1 = v2 - } - } - } - ret0 := o.data.Intersects(arg1) - var err error - var pyret0 py.Object - - pyret0, err = toPython(ret0) - if err != nil { - return nil, err - } - return pyret0, err -} - -func (o *Region) Py_size() (py.Object, error) { - ret0 := o.data.Size() - var err error - var pyret0 py.Object - - pyret0, err = toPython(ret0) - if err != nil { - return nil, err - } - return pyret0, err -} - -func (o *Region) PyStr() string { - return o.data.String() -} - -func (o *Region) PyGet_a() (py.Object, error) { - ret := o.data.A - var pyret py.Object - var err error - - pyret, err = toPython(ret) - return pyret, err - -} - -func (o *Region) PySet_a(v py.Object) error { - if v3, err2 := fromPython(v); err2 != nil { - return err2 - } else { - if v2, ok := v3.(int); !ok { - return fmt.Errorf("Expected type int for Region.A, not %s", v.Type()) - } else { - o.data.A = v2 - } - } - return nil -} - -func (o *Region) PyGet_b() (py.Object, error) { - ret := o.data.B - var pyret py.Object - var err error - - pyret, err = toPython(ret) - return pyret, err - -} - -func (o *Region) PySet_b(v py.Object) error { - if v3, err2 := fromPython(v); err2 != nil { - return err2 - } else { - if v2, ok := v3.(int); !ok { - return fmt.Errorf("Expected type int for Region.B, not %s", v.Type()) - } else { - o.data.B = v2 - } - } - return nil -} diff --git a/backend/sublime/region_manual.go b/backend/sublime/region_manual.go deleted file mode 100644 index 6dc5389..0000000 --- a/backend/sublime/region_manual.go +++ /dev/null @@ -1,44 +0,0 @@ -// Copyright 2013 The lime Authors. -// Use of this source code is governed by a 2-clause -// BSD-style license that can be found in the LICENSE file. - -package sublime - -import ( - "fmt" - "github.com/limetext/gopy/lib" - "github.com/limetext/text" -) - -func (o *Region) PyRichCompare(other py.Object, op py.Op) (py.Object, error) { - if op != py.EQ && op != py.NE { - return nil, fmt.Errorf("Can only do EQ and NE compares") - } - var o2 text.Region - switch t := other.(type) { - case *Region: - o2 = t.data - case *py.Tuple: - if s := t.Size(); s != 2 { - return nil, fmt.Errorf("Invalid tuple size: %d != 2", s) - } - if a, err := t.GetItem(0); err != nil { - return nil, err - } else if b, err := t.GetItem(1); err != nil { - return nil, err - } else if a2, ok := a.(*py.Long); !ok { - return nil, fmt.Errorf("Can only compare with int tuples and other regions") - } else if b2, ok := b.(*py.Long); !ok { - return nil, fmt.Errorf("Can only compare with int tuples and other regions") - } else { - o2 = text.Region{A: int(a2.Int64()), B: int(b2.Int64())} - } - default: - return nil, fmt.Errorf("Can only compare with int tuples and other regions") - } - if op == py.EQ { - return toPython(o.data == o2) - } else { - return toPython(o.data != o2) - } -} diff --git a/backend/sublime/regionset_generated.go b/backend/sublime/regionset_generated.go deleted file mode 100644 index 0819395..0000000 --- a/backend/sublime/regionset_generated.go +++ /dev/null @@ -1,163 +0,0 @@ -// Copyright 2015 The lime Authors. -// Use of this source code is governed by a 2-clause -// BSD-style license that can be found in the LICENSE file. - -// This file was generated by tasks/build/gen_python_api.go and shouldn't be manually modified - -package sublime - -import ( - "fmt" - "github.com/limetext/gopy/lib" - "github.com/limetext/lime/backend" - "github.com/limetext/text" -) - -var ( - _ = backend.View{} - _ = text.Region{} - _ = fmt.Errorf -) - -var _region_setClass = py.Class{ - Name: "sublime.RegionSet", - Pointer: (*RegionSet)(nil), -} - -type RegionSet struct { - py.BaseObject - data *text.RegionSet -} - -func (o *RegionSet) PyInit(args *py.Tuple, kwds *py.Dict) error { - return fmt.Errorf("Can't initialize type RegionSet") -} -func (o *RegionSet) Py_add(tu *py.Tuple) (py.Object, error) { - var ( - arg1 text.Region - ) - if v, err := tu.GetItem(0); err != nil { - return nil, err - } else { - if v3, err2 := fromPython(v); err2 != nil { - return nil, err2 - } else { - if v2, ok := v3.(text.Region); !ok { - return nil, fmt.Errorf("Expected type text.Region for text.RegionSet.Add() arg1, not %s", v.Type()) - } else { - arg1 = v2 - } - } - } - o.data.Add(arg1) - return toPython(nil) -} - -func (o *RegionSet) Py_add_all(tu *py.Tuple) (py.Object, error) { - var ( - arg1 []text.Region - ) - if v, err := tu.GetItem(0); err != nil { - return nil, err - } else { - if v3, err2 := fromPython(v); err2 != nil { - return nil, err2 - } else { - if v2, ok := v3.([]text.Region); !ok { - return nil, fmt.Errorf("Expected type []text.Region for text.RegionSet.AddAll() arg1, not %s", v.Type()) - } else { - arg1 = v2 - } - } - } - o.data.AddAll(arg1) - return toPython(nil) -} - -func (o *RegionSet) Py_clear() (py.Object, error) { - o.data.Clear() - return toPython(nil) -} - -func (o *RegionSet) Py_contains(tu *py.Tuple) (py.Object, error) { - var ( - arg1 text.Region - ) - if v, err := tu.GetItem(0); err != nil { - return nil, err - } else { - if v3, err2 := fromPython(v); err2 != nil { - return nil, err2 - } else { - if v2, ok := v3.(text.Region); !ok { - return nil, fmt.Errorf("Expected type text.Region for text.RegionSet.Contains() arg1, not %s", v.Type()) - } else { - arg1 = v2 - } - } - } - ret0 := o.data.Contains(arg1) - var err error - var pyret0 py.Object - - pyret0, err = toPython(ret0) - if err != nil { - return nil, err - } - return pyret0, err -} - -func (o *RegionSet) PySeqGet(arg0 int64) (py.Object, error) { - var ( - pyret0 py.Object - err error - ) - if l := o.data.Len(); int(arg0) >= l || arg0 < 0 { - return nil, py.NewError(py.IndexError, "%d >= %d || %d < 0", arg0, l, arg0) - } - - ret0 := o.data.Get(int(arg0)) - pyret0, err = toPython(ret0) - if err != nil { - // TODO: do the py objs need to be freed? - return nil, err - } - return pyret0, err -} - -func (o *RegionSet) PySeqLen() int64 { - return int64(o.data.Len()) -} - -func (o *RegionSet) Py_regions() (py.Object, error) { - ret0 := o.data.Regions() - var err error - var pyret0 py.Object - - pyret0, err = toPython(ret0) - if err != nil { - return nil, err - } - return pyret0, err -} - -func (o *RegionSet) Py_substract(tu *py.Tuple) (py.Object, error) { - var ( - arg1 text.Region - ) - if v, err := tu.GetItem(0); err != nil { - return nil, err - } else { - if v3, err2 := fromPython(v); err2 != nil { - return nil, err2 - } else { - if v2, ok := v3.(text.Region); !ok { - return nil, fmt.Errorf("Expected type text.Region for text.RegionSet.Substract() arg1, not %s", v.Type()) - } else { - arg1 = v2 - } - } - } - o.data.Substract(arg1) - return toPython(nil) -} diff --git a/backend/sublime/settings_generated.go b/backend/sublime/settings_generated.go deleted file mode 100644 index 9ea3a51..0000000 --- a/backend/sublime/settings_generated.go +++ /dev/null @@ -1,150 +0,0 @@ -// Copyright 2015 The lime Authors. -// Use of this source code is governed by a 2-clause -// BSD-style license that can be found in the LICENSE file. - -// This file was generated by tasks/build/gen_python_api.go and shouldn't be manually modified - -package sublime - -import ( - "fmt" - "github.com/limetext/gopy/lib" - "github.com/limetext/lime/backend" - "github.com/limetext/text" -) - -var ( - _ = backend.View{} - _ = text.Region{} - _ = fmt.Errorf -) - -var _settingsClass = py.Class{ - Name: "sublime.Settings", - Pointer: (*Settings)(nil), -} - -type Settings struct { - py.BaseObject - data *text.Settings -} - -func (o *Settings) PyInit(args *py.Tuple, kwds *py.Dict) error { - return fmt.Errorf("Can't initialize type Settings") -} -func (o *Settings) Py_add_on_change(tu *py.Tuple) (py.Object, error) { - var ( - arg1 string - arg2 text.OnChangeCallback - ) - if v, err := tu.GetItem(0); err != nil { - return nil, err - } else { - if v3, err2 := fromPython(v); err2 != nil { - return nil, err2 - } else { - if v2, ok := v3.(string); !ok { - return nil, fmt.Errorf("Expected type string for text.Settings.AddOnChange() arg1, not %s", v.Type()) - } else { - arg1 = v2 - } - } - } - if v, err := tu.GetItem(1); err != nil { - return nil, err - } else { - if v3, err2 := fromPython(v); err2 != nil { - return nil, err2 - } else { - if v2, ok := v3.(text.OnChangeCallback); !ok { - return nil, fmt.Errorf("Expected type text.OnChangeCallback for text.Settings.AddOnChange() arg2, not %s", v.Type()) - } else { - arg2 = v2 - } - } - } - o.data.AddOnChange(arg1, arg2) - return toPython(nil) -} - -func (o *Settings) Py_clear_on_change(tu *py.Tuple) (py.Object, error) { - var ( - arg1 string - ) - if v, err := tu.GetItem(0); err != nil { - return nil, err - } else { - if v3, err2 := fromPython(v); err2 != nil { - return nil, err2 - } else { - if v2, ok := v3.(string); !ok { - return nil, fmt.Errorf("Expected type string for text.Settings.ClearOnChange() arg1, not %s", v.Type()) - } else { - arg1 = v2 - } - } - } - o.data.ClearOnChange(arg1) - return toPython(nil) -} - -func (o *Settings) Py_erase(tu *py.Tuple) (py.Object, error) { - var ( - arg1 string - ) - if v, err := tu.GetItem(0); err != nil { - return nil, err - } else { - if v3, err2 := fromPython(v); err2 != nil { - return nil, err2 - } else { - if v2, ok := v3.(string); !ok { - return nil, fmt.Errorf("Expected type string for text.Settings.Erase() arg1, not %s", v.Type()) - } else { - arg1 = v2 - } - } - } - o.data.Erase(arg1) - return toPython(nil) -} - -func (o *Settings) Py_has(tu *py.Tuple) (py.Object, error) { - var ( - arg1 string - ) - if v, err := tu.GetItem(0); err != nil { - return nil, err - } else { - if v3, err2 := fromPython(v); err2 != nil { - return nil, err2 - } else { - if v2, ok := v3.(string); !ok { - return nil, fmt.Errorf("Expected type string for text.Settings.Has() arg1, not %s", v.Type()) - } else { - arg1 = v2 - } - } - } - ret0 := o.data.Has(arg1) - var err error - var pyret0 py.Object - - pyret0, err = toPython(ret0) - if err != nil { - return nil, err - } - return pyret0, err -} - -func (o *Settings) Py_id() (py.Object, error) { - ret0 := o.data.Id() - var err error - var pyret0 py.Object - - pyret0, err = toPython(ret0) - if err != nil { - return nil, err - } - return pyret0, err -} diff --git a/backend/sublime/settings_manual.go b/backend/sublime/settings_manual.go deleted file mode 100644 index 7d598b6..0000000 --- a/backend/sublime/settings_manual.go +++ /dev/null @@ -1,60 +0,0 @@ -// Copyright 2013 The lime Authors. -// Use of this source code is governed by a 2-clause -// BSD-style license that can be found in the LICENSE file. - -package sublime - -import ( - "fmt" - "github.com/limetext/gopy/lib" -) - -func (o *Settings) Py_get(tu *py.Tuple, kw *py.Dict) (py.Object, error) { - var ( - arg1 string - def py.Object - ) - v, err := tu.GetItem(0) - if err != nil { - return nil, err - } - if v2, ok := v.(*py.Unicode); !ok { - return nil, fmt.Errorf("Expected type *py.Unicode for backend.Settings.Get() arg1, not %s", v.Type()) - } else { - arg1 = v2.String() - } - if v, err := tu.GetItem(1); err == nil { - def = v - } - r := o.data.Get(arg1, def) - if r == def && r != nil { - def.Incref() - return def, nil - } - return toPython(r) -} - -func (o *Settings) Py_set(tu *py.Tuple, kw *py.Dict) (py.Object, error) { - var ( - arg1 string - ) - v, err := tu.GetItem(0) - if err != nil { - return nil, err - } - if v2, ok := v.(*py.Unicode); !ok { - return nil, fmt.Errorf("Expected type *py.Unicode for backend.Settings.Set() arg1, not %s", v.Type()) - } else { - arg1 = v2.String() - } - v, err = tu.GetItem(1) - if err != nil { - return nil, err - } - if v2, err := fromPython(v); err != nil { - return nil, err - } else { - o.data.Set(arg1, v2) - } - return toPython(nil) -} diff --git a/backend/sublime/sublime_api_generated.go b/backend/sublime/sublime_api_generated.go deleted file mode 100644 index 173b42b..0000000 --- a/backend/sublime/sublime_api_generated.go +++ /dev/null @@ -1,260 +0,0 @@ -// Copyright 2015 The lime Authors. -// Use of this source code is governed by a 2-clause -// BSD-style license that can be found in the LICENSE file. - -// This file was generated by tasks/build/gen_python_api.go and shouldn't be manually modified - -package sublime - -import ( - "fmt" - "github.com/limetext/gopy/lib" - "github.com/limetext/lime/backend" - "github.com/limetext/text" -) - -var ( - _ = backend.View{} - _ = text.Region{} - _ = fmt.Errorf -) - -func sublime_ActiveWindow() (py.Object, error) { - ret0 := backend.GetEditor().ActiveWindow() - var err error - var pyret0 py.Object - - pyret0, err = toPython(ret0) - if err != nil { - return nil, err - } - return pyret0, err -} - -func sublime_Arch() (py.Object, error) { - ret0 := backend.GetEditor().Arch() - var err error - var pyret0 py.Object - - pyret0, err = toPython(ret0) - if err != nil { - return nil, err - } - return pyret0, err -} - -func sublime_GetClipboard() (py.Object, error) { - ret0 := backend.GetEditor().GetClipboard() - var err error - var pyret0 py.Object - - pyret0, err = toPython(ret0) - if err != nil { - return nil, err - } - return pyret0, err -} - -func sublime_LogCommands(tu *py.Tuple) (py.Object, error) { - var ( - arg1 bool - ) - if v, err := tu.GetItem(0); err != nil { - return nil, err - } else { - if v3, err2 := fromPython(v); err2 != nil { - return nil, err2 - } else { - if v2, ok := v3.(bool); !ok { - return nil, fmt.Errorf("Expected type bool for backend.Editor.LogCommands() arg1, not %s", v.Type()) - } else { - arg1 = v2 - } - } - } - backend.GetEditor().LogCommands(arg1) - return toPython(nil) -} - -func sublime_LogInput(tu *py.Tuple) (py.Object, error) { - var ( - arg1 bool - ) - if v, err := tu.GetItem(0); err != nil { - return nil, err - } else { - if v3, err2 := fromPython(v); err2 != nil { - return nil, err2 - } else { - if v2, ok := v3.(bool); !ok { - return nil, fmt.Errorf("Expected type bool for backend.Editor.LogInput() arg1, not %s", v.Type()) - } else { - arg1 = v2 - } - } - } - backend.GetEditor().LogInput(arg1) - return toPython(nil) -} - -func sublime_NewWindow() (py.Object, error) { - ret0 := backend.GetEditor().NewWindow() - var err error - var pyret0 py.Object - - pyret0, err = toPython(ret0) - if err != nil { - return nil, err - } - return pyret0, err -} - -func sublime_PackagesPath() (py.Object, error) { - ret0 := backend.GetEditor().PackagesPath() - var err error - var pyret0 py.Object - - pyret0, err = toPython(ret0) - if err != nil { - return nil, err - } - return pyret0, err -} - -func sublime_Plat() (py.Object, error) { - ret0 := backend.GetEditor().Plat() - var err error - var pyret0 py.Object - - pyret0, err = toPython(ret0) - if err != nil { - return nil, err - } - return pyret0, err -} - -func sublime_Platform() (py.Object, error) { - ret0 := backend.GetEditor().Platform() - var err error - var pyret0 py.Object - - pyret0, err = toPython(ret0) - if err != nil { - return nil, err - } - return pyret0, err -} - -func sublime_RunCommand(tu *py.Tuple) (py.Object, error) { - var ( - arg1 string - arg2 backend.Args - ) - if v, err := tu.GetItem(0); err != nil { - return nil, err - } else { - if v3, err2 := fromPython(v); err2 != nil { - return nil, err2 - } else { - if v2, ok := v3.(string); !ok { - return nil, fmt.Errorf("Expected type string for backend.Editor.RunCommand() arg1, not %s", v.Type()) - } else { - arg1 = v2 - } - } - } - arg2 = make(backend.Args) - if v, err := tu.GetItem(1); err == nil { - if v3, err2 := fromPython(v); err2 != nil { - return nil, err2 - } else { - if v2, ok := v3.(backend.Args); !ok { - return nil, fmt.Errorf("Expected type backend.Args for backend.Editor.RunCommand() arg2, not %s", v.Type()) - } else { - arg2 = v2 - } - } - } - backend.GetEditor().RunCommand(arg1, arg2) - return toPython(nil) -} - -func sublime_SetClipboard(tu *py.Tuple) (py.Object, error) { - var ( - arg1 string - ) - if v, err := tu.GetItem(0); err != nil { - return nil, err - } else { - if v3, err2 := fromPython(v); err2 != nil { - return nil, err2 - } else { - if v2, ok := v3.(string); !ok { - return nil, fmt.Errorf("Expected type string for backend.Editor.SetClipboard() arg1, not %s", v.Type()) - } else { - arg1 = v2 - } - } - } - backend.GetEditor().SetClipboard(arg1) - return toPython(nil) -} - -func sublime_Settings() (py.Object, error) { - ret0 := backend.GetEditor().Settings() - var err error - var pyret0 py.Object - - pyret0, err = toPython(ret0) - if err != nil { - return nil, err - } - return pyret0, err -} - -func sublime_Version() (py.Object, error) { - ret0 := backend.GetEditor().Version() - var err error - var pyret0 py.Object - - pyret0, err = toPython(ret0) - if err != nil { - return nil, err - } - return pyret0, err -} - -func sublime_Windows() (py.Object, error) { - ret0 := backend.GetEditor().Windows() - var err error - var pyret0 py.Object - - pyret0, err = toPython(ret0) - if err != nil { - return nil, err - } - return pyret0, err -} - -var sublime_methods = []py.Method{ - {Name: "register", Func: sublime_Register}, - {Name: "unregister", Func: sublime_Unregister}, - {Name: "error_message", Func: sublime_ErrorMessage}, - {Name: "message_dialog", Func: sublime_MessageDialog}, - {Name: "ok_cancel_dialog", Func: sublime_OkCancelDialog}, - {Name: "status_message", Func: sublime_StatusMessage}, - {Name: "active_window", Func: sublime_ActiveWindow}, - {Name: "arch", Func: sublime_Arch}, - {Name: "get_clipboard", Func: sublime_GetClipboard}, - {Name: "log_commands", Func: sublime_LogCommands}, - {Name: "log_input", Func: sublime_LogInput}, - {Name: "new_window", Func: sublime_NewWindow}, - {Name: "packages_path", Func: sublime_PackagesPath}, - {Name: "plat", Func: sublime_Plat}, - {Name: "platform", Func: sublime_Platform}, - {Name: "run_command", Func: sublime_RunCommand}, - {Name: "set_clipboard", Func: sublime_SetClipboard}, - {Name: "settings", Func: sublime_Settings}, - {Name: "version", Func: sublime_Version}, - {Name: "windows", Func: sublime_Windows}, -} diff --git a/backend/sublime/sublime_manual.go b/backend/sublime/sublime_manual.go deleted file mode 100644 index 1b22630..0000000 --- a/backend/sublime/sublime_manual.go +++ /dev/null @@ -1,268 +0,0 @@ -// Copyright 2013 The lime Authors. -// Use of this source code is governed by a 2-clause -// BSD-style license that can be found in the LICENSE file. - -package sublime - -import ( - "fmt" - "github.com/limetext/gopy/lib" - "github.com/limetext/lime/backend" - "github.com/limetext/lime/backend/log" - "github.com/limetext/lime/backend/packages" - "github.com/limetext/lime/backend/render" - "github.com/limetext/lime/backend/util" - "github.com/limetext/lime/backend/watch" - "os" - "path" - "time" -) - -func sublime_Console(tu *py.Tuple, kwargs *py.Dict) (py.Object, error) { - if tu.Size() != 1 { - return nil, fmt.Errorf("Unexpected argument count: %d", tu.Size()) - } - if i, err := tu.GetItem(0); err != nil { - return nil, err - } else { - log.Info("Python sez: %s", i) - } - return toPython(nil) -} - -func sublime_set_timeout(tu *py.Tuple, kwargs *py.Dict) (py.Object, error) { - var ( - pyarg py.Object - ) - if tu.Size() != 2 { - return nil, fmt.Errorf("Unexpected argument count: %d", tu.Size()) - } - if i, err := tu.GetItem(0); err != nil { - return nil, err - } else { - pyarg = i - } - if i, err := tu.GetItem(1); err != nil { - return nil, err - } else if v, err := fromPython(i); err != nil { - return nil, err - } else if v2, ok := v.(int); !ok { - return nil, fmt.Errorf("Expected int not %s", i.Type()) - } else { - pyarg.Incref() - go func() { - time.Sleep(time.Millisecond * time.Duration(v2)) - l := py.NewLock() - defer l.Unlock() - defer pyarg.Decref() - if ret, err := pyarg.Base().CallFunctionObjArgs(); err != nil { - log.Debug("Error in callback: %v", err) - } else { - ret.Decref() - } - }() - } - return toPython(nil) -} - -func init() { - backend.OnInit.Add(onInit) - - sublime_methods = append(sublime_methods, py.Method{Name: "console", Func: sublime_Console}, py.Method{Name: "set_timeout", Func: sublime_set_timeout}) - backend.GetEditor() - l := py.InitAndLock() - defer l.Unlock() - // py.InitializeEx(false) - m, err := py.InitModule("sublime", sublime_methods) - if err != nil { - panic(err) - } - - type class struct { - name string - c *py.Class - } - classes := []class{ - {"Region", &_regionClass}, - {"RegionSet", &_region_setClass}, - {"View", &_viewClass}, - {"Window", &_windowClass}, - {"Edit", &_editClass}, - {"Settings", &_settingsClass}, - {"WindowCommandGlue", &_windowCommandGlueClass}, - {"TextCommandGlue", &_textCommandGlueClass}, - {"ApplicationCommandGlue", &_applicationCommandGlueClass}, - {"OnQueryContextGlue", &_onQueryContextGlueClass}, - {"ViewEventGlue", &_viewEventGlueClass}, - } - type constant struct { - name string - constant int - } - constants := []constant{ - {"OP_EQUAL", int(util.OpEqual)}, - {"OP_NOT_EQUAL", int(util.OpNotEqual)}, - {"OP_REGEX_MATCH", int(util.OpRegexMatch)}, - {"OP_NOT_REGEX_MATCH", int(util.OpNotRegexMatch)}, - {"OP_REGEX_CONTAINS", int(util.OpRegexContains)}, - {"OP_NOT_REGEX_CONTAINS", int(util.OpNotRegexContains)}, - {"INHIBIT_WORD_COMPLETIONS", 0}, - {"INHIBIT_EXPLICIT_COMPLETIONS", 0}, - {"LITERAL", int(backend.IGNORECASE)}, - {"IGNORECASE", int(backend.LITERAL)}, - {"CLASS_WORD_START", int(backend.CLASS_WORD_START)}, - {"CLASS_WORD_END", int(backend.CLASS_WORD_END)}, - {"CLASS_PUNCTUATION_START", int(backend.CLASS_PUNCTUATION_START)}, - {"CLASS_PUNCTUATION_END", int(backend.CLASS_PUNCTUATION_END)}, - {"CLASS_SUB_WORD_START", int(backend.CLASS_SUB_WORD_START)}, - {"CLASS_SUB_WORD_END", int(backend.CLASS_SUB_WORD_END)}, - {"CLASS_LINE_START", int(backend.CLASS_LINE_START)}, - {"CLASS_LINE_END", int(backend.CLASS_LINE_END)}, - {"CLASS_EMPTY_LINE", int(backend.CLASS_EMPTY_LINE)}, - {"CLASS_MIDDLE_WORD", int(backend.CLASS_MIDDLE_WORD)}, - {"CLASS_WORD_START_WITH_PUNCTUATION", int(backend.CLASS_WORD_START_WITH_PUNCTUATION)}, - {"CLASS_WORD_END_WITH_PUNCTUATION", int(backend.CLASS_WORD_END_WITH_PUNCTUATION)}, - {"CLASS_OPENING_PARENTHESIS", int(backend.CLASS_OPENING_PARENTHESIS)}, - {"CLASS_CLOSING_PARENTHESIS", int(backend.CLASS_CLOSING_PARENTHESIS)}, - {"DRAW_EMPTY", int(render.DRAW_EMPTY)}, - {"HIDE_ON_MINIMAP", int(render.HIDE_ON_MINIMAP)}, - {"DRAW_EMPTY_AS_OVERWRITE", int(render.DRAW_EMPTY_AS_OVERWRITE)}, - {"DRAW_NO_FILL", int(render.DRAW_NO_FILL)}, - {"DRAW_NO_OUTLINE", int(render.DRAW_NO_OUTLINE)}, - {"DRAW_SOLID_UNDERLINE", int(render.DRAW_SOLID_UNDERLINE)}, - {"DRAW_STIPPLED_UNDERLINE", int(render.DRAW_STIPPLED_UNDERLINE)}, - {"DRAW_SQUIGGLY_UNDERLINE", int(render.DRAW_SQUIGGLY_UNDERLINE)}, - {"PERSISTENT", int(render.PERSISTENT)}, - {"HIDDEN", int(render.HIDDEN)}, - } - - for _, cl := range classes { - c, err := cl.c.Create() - if err != nil { - panic(err) - } - if err := m.AddObject(cl.name, c); err != nil { - panic(err) - } - } - for _, c := range constants { - if err := m.AddIntConstant(c.name, c.constant); err != nil { - panic(err) - } - } - py.AddToPath(backend.LIME_PACKAGES_PATH) - py.AddToPath(backend.LIME_USER_PACKAGES_PATH) - py.AddToPath(path.Join("..", "..", "backend", "sublime")) -} - -// Wrapper for packages.Plugin and py.Module -// merges Plugin.Reload and loadPlugin for watcher -type plugin struct { - *packages.Plugin - m *py.Module -} - -func newPlugin(pl *packages.Plugin, m *py.Module) (p *plugin) { - p = &plugin{pl, m} - p.FileChanged(p.Name()) - if err := watcher.Watch(p.Name(), p); err != nil { - log.Errorf("Couldn't watch %s: %s", p.Name(), err) - } - p.loadKeyBindings() - p.loadSettings() - return -} - -func (p *plugin) FileChanged(name string) { - p.Reload() - p.loadPlugin() -} - -func (p *plugin) loadPlugin() { - fi := p.Get().([]os.FileInfo) - for _, f := range fi { - fn := f.Name() - s, err := py.NewUnicode(path.Base(p.Name()) + "." + fn[:len(fn)-3]) - if err != nil { - log.Error(err) - return - } - if r, err := p.m.Base().CallMethodObjArgs("reload_plugin", s); err != nil { - log.Error(err) - } else if r != nil { - r.Decref() - } - } -} - -func (p *plugin) load(pkg *packages.Packet) { - if err := pkg.Load(); err != nil { - log.Errorf("Failed to load packet %s: %s", pkg.Name(), err) - } else { - log.Info("Loaded %s", pkg.Name()) - if err := watcher.Watch(pkg.Name(), pkg); err != nil { - log.Warn("Couldn't watch %s: %s", pkg.Name(), err) - } - } -} - -func (p *plugin) loadKeyBindings() { - ed := backend.GetEditor() - tmp := ed.KeyBindings().Parent() - - ed.KeyBindings().SetParent(p) - p.KeyBindings().Parent().KeyBindings().SetParent(tmp) - - pt := path.Join(p.Name(), "Default.sublime-keymap") - p.load(packages.NewPacket(pt, p.KeyBindings().Parent().KeyBindings())) - - pt = path.Join(p.Name(), "Default ("+ed.Plat()+").sublime-keymap") - p.load(packages.NewPacket(pt, p.KeyBindings())) -} - -func (p *plugin) loadSettings() { - ed := backend.GetEditor() - tmp := ed.Settings().Parent() - - ed.Settings().SetParent(p) - p.Settings().Parent().Settings().Parent().Settings().SetParent(tmp) - - pt := path.Join(p.Name(), "Preferences.sublime-settings") - p.load(packages.NewPacket(pt, p.Settings().Parent().Settings().Parent().Settings())) - - pt = path.Join(p.Name(), "Preferences ("+ed.Plat()+").sublime-settings") - p.load(packages.NewPacket(pt, p.Settings().Parent().Settings())) - - pt = path.Join(backend.LIME_USER_PACKAGES_PATH, "Preferences.sublime-settings") - p.load(packages.NewPacket(pt, p.Settings())) -} - -var watcher *watch.Watcher - -func onInit() { - l := py.NewLock() - defer l.Unlock() - m, err := py.Import("sublime_plugin") - if err != nil { - panic(err) - } - sys, err := py.Import("sys") - if err != nil { - log.Debug(err) - } else { - defer sys.Decref() - } - - if watcher, err = watch.NewWatcher(); err != nil { - log.Errorf("Couldn't create watcher: %s", err) - } - - // TODO: add all plugins after supporting all commands - // plugins := packages.ScanPlugins(backend.LIME_PACKAGES_PATH, ".py") - // for _, p := range plugins { - // newPlugin(p, m) - // } - newPlugin(packages.NewPlugin(path.Join(backend.LIME_PACKAGES_PATH, "Vintageous"), ".py"), m) - - go watcher.Observe() -} diff --git a/backend/sublime/sublime_plugin.py b/backend/sublime/sublime_plugin.py deleted file mode 100644 index 84ba207..0000000 --- a/backend/sublime/sublime_plugin.py +++ /dev/null @@ -1,153 +0,0 @@ -import os -import os.path -import inspect -import traceback -import imp -import sublime -import sys -import importlib - - -class Command(object): - - def is_enabled(self, args=None): - return True - - def is_visible(self, args=None): - return True - - -class ApplicationCommand(Command): - pass - - -class WindowCommand(Command): - - def __init__(self, wnd): - self.window = wnd - - def run_(self, kwargs): - if kwargs and 'event' in kwargs: - del kwargs['event'] - - if kwargs: - self.run(**kwargs) - else: - self.run() - - -class TextCommand(Command): - - def __init__(self, view): - self.view = view - - def run__(self, edit_token, kwargs): - if kwargs and 'event' in kwargs: - del kwargs['event'] - - if kwargs: - self.run(edit_token, **kwargs) - else: - self.run(edit_token) - - -class EventListener(object): - pass - - -def fn(fullname): - paths = fullname.split(".") - paths = "/".join(paths) - for p in sys.path: - f = os.path.abspath(os.path.join(p, paths)) - if os.path.exists(f): - return f - f += ".py" - if os.path.exists(f): - return f - return None - - -class __myfinder: - - class myloader(object): - - def load_module(self, fullname): - if fullname in sys.modules: - return sys.modules[fullname] - f = fn(fullname) - if not f.endswith(".py"): - print("new module: %s" % f) - m = imp.new_module(fullname) - m.__path__ = f - sys.modules[fullname] = m - return m - return imp.load_source(fullname, f) - - def find_module(self, fullname, path=None): - f = fn(fullname) - if f and "/lime/" in f: # TODO - return self.myloader() - -sys.meta_path.append(__myfinder()) - - -def reload_plugin(module): - def cmdname(name): - if name.endswith("Command"): - name = name[:-7] - ret = "" - for c in name: - l = c.lower() - if c != l and len(ret) > 0: - ret += "_" - ret += l - return ret - print("Loading plugin %s" % module) - try: - module = importlib.import_module(module) - for item in inspect.getmembers(module): - if not isinstance(item[1], type(EventListener)): - continue - - try: - cmd = cmdname(item[0]) - if issubclass(item[1], EventListener): - inst = item[1]() - toadd = getattr(inst, "on_query_context", None) - if toadd: - sublime.OnQueryContextGlue(toadd) - for name in ["on_load"]: # TODO - toadd = getattr(inst, name, None) - if toadd: - sublime.ViewEventGlue(toadd, name) - elif issubclass(item[1], TextCommand): - sublime.register(cmd, sublime.TextCommandGlue(item[1])) - elif issubclass(item[1], WindowCommand): - sublime.register(cmd, sublime.WindowCommandGlue(item[1])) - elif issubclass(item[1], ApplicationCommand): - sublime.register(cmd, sublime.ApplicationCommandGlue(item[1])) - except: - print("Skipping registering %s: %s" % (cmd, sys.exc_info()[1])) - if "plugin_loaded" in dir(module): - module.plugin_loaded() - except: - traceback.print_exc() - - -class MyLogger: - - def __init__(self): - self.data = "" - - def flush(self): - sublime.console(self.data) - self.data = "" - - def write(self, data): - self.data += str(data) - if data.endswith("\n"): - self.data = self.data[:-1] - self.flush() - -sys.stdout = sys.stderr = MyLogger() diff --git a/backend/sublime/sublime_test.go b/backend/sublime/sublime_test.go deleted file mode 100644 index d98ce0e..0000000 --- a/backend/sublime/sublime_test.go +++ /dev/null @@ -1,192 +0,0 @@ -// Copyright 2013 The lime Authors. -// Use of this source code is governed by a 2-clause -// BSD-style license that can be found in the LICENSE file. - -package sublime - -import ( - "bytes" - "fmt" - "github.com/limetext/gopy/lib" - "github.com/limetext/lime/backend" - _ "github.com/limetext/lime/backend/commands" - "github.com/limetext/lime/backend/log" - "github.com/limetext/lime/backend/packages" - "github.com/limetext/lime/backend/util" - "github.com/limetext/text" - "io/ioutil" - "os" - "path/filepath" - "strings" - "testing" - "time" -) - -var dummyClipboard string - -type consoleObserver struct { - T *testing.T -} - -func (o *consoleObserver) Erased(changed_buffer text.Buffer, region_removed text.Region, data_removed []rune) { - // do nothing -} - -func (o *consoleObserver) Inserted(changed_buffer text.Buffer, region_inserted text.Region, data_inserted []rune) { - o.T.Logf("%s", string(data_inserted)) -} - -func TestSublime(t *testing.T) { - ed := backend.GetEditor() - ed.SetClipboardFuncs(func(n string) (err error) { - dummyClipboard = n - return nil - }, func() (string, error) { - return dummyClipboard, nil - }) - ed.Init() - - ed.Console().Buffer().AddObserver(&consoleObserver{T: t}) - w := ed.NewWindow() - l := py.NewLock() - py.AddToPath("testdata") - py.AddToPath("testdata/plugins") - if m, err := py.Import("sublime_plugin"); err != nil { - t.Fatal(err) - } else { - plugins := packages.ScanPlugins("testdata/", ".py") - for _, p := range plugins { - newPlugin(p, m) - } - } - - subl, err := py.Import("sublime") - if err != nil { - t.Fatal(err) - } - - if w, err := _windowClass.Alloc(1); err != nil { - t.Fatal(err) - } else { - (w.(*Window)).data = &backend.Window{} - subl.AddObject("test_window", w) - } - - // Testing plugin reload - data := []byte(`import sublime, sublime_plugin - -class TestToxt(sublime_plugin.TextCommand): - def run(self, edit): - print("my view's id is: %d" % self.view.id()) - self.view.insert(edit, 0, "Tada") - `) - if err := ioutil.WriteFile("testdata/plugins/reload.py", data, 0644); err != nil { - t.Fatalf("Couldn't write testdata/plugins/reload.py: %s", err) - } - defer os.Remove("testdata/plugins/reload.py") - time.Sleep(time.Millisecond * 50) - - if dir, err := os.Open("testdata"); err != nil { - t.Error(err) - } else if files, err := dir.Readdirnames(0); err != nil { - t.Error(err) - } else { - for _, fn := range files { - // FIXME: Skip reload_test.py to work around #531 on OSX. - if fn == "reload_test.py" && ed.Platform() == "darwin" { - continue - } - - if filepath.Ext(fn) == ".py" { - log.Debug("Running %s", fn) - if _, err := py.Import(fn[:len(fn)-3]); err != nil { - log.Error(err) - t.Error(err) - } else { - log.Debug("Ran %s", fn) - } - } - } - } - - var f func(indent string, v py.Object, buf *bytes.Buffer) - f = func(indent string, v py.Object, buf *bytes.Buffer) { - b := v.Base() - if dir, err := b.Dir(); err != nil { - t.Error(err) - } else { - if l, ok := dir.(*py.List); ok { - sl := l.Slice() - - if indent == "" { - for _, v2 := range sl { - if item, err := b.GetAttr(v2); err != nil { - t.Error(err) - } else { - ty := item.Type() - line := fmt.Sprintf("%s%s\n", indent, v2) - buf.WriteString(line) - if ty == py.TypeType { - f(indent+"\t", item, buf) - } - item.Decref() - } - } - } else { - for _, v2 := range sl { - buf.WriteString(fmt.Sprintf("%s%s\n", indent, v2)) - } - } - - } else { - ty := dir.Type() - t.Error("Unexpected type:", ty) - } - dir.Decref() - } - } - buf := bytes.NewBuffer(nil) - f("", subl, buf) - - l.Unlock() - - const expfile = "testdata/api.txt" - if d, err := ioutil.ReadFile(expfile); err != nil { - if err := ioutil.WriteFile(expfile, buf.Bytes(), 0644); err != nil { - t.Error(err) - } - } else if diff := util.Diff(string(d), buf.String()); diff != "" { - t.Error(diff) - } - ed.LogCommands(true) - tests := []string{ - "state", - "registers", - "settings", - "constants", - "registers", - "cmd_data", - "marks", - } - - for _, test := range tests { - ed.CommandHandler().RunWindowCommand(w, "vintage_ex_run_data_file_based_tests", backend.Args{"suite_name": test}) - } - for _, w := range ed.Windows() { - for _, v := range w.Views() { - if strings.HasSuffix(v.Buffer().FileName(), "sample.txt") { - continue - } - if strings.Index(v.Buffer().Substr(text.Region{A: 0, B: v.Buffer().Size()}), "FAILED") != -1 { - t.Error(v.Buffer()) - } - } - } - - var v *backend.View - for _, v2 := range w.Views() { - if v == nil || v2.Buffer().Size() > v.Buffer().Size() { - v = v2 - } - } -} diff --git a/backend/sublime/testdata/api.txt b/backend/sublime/testdata/api.txt deleted file mode 100644 index 0d3ffee..0000000 --- a/backend/sublime/testdata/api.txt +++ /dev/null @@ -1,396 +0,0 @@ -ApplicationCommandGlue - __class__ - __delattr__ - __dir__ - __doc__ - __eq__ - __format__ - __ge__ - __getattribute__ - __gt__ - __hash__ - __init__ - __le__ - __lt__ - __ne__ - __new__ - __reduce__ - __reduce_ex__ - __repr__ - __setattr__ - __sizeof__ - __str__ - __subclasshook__ -CLASS_CLOSING_PARENTHESIS -CLASS_EMPTY_LINE -CLASS_LINE_END -CLASS_LINE_START -CLASS_MIDDLE_WORD -CLASS_OPENING_PARENTHESIS -CLASS_PUNCTUATION_END -CLASS_PUNCTUATION_START -CLASS_SUB_WORD_END -CLASS_SUB_WORD_START -CLASS_WORD_END -CLASS_WORD_END_WITH_PUNCTUATION -CLASS_WORD_START -CLASS_WORD_START_WITH_PUNCTUATION -DRAW_EMPTY -DRAW_EMPTY_AS_OVERWRITE -DRAW_NO_FILL -DRAW_NO_OUTLINE -DRAW_SOLID_UNDERLINE -DRAW_SQUIGGLY_UNDERLINE -DRAW_STIPPLED_UNDERLINE -Edit - __class__ - __delattr__ - __dir__ - __doc__ - __eq__ - __format__ - __ge__ - __getattribute__ - __gt__ - __hash__ - __init__ - __le__ - __lt__ - __ne__ - __new__ - __reduce__ - __reduce_ex__ - __repr__ - __setattr__ - __sizeof__ - __str__ - __subclasshook__ -HIDDEN -HIDE_ON_MINIMAP -IGNORECASE -INHIBIT_EXPLICIT_COMPLETIONS -INHIBIT_WORD_COMPLETIONS -LITERAL -OP_EQUAL -OP_NOT_EQUAL -OP_NOT_REGEX_CONTAINS -OP_NOT_REGEX_MATCH -OP_REGEX_CONTAINS -OP_REGEX_MATCH -OnQueryContextGlue - __class__ - __delattr__ - __dir__ - __doc__ - __eq__ - __format__ - __ge__ - __getattribute__ - __gt__ - __hash__ - __init__ - __le__ - __lt__ - __ne__ - __new__ - __reduce__ - __reduce_ex__ - __repr__ - __setattr__ - __sizeof__ - __str__ - __subclasshook__ -PERSISTENT -Region - __class__ - __delattr__ - __dir__ - __doc__ - __eq__ - __format__ - __ge__ - __getattribute__ - __gt__ - __hash__ - __init__ - __le__ - __lt__ - __ne__ - __new__ - __reduce__ - __reduce_ex__ - __repr__ - __setattr__ - __sizeof__ - __str__ - __subclasshook__ - a - b - begin - clip - contains - cover - covers - empty - end - intersection - intersects - size -RegionSet - __class__ - __delattr__ - __dir__ - __doc__ - __eq__ - __format__ - __ge__ - __getattribute__ - __getitem__ - __gt__ - __hash__ - __init__ - __le__ - __len__ - __lt__ - __ne__ - __new__ - __reduce__ - __reduce_ex__ - __repr__ - __setattr__ - __sizeof__ - __str__ - __subclasshook__ - add - add_all - clear - contains - regions - substract -Settings - __class__ - __delattr__ - __dir__ - __doc__ - __eq__ - __format__ - __ge__ - __getattribute__ - __gt__ - __hash__ - __init__ - __le__ - __lt__ - __ne__ - __new__ - __reduce__ - __reduce_ex__ - __repr__ - __setattr__ - __sizeof__ - __str__ - __subclasshook__ - add_on_change - clear_on_change - erase - get - has - id - set -TextCommandGlue - __class__ - __delattr__ - __dir__ - __doc__ - __eq__ - __format__ - __ge__ - __getattribute__ - __gt__ - __hash__ - __init__ - __le__ - __lt__ - __ne__ - __new__ - __reduce__ - __reduce_ex__ - __repr__ - __setattr__ - __sizeof__ - __str__ - __subclasshook__ -View - __class__ - __delattr__ - __dir__ - __doc__ - __eq__ - __format__ - __ge__ - __getattribute__ - __gt__ - __hash__ - __init__ - __le__ - __lt__ - __ne__ - __new__ - __reduce__ - __reduce_ex__ - __repr__ - __setattr__ - __sizeof__ - __str__ - __subclasshook__ - add_regions - begin_edit - buffer_id - change_count - classify - command_history - end_edit - erase - erase_regions - erase_status - expand_by_class - extract_scope - file_name - find - find_by_class - full_line - get_regions - get_status - has_non_empty_selection_region - id - insert - is_dirty - is_scratch - line - lines - name - overwrite_status - replace - rowcol - run_command - scope_name - score_selector - sel - set_name - set_overwrite_status - set_scratch - set_status - set_syntax_file - settings - show - size - substr - text_point - visible_region - window - word -ViewEventGlue - __class__ - __delattr__ - __dir__ - __doc__ - __eq__ - __format__ - __ge__ - __getattribute__ - __gt__ - __hash__ - __init__ - __le__ - __lt__ - __ne__ - __new__ - __reduce__ - __reduce_ex__ - __repr__ - __setattr__ - __sizeof__ - __str__ - __subclasshook__ -Window - __class__ - __delattr__ - __dir__ - __doc__ - __eq__ - __format__ - __ge__ - __getattribute__ - __gt__ - __hash__ - __init__ - __le__ - __lt__ - __ne__ - __new__ - __reduce__ - __reduce_ex__ - __repr__ - __setattr__ - __sizeof__ - __str__ - __subclasshook__ - active_view - focus_view - id - new_file - open_file - run_command - settings - views -WindowCommandGlue - __class__ - __delattr__ - __dir__ - __doc__ - __eq__ - __format__ - __ge__ - __getattribute__ - __gt__ - __hash__ - __init__ - __le__ - __lt__ - __ne__ - __new__ - __reduce__ - __reduce_ex__ - __repr__ - __setattr__ - __sizeof__ - __str__ - __subclasshook__ -__doc__ -__loader__ -__name__ -__package__ -__spec__ -active_window -arch -console -error_message -get_clipboard -log_commands -log_input -message_dialog -new_window -ok_cancel_dialog -packages_path -plat -platform -register -run_command -set_clipboard -set_timeout -settings -status_message -test_window -unregister -version -windows diff --git a/backend/sublime/testdata/plugin_test.py b/backend/sublime/testdata/plugin_test.py deleted file mode 100644 index 6861844..0000000 --- a/backend/sublime/testdata/plugin_test.py +++ /dev/null @@ -1,20 +0,0 @@ -try: - import traceback - import sublime - print("new file") - v = sublime.test_window.new_file() - print("running command") - v.run_command("test_text") - print("command ran") - assert v.substr(sublime.Region(0, v.size())) == "hello" - v.run_command("undo") - print(v.sel()[0]) - assert v.sel()[0] == (0, 0) - v = sublime.test_window.active_view() - sublime.test_window.run_command("test_window") - assert v.substr(sublime.Region(0, v.size())) == "window hello" - assert sublime.CLASS_PUNCTUATION_START == 4 - assert sublime.CLASS_OPENING_PARENTHESIS == 4096 -except: - traceback.print_exc() - raise diff --git a/backend/sublime/testdata/plugins/test.py b/backend/sublime/testdata/plugins/test.py deleted file mode 100644 index 8e85973..0000000 --- a/backend/sublime/testdata/plugins/test.py +++ /dev/null @@ -1,18 +0,0 @@ -import sublime_plugin - - -class TestText(sublime_plugin.TextCommand): - - def run(self, edit): - print("my view's id is: %d" % self.view.id()) - self.view.insert(edit, 0, "hello") - - -class TestWindow(sublime_plugin.WindowCommand): - - def run(self): - print("my window's id is %d" % self.window.id()) - v = self.window.active_view() - e = v.begin_edit() - v.insert(e, 0, "window hello") - v.end_edit(e) diff --git a/backend/sublime/testdata/region_test.py b/backend/sublime/testdata/region_test.py deleted file mode 100644 index 3a47d42..0000000 --- a/backend/sublime/testdata/region_test.py +++ /dev/null @@ -1,39 +0,0 @@ -import sys -import traceback -try: - import sublime - - r = sublime.Region() - assert r.a == 0 and r.b == 0 - r = sublime.Region(1) - assert r.a == 1 and r.b == 0 - r = sublime.Region(1, 2) - assert r.a == 1 and r.b == 2 - - ok = False - try: - r = sublime.Region(1, 2, 3) - except: - ok = True - assert ok - - r = sublime.Region(1, 3) - assert r.contains(1) and not r.contains(4) - r2 = sublime.Region(5, 10) - - r3 = r.cover(r2) - assert r3.a == 1 and r3.b == 10 - - ok = False - try: - r4 = r.cover(4) - except: - ok = True - assert ok - - r3 = sublime.Region(3, 2) - assert r3.begin() == 2 and r3.end() == 3 -except: - print(sys.exc_info()[1]) - traceback.print_exc() - raise diff --git a/backend/sublime/testdata/regionset_test.py b/backend/sublime/testdata/regionset_test.py deleted file mode 100644 index ded59b1..0000000 --- a/backend/sublime/testdata/regionset_test.py +++ /dev/null @@ -1,15 +0,0 @@ -import sys -import traceback -try: - import sublime - - ok = False - try: - r = sublime.RegionSet() - except: - ok = True - assert ok -except: - print(sys.exc_info()[1]) - traceback.print_exc() - raise diff --git a/backend/sublime/testdata/reload_test.py b/backend/sublime/testdata/reload_test.py deleted file mode 100644 index 058d360..0000000 --- a/backend/sublime/testdata/reload_test.py +++ /dev/null @@ -1,13 +0,0 @@ -try: - import traceback - import sublime - print("Testing plugin reload") - print("new file") - v = sublime.test_window.new_file() - print("running command") - v.run_command("test_toxt") - print("command ran") - assert v.substr(sublime.Region(0, v.size())) == "Tada" -except: - traceback.print_exc() - raise diff --git a/backend/sublime/testdata/stress_test.py b/backend/sublime/testdata/stress_test.py deleted file mode 100644 index 4638fba..0000000 --- a/backend/sublime/testdata/stress_test.py +++ /dev/null @@ -1,19 +0,0 @@ -import sys -import traceback -try: - import sublime - v = sublime.test_window.new_file() - for i in range(10000): - e = v.begin_edit() - v.insert(e, 0, "hello world") - v.erase(e, sublime.Region(0, 11)) - v.insert(e, 0, "hello world") - v.end_edit(e) - assert v.substr(sublime.Region(0, v.size())) == "hello world" - v.run_command("undo") - assert v.sel()[0] == (0, 0) - -except: - print(sys.exc_info()[1]) - traceback.print_exc() - raise diff --git a/backend/sublime/testdata/unittest_test.py b/backend/sublime/testdata/unittest_test.py deleted file mode 100644 index 1f96112..0000000 --- a/backend/sublime/testdata/unittest_test.py +++ /dev/null @@ -1,7 +0,0 @@ -import traceback -try: - import unittest - a = unittest.defaultTestLoader -except: - traceback.print_exc() - raise diff --git a/backend/sublime/testdata/view_test.py b/backend/sublime/testdata/view_test.py deleted file mode 100644 index 5bd14fc..0000000 --- a/backend/sublime/testdata/view_test.py +++ /dev/null @@ -1,53 +0,0 @@ -# coding=utf-8 -import sys -import traceback -try: - import sublime - v = sublime.test_window.new_file() - assert v.id() != sublime.test_window.id() - assert sublime.test_window.id() == v.window().id() - assert v.size() == 0 - e = v.begin_edit() - v.insert(e, 0, "hellå world") - v.end_edit(e) - assert v.substr(sublime.Region(0, v.size())) == "hellå world" - e = v.begin_edit() - v.insert(e, 0, """abrakadabra -simsalabim -hocus pocus -""") - v.end_edit(e) - assert v.rowcol(20) == (1, 8) - assert v.rowcol(25) == (2, 2) - - assert len(v.sel()) == 1 - assert len(list(v.sel())) == 1 - assert v.settings().get("test", "hello") == "hello" - v.settings().set("test", 10) - assert v.settings().get("test") == 10 - assert v.sel()[0] == (46, 46) - v.run_command("move", {"by": "characters", "forward": False}) - assert v.sel()[0] == (45, 45) - v.run_command("move", {"by": "characters", "forward": True}) - assert v.sel()[0] == (46, 46) - - v2 = sublime.test_window.new_file() - e = v2.begin_edit() - v2.insert(e, 0, """one word { another word } -line - -after empty line""") - v2.end_edit(e) - # Expected results validated in Sublime - assert v2.find_by_class(1, True, sublime.CLASS_WORD_START) == 4 - assert v2.find_by_class(1, True, sublime.CLASS_PUNCTUATION_START) == 9 - assert v2.expand_by_class(sublime.Region(5, 6), - sublime.CLASS_WORD_START | sublime.CLASS_WORD_END) == sublime.Region(4, 8) - assert v2.expand_by_class(sublime.Region(11, 12), - sublime.CLASS_PUNCTUATION_START | sublime.CLASS_PUNCTUATION_END) == sublime.Region(10, 24) - assert v2.expand_by_class(sublime.Region(5, 6), sublime.CLASS_EMPTY_LINE) == sublime.Region(0, 31) - -except: - print(sys.exc_info()[1]) - traceback.print_exc() - raise diff --git a/backend/sublime/view_buffer_generated.go b/backend/sublime/view_buffer_generated.go deleted file mode 100644 index 4e57524..0000000 --- a/backend/sublime/view_buffer_generated.go +++ /dev/null @@ -1,377 +0,0 @@ -// Copyright 2015 The lime Authors. -// Use of this source code is governed by a 2-clause -// BSD-style license that can be found in the LICENSE file. - -// This file was generated by tasks/build/gen_python_api.go and shouldn't be manually modified - -package sublime - -import ( - "fmt" - "github.com/limetext/gopy/lib" - "github.com/limetext/lime/backend" - "github.com/limetext/text" -) - -var ( - _ = backend.View{} - _ = text.Region{} - _ = fmt.Errorf -) - -func (o *View) Py_change_count() (py.Object, error) { - ret0 := o.data.Buffer().ChangeCount() - var err error - var pyret0 py.Object - - pyret0, err = toPython(ret0) - if err != nil { - return nil, err - } - return pyret0, err -} - -func (o *View) Py_file_name() (py.Object, error) { - ret0 := o.data.Buffer().FileName() - var err error - var pyret0 py.Object - - pyret0, err = toPython(ret0) - if err != nil { - return nil, err - } - return pyret0, err -} - -func (o *View) fullline(tu *py.Tuple) (py.Object, error) { - var ( - arg1 int - ) - if v, err := tu.GetItem(0); err != nil { - return nil, err - } else { - if v3, err2 := fromPython(v); err2 != nil { - return nil, err2 - } else { - if v2, ok := v3.(int); !ok { - return nil, fmt.Errorf("Expected type int for text.buffer.FullLine() arg1, not %s", v.Type()) - } else { - arg1 = v2 - } - } - } - ret0 := o.data.Buffer().FullLine(arg1) - var err error - var pyret0 py.Object - - pyret0, err = toPython(ret0) - if err != nil { - return nil, err - } - return pyret0, err -} - -func (o *View) fullliner(tu *py.Tuple) (py.Object, error) { - var ( - arg1 text.Region - ) - if v, err := tu.GetItem(0); err != nil { - return nil, err - } else { - if v3, err2 := fromPython(v); err2 != nil { - return nil, err2 - } else { - if v2, ok := v3.(text.Region); !ok { - return nil, fmt.Errorf("Expected type text.Region for text.buffer.FullLineR() arg1, not %s", v.Type()) - } else { - arg1 = v2 - } - } - } - ret0 := o.data.Buffer().FullLineR(arg1) - var err error - var pyret0 py.Object - - pyret0, err = toPython(ret0) - if err != nil { - return nil, err - } - return pyret0, err -} - -func (o *View) Py_buffer_id() (py.Object, error) { - ret0 := o.data.Buffer().Id() - var err error - var pyret0 py.Object - - pyret0, err = toPython(ret0) - if err != nil { - return nil, err - } - return pyret0, err -} - -func (o *View) line(tu *py.Tuple) (py.Object, error) { - var ( - arg1 int - ) - if v, err := tu.GetItem(0); err != nil { - return nil, err - } else { - if v3, err2 := fromPython(v); err2 != nil { - return nil, err2 - } else { - if v2, ok := v3.(int); !ok { - return nil, fmt.Errorf("Expected type int for text.buffer.Line() arg1, not %s", v.Type()) - } else { - arg1 = v2 - } - } - } - ret0 := o.data.Buffer().Line(arg1) - var err error - var pyret0 py.Object - - pyret0, err = toPython(ret0) - if err != nil { - return nil, err - } - return pyret0, err -} - -func (o *View) liner(tu *py.Tuple) (py.Object, error) { - var ( - arg1 text.Region - ) - if v, err := tu.GetItem(0); err != nil { - return nil, err - } else { - if v3, err2 := fromPython(v); err2 != nil { - return nil, err2 - } else { - if v2, ok := v3.(text.Region); !ok { - return nil, fmt.Errorf("Expected type text.Region for text.buffer.LineR() arg1, not %s", v.Type()) - } else { - arg1 = v2 - } - } - } - ret0 := o.data.Buffer().LineR(arg1) - var err error - var pyret0 py.Object - - pyret0, err = toPython(ret0) - if err != nil { - return nil, err - } - return pyret0, err -} - -func (o *View) Py_lines(tu *py.Tuple) (py.Object, error) { - var ( - arg1 text.Region - ) - if v, err := tu.GetItem(0); err != nil { - return nil, err - } else { - if v3, err2 := fromPython(v); err2 != nil { - return nil, err2 - } else { - if v2, ok := v3.(text.Region); !ok { - return nil, fmt.Errorf("Expected type text.Region for text.buffer.Lines() arg1, not %s", v.Type()) - } else { - arg1 = v2 - } - } - } - ret0 := o.data.Buffer().Lines(arg1) - var err error - var pyret0 py.Object - - pyret0, err = toPython(ret0) - if err != nil { - return nil, err - } - return pyret0, err -} - -func (o *View) Py_name() (py.Object, error) { - ret0 := o.data.Buffer().Name() - var err error - var pyret0 py.Object - - pyret0, err = toPython(ret0) - if err != nil { - return nil, err - } - return pyret0, err -} - -func (o *View) Py_rowcol(tu *py.Tuple) (py.Object, error) { - var ( - arg1 int - ) - if v, err := tu.GetItem(0); err != nil { - return nil, err - } else { - if v3, err2 := fromPython(v); err2 != nil { - return nil, err2 - } else { - if v2, ok := v3.(int); !ok { - return nil, fmt.Errorf("Expected type int for text.buffer.RowCol() arg1, not %s", v.Type()) - } else { - arg1 = v2 - } - } - } - ret0, ret1 := o.data.Buffer().RowCol(arg1) - var err error - var pyret0 py.Object - - pyret0, err = toPython(ret0) - if err != nil { - return nil, err - } - var pyret1 py.Object - - pyret1, err = toPython(ret1) - if err != nil { - pyret0.Decref() - return nil, err - } - return py.PackTuple(pyret0, pyret1) -} - -func (o *View) Py_set_name(tu *py.Tuple) (py.Object, error) { - var ( - arg1 string - ) - if v, err := tu.GetItem(0); err != nil { - return nil, err - } else { - if v3, err2 := fromPython(v); err2 != nil { - return nil, err2 - } else { - if v2, ok := v3.(string); !ok { - return nil, fmt.Errorf("Expected type string for text.buffer.SetName() arg1, not %s", v.Type()) - } else { - arg1 = v2 - } - } - } - if err := o.data.Buffer().SetName(arg1); err != nil { - return nil, err - } else { - return toPython(nil) - } -} - -func (o *View) Py_size() (py.Object, error) { - ret0 := o.data.Buffer().Size() - var err error - var pyret0 py.Object - - pyret0, err = toPython(ret0) - if err != nil { - return nil, err - } - return pyret0, err -} - -func (o *View) Py_text_point(tu *py.Tuple) (py.Object, error) { - var ( - arg1 int - arg2 int - ) - if v, err := tu.GetItem(0); err != nil { - return nil, err - } else { - if v3, err2 := fromPython(v); err2 != nil { - return nil, err2 - } else { - if v2, ok := v3.(int); !ok { - return nil, fmt.Errorf("Expected type int for text.buffer.TextPoint() arg1, not %s", v.Type()) - } else { - arg1 = v2 - } - } - } - if v, err := tu.GetItem(1); err != nil { - return nil, err - } else { - if v3, err2 := fromPython(v); err2 != nil { - return nil, err2 - } else { - if v2, ok := v3.(int); !ok { - return nil, fmt.Errorf("Expected type int for text.buffer.TextPoint() arg2, not %s", v.Type()) - } else { - arg2 = v2 - } - } - } - ret0 := o.data.Buffer().TextPoint(arg1, arg2) - var err error - var pyret0 py.Object - - pyret0, err = toPython(ret0) - if err != nil { - return nil, err - } - return pyret0, err -} - -func (o *View) word(tu *py.Tuple) (py.Object, error) { - var ( - arg1 int - ) - if v, err := tu.GetItem(0); err != nil { - return nil, err - } else { - if v3, err2 := fromPython(v); err2 != nil { - return nil, err2 - } else { - if v2, ok := v3.(int); !ok { - return nil, fmt.Errorf("Expected type int for text.buffer.Word() arg1, not %s", v.Type()) - } else { - arg1 = v2 - } - } - } - ret0 := o.data.Buffer().Word(arg1) - var err error - var pyret0 py.Object - - pyret0, err = toPython(ret0) - if err != nil { - return nil, err - } - return pyret0, err -} - -func (o *View) wordr(tu *py.Tuple) (py.Object, error) { - var ( - arg1 text.Region - ) - if v, err := tu.GetItem(0); err != nil { - return nil, err - } else { - if v3, err2 := fromPython(v); err2 != nil { - return nil, err2 - } else { - if v2, ok := v3.(text.Region); !ok { - return nil, fmt.Errorf("Expected type text.Region for text.buffer.WordR() arg1, not %s", v.Type()) - } else { - arg1 = v2 - } - } - } - ret0 := o.data.Buffer().WordR(arg1) - var err error - var pyret0 py.Object - - pyret0, err = toPython(ret0) - if err != nil { - return nil, err - } - return pyret0, err -} diff --git a/backend/sublime/view_generated.go b/backend/sublime/view_generated.go deleted file mode 100644 index 8a5a75d..0000000 --- a/backend/sublime/view_generated.go +++ /dev/null @@ -1,647 +0,0 @@ -// Copyright 2015 The lime Authors. -// Use of this source code is governed by a 2-clause -// BSD-style license that can be found in the LICENSE file. - -// This file was generated by tasks/build/gen_python_api.go and shouldn't be manually modified - -package sublime - -import ( - "fmt" - "github.com/limetext/gopy/lib" - "github.com/limetext/lime/backend" - "github.com/limetext/text" -) - -var ( - _ = backend.View{} - _ = text.Region{} - _ = fmt.Errorf -) - -var _viewClass = py.Class{ - Name: "sublime.View", - Pointer: (*View)(nil), -} - -type View struct { - py.BaseObject - data *backend.View -} - -func (o *View) PyInit(args *py.Tuple, kwds *py.Dict) error { - return fmt.Errorf("Can't initialize type View") -} -func (o *View) Py_begin_edit() (py.Object, error) { - ret0 := o.data.BeginEdit() - var err error - var pyret0 py.Object - - pyret0, err = toPython(ret0) - if err != nil { - return nil, err - } - return pyret0, err -} - -func (o *View) Py_classify(tu *py.Tuple) (py.Object, error) { - var ( - arg1 int - ) - if v, err := tu.GetItem(0); err != nil { - return nil, err - } else { - if v3, err2 := fromPython(v); err2 != nil { - return nil, err2 - } else { - if v2, ok := v3.(int); !ok { - return nil, fmt.Errorf("Expected type int for backend.View.Classify() arg1, not %s", v.Type()) - } else { - arg1 = v2 - } - } - } - ret0 := o.data.Classify(arg1) - var err error - var pyret0 py.Object - - pyret0, err = toPython(ret0) - if err != nil { - return nil, err - } - return pyret0, err -} - -func (o *View) Py_end_edit(tu *py.Tuple) (py.Object, error) { - var ( - arg1 *backend.Edit - ) - if v, err := tu.GetItem(0); err != nil { - return nil, err - } else { - if v3, err2 := fromPython(v); err2 != nil { - return nil, err2 - } else { - if v2, ok := v3.(*backend.Edit); !ok { - return nil, fmt.Errorf("Expected type *backend.Edit for backend.View.EndEdit() arg1, not %s", v.Type()) - } else { - arg1 = v2 - } - } - } - o.data.EndEdit(arg1) - return toPython(nil) -} - -func (o *View) Py_erase(tu *py.Tuple) (py.Object, error) { - var ( - arg1 *backend.Edit - arg2 text.Region - ) - if v, err := tu.GetItem(0); err != nil { - return nil, err - } else { - if v3, err2 := fromPython(v); err2 != nil { - return nil, err2 - } else { - if v2, ok := v3.(*backend.Edit); !ok { - return nil, fmt.Errorf("Expected type *backend.Edit for backend.View.Erase() arg1, not %s", v.Type()) - } else { - arg1 = v2 - } - } - } - if v, err := tu.GetItem(1); err != nil { - return nil, err - } else { - if v3, err2 := fromPython(v); err2 != nil { - return nil, err2 - } else { - if v2, ok := v3.(text.Region); !ok { - return nil, fmt.Errorf("Expected type text.Region for backend.View.Erase() arg2, not %s", v.Type()) - } else { - arg2 = v2 - } - } - } - o.data.Erase(arg1, arg2) - return toPython(nil) -} - -func (o *View) Py_erase_regions(tu *py.Tuple) (py.Object, error) { - var ( - arg1 string - ) - if v, err := tu.GetItem(0); err != nil { - return nil, err - } else { - if v3, err2 := fromPython(v); err2 != nil { - return nil, err2 - } else { - if v2, ok := v3.(string); !ok { - return nil, fmt.Errorf("Expected type string for backend.View.EraseRegions() arg1, not %s", v.Type()) - } else { - arg1 = v2 - } - } - } - o.data.EraseRegions(arg1) - return toPython(nil) -} - -func (o *View) Py_erase_status(tu *py.Tuple) (py.Object, error) { - var ( - arg1 string - ) - if v, err := tu.GetItem(0); err != nil { - return nil, err - } else { - if v3, err2 := fromPython(v); err2 != nil { - return nil, err2 - } else { - if v2, ok := v3.(string); !ok { - return nil, fmt.Errorf("Expected type string for backend.View.EraseStatus() arg1, not %s", v.Type()) - } else { - arg1 = v2 - } - } - } - o.data.EraseStatus(arg1) - return toPython(nil) -} - -func (o *View) Py_extract_scope(tu *py.Tuple) (py.Object, error) { - var ( - arg1 int - ) - if v, err := tu.GetItem(0); err != nil { - return nil, err - } else { - if v3, err2 := fromPython(v); err2 != nil { - return nil, err2 - } else { - if v2, ok := v3.(int); !ok { - return nil, fmt.Errorf("Expected type int for backend.View.ExtractScope() arg1, not %s", v.Type()) - } else { - arg1 = v2 - } - } - } - ret0 := o.data.ExtractScope(arg1) - var err error - var pyret0 py.Object - - pyret0, err = toPython(ret0) - if err != nil { - return nil, err - } - return pyret0, err -} - -func (o *View) Py_find_by_class(tu *py.Tuple) (py.Object, error) { - var ( - arg1 int - arg2 bool - arg3 int - ) - if v, err := tu.GetItem(0); err != nil { - return nil, err - } else { - if v3, err2 := fromPython(v); err2 != nil { - return nil, err2 - } else { - if v2, ok := v3.(int); !ok { - return nil, fmt.Errorf("Expected type int for backend.View.FindByClass() arg1, not %s", v.Type()) - } else { - arg1 = v2 - } - } - } - if v, err := tu.GetItem(1); err != nil { - return nil, err - } else { - if v3, err2 := fromPython(v); err2 != nil { - return nil, err2 - } else { - if v2, ok := v3.(bool); !ok { - return nil, fmt.Errorf("Expected type bool for backend.View.FindByClass() arg2, not %s", v.Type()) - } else { - arg2 = v2 - } - } - } - if v, err := tu.GetItem(2); err != nil { - return nil, err - } else { - if v3, err2 := fromPython(v); err2 != nil { - return nil, err2 - } else { - if v2, ok := v3.(int); !ok { - return nil, fmt.Errorf("Expected type int for backend.View.FindByClass() arg3, not %s", v.Type()) - } else { - arg3 = v2 - } - } - } - ret0 := o.data.FindByClass(arg1, arg2, arg3) - var err error - var pyret0 py.Object - - pyret0, err = toPython(ret0) - if err != nil { - return nil, err - } - return pyret0, err -} - -func (o *View) Py_get_regions(tu *py.Tuple) (py.Object, error) { - var ( - arg1 string - ) - if v, err := tu.GetItem(0); err != nil { - return nil, err - } else { - if v3, err2 := fromPython(v); err2 != nil { - return nil, err2 - } else { - if v2, ok := v3.(string); !ok { - return nil, fmt.Errorf("Expected type string for backend.View.GetRegions() arg1, not %s", v.Type()) - } else { - arg1 = v2 - } - } - } - ret0 := o.data.GetRegions(arg1) - var err error - var pyret0 py.Object - - pyret0, err = toPython(ret0) - if err != nil { - return nil, err - } - return pyret0, err -} - -func (o *View) Py_get_status(tu *py.Tuple) (py.Object, error) { - var ( - arg1 string - ) - if v, err := tu.GetItem(0); err != nil { - return nil, err - } else { - if v3, err2 := fromPython(v); err2 != nil { - return nil, err2 - } else { - if v2, ok := v3.(string); !ok { - return nil, fmt.Errorf("Expected type string for backend.View.GetStatus() arg1, not %s", v.Type()) - } else { - arg1 = v2 - } - } - } - ret0 := o.data.GetStatus(arg1) - var err error - var pyret0 py.Object - - pyret0, err = toPython(ret0) - if err != nil { - return nil, err - } - return pyret0, err -} - -func (o *View) Py_id() (py.Object, error) { - ret0 := o.data.Id() - var err error - var pyret0 py.Object - - pyret0, err = toPython(ret0) - if err != nil { - return nil, err - } - return pyret0, err -} - -func (o *View) Py_insert(tu *py.Tuple) (py.Object, error) { - var ( - arg1 *backend.Edit - arg2 int - arg3 string - ) - if v, err := tu.GetItem(0); err != nil { - return nil, err - } else { - if v3, err2 := fromPython(v); err2 != nil { - return nil, err2 - } else { - if v2, ok := v3.(*backend.Edit); !ok { - return nil, fmt.Errorf("Expected type *backend.Edit for backend.View.Insert() arg1, not %s", v.Type()) - } else { - arg1 = v2 - } - } - } - if v, err := tu.GetItem(1); err != nil { - return nil, err - } else { - if v3, err2 := fromPython(v); err2 != nil { - return nil, err2 - } else { - if v2, ok := v3.(int); !ok { - return nil, fmt.Errorf("Expected type int for backend.View.Insert() arg2, not %s", v.Type()) - } else { - arg2 = v2 - } - } - } - if v, err := tu.GetItem(2); err != nil { - return nil, err - } else { - if v3, err2 := fromPython(v); err2 != nil { - return nil, err2 - } else { - if v2, ok := v3.(string); !ok { - return nil, fmt.Errorf("Expected type string for backend.View.Insert() arg3, not %s", v.Type()) - } else { - arg3 = v2 - } - } - } - ret0 := o.data.Insert(arg1, arg2, arg3) - var err error - var pyret0 py.Object - - pyret0, err = toPython(ret0) - if err != nil { - return nil, err - } - return pyret0, err -} - -func (o *View) Py_is_dirty() (py.Object, error) { - ret0 := o.data.IsDirty() - var err error - var pyret0 py.Object - - pyret0, err = toPython(ret0) - if err != nil { - return nil, err - } - return pyret0, err -} - -func (o *View) Py_is_scratch() (py.Object, error) { - ret0 := o.data.IsScratch() - var err error - var pyret0 py.Object - - pyret0, err = toPython(ret0) - if err != nil { - return nil, err - } - return pyret0, err -} - -func (o *View) Py_overwrite_status() (py.Object, error) { - ret0 := o.data.OverwriteStatus() - var err error - var pyret0 py.Object - - pyret0, err = toPython(ret0) - if err != nil { - return nil, err - } - return pyret0, err -} - -func (o *View) Py_replace(tu *py.Tuple) (py.Object, error) { - var ( - arg1 *backend.Edit - arg2 text.Region - arg3 string - ) - if v, err := tu.GetItem(0); err != nil { - return nil, err - } else { - if v3, err2 := fromPython(v); err2 != nil { - return nil, err2 - } else { - if v2, ok := v3.(*backend.Edit); !ok { - return nil, fmt.Errorf("Expected type *backend.Edit for backend.View.Replace() arg1, not %s", v.Type()) - } else { - arg1 = v2 - } - } - } - if v, err := tu.GetItem(1); err != nil { - return nil, err - } else { - if v3, err2 := fromPython(v); err2 != nil { - return nil, err2 - } else { - if v2, ok := v3.(text.Region); !ok { - return nil, fmt.Errorf("Expected type text.Region for backend.View.Replace() arg2, not %s", v.Type()) - } else { - arg2 = v2 - } - } - } - if v, err := tu.GetItem(2); err != nil { - return nil, err - } else { - if v3, err2 := fromPython(v); err2 != nil { - return nil, err2 - } else { - if v2, ok := v3.(string); !ok { - return nil, fmt.Errorf("Expected type string for backend.View.Replace() arg3, not %s", v.Type()) - } else { - arg3 = v2 - } - } - } - o.data.Replace(arg1, arg2, arg3) - return toPython(nil) -} - -func (o *View) Py_scope_name(tu *py.Tuple) (py.Object, error) { - var ( - arg1 int - ) - if v, err := tu.GetItem(0); err != nil { - return nil, err - } else { - if v3, err2 := fromPython(v); err2 != nil { - return nil, err2 - } else { - if v2, ok := v3.(int); !ok { - return nil, fmt.Errorf("Expected type int for backend.View.ScopeName() arg1, not %s", v.Type()) - } else { - arg1 = v2 - } - } - } - ret0 := o.data.ScopeName(arg1) - var err error - var pyret0 py.Object - - pyret0, err = toPython(ret0) - if err != nil { - return nil, err - } - return pyret0, err -} - -func (o *View) Py_score_selector(tu *py.Tuple) (py.Object, error) { - var ( - arg1 int - arg2 string - ) - if v, err := tu.GetItem(0); err != nil { - return nil, err - } else { - if v3, err2 := fromPython(v); err2 != nil { - return nil, err2 - } else { - if v2, ok := v3.(int); !ok { - return nil, fmt.Errorf("Expected type int for backend.View.ScoreSelector() arg1, not %s", v.Type()) - } else { - arg1 = v2 - } - } - } - if v, err := tu.GetItem(1); err != nil { - return nil, err - } else { - if v3, err2 := fromPython(v); err2 != nil { - return nil, err2 - } else { - if v2, ok := v3.(string); !ok { - return nil, fmt.Errorf("Expected type string for backend.View.ScoreSelector() arg2, not %s", v.Type()) - } else { - arg2 = v2 - } - } - } - ret0 := o.data.ScoreSelector(arg1, arg2) - var err error - var pyret0 py.Object - - pyret0, err = toPython(ret0) - if err != nil { - return nil, err - } - return pyret0, err -} - -func (o *View) Py_sel() (py.Object, error) { - ret0 := o.data.Sel() - var err error - var pyret0 py.Object - - pyret0, err = toPython(ret0) - if err != nil { - return nil, err - } - return pyret0, err -} - -func (o *View) Py_set_overwrite_status(tu *py.Tuple) (py.Object, error) { - var ( - arg1 bool - ) - if v, err := tu.GetItem(0); err != nil { - return nil, err - } else { - if v3, err2 := fromPython(v); err2 != nil { - return nil, err2 - } else { - if v2, ok := v3.(bool); !ok { - return nil, fmt.Errorf("Expected type bool for backend.View.SetOverwriteStatus() arg1, not %s", v.Type()) - } else { - arg1 = v2 - } - } - } - o.data.SetOverwriteStatus(arg1) - return toPython(nil) -} - -func (o *View) Py_set_scratch(tu *py.Tuple) (py.Object, error) { - var ( - arg1 bool - ) - if v, err := tu.GetItem(0); err != nil { - return nil, err - } else { - if v3, err2 := fromPython(v); err2 != nil { - return nil, err2 - } else { - if v2, ok := v3.(bool); !ok { - return nil, fmt.Errorf("Expected type bool for backend.View.SetScratch() arg1, not %s", v.Type()) - } else { - arg1 = v2 - } - } - } - o.data.SetScratch(arg1) - return toPython(nil) -} - -func (o *View) Py_set_status(tu *py.Tuple) (py.Object, error) { - var ( - arg1 string - arg2 string - ) - if v, err := tu.GetItem(0); err != nil { - return nil, err - } else { - if v3, err2 := fromPython(v); err2 != nil { - return nil, err2 - } else { - if v2, ok := v3.(string); !ok { - return nil, fmt.Errorf("Expected type string for backend.View.SetStatus() arg1, not %s", v.Type()) - } else { - arg1 = v2 - } - } - } - if v, err := tu.GetItem(1); err != nil { - return nil, err - } else { - if v3, err2 := fromPython(v); err2 != nil { - return nil, err2 - } else { - if v2, ok := v3.(string); !ok { - return nil, fmt.Errorf("Expected type string for backend.View.SetStatus() arg2, not %s", v.Type()) - } else { - arg2 = v2 - } - } - } - o.data.SetStatus(arg1, arg2) - return toPython(nil) -} - -func (o *View) Py_settings() (py.Object, error) { - ret0 := o.data.Settings() - var err error - var pyret0 py.Object - - pyret0, err = toPython(ret0) - if err != nil { - return nil, err - } - return pyret0, err -} - -func (o *View) Py_window() (py.Object, error) { - ret0 := o.data.Window() - var err error - var pyret0 py.Object - - pyret0, err = toPython(ret0) - if err != nil { - return nil, err - } - return pyret0, err -} diff --git a/backend/sublime/view_manual.go b/backend/sublime/view_manual.go deleted file mode 100644 index 1e327e2..0000000 --- a/backend/sublime/view_manual.go +++ /dev/null @@ -1,366 +0,0 @@ -// Copyright 2013 The lime Authors. -// Use of this source code is governed by a 2-clause -// BSD-style license that can be found in the LICENSE file. - -package sublime - -import ( - "fmt" - "github.com/limetext/gopy/lib" - "github.com/limetext/lime/backend" - "github.com/limetext/text" -) - -type Refcounted py.Object - -func (v *View) Py_has_non_empty_selection_region() (py.Object, error) { - for _, r := range v.data.Sel().Regions() { - if !r.Empty() { - return toPython(true) - } - } - return toPython(false) -} - -func (view *View) Py_show(tu *py.Tuple, kw *py.Dict) (py.Object, error) { - var ( - arg1 text.Region - ) - v, err := tu.GetItem(0) - if err != nil { - return nil, err - } - if v2, ok := v.(*Region); !ok { - if v2, ok := v.(*py.Long); !ok { - return nil, fmt.Errorf("Expected type *Region or *Int for primitives.Buffer.Substr() arg1, not %s", v.Type()) - } else { - arg1.A = int(v2.Int64()) - arg1.B = arg1.A + 1 - } - } else { - arg1 = v2.data - } - backend.GetEditor().Frontend().Show(view.data, arg1) - return toPython(nil) -} - -func (o *View) Py_substr(tu *py.Tuple) (py.Object, error) { - var ( - arg1 text.Region - ) - v, err := tu.GetItem(0) - if err != nil { - return nil, err - } - if v2, ok := v.(*Region); !ok { - if v2, ok := v.(*py.Long); !ok { - return nil, fmt.Errorf("Expected type *Region or *Int for primitives.Buffer.Substr() arg1, not %s", v.Type()) - } else { - arg1.A = int(v2.Int64()) - arg1.B = arg1.A + 1 - } - } else { - arg1 = v2.data - } - ret0 := o.data.Buffer().Substr(arg1) - var pyret0 py.Object - - pyret0, err = py.NewUnicode(ret0) - if err != nil { - // TODO: do the py objs need to be freed? - return nil, err - } - - return pyret0, err -} - -func (o *View) Py_add_regions(tu *py.Tuple, kw *py.Dict) (py.Object, error) { - var ( - arg1 string - arg2 []text.Region - ) - if tu.Size() < 2 { - return nil, fmt.Errorf("Not the expected argument size: %d", tu.Size()) - } - v, err := tu.GetItem(0) - if err != nil { - return nil, err - } - if v2, ok := v.(*py.Unicode); !ok { - return nil, fmt.Errorf("Expected type *py.Unicode for backend.View.AddRegions() arg1, not %s", v.Type()) - } else { - arg1 = v2.String() - } - v, err = tu.GetItem(1) - if err != nil { - return nil, err - } - v2, ok := v.(*py.List) - if !ok { - return nil, fmt.Errorf("Expected type *py.List for backend.View.AddRegions() arg2, not %s", v.Type()) - } - d := v2.Slice() - arg2 = make([]text.Region, len(d)) - for i, o := range d { - if v, err := fromPython(o); err != nil { - return nil, err - } else if v2, ok := v.(text.Region); !ok { - return nil, fmt.Errorf("Expected non-region item in list passed to backend.View.AddRegions(): %s", o.Type()) - } else { - arg2[i] = v2 - } - } - o.data.AddRegions(arg1, arg2, "", "", 0) // TODO - return toPython(nil) -} - -func (o *View) Py_command_history(tu *py.Tuple) (py.Object, error) { - var ( - arg1 int - arg2 bool - ) - v, err := tu.GetItem(0) - if err != nil { - return nil, err - } - if v2, ok := v.(*py.Long); !ok { - return nil, fmt.Errorf("Expected type *py.Long for backend.View.CommandHistory() arg1, not %s", v.Type()) - } else { - arg1 = int(v2.Int64()) - } - if v, err := tu.GetItem(1); err == nil { - if v2, ok := v.(*py.Bool); !ok { - return nil, fmt.Errorf("Expected type *py.Bool for backend.View.CommandHistory() arg2, not %s", v.Type()) - } else { - arg2 = v2.Bool() - } - } - ret0, ret1, ret2 := o.data.CommandHistory(arg1, arg2) - var pyret0 py.Object - - pyret0, err = py.NewUnicode(ret0) - if err != nil { - // TODO: do the py objs need to be freed? - return nil, err - } - - var pyret1 py.Object - - // Sublime compatibility - if len(ret1) == 0 { - pyret1, err = toPython(nil) - } else { - pyret1, err = toPython(ret1) - } - if err != nil { - pyret0.Decref() - // TODO: do the py objs need to be freed? - return nil, err - } - - var pyret2 py.Object - - pyret2 = py.NewLong(int64(ret2)) - if err != nil { - pyret0.Decref() - pyret1.Decref() - // TODO: do the py objs need to be freed? - return nil, err - } - - return py.PackTuple(pyret0, pyret1, pyret2) -} - -func (o *View) Py_run_command(tu *py.Tuple) (py.Object, error) { - var ( - arg1 string - arg2 backend.Args - ) - v, err := tu.GetItem(0) - if err != nil { - return nil, err - } - if v2, ok := v.(*py.Unicode); !ok { - return nil, fmt.Errorf("Expected type *py.Unicode for backend.View.RunCommand() arg1, not %s", v.Type()) - } else { - arg1 = v2.String() - } - arg2 = make(backend.Args) - if v, err := tu.GetItem(1); err == nil { - v2, ok := v.(*py.Dict) - if !ok { - return nil, fmt.Errorf("Expected type *py.Dict for backend.View.RunCommand() arg2, not %s", v.Type()) - } - if v, err := fromPython(v2); err != nil { - return nil, err - } else { - arg2 = v.(backend.Args) - } - } - backend.GetEditor().CommandHandler().RunTextCommand(o.data, arg1, arg2) - return toPython(nil) -} - -func (o *View) Py_visible_region() (py.Object, error) { - ret0 := backend.GetEditor().Frontend().VisibleRegion(o.data) - var err error - var pyret0 py.Object - - pyret0, err = _regionClass.Alloc(1) - if err != nil { - return nil, err - } else if v2, ok := pyret0.(*Region); !ok { - return nil, fmt.Errorf("Unable to convert return value to the right type?!: %s", pyret0.Type()) - } else { - v2.data = ret0 - } - if err != nil { - return nil, err - } - return pyret0, err -} - -func (o *View) Py_line(tu *py.Tuple) (py.Object, error) { - v, err := tu.GetItem(0) - if err != nil { - return nil, err - } - if _, ok := v.(*Region); ok { - return o.liner(tu) - } else { - return o.line(tu) - } -} - -func (o *View) Py_full_line(tu *py.Tuple) (py.Object, error) { - v, err := tu.GetItem(0) - if err != nil { - return nil, err - } - if _, ok := v.(*Region); ok { - return o.fullliner(tu) - } - return o.fullline(tu) -} - -func (o *View) Py_word(tu *py.Tuple) (py.Object, error) { - v, err := tu.GetItem(0) - if err != nil { - return nil, err - } - if _, ok := v.(*Region); ok { - return o.wordr(tu) - } - return o.word(tu) -} - -func (o *View) Py_set_syntax_file(tu *py.Tuple) (py.Object, error) { - v, err := tu.GetItem(0) - if err != nil { - return nil, err - } - if v, ok := v.(*py.Unicode); ok { - o.data.Settings().Set("syntax", v.String()) - } - return toPython(nil) -} - -func (o *View) Py_expand_by_class(tu *py.Tuple, kw *py.Dict) (py.Object, error) { - var ( - arg1 text.Region - arg2 int - ) - - if v, err := tu.GetItem(0); err != nil { - return nil, err - } else { - if v2, ok := v.(*Region); !ok { - if v2, ok := v.(*py.Long); !ok { - return nil, fmt.Errorf("Expected type *Region or *Int for backend.View.ExpandByClass() arg1, not %s", v.Type()) - } else { - arg1.A = int(v2.Int64()) - arg1.B = arg1.A + 1 - } - } else { - arg1 = v2.data - } - } - - if v, err := tu.GetItem(1); err != nil { - return nil, err - } else { - if v3, err2 := fromPython(v); err2 != nil { - return nil, err2 - } else { - if v2, ok := v3.(int); !ok { - return nil, fmt.Errorf("Expected type int for backend.View.ExpandByClass() arg2, not %s", v.Type()) - } else { - arg2 = v2 - } - } - } - - ret := o.data.ExpandByClass(arg1, arg2) - var err error - var pyret py.Object - - pyret, err = toPython(ret) - if err != nil { - return nil, err - } - return pyret, err -} - -func (o *View) Py_find(tu *py.Tuple) (py.Object, error) { - var ( - arg1 string - arg2 int - arg3 int - ) - if v, err := tu.GetItem(0); err != nil { - return nil, err - } else { - if v3, err2 := fromPython(v); err2 != nil { - return nil, err2 - } else { - if v2, ok := v3.(string); !ok { - return nil, fmt.Errorf("Expected type string for backend.View.Find() arg1, not %s", v.Type()) - } else { - arg1 = v2 - } - } - } - if v, err := tu.GetItem(1); err != nil { - return nil, err - } else { - if v3, err2 := fromPython(v); err2 != nil { - return nil, err2 - } else { - if v2, ok := v3.(int); !ok { - return nil, fmt.Errorf("Expected type int for backend.View.Find() arg2, not %s", v.Type()) - } else { - arg2 = v2 - } - } - } - if v, err := tu.GetItem(2); err == nil { - if v3, err2 := fromPython(v); err2 != nil { - return nil, err2 - } else { - if v2, ok := v3.(int); !ok { - return nil, fmt.Errorf("Expected type int for backend.View.Find() arg3, not %s", v.Type()) - } else { - arg3 = v2 - } - } - } - ret0 := o.data.Find(arg1, arg2, arg3) - var err error - var pyret0 py.Object - - pyret0, err = toPython(ret0) - if err != nil { - return nil, err - } - return pyret0, err -} diff --git a/backend/sublime/window_generated.go b/backend/sublime/window_generated.go deleted file mode 100644 index 26337eb..0000000 --- a/backend/sublime/window_generated.go +++ /dev/null @@ -1,93 +0,0 @@ -// Copyright 2015 The lime Authors. -// Use of this source code is governed by a 2-clause -// BSD-style license that can be found in the LICENSE file. - -// This file was generated by tasks/build/gen_python_api.go and shouldn't be manually modified - -package sublime - -import ( - "fmt" - "github.com/limetext/gopy/lib" - "github.com/limetext/lime/backend" - "github.com/limetext/text" -) - -var ( - _ = backend.View{} - _ = text.Region{} - _ = fmt.Errorf -) - -var _windowClass = py.Class{ - Name: "sublime.Window", - Pointer: (*Window)(nil), -} - -type Window struct { - py.BaseObject - data *backend.Window -} - -func (o *Window) PyInit(args *py.Tuple, kwds *py.Dict) error { - return fmt.Errorf("Can't initialize type Window") -} -func (o *Window) Py_active_view() (py.Object, error) { - ret0 := o.data.ActiveView() - var err error - var pyret0 py.Object - - pyret0, err = toPython(ret0) - if err != nil { - return nil, err - } - return pyret0, err -} - -func (o *Window) Py_id() (py.Object, error) { - ret0 := o.data.Id() - var err error - var pyret0 py.Object - - pyret0, err = toPython(ret0) - if err != nil { - return nil, err - } - return pyret0, err -} - -func (o *Window) Py_new_file() (py.Object, error) { - ret0 := o.data.NewFile() - var err error - var pyret0 py.Object - - pyret0, err = toPython(ret0) - if err != nil { - return nil, err - } - return pyret0, err -} - -func (o *Window) Py_settings() (py.Object, error) { - ret0 := o.data.Settings() - var err error - var pyret0 py.Object - - pyret0, err = toPython(ret0) - if err != nil { - return nil, err - } - return pyret0, err -} - -func (o *Window) Py_views() (py.Object, error) { - ret0 := o.data.Views() - var err error - var pyret0 py.Object - - pyret0, err = toPython(ret0) - if err != nil { - return nil, err - } - return pyret0, err -} diff --git a/backend/sublime/window_manual.go b/backend/sublime/window_manual.go deleted file mode 100644 index 36c3e5a..0000000 --- a/backend/sublime/window_manual.go +++ /dev/null @@ -1,111 +0,0 @@ -// Copyright 2013 The lime Authors. -// Use of this source code is governed by a 2-clause -// BSD-style license that can be found in the LICENSE file. - -package sublime - -import ( - "fmt" - "github.com/limetext/gopy/lib" - "github.com/limetext/lime/backend" - "github.com/limetext/text" -) - -var ( - _ = backend.View{} - _ = text.Region{} - _ = fmt.Errorf -) - -func (o *Window) Py_open_file(tu *py.Tuple) (py.Object, error) { - var ( - arg1 string - arg2 int - ) - v, err := tu.GetItem(0) - if err != nil { - return nil, err - } - if v2, ok := v.(*py.Unicode); !ok { - return nil, fmt.Errorf("Expected type *py.Unicode for backend.Window.OpenFile() arg1, not %s", v.Type()) - } else { - arg1 = v2.String() - } - if tu.Size() > 1 { - v, err := tu.GetItem(1) - if err != nil { - return nil, err - } - if v2, ok := v.(*py.Long); !ok { - return nil, fmt.Errorf("Expected type *py.Long for backend.Window.OpenFile() arg2, not %s", v.Type()) - } else { - arg2 = int(v2.Int64()) - } - } - ret0 := o.data.OpenFile(arg1, arg2) - var pyret0 py.Object - - pyret0, err = _viewClass.Alloc(1) - if err != nil { - return nil, err - } else if v2, ok := pyret0.(*View); !ok { - return nil, fmt.Errorf("Unable to convert return value to the right type?!: %s", pyret0.Type()) - } else { - v2.data = ret0 - } - if err != nil { - return nil, err - } - return pyret0, err -} - -func (o *Window) Py_run_command(tu *py.Tuple) (py.Object, error) { - var ( - arg1 string - arg2 backend.Args - ) - v, err := tu.GetItem(0) - if err != nil { - return nil, err - } - if v2, ok := v.(*py.Unicode); !ok { - return nil, fmt.Errorf("Expected type *py.Unicode for backend.Window.RunCommand() arg1, not %s", v.Type()) - } else { - arg1 = v2.String() - } - arg2 = make(backend.Args) - if v, err := tu.GetItem(1); err == nil { - v2, ok := v.(*py.Dict) - if !ok { - return nil, fmt.Errorf("Expected type *py.Dict for backend.Window.RunCommand() arg2, not %s", v.Type()) - } - if v, err := fromPython(v2); err != nil { - return nil, err - } else { - arg2 = v.(backend.Args) - } - } - backend.GetEditor().CommandHandler().RunWindowCommand(o.data, arg1, arg2) - return toPython(nil) -} - -func (o *Window) Py_focus_view(tu *py.Tuple) (py.Object, error) { - var ( - arg1 *backend.View - ) - if v, err := tu.GetItem(0); err != nil { - return nil, err - } else { - if v3, err2 := fromPython(v); err2 != nil { - return nil, err2 - } else { - if v2, ok := v3.(*backend.View); !ok { - return nil, fmt.Errorf("Expected type *backend.View for backend.Window.SetActiveView() arg1, not %s", v.Type()) - } else { - arg1 = v2 - } - } - } - o.data.SetActiveView(arg1) - return toPython(nil) -} diff --git a/backend/testdata/Closetag/closetag.vim b/backend/testdata/Closetag/closetag.vim deleted file mode 100644 index acaa99f..0000000 --- a/backend/testdata/Closetag/closetag.vim +++ /dev/null @@ -1,334 +0,0 @@ -" File: closetag.vim -" Summary: Functions and mappings to close open HTML/XML tags -" Uses: -- close matching open tag -" Author: Steven Mueller -" Last Modified: Tue May 24 13:29:48 PDT 2005 -" Version: 0.9.1 -" XXX - breaks if close attempted while XIM is in preedit mode -" TODO - allow usability as a global plugin - -" Add g:unaryTagsStack - always contains html tags settings -" and g:closetag_default_xml - user should define this to default to xml -" When a close is attempted but b:unaryTagsStack undefined, -" use b:closetag_html_style to determine if the file is to be treated -" as html or xml. Failing that, check the filetype for xml or html. -" Finally, default to g:closetag_html_style. -" If the file is html, let b:unaryTagsStack=g:unaryTagsStack -" otherwise, let b:unaryTagsStack="" -" TODO - make matching work for all comments -" -- kinda works now, but needs syn sync minlines to be very long -" -- Only check whether in syntax in the beginning, then store comment tags -" in the tagstacks to determine whether to move into or out of comment mode -" TODO - The new normal mode mapping clears recent messages with its , and -" it doesn't fix the null-undo issue for vim 5.7 anyway. -" TODO - make use of the following neat features: -" -- the ternary ?: operator -" -- :echomsg and :echoerr -" -- curly brace expansion for variables and function name definitions? -" -- check up on map \FuncName -" -" Description: -" This script eases redundant typing when writing html or xml files (even if -" you're very good with ctrl-p and ctrl-n :). Hitting ctrl-_ will initiate a -" search for the most recent open tag above that is not closed in the -" intervening space and then insert the matching close tag at the cursor. In -" normal mode, the close tag is inserted one character after cursor rather than -" at it, as if a had been used. This allows putting close tags at the -" ends of lines while in normal mode, but disallows inserting them in the -" first column. -" -" For HTML, a configurable list of tags are ignored in the matching process. -" By default, the following tags will not be matched and thus not closed -" automatically: area, base, br, dd, dt, hr, img, input, link, meta, and -" param. -" -" For XML, all tags must have a closing match or be terminated by />, as in -" . These empty element tags are ignored for matching. -" -" Comment checking is now handled by vim's internal syntax checking. If tag -" closing is initiated outside a comment, only tags outside of comments will -" be matched. When closing tags in comments, only tags within comments will -" be matched, skipping any non-commented out code (wee!). However, the -" process of determining the syntax ID of an arbitrary position can still be -" erroneous if a comment is not detected because the syntax highlighting is -" out of sync, or really slow if syn sync minlines is large. -" Set the b:closetag_disable_synID variable to disable this feature if you -" have really big chunks of comment in your code and closing tags is too slow. -" -" If syntax highlighting is not enabled, comments will not be handled very -" well. Commenting out HTML in certain ways may cause a "tag mismatch" -" message and no completion. For example, '' -" between the cursor and the most recent unclosed open tag above causes -" trouble. Properly matched well formed tags in comments don't cause a -" problem. -" -" Install: -" To use, place this file in your standard vim scripts directory, and source -" it while editing the file you wish to close tags in. If the filetype is not -" set or the file is some sort of template with embedded HTML, you may force -" HTML style tag matching by first defining the b:closetag_html_style buffer -" variable. Otherwise, the default is XML style tag matching. -" -" Example: -" :let b:closetag_html_style=1 -" :source ~/.vim/scripts/closetag.vim -" -" For greater convenience, load this script in an autocommand: -" :au Filetype html,xml,xsl source ~/.vim/scripts/closetag.vim -" -" Also, set noignorecase for html files or edit b:unaryTagsStack to match your -" capitalization style. You may set this variable before or after loading the -" script, or simply change the file itself. -" -" Configuration Variables: -" -" b:unaryTagsStack Buffer local string containing a whitespace -" seperated list of element names that should be -" ignored while finding matching closetags. Checking -" is done according to the current setting of the -" ignorecase option. -" -" b:closetag_html_style Define this (as with let b:closetag_html_style=1) -" and source the script again to set the -" unaryTagsStack to its default value for html. -" -" b:closetag_disable_synID Define this to disable comment checking if tag -" closing is too slow. This can be set or unset -" without having to source again. -" -" Changelog: -" May 24, 2005 Tuesday -" * Changed function names to be script-local to avoid conflicts with other -" scripts' stack implementations. -" -" June 07, 2001 Thursday -" * Added comment handling. Currently relies on synID, so if syn sync -" minlines is small, the chance for failure is high, but if minlines is -" large, tagclosing becomes rather slow... -" -" * Changed normal mode closetag mapping to use in insert mode -" rather than p in normal mode. This has 2 implications: -" - Tag closing no longer clobbers the unnamed register -" - When tag closing fails or finds no match, no longer adds to the undo -" buffer for recent vim 6.0 development versions. -" - However, clears the last message when closing tags in normal mode -" -" * Changed the closetag_html_style variable to be buffer-local rather than -" global. -" -" * Expanded documentation - -"------------------------------------------------------------------------------ -" User configurable settings -"------------------------------------------------------------------------------ - -" if html, don't close certain tags. Works best if ignorecase is set. -" otherwise, capitalize these elements according to your html editing style -if !exists("b:unaryTagsStack") || exists("b:closetag_html_style") - if &filetype == "html" || exists("b:closetag_html_style") - let b:unaryTagsStack="area base br dd dt hr img input link meta param" - else " for xsl and xsl - let b:unaryTagsStack="" - endif -endif - -" Has this already been loaded? -if exists("loaded_closetag") - finish -endif -let loaded_closetag=1 - -" set up mappings for tag closing -inoremap =GetCloseTag() -map a - -"------------------------------------------------------------------------------ -" Tag closer - uses the stringstack implementation below -"------------------------------------------------------------------------------ - -" Returns the most recent unclosed tag-name -" (ignores tags in the variable referenced by a:unaryTagsStack) -function! GetLastOpenTag(unaryTagsStack) - " Search backwards through the file line by line using getline() - " Overall strategy (moving backwards through the file from the cursor): - " Push closing tags onto a stack. - " On an opening tag, if the tag matches the stack top, discard both. - " -- if the tag doesn't match, signal an error. - " -- if the stack is empty, use this tag - let linenum=line(".") - let lineend=col(".") - 1 " start: cursor position - let first=1 " flag for first line searched - let b:TagStack="" " main stack of tags - let startInComment=s:InComment() - - let tagpat='' - " Search for: closing tags - while (linenum>0) - " Every time we see an end-tag, we push it on the stack. When we see an - " open tag, if the stack isn't empty, we pop it and see if they match. - " If no, signal an error. - " If yes, continue searching backwards. - " If stack is empty, return this open tag as the one that needs closing. - let line=getline(linenum) - if first - let line=strpart(line,0,lineend) - else - let lineend=strlen(line) - endif - let b:lineTagStack="" - let mpos=0 - let b:TagCol=0 - " Search the current line in the forward direction, pushing any tags - " onto a special stack for the current line - while (mpos > -1) - let mpos=matchend(line,tagpat) - if mpos > -1 - let b:TagCol=b:TagCol+mpos - let tag=matchstr(line,tagpat) - - if exists("b:closetag_disable_synID") || startInComment==s:InCommentAt(linenum, b:TagCol) - let b:TagLine=linenum - call s:Push(matchstr(tag,'[^<>]\+'),"b:lineTagStack") - endif - "echo "Tag: ".tag." ending at position ".mpos." in '".line."'." - let lineend=lineend-mpos - let line=strpart(line,mpos,lineend) - endif - endwhile - " Process the current line stack - while (!s:EmptystackP("b:lineTagStack")) - let tag=s:Pop("b:lineTagStack") - if match(tag, "^/") == 0 "found end tag - call s:Push(tag,"b:TagStack") - "echo linenum." ".b:TagStack - elseif s:EmptystackP("b:TagStack") && !s:Instack(tag, a:unaryTagsStack) "found unclosed tag - return tag - else - let endtag=s:Peekstack("b:TagStack") - if endtag == "/".tag || endtag == "/" - call s:Pop("b:TagStack") "found a open/close tag pair - "echo linenum." ".b:TagStack - elseif !s:Instack(tag, a:unaryTagsStack) "we have a mismatch error - echohl Error - echon "\rError:" - echohl None - echo " tag mismatch: <".tag."> doesn't match <".endtag.">. (Line ".linenum." Tagstack: ".b:TagStack.")" - return "" - endif - endif - endwhile - let linenum=linenum-1 | let first=0 - endwhile - " At this point, we have exhausted the file and not found any opening tag - echo "No opening tags." - return "" -endfunction - -" Returns closing tag for most recent unclosed tag, respecting the -" current setting of b:unaryTagsStack for tags that should not be closed -function! GetCloseTag() - if !exists("b:unaryTagsStack") || exists("b:closetag_html_style") - if &filetype == "html" || exists("b:closetag_html_style") - let b:unaryTagsStack="area base br dd dt hr img input link meta param" - else " for xsl and xsl - let b:unaryTagsStack="" - endif - endif - let tag=GetLastOpenTag("b:unaryTagsStack") - if tag == "" - return "" - else - return "" - endif -endfunction - -" return 1 if the cursor is in a syntactically identified comment field -" (fails for empty lines: always returns not-in-comment) -function! s:InComment() - return synIDattr(synID(line("."), col("."), 0), "name") =~ 'Comment' -endfunction - -" return 1 if the position specified is in a syntactically identified comment field -function! s:InCommentAt(line, col) - return synIDattr(synID(a:line, a:col, 0), "name") =~ 'Comment' -endfunction - -"------------------------------------------------------------------------------ -" String Stacks -"------------------------------------------------------------------------------ -" These are strings of whitespace-separated elements, matched using the \< and -" \> patterns after setting the iskeyword option. -" -" The sname argument should contain a symbolic reference to the stack variable -" on which method should operate on (i.e., sname should be a string containing -" a fully qualified (ie: g:, b:, etc) variable name.) - -" Helper functions -function! s:SetKeywords() - let g:IsKeywordBak=&iskeyword - let &iskeyword="33-255" -endfunction - -function! s:RestoreKeywords() - let &iskeyword=g:IsKeywordBak -endfunction - -" Push el onto the stack referenced by sname -function! s:Push(el, sname) - if !s:EmptystackP(a:sname) - exe "let ".a:sname."=a:el.' '.".a:sname - else - exe "let ".a:sname."=a:el" - endif -endfunction - -" Check whether the stack is empty -function! s:EmptystackP(sname) - exe "let stack=".a:sname - if match(stack,"^ *$") == 0 - return 1 - else - return 0 - endif -endfunction - -" Return 1 if el is in stack sname, else 0. -function! s:Instack(el, sname) - exe "let stack=".a:sname - call s:SetKeywords() - let m=match(stack, "\\<".a:el."\\>") - call s:RestoreKeywords() - if m < 0 - return 0 - else - return 1 - endif -endfunction - -" Return the first element in the stack -function! s:Peekstack(sname) - call s:SetKeywords() - exe "let stack=".a:sname - let top=matchstr(stack, "\\<.\\{-1,}\\>") - call s:RestoreKeywords() - return top -endfunction - -" Remove and return the first element in the stack -function! s:Pop(sname) - if s:EmptystackP(a:sname) - echo "Error! Stack ".a:sname." is empty and can't be popped." - return "" - endif - exe "let stack=".a:sname - " Find the first space, loc is 0-based. Marks the end of 1st elt in stack. - call s:SetKeywords() - let loc=matchend(stack,"\\<.\\{-1,}\\>") - exe "let ".a:sname."=strpart(stack, loc+1, strlen(stack))" - let top=strpart(stack, match(stack, "\\<"), loc) - call s:RestoreKeywords() - return top -endfunction - -function! s:Clearstack(sname) - exe "let ".a:sname."=''" -endfunction diff --git a/backend/testdata/Default.sublime-keymap b/backend/testdata/Default.sublime-keymap deleted file mode 100644 index 82cefed..0000000 --- a/backend/testdata/Default.sublime-keymap +++ /dev/null @@ -1,5 +0,0 @@ -[ - { "keys": ["i"], "command": "test1", "context": [{ "key": "test1" }] }, - { "keys": ["i"], "command": "test2", "context": [{ "key": "test2" }] }, - { "keys": ["i"], "command": "test3", "context": [{ "key": "test3" }] }, -] diff --git a/backend/testdata/Default.sublime-settings b/backend/testdata/Default.sublime-settings deleted file mode 100644 index 371d7b9..0000000 --- a/backend/testdata/Default.sublime-settings +++ /dev/null @@ -1,4 +0,0 @@ -{ - // The number of spaces a tab is equal to. Valid values are powers of two: 2, 4, 8, 16 - "tab_size": 4 -} diff --git a/backend/testdata/Vintage/Default.sublime-commands b/backend/testdata/Vintage/Default.sublime-commands deleted file mode 100644 index 1ddff64..0000000 --- a/backend/testdata/Vintage/Default.sublime-commands +++ /dev/null @@ -1,3 +0,0 @@ -[ - { "caption": "Vintageous: Run Tests...", "command": "show_vintageous_test_suites" } -] \ No newline at end of file diff --git a/backend/testdata/Vintage/Default.sublime-keymap b/backend/testdata/Vintage/Default.sublime-keymap deleted file mode 100644 index fb99adf..0000000 --- a/backend/testdata/Vintage/Default.sublime-keymap +++ /dev/null @@ -1,240 +0,0 @@ -// -// Basic rule to add new key bindings: -// -// Given two identical 'keys', the last one wins, even if its context is less strict. -// - -[ - { "keys": ["escape"], "command": "set_action", "args": {"action": "vi_esc"}, "context": [{"key": "vi_must_change_mode"}, {"key": "vi_is_buffer"}] }, - - { "keys": ["R"], "command": "set_action", "args": {"action": "vi_enter_replace_mode"}, "context": [{"key": "vi_mode_normal"}, {"key": "vi_is_buffer"}] }, - - { "keys": ["i"], "command": "set_action", "args": {"action": "vi_enter_insert_mode"}, "context": [{"key": "setting.command_mode"}, {"key": "vi_mode_visual_any", "operand": false}] }, - - // This allows insertions such as 5ifoobar\n. Macros help with this, but we should prevent the user from - // requesting a macro recording until after is pressed. TODO: Maybe create a context like "vi_in_normal_insert_mode"? - { "keys": ["i"], "command": "vi_enter_normal_insert_mode", "context": [{"key": "setting.command_mode"}, {"key": "vi_has_motion_count"}] }, - { "keys": ["a"], "command": "set_action", "args": {"action": "vi_a"}, "context": [{"key": "setting.command_mode"}, {"key": "vi_mode_visual_any", "operand": false}] }, - - { "keys": ["h"], "command": "set_motion", "args": {"motion": "vi_h"}, "context": [{"key": "vi_mode_normal_or_visual"}] }, - { "keys": ["j"], "command": "set_motion", "args": {"motion": "vi_j"}, "context": [{"key": "setting.command_mode"}] }, - { "keys": ["k"], "command": "set_motion", "args": {"motion": "vi_k"}, "context": [{"key": "setting.command_mode"}] }, - { "keys": ["l"], "command": "set_motion", "args": {"motion": "vi_l"}, "context": [{"key": "vi_mode_normal_or_visual"}] }, - - { "keys": ["down"], "command": "set_motion", "args": {"motion": "vi_j"}, "context": [{"key": "setting.command_mode"}] }, - { "keys": ["up"], "command": "set_motion", "args": {"motion": "vi_k"}, "context": [{"key": "setting.command_mode"}] }, - - { "keys": ["left"], "command": "set_motion", "args": {"motion": "vi_h"}, "context": [{"key": "vi_mode_normal_or_visual"}] }, - { "keys": ["right"], "command": "set_motion", "args": {"motion": "vi_l"}, "context": [{"key": "vi_mode_normal_or_visual"}] }, - - { "keys": ["w"], "command": "set_motion", "args": {"motion": "vi_w"}, "context": [{"key": "vi_mode_normal_or_visual"}] }, - { "keys": ["e"], "command": "set_motion", "args": {"motion": "vi_e"}, "context": [{"key": "vi_mode_normal_or_visual"}] }, - { "keys": ["b"], "command": "set_motion", "args": {"motion": "vi_b"}, "context": [{"key": "vi_mode_normal_or_visual"}] }, - - { "keys": ["W"], "command": "set_motion", "args": {"motion": "vi_big_w"}, "context": [{"key": "vi_mode_normal_or_visual"}] }, - { "keys": ["E"], "command": "set_motion", "args": {"motion": "vi_big_e"}, "context": [{"key": "vi_mode_normal_or_visual"}] }, - { "keys": ["B"], "command": "set_motion", "args": {"motion": "vi_big_b"}, "context": [{"key": "vi_mode_normal_or_visual"}] }, - - { "keys": ["$"], "command": "set_motion", "args": {"motion": "vi_dollar"}, "context": [{"key": "vi_mode_normal_or_visual"}] }, - { "keys": ["_"], "command": "set_motion", "args": {"motion": "vi_underscore"}, "context": [{"key": "vi_mode_normal_or_visual"}] }, - { "keys": ["^"], "command": "set_motion", "args": {"motion": "vi_underscore"}, "context": [{"key": "vi_mode_normal_or_visual"}] }, - - { "keys": ["{"], "command": "set_motion", "args": {"motion": "vi_left_brace"}, "context": [{"key": "vi_mode_normal_or_any_visual"}] }, - { "keys": ["}"], "command": "set_motion", "args": {"motion": "vi_right_brace"}, "context": [{"key": "vi_mode_normal_or_any_visual"}] }, - - { "keys": ["("], "command": "set_motion", "args": {"motion": "vi_left_parenthesis"}, "context": [{"key": "vi_mode_normal_or_visual"}] }, - { "keys": [")"], "command": "set_motion", "args": {"motion": "vi_right_parenthesis"}, "context": [{"key": "vi_mode_normal_or_visual"}] }, - - { "keys": ["I"], "command": "set_action", "args": {"action": "vi_big_i"}, "context": [{"key": "setting.command_mode"}] }, - { "keys": ["A"], "command": "set_action", "args": {"action": "vi_big_a"}, "context": [{"key": "setting.command_mode"}] }, - - { "keys": ["G"], "command": "set_motion", "args": {"motion": "vi_big_g"}, "context": [{"key": "setting.command_mode"}] }, - { "keys": ["%"], "command": "set_motion", "args": {"motion": "vi_percent"}, "context": [{"key": "setting.command_mode"}] }, - - // TODO: They don't work in VISUALLINEMODE. - { "keys": ["H"], "command": "set_motion", "args": {"motion": "vi_big_h"}, "context": [{"key": "setting.command_mode"}] }, - { "keys": ["M"], "command": "set_motion", "args": {"motion": "vi_big_m"}, "context": [{"key": "setting.command_mode"}] }, - { "keys": ["L"], "command": "set_motion", "args": {"motion": "vi_big_l"}, "context": [{"key": "setting.command_mode"}] }, - - { "keys": ["*"], "command": "set_motion", "args": {"motion": "vi_star"}, "context": [{"key": "setting.command_mode"}] }, - { "keys": ["#"], "command": "set_motion", "args": {"motion": "vi_octothorp"}, "context": [{"key": "setting.command_mode"}] }, - - // TODO: Do the same as for ESC and fold all v commands into a single one. - { "keys": ["v"], "command": "set_action", "args": {"action": "vi_enter_visual_mode"}, "context": [{"key": "vi_mode_normal"}, {"key": "vi_can_enter_any_visual_mode"}] }, - { "keys": ["v"], "command": "set_action", "args": {"action": "vi_enter_normal_mode"}, "context": [{"key": "vi_mode_visual"}] }, - { "keys": ["v"], "command": "set_action", "args": {"action": "vi_enter_visual_mode"}, "context": [{"key": "vi_mode_visual_line"}] }, - - { "keys": ["V"], "command": "set_action", "args": {"action": "vi_enter_visual_line_mode"}, "context": [{"key": "setting.command_mode"}, {"key": "vi_can_enter_any_visual_mode"}] }, - { "keys": ["V"], "command": "set_action", "args": {"action": "vi_enter_normal_mode"}, "context": [{"key": "vi_mode_visual_line"}] }, - - - { "keys": ["1"], "command": "vi_push_digit", "args": {"digit": "1"}, "context": [{"key": "vi_mode_can_push_digit"}, {"key": "setting.command_mode"}] }, - { "keys": ["2"], "command": "vi_push_digit", "args": {"digit": "2"}, "context": [{"key": "vi_mode_can_push_digit"}, {"key": "setting.command_mode"}] }, - { "keys": ["3"], "command": "vi_push_digit", "args": {"digit": "3"}, "context": [{"key": "vi_mode_can_push_digit"}, {"key": "setting.command_mode"}] }, - { "keys": ["4"], "command": "vi_push_digit", "args": {"digit": "4"}, "context": [{"key": "vi_mode_can_push_digit"}, {"key": "setting.command_mode"}] }, - { "keys": ["5"], "command": "vi_push_digit", "args": {"digit": "5"}, "context": [{"key": "vi_mode_can_push_digit"}, {"key": "setting.command_mode"}] }, - { "keys": ["6"], "command": "vi_push_digit", "args": {"digit": "6"}, "context": [{"key": "vi_mode_can_push_digit"}, {"key": "setting.command_mode"}] }, - { "keys": ["7"], "command": "vi_push_digit", "args": {"digit": "7"}, "context": [{"key": "vi_mode_can_push_digit"}, {"key": "setting.command_mode"}] }, - { "keys": ["8"], "command": "vi_push_digit", "args": {"digit": "8"}, "context": [{"key": "vi_mode_can_push_digit"}, {"key": "setting.command_mode"}] }, - { "keys": ["9"], "command": "vi_push_digit", "args": {"digit": "9"}, "context": [{"key": "vi_mode_can_push_digit"}, {"key": "setting.command_mode"}] }, - { "keys": ["0"], "command": "vi_push_digit", "args": {"digit": "0"}, "context": [{"key": "vi_mode_can_push_digit"}, {"key": "setting.command_mode"}] }, - - { "keys": ["0"], "command": "set_motion", "args": {"motion": "vi_zero"}, "context": [{"key": "setting.command_mode"}, {"key": "vi_mode_cannot_push_zero"}] }, - - // ** Actions ** - - // This one is run directly so we don't overwrite the command we want repeated. - { "keys": ["."], "command": "_vi_repeat", "context": [{"key": "setting.command_mode"}]}, - - // In Vim, u only works in NORMALMODE. - // TODO: Does it take counts? - { "keys": ["u"], "command": "_vi_undo", "context": [{"key": "vi_mode_normal"}] }, - // TODO: implement counts for redo and make it go through all the normal machinery. - { "keys": ["ctrl+r"], "command": "redo", "context": [{"key": "vi_mode_normal"}, {"key": "vi_use_ctrl_keys"}] }, - - // TODO: Do we really want to use the built-in jump list? Do we have are own? - { "keys": ["ctrl+o"], "command": "jump_back", "context": [{"key": "vi_mode_normal"}, {"key": "vi_use_ctrl_keys"}] }, - { "keys": ["ctrl+i"], "command": "jump_forward", "context": [{"key": "vi_mode_normal"}, {"key": "vi_use_ctrl_keys"}] }, - - // Ctrl+f in Vim cannot be used as a motion for an action. - { "keys": ["ctrl+f"], "command": "set_motion", "args": {"motion": "vi_ctrl_f"}, "context": [{"key": "vi_mode_normal_or_any_visual"}, {"key": "vi_use_ctrl_keys"}] }, - { "keys": ["ctrl+b"], "command": "set_motion", "args": {"motion": "vi_ctrl_b"}, "context": [{"key": "vi_mode_normal_or_any_visual"}, {"key": "vi_use_ctrl_keys"}] }, - - { "keys": ["d"], "command": "set_action", "args": {"action": "vi_d"}, "context": [{"key": "setting.command_mode"}] }, - { "keys": ["s"], "command": "set_action", "args": {"action": "vi_s"}, "context": [{"key": "setting.command_mode"}] }, - { "keys": ["S"], "command": "set_action", "args": {"action": "vi_big_s"}, "context": [{"key": "setting.command_mode"}] }, - { "keys": ["c"], "command": "set_action", "args": {"action": "vi_c"}, "context": [{"key": "setting.command_mode"}] }, - { "keys": ["C"], "command": "set_action", "args": {"action": "vi_big_c"}, "context": [{"key": "setting.command_mode"}] }, - - { "keys": ["o"], "command": "set_action", "args": {"action": "vi_o"}, "context": [{"key": "setting.command_mode"}] }, - { "keys": ["O"], "command": "set_action", "args": {"action": "vi_big_o"}, "context": [{"key": "setting.command_mode"}] }, - - { "keys": ["J"], "command": "set_action", "args": {"action": "vi_big_j"}, "context": [{"key": "setting.command_mode"}] }, - - // This is a fake action that allows gg to be issued. - { "keys": ["g"], "command": "set_action", "args": {"action": "vi_g_action"}, "context": [{"key": "setting.command_mode"}] }, - - // gg can either be an action or a motion. It's a motion when there's a true action primed. - // TODO: Improve this. XXX This is obsolete? - { "keys": ["g", "g"], "command": "set_motion", "args": {"motion": "vi_gg"}, "context": [{"key": "vi_has_action"}] }, - - { "keys": ["D"], "command": "set_action", "args": {"action": "vi_big_d"}, "context": [{"key": "setting.command_mode"}] }, - - // gg can either be an action or a motion. It's an action when there is no actual action. - { "keys": ["g"], "command": "set_action", "args": {"action": "vi_gg"}, "context": [{"key": "setting.command_mode"}, {"key": "vi_has_incomplete_action"}] }, - { "keys": ["d"], "command": "set_action", "args": {"action": "vi_g_d"}, "context": [{"key": "setting.command_mode"}, {"key": "vi_has_incomplete_action"}] }, - { "keys": ["D"], "command": "set_action", "args": {"action": "vi_g_big_d"}, "context": [{"key": "setting.command_mode"}, {"key": "vi_has_incomplete_action"}] }, - - { "keys": ["U"], "command": "set_action", "args": {"action": "vi_g_big_u"}, "context": [{"key": "setting.command_mode"}, {"key": "vi_has_incomplete_action"}] }, - { "keys": ["u"], "command": "set_action", "args": {"action": "vi_g_u"}, "context": [{"key": "setting.command_mode"}, {"key": "vi_has_incomplete_action"}] }, - { "keys": ["q"], "command": "set_action", "args": {"action": "vi_g_q"}, "context": [{"key": "setting.command_mode"}, {"key": "vi_has_incomplete_action"}] }, - { "keys": ["*"], "command": "set_action", "args": {"action": "vi_g_star"}, "context": [{"key": "setting.command_mode"}, {"key": "vi_has_incomplete_action"}] }, - { "keys": ["#"], "command": "set_action", "args": {"action": "vi_g_octothorp"}, "context": [{"key": "setting.command_mode"}, {"key": "vi_has_incomplete_action"}] }, - { "keys": ["v"], "command": "set_action", "args": {"action": "vi_g_v"}, "context": [{"key": "vi_mode_normal"}, {"key": "vi_has_incomplete_action"}] }, - - { "keys": ["U"], "command": "set_action", "args": {"action": "vi_big_u"}, "context": [{"key": "vi_mode_visual_any"}] }, - { "keys": ["u"], "command": "set_action", "args": {"action": "vi_u"}, "context": [{"key": "vi_mode_visual_any"}] }, - - { "keys": ["="], "command": "set_action", "args": {"action": "vi_equals"}, "context": [{"key": "vi_mode_normal_or_any_visual"}] }, - - // These come after the ones above so we don't need extra context checks. - { "keys": ["o"], "command": "set_action", "args": {"action": "vi_visual_o"}, "context": [{"key": "vi_mode_visual_any"}] }, - - { "keys": ["y"], "command": "set_action", "args": {"action": "vi_y"}, "context": [{"key": "setting.command_mode"}] }, - { "keys": ["x"], "command": "set_action", "args": {"action": "vi_x"}, "context": [{"key": "setting.command_mode"}] }, - // FIXME: X behaves linewise in visual mode. The following command is wrong at the moment. - { "keys": ["X"], "command": "set_action", "args": {"action": "vi_big_x"}, "context": [{"key": "setting.command_mode"}] }, - - { "keys": ["Y"], "command": "set_action", "args": {"action": "vi_yy"}, "context": [{"key": "setting.command_mode"}] }, - - { "keys": ["p"], "command": "set_action", "args": {"action": "vi_p"}, "context": [{"key": "setting.command_mode"}] }, - { "keys": ["P"], "command": "set_action", "args": {"action": "vi_big_p"}, "context": [{"key": "setting.command_mode"}] }, - - // TODO: Restrict this to when there's no count, action or motion. - { "keys": ["\""], "command": "set_register", "context": [{"key": "setting.command_mode"}] }, - { "keys": [""], "command": "set_register", "context": [{"key": "setting.command_mode", "key": "vi_state_expecting_register"}] }, - - // Twofold process: First set the motion, then collect user input and run global state. - { "keys": ["f"], "command": "vi_f", "context": [{"key": "vi_mode_normal"}] }, - { "keys": ["f"], "command": "vi_f", "context": [{"key": "vi_mode_visual"}] }, - // TODO: Is the following key binding needed? - { "keys": [""], "command": "vi_f", "context": [{"key": "setting.command_mode", "key": "vi_state_expecting_user_input"}] }, - - { "keys": ["m"], "command": "vi_m", "context": [{"key": "vi_mode_normal_or_visual"}] }, - { "keys": ["'"], "command": "vi_quote", "context": [{"key": "vi_mode_normal_or_visual"}] }, - - // Repeats f - { "keys": [","], "command": "set_motion", "args":{"motion": "vi_comma"}, "context": [{"key": "vi_mode_normal"}] }, - { "keys": [","], "command": "set_motion", "args":{"motion": "vi_comma"}, "context": [{"key": "vi_mode_visual"}] }, - - // Repeats f backward - { "keys": [";"], "command": "set_motion", "args":{"motion": "vi_semicolon"}, "context": [{"key": "vi_mode_normal"}] }, - { "keys": [";"], "command": "set_motion", "args":{"motion": "vi_semicolon"}, "context": [{"key": "vi_mode_visual"}] }, - - // Twofold process: First set the motion, then collect user input and run global state. - { "keys": ["t"], "command": "vi_t", "context": [{"key": "vi_mode_normal"},] }, - { "keys": ["t"], "command": "vi_t", "context": [{"key": "vi_mode_visual"},] }, - - // Twofold process: First set the motion, then collect user input and run global state. - { "keys": ["T"], "command": "vi_big_t", "context": [{"key": "vi_mode_normal"}] }, - { "keys": ["T"], "command": "vi_big_t", "context": [{"key": "vi_mode_visual"}] }, - - // Twofold process: First set the motion, then collect user input and run global state. - { "keys": ["F"], "command": "vi_big_f", "context": [{"key": "vi_mode_normal"}] }, - { "keys": ["F"], "command": "vi_big_f", "context": [{"key": "vi_mode_visual"}] }, - - { "keys": ["/"], "command": "vi_buffer_search", "context": [{"key": "setting.command_mode"}] }, - { "keys": ["?"], "command": "vi_buffer_reverse_search", "context": [{"key": "setting.command_mode"}] }, - - { "keys": ["n"], "command": "set_motion", "args": {"motion": "vi_n"}, "context": [{"key": "setting.command_mode"}] }, - { "keys": ["N"], "command": "set_motion", "args": {"motion": "vi_big_n"}, "context": [{"key": "setting.command_mode"}] }, - - // Twofold process: First set the motion, then collect user input and run global state. - // Text objects like di". - // TODO: This naming is utterly confusing: There's a vi_i function and a ViI command. Change this. - { "keys": ["i"], "command": "vi_i", "args": {"inclusive": false}, "context": [{"key": "vi_mode_normal"}, {"key": "vi_has_action"}] }, - { "keys": ["i"], "command": "vi_i", "args": {"inclusive": false}, "context": [{"key": "vi_mode_visual"},] }, - - // Twofold process: First set the motion, then collect user input and run global state. - // Text objects like da". - // TODO: This naming is utterly confusing: There's a vi_a function and a ViA command. Change this. - { "keys": ["a"], "command": "vi_i", "args": {"inclusive": true}, "context": [{"key": "vi_mode_normal"}, {"key": "vi_has_action"}] }, - { "keys": ["a"], "command": "vi_i", "args": {"inclusive": true}, "context": [{"key": "vi_mode_visual"},] }, - - { "keys": ["r"], "command": "vi_r", "context": [{"key": "vi_mode_normal"}, {"key": "vi_mode_normal"}] }, - - { "keys": [">"], "command": "set_action", "args": {"action": "vi_lambda"}, "context": [{"key": "setting.command_mode"}] }, - { "keys": ["<"], "command": "set_action", "args": {"action": "vi_antilambda"}, "context": [{"key": "setting.command_mode"}] }, - - // This is a fake action that allows zz to be issued. - // Ordering matters: To avoid conflicts with t and possibly other key bindings with less restrictive contexts, place these after them. - { "keys": ["z"], "command": "set_action", "args": {"action": "vi_z_action"}, "context": [{"key": "setting.command_mode"}] }, - { "keys": ["enter"], "command": "set_action", "args": {"action": "vi_z_enter"}, "context": [{"key": "setting.command_mode"}, {"key": "vi_has_incomplete_action"}] }, - { "keys": ["-"], "command": "set_action", "args": {"action": "vi_z_minus"}, "context": [{"key": "setting.command_mode"}, {"key": "vi_has_incomplete_action"}] }, - { "keys": ["z"], "command": "set_action", "args": {"action": "vi_zz"}, "context": [{"key": "setting.command_mode"}, {"key": "vi_has_incomplete_action"}] }, - { "keys": ["b"], "command": "set_action", "args": {"action": "vi_z_b"}, "context": [{"key": "setting.command_mode"}, {"key": "vi_has_incomplete_action"}] }, - { "keys": ["t"], "command": "set_action", "args": {"action": "vi_z_t"}, "context": [{"key": "setting.command_mode"}, {"key": "vi_has_incomplete_action"}] }, - - { "keys": ["q"], "command": "vi_q", "context": [{"key": "setting.command_mode"}] }, - { "keys": ["q"], "command": "_vi_q", "context": [{"key": "vi_is_recording_macro"}] }, - - { "keys": ["@"], "command": "vi_at", "context": [{"key": "vi_mode_normal"}] }, - - // Pane management - { "keys": ["ctrl+w"], "command": "set_action", "args": {"action": "vi_ctrl_w_action"}, "context": [{"key": "setting.command_mode"}]}, - { "keys": ["ctrl+v"], "command": "set_action", "args": {"action": "vi_ctrl_w_v"}, "context": [{"key": "setting.command_mode"}, {"key": "vi_has_incomplete_action"}]}, - // FIXME: This one interferes with g,v, so disable this one for now. We need a notion of "keybinding namespace". - // { "keys": ["v"], "command": "set_action", "args": {"action": "vi_ctrl_w_v"}, "context": [{"key": "setting.command_mode"}, {"key": "vi_has_incomplete_action"}]}, - - // TODO: Simplify the logic needed to make the expression register work in INSERTMODE. - { "keys": ["ctrl+r"], "command": "set_action", "args": {"action": "vi_ctrl_r_action"}, "context": [{"key": "vi_use_ctrl_keys"}, {"key": "setting.command_mode", "operator": "equal", "operand": false}]}, - { "keys": ["="], "command": "set_action", "args": {"action": "vi_ctrl_r_equals"}, "context": [{"key": "setting.command_mode"}, {"key": "vi_has_incomplete_action"}]}, - - { "keys": ["ctrl+a"], "command": "set_action", "args": {"action": "vi_ctrl_a"}, "context": [{"key": "vi_use_ctrl_keys"}, {"key": "setting.command_mode"}]}, - { "keys": ["ctrl+x"], "command": "set_action", "args": {"action": "vi_ctrl_x"}, "context": [{"key": "vi_use_ctrl_keys"}, {"key": "setting.command_mode"}]}, - - - // Collects user input for commands such as t, f, T, F. - // XXX: Seems to need to come after every other key binding so it will catch every character. Investigate this. - { "keys": [""], "command": "collect_user_input", "context": [{"key": "setting.command_mode", "key": "vi_state_expecting_user_input"}] }, -] diff --git a/backend/testdata/Vintage/Vintageous.sublime-settings b/backend/testdata/Vintage/Vintageous.sublime-settings deleted file mode 100644 index 08e809e..0000000 --- a/backend/testdata/Vintage/Vintageous.sublime-settings +++ /dev/null @@ -1,8 +0,0 @@ -{ - // If true, debug information will be printed to the console. - "vintageous_verbose": false, - - // If true, some key bindings prefaced by the CTRL modifier will override default Sublime Text - // key bindings. - "vintageous_use_ctrl_keys": false -} \ No newline at end of file diff --git a/backend/testdata/Vintage/action_cmds.py b/backend/testdata/Vintage/action_cmds.py deleted file mode 100644 index 38f52a4..0000000 --- a/backend/testdata/Vintage/action_cmds.py +++ /dev/null @@ -1,803 +0,0 @@ -import sublime -import sublime_plugin - -from Vintageous.state import IrreversibleTextCommand -from Vintageous.state import VintageState -from Vintageous.vi import utils -from Vintageous.vi.constants import _MODE_INTERNAL_NORMAL -from Vintageous.vi.constants import MODE_INSERT -from Vintageous.vi.constants import MODE_NORMAL -from Vintageous.vi.constants import MODE_VISUAL -from Vintageous.vi.constants import MODE_VISUAL_LINE -from Vintageous.vi.constants import regions_transformer -from Vintageous.vi.registers import REG_EXPRESSION - - -class ViEditAtEol(sublime_plugin.TextCommand): - def run(self, edit, extend=False): - state = VintageState(self.view) - state.enter_insert_mode() - - self.view.run_command('collapse_to_direction') - - sels = list(self.view.sel()) - self.view.sel().clear() - - new_sels = [] - for s in sels: - hard_eol = self.view.line(s.b).end() - new_sels.append(sublime.Region(hard_eol, hard_eol)) - - for s in new_sels: - self.view.sel().add(s) - - -class ViEditAfterCaret(sublime_plugin.TextCommand): - def run(self, edit, extend=False): - state = VintageState(self.view) - state.enter_insert_mode() - - visual = self.view.has_non_empty_selection_region() - - sels = list(self.view.sel()) - self.view.sel().clear() - - new_sels = [] - for s in sels: - if visual: - new_sels.append(sublime.Region(s.end(), s.end())) - else: - if not utils.is_at_eol(self.view, s): - new_sels.append(sublime.Region(s.end() + 1, s.end() + 1)) - else: - new_sels.append(sublime.Region(s.end(), s.end())) - - for s in new_sels: - self.view.sel().add(s) - - -class _vi_big_i(sublime_plugin.TextCommand): - def run(self, edit, extend=False): - def f(view, s): - line = view.line(s.b) - pt = utils.next_non_white_space_char(view, line.a) - return sublime.Region(pt, pt) - - state = VintageState(self.view) - state.enter_insert_mode() - - regions_transformer(self.view, f) - - -class ViPaste(sublime_plugin.TextCommand): - def run(self, edit, register=None, count=1): - state = VintageState(self.view) - - if register: - fragments = state.registers[register] - else: - # TODO: There should be a simpler way of getting the unnamed register's content. - fragments = state.registers['"'] - if not fragments: - print("Vintageous: Nothing in register \".") - # XXX: This won't ever be printed because it will be overwritten by other status - # messages printed right after this one. - sublime.status_message("Vintageous: Nothing in register \".") - return - - sels = list(self.view.sel()) - - if len(sels) == len(fragments): - sel_frag = zip(sels, fragments) - else: - sel_frag = zip(sels, [fragments[0],] * len(sels)) - - offset = 0 - for s, text in sel_frag: - text = self.prepare_fragment(text) - if text.startswith('\n'): - if utils.is_at_eol(self.view, s) or utils.is_at_bol(self.view, s): - self.paste_all(edit, s, self.view.line(s.b).b, text, count) - else: - self.paste_all(edit, s, self.view.line(s.b - 1).b, text, count) - else: - # XXX: Refactor this whole class. It's getting out of hand. - if self.view.substr(s.b) == '\n': - self.paste_all(edit, s, s.b + offset, text, count) - else: - self.paste_all(edit, s, s.b + offset + 1, text, count) - offset += len(text) * count - - def prepare_fragment(self, text): - if text.endswith('\n') and text != '\n': - text = '\n' + text[0:-1] - return text - - # TODO: Improve this signature. - def paste_all(self, edit, sel, at, text, count): - state = VintageState(self.view) - if state.mode not in (MODE_VISUAL, MODE_VISUAL_LINE): - # TODO: generate string first, then insert? - # Make sure we can paste at EOF. - at = at if at <= self.view.size() else self.view.size() - for x in range(count): - self.view.insert(edit, at, text) - else: - if text.startswith('\n'): - text = text * count - if not text.endswith('\n'): - text = text + '\n' - else: - text = text * count - - if state.mode == MODE_VISUAL_LINE: - if text.startswith('\n'): - text = text[1:] - - self.view.replace(edit, sel, text) - - -class ViPasteBefore(sublime_plugin.TextCommand): - def run(self, edit, register=None, count=1): - state = VintageState(self.view) - - if register: - fragments = state.registers[register] - else: - # TODO: There should be a simpler way of getting the unnamed register's content. - fragments = state.registers['"'] - - sels = list(self.view.sel()) - - if len(sels) == len(fragments): - sel_frag = zip(sels, fragments) - else: - sel_frag = zip(sels, [fragments[0],] * len(sels)) - - offset = 0 - for s, text in sel_frag: - if text.endswith('\n'): - if utils.is_at_eol(self.view, s) or utils.is_at_bol(self.view, s): - self.paste_all(edit, s, self.view.line(s.b).a, text, count) - else: - self.paste_all(edit, s, self.view.line(s.b - 1).a, text, count) - else: - self.paste_all(edit, s, s.b + offset, text, count) - offset += len(text) * count - - def paste_all(self, edit, sel, at, text, count): - # for x in range(count): - # self.view.insert(edit, at, text) - state = VintageState(self.view) - if state.mode not in (MODE_VISUAL, MODE_VISUAL_LINE): - for x in range(count): - self.view.insert(edit, at, text) - else: - if text.endswith('\n'): - text = text * count - if not text.startswith('\n'): - text = '\n' + text - else: - text = text * count - self.view.replace(edit, sel, text) - - -class ViEnterNormalMode(sublime_plugin.TextCommand): - def run(self, edit): - state = VintageState(self.view) - - if state.mode == MODE_VISUAL: - state.store_visual_selections() - - self.view.run_command('collapse_to_direction') - self.view.run_command('dont_stay_on_eol_backward') - state.enter_normal_mode() - - -class ViEnterNormalModeFromInsertMode(sublime_plugin.TextCommand): - def run(self, edit): - sels = list(self.view.sel()) - self.view.sel().clear() - - new_sels = [] - for s in sels: - if s.a <= s.b: - if (self.view.line(s.a).a != s.a): - new_sels.append(sublime.Region(s.a - 1, s.a - 1)) - else: - new_sels.append(sublime.Region(s.a, s.a)) - else: - new_sels.append(s) - - for s in new_sels: - self.view.sel().add(s) - - state = VintageState(self.view) - state.enter_normal_mode() - self.view.window().run_command('hide_auto_complete') - - -class ViEnterInsertMode(sublime_plugin.TextCommand): - def run(self, edit): - state = VintageState(self.view) - state.enter_insert_mode() - self.view.run_command('collapse_to_direction') - - -class ViEnterVisualMode(sublime_plugin.TextCommand): - def run(self, edit): - state = VintageState(self.view) - state.enter_visual_mode() - self.view.run_command('extend_to_minimal_width') - - -class ViEnterVisualLineMode(sublime_plugin.TextCommand): - def run(self, edit): - state = VintageState(self.view) - state.enter_visual_line_mode() - - -class ViEnterReplaceMode(sublime_plugin.TextCommand): - def run(self, edit): - state = VintageState(self.view) - state.enter_replace_mode() - self.view.run_command('collapse_to_direction') - state.reset() - - -class SetAction(IrreversibleTextCommand): - def __init__(self, view): - IrreversibleTextCommand.__init__(self, view) - - def run(self, action): - state = VintageState(self.view) - state.action = action - state.eval() - - -class SetMotion(IrreversibleTextCommand): - def __init__(self, view): - IrreversibleTextCommand.__init__(self, view) - - def run(self, motion): - state = VintageState(self.view) - state.motion = motion - state.eval() - - -class ViPushDigit(sublime_plugin.TextCommand): - def run(self, edit, digit): - state = VintageState(self.view) - if not (state.action or state.motion): - state.push_motion_digit(digit) - elif state.action: - state.push_action_digit(digit) - - -class ViReverseCaret(sublime_plugin.TextCommand): - def run(self, edit): - sels = list(self.view.sel()) - self.view.sel().clear() - - new_sels = [] - for s in sels: - new_sels.append(sublime.Region(s.b, s.a)) - - for s in new_sels: - self.view.sel().add(s) - - -class ViEnterNormalInsertMode(sublime_plugin.TextCommand): - def run(self, edit): - state = VintageState(self.view) - state.enter_normal_insert_mode() - - # FIXME: We can't repeat 5ifoo - self.view.run_command('mark_undo_groups_for_gluing') - # ...User types text... - - -class ViRunNormalInsertModeActions(sublime_plugin.TextCommand): - def run(self, edit): - state = VintageState(self.view) - # We've recorded what the user has typed into the buffer. Turn macro recording off. - self.view.run_command('glue_marked_undo_groups') - - # FIXME: We can't repeat 5ifoo after we're done. - for i in range(state.count - 1): - self.view.run_command('repeat') - - # Ensure the count will be deleted. - state.mode = MODE_NORMAL - # Delete the count now. - state.reset() - - self.view.run_command('vi_enter_normal_mode_from_insert_mode') - - -class SetRegister(sublime_plugin.TextCommand): - def run(self, edit, character=None): - state = VintageState(self.view) - if character is None: - state.expecting_register = True - else: - if character not in (REG_EXPRESSION,): - state.register = character - state.expecting_register = False - else: - self.view.run_command('vi_expression_register') - - -class ViExpressionRegister(sublime_plugin.TextCommand): - def run(self, edit, insert=False, next_mode=None): - def on_done(s): - state = VintageState(self.view) - try: - rv = [str(eval(s, None, None)),] - if not insert: - # TODO: We need to sort out the values received and sent to registers. When pasting, - # we assume a list... This should be encapsulated in Registers. - state.registers[REG_EXPRESSION] = rv - else: - self.view.run_command('insert_snippet', {'contents': str(rv[0])}) - state.reset() - except: - sublime.status_message("Vintageous: Invalid expression.") - on_cancel() - - def on_cancel(): - state = VintageState(self.view) - state.reset() - - self.view.window().show_input_panel('', '', on_done, None, on_cancel) - - -class ViR(sublime_plugin.TextCommand): - def run(self, edit, character=None): - state = VintageState(self.view) - if character is None: - state.action = 'vi_r' - state.expecting_user_input = True - else: - state.user_input = character - state.expecting_user_input= False - state.eval() - - -class ViM(sublime_plugin.TextCommand): - def run(self, edit, character=None): - state = VintageState(self.view) - state.action = 'vi_m' - state.expecting_user_input = True - - -class _vi_m(sublime_plugin.TextCommand): - def run(self, edit, character=None): - state = VintageState(self.view) - state.marks.add(character, self.view) - - -class ViQuote(sublime_plugin.TextCommand): - def run(self, edit, character=None): - state = VintageState(self.view) - state.motion = 'vi_quote' - state.expecting_user_input = True - - -class _vi_quote(sublime_plugin.TextCommand): - def run(self, edit, mode=None, character=None, extend=False): - def f(view, s): - if mode == MODE_VISUAL: - if s.a <= s.b: - if address.b < s.b: - return sublime.Region(s.a + 1, address.b) - else: - return sublime.Region(s.a, address.b) - else: - return sublime.Region(s.a + 1, address.b) - elif mode == MODE_NORMAL: - return address - elif mode == _MODE_INTERNAL_NORMAL: - return sublime.Region(s.a, address.b) - - return s - - state = VintageState(self.view) - address = state.marks.get_as_encoded_address(character) - - if address is None: - return - - if isinstance(address, str): - if not address.startswith(' - self.view.run_command(address.split(' ')[1][:-1]) - return - - # This is a motion in a composite command. - regions_transformer(self.view, f) - - -class ViF(sublime_plugin.TextCommand): - def run(self, edit, character=None): - state = VintageState(self.view) - if character is None: - state.motion = 'vi_f' - state.expecting_user_input = True - else: - # FIXME: Dead code? - state.user_input = character - state.expecting_user_input= False - state.eval() - - -class ViT(IrreversibleTextCommand): - def __init__(self, view): - IrreversibleTextCommand.__init__(self, view) - - # XXX: Compare to ViBigF. - def run(self, character=None): - state = VintageState(self.view) - if character is None: - state.motion = 'vi_t' - state.expecting_user_input = True - else: - state.user_input = character - state.expecting_user_input= False - state.eval() - - -class ViBigT(IrreversibleTextCommand): - def __init__(self, view): - IrreversibleTextCommand.__init__(self, view) - - # XXX: Compare to ViBigF. - def run(self, character=None): - state = VintageState(self.view) - if character is None: - state.motion = 'vi_big_t' - state.expecting_user_input = True - else: - state.user_input = character - state.expecting_user_input= False - state.eval() - - -class ViBigF(IrreversibleTextCommand): - def __init__(self, view): - IrreversibleTextCommand.__init__(self, view) - - def run(self): - state = VintageState(self.view) - state.motion = 'vi_big_f' - state.expecting_user_input = True - - -class ViI(IrreversibleTextCommand): - def __init__(self, view): - IrreversibleTextCommand.__init__(self, view) - - def run(self, inclusive=False): - state = VintageState(self.view) - if inclusive: - state.motion = 'vi_inclusive_text_object' - else: - state.motion = 'vi_exclusive_text_object' - state.expecting_user_input = True - - -class CollectUserInput(IrreversibleTextCommand): - def __init__(self, view): - IrreversibleTextCommand.__init__(self, view) - - def run(self, character=None): - state = VintageState(self.view) - state.user_input = character - state.expecting_user_input= False - state.eval() - - -class _vi_z_enter(IrreversibleTextCommand): - def __init__(self, view): - IrreversibleTextCommand.__init__(self, view) - - def run(self): - first_sel = self.view.sel()[0] - current_row = self.view.rowcol(first_sel.b)[0] - 1 - - topmost_visible_row, _ = self.view.rowcol(self.view.visible_region().a) - - self.view.run_command('scroll_lines', {'amount': (topmost_visible_row - current_row)}) - - -class _vi_z_minus(IrreversibleTextCommand): - def __init__(self, view): - IrreversibleTextCommand.__init__(self, view) - - def run(self): - first_sel = self.view.sel()[0] - current_row = self.view.rowcol(first_sel.b)[0] - - bottommost_visible_row, _ = self.view.rowcol(self.view.visible_region().b) - - number_of_lines = (bottommost_visible_row - current_row) - 1 - - if number_of_lines > 1: - self.view.run_command('scroll_lines', {'amount': number_of_lines}) - - -class _vi_zz(IrreversibleTextCommand): - def __init__(self, view): - IrreversibleTextCommand.__init__(self, view) - - def run(self): - first_sel = self.view.sel()[0] - current_row = self.view.rowcol(first_sel.b)[0] - - topmost_visible_row, _ = self.view.rowcol(self.view.visible_region().a) - bottommost_visible_row, _ = self.view.rowcol(self.view.visible_region().b) - - middle_row = (topmost_visible_row + bottommost_visible_row) / 2 - - self.view.run_command('scroll_lines', {'amount': (middle_row - current_row)}) - - -class _vi_r(sublime_plugin.TextCommand): - def run(self, edit, character=None, mode=None): - if mode == _MODE_INTERNAL_NORMAL: - for s in self.view.sel(): - self.view.replace(edit, s, character * s.size()) - - -class _vi_undo(IrreversibleTextCommand): - """Once the latest vi command has been undone, we might be left with non-empty selections. - This is due to the fact that Vintageous defines selections in a separate step to the actual - command running. For example, v,e,d,u would undo the deletion operation and restore the - selection that v,e had created. - - Assuming that after an undo we're back in normal mode, we can take for granted that any leftover - selections must be destroyed. I cannot think of any situation where Vim would have to restore - selections after *u*, but it may well happen under certain circumstances I'm not aware of. - - Note 1: We are also relying on Sublime Text to restore the v or V selections existing at the - time the edit command was run. This seems to be safe, but we're blindly relying on it. - - Note 2: Vim knows the position the caret was in before creating the visual selection. In - Sublime Text we lose that information (at least it doesn't seem to be straightforward to - obtain). - """ - # !!! This is a special command that does not go through the usual processing. !!! - # !!! It must skip the undo stack. !!! - - # TODO: It must be possible store or retrieve the actual position of the caret before the - # visual selection performed by the user. - def run(self): - # We define our own transformer here because we want to handle undo as a special case. - # TODO: I don't know if it needs to be an special case in reality. - def f(view, s): - # Compensates the move issued below. - if s.a < s.b : - return sublime.Region(s.a + 1, s.a + 1) - else: - return sublime.Region(s.a, s.a) - - state = VintageState(self.view) - for i in range(state.count): - self.view.run_command('undo') - - if self.view.has_non_empty_selection_region(): - regions_transformer(self.view, f) - # !! HACK !! ///////////////////////////////////////////////////////// - # This is a hack to work around an issue in Sublime Text: - # When undoing in normal mode, Sublime Text seems to prime a move by chars - # forward that has never been requested by the user or Vintageous. - # As far as I can tell, Vintageous isn't at fault here, but it seems weird - # to think that Sublime Text is wrong. - self.view.run_command('move', {'by': 'characters', 'forward': False}) - # //////////////////////////////////////////////////////////////////// - - state.update_xpos() - # Ensure that we wipe the count, if any. - state.reset() - - -class _vi_repeat(IrreversibleTextCommand): - """Vintageous manages the repeat operation on its own to ensure that we always use the latest - modifying command, instead of being tied to the undo stack (as Sublime Text is by default). - """ - - # !!! This is a special command that does not go through the usual processing. !!! - # !!! It must skip the undo stack. !!! - - def run(self): - state = VintageState(self.view) - - try: - cmd, args, _ = state.repeat_command - except TypeError: - # Unreachable. - return - - if not cmd: - return - elif cmd == 'vi_run': - args['next_mode'] = MODE_NORMAL - args['follow_up_mode'] = 'vi_enter_normal_mode' - args['count'] = state.count * args['count'] - self.view.run_command(cmd, args) - elif cmd == 'sequence': - for i, _ in enumerate(args['commands']): - # Access this shape: {"commands":[['vi_run', {"foo": 100}],...]} - args['commands'][i][1]['next_mode'] = MODE_NORMAL - args['commands'][i][1]['follow_up_mode'] = 'vi_enter_normal_mode' - - # TODO: Implement counts properly for 'sequence' command. - for i in range(state.count): - self.view.run_command(cmd, args) - - # Ensure we wipe count data if any. - state.reset() - # XXX: Needed here? Maybe enter_... type commands should be IrreversibleCommands so we - # must/can call them whenever we need them withouth affecting the undo stack. - self.view.run_command('vi_enter_normal_mode') - - -class _vi_ctrl_w_v_action(sublime_plugin.TextCommand): - def run(self, edit): - self.view.window().run_command('new_pane', {}) - - -class Sequence(sublime_plugin.TextCommand): - """Required so that mark_undo_groups_for_gluing and friends work. - """ - def run(self, edit, commands): - for cmd, args in commands: - self.view.run_command(cmd, args) - - # XXX: Sequence is a special case in that it doesn't run through vi_run, so we need to - # ensure the next mode is correct. Maybe we can improve this by making it more similar to - # regular commands? - state = VintageState(self.view) - state.enter_normal_mode() - - -class _vi_big_j(sublime_plugin.TextCommand): - def run(self, edit, mode=None): - def f(view, s): - if mode == _MODE_INTERNAL_NORMAL: - full_current_line = view.full_line(s.b) - target = full_current_line.b - 1 - full_next_line = view.full_line(full_current_line.b) - two_lines = sublime.Region(full_current_line.a, full_next_line.b) - - # Text without \n. - first_line_text = view.substr(view.line(full_current_line.a)) - next_line_text = view.substr(full_next_line) - - if len(next_line_text) > 1: - next_line_text = next_line_text.lstrip() - - sep = '' - if first_line_text and not first_line_text.endswith(' '): - sep = ' ' - - view.replace(edit, two_lines, first_line_text + sep + next_line_text) - - if first_line_text: - return sublime.Region(target, target) - return s - else: - return s - - regions_transformer(self.view, f) - - -class _vi_ctrl_a(sublime_plugin.TextCommand): - def run(self, edit, count=1, mode=None): - def f(view, s): - if mode == _MODE_INTERNAL_NORMAL: - word = view.word(s.a) - new_digit = int(view.substr(word)) + count - view.replace(edit, word, str(new_digit)) - - return s - - if mode != _MODE_INTERNAL_NORMAL: - return - - # TODO: Deal with octal, hex notations. - # TODO: Improve detection of numbers. - # TODO: Find the next numeric word in the line if none is found under the caret. - words = [self.view.substr(self.view.word(s)) for s in self.view.sel()] - if not all([w.isdigit() for w in words]): - utils.blink() - return - - regions_transformer(self.view, f) - - -class _vi_ctrl_x(sublime_plugin.TextCommand): - def run(self, edit, count=1, mode=None): - def f(view, s): - if mode == _MODE_INTERNAL_NORMAL: - word = view.word(s.a) - new_digit = int(view.substr(word)) - count - view.replace(edit, word, str(new_digit)) - - return s - - if mode != _MODE_INTERNAL_NORMAL: - return - - # TODO: Deal with octal, hex notations. - # TODO: Improve detection of numbers. - # TODO: Find the next numeric word in the line if none is found under the caret. - words = [self.view.substr(self.view.word(s)) for s in self.view.sel()] - if not all([w.isdigit() for w in words]): - utils.blink() - return - - regions_transformer(self.view, f) - - -class _vi_g_v(IrreversibleTextCommand): - def run(self): - # Assume normal mode. - regs = (self.view.get_regions('vi_visual_selections') or - list(self.view.sel())) - - self.view.sel().clear() - for r in regs: - self.view.sel().add(r) - - -class ViQ(IrreversibleTextCommand): - def run(self): - state = VintageState(self.view) - state.action = 'vi_q' - state.expecting_user_input = True - - -class _vi_q(IrreversibleTextCommand): - def run(self, name=None): - state = VintageState(self.view) - - if name == None and not state.is_recording: - return - - if not state.is_recording: - state._latest_macro_name = name - state.is_recording = True - self.view.run_command('start_record_macro') - return - - if state.is_recording: - self.view.run_command('stop_record_macro') - state.is_recording = False - state.reset() - - # Store the macro away. - modifying_cmd = self.view.command_history(0, True) - state.latest_macro = modifying_cmd - - -class _vi_run_macro(IrreversibleTextCommand): - def run(self, name=None): - if not (name and VintageState(self.view).latest_macro): - return - - if name == '@': - # Run the macro recorded latest. - self.view.run_command('run_macro') - else: - # TODO: Implement macro registers. - self.view.run_command('run_command') - - -class ViAt(IrreversibleTextCommand): - def run(self): - state = VintageState(self.view) - state.action = 'vi_at' - state.expecting_user_input = True diff --git a/backend/testdata/Vintage/state.py b/backend/testdata/Vintage/state.py deleted file mode 100644 index f14abbb..0000000 --- a/backend/testdata/Vintage/state.py +++ /dev/null @@ -1,758 +0,0 @@ -import sublime -import sublime_plugin - -import threading - -from Vintageous.vi import actions -from Vintageous.vi import constants -from Vintageous.vi import motions -from Vintageous.vi import registers -from Vintageous.vi import utils -from Vintageous.vi.cmd_data import CmdData -from Vintageous.vi.constants import _MODE_INTERNAL_NORMAL -from Vintageous.vi.constants import ACTIONS_EXITING_TO_INSERT_MODE -from Vintageous.vi.constants import DIGRAPH_MOTION -from Vintageous.vi.constants import digraphs -from Vintageous.vi.constants import MODE_INSERT -from Vintageous.vi.constants import MODE_NORMAL -from Vintageous.vi.constants import MODE_NORMAL_INSERT -from Vintageous.vi.constants import MODE_REPLACE -from Vintageous.vi.constants import mode_to_str -from Vintageous.vi.constants import MODE_VISUAL -from Vintageous.vi.constants import MODE_VISUAL_LINE -from Vintageous.vi.contexts import KeyContext -from Vintageous.vi.marks import Marks -from Vintageous.vi.registers import Registers -from Vintageous.vi.settings import SettingsManager -from Vintageous.vi.settings import SublimeSettings -from Vintageous.vi.settings import VintageSettings - - -# Some commands gather user input through input panels. An input panel is just a view, so when it -# closes, the previous view gets activated and, consequently, Vintageous init code runs. However, -# if we're exiting from an input panel, we most likely want the global state to remain unchanged. -# This variable helps to signal this. For example, see the 'ViBufferSearch' command. -# -# XXX: Make this a class-level attribute of VintageState (had some trouble with it last time I tried). -# XXX Is there anything weird with ST and using class-level attributes from different modules? -_dont_reset_during_init = False - - -def _init_vintageous(view): - """Initialize global data. Runs at startup and every time a view gets activated. - """ - global _dont_reset_during_init - - # Abort if we didn't get a real view. - if (not getattr(view, 'settings', None) or - view.settings().get('is_widget')): - return - - if _dont_reset_during_init: - # We are probably coming from an input panel, like when using '/'. We don't want to reset - # the global state, as it main contain data needed to complete the command that's being - # built. - _dont_reset_during_init = False - return - - state = VintageState(view) - - if state.mode in (MODE_VISUAL, MODE_VISUAL_LINE): - view.run_command('enter_normal_mode') - elif state.mode in (MODE_INSERT, MODE_REPLACE): - view.run_command('vi_enter_normal_mode_from_insert_mode') - elif state.mode == MODE_NORMAL_INSERT: - view.run_command('vi_run_normal_insert_mode_actions') - else: - # XXX: When is this run? Only at startup? - state.enter_normal_mode() - - state.reset() - - -# TODO: Test me. -def plugin_loaded(): - view = sublime.active_window().active_view() - _init_vintageous(view) - - -# TODO: Test me. -def unload_handler(): - for w in sublime.windows(): - for v in w.views(): - v.settings().set('command_mode', False) - v.settings().set('inverse_caret_state', False) - v.settings().set('vintage', {}) - - -class VintageState(object): - """ Stores per-view state using View.Settings() for storage. - """ - - registers = Registers() - context = KeyContext() - marks = Marks() - macros = {} - - # Let's imitate Sublime Text's .command_history() 'null' value. - _latest_repeat_command = ('', None, 0) - - # Stores the latest recorded macro. - _latest_macro = None - _is_recording = False - - def __init__(self, view): - self.view = view - # We have two types of settings: vi-specific (settings.vi) and regular ST view settings - # (settings.view). - self.settings = SettingsManager(self.view) - - def enter_normal_mode(self): - self.settings.view['command_mode'] = True - self.settings.view['inverse_caret_state'] = True - # Xpos must be updated every time we return to normal mode, because it doesn't get - # updated while in insert mode. - self.xpos = None if not self.view.sel() else self.view.rowcol(self.view.sel()[0].b)[1] - - if self.view.overwrite_status(): - self.view.set_overwrite_status(False) - - # Clear regions outlined by buffer search commands. - self.view.erase_regions('vi_search') - - if not self.buffer_was_changed_in_visual_mode(): - # We've been in some visual mode, but we haven't modified the buffer at all. - self.view.run_command('unmark_undo_groups_for_gluing') - else: - # Either we haven't been in any visual mode or we've modified the buffer while in - # any visual mode. - self.view.run_command('glue_marked_undo_groups') - - self.mode = MODE_NORMAL - - def enter_visual_line_mode(self): - self.mode = MODE_VISUAL_LINE - - def enter_insert_mode(self): - self.settings.view['command_mode'] = False - self.settings.view['inverse_caret_state'] = False - self.mode = MODE_INSERT - - def enter_visual_mode(self): - self.mode = MODE_VISUAL - - def enter_normal_insert_mode(self): - # This is the mode we enter when we give i a count, as in 5ifoobar. - self.mode = MODE_NORMAL_INSERT - self.settings.view['command_mode'] = False - self.settings.view['inverse_caret_state'] = False - - def enter_replace_mode(self): - self.mode = MODE_REPLACE - self.settings.view['command_mode'] = False - self.settings.view['inverse_caret_state'] = False - self.view.set_overwrite_status(True) - - def store_visual_selections(self): - self.view.add_regions('vi_visual_selections', list(self.view.sel())) - - def buffer_was_changed_in_visual_mode(self): - """Returns `True` if we've changed the buffer while in visual mode. - """ - # XXX: What if we used view.is_dirty() instead? That should be simpler? - # XXX: If we can be sure that every modifying command will leave the buffer in a dirty - # state, we could go for this solution. - - # 'maybe_mark_undo_groups_for_gluing' and 'glue_marked_undo_groups' seem to add an entry - # to the undo stack regardless of whether intervening modifying-commands have been - # issued. - # - # Example: - # 1) We enter visual mode by pressing 'v'. - # 2) We exit visual mode by pressing 'v' again. - # - # Since before the first 'v' and after the second we've called the aforementioned commands, - # respectively, we'd now have a new (useless) entry in the undo stack, and the redo stack - # would be empty. This would be undesirable, so we need to find out whether marked groups - # in visual mode actually need to be glued or not and act based on that information. - - # FIXME: Design issue. This method won't work always. We have actions like yy that - # will make this method return true, while it should return False (since yy isn't a - # modifying command). However, yy signals in its own way that it's a non-modifying command. - # I don't think this redundancy will cause any bug, but we need to unify nevetheless. - - if self.mode == MODE_VISUAL: - visual_cmd = 'vi_enter_visual_mode' - elif self.mode == MODE_VISUAL_LINE: - visual_cmd = 'vi_enter_visual_line_mode' - else: - return True - - cmds = [] - # Set an upper limit to look-ups in the undo stack. - for i in range(0, -249, -1): - cmd_name, args, _ = self.view.command_history(i) - if (cmd_name == 'vi_run' and args['action'] and - args['action']['command'] == visual_cmd): - break - - # Sublime Text returns ('', None, 0) when we hit the undo stack's bottom. - if not cmd_name: - break - - cmds.append((cmd_name, args)) - - # If we have an action between v..v calls (or visual line), we have modified the buffer - # (most of the time, anyway, there are exceptions that we're not covering here). - # TODO: Cover exceptions too, like yy (non-modifying command, though has the shape of a - # modifying command). - was_modifed = [name for (name, data) in cmds - if data and data.get('action')] - - return bool(was_modifed) - - @property - def mode(self): - """The current mode. - """ - return self.settings.vi['mode'] - - @mode.setter - def mode(self, value): - self.settings.vi['mode'] = value - - @property - def cancel_action(self): - """Returns `True` if the current action must be cancelled. - """ - # If we can't find a suitable action, we should cancel. - return self.settings.vi['cancel_action'] - - @cancel_action.setter - def cancel_action(self, value): - self.settings.vi['cancel_action'] = value - - @property - def action(self): - """Command's action; must be the name of a function in the `actions` module. - """ - return self.settings.vi['action'] - - @action.setter - def action(self, name): - action = self.settings.vi['action'] - target = 'action' - - # Check for digraphs like cc, dd, yy. - if action and name: - name, type_ = digraphs.get((action, name), ('', None)) - # Some motion digraphs are captured as actions, but need to be stored as motions - # instead so that the vi command is evaluated correctly. - if type_ == DIGRAPH_MOTION: - target = 'motion' - self.settings.vi['action'] = None - - # Avoid recursion. The .reset() method will try to set this property to None, not ''. - if name == '': - # The chord is invalid, so notify that we need to cancel the command in .eval(). - self.cancel_action = True - return - - self.settings.vi[target] = name - - @property - def motion(self): - """Command's motion; must be the name of a function in the `motions` module. - """ - return self.settings.vi['motion'] - - @motion.setter - def motion(self, name): - self.settings.vi['motion'] = name - - @property - def motion_digits(self): - """Count for the motion, like in 3k. - """ - return self.settings.vi['motion_digits'] or [] - - @motion_digits.setter - def motion_digits(self, value): - self.settings.vi['motion_digits'] = value - - def push_motion_digit(self, value): - digits = self.settings.vi['motion_digits'] - if not digits: - self.settings.vi['motion_digits'] = [value] - return - digits.append(value) - self.settings.vi['motion_digits'] = digits - - @property - def action_digits(self): - """Count for the action, as in 3dd. - """ - return self.settings.vi['action_digits'] or [] - - @action_digits.setter - def action_digits(self, value): - self.settings.vi['action_digits'] = value - - def push_action_digit(self, value): - digits = self.settings.vi['action_digits'] - if not digits: - self.settings.vi['action_digits'] = [value] - return - digits.append(value) - self.settings.vi['action_digits'] = digits - - @property - def count(self): - """Computes and returns the final count, defaulting to 1 if the user - didn't provide one. - """ - motion_count = self.motion_digits and int(''.join(self.motion_digits)) or 1 - action_count = self.action_digits and int(''.join(self.action_digits)) or 1 - - return (motion_count * action_count) - - @property - def user_provided_count(self): - """Returns the actual count provided by the user, which may be `None`. - """ - if not (self.motion_digits or self.action_digits): - return None - - return self.count - - @property - def expecting_register(self): - """Signals that we need more input from the user before evaluating the global data. - """ - return self.settings.vi['expecting_register'] - - @expecting_register.setter - def expecting_register(self, value): - self.settings.vi['expecting_register'] = value - - @property - def register(self): - """Name of the register provided by the user, as in "ayy. - """ - return self.settings.vi['register'] or None - - @register.setter - def register(self, name): - # TODO: Check for valid register name. - self.settings.vi['register'] = name - self.expecting_register = False - - @property - def expecting_user_input(self): - """Signals that we need more input from the user before evaluating the global data. - """ - return self.settings.vi['expecting_user_input'] - - @expecting_user_input.setter - def expecting_user_input(self, value): - self.settings.vi['expecting_user_input'] = value - - @property - def user_input(self): - """Additional data provided by the user, as 'a' in @a. - """ - return self.settings.vi['user_input'] or None - - @user_input.setter - def user_input(self, value): - self.settings.vi['user_input'] = value - self.expecting_user_input = False - - @property - def last_buffer_search(self): - """Returns the latest buffer search string or `None`. Used by the n and N commands. - """ - return self.settings.vi['last_buffer_search'] or None - - @last_buffer_search.setter - def last_buffer_search(self, value): - self.settings.vi['last_buffer_search'] = value - - @property - def last_character_search(self): - """Returns the latest character search or `None`. Used by the , and ; commands. - """ - return self.settings.vi['last_character_search'] or None - - @last_character_search.setter - def last_character_search(self, value): - # TODO: Should this piece of data be global instead of local to each buffer? - self.settings.vi['last_character_search'] = value - - @property - def xpos(self): - """Maintains the current column for the caret in normal and visual mode. - """ - xpos = self.settings.vi['xpos'] - return xpos if isinstance(xpos, int) else None - - @xpos.setter - def xpos(self, value): - self.settings.vi['xpos'] = value - - @property - def next_mode(self): - """Mode to transition to after the command has been run. For example, ce needs to change - to insert mode after it's run. - """ - next_mode = self.settings.vi['next_mode'] or MODE_NORMAL - return next_mode - - @next_mode.setter - def next_mode(self, value): - self.settings.vi['next_mode'] = value - - @property - def next_mode_command(self): - """Command to make the transitioning to the next mode. - """ - next_mode_command = self.settings.vi['next_mode_command'] - return next_mode_command - - @next_mode_command.setter - def next_mode_command(self, value): - self.settings.vi['next_mode_command'] = value - - @property - def repeat_command(self): - """Latest modifying command performed. Accessed via '.'. - """ - # This property is volatile. It won't be persisted between sessions. - return VintageState._latest_repeat_command - - @repeat_command.setter - def repeat_command(self, value): - VintageState._latest_repeat_command = value - - @property - def latest_macro(self): - """Latest macro recorded. Accessed via @@. - """ - return VintageState._latest_macro - - @latest_macro.setter - def latest_macro(self, value): - VintageState._latest_macro = value - - @property - def is_recording(self): - """Signals that we're recording a macro. - """ - return VintageState._is_recording - - @is_recording.setter - def is_recording(self, value): - VintageState._is_recording = value - - def parse_motion(self): - """Returns a CmdData instance with parsed motion data. - """ - vi_cmd_data = CmdData(self) - - # This should happen only at initialization. - # XXX: This is effectively zeroing xpos. Shouldn't we move this into new_vi_cmd_data()? - # XXX: REFACTOR - if vi_cmd_data['xpos'] is None: - xpos = 0 - if self.view.sel(): - xpos = self.view.rowcol(self.view.sel()[0].b) - self.xpos = xpos - vi_cmd_data['xpos'] = xpos - - # Actions originating in normal mode are run in a pseudomode that helps to distiguish - # between visual mode and this case (both use selections, either implicitly or - # explicitly). - if self.action and (self.mode == MODE_NORMAL): - vi_cmd_data['mode'] = _MODE_INTERNAL_NORMAL - - motion = self.motion - motion_func = None - if motion: - try: - motion_func = getattr(motions, self.motion) - except AttributeError: - raise AttributeError("Vintageous: Unknown motion: '{0}'".format(self.motion)) - - if motion_func: - vi_cmd_data = motion_func(vi_cmd_data) - - return vi_cmd_data - - def parse_action(self, vi_cmd_data): - """Updates and returns the passed-in CmdData instance using parsed data about the action. - """ - try: - action_func = getattr(actions, self.action) - except AttributeError: - raise AttributeError("Vintageous: Unknown action: '{0}'".format(self.action)) - except TypeError: - raise TypeError("Vintageous: parse_action requires an action be specified.") - - if action_func: - vi_cmd_data = action_func(vi_cmd_data) - - # Notify global state to go ahead with the command if there are selections and the action - # is ready to be run (which is almost always the case except for some digraphs). - # NOTE: By virtue of checking for non-empty selections instead of an explicit mode, - # the user can run actions on selections created outside of Vintageous. - # This seems to work well. - if (self.view.has_non_empty_selection_region() and - # XXX: This check is pretty useless, because we abort early in .run() anyway. - # Logically, it makes sense, however. - not vi_cmd_data['is_digraph_start']): - vi_cmd_data['motion_required'] = False - - return vi_cmd_data - - def eval_cancel_action(self): - """Cancels the whole run of the command. - """ - # TODO: add a .parse() method that includes boths steps? - vi_cmd_data = self.parse_motion() - vi_cmd_data = self.parse_action(vi_cmd_data) - if vi_cmd_data['must_blink_on_error']: - utils.blink() - # Modify the data that determines the mode we'll end up in when the command finishes. - self.next_mode = vi_cmd_data['_exit_mode'] - # Since we are exiting early, ensure we leave the selections as the commands wants them. - if vi_cmd_data['_exit_mode_command']: - self.view.run_command(vi_cmd_data['_exit_mode_command']) - - def eval_full_command(self): - """Evaluates a command like 3dj, where there is an action as well as a motion. - """ - vi_cmd_data = self.parse_motion() - vi_cmd_data = self.parse_action(vi_cmd_data) - - if not vi_cmd_data['is_digraph_start']: - # We are about to run an action, so let Sublime Text know we want all editing - # steps folded into a single sequence. "All editing steps" means slightly different - # things depending on the mode we are in. - if vi_cmd_data['_mark_groups_for_gluing']: - self.view.run_command('maybe_mark_undo_groups_for_gluing') - self.view.run_command('vi_run', vi_cmd_data) - self.reset() - else: - # If we have a digraph start, the global data is in an invalid state because we - # are still missing the complete digraph. Abort and clean up. - if vi_cmd_data['_exit_mode'] == MODE_INSERT: - # We've been requested to change to this mode. For example, we're looking at - # CTRL+r,j in INSERTMODE, which is an invalid sequence. - # !!! This could be simplified using parameters in .reset(), but then it - # wouldn't be obvious what was going on. Don't refactor. !!! - utils.blink() - self.reset() - self.enter_insert_mode() - elif self.mode != MODE_NORMAL: - # Normally we'd go back to normal mode. - self.enter_normal_mode() - self.reset() - - def eval_lone_action(self): - """Evaluate lone action like in 'd' or 'esc'. Some actions can be run without a motion. - """ - vi_cmd_data = self.parse_motion() - vi_cmd_data = self.parse_action(vi_cmd_data) - - if vi_cmd_data['is_digraph_start']: - # XXX: When does this happen? Why are we only interested in MODE_NORMAL? - # XXX In response to the above, this must be due to Ctrl+r. - if vi_cmd_data['_change_mode_to'] == MODE_NORMAL: - self.enter_normal_mode() - # We know we are not ready. - return - - if not vi_cmd_data['motion_required']: - # We are about to run an action, so let Sublime Text know we want all editing - # steps folded into a single sequence. "All editing steps" means slightly different - # things depending on the mode we are in. - if vi_cmd_data['_mark_groups_for_gluing']: - self.view.run_command('maybe_mark_undo_groups_for_gluing') - self.view.run_command('vi_run', vi_cmd_data) - self.reset() - - self.update_status() - - # TODO: Test me. - # TODO: Refactor so that .reset and update_status() are called in the separate methods. - def eval(self): - """Examines the current state and decides whether to actually run the action/motion. - """ - - if self.cancel_action: - self.eval_cancel_action() - self.reset() - - # Action + motion, like in '3dj'. - elif self.action and self.motion: - self.eval_full_command() - - # Motion only, like in '3j'. - elif self.motion: - vi_cmd_data = self.parse_motion() - self.view.run_command('vi_run', vi_cmd_data) - self.reset() - self.update_status() - - # Action only, like in 'd' or 'esc'. Some actions can be executed without a motion. - elif self.action: - self.eval_lone_action() - - def reset(self): - """Reset global state. - """ - had_action = self.action - - self.motion = None - self.action = None - - self.register = None - self.user_input = None - self.expecting_register = False - self.expecting_user_input = False - self.cancel_action = False - - # In MODE_NORMAL_INSERT, we temporarily exit NORMAL mode, but when we get back to - # it, we need to know the repeat digits, so keep them. An example command for this case - # would be 5ifoobar\n starting in NORMAL mode. - if self.mode == MODE_NORMAL_INSERT: - return - - self.motion_digits = [] - self.action_digits = [] - - if self.next_mode in (MODE_NORMAL, MODE_INSERT): - if self.next_mode_command: - self.view.run_command(self.next_mode_command) - - # Sometimes we'll reach this point after performing motions. If we have a stored repeat - # command in view A, we switch to view B and do a motion, we don't want .update_repeat_command() - # to inspect view B's undo stack and grab its latest modifying command; we want to keep - # view A's instead, which is what's stored in _latest_repeat_command. We only want to - # update this when there is a new action. - # FIXME: Even that will fail when we perform an action that does not modify the buffer, - # like splitting the window. The current view's latest modifying command will overwrite - # the genuine _latest_repeat_command. The correct solution seems to be to tag every single - # modifying command with a 'must_update_repeat_command' attribute. - if had_action: - self.update_repeat_command() - - self.next_mode = MODE_NORMAL - self.next_mode_command = None - - def update_repeat_command(self): - """Vintageous manages the repeat command on its own. Vim stores away the latest modifying - command as the repeat command, and does not wipe it when undoing. On the contrary, - Sublime Text will update the repeat command as soon as you undo past the current one. - The then previous latest modifying command becomes the new repeat command, and so on. - """ - cmd, args, times = self.view.command_history(0, True) - - if not cmd: - return - elif cmd == 'vi_run' and args.get('action'): - self.repeat_command = cmd, args, times - elif cmd == 'sequence': - # XXX: We are assuming every 'sequence' command is a modifying command, which seems - # to be reasonable, but I dunno. - self.repeat_command = cmd, args, times - elif cmd != 'vi_run': - # XXX: We are assuming every 'native' command is a modifying commmand, but it doesn't - # feel right... - self.repeat_command = cmd, args, times - - # TODO: Test me. - def update_xpos(self): - first_sel = self.view.sel()[0] - xpos = 0 - if self.mode == MODE_VISUAL: - if first_sel.a < first_sel.b: - xpos = self.view.rowcol(first_sel.b - 1)[1] - elif first_sel.a > first_sel.b: - xpos = self.view.rowcol(first_sel.b)[1] - - elif self.mode == MODE_NORMAL: - xpos = self.view.rowcol(first_sel.b)[1] - - self.xpos = xpos - - # TODO: Test me. - def update_status(self): - """Print to Sublime Text's status bar. - """ - mode_name = mode_to_str(self.mode) or "" - mode_name = "-- %s --" % mode_name if mode_name else "" - sublime.status_message(mode_name) - - -# TODO: Test me. -class VintageStateTracker(sublime_plugin.EventListener): - def on_load(self, view): - _init_vintageous(view) - - def on_post_save(self, view): - # Ensure the carets are within valid bounds. For instance, this is a concern when - # `trim_trailing_white_space_on_save` is set to true. - state = VintageState(view) - view.run_command('_vi_adjust_carets', {'mode': state.mode}) - - def on_query_context(self, view, key, operator, operand, match_all): - vintage_state = VintageState(view) - return vintage_state.context.check(key, operator, operand, match_all) - - -# TODO: Test me. -class ViFocusRestorerEvent(sublime_plugin.EventListener): - def __init__(self): - self.timer = None - - def action(self): - self.timer = None - - def on_activated(self, view): - if self.timer: - # Switching to a different view; enter normal mode. - self.timer.cancel() - _init_vintageous(view) - else: - # Switching back from another application. Ignore. - pass - - def on_deactivated(self, view): - self.timer = threading.Timer(0.25, self.action) - self.timer.start() - - -# TODO: Test me. -class IrreversibleTextCommand(sublime_plugin.TextCommand): - """ Base class. - - The undo stack will ignore commands derived from this class. This is - useful to prevent global state management commands from shadowing - commands performing edits to the buffer, which are the important ones - to keep in the undo history. - """ - def __init__(self, view): - sublime_plugin.TextCommand.__init__(self, view) - - def run_(self, edit_token, kwargs): - if kwargs and 'event' in kwargs: - del kwargs['event'] - - if kwargs: - self.run(**kwargs) - else: - self.run() - - def run(self, **kwargs): - pass diff --git a/backend/testdata/Vintage/transformers.py b/backend/testdata/Vintage/transformers.py deleted file mode 100644 index db0dbf0..0000000 --- a/backend/testdata/Vintage/transformers.py +++ /dev/null @@ -1,67 +0,0 @@ -import sublime -import sublime_plugin - -from Vintageous.vi.constants import regions_transformer -from Vintageous.vi.utils import back_one_char -from Vintageous.vi.utils import forward_one_char -from Vintageous.vi.utils import is_at_bol -from Vintageous.vi.utils import is_at_eol -from Vintageous.vi.utils import is_at_hard_eol -from Vintageous.vi.utils import is_line_empty -from Vintageous.vi.utils import is_on_empty_line -from Vintageous.vi.utils import next_non_white_space_char - - -class ClipEndToLine(sublime_plugin.TextCommand): - def run(self, edit): - def f(view, s): - if not is_on_empty_line(self.view, s) and is_at_eol(self.view, s): - return back_one_char(s) - else: - return s - - regions_transformer(self.view, f) - - -class DontStayOnEolForward(sublime_plugin.TextCommand): - def run(self, edit, **kwargs): - def f(view, s): - if is_at_eol(self.view, s): - return forward_one_char(s) - else: - return s - - regions_transformer(self.view, f) - - -class DontStayOnEolBackward(sublime_plugin.TextCommand): - def run(self, edit, **kwargs): - def f(view, s): - if is_at_eol(self.view, s) and not self.view.line(s.b).empty(): - return back_one_char(s) - else: - return s - - regions_transformer(self.view, f) - - -class _vi_d_post_action(sublime_plugin.TextCommand): - def run(self, edit, **kwargs): - def f(view, s): - if is_at_eol(self.view, s) and not self.view.line(s.b).empty(): - s = back_one_char(s) - # s = next_non_white_space_char(self.view, s.b) - return s - - regions_transformer(self.view, f) - - -class DontOvershootLineLeft(sublime_plugin.TextCommand): - def run(self, edit, **kwargs): - def f(view, s): - if view.size() > 0 and is_at_eol(self.view, s): - return forward_one_char(s) - else: - return s - - regions_transformer(self.view, f) \ No newline at end of file diff --git a/backend/testdata/scopename.res b/backend/testdata/scopename.res deleted file mode 100644 index 8493f2f..0000000 --- a/backend/testdata/scopename.res +++ /dev/null @@ -1,2379 +0,0 @@ -0-7: source.go keyword.control.go -7-14: source.go -14-20: source.go keyword.control.go -20-21: source.go -21-22: source.go meta.parens.go -22-24: source.go -24-25: source.go string.quoted.double.go punctuation.definition.string.begin.go -25-49: source.go string.quoted.double.go -49-50: source.go string.quoted.double.go punctuation.definition.string.end.go -50-52: source.go -52-53: source.go string.quoted.double.go punctuation.definition.string.begin.go -53-56: source.go string.quoted.double.go -56-57: source.go string.quoted.double.go punctuation.definition.string.end.go -57-59: source.go -59-60: source.go string.quoted.double.go punctuation.definition.string.begin.go -60-69: source.go string.quoted.double.go -69-70: source.go string.quoted.double.go punctuation.definition.string.end.go -70-72: source.go -72-73: source.go string.quoted.double.go punctuation.definition.string.begin.go -73-102: source.go string.quoted.double.go -102-103: source.go string.quoted.double.go punctuation.definition.string.end.go -103-105: source.go -105-106: source.go string.quoted.double.go punctuation.definition.string.begin.go -106-118: source.go string.quoted.double.go -118-119: source.go string.quoted.double.go punctuation.definition.string.end.go -119-121: source.go -121-122: source.go string.quoted.double.go punctuation.definition.string.begin.go -122-142: source.go string.quoted.double.go -142-143: source.go string.quoted.double.go punctuation.definition.string.end.go -143-145: source.go -145-146: source.go string.quoted.double.go punctuation.definition.string.begin.go -146-169: source.go string.quoted.double.go -169-170: source.go string.quoted.double.go punctuation.definition.string.end.go -170-172: source.go -172-173: source.go string.quoted.double.go punctuation.definition.string.begin.go -173-193: source.go string.quoted.double.go -193-194: source.go string.quoted.double.go punctuation.definition.string.end.go -194-196: source.go -196-197: source.go string.quoted.double.go punctuation.definition.string.begin.go -197-218: source.go string.quoted.double.go -218-219: source.go string.quoted.double.go punctuation.definition.string.end.go -219-221: source.go -221-222: source.go string.quoted.double.go punctuation.definition.string.begin.go -222-229: source.go string.quoted.double.go -229-230: source.go string.quoted.double.go punctuation.definition.string.end.go -230-232: source.go -232-233: source.go string.quoted.double.go punctuation.definition.string.begin.go -233-237: source.go string.quoted.double.go -237-238: source.go string.quoted.double.go punctuation.definition.string.end.go -238-242: source.go -242-245: source.go keyword.control.go -245-246: source.go -246-247: source.go meta.parens.go -247-255: source.go -255-258: source.go storage.modifier.go -258-267: source.go -267-270: source.go variable.other.dot-access.go -270-279: source.go -279-287: source.go variable.other.dot-access.go -287-288: source.go meta.block.go punctuation.section.block.begin.go -288-299: source.go meta.block.go -299-307: source.go meta.block.go variable.other.dot-access.go -307-322: source.go meta.block.go -322-330: source.go meta.block.go variable.other.dot-access.go -330-331: source.go meta.block.go meta.block.go punctuation.section.function-block.begin.go -331-337: source.go meta.block.go meta.block.go -337-341: source.go meta.block.go meta.block.go constant.language.go -341-348: source.go meta.block.go meta.block.go -348-349: source.go meta.block.go meta.block.go string.quoted.single.go punctuation.definition.string.begin.go -349-350: source.go meta.block.go meta.block.go string.quoted.single.go -350-351: source.go meta.block.go meta.block.go string.quoted.single.go punctuation.definition.string.end.go -351-352: source.go meta.block.go meta.block.go punctuation.section.function-block.end.go -352-364: source.go meta.block.go -364-372: source.go meta.block.go variable.other.dot-access.go -372-387: source.go meta.block.go -387-395: source.go meta.block.go variable.other.dot-access.go -395-396: source.go meta.block.go meta.block.go punctuation.section.function-block.begin.go -396-402: source.go meta.block.go meta.block.go -402-406: source.go meta.block.go meta.block.go constant.language.go -406-413: source.go meta.block.go meta.block.go -413-414: source.go meta.block.go meta.block.go string.quoted.single.go punctuation.definition.string.begin.go -414-415: source.go meta.block.go meta.block.go string.quoted.single.go -415-416: source.go meta.block.go meta.block.go string.quoted.single.go punctuation.definition.string.end.go -416-417: source.go meta.block.go meta.block.go punctuation.section.function-block.end.go -417-429: source.go meta.block.go -429-437: source.go meta.block.go variable.other.dot-access.go -437-452: source.go meta.block.go -452-460: source.go meta.block.go variable.other.dot-access.go -460-461: source.go meta.block.go meta.block.go punctuation.section.function-block.begin.go -461-467: source.go meta.block.go meta.block.go -467-471: source.go meta.block.go meta.block.go constant.language.go -471-478: source.go meta.block.go meta.block.go -478-479: source.go meta.block.go meta.block.go string.quoted.single.go punctuation.definition.string.begin.go -479-480: source.go meta.block.go meta.block.go string.quoted.single.go -480-481: source.go meta.block.go meta.block.go string.quoted.single.go punctuation.definition.string.end.go -481-482: source.go meta.block.go meta.block.go punctuation.section.function-block.end.go -482-494: source.go meta.block.go -494-502: source.go meta.block.go variable.other.dot-access.go -502-517: source.go meta.block.go -517-525: source.go meta.block.go variable.other.dot-access.go -525-526: source.go meta.block.go meta.block.go punctuation.section.function-block.begin.go -526-532: source.go meta.block.go meta.block.go -532-536: source.go meta.block.go meta.block.go constant.language.go -536-543: source.go meta.block.go meta.block.go -543-544: source.go meta.block.go meta.block.go string.quoted.single.go punctuation.definition.string.begin.go -544-545: source.go meta.block.go meta.block.go string.quoted.single.go -545-546: source.go meta.block.go meta.block.go string.quoted.single.go punctuation.definition.string.end.go -546-547: source.go meta.block.go meta.block.go punctuation.section.function-block.end.go -547-559: source.go meta.block.go -559-567: source.go meta.block.go variable.other.dot-access.go -567-582: source.go meta.block.go -582-590: source.go meta.block.go variable.other.dot-access.go -590-591: source.go meta.block.go meta.block.go punctuation.section.function-block.begin.go -591-597: source.go meta.block.go meta.block.go -597-601: source.go meta.block.go meta.block.go constant.language.go -601-608: source.go meta.block.go meta.block.go -608-609: source.go meta.block.go meta.block.go string.quoted.single.go punctuation.definition.string.begin.go -609-610: source.go meta.block.go meta.block.go string.quoted.single.go -610-611: source.go meta.block.go meta.block.go string.quoted.single.go punctuation.definition.string.end.go -611-612: source.go meta.block.go meta.block.go punctuation.section.function-block.end.go -612-624: source.go meta.block.go -624-632: source.go meta.block.go variable.other.dot-access.go -632-647: source.go meta.block.go -647-655: source.go meta.block.go variable.other.dot-access.go -655-656: source.go meta.block.go meta.block.go punctuation.section.function-block.begin.go -656-662: source.go meta.block.go meta.block.go -662-666: source.go meta.block.go meta.block.go constant.language.go -666-673: source.go meta.block.go meta.block.go -673-674: source.go meta.block.go meta.block.go string.quoted.single.go punctuation.definition.string.begin.go -674-675: source.go meta.block.go meta.block.go string.quoted.single.go -675-676: source.go meta.block.go meta.block.go string.quoted.single.go punctuation.definition.string.end.go -676-677: source.go meta.block.go meta.block.go punctuation.section.function-block.end.go -677-689: source.go meta.block.go -689-697: source.go meta.block.go variable.other.dot-access.go -697-712: source.go meta.block.go -712-720: source.go meta.block.go variable.other.dot-access.go -720-721: source.go meta.block.go meta.block.go punctuation.section.function-block.begin.go -721-727: source.go meta.block.go meta.block.go -727-731: source.go meta.block.go meta.block.go constant.language.go -731-738: source.go meta.block.go meta.block.go -738-739: source.go meta.block.go meta.block.go string.quoted.single.go punctuation.definition.string.begin.go -739-740: source.go meta.block.go meta.block.go string.quoted.single.go -740-741: source.go meta.block.go meta.block.go string.quoted.single.go punctuation.definition.string.end.go -741-742: source.go meta.block.go meta.block.go punctuation.section.function-block.end.go -742-754: source.go meta.block.go -754-762: source.go meta.block.go variable.other.dot-access.go -762-777: source.go meta.block.go -777-785: source.go meta.block.go variable.other.dot-access.go -785-786: source.go meta.block.go meta.block.go punctuation.section.function-block.begin.go -786-792: source.go meta.block.go meta.block.go -792-796: source.go meta.block.go meta.block.go constant.language.go -796-803: source.go meta.block.go meta.block.go -803-804: source.go meta.block.go meta.block.go string.quoted.single.go punctuation.definition.string.begin.go -804-805: source.go meta.block.go meta.block.go string.quoted.single.go -805-806: source.go meta.block.go meta.block.go string.quoted.single.go punctuation.definition.string.end.go -806-807: source.go meta.block.go meta.block.go punctuation.section.function-block.end.go -807-819: source.go meta.block.go -819-827: source.go meta.block.go variable.other.dot-access.go -827-842: source.go meta.block.go -842-850: source.go meta.block.go variable.other.dot-access.go -850-851: source.go meta.block.go meta.block.go punctuation.section.function-block.begin.go -851-857: source.go meta.block.go meta.block.go -857-861: source.go meta.block.go meta.block.go constant.language.go -861-868: source.go meta.block.go meta.block.go -868-869: source.go meta.block.go meta.block.go string.quoted.single.go punctuation.definition.string.begin.go -869-870: source.go meta.block.go meta.block.go string.quoted.single.go -870-871: source.go meta.block.go meta.block.go string.quoted.single.go punctuation.definition.string.end.go -871-872: source.go meta.block.go meta.block.go punctuation.section.function-block.end.go -872-884: source.go meta.block.go -884-892: source.go meta.block.go variable.other.dot-access.go -892-907: source.go meta.block.go -907-915: source.go meta.block.go variable.other.dot-access.go -915-916: source.go meta.block.go meta.block.go punctuation.section.function-block.begin.go -916-922: source.go meta.block.go meta.block.go -922-926: source.go meta.block.go meta.block.go constant.language.go -926-933: source.go meta.block.go meta.block.go -933-934: source.go meta.block.go meta.block.go string.quoted.single.go punctuation.definition.string.begin.go -934-935: source.go meta.block.go meta.block.go string.quoted.single.go -935-936: source.go meta.block.go meta.block.go string.quoted.single.go punctuation.definition.string.end.go -936-937: source.go meta.block.go meta.block.go punctuation.section.function-block.end.go -937-949: source.go meta.block.go -949-957: source.go meta.block.go variable.other.dot-access.go -957-972: source.go meta.block.go -972-980: source.go meta.block.go variable.other.dot-access.go -980-981: source.go meta.block.go meta.block.go punctuation.section.function-block.begin.go -981-987: source.go meta.block.go meta.block.go -987-991: source.go meta.block.go meta.block.go constant.language.go -991-998: source.go meta.block.go meta.block.go -998-999: source.go meta.block.go meta.block.go string.quoted.single.go punctuation.definition.string.begin.go -999-1000: source.go meta.block.go meta.block.go string.quoted.single.go -1000-1001: source.go meta.block.go meta.block.go string.quoted.single.go punctuation.definition.string.end.go -1001-1002: source.go meta.block.go meta.block.go punctuation.section.function-block.end.go -1002-1014: source.go meta.block.go -1014-1022: source.go meta.block.go variable.other.dot-access.go -1022-1037: source.go meta.block.go -1037-1045: source.go meta.block.go variable.other.dot-access.go -1045-1046: source.go meta.block.go meta.block.go punctuation.section.function-block.begin.go -1046-1052: source.go meta.block.go meta.block.go -1052-1056: source.go meta.block.go meta.block.go constant.language.go -1056-1063: source.go meta.block.go meta.block.go -1063-1064: source.go meta.block.go meta.block.go string.quoted.single.go punctuation.definition.string.begin.go -1064-1065: source.go meta.block.go meta.block.go string.quoted.single.go -1065-1066: source.go meta.block.go meta.block.go string.quoted.single.go punctuation.definition.string.end.go -1066-1067: source.go meta.block.go meta.block.go punctuation.section.function-block.end.go -1067-1079: source.go meta.block.go -1079-1087: source.go meta.block.go variable.other.dot-access.go -1087-1102: source.go meta.block.go -1102-1110: source.go meta.block.go variable.other.dot-access.go -1110-1111: source.go meta.block.go meta.block.go punctuation.section.function-block.begin.go -1111-1117: source.go meta.block.go meta.block.go -1117-1121: source.go meta.block.go meta.block.go constant.language.go -1121-1128: source.go meta.block.go meta.block.go -1128-1129: source.go meta.block.go meta.block.go string.quoted.single.go punctuation.definition.string.begin.go -1129-1130: source.go meta.block.go meta.block.go string.quoted.single.go -1130-1131: source.go meta.block.go meta.block.go string.quoted.single.go punctuation.definition.string.end.go -1131-1132: source.go meta.block.go meta.block.go punctuation.section.function-block.end.go -1132-1144: source.go meta.block.go -1144-1152: source.go meta.block.go variable.other.dot-access.go -1152-1167: source.go meta.block.go -1167-1175: source.go meta.block.go variable.other.dot-access.go -1175-1176: source.go meta.block.go meta.block.go punctuation.section.function-block.begin.go -1176-1182: source.go meta.block.go meta.block.go -1182-1186: source.go meta.block.go meta.block.go constant.language.go -1186-1193: source.go meta.block.go meta.block.go -1193-1194: source.go meta.block.go meta.block.go string.quoted.single.go punctuation.definition.string.begin.go -1194-1195: source.go meta.block.go meta.block.go string.quoted.single.go -1195-1196: source.go meta.block.go meta.block.go string.quoted.single.go punctuation.definition.string.end.go -1196-1197: source.go meta.block.go meta.block.go punctuation.section.function-block.end.go -1197-1209: source.go meta.block.go -1209-1217: source.go meta.block.go variable.other.dot-access.go -1217-1232: source.go meta.block.go -1232-1240: source.go meta.block.go variable.other.dot-access.go -1240-1241: source.go meta.block.go meta.block.go punctuation.section.function-block.begin.go -1241-1247: source.go meta.block.go meta.block.go -1247-1251: source.go meta.block.go meta.block.go constant.language.go -1251-1258: source.go meta.block.go meta.block.go -1258-1259: source.go meta.block.go meta.block.go string.quoted.single.go punctuation.definition.string.begin.go -1259-1260: source.go meta.block.go meta.block.go string.quoted.single.go -1260-1261: source.go meta.block.go meta.block.go string.quoted.single.go punctuation.definition.string.end.go -1261-1262: source.go meta.block.go meta.block.go punctuation.section.function-block.end.go -1262-1274: source.go meta.block.go -1274-1282: source.go meta.block.go variable.other.dot-access.go -1282-1297: source.go meta.block.go -1297-1305: source.go meta.block.go variable.other.dot-access.go -1305-1306: source.go meta.block.go meta.block.go punctuation.section.function-block.begin.go -1306-1312: source.go meta.block.go meta.block.go -1312-1316: source.go meta.block.go meta.block.go constant.language.go -1316-1323: source.go meta.block.go meta.block.go -1323-1324: source.go meta.block.go meta.block.go string.quoted.single.go punctuation.definition.string.begin.go -1324-1325: source.go meta.block.go meta.block.go string.quoted.single.go -1325-1326: source.go meta.block.go meta.block.go string.quoted.single.go punctuation.definition.string.end.go -1326-1327: source.go meta.block.go meta.block.go punctuation.section.function-block.end.go -1327-1339: source.go meta.block.go -1339-1347: source.go meta.block.go variable.other.dot-access.go -1347-1362: source.go meta.block.go -1362-1370: source.go meta.block.go variable.other.dot-access.go -1370-1371: source.go meta.block.go meta.block.go punctuation.section.function-block.begin.go -1371-1377: source.go meta.block.go meta.block.go -1377-1381: source.go meta.block.go meta.block.go constant.language.go -1381-1388: source.go meta.block.go meta.block.go -1388-1389: source.go meta.block.go meta.block.go string.quoted.single.go punctuation.definition.string.begin.go -1389-1390: source.go meta.block.go meta.block.go string.quoted.single.go -1390-1391: source.go meta.block.go meta.block.go string.quoted.single.go punctuation.definition.string.end.go -1391-1392: source.go meta.block.go meta.block.go punctuation.section.function-block.end.go -1392-1404: source.go meta.block.go -1404-1412: source.go meta.block.go variable.other.dot-access.go -1412-1427: source.go meta.block.go -1427-1435: source.go meta.block.go variable.other.dot-access.go -1435-1436: source.go meta.block.go meta.block.go punctuation.section.function-block.begin.go -1436-1442: source.go meta.block.go meta.block.go -1442-1446: source.go meta.block.go meta.block.go constant.language.go -1446-1453: source.go meta.block.go meta.block.go -1453-1454: source.go meta.block.go meta.block.go string.quoted.single.go punctuation.definition.string.begin.go -1454-1455: source.go meta.block.go meta.block.go string.quoted.single.go -1455-1456: source.go meta.block.go meta.block.go string.quoted.single.go punctuation.definition.string.end.go -1456-1457: source.go meta.block.go meta.block.go punctuation.section.function-block.end.go -1457-1469: source.go meta.block.go -1469-1477: source.go meta.block.go variable.other.dot-access.go -1477-1492: source.go meta.block.go -1492-1500: source.go meta.block.go variable.other.dot-access.go -1500-1501: source.go meta.block.go meta.block.go punctuation.section.function-block.begin.go -1501-1507: source.go meta.block.go meta.block.go -1507-1511: source.go meta.block.go meta.block.go constant.language.go -1511-1518: source.go meta.block.go meta.block.go -1518-1519: source.go meta.block.go meta.block.go string.quoted.single.go punctuation.definition.string.begin.go -1519-1520: source.go meta.block.go meta.block.go string.quoted.single.go -1520-1521: source.go meta.block.go meta.block.go string.quoted.single.go punctuation.definition.string.end.go -1521-1522: source.go meta.block.go meta.block.go punctuation.section.function-block.end.go -1522-1534: source.go meta.block.go -1534-1542: source.go meta.block.go variable.other.dot-access.go -1542-1557: source.go meta.block.go -1557-1565: source.go meta.block.go variable.other.dot-access.go -1565-1566: source.go meta.block.go meta.block.go punctuation.section.function-block.begin.go -1566-1572: source.go meta.block.go meta.block.go -1572-1576: source.go meta.block.go meta.block.go constant.language.go -1576-1583: source.go meta.block.go meta.block.go -1583-1584: source.go meta.block.go meta.block.go string.quoted.single.go punctuation.definition.string.begin.go -1584-1585: source.go meta.block.go meta.block.go string.quoted.single.go -1585-1586: source.go meta.block.go meta.block.go string.quoted.single.go punctuation.definition.string.end.go -1586-1587: source.go meta.block.go meta.block.go punctuation.section.function-block.end.go -1587-1599: source.go meta.block.go -1599-1607: source.go meta.block.go variable.other.dot-access.go -1607-1622: source.go meta.block.go -1622-1630: source.go meta.block.go variable.other.dot-access.go -1630-1631: source.go meta.block.go meta.block.go punctuation.section.function-block.begin.go -1631-1637: source.go meta.block.go meta.block.go -1637-1641: source.go meta.block.go meta.block.go constant.language.go -1641-1648: source.go meta.block.go meta.block.go -1648-1649: source.go meta.block.go meta.block.go string.quoted.single.go punctuation.definition.string.begin.go -1649-1650: source.go meta.block.go meta.block.go string.quoted.single.go -1650-1651: source.go meta.block.go meta.block.go string.quoted.single.go punctuation.definition.string.end.go -1651-1652: source.go meta.block.go meta.block.go punctuation.section.function-block.end.go -1652-1664: source.go meta.block.go -1664-1672: source.go meta.block.go variable.other.dot-access.go -1672-1687: source.go meta.block.go -1687-1695: source.go meta.block.go variable.other.dot-access.go -1695-1696: source.go meta.block.go meta.block.go punctuation.section.function-block.begin.go -1696-1702: source.go meta.block.go meta.block.go -1702-1706: source.go meta.block.go meta.block.go constant.language.go -1706-1713: source.go meta.block.go meta.block.go -1713-1714: source.go meta.block.go meta.block.go string.quoted.single.go punctuation.definition.string.begin.go -1714-1715: source.go meta.block.go meta.block.go string.quoted.single.go -1715-1716: source.go meta.block.go meta.block.go string.quoted.single.go punctuation.definition.string.end.go -1716-1717: source.go meta.block.go meta.block.go punctuation.section.function-block.end.go -1717-1729: source.go meta.block.go -1729-1737: source.go meta.block.go variable.other.dot-access.go -1737-1752: source.go meta.block.go -1752-1760: source.go meta.block.go variable.other.dot-access.go -1760-1761: source.go meta.block.go meta.block.go punctuation.section.function-block.begin.go -1761-1767: source.go meta.block.go meta.block.go -1767-1771: source.go meta.block.go meta.block.go constant.language.go -1771-1778: source.go meta.block.go meta.block.go -1778-1779: source.go meta.block.go meta.block.go string.quoted.single.go punctuation.definition.string.begin.go -1779-1780: source.go meta.block.go meta.block.go string.quoted.single.go -1780-1781: source.go meta.block.go meta.block.go string.quoted.single.go punctuation.definition.string.end.go -1781-1782: source.go meta.block.go meta.block.go punctuation.section.function-block.end.go -1782-1794: source.go meta.block.go -1794-1802: source.go meta.block.go variable.other.dot-access.go -1802-1817: source.go meta.block.go -1817-1825: source.go meta.block.go variable.other.dot-access.go -1825-1826: source.go meta.block.go meta.block.go punctuation.section.function-block.begin.go -1826-1832: source.go meta.block.go meta.block.go -1832-1836: source.go meta.block.go meta.block.go constant.language.go -1836-1843: source.go meta.block.go meta.block.go -1843-1844: source.go meta.block.go meta.block.go string.quoted.single.go punctuation.definition.string.begin.go -1844-1845: source.go meta.block.go meta.block.go string.quoted.single.go -1845-1846: source.go meta.block.go meta.block.go string.quoted.single.go punctuation.definition.string.end.go -1846-1847: source.go meta.block.go meta.block.go punctuation.section.function-block.end.go -1847-1859: source.go meta.block.go -1859-1867: source.go meta.block.go variable.other.dot-access.go -1867-1882: source.go meta.block.go -1882-1890: source.go meta.block.go variable.other.dot-access.go -1890-1891: source.go meta.block.go meta.block.go punctuation.section.function-block.begin.go -1891-1897: source.go meta.block.go meta.block.go -1897-1901: source.go meta.block.go meta.block.go constant.language.go -1901-1908: source.go meta.block.go meta.block.go -1908-1909: source.go meta.block.go meta.block.go string.quoted.single.go punctuation.definition.string.begin.go -1909-1910: source.go meta.block.go meta.block.go string.quoted.single.go -1910-1911: source.go meta.block.go meta.block.go string.quoted.single.go punctuation.definition.string.end.go -1911-1912: source.go meta.block.go meta.block.go punctuation.section.function-block.end.go -1912-1924: source.go meta.block.go -1924-1932: source.go meta.block.go variable.other.dot-access.go -1932-1947: source.go meta.block.go -1947-1955: source.go meta.block.go variable.other.dot-access.go -1955-1956: source.go meta.block.go meta.block.go punctuation.section.function-block.begin.go -1956-1962: source.go meta.block.go meta.block.go -1962-1966: source.go meta.block.go meta.block.go constant.language.go -1966-1973: source.go meta.block.go meta.block.go -1973-1974: source.go meta.block.go meta.block.go string.quoted.single.go punctuation.definition.string.begin.go -1974-1975: source.go meta.block.go meta.block.go string.quoted.single.go -1975-1976: source.go meta.block.go meta.block.go string.quoted.single.go punctuation.definition.string.end.go -1976-1977: source.go meta.block.go meta.block.go punctuation.section.function-block.end.go -1977-1989: source.go meta.block.go -1989-1997: source.go meta.block.go variable.other.dot-access.go -1997-2012: source.go meta.block.go -2012-2020: source.go meta.block.go variable.other.dot-access.go -2020-2021: source.go meta.block.go meta.block.go punctuation.section.function-block.begin.go -2021-2027: source.go meta.block.go meta.block.go -2027-2031: source.go meta.block.go meta.block.go constant.language.go -2031-2038: source.go meta.block.go meta.block.go -2038-2039: source.go meta.block.go meta.block.go string.quoted.single.go punctuation.definition.string.begin.go -2039-2040: source.go meta.block.go meta.block.go string.quoted.single.go -2040-2041: source.go meta.block.go meta.block.go string.quoted.single.go punctuation.definition.string.end.go -2041-2042: source.go meta.block.go meta.block.go punctuation.section.function-block.end.go -2042-2054: source.go meta.block.go -2054-2062: source.go meta.block.go variable.other.dot-access.go -2062-2077: source.go meta.block.go -2077-2085: source.go meta.block.go variable.other.dot-access.go -2085-2086: source.go meta.block.go meta.block.go punctuation.section.function-block.begin.go -2086-2092: source.go meta.block.go meta.block.go -2092-2096: source.go meta.block.go meta.block.go constant.language.go -2096-2103: source.go meta.block.go meta.block.go -2103-2104: source.go meta.block.go meta.block.go string.quoted.single.go punctuation.definition.string.begin.go -2104-2105: source.go meta.block.go meta.block.go string.quoted.single.go -2105-2106: source.go meta.block.go meta.block.go string.quoted.single.go punctuation.definition.string.end.go -2106-2107: source.go meta.block.go meta.block.go punctuation.section.function-block.end.go -2107-2119: source.go meta.block.go -2119-2127: source.go meta.block.go variable.other.dot-access.go -2127-2142: source.go meta.block.go -2142-2150: source.go meta.block.go variable.other.dot-access.go -2150-2151: source.go meta.block.go meta.block.go punctuation.section.function-block.begin.go -2151-2157: source.go meta.block.go meta.block.go -2157-2161: source.go meta.block.go meta.block.go constant.language.go -2161-2168: source.go meta.block.go meta.block.go -2168-2169: source.go meta.block.go meta.block.go string.quoted.single.go punctuation.definition.string.begin.go -2169-2170: source.go meta.block.go meta.block.go string.quoted.single.go -2170-2171: source.go meta.block.go meta.block.go string.quoted.single.go punctuation.definition.string.end.go -2171-2172: source.go meta.block.go meta.block.go punctuation.section.function-block.end.go -2172-2184: source.go meta.block.go -2184-2192: source.go meta.block.go variable.other.dot-access.go -2192-2207: source.go meta.block.go -2207-2215: source.go meta.block.go variable.other.dot-access.go -2215-2216: source.go meta.block.go meta.block.go punctuation.section.function-block.begin.go -2216-2229: source.go meta.block.go meta.block.go -2229-2234: source.go meta.block.go meta.block.go variable.other.dot-access.go -2234-2235: source.go meta.block.go meta.block.go punctuation.section.function-block.end.go -2235-2247: source.go meta.block.go -2247-2255: source.go meta.block.go variable.other.dot-access.go -2255-2270: source.go meta.block.go -2270-2278: source.go meta.block.go variable.other.dot-access.go -2278-2279: source.go meta.block.go meta.block.go punctuation.section.function-block.begin.go -2279-2284: source.go meta.block.go meta.block.go -2284-2285: source.go meta.block.go meta.block.go string.quoted.single.go punctuation.definition.string.begin.go -2285-2286: source.go meta.block.go meta.block.go string.quoted.single.go -2286-2287: source.go meta.block.go meta.block.go string.quoted.single.go punctuation.definition.string.end.go -2287-2288: source.go meta.block.go meta.block.go punctuation.section.function-block.end.go -2288-2300: source.go meta.block.go -2300-2313: source.go meta.block.go variable.other.dot-access.go -2313-2323: source.go meta.block.go -2323-2331: source.go meta.block.go variable.other.dot-access.go -2331-2332: source.go meta.block.go meta.block.go punctuation.section.function-block.begin.go -2332-2345: source.go meta.block.go meta.block.go -2345-2354: source.go meta.block.go meta.block.go variable.other.dot-access.go -2354-2355: source.go meta.block.go meta.block.go punctuation.section.function-block.end.go -2355-2367: source.go meta.block.go -2367-2377: source.go meta.block.go variable.other.dot-access.go -2377-2390: source.go meta.block.go -2390-2398: source.go meta.block.go variable.other.dot-access.go -2398-2399: source.go meta.block.go meta.block.go punctuation.section.function-block.begin.go -2399-2412: source.go meta.block.go meta.block.go -2412-2414: source.go meta.block.go meta.block.go variable.other.dot-access.go -2414-2415: source.go meta.block.go meta.block.go punctuation.section.function-block.end.go -2415-2427: source.go meta.block.go -2427-2439: source.go meta.block.go variable.other.dot-access.go -2439-2450: source.go meta.block.go -2450-2458: source.go meta.block.go variable.other.dot-access.go -2458-2459: source.go meta.block.go meta.block.go punctuation.section.function-block.begin.go -2459-2472: source.go meta.block.go meta.block.go -2472-2476: source.go meta.block.go meta.block.go variable.other.dot-access.go -2476-2477: source.go meta.block.go meta.block.go punctuation.section.function-block.end.go -2477-2489: source.go meta.block.go -2489-2501: source.go meta.block.go variable.other.dot-access.go -2501-2512: source.go meta.block.go -2512-2520: source.go meta.block.go variable.other.dot-access.go -2520-2521: source.go meta.block.go meta.block.go punctuation.section.function-block.begin.go -2521-2534: source.go meta.block.go meta.block.go -2534-2538: source.go meta.block.go meta.block.go variable.other.dot-access.go -2538-2539: source.go meta.block.go meta.block.go punctuation.section.function-block.end.go -2539-2551: source.go meta.block.go -2551-2564: source.go meta.block.go variable.other.dot-access.go -2564-2574: source.go meta.block.go -2574-2582: source.go meta.block.go variable.other.dot-access.go -2582-2583: source.go meta.block.go meta.block.go punctuation.section.function-block.begin.go -2583-2596: source.go meta.block.go meta.block.go -2596-2601: source.go meta.block.go meta.block.go variable.other.dot-access.go -2601-2602: source.go meta.block.go meta.block.go punctuation.section.function-block.end.go -2602-2614: source.go meta.block.go -2614-2623: source.go meta.block.go variable.other.dot-access.go -2623-2637: source.go meta.block.go -2637-2645: source.go meta.block.go variable.other.dot-access.go -2645-2646: source.go meta.block.go meta.block.go punctuation.section.function-block.begin.go -2646-2659: source.go meta.block.go meta.block.go -2659-2665: source.go meta.block.go meta.block.go variable.other.dot-access.go -2665-2666: source.go meta.block.go meta.block.go punctuation.section.function-block.end.go -2666-2678: source.go meta.block.go -2678-2684: source.go meta.block.go variable.other.dot-access.go -2684-2701: source.go meta.block.go -2701-2709: source.go meta.block.go variable.other.dot-access.go -2709-2710: source.go meta.block.go meta.block.go punctuation.section.function-block.begin.go -2710-2723: source.go meta.block.go meta.block.go -2723-2729: source.go meta.block.go meta.block.go variable.other.dot-access.go -2729-2730: source.go meta.block.go meta.block.go punctuation.section.function-block.end.go -2730-2742: source.go meta.block.go -2742-2748: source.go meta.block.go variable.other.dot-access.go -2748-2765: source.go meta.block.go -2765-2773: source.go meta.block.go variable.other.dot-access.go -2773-2774: source.go meta.block.go meta.block.go punctuation.section.function-block.begin.go -2774-2779: source.go meta.block.go meta.block.go -2779-2780: source.go meta.block.go meta.block.go string.quoted.single.go punctuation.definition.string.begin.go -2780-2782: source.go meta.block.go meta.block.go string.quoted.single.go constant.character.escape.go -2782-2783: source.go meta.block.go meta.block.go string.quoted.single.go punctuation.definition.string.end.go -2783-2784: source.go meta.block.go meta.block.go punctuation.section.function-block.end.go -2784-2787: source.go meta.block.go -2787-2788: source.go meta.block.go punctuation.section.block.end.go -2788-2801: source.go -2801-2802: source.go meta.function-call.go punctuation.whitespace.function-call.leading.go -2802-2806: source.go meta.function-call.go support.function.any-method.go -2806-2807: source.go meta.function-call.go -2807-2810: source.go storage.modifier.go -2810-2811: source.go -2811-2817: source.go storage.type.go -2817-2819: source.go -2819-2820: source.go constant.numeric.go -2820-2829: source.go -2829-2838: source.go variable.other.dot-access.go -2838-2861: source.go -2861-2871: source.go variable.other.dot-access.go -2871-2893: source.go -2893-2903: source.go variable.other.dot-access.go -2903-2915: source.go -2915-2919: source.go storage.type.go -2919-2923: source.go -2923-2928: source.go storage.modifier.go -2928-2946: source.go -2946-2948: source.go constant.numeric.go -2948-2950: source.go -2950-2954: source.go keyword.control.go -2954-2960: source.go -2960-2966: source.go keyword.control.go -2966-2967: source.go -2967-2968: source.go meta.block.go punctuation.section.block.begin.go -2968-2985: source.go meta.block.go -2985-2988: source.go meta.block.go storage.modifier.go -2988-2998: source.go meta.block.go -2998-3002: source.go meta.block.go variable.other.dot-access.go -3002-3014: source.go meta.block.go -3014-3020: source.go meta.block.go variable.other.dot-access.go -3020-3037: source.go meta.block.go -3037-3043: source.go meta.block.go storage.type.go -3043-3069: source.go meta.block.go -3069-3075: source.go meta.block.go variable.other.dot-access.go -3075-3076: source.go meta.block.go -3076-3077: source.go meta.block.go punctuation.section.block.end.go -3077-3079: source.go -3079-3083: source.go meta.function.receiver.go meta.function.receiver.declaration.go keyword.control.go -3083-3084: source.go meta.function.receiver.go meta.function.receiver.declaration.go -3084-3085: source.go meta.function.receiver.go meta.function.receiver.declaration.go entity.name.function.go.full-name -3085-3092: source.go meta.function.receiver.go meta.function.receiver.declaration.go entity.name.function.go.full-name variable.receiver.go -3092-3094: source.go meta.function.receiver.go meta.function.receiver.declaration.go entity.name.function.go.full-name -3094-3106: source.go meta.function.receiver.go meta.function.receiver.declaration.go entity.name.function.go.full-name entity.name.function.go.name -3106-3109: source.go meta.function.receiver.go meta.function.receiver.declaration.go -3109-3125: source.go meta.function.receiver.go meta.function.receiver.declaration.go variable.return-types.go -3125-3126: source.go meta.function.receiver.go meta.block.go punctuation.section.function-block.begin.go -3126-3128: source.go meta.function.receiver.go meta.block.go -3128-3134: source.go meta.function.receiver.go meta.block.go keyword.control.go -3134-3137: source.go meta.function.receiver.go meta.block.go -3137-3150: source.go meta.function.receiver.go meta.block.go variable.other.dot-access.go -3150-3151: source.go meta.function.receiver.go meta.block.go -3151-3152: source.go meta.function.receiver.go meta.block.go punctuation.section.function-block.end.go -3152-3154: source.go -3154-3158: source.go meta.function.receiver.go meta.function.receiver.declaration.go keyword.control.go -3158-3159: source.go meta.function.receiver.go meta.function.receiver.declaration.go -3159-3160: source.go meta.function.receiver.go meta.function.receiver.declaration.go entity.name.function.go.full-name -3160-3167: source.go meta.function.receiver.go meta.function.receiver.declaration.go entity.name.function.go.full-name variable.receiver.go -3167-3169: source.go meta.function.receiver.go meta.function.receiver.declaration.go entity.name.function.go.full-name -3169-3179: source.go meta.function.receiver.go meta.function.receiver.declaration.go entity.name.function.go.full-name entity.name.function.go.name -3179-3180: source.go meta.function.receiver.go meta.function.receiver.declaration.go -3180-3197: source.go meta.function.receiver.go meta.function.receiver.declaration.go variable.parameters.go -3197-3199: source.go meta.function.receiver.go meta.function.receiver.declaration.go -3199-3213: source.go meta.function.receiver.go meta.function.receiver.declaration.go variable.return-types.go -3213-3214: source.go meta.function.receiver.go meta.block.go punctuation.section.function-block.begin.go -3214-3216: source.go meta.function.receiver.go meta.block.go -3216-3218: source.go meta.function.receiver.go meta.block.go keyword.control.go -3218-3224: source.go meta.function.receiver.go meta.block.go -3224-3227: source.go meta.function.receiver.go meta.block.go constant.language.go -3227-3228: source.go meta.function.receiver.go meta.block.go -3228-3229: source.go meta.function.receiver.go meta.block.go meta.block.go punctuation.section.function-block.begin.go -3229-3232: source.go meta.function.receiver.go meta.block.go meta.block.go -3232-3238: source.go meta.function.receiver.go meta.block.go meta.block.go keyword.control.go -3238-3239: source.go meta.function.receiver.go meta.block.go meta.block.go -3239-3242: source.go meta.function.receiver.go meta.block.go meta.block.go constant.language.go -3242-3244: source.go meta.function.receiver.go meta.block.go meta.block.go -3244-3245: source.go meta.function.receiver.go meta.block.go meta.block.go punctuation.section.function-block.end.go -3245-3247: source.go meta.function.receiver.go meta.block.go -3247-3249: source.go meta.function.receiver.go meta.block.go keyword.control.go -3249-3250: source.go meta.function.receiver.go meta.block.go -3250-3252: source.go meta.function.receiver.go meta.block.go meta.initialization.short.go variable.other.go -3252-3254: source.go meta.function.receiver.go meta.block.go meta.initialization.short.go variable.other.go keyword.operator.initialize.go -3254-3257: source.go meta.function.receiver.go meta.block.go -3257-3262: source.go meta.function.receiver.go meta.block.go meta.function-call.go support.function.any-method.go -3262-3263: source.go meta.function.receiver.go meta.block.go meta.function-call.go -3263-3265: source.go meta.function.receiver.go meta.block.go -3265-3266: source.go meta.function.receiver.go meta.block.go punctuation.whitespace.support.function.leading.go -3266-3269: source.go meta.function.receiver.go meta.block.go support.function.builtin.go -3269-3270: source.go meta.function.receiver.go meta.block.go meta.parens.go punctuation.section.parens.begin.go -3270-3271: source.go meta.function.receiver.go meta.block.go meta.parens.go -3271-3272: source.go meta.function.receiver.go meta.block.go meta.parens.go punctuation.section.parens.end.go -3272-3275: source.go meta.function.receiver.go meta.block.go -3275-3276: source.go meta.function.receiver.go meta.block.go constant.numeric.go -3276-3277: source.go meta.function.receiver.go meta.block.go -3277-3278: source.go meta.function.receiver.go meta.block.go meta.block.go punctuation.section.function-block.begin.go -3278-3281: source.go meta.function.receiver.go meta.block.go meta.block.go -3281-3287: source.go meta.function.receiver.go meta.block.go meta.block.go keyword.control.go -3287-3290: source.go meta.function.receiver.go meta.block.go meta.block.go -3290-3291: source.go meta.function.receiver.go meta.block.go meta.block.go constant.numeric.go -3291-3294: source.go meta.function.receiver.go meta.block.go meta.block.go -3294-3295: source.go meta.function.receiver.go meta.block.go meta.block.go punctuation.section.function-block.end.go -3295-3297: source.go meta.function.receiver.go meta.block.go -3297-3303: source.go meta.function.receiver.go meta.block.go keyword.control.go -3303-3304: source.go meta.function.receiver.go meta.block.go -3304-3307: source.go meta.function.receiver.go meta.block.go constant.language.go -3307-3308: source.go meta.function.receiver.go meta.block.go -3308-3309: source.go meta.function.receiver.go meta.block.go punctuation.section.function-block.end.go -3309-3311: source.go -3311-3315: source.go meta.function.receiver.go meta.function.receiver.declaration.go keyword.control.go -3315-3316: source.go meta.function.receiver.go meta.function.receiver.declaration.go -3316-3317: source.go meta.function.receiver.go meta.function.receiver.declaration.go entity.name.function.go.full-name -3317-3324: source.go meta.function.receiver.go meta.function.receiver.declaration.go entity.name.function.go.full-name variable.receiver.go -3324-3326: source.go meta.function.receiver.go meta.function.receiver.declaration.go entity.name.function.go.full-name -3326-3336: source.go meta.function.receiver.go meta.function.receiver.declaration.go entity.name.function.go.full-name entity.name.function.go.name -3336-3337: source.go meta.function.receiver.go meta.function.receiver.declaration.go -3337-3370: source.go meta.function.receiver.go meta.function.receiver.declaration.go variable.parameters.go -3370-3372: source.go meta.function.receiver.go meta.function.receiver.declaration.go -3372-3373: source.go meta.function.receiver.go meta.block.go punctuation.section.function-block.begin.go -3373-3375: source.go meta.function.receiver.go meta.block.go -3375-3379: source.go meta.function.receiver.go meta.block.go meta.initialization.short.go variable.other.go -3379-3381: source.go meta.function.receiver.go meta.block.go meta.initialization.short.go variable.other.go keyword.operator.initialize.go -3381-3384: source.go meta.function.receiver.go meta.block.go -3384-3387: source.go meta.function.receiver.go meta.block.go meta.function-call.go support.function.any-method.go -3387-3388: source.go meta.function.receiver.go meta.block.go meta.function-call.go -3388-3391: source.go meta.function.receiver.go meta.block.go -3391-3398: source.go meta.function.receiver.go meta.block.go meta.initialization.short.go variable.other.go -3398-3400: source.go meta.function.receiver.go meta.block.go meta.initialization.short.go variable.other.go keyword.operator.initialize.go -3400-3403: source.go meta.function.receiver.go meta.block.go -3403-3409: source.go meta.function.receiver.go meta.block.go meta.function-call.go support.function.any-method.go -3409-3410: source.go meta.function.receiver.go meta.block.go meta.function-call.go -3410-3412: source.go meta.function.receiver.go meta.block.go -3412-3416: source.go meta.function.receiver.go meta.block.go meta.function-call.go support.function.any-method.go -3416-3417: source.go meta.function.receiver.go meta.block.go meta.function-call.go -3417-3420: source.go meta.function.receiver.go meta.block.go -3420-3423: source.go meta.function.receiver.go meta.block.go meta.initialization.short.go variable.other.go -3423-3425: source.go meta.function.receiver.go meta.block.go meta.initialization.short.go variable.other.go keyword.operator.initialize.go -3425-3428: source.go meta.function.receiver.go meta.block.go -3428-3441: source.go meta.function.receiver.go meta.block.go meta.function-call.go support.function.any-method.go -3441-3442: source.go meta.function.receiver.go meta.block.go meta.function-call.go -3442-3446: source.go meta.function.receiver.go meta.block.go -3446-3452: source.go meta.function.receiver.go meta.block.go meta.initialization.short.go variable.other.go -3452-3454: source.go meta.function.receiver.go meta.block.go meta.initialization.short.go variable.other.go keyword.operator.initialize.go -3454-3463: source.go meta.function.receiver.go meta.block.go -3463-3468: source.go meta.function.receiver.go meta.block.go meta.function-call.go support.function.any-method.go -3468-3469: source.go meta.function.receiver.go meta.block.go meta.function-call.go -3469-3477: source.go meta.function.receiver.go meta.block.go -3477-3478: source.go meta.function.receiver.go meta.block.go string.quoted.double.go punctuation.definition.string.begin.go -3478-3480: source.go meta.function.receiver.go meta.block.go string.quoted.double.go constant.character.escape.go -3480-3481: source.go meta.function.receiver.go meta.block.go string.quoted.double.go punctuation.definition.string.end.go -3481-3484: source.go meta.function.receiver.go meta.block.go -3484-3489: source.go meta.function.receiver.go meta.block.go meta.initialization.short.go variable.other.go -3489-3491: source.go meta.function.receiver.go meta.block.go meta.initialization.short.go variable.other.go keyword.operator.initialize.go -3491-3494: source.go meta.function.receiver.go meta.block.go -3494-3500: source.go meta.function.receiver.go meta.block.go meta.function-call.go support.function.any-method.go -3500-3501: source.go meta.function.receiver.go meta.block.go meta.function-call.go -3501-3503: source.go meta.function.receiver.go meta.block.go -3503-3509: source.go meta.function.receiver.go meta.block.go meta.function-call.go support.function.any-method.go -3509-3510: source.go meta.function.receiver.go meta.block.go meta.function-call.go -3510-3513: source.go meta.function.receiver.go meta.block.go -3513-3518: source.go meta.function.receiver.go meta.block.go meta.function-call.go support.function.any-method.go -3518-3519: source.go meta.function.receiver.go meta.block.go meta.function-call.go -3519-3523: source.go meta.function.receiver.go meta.block.go -3523-3528: source.go meta.function.receiver.go meta.block.go meta.initialization.short.go variable.other.go -3528-3530: source.go meta.function.receiver.go meta.block.go meta.initialization.short.go variable.other.go keyword.operator.initialize.go -3530-3533: source.go meta.function.receiver.go meta.block.go -3533-3539: source.go meta.function.receiver.go meta.block.go meta.function-call.go support.function.any-method.go -3539-3540: source.go meta.function.receiver.go meta.block.go meta.function-call.go -3540-3542: source.go meta.function.receiver.go meta.block.go -3542-3548: source.go meta.function.receiver.go meta.block.go meta.function-call.go support.function.any-method.go -3548-3549: source.go meta.function.receiver.go meta.block.go meta.function-call.go -3549-3552: source.go meta.function.receiver.go meta.block.go -3552-3555: source.go meta.function.receiver.go meta.block.go meta.function-call.go support.function.any-method.go -3555-3556: source.go meta.function.receiver.go meta.block.go meta.function-call.go -3556-3560: source.go meta.function.receiver.go meta.block.go -3560-3562: source.go meta.function.receiver.go meta.block.go keyword.control.go -3562-3567: source.go meta.function.receiver.go meta.block.go -3567-3568: source.go meta.function.receiver.go meta.block.go constant.numeric.go -3568-3569: source.go meta.function.receiver.go meta.block.go -3569-3570: source.go meta.function.receiver.go meta.block.go meta.block.go punctuation.section.function-block.begin.go -3570-3581: source.go meta.function.receiver.go meta.block.go meta.block.go -3581-3582: source.go meta.function.receiver.go meta.block.go meta.block.go constant.numeric.go -3582-3585: source.go meta.function.receiver.go meta.block.go meta.block.go -3585-3587: source.go meta.function.receiver.go meta.block.go meta.block.go keyword.control.go -3587-3594: source.go meta.function.receiver.go meta.block.go meta.block.go -3594-3595: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go punctuation.section.function-block.begin.go -3595-3611: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go -3611-3612: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go punctuation.section.function-block.end.go -3612-3614: source.go meta.function.receiver.go meta.block.go meta.block.go -3614-3615: source.go meta.function.receiver.go meta.block.go meta.block.go punctuation.section.function-block.end.go -3615-3617: source.go meta.function.receiver.go meta.block.go -3617-3621: source.go meta.function.receiver.go meta.block.go meta.initialization.short.go variable.other.go -3621-3623: source.go meta.function.receiver.go meta.block.go meta.initialization.short.go variable.other.go keyword.operator.initialize.go -3623-3624: source.go meta.function.receiver.go meta.block.go punctuation.whitespace.support.function.leading.go -3624-3627: source.go meta.function.receiver.go meta.block.go support.function.builtin.go -3627-3628: source.go meta.function.receiver.go meta.block.go meta.parens.go punctuation.section.parens.begin.go -3628-3636: source.go meta.function.receiver.go meta.block.go meta.parens.go -3636-3640: source.go meta.function.receiver.go meta.block.go meta.parens.go meta.function-call.go support.function.any-method.go -3640-3641: source.go meta.function.receiver.go meta.block.go meta.parens.go meta.function-call.go -3641-3652: source.go meta.function.receiver.go meta.block.go meta.parens.go -3652-3653: source.go meta.function.receiver.go meta.block.go meta.parens.go string.quoted.double.go punctuation.definition.string.begin.go -3653-3655: source.go meta.function.receiver.go meta.block.go meta.parens.go string.quoted.double.go constant.character.escape.go -3655-3656: source.go meta.function.receiver.go meta.block.go meta.parens.go string.quoted.double.go punctuation.definition.string.end.go -3656-3657: source.go meta.function.receiver.go meta.block.go meta.parens.go punctuation.section.parens.end.go -3657-3680: source.go meta.function.receiver.go meta.block.go -3680-3686: source.go meta.function.receiver.go meta.block.go meta.initialization.short.go variable.other.go -3686-3688: source.go meta.function.receiver.go meta.block.go meta.initialization.short.go variable.other.go keyword.operator.initialize.go -3688-3691: source.go meta.function.receiver.go meta.block.go -3691-3695: source.go meta.function.receiver.go meta.block.go meta.function-call.go support.function.any-method.go -3695-3696: source.go meta.function.receiver.go meta.block.go meta.function-call.go -3696-3704: source.go meta.function.receiver.go meta.block.go -3704-3708: source.go meta.function.receiver.go meta.block.go meta.function-call.go support.function.any-method.go -3708-3709: source.go meta.function.receiver.go meta.block.go meta.function-call.go -3709-3716: source.go meta.function.receiver.go meta.block.go -3716-3717: source.go meta.function.receiver.go meta.block.go string.quoted.double.go punctuation.definition.string.begin.go -3717-3719: source.go meta.function.receiver.go meta.block.go string.quoted.double.go constant.character.escape.go -3719-3720: source.go meta.function.receiver.go meta.block.go string.quoted.double.go punctuation.definition.string.end.go -3720-3724: source.go meta.function.receiver.go meta.block.go -3724-3729: source.go meta.function.receiver.go meta.block.go meta.initialization.short.go variable.other.go -3729-3731: source.go meta.function.receiver.go meta.block.go meta.initialization.short.go variable.other.go keyword.operator.initialize.go -3731-3740: source.go meta.function.receiver.go meta.block.go -3740-3747: source.go meta.function.receiver.go meta.block.go meta.initialization.short.go variable.other.go -3747-3749: source.go meta.function.receiver.go meta.block.go meta.initialization.short.go variable.other.go keyword.operator.initialize.go -3749-3763: source.go meta.function.receiver.go meta.block.go -3763-3768: source.go meta.function.receiver.go meta.block.go meta.initialization.short.go variable.other.go -3768-3770: source.go meta.function.receiver.go meta.block.go meta.initialization.short.go variable.other.go keyword.operator.initialize.go -3770-3771: source.go meta.function.receiver.go meta.block.go -3771-3772: source.go meta.function.receiver.go meta.block.go string.quoted.double.go punctuation.definition.string.begin.go -3772-3773: source.go meta.function.receiver.go meta.block.go string.quoted.double.go punctuation.definition.string.end.go -3773-3775: source.go meta.function.receiver.go meta.block.go meta.function-call.go punctuation.whitespace.function-call.leading.go -3775-3778: source.go meta.function.receiver.go meta.block.go meta.function-call.go support.function.any-method.go -3778-3780: source.go meta.function.receiver.go meta.block.go meta.function-call.go -3780-3793: source.go meta.function.receiver.go meta.block.go -3793-3799: source.go meta.function.receiver.go meta.block.go storage.type.go -3799-3840: source.go meta.function.receiver.go meta.block.go -3840-3853: source.go meta.function.receiver.go meta.block.go meta.initialization.short.go variable.other.go -3853-3855: source.go meta.function.receiver.go meta.block.go meta.initialization.short.go variable.other.go keyword.operator.initialize.go -3855-3858: source.go meta.function.receiver.go meta.block.go -3858-3866: source.go meta.function.receiver.go meta.block.go meta.function-call.go support.function.any-method.go -3866-3867: source.go meta.function.receiver.go meta.block.go meta.function-call.go -3867-3869: source.go meta.function.receiver.go meta.block.go -3869-3872: source.go meta.function.receiver.go meta.block.go meta.function-call.go support.function.any-method.go -3872-3873: source.go meta.function.receiver.go meta.block.go meta.function-call.go -3873-3874: source.go meta.function.receiver.go meta.block.go string.quoted.double.go punctuation.definition.string.begin.go -3874-3882: source.go meta.function.receiver.go meta.block.go string.quoted.double.go -3882-3883: source.go meta.function.receiver.go meta.block.go string.quoted.double.go punctuation.definition.string.end.go -3883-3885: source.go meta.function.receiver.go meta.block.go -3885-3886: source.go meta.function.receiver.go meta.block.go constant.numeric.go -3886-3888: source.go meta.function.receiver.go meta.block.go -3888-3889: source.go meta.function.receiver.go meta.block.go meta.parens.go punctuation.section.parens.begin.go -3889-3892: source.go meta.function.receiver.go meta.block.go meta.parens.go storage.type.go -3892-3893: source.go meta.function.receiver.go meta.block.go meta.parens.go punctuation.section.parens.end.go -3893-3895: source.go meta.function.receiver.go meta.block.go -3895-3897: source.go meta.function.receiver.go meta.block.go keyword.control.go -3897-3902: source.go meta.function.receiver.go meta.block.go -3902-3903: source.go meta.function.receiver.go meta.block.go meta.block.go punctuation.section.function-block.begin.go -3903-3917: source.go meta.function.receiver.go meta.block.go meta.block.go -3917-3918: source.go meta.function.receiver.go meta.block.go meta.block.go constant.numeric.go -3918-3920: source.go meta.function.receiver.go meta.block.go meta.block.go -3920-3921: source.go meta.function.receiver.go meta.block.go meta.block.go punctuation.section.function-block.end.go -3921-3923: source.go meta.function.receiver.go meta.block.go -3923-3935: source.go meta.function.receiver.go meta.block.go meta.initialization.short.go variable.other.go -3935-3937: source.go meta.function.receiver.go meta.block.go meta.initialization.short.go variable.other.go keyword.operator.initialize.go -3937-3946: source.go meta.function.receiver.go meta.block.go -3946-3959: source.go meta.function.receiver.go meta.block.go variable.other.dot-access.go -3959-3961: source.go meta.function.receiver.go meta.block.go -3961-3963: source.go meta.function.receiver.go meta.block.go keyword.control.go -3963-3964: source.go meta.function.receiver.go meta.block.go -3964-3970: source.go meta.function.receiver.go meta.block.go meta.initialization.short.go variable.other.go -3970-3972: source.go meta.function.receiver.go meta.block.go meta.initialization.short.go variable.other.go keyword.operator.initialize.go -3972-3975: source.go meta.function.receiver.go meta.block.go -3975-3983: source.go meta.function.receiver.go meta.block.go meta.function-call.go support.function.any-method.go -3983-3984: source.go meta.function.receiver.go meta.block.go meta.function-call.go -3984-3986: source.go meta.function.receiver.go meta.block.go -3986-3989: source.go meta.function.receiver.go meta.block.go meta.function-call.go support.function.any-method.go -3989-3990: source.go meta.function.receiver.go meta.block.go meta.function-call.go -3990-3991: source.go meta.function.receiver.go meta.block.go string.quoted.double.go punctuation.definition.string.begin.go -3991-4002: source.go meta.function.receiver.go meta.block.go string.quoted.double.go -4002-4003: source.go meta.function.receiver.go meta.block.go string.quoted.double.go punctuation.definition.string.end.go -4003-4005: source.go meta.function.receiver.go meta.block.go -4005-4006: source.go meta.function.receiver.go meta.block.go string.quoted.double.go punctuation.definition.string.begin.go -4006-4015: source.go meta.function.receiver.go meta.block.go string.quoted.double.go -4015-4016: source.go meta.function.receiver.go meta.block.go string.quoted.double.go punctuation.definition.string.end.go -4016-4018: source.go meta.function.receiver.go meta.block.go -4018-4019: source.go meta.function.receiver.go meta.block.go meta.parens.go punctuation.section.parens.begin.go -4019-4025: source.go meta.function.receiver.go meta.block.go meta.parens.go storage.type.go -4025-4026: source.go meta.function.receiver.go meta.block.go meta.parens.go punctuation.section.parens.end.go -4026-4031: source.go meta.function.receiver.go meta.block.go -4031-4032: source.go meta.function.receiver.go meta.block.go meta.block.go punctuation.section.function-block.begin.go -4032-4035: source.go meta.function.receiver.go meta.block.go meta.block.go -4035-4037: source.go meta.function.receiver.go meta.block.go meta.block.go keyword.control.go -4037-4043: source.go meta.function.receiver.go meta.block.go meta.block.go -4043-4044: source.go meta.function.receiver.go meta.block.go meta.block.go string.quoted.double.go punctuation.definition.string.begin.go -4044-4049: source.go meta.function.receiver.go meta.block.go meta.block.go string.quoted.double.go -4049-4050: source.go meta.function.receiver.go meta.block.go meta.block.go string.quoted.double.go punctuation.definition.string.end.go -4050-4051: source.go meta.function.receiver.go meta.block.go meta.block.go -4051-4052: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go punctuation.section.function-block.begin.go -4052-4078: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go -4078-4089: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go variable.other.dot-access.go -4089-4092: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go -4092-4093: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go punctuation.section.function-block.end.go -4093-4095: source.go meta.function.receiver.go meta.block.go meta.block.go -4095-4096: source.go meta.function.receiver.go meta.block.go meta.block.go punctuation.section.function-block.end.go -4096-4098: source.go meta.function.receiver.go meta.block.go -4098-4100: source.go meta.function.receiver.go meta.block.go keyword.control.go -4100-4101: source.go meta.function.receiver.go meta.block.go -4101-4107: source.go meta.function.receiver.go meta.block.go meta.initialization.short.go variable.other.go -4107-4109: source.go meta.function.receiver.go meta.block.go meta.initialization.short.go variable.other.go keyword.operator.initialize.go -4109-4112: source.go meta.function.receiver.go meta.block.go -4112-4120: source.go meta.function.receiver.go meta.block.go meta.function-call.go support.function.any-method.go -4120-4121: source.go meta.function.receiver.go meta.block.go meta.function-call.go -4121-4123: source.go meta.function.receiver.go meta.block.go -4123-4126: source.go meta.function.receiver.go meta.block.go meta.function-call.go support.function.any-method.go -4126-4127: source.go meta.function.receiver.go meta.block.go meta.function-call.go -4127-4128: source.go meta.function.receiver.go meta.block.go string.quoted.double.go punctuation.definition.string.begin.go -4128-4147: source.go meta.function.receiver.go meta.block.go string.quoted.double.go -4147-4148: source.go meta.function.receiver.go meta.block.go string.quoted.double.go punctuation.definition.string.end.go -4148-4150: source.go meta.function.receiver.go meta.block.go -4150-4155: source.go meta.function.receiver.go meta.block.go constant.language.go -4155-4157: source.go meta.function.receiver.go meta.block.go -4157-4158: source.go meta.function.receiver.go meta.block.go meta.parens.go punctuation.section.parens.begin.go -4158-4162: source.go meta.function.receiver.go meta.block.go meta.parens.go storage.type.go -4162-4163: source.go meta.function.receiver.go meta.block.go meta.parens.go punctuation.section.parens.end.go -4163-4174: source.go meta.function.receiver.go meta.block.go -4174-4175: source.go meta.function.receiver.go meta.block.go meta.block.go punctuation.section.function-block.begin.go -4175-4178: source.go meta.function.receiver.go meta.block.go meta.block.go -4178-4180: source.go meta.function.receiver.go meta.block.go meta.block.go keyword.control.go -4180-4204: source.go meta.function.receiver.go meta.block.go meta.block.go -4204-4215: source.go meta.function.receiver.go meta.block.go meta.block.go variable.other.dot-access.go -4215-4216: source.go meta.function.receiver.go meta.block.go meta.block.go -4216-4217: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go punctuation.section.function-block.begin.go -4217-4243: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go -4243-4256: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go variable.other.dot-access.go -4256-4259: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go -4259-4260: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go punctuation.section.function-block.end.go -4260-4261: source.go meta.function.receiver.go meta.block.go meta.block.go -4261-4265: source.go meta.function.receiver.go meta.block.go meta.block.go keyword.control.go -4265-4266: source.go meta.function.receiver.go meta.block.go meta.block.go -4266-4267: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go punctuation.section.function-block.begin.go -4267-4293: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go -4293-4304: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go variable.other.dot-access.go -4304-4307: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go -4307-4308: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go punctuation.section.function-block.end.go -4308-4310: source.go meta.function.receiver.go meta.block.go meta.block.go -4310-4311: source.go meta.function.receiver.go meta.block.go meta.block.go punctuation.section.function-block.end.go -4311-4313: source.go meta.function.receiver.go meta.block.go -4313-4325: source.go meta.function.receiver.go meta.block.go meta.initialization.short.go variable.other.go -4325-4327: source.go meta.function.receiver.go meta.block.go meta.initialization.short.go variable.other.go keyword.operator.initialize.go -4327-4328: source.go meta.function.receiver.go meta.block.go -4328-4332: source.go meta.function.receiver.go meta.block.go constant.language.go -4332-4334: source.go meta.function.receiver.go meta.block.go -4334-4336: source.go meta.function.receiver.go meta.block.go keyword.control.go -4336-4337: source.go meta.function.receiver.go meta.block.go -4337-4343: source.go meta.function.receiver.go meta.block.go meta.initialization.short.go variable.other.go -4343-4345: source.go meta.function.receiver.go meta.block.go meta.initialization.short.go variable.other.go keyword.operator.initialize.go -4345-4348: source.go meta.function.receiver.go meta.block.go -4348-4356: source.go meta.function.receiver.go meta.block.go meta.function-call.go support.function.any-method.go -4356-4357: source.go meta.function.receiver.go meta.block.go meta.function-call.go -4357-4359: source.go meta.function.receiver.go meta.block.go -4359-4362: source.go meta.function.receiver.go meta.block.go meta.function-call.go support.function.any-method.go -4362-4363: source.go meta.function.receiver.go meta.block.go meta.function-call.go -4363-4364: source.go meta.function.receiver.go meta.block.go string.quoted.double.go punctuation.definition.string.begin.go -4364-4375: source.go meta.function.receiver.go meta.block.go string.quoted.double.go -4375-4376: source.go meta.function.receiver.go meta.block.go string.quoted.double.go punctuation.definition.string.end.go -4376-4378: source.go meta.function.receiver.go meta.block.go -4378-4382: source.go meta.function.receiver.go meta.block.go constant.language.go -4382-4384: source.go meta.function.receiver.go meta.block.go -4384-4385: source.go meta.function.receiver.go meta.block.go meta.parens.go punctuation.section.parens.begin.go -4385-4389: source.go meta.function.receiver.go meta.block.go meta.parens.go storage.type.go -4389-4390: source.go meta.function.receiver.go meta.block.go meta.parens.go punctuation.section.parens.end.go -4390-4395: source.go meta.function.receiver.go meta.block.go -4395-4396: source.go meta.function.receiver.go meta.block.go meta.block.go punctuation.section.function-block.begin.go -4396-4416: source.go meta.function.receiver.go meta.block.go meta.block.go -4416-4417: source.go meta.function.receiver.go meta.block.go meta.block.go punctuation.section.function-block.end.go -4417-4420: source.go meta.function.receiver.go meta.block.go -4420-4423: source.go meta.function.receiver.go meta.block.go keyword.control.go -4423-4424: source.go meta.function.receiver.go meta.block.go -4424-4426: source.go meta.function.receiver.go meta.block.go meta.initialization.short.go variable.other.go -4426-4428: source.go meta.function.receiver.go meta.block.go meta.initialization.short.go variable.other.go keyword.operator.initialize.go -4428-4429: source.go meta.function.receiver.go meta.block.go -4429-4434: source.go meta.function.receiver.go meta.block.go keyword.control.go -4434-4441: source.go meta.function.receiver.go meta.block.go -4441-4442: source.go meta.function.receiver.go meta.block.go meta.block.go punctuation.section.function-block.begin.go -4442-4452: source.go meta.function.receiver.go meta.block.go meta.block.go -4452-4453: source.go meta.function.receiver.go meta.block.go meta.block.go meta.function-call.go punctuation.whitespace.function-call.leading.go -4453-4459: source.go meta.function.receiver.go meta.block.go meta.block.go meta.function-call.go support.function.any-method.go -4459-4460: source.go meta.function.receiver.go meta.block.go meta.block.go meta.function-call.go -4460-4473: source.go meta.function.receiver.go meta.block.go meta.block.go -4473-4475: source.go meta.function.receiver.go meta.block.go meta.block.go keyword.control.go -4475-4483: source.go meta.function.receiver.go meta.block.go meta.block.go -4483-4484: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go punctuation.section.function-block.begin.go -4484-4488: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go -4488-4490: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.initialization.short.go variable.other.go -4490-4492: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.initialization.short.go variable.other.go keyword.operator.initialize.go -4492-4498: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go -4498-4499: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go punctuation.whitespace.support.function.leading.go -4499-4502: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go support.function.builtin.go -4502-4503: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.parens.go punctuation.section.parens.begin.go -4503-4507: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.parens.go -4507-4508: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.parens.go punctuation.section.parens.end.go -4508-4512: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go -4512-4514: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.initialization.short.go variable.other.go -4514-4516: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.initialization.short.go variable.other.go keyword.operator.initialize.go -4516-4528: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go -4528-4534: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go variable.other.dot-access.go -4534-4535: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go punctuation.section.function-block.begin.go -4535-4539: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go -4539-4540: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go punctuation.section.function-block.end.go -4540-4544: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go -4544-4551: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.initialization.short.go variable.other.go -4551-4553: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.initialization.short.go variable.other.go keyword.operator.initialize.go -4553-4566: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go -4566-4572: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.initialization.short.go variable.other.go -4572-4574: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.initialization.short.go variable.other.go keyword.operator.initialize.go -4574-4577: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go -4577-4586: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.function-call.go support.function.any-method.go -4586-4587: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.function-call.go -4587-4593: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go -4593-4595: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go keyword.control.go -4595-4615: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go -4615-4616: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go punctuation.section.function-block.begin.go -4616-4677: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go -4677-4680: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go meta.initialization.short.go variable.other.go -4680-4682: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go meta.initialization.short.go variable.other.go keyword.operator.initialize.go -4682-4693: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go -4693-4696: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go keyword.control.go -4696-4697: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go punctuation.whitespace.support.function.leading.go -4697-4700: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go support.function.builtin.go -4700-4701: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go meta.parens.go punctuation.section.parens.begin.go -4701-4703: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go meta.parens.go -4703-4704: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go meta.parens.go punctuation.section.parens.end.go -4704-4707: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go -4707-4708: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go constant.numeric.go -4708-4709: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go -4709-4710: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go meta.block.go punctuation.section.function-block.begin.go -4710-4716: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go meta.block.go -4716-4719: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go meta.block.go meta.initialization.short.go variable.other.go -4719-4721: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go meta.block.go meta.initialization.short.go variable.other.go keyword.operator.initialize.go -4721-4730: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go meta.block.go -4730-4732: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go meta.block.go meta.initialization.short.go variable.other.go -4732-4734: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go meta.block.go meta.initialization.short.go variable.other.go keyword.operator.initialize.go -4734-4743: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go meta.block.go -4743-4752: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go meta.block.go meta.function-call.go support.function.any-method.go -4752-4753: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go meta.block.go meta.function-call.go -4753-4757: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go meta.block.go -4757-4758: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go meta.block.go string.quoted.double.go punctuation.definition.string.begin.go -4758-4759: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go meta.block.go string.quoted.double.go -4759-4760: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go meta.block.go string.quoted.double.go punctuation.definition.string.end.go -4760-4767: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go meta.block.go -4767-4769: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go meta.block.go keyword.control.go -4769-4776: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go meta.block.go -4776-4777: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go meta.block.go constant.numeric.go -4777-4778: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go meta.block.go -4778-4779: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go meta.block.go meta.block.go punctuation.section.function-block.begin.go -4779-4796: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go meta.block.go meta.block.go -4796-4797: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go meta.block.go meta.block.go constant.numeric.go -4797-4805: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go meta.block.go meta.block.go -4805-4806: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go meta.block.go meta.block.go punctuation.section.function-block.end.go -4806-4812: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go meta.block.go -4812-4814: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go meta.block.go keyword.control.go -4814-4815: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go meta.block.go -4815-4821: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go meta.block.go meta.initialization.short.go variable.other.go -4821-4823: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go meta.block.go meta.initialization.short.go variable.other.go keyword.operator.initialize.go -4823-4842: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go meta.block.go -4842-4843: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go meta.block.go meta.block.go punctuation.section.function-block.begin.go -4843-4861: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go meta.block.go meta.block.go -4861-4862: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go meta.block.go meta.block.go constant.numeric.go -4862-4867: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go meta.block.go meta.block.go -4867-4868: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go meta.block.go meta.block.go constant.numeric.go -4868-4876: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go meta.block.go meta.block.go -4876-4881: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go meta.block.go meta.block.go keyword.control.go -4881-4887: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go meta.block.go meta.block.go -4887-4888: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go meta.block.go meta.block.go punctuation.section.function-block.end.go -4888-4894: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go meta.block.go -4894-4896: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go meta.block.go keyword.control.go -4896-4897: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go meta.block.go -4897-4900: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go meta.block.go meta.initialization.short.go variable.other.go -4900-4902: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go meta.block.go meta.initialization.short.go variable.other.go keyword.operator.initialize.go -4902-4911: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go meta.block.go -4911-4920: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go meta.block.go meta.function-call.go support.function.any-method.go -4920-4921: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go meta.block.go meta.function-call.go -4921-4925: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go meta.block.go -4925-4926: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go meta.block.go string.quoted.double.go punctuation.definition.string.begin.go -4926-4927: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go meta.block.go string.quoted.double.go -4927-4928: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go meta.block.go string.quoted.double.go punctuation.definition.string.end.go -4928-4938: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go meta.block.go -4938-4939: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go meta.block.go constant.numeric.go -4939-4940: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go meta.block.go -4940-4941: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go meta.block.go meta.block.go punctuation.section.function-block.begin.go -4941-4948: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go meta.block.go meta.block.go -4948-4953: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go meta.block.go meta.block.go keyword.control.go -4953-4959: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go meta.block.go meta.block.go -4959-4960: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go meta.block.go meta.block.go punctuation.section.function-block.end.go -4960-4961: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go meta.block.go -4961-4965: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go meta.block.go keyword.control.go -4965-4966: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go meta.block.go -4966-4968: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go meta.block.go keyword.control.go -4968-4976: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go meta.block.go -4976-4977: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go meta.block.go meta.block.go punctuation.section.function-block.begin.go -4977-5001: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go meta.block.go meta.block.go -5001-5002: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go meta.block.go meta.block.go punctuation.section.function-block.end.go -5002-5003: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go meta.block.go -5003-5007: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go meta.block.go keyword.control.go -5007-5008: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go meta.block.go -5008-5009: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go meta.block.go meta.block.go punctuation.section.function-block.begin.go -5009-5029: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go meta.block.go meta.block.go -5029-5038: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go meta.block.go meta.block.go meta.function-call.go support.function.any-method.go -5038-5039: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go meta.block.go meta.block.go meta.function-call.go -5039-5053: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go meta.block.go meta.block.go -5053-5054: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go meta.block.go meta.block.go punctuation.section.function-block.end.go -5054-5059: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go meta.block.go -5059-5060: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go meta.block.go punctuation.section.function-block.end.go -5060-5086: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go -5086-5087: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go punctuation.section.function-block.end.go -5087-5088: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go -5088-5092: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go keyword.control.go -5092-5093: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go -5093-5094: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go punctuation.section.function-block.begin.go -5094-5120: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go -5120-5121: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go punctuation.section.function-block.end.go -5121-5125: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go -5125-5128: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go keyword.control.go -5128-5129: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go -5129-5135: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.initialization.short.go variable.other.go -5135-5137: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.initialization.short.go variable.other.go keyword.operator.initialize.go -5137-5138: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go -5138-5143: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go keyword.control.go -5143-5148: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go -5148-5155: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.function-call.go support.function.any-method.go -5155-5156: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.function-call.go -5156-5158: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go -5158-5159: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go punctuation.section.function-block.begin.go -5159-5164: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go -5164-5166: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go keyword.control.go -5166-5170: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go -5170-5171: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go variable.other.dot-access.go -5171-5177: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go -5177-5178: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go variable.other.dot-access.go -5178-5179: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go -5179-5180: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go meta.block.go punctuation.section.function-block.begin.go -5180-5186: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go meta.block.go -5186-5188: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go meta.block.go keyword.control.go -5188-5211: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go meta.block.go -5211-5212: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go meta.block.go meta.block.go punctuation.section.function-block.begin.go -5212-5219: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go meta.block.go meta.block.go -5219-5221: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go meta.block.go meta.block.go keyword.control.go -5221-5225: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go meta.block.go meta.block.go -5225-5233: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go meta.block.go meta.block.go meta.function-call.go support.function.any-method.go -5233-5234: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go meta.block.go meta.block.go meta.function-call.go -5234-5237: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go meta.block.go meta.block.go -5237-5238: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go meta.block.go meta.block.go meta.block.go punctuation.section.function-block.begin.go -5238-5260: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go meta.block.go meta.block.go meta.block.go -5260-5271: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go meta.block.go meta.block.go meta.block.go variable.other.dot-access.go -5271-5278: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go meta.block.go meta.block.go meta.block.go -5278-5279: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go meta.block.go meta.block.go meta.block.go punctuation.section.function-block.end.go -5279-5280: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go meta.block.go meta.block.go -5280-5284: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go meta.block.go meta.block.go keyword.control.go -5284-5285: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go meta.block.go meta.block.go -5285-5286: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go meta.block.go meta.block.go meta.block.go punctuation.section.function-block.begin.go -5286-5318: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go meta.block.go meta.block.go meta.block.go -5318-5319: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go meta.block.go meta.block.go meta.block.go punctuation.section.function-block.end.go -5319-5325: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go meta.block.go meta.block.go -5325-5326: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go meta.block.go meta.block.go punctuation.section.function-block.end.go -5326-5332: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go meta.block.go -5332-5337: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go meta.block.go keyword.control.go -5337-5342: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go meta.block.go -5342-5343: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go meta.block.go punctuation.section.function-block.end.go -5343-5344: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go -5344-5348: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go keyword.control.go -5348-5349: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go -5349-5351: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go keyword.control.go -5351-5355: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go -5355-5363: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go meta.function-call.go support.function.any-method.go -5363-5364: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go meta.function-call.go -5364-5367: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go -5367-5368: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go meta.block.go punctuation.section.function-block.begin.go -5368-5388: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go meta.block.go -5388-5399: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go meta.block.go variable.other.dot-access.go -5399-5405: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go meta.block.go -5405-5410: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go meta.block.go keyword.control.go -5410-5415: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go meta.block.go -5415-5416: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go meta.block.go punctuation.section.function-block.end.go -5416-5420: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go -5420-5421: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go punctuation.section.function-block.end.go -5421-5425: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go -5425-5427: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go keyword.control.go -5427-5440: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go -5440-5441: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go string.quoted.single.go punctuation.definition.string.begin.go -5441-5443: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go string.quoted.single.go constant.character.escape.go -5443-5444: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go string.quoted.single.go punctuation.definition.string.end.go -5444-5445: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go -5445-5446: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go punctuation.section.function-block.begin.go -5446-5451: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go -5451-5455: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go meta.initialization.short.go variable.other.go -5455-5457: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go meta.initialization.short.go variable.other.go keyword.operator.initialize.go -5457-5458: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go -5458-5459: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go meta.parens.go punctuation.section.parens.begin.go -5459-5463: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go meta.parens.go -5463-5464: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go meta.parens.go constant.numeric.go -5464-5479: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go meta.parens.go -5479-5480: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go meta.parens.go constant.numeric.go -5480-5481: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go meta.parens.go punctuation.section.parens.end.go -5481-5486: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go -5486-5487: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go meta.parens.go punctuation.section.parens.begin.go -5487-5498: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go meta.parens.go -5498-5499: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go meta.parens.go constant.numeric.go -5499-5500: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go meta.parens.go punctuation.section.parens.end.go -5500-5506: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go -5506-5509: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go keyword.control.go -5509-5518: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go -5518-5519: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go meta.block.go punctuation.section.function-block.begin.go -5519-5533: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go meta.block.go -5533-5540: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go meta.block.go meta.function-call.go support.function.any-method.go -5540-5541: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go meta.block.go meta.function-call.go -5541-5547: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go meta.block.go -5547-5548: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go meta.block.go string.quoted.single.go punctuation.definition.string.begin.go -5548-5549: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go meta.block.go string.quoted.single.go -5549-5550: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go meta.block.go string.quoted.single.go punctuation.definition.string.end.go -5550-5573: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go meta.block.go -5573-5574: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go meta.block.go punctuation.section.function-block.end.go -5574-5579: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go -5579-5587: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go keyword.control.go -5587-5591: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go -5591-5592: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go punctuation.section.function-block.end.go -5592-5593: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go -5593-5597: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go keyword.control.go -5597-5598: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go -5598-5600: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go keyword.control.go -5600-5613: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go -5613-5614: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go string.quoted.single.go punctuation.definition.string.begin.go -5614-5616: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go string.quoted.single.go constant.character.escape.go -5616-5617: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go string.quoted.single.go punctuation.definition.string.end.go -5617-5618: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go -5618-5619: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go punctuation.section.function-block.begin.go -5619-5632: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go -5632-5639: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go meta.function-call.go support.function.any-method.go -5639-5640: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go meta.function-call.go -5640-5646: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go -5646-5647: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go string.quoted.single.go punctuation.definition.string.begin.go -5647-5648: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go string.quoted.single.go -5648-5649: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go string.quoted.single.go punctuation.definition.string.end.go -5649-5682: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go -5682-5684: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go keyword.control.go -5684-5692: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go -5692-5693: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go meta.block.go punctuation.section.function-block.begin.go -5693-5699: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go meta.block.go -5699-5704: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go meta.block.go keyword.control.go -5704-5709: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go meta.block.go -5709-5710: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go meta.block.go punctuation.section.function-block.end.go -5710-5715: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go -5715-5723: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go keyword.control.go -5723-5727: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go -5727-5728: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go punctuation.section.function-block.end.go -5728-5740: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go -5740-5747: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.function-call.go support.function.any-method.go -5747-5748: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.function-call.go -5748-5774: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go -5774-5775: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go punctuation.section.function-block.end.go -5775-5783: source.go meta.function.receiver.go meta.block.go meta.block.go -5783-5784: source.go meta.function.receiver.go meta.block.go meta.block.go punctuation.section.function-block.end.go -5784-5785: source.go meta.function.receiver.go meta.block.go -5785-5786: source.go meta.function.receiver.go meta.block.go punctuation.section.function-block.end.go -5786-5788: source.go -5788-5792: source.go meta.function.receiver.go meta.function.receiver.declaration.go keyword.control.go -5792-5793: source.go meta.function.receiver.go meta.function.receiver.declaration.go -5793-5794: source.go meta.function.receiver.go meta.function.receiver.declaration.go entity.name.function.go.full-name -5794-5801: source.go meta.function.receiver.go meta.function.receiver.declaration.go entity.name.function.go.full-name variable.receiver.go -5801-5803: source.go meta.function.receiver.go meta.function.receiver.declaration.go entity.name.function.go.full-name -5803-5807: source.go meta.function.receiver.go meta.function.receiver.declaration.go entity.name.function.go.full-name entity.name.function.go.name -5807-5808: source.go meta.function.receiver.go meta.function.receiver.declaration.go -5808-5844: source.go meta.function.receiver.go meta.function.receiver.declaration.go variable.parameters.go -5844-5846: source.go meta.function.receiver.go meta.function.receiver.declaration.go -5846-5864: source.go meta.function.receiver.go meta.function.receiver.declaration.go variable.return-types.go -5864-5865: source.go meta.function.receiver.go meta.block.go punctuation.section.function-block.begin.go -5865-5867: source.go meta.function.receiver.go meta.block.go -5867-5872: source.go meta.function.receiver.go meta.block.go meta.initialization.short.go variable.other.go -5872-5874: source.go meta.function.receiver.go meta.block.go meta.initialization.short.go variable.other.go keyword.operator.initialize.go -5874-5877: source.go meta.function.receiver.go meta.block.go -5877-5883: source.go meta.function.receiver.go meta.block.go meta.function-call.go support.function.any-method.go -5883-5884: source.go meta.function.receiver.go meta.block.go meta.function-call.go -5884-5886: source.go meta.function.receiver.go meta.block.go -5886-5892: source.go meta.function.receiver.go meta.block.go meta.function-call.go support.function.any-method.go -5892-5893: source.go meta.function.receiver.go meta.block.go meta.function-call.go -5893-5895: source.go meta.function.receiver.go meta.block.go -5895-5900: source.go meta.function.receiver.go meta.block.go meta.function-call.go support.function.any-method.go -5900-5901: source.go meta.function.receiver.go meta.block.go meta.function-call.go -5901-5905: source.go meta.function.receiver.go meta.block.go -5905-5910: source.go meta.function.receiver.go meta.block.go meta.initialization.short.go variable.other.go -5910-5912: source.go meta.function.receiver.go meta.block.go meta.initialization.short.go variable.other.go keyword.operator.initialize.go -5912-5915: source.go meta.function.receiver.go meta.block.go -5915-5921: source.go meta.function.receiver.go meta.block.go meta.function-call.go support.function.any-method.go -5921-5922: source.go meta.function.receiver.go meta.block.go meta.function-call.go -5922-5924: source.go meta.function.receiver.go meta.block.go -5924-5930: source.go meta.function.receiver.go meta.block.go meta.function-call.go support.function.any-method.go -5930-5931: source.go meta.function.receiver.go meta.block.go meta.function-call.go -5931-5933: source.go meta.function.receiver.go meta.block.go -5933-5936: source.go meta.function.receiver.go meta.block.go meta.function-call.go support.function.any-method.go -5936-5937: source.go meta.function.receiver.go meta.block.go meta.function-call.go -5937-5942: source.go meta.function.receiver.go meta.block.go -5942-5947: source.go meta.function.receiver.go meta.block.go meta.initialization.short.go variable.other.go -5947-5949: source.go meta.function.receiver.go meta.block.go meta.initialization.short.go variable.other.go keyword.operator.initialize.go -5949-5958: source.go meta.function.receiver.go meta.block.go -5958-5962: source.go meta.function.receiver.go meta.block.go meta.function-call.go support.function.any-method.go -5962-5963: source.go meta.function.receiver.go meta.block.go meta.function-call.go -5963-5987: source.go meta.function.receiver.go meta.block.go -5987-5989: source.go meta.function.receiver.go meta.block.go keyword.control.go -5989-5998: source.go meta.function.receiver.go meta.block.go -5998-5999: source.go meta.function.receiver.go meta.block.go meta.block.go punctuation.section.function-block.begin.go -5999-6013: source.go meta.function.receiver.go meta.block.go meta.block.go -6013-6014: source.go meta.function.receiver.go meta.block.go meta.block.go punctuation.section.function-block.end.go -6014-6016: source.go meta.function.receiver.go meta.block.go -6016-6018: source.go meta.function.receiver.go meta.block.go keyword.control.go -6018-6019: source.go meta.function.receiver.go meta.block.go -6019-6025: source.go meta.function.receiver.go meta.block.go meta.initialization.short.go variable.other.go -6025-6027: source.go meta.function.receiver.go meta.block.go meta.initialization.short.go variable.other.go keyword.operator.initialize.go -6027-6030: source.go meta.function.receiver.go meta.block.go -6030-6036: source.go meta.function.receiver.go meta.block.go meta.function-call.go support.function.any-method.go -6036-6037: source.go meta.function.receiver.go meta.block.go meta.function-call.go -6037-6039: source.go meta.function.receiver.go meta.block.go -6039-6045: source.go meta.function.receiver.go meta.block.go meta.function-call.go support.function.any-method.go -6045-6046: source.go meta.function.receiver.go meta.block.go meta.function-call.go -6046-6048: source.go meta.function.receiver.go meta.block.go -6048-6054: source.go meta.function.receiver.go meta.block.go meta.function-call.go support.function.any-method.go -6054-6055: source.go meta.function.receiver.go meta.block.go meta.function-call.go -6055-6057: source.go meta.function.receiver.go meta.block.go -6057-6066: source.go meta.function.receiver.go meta.block.go meta.function-call.go support.function.any-method.go -6066-6067: source.go meta.function.receiver.go meta.block.go meta.function-call.go -6067-6070: source.go meta.function.receiver.go meta.block.go -6070-6071: source.go meta.function.receiver.go meta.block.go constant.numeric.go -6071-6082: source.go meta.function.receiver.go meta.block.go -6082-6083: source.go meta.function.receiver.go meta.block.go meta.block.go punctuation.section.function-block.begin.go -6083-6094: source.go meta.function.receiver.go meta.block.go meta.block.go -6094-6095: source.go meta.function.receiver.go meta.block.go meta.block.go punctuation.section.function-block.end.go -6095-6097: source.go meta.function.receiver.go meta.block.go -6097-6099: source.go meta.function.receiver.go meta.block.go keyword.control.go -6099-6108: source.go meta.function.receiver.go meta.block.go -6108-6109: source.go meta.function.receiver.go meta.block.go meta.block.go punctuation.section.function-block.begin.go -6109-6123: source.go meta.function.receiver.go meta.block.go meta.block.go -6123-6124: source.go meta.function.receiver.go meta.block.go meta.block.go punctuation.section.function-block.end.go -6124-6126: source.go meta.function.receiver.go meta.block.go -6126-6128: source.go meta.function.receiver.go meta.block.go keyword.control.go -6128-6133: source.go meta.function.receiver.go meta.block.go -6133-6134: source.go meta.function.receiver.go meta.block.go constant.numeric.go -6134-6135: source.go meta.function.receiver.go meta.block.go -6135-6136: source.go meta.function.receiver.go meta.block.go meta.block.go punctuation.section.function-block.begin.go -6136-6143: source.go meta.function.receiver.go meta.block.go meta.block.go -6143-6144: source.go meta.function.receiver.go meta.block.go meta.block.go constant.numeric.go -6144-6146: source.go meta.function.receiver.go meta.block.go meta.block.go -6146-6147: source.go meta.function.receiver.go meta.block.go meta.block.go punctuation.section.function-block.end.go -6147-6151: source.go meta.function.receiver.go meta.block.go -6151-6152: source.go meta.function.receiver.go meta.block.go variable.other.dot-access.go -6152-6157: source.go meta.function.receiver.go meta.block.go -6157-6163: source.go meta.function.receiver.go meta.block.go meta.function-call.go support.function.any-method.go -6163-6164: source.go meta.function.receiver.go meta.block.go meta.function-call.go -6164-6166: source.go meta.function.receiver.go meta.block.go -6166-6170: source.go meta.function.receiver.go meta.block.go meta.function-call.go support.function.any-method.go -6170-6171: source.go meta.function.receiver.go meta.block.go meta.function-call.go -6171-6173: source.go meta.function.receiver.go meta.block.go -6173-6179: source.go meta.function.receiver.go meta.block.go meta.function-call.go support.function.any-method.go -6179-6180: source.go meta.function.receiver.go meta.block.go meta.function-call.go -6180-6182: source.go meta.function.receiver.go meta.block.go -6182-6191: source.go meta.function.receiver.go meta.block.go meta.function-call.go support.function.any-method.go -6191-6192: source.go meta.function.receiver.go meta.block.go meta.function-call.go -6192-6195: source.go meta.function.receiver.go meta.block.go -6195-6196: source.go meta.function.receiver.go meta.block.go constant.numeric.go -6196-6199: source.go meta.function.receiver.go meta.block.go -6199-6200: source.go meta.function.receiver.go meta.block.go variable.other.dot-access.go -6200-6204: source.go meta.function.receiver.go meta.block.go -6204-6205: source.go meta.function.receiver.go meta.block.go variable.other.dot-access.go -6205-6210: source.go meta.function.receiver.go meta.block.go -6210-6216: source.go meta.function.receiver.go meta.block.go meta.function-call.go support.function.any-method.go -6216-6217: source.go meta.function.receiver.go meta.block.go meta.function-call.go -6217-6219: source.go meta.function.receiver.go meta.block.go -6219-6223: source.go meta.function.receiver.go meta.block.go meta.function-call.go support.function.any-method.go -6223-6224: source.go meta.function.receiver.go meta.block.go meta.function-call.go -6224-6226: source.go meta.function.receiver.go meta.block.go -6226-6232: source.go meta.function.receiver.go meta.block.go meta.function-call.go support.function.any-method.go -6232-6233: source.go meta.function.receiver.go meta.block.go meta.function-call.go -6233-6235: source.go meta.function.receiver.go meta.block.go -6235-6244: source.go meta.function.receiver.go meta.block.go meta.function-call.go support.function.any-method.go -6244-6245: source.go meta.function.receiver.go meta.block.go meta.function-call.go -6245-6248: source.go meta.function.receiver.go meta.block.go -6248-6249: source.go meta.function.receiver.go meta.block.go constant.numeric.go -6249-6252: source.go meta.function.receiver.go meta.block.go -6252-6253: source.go meta.function.receiver.go meta.block.go variable.other.dot-access.go -6253-6255: source.go meta.function.receiver.go meta.block.go -6255-6261: source.go meta.function.receiver.go meta.block.go keyword.control.go -6261-6264: source.go meta.function.receiver.go meta.block.go -6264-6265: source.go meta.function.receiver.go meta.block.go punctuation.section.function-block.end.go -6265-6267: source.go -6267-6271: source.go meta.function.receiver.go meta.function.receiver.declaration.go keyword.control.go -6271-6272: source.go meta.function.receiver.go meta.function.receiver.declaration.go -6272-6273: source.go meta.function.receiver.go meta.function.receiver.declaration.go entity.name.function.go.full-name -6273-6280: source.go meta.function.receiver.go meta.function.receiver.declaration.go entity.name.function.go.full-name variable.receiver.go -6280-6282: source.go meta.function.receiver.go meta.function.receiver.declaration.go entity.name.function.go.full-name -6282-6286: source.go meta.function.receiver.go meta.function.receiver.declaration.go entity.name.function.go.full-name entity.name.function.go.name -6286-6287: source.go meta.function.receiver.go meta.function.receiver.declaration.go -6287-6323: source.go meta.function.receiver.go meta.function.receiver.declaration.go variable.parameters.go -6323-6325: source.go meta.function.receiver.go meta.function.receiver.declaration.go -6325-6326: source.go meta.function.receiver.go meta.block.go punctuation.section.function-block.begin.go -6326-6330: source.go meta.function.receiver.go meta.block.go -6330-6343: source.go meta.function.receiver.go meta.block.go variable.other.dot-access.go -6343-6351: source.go meta.function.receiver.go meta.block.go -6351-6355: source.go meta.function.receiver.go meta.block.go meta.function-call.go support.function.any-method.go -6355-6356: source.go meta.function.receiver.go meta.block.go meta.function-call.go -6356-6370: source.go meta.function.receiver.go meta.block.go -6370-6376: source.go meta.function.receiver.go meta.block.go variable.other.dot-access.go -6376-6377: source.go meta.function.receiver.go meta.block.go meta.block.go punctuation.section.function-block.begin.go -6377-6379: source.go meta.function.receiver.go meta.block.go meta.block.go -6379-6384: source.go meta.function.receiver.go meta.block.go meta.block.go meta.function-call.go support.function.any-method.go -6384-6385: source.go meta.function.receiver.go meta.block.go meta.block.go meta.function-call.go -6385-6390: source.go meta.function.receiver.go meta.block.go meta.block.go -6390-6396: source.go meta.function.receiver.go meta.block.go meta.block.go meta.function-call.go support.function.any-method.go -6396-6397: source.go meta.function.receiver.go meta.block.go meta.block.go meta.function-call.go -6397-6399: source.go meta.function.receiver.go meta.block.go meta.block.go -6399-6403: source.go meta.function.receiver.go meta.block.go meta.block.go meta.function-call.go support.function.any-method.go -6403-6404: source.go meta.function.receiver.go meta.block.go meta.block.go meta.function-call.go -6404-6405: source.go meta.function.receiver.go meta.block.go meta.block.go -6405-6406: source.go meta.function.receiver.go meta.block.go meta.block.go punctuation.section.function-block.end.go -6406-6408: source.go meta.function.receiver.go meta.block.go -6408-6409: source.go meta.function.receiver.go meta.block.go punctuation.section.function-block.end.go -6409-6411: source.go -6411-6415: source.go meta.function.receiver.go meta.function.receiver.declaration.go keyword.control.go -6415-6416: source.go meta.function.receiver.go meta.function.receiver.declaration.go -6416-6417: source.go meta.function.receiver.go meta.function.receiver.declaration.go entity.name.function.go.full-name -6417-6424: source.go meta.function.receiver.go meta.function.receiver.declaration.go entity.name.function.go.full-name variable.receiver.go -6424-6426: source.go meta.function.receiver.go meta.function.receiver.declaration.go entity.name.function.go.full-name -6426-6439: source.go meta.function.receiver.go meta.function.receiver.declaration.go entity.name.function.go.full-name entity.name.function.go.name -6439-6440: source.go meta.function.receiver.go meta.function.receiver.declaration.go -6440-6455: source.go meta.function.receiver.go meta.function.receiver.declaration.go variable.parameters.go -6455-6457: source.go meta.function.receiver.go meta.function.receiver.declaration.go -6457-6475: source.go meta.function.receiver.go meta.function.receiver.declaration.go variable.return-types.go -6475-6476: source.go meta.function.receiver.go meta.block.go punctuation.section.function-block.begin.go -6476-6478: source.go meta.function.receiver.go meta.block.go -6478-6480: source.go meta.function.receiver.go meta.block.go keyword.control.go -6480-6481: source.go meta.function.receiver.go meta.block.go -6481-6487: source.go meta.function.receiver.go meta.block.go meta.initialization.short.go variable.other.go -6487-6489: source.go meta.function.receiver.go meta.block.go meta.initialization.short.go variable.other.go keyword.operator.initialize.go -6489-6492: source.go meta.function.receiver.go meta.block.go -6492-6505: source.go meta.function.receiver.go meta.block.go variable.other.dot-access.go -6505-6513: source.go meta.function.receiver.go meta.block.go -6513-6514: source.go meta.function.receiver.go meta.block.go meta.block.go punctuation.section.function-block.begin.go -6514-6517: source.go meta.function.receiver.go meta.block.go meta.block.go -6517-6523: source.go meta.function.receiver.go meta.block.go meta.block.go keyword.control.go -6523-6527: source.go meta.function.receiver.go meta.block.go meta.block.go -6527-6528: source.go meta.function.receiver.go meta.block.go meta.block.go punctuation.section.function-block.end.go -6528-6529: source.go meta.function.receiver.go meta.block.go -6529-6533: source.go meta.function.receiver.go meta.block.go keyword.control.go -6533-6534: source.go meta.function.receiver.go meta.block.go -6534-6535: source.go meta.function.receiver.go meta.block.go meta.block.go punctuation.section.function-block.begin.go -6535-6540: source.go meta.function.receiver.go meta.block.go meta.block.go -6540-6544: source.go meta.function.receiver.go meta.block.go meta.block.go meta.function-call.go support.function.any-method.go -6544-6545: source.go meta.function.receiver.go meta.block.go meta.block.go meta.function-call.go -6545-6559: source.go meta.function.receiver.go meta.block.go meta.block.go -6559-6565: source.go meta.function.receiver.go meta.block.go meta.block.go variable.other.dot-access.go -6565-6566: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go punctuation.section.function-block.begin.go -6566-6567: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go constant.numeric.go -6567-6569: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go -6569-6570: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go constant.numeric.go -6570-6571: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go punctuation.section.function-block.end.go -6571-6575: source.go meta.function.receiver.go meta.block.go meta.block.go -6575-6581: source.go meta.function.receiver.go meta.block.go meta.block.go keyword.control.go -6581-6584: source.go meta.function.receiver.go meta.block.go meta.block.go -6584-6597: source.go meta.function.receiver.go meta.block.go meta.block.go variable.other.dot-access.go -6597-6602: source.go meta.function.receiver.go meta.block.go meta.block.go -6602-6603: source.go meta.function.receiver.go meta.block.go meta.block.go punctuation.section.function-block.end.go -6603-6604: source.go meta.function.receiver.go meta.block.go -6604-6605: source.go meta.function.receiver.go meta.block.go punctuation.section.function-block.end.go -6605-6607: source.go -6607-6611: source.go meta.function.receiver.go meta.function.receiver.declaration.go keyword.control.go -6611-6612: source.go meta.function.receiver.go meta.function.receiver.declaration.go -6612-6613: source.go meta.function.receiver.go meta.function.receiver.declaration.go entity.name.function.go.full-name -6613-6620: source.go meta.function.receiver.go meta.function.receiver.declaration.go entity.name.function.go.full-name variable.receiver.go -6620-6622: source.go meta.function.receiver.go meta.function.receiver.declaration.go entity.name.function.go.full-name -6622-6635: source.go meta.function.receiver.go meta.function.receiver.declaration.go entity.name.function.go.full-name entity.name.function.go.name -6635-6636: source.go meta.function.receiver.go meta.function.receiver.declaration.go -6636-6646: source.go meta.function.receiver.go meta.function.receiver.declaration.go variable.parameters.go -6646-6648: source.go meta.function.receiver.go meta.function.receiver.declaration.go -6648-6649: source.go meta.function.receiver.go meta.block.go punctuation.section.function-block.begin.go -6649-6653: source.go meta.function.receiver.go meta.block.go -6653-6667: source.go meta.function.receiver.go meta.block.go variable.other.dot-access.go -6667-6674: source.go meta.function.receiver.go meta.block.go -6674-6675: source.go meta.function.receiver.go meta.block.go punctuation.section.function-block.end.go -6675-6677: source.go -6677-6681: source.go meta.function.receiver.go meta.function.receiver.declaration.go keyword.control.go -6681-6682: source.go meta.function.receiver.go meta.function.receiver.declaration.go -6682-6683: source.go meta.function.receiver.go meta.function.receiver.declaration.go entity.name.function.go.full-name -6683-6690: source.go meta.function.receiver.go meta.function.receiver.declaration.go entity.name.function.go.full-name variable.receiver.go -6690-6692: source.go meta.function.receiver.go meta.function.receiver.declaration.go entity.name.function.go.full-name -6692-6704: source.go meta.function.receiver.go meta.function.receiver.declaration.go entity.name.function.go.full-name entity.name.function.go.name -6704-6705: source.go meta.function.receiver.go meta.function.receiver.declaration.go -6705-6715: source.go meta.function.receiver.go meta.function.receiver.declaration.go variable.parameters.go -6715-6717: source.go meta.function.receiver.go meta.function.receiver.declaration.go -6717-6718: source.go meta.function.receiver.go meta.block.go punctuation.section.function-block.begin.go -6718-6727: source.go meta.function.receiver.go meta.block.go -6727-6732: source.go meta.function.receiver.go meta.block.go meta.function-call.go support.function.any-method.go -6732-6733: source.go meta.function.receiver.go meta.block.go meta.function-call.go -6733-6738: source.go meta.function.receiver.go meta.block.go -6738-6739: source.go meta.function.receiver.go meta.block.go punctuation.section.function-block.end.go -6739-6741: source.go -6741-6743: source.go comment.line.double-slash.go punctuation.definition.comment.go -6743-6776: source.go comment.line.double-slash.go -6776-6780: source.go meta.function.receiver.go meta.function.receiver.declaration.go keyword.control.go -6780-6781: source.go meta.function.receiver.go meta.function.receiver.declaration.go -6781-6782: source.go meta.function.receiver.go meta.function.receiver.declaration.go entity.name.function.go.full-name -6782-6789: source.go meta.function.receiver.go meta.function.receiver.declaration.go entity.name.function.go.full-name variable.receiver.go -6789-6791: source.go meta.function.receiver.go meta.function.receiver.declaration.go entity.name.function.go.full-name -6791-6804: source.go meta.function.receiver.go meta.function.receiver.declaration.go entity.name.function.go.full-name entity.name.function.go.name -6804-6805: source.go meta.function.receiver.go meta.function.receiver.declaration.go -6805-6815: source.go meta.function.receiver.go meta.function.receiver.declaration.go variable.parameters.go -6815-6817: source.go meta.function.receiver.go meta.function.receiver.declaration.go -6817-6818: source.go meta.function.receiver.go meta.block.go punctuation.section.function-block.begin.go -6818-6827: source.go meta.function.receiver.go meta.block.go -6827-6831: source.go meta.function.receiver.go meta.block.go meta.function-call.go support.function.any-method.go -6831-6832: source.go meta.function.receiver.go meta.block.go meta.function-call.go -6832-6837: source.go meta.function.receiver.go meta.block.go -6837-6838: source.go meta.function.receiver.go meta.block.go punctuation.section.function-block.end.go -6838-6840: source.go -6840-6842: source.go comment.line.double-slash.go punctuation.definition.comment.go -6842-6875: source.go comment.line.double-slash.go -6875-6879: source.go meta.function.receiver.go meta.function.receiver.declaration.go keyword.control.go -6879-6880: source.go meta.function.receiver.go meta.function.receiver.declaration.go -6880-6881: source.go meta.function.receiver.go meta.function.receiver.declaration.go entity.name.function.go.full-name -6881-6888: source.go meta.function.receiver.go meta.function.receiver.declaration.go entity.name.function.go.full-name variable.receiver.go -6888-6890: source.go meta.function.receiver.go meta.function.receiver.declaration.go entity.name.function.go.full-name -6890-6904: source.go meta.function.receiver.go meta.function.receiver.declaration.go entity.name.function.go.full-name entity.name.function.go.name -6904-6905: source.go meta.function.receiver.go meta.function.receiver.declaration.go -6905-6919: source.go meta.function.receiver.go meta.function.receiver.declaration.go variable.parameters.go -6919-6921: source.go meta.function.receiver.go meta.function.receiver.declaration.go -6921-6922: source.go meta.function.receiver.go meta.block.go punctuation.section.function-block.begin.go -6922-6931: source.go meta.function.receiver.go meta.block.go -6931-6935: source.go meta.function.receiver.go meta.block.go meta.function-call.go support.function.any-method.go -6935-6936: source.go meta.function.receiver.go meta.block.go meta.function-call.go -6936-6945: source.go meta.function.receiver.go meta.block.go -6945-6946: source.go meta.function.receiver.go meta.block.go punctuation.section.function-block.end.go -6946-6948: source.go -6948-6952: source.go meta.function.receiver.go meta.function.receiver.declaration.go keyword.control.go -6952-6953: source.go meta.function.receiver.go meta.function.receiver.declaration.go -6953-6954: source.go meta.function.receiver.go meta.function.receiver.declaration.go entity.name.function.go.full-name -6954-6961: source.go meta.function.receiver.go meta.function.receiver.declaration.go entity.name.function.go.full-name variable.receiver.go -6961-6963: source.go meta.function.receiver.go meta.function.receiver.declaration.go entity.name.function.go.full-name -6963-6969: source.go meta.function.receiver.go meta.function.receiver.declaration.go entity.name.function.go.full-name entity.name.function.go.name -6969-6970: source.go meta.function.receiver.go meta.function.receiver.declaration.go -6970-7006: source.go meta.function.receiver.go meta.function.receiver.declaration.go variable.parameters.go -7006-7008: source.go meta.function.receiver.go meta.function.receiver.declaration.go -7008-7009: source.go meta.function.receiver.go meta.block.go punctuation.section.function-block.begin.go -7009-7013: source.go meta.function.receiver.go meta.block.go -7013-7017: source.go meta.function.receiver.go meta.block.go meta.function-call.go support.function.any-method.go -7017-7018: source.go meta.function.receiver.go meta.block.go meta.function-call.go -7018-7026: source.go meta.function.receiver.go meta.block.go -7026-7035: source.go meta.function.receiver.go meta.block.go meta.function-call.go support.function.any-method.go -7035-7036: source.go meta.function.receiver.go meta.block.go meta.function-call.go -7036-7038: source.go meta.function.receiver.go meta.block.go -7038-7045: source.go meta.function.receiver.go meta.block.go meta.function-call.go support.function.any-method.go -7045-7046: source.go meta.function.receiver.go meta.block.go meta.function-call.go -7046-7060: source.go meta.function.receiver.go meta.block.go -7060-7066: source.go meta.function.receiver.go meta.block.go variable.other.dot-access.go -7066-7067: source.go meta.function.receiver.go meta.block.go meta.block.go punctuation.section.function-block.begin.go -7067-7069: source.go meta.function.receiver.go meta.block.go meta.block.go -7069-7073: source.go meta.function.receiver.go meta.block.go meta.block.go meta.function-call.go support.function.any-method.go -7073-7074: source.go meta.function.receiver.go meta.block.go meta.block.go meta.function-call.go -7074-7079: source.go meta.function.receiver.go meta.block.go meta.block.go -7079-7083: source.go meta.function.receiver.go meta.block.go meta.block.go meta.function-call.go support.function.any-method.go -7083-7084: source.go meta.function.receiver.go meta.block.go meta.block.go meta.function-call.go -7084-7085: source.go meta.function.receiver.go meta.block.go meta.block.go -7085-7086: source.go meta.function.receiver.go meta.block.go meta.block.go punctuation.section.function-block.end.go -7086-7088: source.go meta.function.receiver.go meta.block.go -7088-7089: source.go meta.function.receiver.go meta.block.go punctuation.section.function-block.end.go -7089-7091: source.go -7091-7095: source.go meta.function.receiver.go meta.function.receiver.declaration.go keyword.control.go -7095-7096: source.go meta.function.receiver.go meta.function.receiver.declaration.go -7096-7097: source.go meta.function.receiver.go meta.function.receiver.declaration.go entity.name.function.go.full-name -7097-7104: source.go meta.function.receiver.go meta.function.receiver.declaration.go entity.name.function.go.full-name variable.receiver.go -7104-7106: source.go meta.function.receiver.go meta.function.receiver.declaration.go entity.name.function.go.full-name -7106-7110: source.go meta.function.receiver.go meta.function.receiver.declaration.go entity.name.function.go.full-name entity.name.function.go.name -7110-7113: source.go meta.function.receiver.go meta.function.receiver.declaration.go -7113-7114: source.go meta.function.receiver.go meta.block.go punctuation.section.function-block.begin.go -7114-7116: source.go meta.function.receiver.go meta.block.go -7116-7119: source.go meta.function.receiver.go meta.block.go meta.initialization.short.go variable.other.go -7119-7121: source.go meta.function.receiver.go meta.block.go meta.initialization.short.go variable.other.go keyword.operator.initialize.go -7121-7130: source.go meta.function.receiver.go meta.block.go -7130-7139: source.go meta.function.receiver.go meta.block.go meta.function-call.go support.function.any-method.go -7139-7140: source.go meta.function.receiver.go meta.block.go meta.function-call.go -7140-7146: source.go meta.function.receiver.go meta.block.go -7146-7157: source.go meta.function.receiver.go meta.block.go meta.function-call.go support.function.any-method.go -7157-7158: source.go meta.function.receiver.go meta.block.go meta.function-call.go -7158-7161: source.go meta.function.receiver.go meta.block.go -7161-7162: source.go meta.function.receiver.go meta.block.go punctuation.whitespace.comment.leading.go -7162-7164: source.go meta.function.receiver.go meta.block.go comment.line.double-slash.go punctuation.definition.comment.go -7164-7182: source.go meta.function.receiver.go meta.block.go comment.line.double-slash.go -7182-7183: source.go meta.function.receiver.go meta.block.go punctuation.whitespace.comment.leading.go -7183-7185: source.go meta.function.receiver.go meta.block.go comment.line.double-slash.go punctuation.definition.comment.go -7185-7206: source.go meta.function.receiver.go meta.block.go comment.line.double-slash.go -7206-7207: source.go meta.function.receiver.go meta.block.go -7207-7209: source.go meta.function.receiver.go meta.block.go meta.initialization.short.go variable.other.go -7209-7211: source.go meta.function.receiver.go meta.block.go meta.initialization.short.go variable.other.go keyword.operator.initialize.go -7211-7215: source.go meta.function.receiver.go meta.block.go -7215-7222: source.go meta.function.receiver.go meta.block.go meta.function-call.go support.function.any-method.go -7222-7223: source.go meta.function.receiver.go meta.block.go meta.function-call.go -7223-7224: source.go meta.function.receiver.go meta.block.go -7224-7226: source.go meta.function.receiver.go meta.block.go meta.function-call.go punctuation.whitespace.function-call.leading.go -7226-7229: source.go meta.function.receiver.go meta.block.go meta.function-call.go support.function.any-method.go -7229-7231: source.go meta.function.receiver.go meta.block.go meta.function-call.go -7231-7250: source.go meta.function.receiver.go meta.block.go -7250-7255: source.go meta.function.receiver.go meta.block.go variable.other.dot-access.go -7255-7261: source.go meta.function.receiver.go meta.block.go -7261-7263: source.go meta.function.receiver.go meta.block.go keyword.control.go -7263-7264: source.go meta.function.receiver.go meta.block.go -7264-7271: source.go meta.function.receiver.go meta.block.go meta.initialization.short.go variable.other.go -7271-7273: source.go meta.function.receiver.go meta.block.go meta.initialization.short.go variable.other.go keyword.operator.initialize.go -7273-7281: source.go meta.function.receiver.go meta.block.go -7281-7289: source.go meta.function.receiver.go meta.block.go meta.function-call.go support.function.any-method.go -7289-7290: source.go meta.function.receiver.go meta.block.go meta.function-call.go -7290-7291: source.go meta.function.receiver.go meta.block.go string.quoted.double.go punctuation.definition.string.begin.go -7291-7349: source.go meta.function.receiver.go meta.block.go string.quoted.double.go -7349-7350: source.go meta.function.receiver.go meta.block.go string.quoted.double.go punctuation.definition.string.end.go -7350-7360: source.go meta.function.receiver.go meta.block.go -7360-7363: source.go meta.function.receiver.go meta.block.go constant.language.go -7363-7364: source.go meta.function.receiver.go meta.block.go -7364-7365: source.go meta.function.receiver.go meta.block.go meta.block.go punctuation.section.function-block.begin.go -7365-7375: source.go meta.function.receiver.go meta.block.go meta.block.go -7375-7380: source.go meta.function.receiver.go meta.block.go meta.block.go meta.function-call.go support.function.any-method.go -7380-7381: source.go meta.function.receiver.go meta.block.go meta.block.go meta.function-call.go -7381-7382: source.go meta.function.receiver.go meta.block.go meta.block.go string.quoted.double.go punctuation.definition.string.begin.go -7382-7421: source.go meta.function.receiver.go meta.block.go meta.block.go string.quoted.double.go -7421-7423: source.go meta.function.receiver.go meta.block.go meta.block.go string.quoted.double.go constant.other.placeholder.go -7423-7424: source.go meta.function.receiver.go meta.block.go meta.block.go string.quoted.double.go punctuation.definition.string.end.go -7424-7432: source.go meta.function.receiver.go meta.block.go meta.block.go -7432-7433: source.go meta.function.receiver.go meta.block.go meta.block.go punctuation.section.function-block.end.go -7433-7434: source.go meta.function.receiver.go meta.block.go -7434-7438: source.go meta.function.receiver.go meta.block.go keyword.control.go -7438-7439: source.go meta.function.receiver.go meta.block.go -7439-7441: source.go meta.function.receiver.go meta.block.go keyword.control.go -7441-7442: source.go meta.function.receiver.go meta.block.go -7442-7446: source.go meta.function.receiver.go meta.block.go meta.initialization.short.go variable.other.go -7446-7448: source.go meta.function.receiver.go meta.block.go meta.initialization.short.go variable.other.go keyword.operator.initialize.go -7448-7457: source.go meta.function.receiver.go meta.block.go -7457-7466: source.go meta.function.receiver.go meta.block.go meta.function-call.go support.function.any-method.go -7466-7467: source.go meta.function.receiver.go meta.block.go meta.function-call.go -7467-7487: source.go meta.function.receiver.go meta.block.go -7487-7490: source.go meta.function.receiver.go meta.block.go constant.language.go -7490-7491: source.go meta.function.receiver.go meta.block.go -7491-7492: source.go meta.function.receiver.go meta.block.go meta.block.go punctuation.section.function-block.begin.go -7492-7502: source.go meta.function.receiver.go meta.block.go meta.block.go -7502-7507: source.go meta.function.receiver.go meta.block.go meta.block.go meta.function-call.go support.function.any-method.go -7507-7508: source.go meta.function.receiver.go meta.block.go meta.block.go meta.function-call.go -7508-7509: source.go meta.function.receiver.go meta.block.go meta.block.go string.quoted.double.go punctuation.definition.string.begin.go -7509-7548: source.go meta.function.receiver.go meta.block.go meta.block.go string.quoted.double.go -7548-7550: source.go meta.function.receiver.go meta.block.go meta.block.go string.quoted.double.go constant.other.placeholder.go -7550-7551: source.go meta.function.receiver.go meta.block.go meta.block.go string.quoted.double.go punctuation.definition.string.end.go -7551-7559: source.go meta.function.receiver.go meta.block.go meta.block.go -7559-7560: source.go meta.function.receiver.go meta.block.go meta.block.go punctuation.section.function-block.end.go -7560-7563: source.go meta.function.receiver.go meta.block.go meta.function-call.go punctuation.whitespace.function-call.leading.go -7563-7566: source.go meta.function.receiver.go meta.block.go meta.function-call.go support.function.any-method.go -7566-7568: source.go meta.function.receiver.go meta.block.go meta.function-call.go -7568-7578: source.go meta.function.receiver.go meta.block.go -7578-7579: source.go meta.function.receiver.go meta.block.go meta.function-call.go punctuation.whitespace.function-call.leading.go -7579-7583: source.go meta.function.receiver.go meta.block.go meta.function-call.go support.function.any-method.go -7583-7584: source.go meta.function.receiver.go meta.block.go meta.function-call.go -7584-7597: source.go meta.function.receiver.go meta.block.go -7597-7602: source.go meta.function.receiver.go meta.block.go variable.other.dot-access.go -7602-7612: source.go meta.function.receiver.go meta.block.go -7612-7621: source.go meta.function.receiver.go meta.block.go variable.other.dot-access.go -7621-7633: source.go meta.function.receiver.go meta.block.go -7633-7634: source.go meta.function.receiver.go meta.block.go punctuation.whitespace.support.function.leading.go -7634-7638: source.go meta.function.receiver.go meta.block.go support.function.builtin.go -7638-7639: source.go meta.function.receiver.go meta.block.go meta.parens.go punctuation.section.parens.begin.go -7639-7649: source.go meta.function.receiver.go meta.block.go meta.parens.go -7649-7652: source.go meta.function.receiver.go meta.block.go meta.parens.go variable.other.dot-access.go -7652-7654: source.go meta.function.receiver.go meta.block.go meta.parens.go -7654-7655: source.go meta.function.receiver.go meta.block.go meta.parens.go constant.numeric.go -7655-7657: source.go meta.function.receiver.go meta.block.go meta.parens.go -7657-7660: source.go meta.function.receiver.go meta.block.go meta.parens.go constant.numeric.go -7660-7661: source.go meta.function.receiver.go meta.block.go meta.parens.go punctuation.section.parens.end.go -7661-7672: source.go meta.function.receiver.go meta.block.go -7672-7676: source.go meta.function.receiver.go meta.block.go storage.type.go -7676-7682: source.go meta.function.receiver.go meta.block.go -7682-7684: source.go meta.function.receiver.go meta.block.go keyword.control.go -7684-7685: source.go meta.function.receiver.go meta.block.go -7685-7689: source.go meta.function.receiver.go meta.block.go meta.initialization.short.go variable.other.go -7689-7691: source.go meta.function.receiver.go meta.block.go meta.initialization.short.go variable.other.go keyword.operator.initialize.go -7691-7700: source.go meta.function.receiver.go meta.block.go -7700-7712: source.go meta.function.receiver.go meta.block.go meta.function-call.go support.function.any-method.go -7712-7713: source.go meta.function.receiver.go meta.block.go meta.function-call.go -7713-7721: source.go meta.function.receiver.go meta.block.go -7721-7733: source.go meta.function.receiver.go meta.block.go variable.other.dot-access.go -7733-7743: source.go meta.function.receiver.go meta.block.go -7743-7746: source.go meta.function.receiver.go meta.block.go constant.language.go -7746-7747: source.go meta.function.receiver.go meta.block.go -7747-7748: source.go meta.function.receiver.go meta.block.go meta.block.go punctuation.section.function-block.begin.go -7748-7758: source.go meta.function.receiver.go meta.block.go meta.block.go -7758-7763: source.go meta.function.receiver.go meta.block.go meta.block.go meta.function-call.go support.function.any-method.go -7763-7764: source.go meta.function.receiver.go meta.block.go meta.block.go meta.function-call.go -7764-7765: source.go meta.function.receiver.go meta.block.go meta.block.go string.quoted.double.go punctuation.definition.string.begin.go -7765-7795: source.go meta.function.receiver.go meta.block.go meta.block.go string.quoted.double.go -7795-7797: source.go meta.function.receiver.go meta.block.go meta.block.go string.quoted.double.go constant.other.placeholder.go -7797-7798: source.go meta.function.receiver.go meta.block.go meta.block.go string.quoted.double.go punctuation.definition.string.end.go -7798-7806: source.go meta.function.receiver.go meta.block.go meta.block.go -7806-7807: source.go meta.function.receiver.go meta.block.go meta.block.go punctuation.section.function-block.end.go -7807-7808: source.go meta.function.receiver.go meta.block.go -7808-7812: source.go meta.function.receiver.go meta.block.go keyword.control.go -7812-7813: source.go meta.function.receiver.go meta.block.go -7813-7814: source.go meta.function.receiver.go meta.block.go meta.block.go punctuation.section.function-block.begin.go -7814-7824: source.go meta.function.receiver.go meta.block.go meta.block.go -7824-7829: source.go meta.function.receiver.go meta.block.go meta.block.go meta.function-call.go support.function.any-method.go -7829-7830: source.go meta.function.receiver.go meta.block.go meta.block.go meta.function-call.go -7830-7831: source.go meta.function.receiver.go meta.block.go meta.block.go string.quoted.double.go punctuation.definition.string.begin.go -7831-7851: source.go meta.function.receiver.go meta.block.go meta.block.go string.quoted.double.go -7851-7852: source.go meta.function.receiver.go meta.block.go meta.block.go string.quoted.double.go punctuation.definition.string.end.go -7852-7866: source.go meta.function.receiver.go meta.block.go meta.block.go -7866-7870: source.go meta.function.receiver.go meta.block.go meta.block.go constant.language.go -7870-7872: source.go meta.function.receiver.go meta.block.go meta.block.go -7872-7873: source.go meta.function.receiver.go meta.block.go meta.block.go punctuation.section.function-block.end.go -7873-7876: source.go meta.function.receiver.go meta.block.go -7876-7878: source.go meta.function.receiver.go meta.block.go keyword.control.go -7878-7888: source.go meta.function.receiver.go meta.block.go -7888-7889: source.go meta.function.receiver.go meta.block.go meta.block.go punctuation.section.function-block.begin.go -7889-7903: source.go meta.function.receiver.go meta.block.go meta.block.go -7903-7905: source.go meta.function.receiver.go meta.block.go meta.block.go constant.numeric.go -7905-7907: source.go meta.function.receiver.go meta.block.go meta.block.go -7907-7909: source.go meta.function.receiver.go meta.block.go meta.block.go comment.line.double-slash.go punctuation.definition.comment.go -7909-7936: source.go meta.function.receiver.go meta.block.go meta.block.go comment.line.double-slash.go -7936-7950: source.go meta.function.receiver.go meta.block.go meta.block.go -7950-7960: source.go meta.function.receiver.go meta.block.go meta.block.go variable.other.dot-access.go -7960-7972: source.go meta.function.receiver.go meta.block.go meta.block.go -7972-7975: source.go meta.function.receiver.go meta.block.go meta.block.go variable.other.dot-access.go -7975-7976: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go punctuation.section.function-block.begin.go -7976-7977: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go constant.numeric.go -7977-7979: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go -7979-7980: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go constant.numeric.go -7980-7982: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go -7982-7983: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go constant.numeric.go -7983-7984: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go punctuation.section.function-block.end.go -7984-7999: source.go meta.function.receiver.go meta.block.go meta.block.go -7999-8009: source.go meta.function.receiver.go meta.block.go meta.block.go variable.other.dot-access.go -8009-8021: source.go meta.function.receiver.go meta.block.go meta.block.go -8021-8024: source.go meta.function.receiver.go meta.block.go meta.block.go variable.other.dot-access.go -8024-8025: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go punctuation.section.function-block.begin.go -8025-8028: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go constant.numeric.go -8028-8030: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go -8030-8033: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go constant.numeric.go -8033-8035: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go -8035-8038: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go constant.numeric.go -8038-8039: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go punctuation.section.function-block.end.go -8039-8054: source.go meta.function.receiver.go meta.block.go meta.block.go -8054-8062: source.go meta.function.receiver.go meta.block.go meta.block.go variable.other.dot-access.go -8062-8074: source.go meta.function.receiver.go meta.block.go meta.block.go -8074-8077: source.go meta.function.receiver.go meta.block.go meta.block.go variable.other.dot-access.go -8077-8078: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go punctuation.section.function-block.begin.go -8078-8081: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go constant.numeric.go -8081-8083: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go -8083-8084: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go constant.numeric.go -8084-8086: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go -8086-8087: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go constant.numeric.go -8087-8088: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go punctuation.section.function-block.end.go -8088-8103: source.go meta.function.receiver.go meta.block.go meta.block.go -8103-8113: source.go meta.function.receiver.go meta.block.go meta.block.go variable.other.dot-access.go -8113-8125: source.go meta.function.receiver.go meta.block.go meta.block.go -8125-8128: source.go meta.function.receiver.go meta.block.go meta.block.go variable.other.dot-access.go -8128-8129: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go punctuation.section.function-block.begin.go -8129-8130: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go constant.numeric.go -8130-8132: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go -8132-8135: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go constant.numeric.go -8135-8137: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go -8137-8138: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go constant.numeric.go -8138-8139: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go punctuation.section.function-block.end.go -8139-8154: source.go meta.function.receiver.go meta.block.go meta.block.go -8154-8163: source.go meta.function.receiver.go meta.block.go meta.block.go variable.other.dot-access.go -8163-8175: source.go meta.function.receiver.go meta.block.go meta.block.go -8175-8178: source.go meta.function.receiver.go meta.block.go meta.block.go variable.other.dot-access.go -8178-8179: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go punctuation.section.function-block.begin.go -8179-8180: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go constant.numeric.go -8180-8182: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go -8182-8183: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go constant.numeric.go -8183-8185: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go -8185-8188: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go constant.numeric.go -8188-8189: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go punctuation.section.function-block.end.go -8189-8204: source.go meta.function.receiver.go meta.block.go meta.block.go -8204-8216: source.go meta.function.receiver.go meta.block.go meta.block.go variable.other.dot-access.go -8216-8228: source.go meta.function.receiver.go meta.block.go meta.block.go -8228-8231: source.go meta.function.receiver.go meta.block.go meta.block.go variable.other.dot-access.go -8231-8232: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go punctuation.section.function-block.begin.go -8232-8235: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go constant.numeric.go -8235-8237: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go -8237-8238: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go constant.numeric.go -8238-8240: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go -8240-8243: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go constant.numeric.go -8243-8244: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go punctuation.section.function-block.end.go -8244-8259: source.go meta.function.receiver.go meta.block.go meta.block.go -8259-8270: source.go meta.function.receiver.go meta.block.go meta.block.go variable.other.dot-access.go -8270-8282: source.go meta.function.receiver.go meta.block.go meta.block.go -8282-8285: source.go meta.function.receiver.go meta.block.go meta.block.go variable.other.dot-access.go -8285-8286: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go punctuation.section.function-block.begin.go -8286-8289: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go constant.numeric.go -8289-8291: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go -8291-8294: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go constant.numeric.go -8294-8296: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go -8296-8297: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go constant.numeric.go -8297-8298: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go punctuation.section.function-block.end.go -8298-8313: source.go meta.function.receiver.go meta.block.go meta.block.go -8313-8322: source.go meta.function.receiver.go meta.block.go meta.block.go variable.other.dot-access.go -8322-8334: source.go meta.function.receiver.go meta.block.go meta.block.go -8334-8337: source.go meta.function.receiver.go meta.block.go meta.block.go variable.other.dot-access.go -8337-8338: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go punctuation.section.function-block.begin.go -8338-8339: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go constant.numeric.go -8339-8341: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go -8341-8344: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go constant.numeric.go -8344-8346: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go -8346-8349: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go constant.numeric.go -8349-8350: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go punctuation.section.function-block.end.go -8350-8354: source.go meta.function.receiver.go meta.block.go meta.block.go -8354-8359: source.go meta.function.receiver.go meta.block.go meta.block.go meta.initialization.short.go variable.other.go -8359-8361: source.go meta.function.receiver.go meta.block.go meta.block.go meta.initialization.short.go variable.other.go keyword.operator.initialize.go -8361-8362: source.go meta.function.receiver.go meta.block.go meta.block.go meta.function-call.go punctuation.whitespace.function-call.leading.go -8362-8366: source.go meta.function.receiver.go meta.block.go meta.block.go meta.function-call.go support.function.any-method.go -8366-8367: source.go meta.function.receiver.go meta.block.go meta.block.go meta.function-call.go -8367-8372: source.go meta.function.receiver.go meta.block.go meta.block.go -8372-8376: source.go meta.function.receiver.go meta.block.go meta.block.go storage.type.go -8376-8378: source.go meta.function.receiver.go meta.block.go meta.block.go -8378-8381: source.go meta.function.receiver.go meta.block.go meta.block.go storage.type.go -8381-8382: source.go meta.function.receiver.go meta.block.go meta.block.go -8382-8383: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go punctuation.section.function-block.begin.go -8383-8387: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go -8387-8389: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.initialization.short.go variable.other.go -8389-8391: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.initialization.short.go variable.other.go keyword.operator.initialize.go -8391-8392: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.function-call.go punctuation.whitespace.function-call.leading.go -8392-8395: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.function-call.go support.function.any-method.go -8395-8396: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.function-call.go -8396-8400: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go -8400-8401: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.function-call.go punctuation.whitespace.function-call.leading.go -8401-8404: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.function-call.go support.function.any-method.go -8404-8405: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.function-call.go -8405-8411: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go -8411-8413: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go keyword.control.go -8413-8418: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go -8418-8419: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go constant.numeric.go -8419-8420: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go -8420-8421: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go punctuation.section.function-block.begin.go -8421-8426: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go -8426-8432: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go keyword.control.go -8432-8439: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go -8439-8440: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go punctuation.section.function-block.end.go -8440-8444: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go -8444-8450: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go keyword.control.go -8450-8455: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go -8455-8456: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go punctuation.section.function-block.end.go -8456-8467: source.go meta.function.receiver.go meta.block.go meta.block.go -8467-8468: source.go meta.function.receiver.go meta.block.go meta.block.go meta.function-call.go punctuation.whitespace.function-call.leading.go -8468-8472: source.go meta.function.receiver.go meta.block.go meta.block.go meta.function-call.go support.function.any-method.go -8472-8473: source.go meta.function.receiver.go meta.block.go meta.block.go meta.function-call.go -8473-8486: source.go meta.function.receiver.go meta.block.go meta.block.go -8486-8491: source.go meta.function.receiver.go meta.block.go meta.block.go variable.other.dot-access.go -8491-8501: source.go meta.function.receiver.go meta.block.go meta.block.go -8501-8510: source.go meta.function.receiver.go meta.block.go meta.block.go variable.other.dot-access.go -8510-8511: source.go meta.function.receiver.go meta.block.go meta.block.go -8511-8512: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go punctuation.section.function-block.begin.go -8512-8516: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go -8516-8524: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.initialization.short.go variable.other.go -8524-8526: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.initialization.short.go variable.other.go keyword.operator.initialize.go -8526-8527: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go -8527-8535: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go constant.numeric.go -8535-8539: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go -8539-8544: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.initialization.short.go variable.other.go -8544-8546: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.initialization.short.go variable.other.go keyword.operator.initialize.go -8546-8547: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go -8547-8548: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go constant.numeric.go -8548-8552: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go -8552-8555: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go keyword.control.go -8555-8556: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go -8556-8561: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.initialization.short.go variable.other.go -8561-8563: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.initialization.short.go variable.other.go keyword.operator.initialize.go -8563-8564: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go -8564-8569: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go keyword.control.go -8569-8574: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go -8574-8575: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go punctuation.section.function-block.begin.go -8575-8580: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go -8580-8582: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go keyword.control.go -8582-8583: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go -8583-8588: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go meta.initialization.short.go variable.other.go -8588-8590: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go meta.initialization.short.go variable.other.go keyword.operator.initialize.go -8590-8591: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go meta.function-call.go punctuation.whitespace.function-call.leading.go -8591-8595: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go meta.function-call.go support.function.any-method.go -8595-8596: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go meta.function-call.go -8596-8598: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go -8598-8599: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go variable.other.dot-access.go -8599-8605: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go -8605-8606: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go variable.other.dot-access.go -8606-8609: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go -8609-8610: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go meta.function-call.go punctuation.whitespace.function-call.leading.go -8610-8614: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go meta.function-call.go support.function.any-method.go -8614-8615: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go meta.function-call.go -8615-8617: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go -8617-8618: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go variable.other.dot-access.go -8618-8624: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go -8624-8625: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go variable.other.dot-access.go -8625-8628: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go -8628-8629: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go meta.function-call.go punctuation.whitespace.function-call.leading.go -8629-8633: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go meta.function-call.go support.function.any-method.go -8633-8634: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go meta.function-call.go -8634-8636: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go -8636-8637: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go variable.other.dot-access.go -8637-8643: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go -8643-8644: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go variable.other.dot-access.go -8644-8662: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go -8662-8663: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go meta.block.go punctuation.section.function-block.begin.go -8663-8702: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go meta.block.go -8702-8703: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go meta.block.go punctuation.section.function-block.end.go -8703-8707: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go -8707-8708: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go punctuation.section.function-block.end.go -8708-8712: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go -8712-8718: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go keyword.control.go -8718-8727: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go -8727-8736: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.function-call.go support.function.any-method.go -8736-8737: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.function-call.go -8737-8745: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go -8745-8746: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go punctuation.section.function-block.end.go -8746-8748: source.go meta.function.receiver.go meta.block.go meta.block.go -8748-8749: source.go meta.function.receiver.go meta.block.go meta.block.go punctuation.section.function-block.end.go -8749-8750: source.go meta.function.receiver.go meta.block.go -8750-8754: source.go meta.function.receiver.go meta.block.go keyword.control.go -8754-8755: source.go meta.function.receiver.go meta.block.go -8755-8756: source.go meta.function.receiver.go meta.block.go meta.block.go punctuation.section.function-block.begin.go -8756-8767: source.go meta.function.receiver.go meta.block.go meta.block.go -8767-8768: source.go meta.function.receiver.go meta.block.go meta.block.go meta.function-call.go punctuation.whitespace.function-call.leading.go -8768-8772: source.go meta.function.receiver.go meta.block.go meta.block.go meta.function-call.go support.function.any-method.go -8772-8773: source.go meta.function.receiver.go meta.block.go meta.block.go meta.function-call.go -8773-8786: source.go meta.function.receiver.go meta.block.go meta.block.go -8786-8791: source.go meta.function.receiver.go meta.block.go meta.block.go variable.other.dot-access.go -8791-8801: source.go meta.function.receiver.go meta.block.go meta.block.go -8801-8810: source.go meta.function.receiver.go meta.block.go meta.block.go variable.other.dot-access.go -8810-8811: source.go meta.function.receiver.go meta.block.go meta.block.go -8811-8812: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go punctuation.section.function-block.begin.go -8812-8816: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go -8816-8819: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.initialization.short.go variable.other.go -8819-8821: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.initialization.short.go variable.other.go keyword.operator.initialize.go -8821-8830: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go -8830-8833: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go variable.other.dot-access.go -8833-8834: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go punctuation.section.function-block.begin.go -8834-8838: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go -8838-8839: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go variable.other.dot-access.go -8839-8845: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go -8845-8846: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go variable.other.dot-access.go -8846-8852: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go -8852-8853: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go variable.other.dot-access.go -8853-8854: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go punctuation.section.function-block.end.go -8854-8858: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go -8858-8861: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go keyword.control.go -8861-8862: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go -8862-8867: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.initialization.short.go variable.other.go -8867-8869: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.initialization.short.go variable.other.go keyword.operator.initialize.go -8869-8870: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go -8870-8875: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go keyword.control.go -8875-8880: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go -8880-8881: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go punctuation.section.function-block.begin.go -8881-8886: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go -8886-8888: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go keyword.control.go -8888-8897: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go -8897-8898: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go meta.block.go punctuation.section.function-block.begin.go -8898-8904: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go meta.block.go -8904-8910: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go meta.block.go keyword.control.go -8910-8919: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go meta.block.go -8919-8928: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go meta.block.go meta.function-call.go support.function.any-method.go -8928-8929: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go meta.block.go meta.function-call.go -8929-8936: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go meta.block.go -8936-8937: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go meta.block.go punctuation.section.function-block.end.go -8937-8941: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go -8941-8942: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go punctuation.section.function-block.end.go -8942-8946: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go -8946-8948: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.initialization.short.go variable.other.go -8948-8950: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.initialization.short.go variable.other.go keyword.operator.initialize.go -8950-8951: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go punctuation.whitespace.support.function.leading.go -8951-8954: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go support.function.builtin.go -8954-8955: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.parens.go punctuation.section.parens.begin.go -8955-8958: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.parens.go -8958-8959: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.parens.go punctuation.section.parens.end.go -8959-8968: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go -8968-8969: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.function-call.go punctuation.whitespace.function-call.leading.go -8969-8975: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.function-call.go support.function.any-method.go -8975-8976: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.function-call.go -8976-8988: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go -8988-8994: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go keyword.control.go -8994-9003: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go -9003-9012: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.function-call.go support.function.any-method.go -9012-9013: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.function-call.go -9013-9018: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go -9018-9019: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go punctuation.section.function-block.end.go -9019-9021: source.go meta.function.receiver.go meta.block.go meta.block.go -9021-9022: source.go meta.function.receiver.go meta.block.go meta.block.go punctuation.section.function-block.end.go -9022-9024: source.go meta.function.receiver.go meta.block.go -9024-9027: source.go meta.function.receiver.go meta.block.go keyword.control.go -9027-9028: source.go meta.function.receiver.go meta.block.go -9028-9033: source.go meta.function.receiver.go meta.block.go meta.initialization.short.go variable.other.go -9033-9035: source.go meta.function.receiver.go meta.block.go meta.initialization.short.go variable.other.go keyword.operator.initialize.go -9035-9036: source.go meta.function.receiver.go meta.block.go -9036-9041: source.go meta.function.receiver.go meta.block.go keyword.control.go -9041-9049: source.go meta.function.receiver.go meta.block.go -9049-9057: source.go meta.function.receiver.go meta.block.go variable.other.dot-access.go -9057-9058: source.go meta.function.receiver.go meta.block.go -9058-9059: source.go meta.function.receiver.go meta.block.go meta.block.go punctuation.section.function-block.begin.go -9059-9062: source.go meta.function.receiver.go meta.block.go meta.block.go meta.function-call.go punctuation.whitespace.function-call.leading.go -9062-9065: source.go meta.function.receiver.go meta.block.go meta.block.go meta.function-call.go support.function.any-method.go -9065-9067: source.go meta.function.receiver.go meta.block.go meta.block.go meta.function-call.go -9067-9110: source.go meta.function.receiver.go meta.block.go meta.block.go -9110-9112: source.go meta.function.receiver.go meta.block.go meta.block.go keyword.control.go -9112-9113: source.go meta.function.receiver.go meta.block.go meta.block.go -9113-9120: source.go meta.function.receiver.go meta.block.go meta.block.go meta.initialization.short.go variable.other.go -9120-9122: source.go meta.function.receiver.go meta.block.go meta.block.go meta.initialization.short.go variable.other.go keyword.operator.initialize.go -9122-9125: source.go meta.function.receiver.go meta.block.go meta.block.go -9125-9133: source.go meta.function.receiver.go meta.block.go meta.block.go variable.other.dot-access.go -9133-9134: source.go meta.function.receiver.go meta.block.go meta.block.go -9134-9135: source.go meta.function.receiver.go meta.block.go meta.block.go string.quoted.double.go punctuation.definition.string.begin.go -9135-9145: source.go meta.function.receiver.go meta.block.go meta.block.go string.quoted.double.go -9145-9146: source.go meta.function.receiver.go meta.block.go meta.block.go string.quoted.double.go punctuation.definition.string.end.go -9146-9152: source.go meta.function.receiver.go meta.block.go meta.block.go -9152-9153: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go punctuation.section.function-block.begin.go -9153-9161: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go -9161-9162: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.function-call.go punctuation.whitespace.function-call.leading.go -9162-9168: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.function-call.go support.function.any-method.go -9168-9169: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.function-call.go -9169-9176: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go -9176-9178: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go keyword.control.go -9178-9184: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go -9184-9185: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go constant.numeric.go -9185-9186: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go -9186-9187: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go punctuation.section.function-block.begin.go -9187-9210: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go -9210-9211: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go punctuation.section.function-block.end.go -9211-9214: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go -9214-9215: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go punctuation.section.function-block.end.go -9215-9218: source.go meta.function.receiver.go meta.block.go meta.block.go -9218-9220: source.go meta.function.receiver.go meta.block.go meta.block.go keyword.control.go -9220-9221: source.go meta.function.receiver.go meta.block.go meta.block.go -9221-9228: source.go meta.function.receiver.go meta.block.go meta.block.go meta.initialization.short.go variable.other.go -9228-9230: source.go meta.function.receiver.go meta.block.go meta.block.go meta.initialization.short.go variable.other.go keyword.operator.initialize.go -9230-9233: source.go meta.function.receiver.go meta.block.go meta.block.go -9233-9241: source.go meta.function.receiver.go meta.block.go meta.block.go variable.other.dot-access.go -9241-9242: source.go meta.function.receiver.go meta.block.go meta.block.go -9242-9243: source.go meta.function.receiver.go meta.block.go meta.block.go string.quoted.double.go punctuation.definition.string.begin.go -9243-9253: source.go meta.function.receiver.go meta.block.go meta.block.go string.quoted.double.go -9253-9254: source.go meta.function.receiver.go meta.block.go meta.block.go string.quoted.double.go punctuation.definition.string.end.go -9254-9260: source.go meta.function.receiver.go meta.block.go meta.block.go -9260-9261: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go punctuation.section.function-block.begin.go -9261-9269: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go -9269-9270: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.function-call.go punctuation.whitespace.function-call.leading.go -9270-9276: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.function-call.go support.function.any-method.go -9276-9277: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.function-call.go -9277-9284: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go -9284-9286: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go keyword.control.go -9286-9292: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go -9292-9293: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go constant.numeric.go -9293-9294: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go -9294-9295: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go punctuation.section.function-block.begin.go -9295-9318: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go -9318-9319: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go punctuation.section.function-block.end.go -9319-9322: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go -9322-9323: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go punctuation.section.function-block.end.go -9323-9338: source.go meta.function.receiver.go meta.block.go meta.block.go -9338-9343: source.go meta.function.receiver.go meta.block.go meta.block.go variable.other.dot-access.go -9343-9348: source.go meta.function.receiver.go meta.block.go meta.block.go -9348-9349: source.go meta.function.receiver.go meta.block.go meta.block.go constant.numeric.go -9349-9358: source.go meta.function.receiver.go meta.block.go meta.block.go -9358-9367: source.go meta.function.receiver.go meta.block.go meta.block.go variable.other.dot-access.go -9367-9368: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go punctuation.section.function-block.begin.go -9368-9374: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go -9374-9375: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go punctuation.section.function-block.end.go -9375-9377: source.go meta.function.receiver.go meta.block.go meta.block.go -9377-9378: source.go meta.function.receiver.go meta.block.go meta.block.go punctuation.section.function-block.end.go -9378-9380: source.go meta.function.receiver.go meta.block.go -9380-9382: source.go meta.function.receiver.go meta.block.go keyword.control.go -9382-9391: source.go meta.function.receiver.go meta.block.go -9391-9392: source.go meta.function.receiver.go meta.block.go meta.block.go punctuation.section.function-block.begin.go -9392-9403: source.go meta.function.receiver.go meta.block.go meta.block.go -9403-9418: source.go meta.function.receiver.go meta.block.go meta.block.go meta.function-call.go support.function.any-method.go -9418-9419: source.go meta.function.receiver.go meta.block.go meta.block.go meta.function-call.go -9419-9425: source.go meta.function.receiver.go meta.block.go meta.block.go -9425-9426: source.go meta.function.receiver.go meta.block.go meta.block.go punctuation.section.function-block.end.go -9426-9428: source.go meta.function.receiver.go meta.block.go -9428-9433: source.go meta.function.receiver.go meta.block.go keyword.control.go -9433-9434: source.go meta.function.receiver.go meta.block.go -9434-9438: source.go meta.function.receiver.go meta.block.go keyword.control.go -9438-9439: source.go meta.function.receiver.go meta.block.go meta.parens.go punctuation.section.parens.begin.go -9439-9440: source.go meta.function.receiver.go meta.block.go meta.parens.go punctuation.section.parens.end.go -9440-9441: source.go meta.function.receiver.go meta.block.go -9441-9442: source.go meta.function.receiver.go meta.block.go meta.block.go punctuation.section.function-block.begin.go -9442-9453: source.go meta.function.receiver.go meta.block.go meta.block.go -9453-9458: source.go meta.function.receiver.go meta.block.go meta.block.go meta.function-call.go support.function.any-method.go -9458-9459: source.go meta.function.receiver.go meta.block.go meta.block.go meta.function-call.go -9459-9467: source.go meta.function.receiver.go meta.block.go meta.block.go -9467-9474: source.go meta.function.receiver.go meta.block.go meta.block.go meta.function-call.go support.function.any-method.go -9474-9475: source.go meta.function.receiver.go meta.block.go meta.block.go meta.function-call.go -9475-9477: source.go meta.function.receiver.go meta.block.go meta.block.go -9477-9483: source.go meta.function.receiver.go meta.block.go meta.block.go meta.function-call.go support.function.any-method.go -9483-9484: source.go meta.function.receiver.go meta.block.go meta.block.go meta.function-call.go -9484-9486: source.go meta.function.receiver.go meta.block.go meta.block.go -9486-9490: source.go meta.function.receiver.go meta.block.go meta.block.go meta.function-call.go support.function.any-method.go -9490-9491: source.go meta.function.receiver.go meta.block.go meta.block.go meta.function-call.go -9491-9495: source.go meta.function.receiver.go meta.block.go meta.block.go -9495-9496: source.go meta.function.receiver.go meta.block.go meta.block.go punctuation.section.function-block.end.go -9496-9497: source.go meta.function.receiver.go meta.block.go meta.parens.go punctuation.section.parens.begin.go -9497-9498: source.go meta.function.receiver.go meta.block.go meta.parens.go punctuation.section.parens.end.go -9498-9501: source.go meta.function.receiver.go meta.block.go -9501-9503: source.go meta.function.receiver.go meta.block.go meta.initialization.short.go variable.other.go -9503-9505: source.go meta.function.receiver.go meta.block.go meta.initialization.short.go variable.other.go keyword.operator.initialize.go -9505-9509: source.go meta.function.receiver.go meta.block.go -9509-9518: source.go meta.function.receiver.go meta.block.go meta.function-call.go support.function.any-method.go -9518-9519: source.go meta.function.receiver.go meta.block.go meta.function-call.go -9519-9524: source.go meta.function.receiver.go meta.block.go -9524-9537: source.go meta.function.receiver.go meta.block.go variable.other.dot-access.go -9537-9543: source.go meta.function.receiver.go meta.block.go -9543-9545: source.go meta.function.receiver.go meta.block.go meta.initialization.short.go variable.other.go -9545-9547: source.go meta.function.receiver.go meta.block.go meta.initialization.short.go variable.other.go keyword.operator.initialize.go -9547-9550: source.go meta.function.receiver.go meta.block.go -9550-9558: source.go meta.function.receiver.go meta.block.go meta.function-call.go support.function.any-method.go -9558-9559: source.go meta.function.receiver.go meta.block.go meta.function-call.go -9559-9560: source.go meta.function.receiver.go meta.block.go string.quoted.double.go punctuation.definition.string.begin.go -9560-9567: source.go meta.function.receiver.go meta.block.go string.quoted.double.go -9567-9568: source.go meta.function.receiver.go meta.block.go string.quoted.double.go punctuation.definition.string.end.go -9568-9570: source.go meta.function.receiver.go meta.block.go -9570-9571: source.go meta.function.receiver.go meta.block.go constant.numeric.go -9571-9576: source.go meta.function.receiver.go meta.block.go -9576-9584: source.go meta.function.receiver.go meta.block.go meta.function-call.go support.function.any-method.go -9584-9585: source.go meta.function.receiver.go meta.block.go meta.function-call.go -9585-9587: source.go meta.function.receiver.go meta.block.go -9587-9590: source.go meta.function.receiver.go meta.block.go meta.function-call.go support.function.any-method.go -9590-9591: source.go meta.function.receiver.go meta.block.go meta.function-call.go -9591-9592: source.go meta.function.receiver.go meta.block.go string.quoted.double.go punctuation.definition.string.begin.go -9592-9597: source.go meta.function.receiver.go meta.block.go string.quoted.double.go -9597-9598: source.go meta.function.receiver.go meta.block.go string.quoted.double.go punctuation.definition.string.end.go -9598-9600: source.go meta.function.receiver.go meta.block.go -9600-9604: source.go meta.function.receiver.go meta.block.go constant.language.go -9604-9609: source.go meta.function.receiver.go meta.block.go -9609-9615: source.go meta.function.receiver.go meta.block.go meta.function-call.go support.function.any-method.go -9615-9616: source.go meta.function.receiver.go meta.block.go meta.function-call.go -9616-9618: source.go meta.function.receiver.go meta.block.go -9618-9629: source.go meta.function.receiver.go meta.block.go meta.function-call.go support.function.any-method.go -9629-9630: source.go meta.function.receiver.go meta.block.go meta.function-call.go -9630-9632: source.go meta.function.receiver.go meta.block.go -9632-9638: source.go meta.function.receiver.go meta.block.go variable.other.dot-access.go -9638-9642: source.go meta.function.receiver.go meta.block.go -9642-9644: source.go meta.function.receiver.go meta.block.go keyword.control.go -9644-9645: source.go meta.function.receiver.go meta.block.go -9645-9649: source.go meta.function.receiver.go meta.block.go meta.initialization.short.go variable.other.go -9649-9651: source.go meta.function.receiver.go meta.block.go meta.initialization.short.go variable.other.go keyword.operator.initialize.go -9651-9654: source.go meta.function.receiver.go meta.block.go -9654-9667: source.go meta.function.receiver.go meta.block.go meta.function-call.go support.function.any-method.go -9667-9668: source.go meta.function.receiver.go meta.block.go meta.function-call.go -9668-9669: source.go meta.function.receiver.go meta.block.go string.quoted.double.go punctuation.definition.string.begin.go -9669-9722: source.go meta.function.receiver.go meta.block.go string.quoted.double.go -9722-9723: source.go meta.function.receiver.go meta.block.go string.quoted.double.go punctuation.definition.string.end.go -9723-9733: source.go meta.function.receiver.go meta.block.go -9733-9736: source.go meta.function.receiver.go meta.block.go constant.language.go -9736-9737: source.go meta.function.receiver.go meta.block.go -9737-9738: source.go meta.function.receiver.go meta.block.go meta.block.go punctuation.section.function-block.begin.go -9738-9748: source.go meta.function.receiver.go meta.block.go meta.block.go -9748-9753: source.go meta.function.receiver.go meta.block.go meta.block.go meta.function-call.go support.function.any-method.go -9753-9754: source.go meta.function.receiver.go meta.block.go meta.block.go meta.function-call.go -9754-9755: source.go meta.function.receiver.go meta.block.go meta.block.go string.quoted.double.go punctuation.definition.string.begin.go -9755-9782: source.go meta.function.receiver.go meta.block.go meta.block.go string.quoted.double.go -9782-9784: source.go meta.function.receiver.go meta.block.go meta.block.go string.quoted.double.go constant.other.placeholder.go -9784-9785: source.go meta.function.receiver.go meta.block.go meta.block.go string.quoted.double.go punctuation.definition.string.end.go -9785-9793: source.go meta.function.receiver.go meta.block.go meta.block.go -9793-9794: source.go meta.function.receiver.go meta.block.go meta.block.go punctuation.section.function-block.end.go -9794-9796: source.go meta.function.receiver.go meta.block.go -9796-9800: source.go meta.function.receiver.go meta.block.go meta.initialization.short.go variable.other.go -9800-9802: source.go meta.function.receiver.go meta.block.go meta.initialization.short.go variable.other.go keyword.operator.initialize.go -9802-9805: source.go meta.function.receiver.go meta.block.go -9805-9808: source.go meta.function.receiver.go meta.block.go meta.function-call.go support.function.any-method.go -9808-9809: source.go meta.function.receiver.go meta.block.go meta.function-call.go -9809-9816: source.go meta.function.receiver.go meta.block.go -9816-9821: source.go meta.function.receiver.go meta.block.go meta.function-call.go support.function.any-method.go -9821-9822: source.go meta.function.receiver.go meta.block.go meta.function-call.go -9822-9824: source.go meta.function.receiver.go meta.block.go -9824-9825: source.go meta.function.receiver.go meta.block.go punctuation.whitespace.comment.leading.go -9825-9827: source.go meta.function.receiver.go meta.block.go comment.line.double-slash.go punctuation.definition.comment.go -9827-9857: source.go meta.function.receiver.go meta.block.go comment.line.double-slash.go -9857-9862: source.go meta.function.receiver.go meta.block.go -9862-9865: source.go meta.function.receiver.go meta.block.go meta.function-call.go support.function.any-method.go -9865-9866: source.go meta.function.receiver.go meta.block.go meta.function-call.go -9866-9877: source.go meta.function.receiver.go meta.block.go -9877-9883: source.go meta.function.receiver.go meta.block.go variable.other.dot-access.go -9883-9884: source.go meta.function.receiver.go meta.block.go meta.block.go punctuation.section.function-block.begin.go -9884-9885: source.go meta.function.receiver.go meta.block.go meta.block.go constant.numeric.go -9885-9887: source.go meta.function.receiver.go meta.block.go meta.block.go -9887-9888: source.go meta.function.receiver.go meta.block.go meta.block.go constant.numeric.go -9888-9889: source.go meta.function.receiver.go meta.block.go meta.block.go punctuation.section.function-block.end.go -9889-9891: source.go meta.function.receiver.go meta.block.go -9891-9892: source.go meta.function.receiver.go meta.block.go punctuation.whitespace.comment.leading.go -9892-9894: source.go meta.function.receiver.go meta.block.go comment.line.double-slash.go punctuation.definition.comment.go -9894-9942: source.go meta.function.receiver.go meta.block.go comment.line.double-slash.go -9942-9943: source.go meta.function.receiver.go meta.block.go punctuation.whitespace.comment.leading.go -9943-9945: source.go meta.function.receiver.go meta.block.go comment.line.double-slash.go punctuation.definition.comment.go -9945-9993: source.go meta.function.receiver.go meta.block.go comment.line.double-slash.go -9993-9994: source.go meta.function.receiver.go meta.block.go punctuation.whitespace.comment.leading.go -9994-9996: source.go meta.function.receiver.go meta.block.go comment.line.double-slash.go punctuation.definition.comment.go -9996-10044: source.go meta.function.receiver.go meta.block.go comment.line.double-slash.go -10044-10046: source.go meta.function.receiver.go meta.block.go -10046-10053: source.go meta.function.receiver.go meta.block.go meta.initialization.short.go variable.other.go -10053-10055: source.go meta.function.receiver.go meta.block.go meta.initialization.short.go variable.other.go keyword.operator.initialize.go -10055-10056: source.go meta.function.receiver.go meta.block.go punctuation.whitespace.support.function.leading.go -10056-10060: source.go meta.function.receiver.go meta.block.go support.function.builtin.go -10060-10061: source.go meta.function.receiver.go meta.block.go meta.parens.go punctuation.section.parens.begin.go -10061-10065: source.go meta.function.receiver.go meta.block.go meta.parens.go storage.modifier.go -10065-10074: source.go meta.function.receiver.go meta.block.go meta.parens.go -10074-10079: source.go meta.function.receiver.go meta.block.go meta.parens.go variable.other.dot-access.go -10079-10080: source.go meta.function.receiver.go meta.block.go meta.parens.go punctuation.section.parens.end.go -10080-10083: source.go meta.function.receiver.go meta.block.go -10083-10085: source.go meta.function.receiver.go meta.block.go keyword.control.go -10085-10086: source.go meta.function.receiver.go meta.block.go -10086-10090: source.go meta.function.receiver.go meta.block.go keyword.control.go -10090-10091: source.go meta.function.receiver.go meta.block.go meta.parens.go punctuation.section.parens.begin.go -10091-10092: source.go meta.function.receiver.go meta.block.go meta.parens.go punctuation.section.parens.end.go -10092-10093: source.go meta.function.receiver.go meta.block.go -10093-10094: source.go meta.function.receiver.go meta.block.go meta.block.go punctuation.section.function-block.begin.go -10094-10097: source.go meta.function.receiver.go meta.block.go meta.block.go -10097-10100: source.go meta.function.receiver.go meta.block.go meta.block.go keyword.control.go -10100-10101: source.go meta.function.receiver.go meta.block.go meta.block.go -10101-10102: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go punctuation.section.function-block.begin.go -10102-10113: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go -10113-10115: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go support.channel-operator.go -10115-10124: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go -10124-10133: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.function-call.go support.function.any-method.go -10133-10134: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.function-call.go -10134-10138: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go -10138-10139: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go punctuation.section.function-block.end.go -10139-10141: source.go meta.function.receiver.go meta.block.go meta.block.go -10141-10142: source.go meta.function.receiver.go meta.block.go meta.block.go punctuation.section.function-block.end.go -10142-10143: source.go meta.function.receiver.go meta.block.go meta.parens.go punctuation.section.parens.begin.go -10143-10144: source.go meta.function.receiver.go meta.block.go meta.parens.go punctuation.section.parens.end.go -10144-10155: source.go meta.function.receiver.go meta.block.go -10155-10159: source.go meta.function.receiver.go meta.block.go meta.function-call.go support.function.any-method.go -10159-10160: source.go meta.function.receiver.go meta.block.go meta.function-call.go -10160-10163: source.go meta.function.receiver.go meta.block.go -10163-10166: source.go meta.function.receiver.go meta.block.go keyword.control.go -10166-10167: source.go meta.function.receiver.go meta.block.go -10167-10168: source.go meta.function.receiver.go meta.block.go meta.block.go punctuation.section.function-block.begin.go -10168-10196: source.go meta.function.receiver.go meta.block.go meta.block.go -10196-10201: source.go meta.function.receiver.go meta.block.go meta.block.go meta.function-call.go support.function.any-method.go -10201-10202: source.go meta.function.receiver.go meta.block.go meta.block.go meta.function-call.go -10202-10226: source.go meta.function.receiver.go meta.block.go meta.block.go -10226-10231: source.go meta.function.receiver.go meta.block.go meta.block.go meta.initialization.short.go variable.other.go -10231-10233: source.go meta.function.receiver.go meta.block.go meta.block.go meta.initialization.short.go variable.other.go keyword.operator.initialize.go -10233-10242: source.go meta.function.receiver.go meta.block.go meta.block.go -10242-10246: source.go meta.function.receiver.go meta.block.go meta.block.go meta.function-call.go support.function.any-method.go -10246-10247: source.go meta.function.receiver.go meta.block.go meta.block.go meta.function-call.go -10247-10254: source.go meta.function.receiver.go meta.block.go meta.block.go -10254-10264: source.go meta.function.receiver.go meta.block.go meta.block.go meta.function-call.go support.function.any-method.go -10264-10265: source.go meta.function.receiver.go meta.block.go meta.block.go meta.function-call.go -10265-10266: source.go meta.function.receiver.go meta.block.go meta.block.go constant.numeric.go -10266-10268: source.go meta.function.receiver.go meta.block.go meta.block.go -10268-10269: source.go meta.function.receiver.go meta.block.go meta.block.go constant.numeric.go -10269-10299: source.go meta.function.receiver.go meta.block.go meta.block.go -10299-10309: source.go meta.function.receiver.go meta.block.go meta.block.go meta.function-call.go support.function.any-method.go -10309-10310: source.go meta.function.receiver.go meta.block.go meta.block.go meta.function-call.go -10310-10311: source.go meta.function.receiver.go meta.block.go meta.block.go constant.numeric.go -10311-10315: source.go meta.function.receiver.go meta.block.go meta.block.go -10315-10316: source.go meta.function.receiver.go meta.block.go meta.block.go meta.parens.go punctuation.section.parens.begin.go -10316-10330: source.go meta.function.receiver.go meta.block.go meta.block.go meta.parens.go -10330-10331: source.go meta.function.receiver.go meta.block.go meta.block.go meta.parens.go punctuation.section.parens.end.go -10331-10336: source.go meta.function.receiver.go meta.block.go meta.block.go -10336-10337: source.go meta.function.receiver.go meta.block.go meta.block.go meta.parens.go punctuation.section.parens.begin.go -10337-10354: source.go meta.function.receiver.go meta.block.go meta.block.go meta.parens.go -10354-10355: source.go meta.function.receiver.go meta.block.go meta.block.go meta.parens.go constant.numeric.go -10355-10356: source.go meta.function.receiver.go meta.block.go meta.block.go meta.parens.go punctuation.section.parens.end.go -10356-10363: source.go meta.function.receiver.go meta.block.go meta.block.go -10363-10369: source.go meta.function.receiver.go meta.block.go meta.block.go meta.initialization.short.go variable.other.go -10369-10371: source.go meta.function.receiver.go meta.block.go meta.block.go meta.initialization.short.go variable.other.go keyword.operator.initialize.go -10371-10374: source.go meta.function.receiver.go meta.block.go meta.block.go -10374-10378: source.go meta.function.receiver.go meta.block.go meta.block.go meta.function-call.go support.function.any-method.go -10378-10379: source.go meta.function.receiver.go meta.block.go meta.block.go meta.function-call.go -10379-10381: source.go meta.function.receiver.go meta.block.go meta.block.go -10381-10395: source.go meta.function.receiver.go meta.block.go meta.block.go variable.other.dot-access.go -10395-10399: source.go meta.function.receiver.go meta.block.go meta.block.go -10399-10402: source.go meta.function.receiver.go meta.block.go meta.block.go keyword.control.go -10402-10403: source.go meta.function.receiver.go meta.block.go meta.block.go -10403-10405: source.go meta.function.receiver.go meta.block.go meta.block.go meta.initialization.short.go variable.other.go -10405-10407: source.go meta.function.receiver.go meta.block.go meta.block.go meta.initialization.short.go variable.other.go keyword.operator.initialize.go -10407-10408: source.go meta.function.receiver.go meta.block.go meta.block.go -10408-10409: source.go meta.function.receiver.go meta.block.go meta.block.go constant.numeric.go -10409-10423: source.go meta.function.receiver.go meta.block.go meta.block.go -10423-10424: source.go meta.function.receiver.go meta.block.go meta.block.go punctuation.whitespace.support.function.leading.go -10424-10427: source.go meta.function.receiver.go meta.block.go meta.block.go support.function.builtin.go -10427-10428: source.go meta.function.receiver.go meta.block.go meta.block.go meta.parens.go punctuation.section.parens.begin.go -10428-10433: source.go meta.function.receiver.go meta.block.go meta.block.go meta.parens.go -10433-10434: source.go meta.function.receiver.go meta.block.go meta.block.go meta.parens.go punctuation.section.parens.end.go -10434-10440: source.go meta.function.receiver.go meta.block.go meta.block.go -10440-10441: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go punctuation.section.function-block.begin.go -10441-10453: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go -10453-10460: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.function-call.go support.function.any-method.go -10460-10461: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.function-call.go -10461-10466: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go -10466-10467: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go constant.numeric.go -10467-10503: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go -10503-10504: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go punctuation.section.function-block.end.go -10504-10515: source.go meta.function.receiver.go meta.block.go meta.block.go -10515-10520: source.go meta.function.receiver.go meta.block.go meta.block.go meta.function-call.go support.function.any-method.go -10520-10521: source.go meta.function.receiver.go meta.block.go meta.block.go meta.function-call.go -10521-10526: source.go meta.function.receiver.go meta.block.go meta.block.go -10526-10538: source.go meta.function.receiver.go meta.block.go meta.block.go meta.initialization.short.go variable.other.go -10538-10540: source.go meta.function.receiver.go meta.block.go meta.block.go meta.initialization.short.go variable.other.go keyword.operator.initialize.go -10540-10546: source.go meta.function.receiver.go meta.block.go meta.block.go -10546-10552: source.go meta.function.receiver.go meta.block.go meta.block.go variable.other.dot-access.go -10552-10555: source.go meta.function.receiver.go meta.block.go meta.block.go -10555-10557: source.go meta.function.receiver.go meta.block.go meta.block.go keyword.control.go -10557-10558: source.go meta.function.receiver.go meta.block.go meta.block.go -10558-10564: source.go meta.function.receiver.go meta.block.go meta.block.go meta.initialization.short.go variable.other.go -10564-10566: source.go meta.function.receiver.go meta.block.go meta.block.go meta.initialization.short.go variable.other.go keyword.operator.initialize.go -10566-10570: source.go meta.function.receiver.go meta.block.go meta.block.go -10570-10578: source.go meta.function.receiver.go meta.block.go meta.block.go meta.function-call.go support.function.any-method.go -10578-10579: source.go meta.function.receiver.go meta.block.go meta.block.go meta.function-call.go -10579-10581: source.go meta.function.receiver.go meta.block.go meta.block.go -10581-10584: source.go meta.function.receiver.go meta.block.go meta.block.go meta.function-call.go support.function.any-method.go -10584-10585: source.go meta.function.receiver.go meta.block.go meta.block.go meta.function-call.go -10585-10586: source.go meta.function.receiver.go meta.block.go meta.block.go string.quoted.double.go punctuation.definition.string.begin.go -10586-10603: source.go meta.function.receiver.go meta.block.go meta.block.go string.quoted.double.go -10603-10604: source.go meta.function.receiver.go meta.block.go meta.block.go string.quoted.double.go punctuation.definition.string.end.go -10604-10606: source.go meta.function.receiver.go meta.block.go meta.block.go -10606-10609: source.go meta.function.receiver.go meta.block.go meta.block.go constant.numeric.go -10609-10611: source.go meta.function.receiver.go meta.block.go meta.block.go -10611-10612: source.go meta.function.receiver.go meta.block.go meta.block.go meta.parens.go punctuation.section.parens.begin.go -10612-10619: source.go meta.function.receiver.go meta.block.go meta.block.go meta.parens.go storage.type.go -10619-10620: source.go meta.function.receiver.go meta.block.go meta.block.go meta.parens.go punctuation.section.parens.end.go -10620-10625: source.go meta.function.receiver.go meta.block.go meta.block.go -10625-10626: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go punctuation.section.function-block.begin.go -10626-10649: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go -10649-10657: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.function-call.go support.function.any-method.go -10657-10658: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.function-call.go -10658-10665: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go storage.type.go -10665-10666: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.parens.go punctuation.section.parens.begin.go -10666-10671: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.parens.go -10671-10677: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.parens.go variable.other.dot-access.go -10677-10678: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.parens.go punctuation.section.parens.end.go -10678-10686: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go -10686-10687: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go punctuation.section.function-block.end.go -10687-10691: source.go meta.function.receiver.go meta.block.go meta.block.go -10691-10697: source.go meta.function.receiver.go meta.block.go meta.block.go keyword.control.go -10697-10698: source.go meta.function.receiver.go meta.block.go meta.block.go -10698-10699: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go punctuation.section.function-block.begin.go -10699-10702: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go -10702-10706: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go keyword.control.go -10706-10707: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go -10707-10710: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.initialization.short.go variable.other.go -10710-10712: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.initialization.short.go variable.other.go keyword.operator.initialize.go -10712-10713: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go -10713-10715: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go support.channel-operator.go -10715-10726: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go -10726-10732: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go keyword.control.go -10732-10736: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go -10736-10740: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go variable.other.dot-access.go -10740-10741: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go -10741-10742: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go punctuation.section.function-block.begin.go -10742-10746: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go -10746-10750: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go keyword.control.go -10750-10759: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go -10759-10767: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go variable.other.dot-access.go -10767-10769: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go -10769-10773: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go meta.initialization.explicit.go variable.other.go -10773-10776: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go meta.initialization.explicit.go variable.other.go keyword.control.go -10776-10779: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go meta.initialization.explicit.go variable.other.go -10779-10788: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go -10788-10796: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go variable.other.dot-access.go -10796-10802: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go -10802-10804: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go keyword.control.go -10804-10808: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go -10808-10810: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go variable.other.dot-access.go -10810-10814: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go -10814-10815: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go constant.numeric.go -10815-10816: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go -10816-10817: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go meta.block.go punctuation.section.function-block.begin.go -10817-10826: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go meta.block.go -10826-10829: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go meta.block.go variable.other.dot-access.go -10829-10840: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go meta.block.go -10840-10843: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go meta.block.go meta.function-call.go support.function.any-method.go -10843-10844: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go meta.block.go meta.function-call.go -10844-10847: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go meta.block.go -10847-10849: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go meta.block.go variable.other.dot-access.go -10849-10855: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go meta.block.go -10855-10856: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go meta.block.go punctuation.section.function-block.end.go -10856-10857: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go -10857-10861: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go keyword.control.go -10861-10862: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go -10862-10864: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go keyword.control.go -10864-10865: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go -10865-10872: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go meta.initialization.short.go variable.other.go -10872-10874: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go meta.initialization.short.go variable.other.go keyword.operator.initialize.go -10874-10882: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go -10882-10885: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go variable.other.dot-access.go -10885-10891: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go -10891-10892: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go meta.block.go punctuation.section.function-block.begin.go -10892-10910: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go meta.block.go -10910-10911: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go meta.block.go punctuation.section.function-block.end.go -10911-10912: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go -10912-10916: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go keyword.control.go -10916-10917: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go -10917-10918: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go meta.block.go punctuation.section.function-block.begin.go -10918-10924: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go meta.block.go -10924-10929: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go meta.block.go keyword.control.go -10929-10934: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go meta.block.go -10934-10935: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go meta.block.go punctuation.section.function-block.end.go -10935-10941: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go -10941-10943: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go keyword.control.go -10943-10947: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go -10947-10950: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go variable.other.dot-access.go -10950-10962: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go -10962-10970: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go variable.other.dot-access.go -10970-10971: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go -10971-10972: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go meta.block.go punctuation.section.function-block.begin.go -10972-10978: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go meta.block.go -10978-10984: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go meta.block.go keyword.control.go -10984-10989: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go meta.block.go -10989-10990: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go meta.block.go punctuation.section.function-block.end.go -10990-10998: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go -10998-11009: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go meta.function-call.go support.function.any-method.go -11009-11010: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go meta.function-call.go -11010-11026: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go -11026-11031: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go constant.language.go -11031-11035: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go -11035-11036: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.block.go punctuation.section.function-block.end.go -11036-11039: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go -11039-11043: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go keyword.control.go -11043-11044: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go -11044-11046: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go support.channel-operator.go -11046-11051: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go -11051-11056: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.function-call.go support.function.any-method.go -11056-11057: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go meta.function-call.go -11057-11071: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go -11071-11072: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go constant.numeric.go -11072-11075: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go -11075-11078: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go punctuation.whitespace.comment.leading.go -11078-11080: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go comment.line.double-slash.go punctuation.definition.comment.go -11080-11141: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go comment.line.double-slash.go -11141-11144: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go punctuation.whitespace.comment.leading.go -11144-11146: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go comment.line.double-slash.go punctuation.definition.comment.go -11146-11197: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go comment.line.double-slash.go -11197-11199: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go -11199-11200: source.go meta.function.receiver.go meta.block.go meta.block.go meta.block.go punctuation.section.function-block.end.go -11200-11202: source.go meta.function.receiver.go meta.block.go meta.block.go -11202-11203: source.go meta.function.receiver.go meta.block.go meta.block.go punctuation.section.function-block.end.go -11203-11204: source.go meta.function.receiver.go meta.block.go -11204-11205: source.go meta.function.receiver.go meta.block.go punctuation.section.function-block.end.go -11205-11207: source.go -11207-11211: source.go meta.function.plain.go meta.function.declaration.go keyword.control.go -11211-11212: source.go meta.function.plain.go meta.function.declaration.go -11212-11216: source.go meta.function.plain.go meta.function.declaration.go entity.name.function.go -11216-11219: source.go meta.function.plain.go meta.function.declaration.go -11219-11220: source.go meta.function.plain.go meta.block.go punctuation.section.function-block.begin.go -11220-11222: source.go meta.function.plain.go meta.block.go -11222-11224: source.go meta.function.plain.go meta.block.go keyword.control.go -11224-11225: source.go meta.function.plain.go meta.block.go -11225-11229: source.go meta.function.plain.go meta.block.go meta.initialization.short.go variable.other.go -11229-11231: source.go meta.function.plain.go meta.block.go meta.initialization.short.go variable.other.go keyword.operator.initialize.go -11231-11240: source.go meta.function.plain.go meta.block.go -11240-11244: source.go meta.function.plain.go meta.block.go meta.function-call.go support.function.any-method.go -11244-11245: source.go meta.function.plain.go meta.block.go meta.function-call.go -11245-11255: source.go meta.function.plain.go meta.block.go -11255-11258: source.go meta.function.plain.go meta.block.go constant.language.go -11258-11259: source.go meta.function.plain.go meta.block.go -11259-11260: source.go meta.function.plain.go meta.block.go meta.block.go punctuation.section.function-block.begin.go -11260-11270: source.go meta.function.plain.go meta.block.go meta.block.go -11270-11274: source.go meta.function.plain.go meta.block.go meta.block.go meta.function-call.go support.function.any-method.go -11274-11275: source.go meta.function.plain.go meta.block.go meta.block.go meta.function-call.go -11275-11281: source.go meta.function.plain.go meta.block.go meta.block.go -11281-11282: source.go meta.function.plain.go meta.block.go meta.block.go punctuation.section.function-block.end.go -11282-11284: source.go meta.function.plain.go meta.block.go -11284-11285: source.go meta.function.plain.go meta.block.go meta.initialization.explicit.go variable.other.go -11285-11288: source.go meta.function.plain.go meta.block.go meta.initialization.explicit.go variable.other.go keyword.control.go -11288-11290: source.go meta.function.plain.go meta.block.go meta.initialization.explicit.go variable.other.go -11290-11299: source.go meta.function.plain.go meta.block.go -11299-11312: source.go meta.function.plain.go meta.block.go variable.other.dot-access.go -11312-11314: source.go meta.function.plain.go meta.block.go -11314-11315: source.go meta.function.plain.go meta.block.go punctuation.whitespace.support.function.leading.go -11315-11319: source.go meta.function.plain.go meta.block.go support.function.builtin.go -11319-11320: source.go meta.function.plain.go meta.block.go meta.parens.go punctuation.section.parens.begin.go -11320-11323: source.go meta.function.plain.go meta.block.go meta.parens.go storage.modifier.go -11323-11333: source.go meta.function.plain.go meta.block.go meta.parens.go -11333-11337: source.go meta.function.plain.go meta.block.go meta.parens.go variable.other.dot-access.go -11337-11349: source.go meta.function.plain.go meta.block.go meta.parens.go -11349-11355: source.go meta.function.plain.go meta.block.go meta.parens.go variable.other.dot-access.go -11355-11356: source.go meta.function.plain.go meta.block.go meta.parens.go punctuation.section.parens.end.go -11356-11360: source.go meta.function.plain.go meta.block.go -11360-11364: source.go meta.function.plain.go meta.block.go meta.function-call.go support.function.any-method.go -11364-11365: source.go meta.function.plain.go meta.block.go meta.function-call.go -11365-11367: source.go meta.function.plain.go meta.block.go -11367-11368: source.go meta.function.plain.go meta.block.go punctuation.section.function-block.end.go -11368-11369: diff --git a/backend/testdata/scoperange.res b/backend/testdata/scoperange.res deleted file mode 100644 index 33bbdac..0000000 --- a/backend/testdata/scoperange.res +++ /dev/null @@ -1,2379 +0,0 @@ -0 (0, 7) -7 (0, 11368) -14 (14, 20) -20 (0, 11368) -21 (21, 22) -22 (0, 11368) -24 (24, 25) -25 (24, 50) -49 (49, 50) -50 (0, 11368) -52 (52, 53) -53 (52, 57) -56 (56, 57) -57 (0, 11368) -59 (59, 60) -60 (59, 70) -69 (69, 70) -70 (0, 11368) -72 (72, 73) -73 (72, 103) -102 (102, 103) -103 (0, 11368) -105 (105, 106) -106 (105, 119) -118 (118, 119) -119 (0, 11368) -121 (121, 122) -122 (121, 143) -142 (142, 143) -143 (0, 11368) -145 (145, 146) -146 (145, 170) -169 (169, 170) -170 (0, 11368) -172 (172, 173) -173 (172, 194) -193 (193, 194) -194 (0, 11368) -196 (196, 197) -197 (196, 219) -218 (218, 219) -219 (0, 11368) -221 (221, 222) -222 (221, 230) -229 (229, 230) -230 (0, 11368) -232 (232, 233) -233 (232, 238) -237 (237, 238) -238 (0, 11368) -242 (242, 245) -245 (0, 11368) -246 (246, 247) -247 (0, 11368) -255 (255, 258) -258 (0, 11368) -267 (267, 270) -270 (0, 11368) -279 (279, 287) -287 (287, 288) -288 (287, 2788) -299 (299, 307) -307 (287, 2788) -322 (322, 330) -330 (330, 331) -331 (330, 352) -337 (337, 341) -341 (330, 352) -348 (348, 349) -349 (348, 351) -350 (350, 351) -351 (351, 352) -352 (287, 2788) -364 (364, 372) -372 (287, 2788) -387 (387, 395) -395 (395, 396) -396 (395, 417) -402 (402, 406) -406 (395, 417) -413 (413, 414) -414 (413, 416) -415 (415, 416) -416 (416, 417) -417 (287, 2788) -429 (429, 437) -437 (287, 2788) -452 (452, 460) -460 (460, 461) -461 (460, 482) -467 (467, 471) -471 (460, 482) -478 (478, 479) -479 (478, 481) -480 (480, 481) -481 (481, 482) -482 (287, 2788) -494 (494, 502) -502 (287, 2788) -517 (517, 525) -525 (525, 526) -526 (525, 547) -532 (532, 536) -536 (525, 547) -543 (543, 544) -544 (543, 546) -545 (545, 546) -546 (546, 547) -547 (287, 2788) -559 (559, 567) -567 (287, 2788) -582 (582, 590) -590 (590, 591) -591 (590, 612) -597 (597, 601) -601 (590, 612) -608 (608, 609) -609 (608, 611) -610 (610, 611) -611 (611, 612) -612 (287, 2788) -624 (624, 632) -632 (287, 2788) -647 (647, 655) -655 (655, 656) -656 (655, 677) -662 (662, 666) -666 (655, 677) -673 (673, 674) -674 (673, 676) -675 (675, 676) -676 (676, 677) -677 (287, 2788) -689 (689, 697) -697 (287, 2788) -712 (712, 720) -720 (720, 721) -721 (720, 742) -727 (727, 731) -731 (720, 742) -738 (738, 739) -739 (738, 741) -740 (740, 741) -741 (741, 742) -742 (287, 2788) -754 (754, 762) -762 (287, 2788) -777 (777, 785) -785 (785, 786) -786 (785, 807) -792 (792, 796) -796 (785, 807) -803 (803, 804) -804 (803, 806) -805 (805, 806) -806 (806, 807) -807 (287, 2788) -819 (819, 827) -827 (287, 2788) -842 (842, 850) -850 (850, 851) -851 (850, 872) -857 (857, 861) -861 (850, 872) -868 (868, 869) -869 (868, 871) -870 (870, 871) -871 (871, 872) -872 (287, 2788) -884 (884, 892) -892 (287, 2788) -907 (907, 915) -915 (915, 916) -916 (915, 937) -922 (922, 926) -926 (915, 937) -933 (933, 934) -934 (933, 936) -935 (935, 936) -936 (936, 937) -937 (287, 2788) -949 (949, 957) -957 (287, 2788) -972 (972, 980) -980 (980, 981) -981 (980, 1002) -987 (987, 991) -991 (980, 1002) -998 (998, 999) -999 (998, 1001) -1000 (1000, 1001) -1001 (1001, 1002) -1002 (287, 2788) -1014 (1014, 1022) -1022 (287, 2788) -1037 (1037, 1045) -1045 (1045, 1046) -1046 (1045, 1067) -1052 (1052, 1056) -1056 (1045, 1067) -1063 (1063, 1064) -1064 (1063, 1066) -1065 (1065, 1066) -1066 (1066, 1067) -1067 (287, 2788) -1079 (1079, 1087) -1087 (287, 2788) -1102 (1102, 1110) -1110 (1110, 1111) -1111 (1110, 1132) -1117 (1117, 1121) -1121 (1110, 1132) -1128 (1128, 1129) -1129 (1128, 1131) -1130 (1130, 1131) -1131 (1131, 1132) -1132 (287, 2788) -1144 (1144, 1152) -1152 (287, 2788) -1167 (1167, 1175) -1175 (1175, 1176) -1176 (1175, 1197) -1182 (1182, 1186) -1186 (1175, 1197) -1193 (1193, 1194) -1194 (1193, 1196) -1195 (1195, 1196) -1196 (1196, 1197) -1197 (287, 2788) -1209 (1209, 1217) -1217 (287, 2788) -1232 (1232, 1240) -1240 (1240, 1241) -1241 (1240, 1262) -1247 (1247, 1251) -1251 (1240, 1262) -1258 (1258, 1259) -1259 (1258, 1261) -1260 (1260, 1261) -1261 (1261, 1262) -1262 (287, 2788) -1274 (1274, 1282) -1282 (287, 2788) -1297 (1297, 1305) -1305 (1305, 1306) -1306 (1305, 1327) -1312 (1312, 1316) -1316 (1305, 1327) -1323 (1323, 1324) -1324 (1323, 1326) -1325 (1325, 1326) -1326 (1326, 1327) -1327 (287, 2788) -1339 (1339, 1347) -1347 (287, 2788) -1362 (1362, 1370) -1370 (1370, 1371) -1371 (1370, 1392) -1377 (1377, 1381) -1381 (1370, 1392) -1388 (1388, 1389) -1389 (1388, 1391) -1390 (1390, 1391) -1391 (1391, 1392) -1392 (287, 2788) -1404 (1404, 1412) -1412 (287, 2788) -1427 (1427, 1435) -1435 (1435, 1436) -1436 (1435, 1457) -1442 (1442, 1446) -1446 (1435, 1457) -1453 (1453, 1454) -1454 (1453, 1456) -1455 (1455, 1456) -1456 (1456, 1457) -1457 (287, 2788) -1469 (1469, 1477) -1477 (287, 2788) -1492 (1492, 1500) -1500 (1500, 1501) -1501 (1500, 1522) -1507 (1507, 1511) -1511 (1500, 1522) -1518 (1518, 1519) -1519 (1518, 1521) -1520 (1520, 1521) -1521 (1521, 1522) -1522 (287, 2788) -1534 (1534, 1542) -1542 (287, 2788) -1557 (1557, 1565) -1565 (1565, 1566) -1566 (1565, 1587) -1572 (1572, 1576) -1576 (1565, 1587) -1583 (1583, 1584) -1584 (1583, 1586) -1585 (1585, 1586) -1586 (1586, 1587) -1587 (287, 2788) -1599 (1599, 1607) -1607 (287, 2788) -1622 (1622, 1630) -1630 (1630, 1631) -1631 (1630, 1652) -1637 (1637, 1641) -1641 (1630, 1652) -1648 (1648, 1649) -1649 (1648, 1651) -1650 (1650, 1651) -1651 (1651, 1652) -1652 (287, 2788) -1664 (1664, 1672) -1672 (287, 2788) -1687 (1687, 1695) -1695 (1695, 1696) -1696 (1695, 1717) -1702 (1702, 1706) -1706 (1695, 1717) -1713 (1713, 1714) -1714 (1713, 1716) -1715 (1715, 1716) -1716 (1716, 1717) -1717 (287, 2788) -1729 (1729, 1737) -1737 (287, 2788) -1752 (1752, 1760) -1760 (1760, 1761) -1761 (1760, 1782) -1767 (1767, 1771) -1771 (1760, 1782) -1778 (1778, 1779) -1779 (1778, 1781) -1780 (1780, 1781) -1781 (1781, 1782) -1782 (287, 2788) -1794 (1794, 1802) -1802 (287, 2788) -1817 (1817, 1825) -1825 (1825, 1826) -1826 (1825, 1847) -1832 (1832, 1836) -1836 (1825, 1847) -1843 (1843, 1844) -1844 (1843, 1846) -1845 (1845, 1846) -1846 (1846, 1847) -1847 (287, 2788) -1859 (1859, 1867) -1867 (287, 2788) -1882 (1882, 1890) -1890 (1890, 1891) -1891 (1890, 1912) -1897 (1897, 1901) -1901 (1890, 1912) -1908 (1908, 1909) -1909 (1908, 1911) -1910 (1910, 1911) -1911 (1911, 1912) -1912 (287, 2788) -1924 (1924, 1932) -1932 (287, 2788) -1947 (1947, 1955) -1955 (1955, 1956) -1956 (1955, 1977) -1962 (1962, 1966) -1966 (1955, 1977) -1973 (1973, 1974) -1974 (1973, 1976) -1975 (1975, 1976) -1976 (1976, 1977) -1977 (287, 2788) -1989 (1989, 1997) -1997 (287, 2788) -2012 (2012, 2020) -2020 (2020, 2021) -2021 (2020, 2042) -2027 (2027, 2031) -2031 (2020, 2042) -2038 (2038, 2039) -2039 (2038, 2041) -2040 (2040, 2041) -2041 (2041, 2042) -2042 (287, 2788) -2054 (2054, 2062) -2062 (287, 2788) -2077 (2077, 2085) -2085 (2085, 2086) -2086 (2085, 2107) -2092 (2092, 2096) -2096 (2085, 2107) -2103 (2103, 2104) -2104 (2103, 2106) -2105 (2105, 2106) -2106 (2106, 2107) -2107 (287, 2788) -2119 (2119, 2127) -2127 (287, 2788) -2142 (2142, 2150) -2150 (2150, 2151) -2151 (2150, 2172) -2157 (2157, 2161) -2161 (2150, 2172) -2168 (2168, 2169) -2169 (2168, 2171) -2170 (2170, 2171) -2171 (2171, 2172) -2172 (287, 2788) -2184 (2184, 2192) -2192 (287, 2788) -2207 (2207, 2215) -2215 (2215, 2216) -2216 (2215, 2235) -2229 (2229, 2234) -2234 (2234, 2235) -2235 (287, 2788) -2247 (2247, 2255) -2255 (287, 2788) -2270 (2270, 2278) -2278 (2278, 2279) -2279 (2278, 2288) -2284 (2284, 2285) -2285 (2284, 2287) -2286 (2286, 2287) -2287 (2287, 2288) -2288 (287, 2788) -2300 (2300, 2313) -2313 (287, 2788) -2323 (2323, 2331) -2331 (2331, 2332) -2332 (2331, 2355) -2345 (2345, 2354) -2354 (2354, 2355) -2355 (287, 2788) -2367 (2367, 2377) -2377 (287, 2788) -2390 (2390, 2398) -2398 (2398, 2399) -2399 (2398, 2415) -2412 (2412, 2414) -2414 (2414, 2415) -2415 (287, 2788) -2427 (2427, 2439) -2439 (287, 2788) -2450 (2450, 2458) -2458 (2458, 2459) -2459 (2458, 2477) -2472 (2472, 2476) -2476 (2476, 2477) -2477 (287, 2788) -2489 (2489, 2501) -2501 (287, 2788) -2512 (2512, 2520) -2520 (2520, 2521) -2521 (2520, 2539) -2534 (2534, 2538) -2538 (2538, 2539) -2539 (287, 2788) -2551 (2551, 2564) -2564 (287, 2788) -2574 (2574, 2582) -2582 (2582, 2583) -2583 (2582, 2602) -2596 (2596, 2601) -2601 (2601, 2602) -2602 (287, 2788) -2614 (2614, 2623) -2623 (287, 2788) -2637 (2637, 2645) -2645 (2645, 2646) -2646 (2645, 2666) -2659 (2659, 2665) -2665 (2665, 2666) -2666 (287, 2788) -2678 (2678, 2684) -2684 (287, 2788) -2701 (2701, 2709) -2709 (2709, 2710) -2710 (2709, 2730) -2723 (2723, 2729) -2729 (2729, 2730) -2730 (287, 2788) -2742 (2742, 2748) -2748 (287, 2788) -2765 (2765, 2773) -2773 (2773, 2774) -2774 (2773, 2784) -2779 (2779, 2780) -2780 (2780, 2782) -2782 (2782, 2783) -2783 (2783, 2784) -2784 (287, 2788) -2787 (2787, 2788) -2788 (0, 11368) -2801 (2801, 2802) -2802 (2802, 2806) -2806 (2801, 2807) -2807 (2807, 2810) -2810 (0, 11368) -2811 (2811, 2817) -2817 (0, 11368) -2819 (2819, 2820) -2820 (0, 11368) -2829 (2829, 2838) -2838 (0, 11368) -2861 (2861, 2871) -2871 (0, 11368) -2893 (2893, 2903) -2903 (0, 11368) -2915 (2915, 2919) -2919 (0, 11368) -2923 (2923, 2928) -2928 (0, 11368) -2946 (2946, 2948) -2948 (0, 11368) -2950 (2950, 2954) -2954 (0, 11368) -2960 (2960, 2966) -2966 (0, 11368) -2967 (2967, 2968) -2968 (2967, 3077) -2985 (2985, 2988) -2988 (2967, 3077) -2998 (2998, 3002) -3002 (2967, 3077) -3014 (3014, 3020) -3020 (2967, 3077) -3037 (3037, 3043) -3043 (2967, 3077) -3069 (3069, 3075) -3075 (2967, 3077) -3076 (3076, 3077) -3077 (0, 11368) -3079 (3079, 3083) -3083 (3079, 3125) -3084 (3084, 3106) -3085 (3085, 3092) -3092 (3084, 3106) -3094 (3094, 3106) -3106 (3079, 3125) -3109 (3109, 3125) -3125 (3125, 3126) -3126 (3125, 3152) -3128 (3128, 3134) -3134 (3125, 3152) -3137 (3137, 3150) -3150 (3125, 3152) -3151 (3151, 3152) -3152 (0, 11368) -3154 (3154, 3158) -3158 (3154, 3213) -3159 (3159, 3179) -3160 (3160, 3167) -3167 (3159, 3179) -3169 (3169, 3179) -3179 (3154, 3213) -3180 (3180, 3197) -3197 (3154, 3213) -3199 (3199, 3213) -3213 (3213, 3214) -3214 (3213, 3309) -3216 (3216, 3218) -3218 (3213, 3309) -3224 (3224, 3227) -3227 (3213, 3309) -3228 (3228, 3229) -3229 (3228, 3245) -3232 (3232, 3238) -3238 (3228, 3245) -3239 (3239, 3242) -3242 (3228, 3245) -3244 (3244, 3245) -3245 (3213, 3309) -3247 (3247, 3249) -3249 (3213, 3309) -3250 (3250, 3254) -3252 (3252, 3254) -3254 (3213, 3309) -3257 (3257, 3262) -3262 (3257, 3263) -3263 (3213, 3309) -3265 (3265, 3266) -3266 (3266, 3269) -3269 (3269, 3270) -3270 (3269, 3272) -3271 (3271, 3272) -3272 (3213, 3309) -3275 (3275, 3276) -3276 (3213, 3309) -3277 (3277, 3278) -3278 (3277, 3295) -3281 (3281, 3287) -3287 (3277, 3295) -3290 (3290, 3291) -3291 (3277, 3295) -3294 (3294, 3295) -3295 (3213, 3309) -3297 (3297, 3303) -3303 (3213, 3309) -3304 (3304, 3307) -3307 (3213, 3309) -3308 (3308, 3309) -3309 (0, 11368) -3311 (3311, 3315) -3315 (3311, 3372) -3316 (3316, 3336) -3317 (3317, 3324) -3324 (3316, 3336) -3326 (3326, 3336) -3336 (3311, 3372) -3337 (3337, 3370) -3370 (3311, 3372) -3372 (3372, 3373) -3373 (3372, 5786) -3375 (3375, 3381) -3379 (3379, 3381) -3381 (3372, 5786) -3384 (3384, 3387) -3387 (3384, 3388) -3388 (3372, 5786) -3391 (3391, 3400) -3398 (3398, 3400) -3400 (3372, 5786) -3403 (3403, 3409) -3409 (3403, 3410) -3410 (3372, 5786) -3412 (3412, 3416) -3416 (3412, 3417) -3417 (3372, 5786) -3420 (3420, 3425) -3423 (3423, 3425) -3425 (3372, 5786) -3428 (3428, 3441) -3441 (3428, 3442) -3442 (3372, 5786) -3446 (3446, 3454) -3452 (3452, 3454) -3454 (3372, 5786) -3463 (3463, 3468) -3468 (3463, 3469) -3469 (3372, 5786) -3477 (3477, 3478) -3478 (3478, 3480) -3480 (3480, 3481) -3481 (3372, 5786) -3484 (3484, 3491) -3489 (3489, 3491) -3491 (3372, 5786) -3494 (3494, 3500) -3500 (3494, 3501) -3501 (3372, 5786) -3503 (3503, 3509) -3509 (3503, 3510) -3510 (3372, 5786) -3513 (3513, 3518) -3518 (3513, 3519) -3519 (3372, 5786) -3523 (3523, 3530) -3528 (3528, 3530) -3530 (3372, 5786) -3533 (3533, 3539) -3539 (3533, 3540) -3540 (3372, 5786) -3542 (3542, 3548) -3548 (3542, 3549) -3549 (3372, 5786) -3552 (3552, 3555) -3555 (3552, 3556) -3556 (3372, 5786) -3560 (3560, 3562) -3562 (3372, 5786) -3567 (3567, 3568) -3568 (3372, 5786) -3569 (3569, 3570) -3570 (3569, 3615) -3581 (3581, 3582) -3582 (3569, 3615) -3585 (3585, 3587) -3587 (3569, 3615) -3594 (3594, 3595) -3595 (3594, 3612) -3611 (3611, 3612) -3612 (3569, 3615) -3614 (3614, 3615) -3615 (3372, 5786) -3617 (3617, 3623) -3621 (3621, 3623) -3623 (3623, 3624) -3624 (3624, 3627) -3627 (3627, 3628) -3628 (3627, 3657) -3636 (3636, 3640) -3640 (3636, 3641) -3641 (3627, 3657) -3652 (3652, 3653) -3653 (3653, 3655) -3655 (3655, 3656) -3656 (3656, 3657) -3657 (3372, 5786) -3680 (3680, 3688) -3686 (3686, 3688) -3688 (3372, 5786) -3691 (3691, 3695) -3695 (3691, 3696) -3696 (3372, 5786) -3704 (3704, 3708) -3708 (3704, 3709) -3709 (3372, 5786) -3716 (3716, 3717) -3717 (3717, 3719) -3719 (3719, 3720) -3720 (3372, 5786) -3724 (3724, 3731) -3729 (3729, 3731) -3731 (3372, 5786) -3740 (3740, 3749) -3747 (3747, 3749) -3749 (3372, 5786) -3763 (3763, 3770) -3768 (3768, 3770) -3770 (3372, 5786) -3771 (3771, 3772) -3772 (3772, 3773) -3773 (3773, 3775) -3775 (3775, 3778) -3778 (3773, 3780) -3780 (3372, 5786) -3793 (3793, 3799) -3799 (3372, 5786) -3840 (3840, 3855) -3853 (3853, 3855) -3855 (3372, 5786) -3858 (3858, 3866) -3866 (3858, 3867) -3867 (3372, 5786) -3869 (3869, 3872) -3872 (3869, 3873) -3873 (3873, 3874) -3874 (3873, 3883) -3882 (3882, 3883) -3883 (3372, 5786) -3885 (3885, 3886) -3886 (3372, 5786) -3888 (3888, 3889) -3889 (3889, 3892) -3892 (3892, 3893) -3893 (3372, 5786) -3895 (3895, 3897) -3897 (3372, 5786) -3902 (3902, 3903) -3903 (3902, 3921) -3917 (3917, 3918) -3918 (3902, 3921) -3920 (3920, 3921) -3921 (3372, 5786) -3923 (3923, 3937) -3935 (3935, 3937) -3937 (3372, 5786) -3946 (3946, 3959) -3959 (3372, 5786) -3961 (3961, 3963) -3963 (3372, 5786) -3964 (3964, 3972) -3970 (3970, 3972) -3972 (3372, 5786) -3975 (3975, 3983) -3983 (3975, 3984) -3984 (3372, 5786) -3986 (3986, 3989) -3989 (3986, 3990) -3990 (3990, 3991) -3991 (3990, 4003) -4002 (4002, 4003) -4003 (3372, 5786) -4005 (4005, 4006) -4006 (4005, 4016) -4015 (4015, 4016) -4016 (3372, 5786) -4018 (4018, 4019) -4019 (4019, 4025) -4025 (4025, 4026) -4026 (3372, 5786) -4031 (4031, 4032) -4032 (4031, 4096) -4035 (4035, 4037) -4037 (4031, 4096) -4043 (4043, 4044) -4044 (4043, 4050) -4049 (4049, 4050) -4050 (4031, 4096) -4051 (4051, 4052) -4052 (4051, 4093) -4078 (4078, 4089) -4089 (4051, 4093) -4092 (4092, 4093) -4093 (4031, 4096) -4095 (4095, 4096) -4096 (3372, 5786) -4098 (4098, 4100) -4100 (3372, 5786) -4101 (4101, 4109) -4107 (4107, 4109) -4109 (3372, 5786) -4112 (4112, 4120) -4120 (4112, 4121) -4121 (3372, 5786) -4123 (4123, 4126) -4126 (4123, 4127) -4127 (4127, 4128) -4128 (4127, 4148) -4147 (4147, 4148) -4148 (3372, 5786) -4150 (4150, 4155) -4155 (3372, 5786) -4157 (4157, 4158) -4158 (4158, 4162) -4162 (4162, 4163) -4163 (3372, 5786) -4174 (4174, 4175) -4175 (4174, 4311) -4178 (4178, 4180) -4180 (4174, 4311) -4204 (4204, 4215) -4215 (4174, 4311) -4216 (4216, 4217) -4217 (4216, 4260) -4243 (4243, 4256) -4256 (4216, 4260) -4259 (4259, 4260) -4260 (4174, 4311) -4261 (4261, 4265) -4265 (4174, 4311) -4266 (4266, 4267) -4267 (4266, 4308) -4293 (4293, 4304) -4304 (4266, 4308) -4307 (4307, 4308) -4308 (4174, 4311) -4310 (4310, 4311) -4311 (3372, 5786) -4313 (4313, 4327) -4325 (4325, 4327) -4327 (3372, 5786) -4328 (4328, 4332) -4332 (3372, 5786) -4334 (4334, 4336) -4336 (3372, 5786) -4337 (4337, 4345) -4343 (4343, 4345) -4345 (3372, 5786) -4348 (4348, 4356) -4356 (4348, 4357) -4357 (3372, 5786) -4359 (4359, 4362) -4362 (4359, 4363) -4363 (4363, 4364) -4364 (4363, 4376) -4375 (4375, 4376) -4376 (3372, 5786) -4378 (4378, 4382) -4382 (3372, 5786) -4384 (4384, 4385) -4385 (4385, 4389) -4389 (4389, 4390) -4390 (3372, 5786) -4395 (4395, 4396) -4396 (4395, 4417) -4416 (4416, 4417) -4417 (3372, 5786) -4420 (4420, 4423) -4423 (3372, 5786) -4424 (4424, 4428) -4426 (4426, 4428) -4428 (3372, 5786) -4429 (4429, 4434) -4434 (3372, 5786) -4441 (4441, 4442) -4442 (4441, 5784) -4452 (4452, 4453) -4453 (4453, 4459) -4459 (4452, 4460) -4460 (4441, 5784) -4473 (4473, 4475) -4475 (4441, 5784) -4483 (4483, 4484) -4484 (4483, 5775) -4488 (4488, 4492) -4490 (4490, 4492) -4492 (4483, 5775) -4498 (4498, 4499) -4499 (4499, 4502) -4502 (4502, 4503) -4503 (4502, 4508) -4507 (4507, 4508) -4508 (4483, 5775) -4512 (4512, 4516) -4514 (4514, 4516) -4516 (4483, 5775) -4528 (4528, 4534) -4534 (4534, 4535) -4535 (4534, 4540) -4539 (4539, 4540) -4540 (4483, 5775) -4544 (4544, 4553) -4551 (4551, 4553) -4553 (4483, 5775) -4566 (4566, 4574) -4572 (4572, 4574) -4574 (4483, 5775) -4577 (4577, 4586) -4586 (4577, 4587) -4587 (4483, 5775) -4593 (4593, 4595) -4595 (4483, 5775) -4615 (4615, 4616) -4616 (4615, 5087) -4677 (4677, 4682) -4680 (4680, 4682) -4682 (4615, 5087) -4693 (4693, 4696) -4696 (4696, 4697) -4697 (4697, 4700) -4700 (4700, 4701) -4701 (4700, 4704) -4703 (4703, 4704) -4704 (4615, 5087) -4707 (4707, 4708) -4708 (4615, 5087) -4709 (4709, 4710) -4710 (4709, 5060) -4716 (4716, 4721) -4719 (4719, 4721) -4721 (4709, 5060) -4730 (4730, 4734) -4732 (4732, 4734) -4734 (4709, 5060) -4743 (4743, 4752) -4752 (4743, 4753) -4753 (4709, 5060) -4757 (4757, 4758) -4758 (4757, 4760) -4759 (4759, 4760) -4760 (4709, 5060) -4767 (4767, 4769) -4769 (4709, 5060) -4776 (4776, 4777) -4777 (4709, 5060) -4778 (4778, 4779) -4779 (4778, 4806) -4796 (4796, 4797) -4797 (4778, 4806) -4805 (4805, 4806) -4806 (4709, 5060) -4812 (4812, 4814) -4814 (4709, 5060) -4815 (4815, 4823) -4821 (4821, 4823) -4823 (4709, 5060) -4842 (4842, 4843) -4843 (4842, 4888) -4861 (4861, 4862) -4862 (4842, 4888) -4867 (4867, 4868) -4868 (4842, 4888) -4876 (4876, 4881) -4881 (4842, 4888) -4887 (4887, 4888) -4888 (4709, 5060) -4894 (4894, 4896) -4896 (4709, 5060) -4897 (4897, 4902) -4900 (4900, 4902) -4902 (4709, 5060) -4911 (4911, 4920) -4920 (4911, 4921) -4921 (4709, 5060) -4925 (4925, 4926) -4926 (4925, 4928) -4927 (4927, 4928) -4928 (4709, 5060) -4938 (4938, 4939) -4939 (4709, 5060) -4940 (4940, 4941) -4941 (4940, 4960) -4948 (4948, 4953) -4953 (4940, 4960) -4959 (4959, 4960) -4960 (4709, 5060) -4961 (4961, 4965) -4965 (4709, 5060) -4966 (4966, 4968) -4968 (4709, 5060) -4976 (4976, 4977) -4977 (4976, 5002) -5001 (5001, 5002) -5002 (4709, 5060) -5003 (5003, 5007) -5007 (4709, 5060) -5008 (5008, 5009) -5009 (5008, 5054) -5029 (5029, 5038) -5038 (5029, 5039) -5039 (5008, 5054) -5053 (5053, 5054) -5054 (4709, 5060) -5059 (5059, 5060) -5060 (4615, 5087) -5086 (5086, 5087) -5087 (4483, 5775) -5088 (5088, 5092) -5092 (4483, 5775) -5093 (5093, 5094) -5094 (5093, 5121) -5120 (5120, 5121) -5121 (4483, 5775) -5125 (5125, 5128) -5128 (4483, 5775) -5129 (5129, 5137) -5135 (5135, 5137) -5137 (4483, 5775) -5138 (5138, 5143) -5143 (4483, 5775) -5148 (5148, 5155) -5155 (5148, 5156) -5156 (4483, 5775) -5158 (5158, 5159) -5159 (5158, 5421) -5164 (5164, 5166) -5166 (5158, 5421) -5170 (5170, 5171) -5171 (5158, 5421) -5177 (5177, 5178) -5178 (5158, 5421) -5179 (5179, 5180) -5180 (5179, 5343) -5186 (5186, 5188) -5188 (5179, 5343) -5211 (5211, 5212) -5212 (5211, 5326) -5219 (5219, 5221) -5221 (5211, 5326) -5225 (5225, 5233) -5233 (5225, 5234) -5234 (5211, 5326) -5237 (5237, 5238) -5238 (5237, 5279) -5260 (5260, 5271) -5271 (5237, 5279) -5278 (5278, 5279) -5279 (5211, 5326) -5280 (5280, 5284) -5284 (5211, 5326) -5285 (5285, 5286) -5286 (5285, 5319) -5318 (5318, 5319) -5319 (5211, 5326) -5325 (5325, 5326) -5326 (5179, 5343) -5332 (5332, 5337) -5337 (5179, 5343) -5342 (5342, 5343) -5343 (5158, 5421) -5344 (5344, 5348) -5348 (5158, 5421) -5349 (5349, 5351) -5351 (5158, 5421) -5355 (5355, 5363) -5363 (5355, 5364) -5364 (5158, 5421) -5367 (5367, 5368) -5368 (5367, 5416) -5388 (5388, 5399) -5399 (5367, 5416) -5405 (5405, 5410) -5410 (5367, 5416) -5415 (5415, 5416) -5416 (5158, 5421) -5420 (5420, 5421) -5421 (4483, 5775) -5425 (5425, 5427) -5427 (4483, 5775) -5440 (5440, 5441) -5441 (5441, 5443) -5443 (5443, 5444) -5444 (4483, 5775) -5445 (5445, 5446) -5446 (5445, 5592) -5451 (5451, 5457) -5455 (5455, 5457) -5457 (5445, 5592) -5458 (5458, 5459) -5459 (5458, 5481) -5463 (5463, 5464) -5464 (5458, 5481) -5479 (5479, 5480) -5480 (5480, 5481) -5481 (5445, 5592) -5486 (5486, 5487) -5487 (5486, 5500) -5498 (5498, 5499) -5499 (5499, 5500) -5500 (5445, 5592) -5506 (5506, 5509) -5509 (5445, 5592) -5518 (5518, 5519) -5519 (5518, 5574) -5533 (5533, 5540) -5540 (5533, 5541) -5541 (5518, 5574) -5547 (5547, 5548) -5548 (5547, 5550) -5549 (5549, 5550) -5550 (5518, 5574) -5573 (5573, 5574) -5574 (5445, 5592) -5579 (5579, 5587) -5587 (5445, 5592) -5591 (5591, 5592) -5592 (4483, 5775) -5593 (5593, 5597) -5597 (4483, 5775) -5598 (5598, 5600) -5600 (4483, 5775) -5613 (5613, 5614) -5614 (5614, 5616) -5616 (5616, 5617) -5617 (4483, 5775) -5618 (5618, 5619) -5619 (5618, 5728) -5632 (5632, 5639) -5639 (5632, 5640) -5640 (5618, 5728) -5646 (5646, 5647) -5647 (5646, 5649) -5648 (5648, 5649) -5649 (5618, 5728) -5682 (5682, 5684) -5684 (5618, 5728) -5692 (5692, 5693) -5693 (5692, 5710) -5699 (5699, 5704) -5704 (5692, 5710) -5709 (5709, 5710) -5710 (5618, 5728) -5715 (5715, 5723) -5723 (5618, 5728) -5727 (5727, 5728) -5728 (4483, 5775) -5740 (5740, 5747) -5747 (5740, 5748) -5748 (4483, 5775) -5774 (5774, 5775) -5775 (4441, 5784) -5783 (5783, 5784) -5784 (3372, 5786) -5785 (5785, 5786) -5786 (0, 11368) -5788 (5788, 5792) -5792 (5788, 5864) -5793 (5793, 5807) -5794 (5794, 5801) -5801 (5793, 5807) -5803 (5803, 5807) -5807 (5788, 5864) -5808 (5808, 5844) -5844 (5788, 5864) -5846 (5846, 5864) -5864 (5864, 5865) -5865 (5864, 6265) -5867 (5867, 5874) -5872 (5872, 5874) -5874 (5864, 6265) -5877 (5877, 5883) -5883 (5877, 5884) -5884 (5864, 6265) -5886 (5886, 5892) -5892 (5886, 5893) -5893 (5864, 6265) -5895 (5895, 5900) -5900 (5895, 5901) -5901 (5864, 6265) -5905 (5905, 5912) -5910 (5910, 5912) -5912 (5864, 6265) -5915 (5915, 5921) -5921 (5915, 5922) -5922 (5864, 6265) -5924 (5924, 5930) -5930 (5924, 5931) -5931 (5864, 6265) -5933 (5933, 5936) -5936 (5933, 5937) -5937 (5864, 6265) -5942 (5942, 5949) -5947 (5947, 5949) -5949 (5864, 6265) -5958 (5958, 5962) -5962 (5958, 5963) -5963 (5864, 6265) -5987 (5987, 5989) -5989 (5864, 6265) -5998 (5998, 5999) -5999 (5998, 6014) -6013 (6013, 6014) -6014 (5864, 6265) -6016 (6016, 6018) -6018 (5864, 6265) -6019 (6019, 6027) -6025 (6025, 6027) -6027 (5864, 6265) -6030 (6030, 6036) -6036 (6030, 6037) -6037 (5864, 6265) -6039 (6039, 6045) -6045 (6039, 6046) -6046 (5864, 6265) -6048 (6048, 6054) -6054 (6048, 6055) -6055 (5864, 6265) -6057 (6057, 6066) -6066 (6057, 6067) -6067 (5864, 6265) -6070 (6070, 6071) -6071 (5864, 6265) -6082 (6082, 6083) -6083 (6082, 6095) -6094 (6094, 6095) -6095 (5864, 6265) -6097 (6097, 6099) -6099 (5864, 6265) -6108 (6108, 6109) -6109 (6108, 6124) -6123 (6123, 6124) -6124 (5864, 6265) -6126 (6126, 6128) -6128 (5864, 6265) -6133 (6133, 6134) -6134 (5864, 6265) -6135 (6135, 6136) -6136 (6135, 6147) -6143 (6143, 6144) -6144 (6135, 6147) -6146 (6146, 6147) -6147 (5864, 6265) -6151 (6151, 6152) -6152 (5864, 6265) -6157 (6157, 6163) -6163 (6157, 6164) -6164 (5864, 6265) -6166 (6166, 6170) -6170 (6166, 6171) -6171 (5864, 6265) -6173 (6173, 6179) -6179 (6173, 6180) -6180 (5864, 6265) -6182 (6182, 6191) -6191 (6182, 6192) -6192 (5864, 6265) -6195 (6195, 6196) -6196 (5864, 6265) -6199 (6199, 6200) -6200 (5864, 6265) -6204 (6204, 6205) -6205 (5864, 6265) -6210 (6210, 6216) -6216 (6210, 6217) -6217 (5864, 6265) -6219 (6219, 6223) -6223 (6219, 6224) -6224 (5864, 6265) -6226 (6226, 6232) -6232 (6226, 6233) -6233 (5864, 6265) -6235 (6235, 6244) -6244 (6235, 6245) -6245 (5864, 6265) -6248 (6248, 6249) -6249 (5864, 6265) -6252 (6252, 6253) -6253 (5864, 6265) -6255 (6255, 6261) -6261 (5864, 6265) -6264 (6264, 6265) -6265 (0, 11368) -6267 (6267, 6271) -6271 (6267, 6325) -6272 (6272, 6286) -6273 (6273, 6280) -6280 (6272, 6286) -6282 (6282, 6286) -6286 (6267, 6325) -6287 (6287, 6323) -6323 (6267, 6325) -6325 (6325, 6326) -6326 (6325, 6409) -6330 (6330, 6343) -6343 (6325, 6409) -6351 (6351, 6355) -6355 (6351, 6356) -6356 (6325, 6409) -6370 (6370, 6376) -6376 (6376, 6377) -6377 (6376, 6406) -6379 (6379, 6384) -6384 (6379, 6385) -6385 (6376, 6406) -6390 (6390, 6396) -6396 (6390, 6397) -6397 (6376, 6406) -6399 (6399, 6403) -6403 (6399, 6404) -6404 (6376, 6406) -6405 (6405, 6406) -6406 (6325, 6409) -6408 (6408, 6409) -6409 (0, 11368) -6411 (6411, 6415) -6415 (6411, 6475) -6416 (6416, 6439) -6417 (6417, 6424) -6424 (6416, 6439) -6426 (6426, 6439) -6439 (6411, 6475) -6440 (6440, 6455) -6455 (6411, 6475) -6457 (6457, 6475) -6475 (6475, 6476) -6476 (6475, 6605) -6478 (6478, 6480) -6480 (6475, 6605) -6481 (6481, 6489) -6487 (6487, 6489) -6489 (6475, 6605) -6492 (6492, 6505) -6505 (6475, 6605) -6513 (6513, 6514) -6514 (6513, 6528) -6517 (6517, 6523) -6523 (6513, 6528) -6527 (6527, 6528) -6528 (6475, 6605) -6529 (6529, 6533) -6533 (6475, 6605) -6534 (6534, 6535) -6535 (6534, 6603) -6540 (6540, 6544) -6544 (6540, 6545) -6545 (6534, 6603) -6559 (6559, 6565) -6565 (6565, 6566) -6566 (6566, 6567) -6567 (6565, 6571) -6569 (6569, 6570) -6570 (6570, 6571) -6571 (6534, 6603) -6575 (6575, 6581) -6581 (6534, 6603) -6584 (6584, 6597) -6597 (6534, 6603) -6602 (6602, 6603) -6603 (6475, 6605) -6604 (6604, 6605) -6605 (0, 11368) -6607 (6607, 6611) -6611 (6607, 6648) -6612 (6612, 6635) -6613 (6613, 6620) -6620 (6612, 6635) -6622 (6622, 6635) -6635 (6607, 6648) -6636 (6636, 6646) -6646 (6607, 6648) -6648 (6648, 6649) -6649 (6648, 6675) -6653 (6653, 6667) -6667 (6648, 6675) -6674 (6674, 6675) -6675 (0, 11368) -6677 (6677, 6681) -6681 (6677, 6717) -6682 (6682, 6704) -6683 (6683, 6690) -6690 (6682, 6704) -6692 (6692, 6704) -6704 (6677, 6717) -6705 (6705, 6715) -6715 (6677, 6717) -6717 (6717, 6718) -6718 (6717, 6739) -6727 (6727, 6732) -6732 (6727, 6733) -6733 (6717, 6739) -6738 (6738, 6739) -6739 (0, 11368) -6741 (6741, 6743) -6743 (6741, 6776) -6776 (6776, 6780) -6780 (6776, 6817) -6781 (6781, 6804) -6782 (6782, 6789) -6789 (6781, 6804) -6791 (6791, 6804) -6804 (6776, 6817) -6805 (6805, 6815) -6815 (6776, 6817) -6817 (6817, 6818) -6818 (6817, 6838) -6827 (6827, 6831) -6831 (6827, 6832) -6832 (6817, 6838) -6837 (6837, 6838) -6838 (0, 11368) -6840 (6840, 6842) -6842 (6840, 6875) -6875 (6875, 6879) -6879 (6875, 6921) -6880 (6880, 6904) -6881 (6881, 6888) -6888 (6880, 6904) -6890 (6890, 6904) -6904 (6875, 6921) -6905 (6905, 6919) -6919 (6875, 6921) -6921 (6921, 6922) -6922 (6921, 6946) -6931 (6931, 6935) -6935 (6931, 6936) -6936 (6921, 6946) -6945 (6945, 6946) -6946 (0, 11368) -6948 (6948, 6952) -6952 (6948, 7008) -6953 (6953, 6969) -6954 (6954, 6961) -6961 (6953, 6969) -6963 (6963, 6969) -6969 (6948, 7008) -6970 (6970, 7006) -7006 (6948, 7008) -7008 (7008, 7009) -7009 (7008, 7089) -7013 (7013, 7017) -7017 (7013, 7018) -7018 (7008, 7089) -7026 (7026, 7035) -7035 (7026, 7036) -7036 (7008, 7089) -7038 (7038, 7045) -7045 (7038, 7046) -7046 (7008, 7089) -7060 (7060, 7066) -7066 (7066, 7067) -7067 (7066, 7086) -7069 (7069, 7073) -7073 (7069, 7074) -7074 (7066, 7086) -7079 (7079, 7083) -7083 (7079, 7084) -7084 (7066, 7086) -7085 (7085, 7086) -7086 (7008, 7089) -7088 (7088, 7089) -7089 (0, 11368) -7091 (7091, 7095) -7095 (7091, 7113) -7096 (7096, 7110) -7097 (7097, 7104) -7104 (7096, 7110) -7106 (7106, 7110) -7110 (7091, 7113) -7113 (7113, 7114) -7114 (7113, 11205) -7116 (7116, 7121) -7119 (7119, 7121) -7121 (7113, 11205) -7130 (7130, 7139) -7139 (7130, 7140) -7140 (7113, 11205) -7146 (7146, 7157) -7157 (7146, 7158) -7158 (7113, 11205) -7161 (7161, 7162) -7162 (7162, 7164) -7164 (7162, 7182) -7182 (7182, 7183) -7183 (7183, 7185) -7185 (7183, 7206) -7206 (7113, 11205) -7207 (7207, 7211) -7209 (7209, 7211) -7211 (7113, 11205) -7215 (7215, 7222) -7222 (7215, 7223) -7223 (7113, 11205) -7224 (7224, 7226) -7226 (7226, 7229) -7229 (7224, 7231) -7231 (7113, 11205) -7250 (7250, 7255) -7255 (7113, 11205) -7261 (7261, 7263) -7263 (7113, 11205) -7264 (7264, 7273) -7271 (7271, 7273) -7273 (7113, 11205) -7281 (7281, 7289) -7289 (7281, 7290) -7290 (7290, 7291) -7291 (7290, 7350) -7349 (7349, 7350) -7350 (7113, 11205) -7360 (7360, 7363) -7363 (7113, 11205) -7364 (7364, 7365) -7365 (7364, 7433) -7375 (7375, 7380) -7380 (7375, 7381) -7381 (7381, 7382) -7382 (7381, 7424) -7421 (7421, 7423) -7423 (7423, 7424) -7424 (7364, 7433) -7432 (7432, 7433) -7433 (7113, 11205) -7434 (7434, 7438) -7438 (7113, 11205) -7439 (7439, 7441) -7441 (7113, 11205) -7442 (7442, 7448) -7446 (7446, 7448) -7448 (7113, 11205) -7457 (7457, 7466) -7466 (7457, 7467) -7467 (7113, 11205) -7487 (7487, 7490) -7490 (7113, 11205) -7491 (7491, 7492) -7492 (7491, 7560) -7502 (7502, 7507) -7507 (7502, 7508) -7508 (7508, 7509) -7509 (7508, 7551) -7548 (7548, 7550) -7550 (7550, 7551) -7551 (7491, 7560) -7559 (7559, 7560) -7560 (7560, 7563) -7563 (7563, 7566) -7566 (7560, 7568) -7568 (7113, 11205) -7578 (7578, 7579) -7579 (7579, 7583) -7583 (7578, 7584) -7584 (7113, 11205) -7597 (7597, 7602) -7602 (7113, 11205) -7612 (7612, 7621) -7621 (7113, 11205) -7633 (7633, 7634) -7634 (7634, 7638) -7638 (7638, 7639) -7639 (7638, 7661) -7649 (7649, 7652) -7652 (7638, 7661) -7654 (7654, 7655) -7655 (7638, 7661) -7657 (7657, 7660) -7660 (7660, 7661) -7661 (7113, 11205) -7672 (7672, 7676) -7676 (7113, 11205) -7682 (7682, 7684) -7684 (7113, 11205) -7685 (7685, 7691) -7689 (7689, 7691) -7691 (7113, 11205) -7700 (7700, 7712) -7712 (7700, 7713) -7713 (7113, 11205) -7721 (7721, 7733) -7733 (7113, 11205) -7743 (7743, 7746) -7746 (7113, 11205) -7747 (7747, 7748) -7748 (7747, 7807) -7758 (7758, 7763) -7763 (7758, 7764) -7764 (7764, 7765) -7765 (7764, 7798) -7795 (7795, 7797) -7797 (7797, 7798) -7798 (7747, 7807) -7806 (7806, 7807) -7807 (7113, 11205) -7808 (7808, 7812) -7812 (7113, 11205) -7813 (7813, 7814) -7814 (7813, 7873) -7824 (7824, 7829) -7829 (7824, 7830) -7830 (7830, 7831) -7831 (7830, 7852) -7851 (7851, 7852) -7852 (7813, 7873) -7866 (7866, 7870) -7870 (7813, 7873) -7872 (7872, 7873) -7873 (7113, 11205) -7876 (7876, 7878) -7878 (7113, 11205) -7888 (7888, 7889) -7889 (7888, 8749) -7903 (7903, 7905) -7905 (7888, 8749) -7907 (7907, 7909) -7909 (7907, 7936) -7936 (7888, 8749) -7950 (7950, 7960) -7960 (7888, 8749) -7972 (7972, 7975) -7975 (7975, 7976) -7976 (7976, 7977) -7977 (7975, 7984) -7979 (7979, 7980) -7980 (7975, 7984) -7982 (7982, 7983) -7983 (7983, 7984) -7984 (7888, 8749) -7999 (7999, 8009) -8009 (7888, 8749) -8021 (8021, 8024) -8024 (8024, 8025) -8025 (8025, 8028) -8028 (8024, 8039) -8030 (8030, 8033) -8033 (8024, 8039) -8035 (8035, 8038) -8038 (8038, 8039) -8039 (7888, 8749) -8054 (8054, 8062) -8062 (7888, 8749) -8074 (8074, 8077) -8077 (8077, 8078) -8078 (8078, 8081) -8081 (8077, 8088) -8083 (8083, 8084) -8084 (8077, 8088) -8086 (8086, 8087) -8087 (8087, 8088) -8088 (7888, 8749) -8103 (8103, 8113) -8113 (7888, 8749) -8125 (8125, 8128) -8128 (8128, 8129) -8129 (8129, 8130) -8130 (8128, 8139) -8132 (8132, 8135) -8135 (8128, 8139) -8137 (8137, 8138) -8138 (8138, 8139) -8139 (7888, 8749) -8154 (8154, 8163) -8163 (7888, 8749) -8175 (8175, 8178) -8178 (8178, 8179) -8179 (8179, 8180) -8180 (8178, 8189) -8182 (8182, 8183) -8183 (8178, 8189) -8185 (8185, 8188) -8188 (8188, 8189) -8189 (7888, 8749) -8204 (8204, 8216) -8216 (7888, 8749) -8228 (8228, 8231) -8231 (8231, 8232) -8232 (8232, 8235) -8235 (8231, 8244) -8237 (8237, 8238) -8238 (8231, 8244) -8240 (8240, 8243) -8243 (8243, 8244) -8244 (7888, 8749) -8259 (8259, 8270) -8270 (7888, 8749) -8282 (8282, 8285) -8285 (8285, 8286) -8286 (8286, 8289) -8289 (8285, 8298) -8291 (8291, 8294) -8294 (8285, 8298) -8296 (8296, 8297) -8297 (8297, 8298) -8298 (7888, 8749) -8313 (8313, 8322) -8322 (7888, 8749) -8334 (8334, 8337) -8337 (8337, 8338) -8338 (8338, 8339) -8339 (8337, 8350) -8341 (8341, 8344) -8344 (8337, 8350) -8346 (8346, 8349) -8349 (8349, 8350) -8350 (7888, 8749) -8354 (8354, 8361) -8359 (8359, 8361) -8361 (8361, 8362) -8362 (8362, 8366) -8366 (8361, 8367) -8367 (7888, 8749) -8372 (8372, 8376) -8376 (7888, 8749) -8378 (8378, 8381) -8381 (7888, 8749) -8382 (8382, 8383) -8383 (8382, 8456) -8387 (8387, 8391) -8389 (8389, 8391) -8391 (8391, 8392) -8392 (8392, 8395) -8395 (8391, 8396) -8396 (8382, 8456) -8400 (8400, 8401) -8401 (8401, 8404) -8404 (8400, 8405) -8405 (8382, 8456) -8411 (8411, 8413) -8413 (8382, 8456) -8418 (8418, 8419) -8419 (8382, 8456) -8420 (8420, 8421) -8421 (8420, 8440) -8426 (8426, 8432) -8432 (8420, 8440) -8439 (8439, 8440) -8440 (8382, 8456) -8444 (8444, 8450) -8450 (8382, 8456) -8455 (8455, 8456) -8456 (7888, 8749) -8467 (8467, 8468) -8468 (8468, 8472) -8472 (8467, 8473) -8473 (7888, 8749) -8486 (8486, 8491) -8491 (7888, 8749) -8501 (8501, 8510) -8510 (7888, 8749) -8511 (8511, 8512) -8512 (8511, 8746) -8516 (8516, 8526) -8524 (8524, 8526) -8526 (8511, 8746) -8527 (8527, 8535) -8535 (8511, 8746) -8539 (8539, 8546) -8544 (8544, 8546) -8546 (8511, 8746) -8547 (8547, 8548) -8548 (8511, 8746) -8552 (8552, 8555) -8555 (8511, 8746) -8556 (8556, 8563) -8561 (8561, 8563) -8563 (8511, 8746) -8564 (8564, 8569) -8569 (8511, 8746) -8574 (8574, 8575) -8575 (8574, 8708) -8580 (8580, 8582) -8582 (8574, 8708) -8583 (8583, 8590) -8588 (8588, 8590) -8590 (8590, 8591) -8591 (8591, 8595) -8595 (8590, 8596) -8596 (8574, 8708) -8598 (8598, 8599) -8599 (8574, 8708) -8605 (8605, 8606) -8606 (8574, 8708) -8609 (8609, 8610) -8610 (8610, 8614) -8614 (8609, 8615) -8615 (8574, 8708) -8617 (8617, 8618) -8618 (8574, 8708) -8624 (8624, 8625) -8625 (8574, 8708) -8628 (8628, 8629) -8629 (8629, 8633) -8633 (8628, 8634) -8634 (8574, 8708) -8636 (8636, 8637) -8637 (8574, 8708) -8643 (8643, 8644) -8644 (8574, 8708) -8662 (8662, 8663) -8663 (8662, 8703) -8702 (8702, 8703) -8703 (8574, 8708) -8707 (8707, 8708) -8708 (8511, 8746) -8712 (8712, 8718) -8718 (8511, 8746) -8727 (8727, 8736) -8736 (8727, 8737) -8737 (8511, 8746) -8745 (8745, 8746) -8746 (7888, 8749) -8748 (8748, 8749) -8749 (7113, 11205) -8750 (8750, 8754) -8754 (7113, 11205) -8755 (8755, 8756) -8756 (8755, 9022) -8767 (8767, 8768) -8768 (8768, 8772) -8772 (8767, 8773) -8773 (8755, 9022) -8786 (8786, 8791) -8791 (8755, 9022) -8801 (8801, 8810) -8810 (8755, 9022) -8811 (8811, 8812) -8812 (8811, 9019) -8816 (8816, 8821) -8819 (8819, 8821) -8821 (8811, 9019) -8830 (8830, 8833) -8833 (8833, 8834) -8834 (8833, 8854) -8838 (8838, 8839) -8839 (8833, 8854) -8845 (8845, 8846) -8846 (8833, 8854) -8852 (8852, 8853) -8853 (8853, 8854) -8854 (8811, 9019) -8858 (8858, 8861) -8861 (8811, 9019) -8862 (8862, 8869) -8867 (8867, 8869) -8869 (8811, 9019) -8870 (8870, 8875) -8875 (8811, 9019) -8880 (8880, 8881) -8881 (8880, 8942) -8886 (8886, 8888) -8888 (8880, 8942) -8897 (8897, 8898) -8898 (8897, 8937) -8904 (8904, 8910) -8910 (8897, 8937) -8919 (8919, 8928) -8928 (8919, 8929) -8929 (8897, 8937) -8936 (8936, 8937) -8937 (8880, 8942) -8941 (8941, 8942) -8942 (8811, 9019) -8946 (8946, 8950) -8948 (8948, 8950) -8950 (8950, 8951) -8951 (8951, 8954) -8954 (8954, 8955) -8955 (8954, 8959) -8958 (8958, 8959) -8959 (8811, 9019) -8968 (8968, 8969) -8969 (8969, 8975) -8975 (8968, 8976) -8976 (8811, 9019) -8988 (8988, 8994) -8994 (8811, 9019) -9003 (9003, 9012) -9012 (9003, 9013) -9013 (8811, 9019) -9018 (9018, 9019) -9019 (8755, 9022) -9021 (9021, 9022) -9022 (7113, 11205) -9024 (9024, 9027) -9027 (7113, 11205) -9028 (9028, 9035) -9033 (9033, 9035) -9035 (7113, 11205) -9036 (9036, 9041) -9041 (7113, 11205) -9049 (9049, 9057) -9057 (7113, 11205) -9058 (9058, 9059) -9059 (9059, 9062) -9062 (9062, 9065) -9065 (9059, 9067) -9067 (9058, 9378) -9110 (9110, 9112) -9112 (9058, 9378) -9113 (9113, 9122) -9120 (9120, 9122) -9122 (9058, 9378) -9125 (9125, 9133) -9133 (9058, 9378) -9134 (9134, 9135) -9135 (9134, 9146) -9145 (9145, 9146) -9146 (9058, 9378) -9152 (9152, 9153) -9153 (9152, 9215) -9161 (9161, 9162) -9162 (9162, 9168) -9168 (9161, 9169) -9169 (9152, 9215) -9176 (9176, 9178) -9178 (9152, 9215) -9184 (9184, 9185) -9185 (9152, 9215) -9186 (9186, 9187) -9187 (9186, 9211) -9210 (9210, 9211) -9211 (9152, 9215) -9214 (9214, 9215) -9215 (9058, 9378) -9218 (9218, 9220) -9220 (9058, 9378) -9221 (9221, 9230) -9228 (9228, 9230) -9230 (9058, 9378) -9233 (9233, 9241) -9241 (9058, 9378) -9242 (9242, 9243) -9243 (9242, 9254) -9253 (9253, 9254) -9254 (9058, 9378) -9260 (9260, 9261) -9261 (9260, 9323) -9269 (9269, 9270) -9270 (9270, 9276) -9276 (9269, 9277) -9277 (9260, 9323) -9284 (9284, 9286) -9286 (9260, 9323) -9292 (9292, 9293) -9293 (9260, 9323) -9294 (9294, 9295) -9295 (9294, 9319) -9318 (9318, 9319) -9319 (9260, 9323) -9322 (9322, 9323) -9323 (9058, 9378) -9338 (9338, 9343) -9343 (9058, 9378) -9348 (9348, 9349) -9349 (9058, 9378) -9358 (9358, 9367) -9367 (9367, 9368) -9368 (9367, 9375) -9374 (9374, 9375) -9375 (9058, 9378) -9377 (9377, 9378) -9378 (7113, 11205) -9380 (9380, 9382) -9382 (7113, 11205) -9391 (9391, 9392) -9392 (9391, 9426) -9403 (9403, 9418) -9418 (9403, 9419) -9419 (9391, 9426) -9425 (9425, 9426) -9426 (7113, 11205) -9428 (9428, 9433) -9433 (7113, 11205) -9434 (9434, 9438) -9438 (9438, 9439) -9439 (9439, 9440) -9440 (7113, 11205) -9441 (9441, 9442) -9442 (9441, 9496) -9453 (9453, 9458) -9458 (9453, 9459) -9459 (9441, 9496) -9467 (9467, 9474) -9474 (9467, 9475) -9475 (9441, 9496) -9477 (9477, 9483) -9483 (9477, 9484) -9484 (9441, 9496) -9486 (9486, 9490) -9490 (9486, 9491) -9491 (9441, 9496) -9495 (9495, 9496) -9496 (9496, 9497) -9497 (9497, 9498) -9498 (7113, 11205) -9501 (9501, 9505) -9503 (9503, 9505) -9505 (7113, 11205) -9509 (9509, 9518) -9518 (9509, 9519) -9519 (7113, 11205) -9524 (9524, 9537) -9537 (7113, 11205) -9543 (9543, 9547) -9545 (9545, 9547) -9547 (7113, 11205) -9550 (9550, 9558) -9558 (9550, 9559) -9559 (9559, 9560) -9560 (9559, 9568) -9567 (9567, 9568) -9568 (7113, 11205) -9570 (9570, 9571) -9571 (7113, 11205) -9576 (9576, 9584) -9584 (9576, 9585) -9585 (7113, 11205) -9587 (9587, 9590) -9590 (9587, 9591) -9591 (9591, 9592) -9592 (9591, 9598) -9597 (9597, 9598) -9598 (7113, 11205) -9600 (9600, 9604) -9604 (7113, 11205) -9609 (9609, 9615) -9615 (9609, 9616) -9616 (7113, 11205) -9618 (9618, 9629) -9629 (9618, 9630) -9630 (7113, 11205) -9632 (9632, 9638) -9638 (7113, 11205) -9642 (9642, 9644) -9644 (7113, 11205) -9645 (9645, 9651) -9649 (9649, 9651) -9651 (7113, 11205) -9654 (9654, 9667) -9667 (9654, 9668) -9668 (9668, 9669) -9669 (9668, 9723) -9722 (9722, 9723) -9723 (7113, 11205) -9733 (9733, 9736) -9736 (7113, 11205) -9737 (9737, 9738) -9738 (9737, 9794) -9748 (9748, 9753) -9753 (9748, 9754) -9754 (9754, 9755) -9755 (9754, 9785) -9782 (9782, 9784) -9784 (9784, 9785) -9785 (9737, 9794) -9793 (9793, 9794) -9794 (7113, 11205) -9796 (9796, 9802) -9800 (9800, 9802) -9802 (7113, 11205) -9805 (9805, 9808) -9808 (9805, 9809) -9809 (7113, 11205) -9816 (9816, 9821) -9821 (9816, 9822) -9822 (7113, 11205) -9824 (9824, 9825) -9825 (9825, 9827) -9827 (9825, 9857) -9857 (7113, 11205) -9862 (9862, 9865) -9865 (9862, 9866) -9866 (7113, 11205) -9877 (9877, 9883) -9883 (9883, 9884) -9884 (9884, 9885) -9885 (9883, 9889) -9887 (9887, 9888) -9888 (9888, 9889) -9889 (7113, 11205) -9891 (9891, 9892) -9892 (9892, 9894) -9894 (9892, 9942) -9942 (9942, 9943) -9943 (9943, 9945) -9945 (9943, 9993) -9993 (9993, 9994) -9994 (9994, 9996) -9996 (9994, 10044) -10044 (7113, 11205) -10046 (10046, 10055) -10053 (10053, 10055) -10055 (10055, 10056) -10056 (10056, 10060) -10060 (10060, 10061) -10061 (10061, 10065) -10065 (10060, 10080) -10074 (10074, 10079) -10079 (10079, 10080) -10080 (7113, 11205) -10083 (10083, 10085) -10085 (7113, 11205) -10086 (10086, 10090) -10090 (10090, 10091) -10091 (10091, 10092) -10092 (7113, 11205) -10093 (10093, 10094) -10094 (10093, 10142) -10097 (10097, 10100) -10100 (10093, 10142) -10101 (10101, 10102) -10102 (10101, 10139) -10113 (10113, 10115) -10115 (10101, 10139) -10124 (10124, 10133) -10133 (10124, 10134) -10134 (10101, 10139) -10138 (10138, 10139) -10139 (10093, 10142) -10141 (10141, 10142) -10142 (10142, 10143) -10143 (10143, 10144) -10144 (7113, 11205) -10155 (10155, 10159) -10159 (10155, 10160) -10160 (7113, 11205) -10163 (10163, 10166) -10166 (7113, 11205) -10167 (10167, 10168) -10168 (10167, 11203) -10196 (10196, 10201) -10201 (10196, 10202) -10202 (10167, 11203) -10226 (10226, 10233) -10231 (10231, 10233) -10233 (10167, 11203) -10242 (10242, 10246) -10246 (10242, 10247) -10247 (10167, 11203) -10254 (10254, 10264) -10264 (10254, 10265) -10265 (10265, 10266) -10266 (10167, 11203) -10268 (10268, 10269) -10269 (10167, 11203) -10299 (10299, 10309) -10309 (10299, 10310) -10310 (10310, 10311) -10311 (10167, 11203) -10315 (10315, 10316) -10316 (10315, 10331) -10330 (10330, 10331) -10331 (10167, 11203) -10336 (10336, 10337) -10337 (10336, 10356) -10354 (10354, 10355) -10355 (10355, 10356) -10356 (10167, 11203) -10363 (10363, 10371) -10369 (10369, 10371) -10371 (10167, 11203) -10374 (10374, 10378) -10378 (10374, 10379) -10379 (10167, 11203) -10381 (10381, 10395) -10395 (10167, 11203) -10399 (10399, 10402) -10402 (10167, 11203) -10403 (10403, 10407) -10405 (10405, 10407) -10407 (10167, 11203) -10408 (10408, 10409) -10409 (10167, 11203) -10423 (10423, 10424) -10424 (10424, 10427) -10427 (10427, 10428) -10428 (10427, 10434) -10433 (10433, 10434) -10434 (10167, 11203) -10440 (10440, 10441) -10441 (10440, 10504) -10453 (10453, 10460) -10460 (10453, 10461) -10461 (10440, 10504) -10466 (10466, 10467) -10467 (10440, 10504) -10503 (10503, 10504) -10504 (10167, 11203) -10515 (10515, 10520) -10520 (10515, 10521) -10521 (10167, 11203) -10526 (10526, 10540) -10538 (10538, 10540) -10540 (10167, 11203) -10546 (10546, 10552) -10552 (10167, 11203) -10555 (10555, 10557) -10557 (10167, 11203) -10558 (10558, 10566) -10564 (10564, 10566) -10566 (10167, 11203) -10570 (10570, 10578) -10578 (10570, 10579) -10579 (10167, 11203) -10581 (10581, 10584) -10584 (10581, 10585) -10585 (10585, 10586) -10586 (10585, 10604) -10603 (10603, 10604) -10604 (10167, 11203) -10606 (10606, 10609) -10609 (10167, 11203) -10611 (10611, 10612) -10612 (10612, 10619) -10619 (10619, 10620) -10620 (10167, 11203) -10625 (10625, 10626) -10626 (10625, 10687) -10649 (10649, 10657) -10657 (10649, 10658) -10658 (10658, 10665) -10665 (10665, 10666) -10666 (10665, 10678) -10671 (10671, 10677) -10677 (10677, 10678) -10678 (10625, 10687) -10686 (10686, 10687) -10687 (10167, 11203) -10691 (10691, 10697) -10697 (10167, 11203) -10698 (10698, 10699) -10699 (10698, 11200) -10702 (10702, 10706) -10706 (10698, 11200) -10707 (10707, 10712) -10710 (10710, 10712) -10712 (10698, 11200) -10713 (10713, 10715) -10715 (10698, 11200) -10726 (10726, 10732) -10732 (10698, 11200) -10736 (10736, 10740) -10740 (10698, 11200) -10741 (10741, 10742) -10742 (10741, 11036) -10746 (10746, 10750) -10750 (10741, 11036) -10759 (10759, 10767) -10767 (10741, 11036) -10769 (10769, 10779) -10773 (10773, 10776) -10776 (10769, 10779) -10779 (10741, 11036) -10788 (10788, 10796) -10796 (10741, 11036) -10802 (10802, 10804) -10804 (10741, 11036) -10808 (10808, 10810) -10810 (10741, 11036) -10814 (10814, 10815) -10815 (10741, 11036) -10816 (10816, 10817) -10817 (10816, 10856) -10826 (10826, 10829) -10829 (10816, 10856) -10840 (10840, 10843) -10843 (10840, 10844) -10844 (10816, 10856) -10847 (10847, 10849) -10849 (10816, 10856) -10855 (10855, 10856) -10856 (10741, 11036) -10857 (10857, 10861) -10861 (10741, 11036) -10862 (10862, 10864) -10864 (10741, 11036) -10865 (10865, 10874) -10872 (10872, 10874) -10874 (10741, 11036) -10882 (10882, 10885) -10885 (10741, 11036) -10891 (10891, 10892) -10892 (10891, 10911) -10910 (10910, 10911) -10911 (10741, 11036) -10912 (10912, 10916) -10916 (10741, 11036) -10917 (10917, 10918) -10918 (10917, 10935) -10924 (10924, 10929) -10929 (10917, 10935) -10934 (10934, 10935) -10935 (10741, 11036) -10941 (10941, 10943) -10943 (10741, 11036) -10947 (10947, 10950) -10950 (10741, 11036) -10962 (10962, 10970) -10970 (10741, 11036) -10971 (10971, 10972) -10972 (10971, 10990) -10978 (10978, 10984) -10984 (10971, 10990) -10989 (10989, 10990) -10990 (10741, 11036) -10998 (10998, 11009) -11009 (10998, 11010) -11010 (10741, 11036) -11026 (11026, 11031) -11031 (10741, 11036) -11035 (11035, 11036) -11036 (10698, 11200) -11039 (11039, 11043) -11043 (10698, 11200) -11044 (11044, 11046) -11046 (10698, 11200) -11051 (11051, 11056) -11056 (11051, 11057) -11057 (10698, 11200) -11071 (11071, 11072) -11072 (10698, 11200) -11075 (11075, 11078) -11078 (11078, 11080) -11080 (11078, 11141) -11141 (11141, 11144) -11144 (11144, 11146) -11146 (11144, 11197) -11197 (10698, 11200) -11199 (11199, 11200) -11200 (10167, 11203) -11202 (11202, 11203) -11203 (7113, 11205) -11204 (11204, 11205) -11205 (0, 11368) -11207 (11207, 11211) -11211 (11207, 11219) -11212 (11212, 11216) -11216 (11207, 11219) -11219 (11219, 11220) -11220 (11219, 11368) -11222 (11222, 11224) -11224 (11219, 11368) -11225 (11225, 11231) -11229 (11229, 11231) -11231 (11219, 11368) -11240 (11240, 11244) -11244 (11240, 11245) -11245 (11219, 11368) -11255 (11255, 11258) -11258 (11219, 11368) -11259 (11259, 11260) -11260 (11259, 11282) -11270 (11270, 11274) -11274 (11270, 11275) -11275 (11259, 11282) -11281 (11281, 11282) -11282 (11219, 11368) -11284 (11284, 11290) -11285 (11285, 11288) -11288 (11284, 11290) -11290 (11219, 11368) -11299 (11299, 11312) -11312 (11219, 11368) -11314 (11314, 11315) -11315 (11315, 11319) -11319 (11319, 11320) -11320 (11320, 11323) -11323 (11319, 11356) -11333 (11333, 11337) -11337 (11319, 11356) -11349 (11349, 11355) -11355 (11355, 11356) -11356 (11219, 11368) -11360 (11360, 11364) -11364 (11360, 11365) -11365 (11219, 11368) -11367 (11367, 11368) -11368 (0, 0) diff --git a/backend/textmate/doc.go b/backend/textmate/doc.go deleted file mode 100644 index fa4fe88..0000000 --- a/backend/textmate/doc.go +++ /dev/null @@ -1,8 +0,0 @@ -// Copyright 2014 The lime Authors. -// Use of this source code is governed by a 2-clause -// BSD-style license that can be found in the LICENSE file. - -// This package enables support for Textmate Language -// Syntax definitions (tmLanguage) and Textmate -// Colour Schemes (tmTheme). -package textmate diff --git a/backend/textmate/language.go b/backend/textmate/language.go deleted file mode 100644 index 96ee51e..0000000 --- a/backend/textmate/language.go +++ /dev/null @@ -1,515 +0,0 @@ -// Copyright 2013 The lime Authors. -// Use of this source code is governed by a 2-clause -// BSD-style license that can be found in the LICENSE file. - -package textmate - -import ( - "encoding/json" - "errors" - "fmt" - "github.com/limetext/lime/backend/loaders" - "github.com/limetext/lime/backend/log" - "github.com/limetext/rubex" - "github.com/limetext/text" - "github.com/quarnster/parser" - "io/ioutil" - "sort" - "strconv" - "strings" - "sync" -) - -const maxiter = 10000 - -type ( - Regex struct { - re *rubex.Regexp - lastIndex int - lastFound int - } - - Language struct { - UnpatchedLanguage - } - - LanguageProvider struct { - sync.Mutex - scope map[string]string - } - - UnpatchedLanguage struct { - FileTypes []string - FirstLineMatch string - RootPattern RootPattern `json:"patterns"` - Repository map[string]*Pattern - ScopeName string - } - - Named struct { - Name string - } - - Capture struct { - Key int - Named - } - - Captures []Capture - - MatchObject []int - - Pattern struct { - Named - Include string - Match Regex - Captures Captures - Begin Regex - BeginCaptures Captures - End Regex - EndCaptures Captures - Patterns []Pattern - owner *Language // needed for include directives - cachedData string - cachedPat *Pattern - cachedPatterns []*Pattern - cachedMatch MatchObject - hits int - misses int - } - - RootPattern struct { - Pattern - } - - LanguageParser struct { - l *Language - data []rune - } -) - -var ( - Provider LanguageProvider - failed = make(map[string]bool) -) - -func init() { - Provider.scope = make(map[string]string) -} - -func (t *LanguageProvider) GetLanguage(id string) (*Language, error) { - if l, err := t.LanguageFromScope(id); err != nil { - return t.LanguageFromFile(id) - } else { - return l, err - } -} - -func (t *LanguageProvider) LanguageFromScope(id string) (*Language, error) { - t.Lock() - s, ok := t.scope[id] - t.Unlock() - if !ok { - return nil, errors.New("Can't handle id " + id) - } else { - return t.LanguageFromFile(s) - } -} - -func (t *LanguageProvider) LanguageFromFile(fn string) (*Language, error) { - d, err := ioutil.ReadFile(fn) - if err != nil { - return nil, fmt.Errorf("Couldn't load file %s: %s", fn, err) - } - var l Language - if err := loaders.LoadPlist(d, &l); err != nil { - return nil, err - } - t.Lock() - defer t.Unlock() - t.scope[l.ScopeName] = fn - return &l, nil -} - -func (p Pattern) String() (ret string) { - ret = fmt.Sprintf(`--------------------------------------- -Name: %s -Match: %s -Begin: %s -End: %s -Include: %s -`, p.Name, p.Match, p.Begin, p.End, p.Include) - ret += fmt.Sprintf("\n") - for i := range p.Patterns { - inner := fmt.Sprintf("%s", p.Patterns[i]) - ret += fmt.Sprintf("\t%s\n", strings.Replace(strings.Replace(inner, "\t", "\t\t", -1), "\n", "\n\t", -1)) - } - ret += fmt.Sprintf("\n---------------------------------------") - return -} - -func (r Regex) String() string { - if r.re == nil { - return "nil" - } - return fmt.Sprintf("%s // %d, %d", r.re.String(), r.lastIndex, r.lastFound) -} - -func (r *RootPattern) String() (ret string) { - for i := range r.Patterns { - ret += fmt.Sprintf("\t%s\n", r.Patterns[i]) - } - return -} - -func (s *Language) String() string { - return fmt.Sprintf("%s\n%s\n%s\n", s.ScopeName, s.RootPattern, s.Repository) -} - -func (p *Pattern) tweak(l *Language) { - p.owner = l - p.Name = strings.TrimSpace(p.Name) - for i := range p.Patterns { - p.Patterns[i].tweak(l) - } -} - -func (l *Language) tweak() { - l.RootPattern.tweak(l) - for k := range l.Repository { - p := l.Repository[k] - p.tweak(l) - l.Repository[k] = p - } -} - -func (l *Language) UnmarshalJSON(data []byte) error { - if err := json.Unmarshal(data, &l.UnpatchedLanguage); err != nil { - return err - } - l.tweak() - return nil -} - -func (r *RootPattern) UnmarshalJSON(data []byte) error { - return json.Unmarshal(data, &r.Patterns) -} - -func (r *Regex) UnmarshalJSON(data []byte) error { - str := string(data[1 : len(data)-1]) - str = strings.Replace(str, "\\\\", "\\", -1) - str = strings.Replace(str, "\\n", "\n", -1) - str = strings.Replace(str, "\\t", "\t", -1) - if re, err := rubex.Compile(str); err != nil { - log.Warn("Couldn't compile language pattern %s: %s", str, err) - } else { - r.re = re - } - return nil -} - -func (c *Captures) UnmarshalJSON(data []byte) error { - tmp := make(map[string]Named) - if err := json.Unmarshal(data, &tmp); err != nil { - return err - } - for k, v := range tmp { - i, _ := strconv.ParseInt(k, 10, 32) - *c = append(*c, Capture{Key: int(i), Named: v}) - } - sort.Sort(c) - return nil -} - -func (c *Captures) Len() int { - return len(*c) -} - -func (c *Captures) Less(i, j int) bool { - return (*c)[i].Key < (*c)[j].Key -} - -func (c *Captures) Swap(i, j int) { - (*c)[i], (*c)[j] = (*c)[j], (*c)[i] -} - -func (m MatchObject) fix(add int) { - for i := range m { - if m[i] != -1 { - m[i] += add - } - } -} - -func (r *Regex) Find(data string, pos int) MatchObject { - if r.lastIndex > pos { - r.lastFound = 0 - } - r.lastIndex = pos - for r.lastFound < len(data) { - ret := r.re.FindStringSubmatchIndex(data[r.lastFound:]) - if ret == nil { - break - } else if (ret[0] + r.lastFound) < pos { - if ret[0] == 0 { - r.lastFound++ - } else { - r.lastFound += ret[0] - } - continue - } - mo := MatchObject(ret) - mo.fix(r.lastFound) - return mo - } - return nil -} - -func (p *Pattern) FirstMatch(data string, pos int) (pat *Pattern, ret MatchObject) { - startIdx := -1 - for i := 0; i < len(p.cachedPatterns); { - ip, im := p.cachedPatterns[i].Cache(data, pos) - if im != nil /* && im[0] != im[1]*/ { - if startIdx < 0 || startIdx > im[0] { - startIdx, pat, ret = im[0], ip, im - // This match is right at the start, we're not going to find a better pattern than this, - // so stop the search - if im[0] == pos { - break - } - } - i++ - } else { - // If it wasn't found now, it'll never be found, so the pattern can be popped from the cache - copy(p.cachedPatterns[i:], p.cachedPatterns[i+1:]) - p.cachedPatterns = p.cachedPatterns[:len(p.cachedPatterns)-1] - } - } - return -} - -func (p *Pattern) Cache(data string, pos int) (pat *Pattern, ret MatchObject) { - if p.cachedData == data { - if p.cachedMatch == nil { - return nil, nil - } - if p.cachedMatch[0] >= pos && p.cachedPat.cachedMatch != nil { - p.hits++ - return p.cachedPat, p.cachedMatch - } - } else { - p.cachedPatterns = nil - } - if p.cachedPatterns == nil { - p.cachedPatterns = make([]*Pattern, len(p.Patterns)) - for i := range p.cachedPatterns { - p.cachedPatterns[i] = &p.Patterns[i] - } - } - p.misses++ - - if p.Match.re != nil { - pat, ret = p, p.Match.Find(data, pos) - } else if p.Begin.re != nil { - pat, ret = p, p.Begin.Find(data, pos) - } else if p.Include != "" { - if z := p.Include[0]; z == '#' { - key := p.Include[1:] - if p2, ok := p.owner.Repository[key]; ok { - pat, ret = p2.Cache(data, pos) - } else { - log.Fine("Not found in repository: %s", p.Include) - } - } else if z == '$' { - // TODO(q): Implement tmLanguage $ include directives - log.Warn("Unhandled include directive: %s", p.Include) - } else if l, err := Provider.GetLanguage(p.Include); err != nil { - if !failed[p.Include] { - log.Warn("Include directive %s failed: %s", p.Include, err) - } - failed[p.Include] = true - } else { - return l.RootPattern.Cache(data, pos) - } - } else { - pat, ret = p.FirstMatch(data, pos) - } - p.cachedData = data - p.cachedMatch = ret - p.cachedPat = pat - - return -} - -func (p *Pattern) CreateCaptureNodes(data string, pos int, d parser.DataSource, mo MatchObject, parent *parser.Node, capt Captures) { - ranges := make([]text.Region, len(mo)/2) - parentIndex := make([]int, len(ranges)) - parents := make([]*parser.Node, len(parentIndex)) - for i := range ranges { - ranges[i] = text.Region{A: mo[i*2+0], B: mo[i*2+1]} - if i < 2 { - parents[i] = parent - continue - } - r := ranges[i] - for j := i - 1; j >= 0; j-- { - if ranges[j].Covers(r) { - parentIndex[i] = j - break - } - } - } - - for _, v := range capt { - i := v.Key - if i >= len(parents) || ranges[i].A == -1 { - continue - } - child := &parser.Node{Name: v.Name, Range: ranges[i], P: d} - parents[i] = child - if i == 0 { - parent.Append(child) - continue - } - var p *parser.Node - for p == nil { - i = parentIndex[i] - p = parents[i] - } - p.Append(child) - } -} - -func (p *Pattern) CreateNode(data string, pos int, d parser.DataSource, mo MatchObject) (ret *parser.Node) { - ret = &parser.Node{Name: p.Name, Range: text.Region{A: mo[0], B: mo[1]}, P: d} - defer ret.UpdateRange() - - if p.Match.re != nil { - p.CreateCaptureNodes(data, pos, d, mo, ret, p.Captures) - } - if p.Begin.re == nil { - return - } - if len(p.BeginCaptures) > 0 { - p.CreateCaptureNodes(data, pos, d, mo, ret, p.BeginCaptures) - } else { - p.CreateCaptureNodes(data, pos, d, mo, ret, p.Captures) - } - - if p.End.re == nil { - return - } - var ( - found = false - i, end int - ) - for i, end = ret.Range.B, len(data); i < len(data); { - endmatch := p.End.Find(data, i) - if endmatch != nil { - end = endmatch[1] - } else { - if !found { - // oops.. no end found at all, set it to the next line - if e2 := strings.IndexRune(data[i:], '\n'); e2 != -1 { - end = i + e2 - } else { - end = len(data) - } - break - } else { - end = i - break - } - } - if /*(endmatch == nil || (endmatch != nil && endmatch[0] != i)) && */ len(p.cachedPatterns) > 0 { - // Might be more recursive patterns to apply BEFORE the end is reached - pattern2, match2 := p.FirstMatch(data, i) - if match2 != nil && ((endmatch == nil && match2[0] < end) || (endmatch != nil && (match2[0] < endmatch[0] || match2[0] == endmatch[0] && ret.Range.A == ret.Range.B))) { - found = true - r := pattern2.CreateNode(data, i, d, match2) - ret.Append(r) - i = r.Range.B - continue - } - } - if endmatch != nil { - if len(p.EndCaptures) > 0 { - p.CreateCaptureNodes(data, i, d, endmatch, ret, p.EndCaptures) - } else { - p.CreateCaptureNodes(data, i, d, endmatch, ret, p.Captures) - } - } - break - } - ret.Range.B = end - return -} - -func (d *LanguageParser) Data(a, b int) string { - a = text.Clamp(0, len(d.data), a) - b = text.Clamp(0, len(d.data), b) - return string(d.data[a:b]) -} - -func (lp *LanguageParser) patch(lut []int, node *parser.Node) { - node.Range.A = lut[node.Range.A] - node.Range.B = lut[node.Range.B] - for _, child := range node.Children { - lp.patch(lut, child) - } -} - -func NewLanguageParser(scope string, data string) (*LanguageParser, error) { - if l, err := Provider.GetLanguage(scope); err != nil { - return nil, err - } else { - return &LanguageParser{l, []rune(data)}, nil - } -} - -func (lp *LanguageParser) Parse() (*parser.Node, error) { - sdata := string(lp.data) - rn := parser.Node{P: lp, Name: lp.l.ScopeName} - defer func() { - if r := recover(); r != nil { - log.Errorf("Panic during parse: %v\n", r) - log.Debug("%v", rn) - } - }() - iter := maxiter - for i := 0; i < len(sdata) && iter > 0; iter-- { - pat, ret := lp.l.RootPattern.Cache(sdata, i) - nl := strings.IndexAny(sdata[i:], "\n\r") - if nl != -1 { - nl += i - } - if ret == nil { - break - } else if nl > 0 && nl <= ret[0] { - i = nl - for i < len(sdata) && (sdata[i] == '\n' || sdata[i] == '\r') { - i++ - } - } else { - n := pat.CreateNode(sdata, i, lp, ret) - rn.Append(n) - - i = n.Range.B - } - } - rn.UpdateRange() - if len(sdata) != 0 { - lut := make([]int, len(sdata)+1) - j := 0 - for i := range sdata { - lut[i] = j - j++ - } - lut[len(sdata)] = len(lp.data) - lp.patch(lut, &rn) - } - if iter == 0 { - panic("reached maximum number of iterations") - } - return &rn, nil -} diff --git a/backend/textmate/language_test.go b/backend/textmate/language_test.go deleted file mode 100644 index c3c2bb4..0000000 --- a/backend/textmate/language_test.go +++ /dev/null @@ -1,136 +0,0 @@ -// Copyright 2013 The lime Authors. -// Use of this source code is governed by a 2-clause -// BSD-style license that can be found in the LICENSE file. - -package textmate - -import ( - "fmt" - "github.com/limetext/lime/backend/util" - "io/ioutil" - "testing" -) - -func TestLanguageProviderLanguageFromScope(t *testing.T) { - l, _ := Provider.LanguageFromFile("testdata/Go.tmLanguage") - - if _, err := Provider.LanguageFromScope(l.ScopeName); err != nil { - t.Errorf("Tried to load %s, but got an error: %v", l.ScopeName, err) - } - - if _, err := Provider.LanguageFromScope("MissingScope"); err == nil { - t.Error("Tried to load MissingScope, expecting to get an error, but didn't") - } -} - -func TestLanguageProviderLanguageFromFile(t *testing.T) { - if _, err := Provider.LanguageFromFile("testdata/Go.tmLanguage"); err != nil { - t.Errorf("Tried to load testdata/Go.tmLanguage, but got an error: %v", err) - } - - if _, err := Provider.LanguageFromFile("MissingFile"); err == nil { - t.Error("Tried to load MissingFile, expecting to get an error, but didn't") - } -} - -func TestTmLanguage(t *testing.T) { - files := []string{ - "testdata/Property List (XML).tmLanguage", - "testdata/XML.plist", - "testdata/Go.tmLanguage", - } - for _, fn := range files { - if _, err := Provider.LanguageFromFile(fn); err != nil { - t.Fatal(err) - } - } - - type test struct { - in string - out string - syn string - } - tests := []test{ - { - "testdata/plist2.tmlang", - "testdata/plist2.tmlang.res", - "text.xml.plist", - }, - { - "testdata/Property List (XML).tmLanguage", - "testdata/plist.tmlang.res", - "text.xml.plist", - }, - { - "testdata/main.go", - "testdata/main.go.res", - "source.go", - }, - { - "testdata/go2.go", - "testdata/go2.go.res", - "source.go", - }, - { - "testdata/utf.go", - "testdata/utf.go.res", - "source.go", - }, - } - for _, t3 := range tests { - - var d0 string - if d, err := ioutil.ReadFile(t3.in); err != nil { - t.Errorf("Couldn't load file %s: %s", t3.in, err) - continue - } else { - d0 = string(d) - } - - if lp, err := NewLanguageParser(t3.syn, d0); err != nil { - t.Error(err) - } else if root, err := lp.Parse(); err != nil { - t.Error(err) - } else { - // fmt.Println(lp.RootNode()) - str := fmt.Sprintf("%s", root) - if d, err := ioutil.ReadFile(t3.out); err != nil { - if err := ioutil.WriteFile(t3.out, []byte(str), 0644); err != nil { - t.Error(err) - } - } else if diff := util.Diff(string(d), str); diff != "" { - t.Error(diff) - } - } - } -} - -func BenchmarkLanguage(b *testing.B) { - b.StopTimer() - tst := []string{ - "language.go", - "testdata/main.go", - } - - var d0 []string - for _, s := range tst { - if d, err := ioutil.ReadFile(s); err != nil { - b.Errorf("Couldn't load file %s: %s", s, err) - } else { - d0 = append(d0, string(d)) - } - } - - b.StartTimer() - for i := 0; i < b.N; i++ { - for j := range d0 { - lp, err := NewLanguageParser("testdata/Go.tmLanguage", d0[j]) - if err != nil { - b.Fatal(err) - return - } - lp.Parse() - } - } - fmt.Println(util.Prof) -} diff --git a/backend/textmate/testdata/Go.tmLanguage b/backend/textmate/testdata/Go.tmLanguage deleted file mode 100644 index 9aa1b12..0000000 --- a/backend/textmate/testdata/Go.tmLanguage +++ /dev/null @@ -1,833 +0,0 @@ - - - - - comment - Go allows any Unicode character to be used in identifiers, so our identifier regex is: \b([[:alpha:]_]+[[:alnum:]_]*)\b - cf. The Go Programming Language Specification <http://golang.org/doc/go_spec.html> - fileTypes - - go - - firstLineMatch - (?i)-[*]-\s*(mode:)?\s*go\s*-[*]- - keyEquivalent - ^~G - name - Go - patterns - - - include - #receiver_function_declaration - - - include - #plain_function_declaration - - - include - #basic_things - - - include - #exported_variables - - - begin - ^[[:blank:]]*(import)\b\s+ - beginCaptures - - 1 - - name - keyword.control.import.go - - - end - (?=(?://|/\*))|$ - name - meta.preprocessor.go.import - patterns - - - begin - " - beginCaptures - - 0 - - name - punctuation.definition.string.begin.go - - - end - " - endCaptures - - 0 - - name - punctuation.definition.string.end.go - - - name - string.quoted.double.import.go - - - - - include - #block - - - include - #root_parens - - - include - #function_calls - - - repository - - access - - match - (?<=\.)[[:alpha:]_][[:alnum:]_]*\b(?!\s*\() - name - variable.other.dot-access.go - - basic_things - - patterns - - - include - #comments - - - include - #initializers - - - include - #access - - - include - #strings - - - include - #keywords - - - - block - - begin - \{ - beginCaptures - - 0 - - name - punctuation.section.block.begin.go - - - end - \} - endCaptures - - 0 - - name - punctuation.section.block.end.go - - - name - meta.block.go - patterns - - - include - #block_innards - - - - block_innards - - patterns - - - include - #function_block_innards - - - include - #exported_variables - - - - comments - - patterns - - - captures - - 1 - - name - meta.toc-list.banner.block.go - - - match - ^/\* =(\s*.*?)\s*= \*/$\n? - name - comment.block.go - - - begin - /\* - captures - - 0 - - name - punctuation.definition.comment.go - - - end - \*/ - name - comment.block.go - - - match - \*/.*\n - name - invalid.illegal.stray-comment-end.go - - - captures - - 1 - - name - punctuation.definition.comment.go - - 2 - - name - meta.toc-list.banner.line.go - - - match - ^(//) =(\s*.*?)\s*=\s*$\n? - name - comment.line.double-slash.banner.go - - - begin - (^[ \t]+)?(?=//) - beginCaptures - - 1 - - name - punctuation.whitespace.comment.leading.go - - - end - (?!\G) - patterns - - - begin - // - beginCaptures - - 0 - - name - punctuation.definition.comment.go - - - end - \n - name - comment.line.double-slash.go - patterns - - - match - (?>\\\s*\n) - name - punctuation.separator.continuation.go - - - - - - - - exported_variables - - comment - This is kinda hacky, in order to get the 'var' scoped the right way again. - match - (?<=\s|\[\])([[:upper:]][[:alnum:]_]*)(?=\W+) - name - variable.exported.go - - fn_parens - - begin - \( - beginCaptures - - 0 - - name - punctuation.section.parens.begin.go - - - end - \) - endCaptures - - 0 - - name - punctuation.section.parens.end.go - - - name - meta.parens.go - patterns - - - include - #basic_things - - - include - #function_calls - - - - function_block - - begin - \{ - beginCaptures - - 0 - - name - punctuation.section.function-block.begin.go - - - end - \} - endCaptures - - 0 - - name - punctuation.section.function-block.end.go - - - name - meta.block.go - patterns - - - include - #function_block_innards - - - - function_block_innards - - patterns - - - include - #basic_things - - - captures - - 1 - - name - punctuation.whitespace.support.function.leading.go - - 2 - - name - support.function.builtin.go - - - match - (\s*)\b(new|c(lose(d)?|ap)|p(anic(ln)?|rint(ln)?)|len|make)(?:\b|\() - - - include - #function_block - - - include - #function_calls - - - include - #fn_parens - - - - function_calls - - captures - - 1 - - name - punctuation.whitespace.function-call.leading.go - - 2 - - name - support.function.any-method.go - - 3 - - name - punctuation.definition.parameters.go - - - match - (?x) - (?: (?= \s ) (?:(?<=else|new|return) | (?<!\w)) (\s+) )? - (\b - (?!(for|if|else|switch|return)\s*\() - (?:[[:alpha:]_][[:alnum:]_]*+\b) # method name - ) - \s*(\() - - name - meta.function-call.go - - initializers - - patterns - - - captures - - 0 - - name - variable.other.go - - 1 - - name - keyword.control.go - - - comment - This matches the 'var x int = 0' style of variable declaration. - match - ^[[:blank:]]*(var)\s+(?:[[:alpha:]_][[:alnum:]_]*)(?:,\s+[[:alpha:]_][[:alnum:]_]*)* - name - meta.initialization.explicit.go - - - captures - - 0 - - name - variable.other.go - - 1 - - name - keyword.operator.initialize.go - - - comment - This matches the 'x := 0' style of variable declaration. - match - (?:[[:alpha:]_][[:alnum:]_]*)(?:,\s+[[:alpha:]_][[:alnum:]_]*)*\s*(:=) - name - meta.initialization.short.go - - - - keywords - - patterns - - - match - \b(s(truct|elect|witch)|c(ontinue|ase)|type|i(nterface|f|mport)|def(er|ault)|package|else|var|f(or|unc|allthrough)|r(eturn|ange)|go(to)?|break)\b - name - keyword.control.go - - - match - (\b|(?<=\]))(int(16|8|32|64)?|uint(16|8|32|64|ptr)?|float(32|64)|complex(64|128)|b(yte|ool)|string|error)\b - name - storage.type.go - - - match - \b(c(onst|han)|map)\b - name - storage.modifier.go - - - match - \b(nil|true|false|iota)\b - name - constant.language.go - - - match - \b((0(x|X)[0-9a-fA-F]*)|(([0-9]+\.?[0-9]*)|(\.[0-9]+))((e|E)(\+|-)?[0-9]+)?)\b - name - constant.numeric.go - - - match - (\<\-)|(\-\>) - name - support.channel-operator.go - - - - plain_function_declaration - - begin - (?x) - (^[[:blank:]]*(func)\s* - (?: ([[:alpha:]_][[:alnum:]_]*)? ) # name of function is optional - (?: \( ((?:[\[\]\w\d\s\/,._*&<>-]|(?:interface\{\}))*)? \) ) # required braces for parameters (even if empty) - \s* - (?: \(? ((?:[\[\]\w\d\s,._*&<>-]|(?:interface\{\}))*) \)? )? # optional return types, optionally within braces - ) - - beginCaptures - - 1 - - name - meta.function.declaration.go - - 2 - - name - keyword.control.go - - 3 - - name - entity.name.function.go - - 4 - - name - variable.parameters.go - - 5 - - name - variable.return-types.go - - - end - (?<=\}) - name - meta.function.plain.go - patterns - - - include - #comments - - - include - #storage_type - - - include - #storage_modifier - - - include - #function_block - - - - receiver_function_declaration - - begin - (?x) - ( - (func)\s* - ( - (?: \( ((?:[\[\]\w\d\s,._*&<>-]|(?:interface\{\}))*) \)\s+ ) # receiver variable declarations, in brackets - (?: ([[:alpha:]_][[:alnum:]_]*)? ) # name of function is optional - ) - (?: \( ((?:[\[\]\w\d\s,._*&<>-]|(?:interface\{\}))*)? \) ) # required braces for parameters (even if empty) - \s* - (?: \(? ((?:[\[\]\w\d\s,._*&<>-]|(?:interface\{\}))*) \)? )? # optional return types, optionally within braces - ) - - beginCaptures - - 1 - - name - meta.function.receiver.declaration.go - - 2 - - name - keyword.control.go - - 3 - - name - entity.name.function.go.full-name - - 4 - - name - variable.receiver.go - - 5 - - name - entity.name.function.go.name - - 6 - - name - variable.parameters.go - - 7 - - name - variable.return-types.go - - - comment - Version of above with support for declaring a receiver variable. - end - (?<=\}) - name - meta.function.receiver.go - patterns - - - include - #comments - - - include - #storage_type - - - include - #storage_modifier - - - include - #function_block - - - - root_parens - - begin - \( - end - (?<=\()(\))?|(?:\)) - endCaptures - - 1 - - name - meta.parens.empty.go - - - name - meta.parens.go - patterns - - - include - #basic_things - - - include - #exported_variables - - - include - #function_calls - - - - string_escaped_char - - patterns - - - match - \\(\\|[abfnrutv'"]|x[0-9a-fA-F]{2}|u[0-9a-fA-F]{4}|U[0-9a-fA-F]{8}|[0-7]{3}) - name - constant.character.escape.go - - - match - \\. - name - invalid.illegal.unknown-escape.go - - - - string_placeholder - - patterns - - - match - (?x)% - (\d+\$)? # field (argument #) - [#0\- +']* # flags - [,;:_]? # separator character (AltiVec) - ((-?\d+)|\*(-?\d+\$)?)? # minimum field width - (\.((-?\d+)|\*(-?\d+\$)?)?)? # precision - [diouxXDOUeEfFgGaAcCsSpnvtTbyYhHmMzZq%] # conversion type - - name - constant.other.placeholder.go - - - match - % - name - invalid.illegal.placeholder.go - - - - strings - - patterns - - - begin - " - beginCaptures - - 0 - - name - punctuation.definition.string.begin.go - - - end - " - endCaptures - - 0 - - name - punctuation.definition.string.end.go - - - name - string.quoted.double.go - patterns - - - include - #string_placeholder - - - include - #string_escaped_char - - - - - begin - ' - beginCaptures - - 0 - - name - punctuation.definition.string.begin.go - - - end - ' - endCaptures - - 0 - - name - punctuation.definition.string.end.go - - - name - string.quoted.single.go - patterns - - - include - #string_escaped_char - - - - - begin - ` - beginCaptures - - 0 - - name - punctuation.definition.string.begin.go - - - end - ` - endCaptures - - 0 - - name - punctuation.definition.string.end.go - - - name - string.quoted.raw.go - - - - - scopeName - source.go - uuid - 33100200-8916-4F78-8522-4362628C6889 - - diff --git a/backend/textmate/testdata/Monokai.tmTheme b/backend/textmate/testdata/Monokai.tmTheme deleted file mode 100644 index fbf090b..0000000 --- a/backend/textmate/testdata/Monokai.tmTheme +++ /dev/null @@ -1,300 +0,0 @@ - - - - - gutterSettings - - background - #49483E - divider - #75715E - foreground - #75715E - - name - Monokai - semanticClass - theme.dark.monokai - settings - - - settings - - background - #272822 - caret - #F8F8F0 - foreground - #F8F8F2 - invisibles - #49483E - lineHighlight - #49483E - selection - #49483E - - - - name - Comment - scope - comment - settings - - foreground - #75715E - - - - name - String - scope - string - settings - - foreground - #E6DB74 - - - - name - Number - scope - constant.numeric - settings - - foreground - #AE81FF - - - - name - Built-in constant - scope - constant.language - settings - - foreground - #AE81FF - - - - name - User-defined constant - scope - constant.character, constant.other - settings - - foreground - #AE81FF - - - - name - Variable - scope - variable - settings - - fontStyle - - - - - name - Keyword - scope - keyword - settings - - foreground - #F92672 - - - - name - Storage - scope - storage - settings - - fontStyle - - foreground - #F92672 - - - - name - Storage type - scope - storage.type - settings - - fontStyle - italic - foreground - #66D9EF - - - - name - Class name - scope - entity.name.class - settings - - fontStyle - underline - foreground - #A6E22E - - - - name - Inherited class - scope - entity.other.inherited-class - settings - - fontStyle - italic underline - foreground - #A6E22E - - - - name - Function name - scope - entity.name.function - settings - - fontStyle - - foreground - #A6E22E - - - - name - Function argument - scope - variable.parameter - settings - - fontStyle - italic - foreground - #FD971F - - - - name - Tag name - scope - entity.name.tag - settings - - fontStyle - - foreground - #F92672 - - - - name - Tag attribute - scope - entity.other.attribute-name - settings - - fontStyle - - foreground - #A6E22E - - - - name - Library function - scope - support.function - settings - - fontStyle - - foreground - #66D9EF - - - - name - Library constant - scope - support.constant - settings - - fontStyle - - foreground - #66D9EF - - - - name - Library class/type - scope - support.type, support.class - settings - - fontStyle - italic - foreground - #66D9EF - - - - name - Library variable - scope - support.other.variable - settings - - fontStyle - - - - - name - Invalid - scope - invalid - settings - - background - #F92672 - fontStyle - - foreground - #F8F8F0 - - - - name - Invalid deprecated - scope - invalid.deprecated - settings - - background - #AE81FF - foreground - #F8F8F0 - - - - uuid - D8D5E82E-3D5B-46B5-B38E-8C841C21347D - - diff --git a/backend/textmate/testdata/Monokai.tmTheme.res b/backend/textmate/testdata/Monokai.tmTheme.res deleted file mode 100644 index 45c8b54..0000000 --- a/backend/textmate/testdata/Monokai.tmTheme.res +++ /dev/null @@ -1,50 +0,0 @@ -Monokai - D8D5E82E-3D5B-46B5-B38E-8C841C21347D - - - background: 0x00272822 - caret: 0x00F8F8F0 - foreground: 0x00F8F8F2 - invisibles: 0x0049483E - lineHighlight: 0x0049483E - selection: 0x0049483E - Comment - comment - foreground: 0x0075715E - String - string - foreground: 0x00E6DB74 - Number - constant.numeric - foreground: 0x00AE81FF - Built-in constant - constant.language - foreground: 0x00AE81FF - User-defined constant - constant.character, constant.other - foreground: 0x00AE81FF - Variable - variable - Keyword - keyword - foreground: 0x00F92672 - Storage - storage - foreground: 0x00F92672 - Storage type - storage.type - foreground: 0x0066D9EF - Class name - entity.name.class - foreground: 0x00A6E22E - Inherited class - entity.other.inherited-class - foreground: 0x00A6E22E - Function name - entity.name.function - foreground: 0x00A6E22E - Function argument - variable.parameter - foreground: 0x00FD971F - Tag name - entity.name.tag - foreground: 0x00F92672 - Tag attribute - entity.other.attribute-name - foreground: 0x00A6E22E - Library function - support.function - foreground: 0x0066D9EF - Library constant - support.constant - foreground: 0x0066D9EF - Library class/type - support.type, support.class - foreground: 0x0066D9EF - Library variable - support.other.variable - Invalid - invalid - background: 0x00F92672 - foreground: 0x00F8F8F0 - Invalid deprecated - invalid.deprecated - background: 0x00AE81FF - foreground: 0x00F8F8F0 diff --git a/backend/textmate/testdata/Property List (XML).tmLanguage b/backend/textmate/testdata/Property List (XML).tmLanguage deleted file mode 100644 index a0f95d9..0000000 --- a/backend/textmate/testdata/Property List (XML).tmLanguage +++ /dev/null @@ -1,1113 +0,0 @@ - - - - - fileTypes - - firstLineMatch - \s*<\?xml .*\n\s*<!DOCTYPE\s*(?i:plist)\s - name - Property List (XML) - patterns - - - include - #xml - - - repository - - xml - - patterns - - - begin - ((<)((plist\b))) - captures - - 1 - - name - meta.tag.plist.xml.plist - - 2 - - name - punctuation.definition.tag.xml.plist - - 3 - - name - entity.name.tag.xml.plist - - 4 - - name - entity.name.tag.localname.xml.plist - - 5 - - name - punctuation.definition.tag.xml.plist - - - end - ((/)((plist))(>)) - patterns - - - begin - (?<=<plist)(?!>)\s*(?:(version)(=)(?:((").*?("))|((').*?('))))? - beginCaptures - - 1 - - name - entity.other.attribute-name.version.xml.plist - - 2 - - name - punctuation.separator.key-value.xml.plist - - 3 - - name - string.quoted.double.xml.plist - - 4 - - name - punctuation.definition.string.begin.xml.plist - - 5 - - name - punctuation.definition.string.end.xml.plist - - 6 - - name - string.quoted.single.xml.plist - - 7 - - name - punctuation.definition.string.begin.xml.plist - - 8 - - name - punctuation.definition.string.end.xml.plist - - - end - (?=>) - name - meta.tag.plist.xml.plist - - - captures - - 1 - - name - meta.tag.plist.xml.plist - - 2 - - name - punctuation.definition.tag.xml.plist - - 3 - - name - meta.scope.between-tag-pair.xml.plist - - - comment - Tag with no content - match - ((>(<)))(?=/plist) - - - begin - ((>))(?!</plist) - beginCaptures - - 1 - - name - meta.tag.plist.xml.plist - - 2 - - name - punctuation.definition.tag.xml.plist - - - end - (<)(?=/plist) - endCaptures - - 0 - - name - meta.tag.plist.xml.plist - - 1 - - name - punctuation.definition.tag.xml.plist - - - patterns - - - include - #xml_tags - - - - - - - include - #xml_invalid - - - include - #xml_comment - - - include - text.xml - - - include - #xml_stray-char - - - - xml_comment - - begin - <!-- - captures - - 0 - - name - punctuation.definition.comment.xml.plist - - - end - (?<!-)--> - name - comment.block.xml.plist - patterns - - - match - -(?=-->)|-- - name - invalid.illegal.double-dash-not-allowed.xml.plist - - - - xml_innertag - - patterns - - - match - &([a-zA-Z0-9_-]+|#[0-9]+|#x[0-9a-fA-F]+); - name - constant.character.entity.xml.plist - - - match - & - name - invalid.illegal.bad-ampersand.xml.plist - - - - xml_invalid - - captures - - 1 - - name - meta.tag.boolean.xml.plist - - 2 - - name - punctuation.definition.tag.xml.plist - - 3 - - name - invalid.illegal.tag-not-recognized.xml.plist - - 4 - - name - punctuation.definition.tag.xml.plist - - - comment - Invalid tag - match - ((<)/?(\w+).*?(>)) - - xml_stray-char - - match - \S - name - invalid.illegal.character-data-not-allowed-here.xml.plist - - xml_tags - - patterns - - - captures - - 1 - - name - meta.tag.dict.xml.plist - - 10 - - name - entity.name.tag.localname.xml.plist - - 11 - - name - punctuation.definition.tag.xml.plist - - 2 - - name - punctuation.definition.tag.xml.plist - - 3 - - name - entity.name.tag.xml.plist - - 4 - - name - entity.name.tag.localname.xml.plist - - 5 - - name - punctuation.definition.tag.xml.plist - - 6 - - name - meta.tag.dict.xml.plist - - 7 - - name - punctuation.definition.tag.xml.plist - - 8 - - name - meta.scope.between-tag-pair.xml.plist - - 9 - - name - entity.name.tag.xml.plist - - - comment - Empty tag: Dictionary - match - ((<)((dict))(>))(((<)/)((dict))(>)) - - - captures - - 1 - - name - meta.tag.array.xml.plist - - 10 - - name - entity.name.tag.localname.xml.plist - - 11 - - name - punctuation.definition.tag.xml.plist - - 2 - - name - punctuation.definition.tag.xml.plist - - 3 - - name - entity.name.tag.xml.plist - - 4 - - name - entity.name.tag.localname.xml.plist - - 5 - - name - punctuation.definition.tag.xml.plist - - 6 - - name - meta.tag.array.xml.plist - - 7 - - name - punctuation.definition.tag.xml.plist - - 8 - - name - meta.scope.between-tag-pair.xml.plist - - 9 - - name - entity.name.tag.xml.plist - - - comment - Empty tag: Array - match - ((<)((array))(>))(((<)/)((array))(>)) - - - captures - - 1 - - name - meta.tag.string.xml.plist - - 10 - - name - entity.name.tag.localname.xml.plist - - 11 - - name - punctuation.definition.tag.xml.plist - - 2 - - name - punctuation.definition.tag.xml.plist - - 3 - - name - entity.name.tag.xml.plist - - 4 - - name - entity.name.tag.localname.xml.plist - - 5 - - name - punctuation.definition.tag.xml.plist - - 6 - - name - meta.tag.string.xml.plist - - 7 - - name - punctuation.definition.tag.xml.plist - - 8 - - name - meta.scope.between-tag-pair.xml.plist - - 9 - - name - entity.name.tag.xml.plist - - - comment - Empty tag: String - match - ((<)((string))(>))(((<)/)((string))(>)) - - - begin - ((<)((key))(>)) - captures - - 1 - - name - meta.tag.key.xml.plist - - 2 - - name - punctuation.definition.tag.xml.plist - - 3 - - name - entity.name.tag.xml.plist - - 4 - - name - entity.name.tag.localname.xml.plist - - 5 - - name - punctuation.definition.tag.xml.plist - - - comment - the extra captures are required to duplicate the effect of the namespace parsing in the XML syntax - contentName - constant.other.name.xml.plist - end - ((</)((key))(>)) - patterns - - - begin - <!\[CDATA\[ - captures - - 0 - - name - punctuation.definition.constant.xml - - - end - ]]> - - - - - captures - - 1 - - name - meta.tag.dict.xml.plist - - 2 - - name - punctuation.definition.tag.xml.plist - - 3 - - name - entity.name.tag.xml.plist - - 4 - - name - entity.name.tag.localname.xml.plist - - 5 - - name - punctuation.definition.tag.xml.plist - - - comment - Self-closing Dictionary - match - ((<)((dict))\s*?/(>)) - - - captures - - 1 - - name - meta.tag.array.xml.plist - - 2 - - name - punctuation.definition.tag.xml.plist - - 3 - - name - entity.name.tag.xml.plist - - 4 - - name - entity.name.tag.localname.xml.plist - - 5 - - name - punctuation.definition.tag.xml.plist - - - comment - Self-closing Array - match - ((<)((array))\s*?/(>)) - - - captures - - 1 - - name - meta.tag.string.xml.plist - - 2 - - name - punctuation.definition.tag.xml.plist - - 3 - - name - entity.name.tag.xml.plist - - 4 - - name - entity.name.tag.localname.xml.plist - - 5 - - name - punctuation.definition.tag.xml.plist - - - comment - Self-closing String - match - ((<)((string))\s*?/(>)) - - - captures - - 1 - - name - meta.tag.key.xml.plist - - 2 - - name - punctuation.definition.tag.xml.plist - - 3 - - name - entity.name.tag.xml.plist - - 4 - - name - entity.name.tag.localname.xml.plist - - 5 - - name - punctuation.definition.tag.xml.plist - - - comment - Self-closing Key - match - ((<)((key))\s*?/(>)) - - - begin - ((<)((dict))(>)) - captures - - 1 - - name - meta.tag.dict.xml.plist - - 2 - - name - punctuation.definition.tag.xml.plist - - 3 - - name - entity.name.tag.xml.plist - - 4 - - name - entity.name.tag.localname.xml.plist - - 5 - - name - punctuation.definition.tag.xml.plist - - - comment - Dictionary - end - ((</)((dict))(>)) - patterns - - - include - #xml_tags - - - - - begin - ((<)((array))(>)) - captures - - 1 - - name - meta.tag.array.xml.plist - - 2 - - name - punctuation.definition.tag.xml.plist - - 3 - - name - entity.name.tag.xml.plist - - 4 - - name - entity.name.tag.localname.xml.plist - - 5 - - name - punctuation.definition.tag.xml.plist - - - comment - Array - end - ((</)((array))(>)) - patterns - - - include - #xml_tags - - - - - begin - ((<)((string))(>)) - captures - - 1 - - name - meta.tag.string.xml.plist - - 2 - - name - punctuation.definition.tag.xml.plist - - 3 - - name - entity.name.tag.xml.plist - - 4 - - name - entity.name.tag.localname.xml.plist - - 5 - - name - punctuation.definition.tag.xml.plist - - - comment - Strings - contentName - string.quoted.other.xml.plist - end - ((</)((string))(>)) - patterns - - - include - #xml_innertag - - - begin - <!\[CDATA\[ - captures - - 0 - - name - punctuation.definition.string.xml - - - end - ]]> - name - string.unquoted.cdata.xml - - - - - begin - ((<)((real))(>)) - captures - - 1 - - name - meta.tag.real.xml.plist - - 2 - - name - punctuation.definition.tag.xml.plist - - 3 - - name - entity.name.tag.xml.plist - - 4 - - name - entity.name.tag.localname.xml.plist - - 5 - - name - punctuation.definition.tag.xml.plist - - - comment - Numeric - end - ((</)((real))(>)) - patterns - - - begin - (<!\[CDATA\[) - captures - - 0 - - name - punctuation.definition.constant.xml - - 1 - - name - constant.numeric.real.xml.plist - - - end - (]]>) - patterns - - - match - [-+]?\d+(\.\d*)?(E[-+]\d+)? - name - constant.numeric.real.xml.plist - - - match - . - name - invalid.illegal.not-a-number.xml.plist - - - - - match - [-+]?\d+(\.\d*)?(E[-+]\d+)? - name - constant.numeric.real.xml.plist - - - match - . - name - invalid.illegal.not-a-number.xml.plist - - - - - begin - ((<)((integer))(>)) - captures - - 1 - - name - meta.tag.integer.xml.plist - - 2 - - name - punctuation.definition.tag.xml.plist - - 3 - - name - entity.name.tag.xml.plist - - 4 - - name - entity.name.tag.localname.xml.plist - - 5 - - name - punctuation.definition.tag.xml.plist - - - comment - Integer - end - ((</)((integer))(>)) - patterns - - - match - [-+]?\d+ - name - constant.numeric.integer.xml.plist - - - match - . - name - invalid.illegal.not-a-number.xml.plist - - - - - captures - - 1 - - name - meta.tag.boolean.xml.plist - - 2 - - name - punctuation.definition.tag.xml.plist - - 3 - - name - entity.name.tag.xml.plist - - 4 - - name - entity.name.tag.localname.xml.plist - - 5 - - name - punctuation.definition.tag.xml.plist - - - comment - Boolean - match - ((<)((true|false))\s*?(/>)) - - - begin - ((<)((data))(>)) - captures - - 1 - - name - meta.tag.data.xml.plist - - 2 - - name - punctuation.definition.tag.xml.plist - - 3 - - name - entity.name.tag.xml.plist - - 4 - - name - entity.name.tag.localname.xml.plist - - 5 - - name - punctuation.definition.tag.xml.plist - - - comment - Data - end - ((</)((data))(>)) - patterns - - - match - [A-Za-z0-9+/] - name - constant.numeric.base64.xml.plist - - - match - = - name - constant.numeric.base64.xml.plist - - - match - [^ \n\t] - name - invalid.illegal.invalid-character.xml.plist - - - - - begin - ((<)((date))(>)) - captures - - 1 - - name - meta.tag.date.xml.plist - - 2 - - name - punctuation.definition.tag.xml.plist - - 3 - - name - entity.name.tag.xml.plist - - 4 - - name - entity.name.tag.localname.xml.plist - - 5 - - name - punctuation.definition.tag.xml.plist - - - comment - Date - end - ((</)((date))(>)) - patterns - - - match - (?x) - [0-9]{4} # Year - - # Divider - (0[1-9]|1[012]) # Month - - # Divider - (?!00|3[2-9])[0-3][0-9] # Day - T # Separator - (?!2[5-9])[0-2][0-9] # Hour - : # Divider - [0-5][0-9] # Minute - : # Divider - (?!6[1-9])[0-6][0-9] # Second - Z # Zulu - - name - constant.other.date.xml.plist - - - - - include - #xml_invalid - - - include - #xml_comment - - - include - #xml_stray-char - - - - - scopeName - text.xml.plist - uuid - 76F96472-7552-4884-80B0-BC73CE4DE635 - - diff --git a/backend/textmate/testdata/XML.plist b/backend/textmate/testdata/XML.plist deleted file mode 100644 index 062d5a5..0000000 --- a/backend/textmate/testdata/XML.plist +++ /dev/null @@ -1,573 +0,0 @@ - - - - - fileTypes - - xml - xsd - tld - jsp - pt - cpt - dtml - rss - opml - - keyEquivalent - ^~X - name - XML - patterns - - - begin - (<\?)\s*([-_a-zA-Z0-9]+) - captures - - 1 - - name - punctuation.definition.tag.xml - - 2 - - name - entity.name.tag.xml - - - end - (\?>) - name - meta.tag.preprocessor.xml - patterns - - - match - ([a-zA-Z-]+) - name - entity.other.attribute-name.xml - - - include - #doublequotedString - - - include - #singlequotedString - - - - - begin - (<!)(DOCTYPE)\s+([:a-zA-Z_][:a-zA-Z0-9_.-]*) - captures - - 1 - - name - punctuation.definition.tag.xml - - 2 - - name - keyword.other.doctype.xml - - 3 - - name - variable.language.documentroot.xml - - - end - \s*(>) - name - meta.tag.sgml.doctype.xml - patterns - - - include - #internalSubset - - - - - begin - <[!%]-- - captures - - 0 - - name - punctuation.definition.comment.xml - - - end - --%?> - name - comment.block.xml - - - begin - (<)((?:([-_a-zA-Z0-9]+)((:)))?([-_a-zA-Z0-9:]+))(?=(\s[^>]*)?></\2>) - beginCaptures - - 1 - - name - punctuation.definition.tag.xml - - 3 - - name - entity.name.tag.namespace.xml - - 4 - - name - entity.name.tag.xml - - 5 - - name - punctuation.separator.namespace.xml - - 6 - - name - entity.name.tag.localname.xml - - - end - (>(<))/(?:([-_a-zA-Z0-9]+)((:)))?([-_a-zA-Z0-9:]+)(>) - endCaptures - - 1 - - name - punctuation.definition.tag.xml - - 2 - - name - meta.scope.between-tag-pair.xml - - 3 - - name - entity.name.tag.namespace.xml - - 4 - - name - entity.name.tag.xml - - 5 - - name - punctuation.separator.namespace.xml - - 6 - - name - entity.name.tag.localname.xml - - 7 - - name - punctuation.definition.tag.xml - - - name - meta.tag.no-content.xml - patterns - - - include - #tagStuff - - - - - begin - (</?)(?:([-_a-zA-Z0-9]+)((:)))?([-_a-zA-Z0-9:]+) - captures - - 1 - - name - punctuation.definition.tag.xml - - 2 - - name - entity.name.tag.namespace.xml - - 3 - - name - entity.name.tag.xml - - 4 - - name - punctuation.separator.namespace.xml - - 5 - - name - entity.name.tag.localname.xml - - - end - (/?>) - name - meta.tag.xml - patterns - - - include - #tagStuff - - - - - include - #entity - - - include - #bare-ampersand - - - begin - <%@ - beginCaptures - - 0 - - name - punctuation.section.embedded.begin.xml - - - end - %> - endCaptures - - 0 - - name - punctuation.section.embedded.end.xml - - - name - source.java-props.embedded.xml - patterns - - - match - page|include|taglib - name - keyword.other.page-props.xml - - - - - begin - <%[!=]?(?!--) - beginCaptures - - 0 - - name - punctuation.section.embedded.begin.xml - - - end - (?!--)%> - endCaptures - - 0 - - name - punctuation.section.embedded.end.xml - - - name - source.java.embedded.xml - patterns - - - include - source.java - - - - - begin - <!\[CDATA\[ - beginCaptures - - 0 - - name - punctuation.definition.string.begin.xml - - - end - ]]> - endCaptures - - 0 - - name - punctuation.definition.string.end.xml - - - name - string.unquoted.cdata.xml - - - repository - - EntityDecl - - begin - (<!)(ENTITY)\s+(%\s+)?([:a-zA-Z_][:a-zA-Z0-9_.-]*)(\s+(?:SYSTEM|PUBLIC)\s+)? - captures - - 1 - - name - punctuation.definition.tag.xml - - 2 - - name - keyword.other.entity.xml - - 3 - - name - punctuation.definition.entity.xml - - 4 - - name - variable.language.entity.xml - - 5 - - name - keyword.other.entitytype.xml - - - end - (>) - patterns - - - include - #doublequotedString - - - include - #singlequotedString - - - - bare-ampersand - - match - & - name - invalid.illegal.bad-ampersand.xml - - doublequotedString - - begin - " - beginCaptures - - 0 - - name - punctuation.definition.string.begin.xml - - - end - " - endCaptures - - 0 - - name - punctuation.definition.string.end.xml - - - name - string.quoted.double.xml - patterns - - - include - #entity - - - include - #bare-ampersand - - - - entity - - captures - - 1 - - name - punctuation.definition.constant.xml - - 3 - - name - punctuation.definition.constant.xml - - - match - (&)([:a-zA-Z_][:a-zA-Z0-9_.-]*|#[0-9]+|#x[0-9a-fA-F]+)(;) - name - constant.character.entity.xml - - internalSubset - - begin - (\[) - captures - - 1 - - name - punctuation.definition.constant.xml - - - end - (\]) - name - meta.internalsubset.xml - patterns - - - include - #EntityDecl - - - include - #parameterEntity - - - - parameterEntity - - captures - - 1 - - name - punctuation.definition.constant.xml - - 3 - - name - punctuation.definition.constant.xml - - - match - (%)([:a-zA-Z_][:a-zA-Z0-9_.-]*)(;) - name - constant.character.parameter-entity.xml - - singlequotedString - - begin - ' - beginCaptures - - 0 - - name - punctuation.definition.string.begin.xml - - - end - ' - endCaptures - - 0 - - name - punctuation.definition.string.end.xml - - - name - string.quoted.single.xml - patterns - - - include - #entity - - - include - #bare-ampersand - - - - tagStuff - - patterns - - - captures - - 1 - - name - entity.other.attribute-name.namespace.xml - - 2 - - name - entity.other.attribute-name.xml - - 3 - - name - punctuation.separator.namespace.xml - - 4 - - name - entity.other.attribute-name.localname.xml - - - match - (?:([-_a-zA-Z0-9]+)((:)))?([-_a-zA-Z0-9]+)= - - - include - #doublequotedString - - - include - #singlequotedString - - - - - scopeName - text.xml - uuid - D3C4E6DA-6B1C-11D9-8CC2-000D93589AF6 - - diff --git a/backend/textmate/testdata/go2.go b/backend/textmate/testdata/go2.go deleted file mode 100644 index d745929..0000000 --- a/backend/textmate/testdata/go2.go +++ /dev/null @@ -1,9 +0,0 @@ -// test - -package main - -import ( - "code.google.com/p/log4go" - - // "fmt" -) diff --git a/backend/textmate/testdata/go2.go.res b/backend/textmate/testdata/go2.go.res deleted file mode 100644 index f4a2111..0000000 --- a/backend/textmate/testdata/go2.go.res +++ /dev/null @@ -1,15 +0,0 @@ -0-71: "source.go" - 0-8: "" - 0-8: "comment.line.double-slash.go" - 0-2: "punctuation.definition.comment.go" - Data: "//" - 9-16: "keyword.control.go" - Data: "package" - 23-29: "keyword.control.go" - Data: "import" - 30-31: "meta.parens.go" - Data: "(" - 33-59: "string.quoted.double.go" - 33-34: "punctuation.definition.string.begin.go" - Data: """ - 58-59: "punctuation.definition.string.end.go" - Data: """ - 61-62: "" - 61-62: "punctuation.whitespace.comment.leading.go" - Data: " " - 62-71: "" - 62-71: "comment.line.double-slash.go" - 62-64: "punctuation.definition.comment.go" - Data: "//" diff --git a/backend/textmate/testdata/main.go b/backend/textmate/testdata/main.go deleted file mode 100644 index fbddb0b..0000000 --- a/backend/textmate/testdata/main.go +++ /dev/null @@ -1,441 +0,0 @@ -package main - -import ( - "code.google.com/p/log4go" - "fmt" - "io/ioutil" - "lime/3rdparty/libs/termbox-go" - "lime/backend" - "lime/backend/loaders" - "lime/backend/primitives" - "lime/backend/sublime" - "lime/backend/textmate" - "strings" - "time" -) - -var ( - lut = map[termbox.Key]backend.KeyPress{ - termbox.KeyCtrlA: backend.KeyPress{Ctrl: true, Key: 'a'}, - termbox.KeyCtrlB: backend.KeyPress{Ctrl: true, Key: 'b'}, - termbox.KeyCtrlC: backend.KeyPress{Ctrl: true, Key: 'c'}, - termbox.KeyCtrlD: backend.KeyPress{Ctrl: true, Key: 'd'}, - termbox.KeyCtrlE: backend.KeyPress{Ctrl: true, Key: 'e'}, - termbox.KeyCtrlF: backend.KeyPress{Ctrl: true, Key: 'f'}, - termbox.KeyCtrlG: backend.KeyPress{Ctrl: true, Key: 'g'}, - termbox.KeyCtrlH: backend.KeyPress{Ctrl: true, Key: 'h'}, - termbox.KeyCtrlJ: backend.KeyPress{Ctrl: true, Key: 'j'}, - termbox.KeyCtrlK: backend.KeyPress{Ctrl: true, Key: 'k'}, - termbox.KeyCtrlL: backend.KeyPress{Ctrl: true, Key: 'l'}, - termbox.KeyCtrlN: backend.KeyPress{Ctrl: true, Key: 'n'}, - termbox.KeyCtrlO: backend.KeyPress{Ctrl: true, Key: 'o'}, - termbox.KeyCtrlP: backend.KeyPress{Ctrl: true, Key: 'p'}, - termbox.KeyCtrlQ: backend.KeyPress{Ctrl: true, Key: 'q'}, - termbox.KeyCtrlR: backend.KeyPress{Ctrl: true, Key: 'r'}, - termbox.KeyCtrlS: backend.KeyPress{Ctrl: true, Key: 's'}, - termbox.KeyCtrlT: backend.KeyPress{Ctrl: true, Key: 't'}, - termbox.KeyCtrlU: backend.KeyPress{Ctrl: true, Key: 'u'}, - termbox.KeyCtrlV: backend.KeyPress{Ctrl: true, Key: 'v'}, - termbox.KeyCtrlW: backend.KeyPress{Ctrl: true, Key: 'w'}, - termbox.KeyCtrlX: backend.KeyPress{Ctrl: true, Key: 'x'}, - termbox.KeyCtrlY: backend.KeyPress{Ctrl: true, Key: 'y'}, - termbox.KeyCtrlZ: backend.KeyPress{Ctrl: true, Key: 'z'}, - termbox.KeyCtrl2: backend.KeyPress{Ctrl: true, Key: '2'}, - termbox.KeyCtrl4: backend.KeyPress{Ctrl: true, Key: '4'}, - termbox.KeyCtrl5: backend.KeyPress{Ctrl: true, Key: '5'}, - termbox.KeyCtrl6: backend.KeyPress{Ctrl: true, Key: '6'}, - termbox.KeyCtrl7: backend.KeyPress{Ctrl: true, Key: '7'}, - termbox.KeyEnter: backend.KeyPress{Key: backend.Enter}, - termbox.KeySpace: backend.KeyPress{Key: ' '}, - termbox.KeyBackspace2: backend.KeyPress{Key: backend.Backspace}, - termbox.KeyArrowUp: backend.KeyPress{Key: backend.Up}, - termbox.KeyArrowDown: backend.KeyPress{Key: backend.Down}, - termbox.KeyArrowLeft: backend.KeyPress{Key: backend.Left}, - termbox.KeyArrowRight: backend.KeyPress{Key: backend.Right}, - termbox.KeyDelete: backend.KeyPress{Key: backend.Delete}, - termbox.KeyEsc: backend.KeyPress{Key: backend.Escape}, - termbox.KeyTab: backend.KeyPress{Key: '\t'}, - } - schemelut = make(map[string][2]termbox.Attribute) - defaultBg = termbox.ColorBlack - defaultFg = termbox.ColorWhite - blink bool -) - -const console_height = 20 - -type tbfe struct { - visibleregion map[*backend.View]primitives.Region - status_message string - active_window *backend.Window -} - -func (t *tbfe) ActiveWindow() *backend.Window { - return t.active_window -} - -func (t *tbfe) ActiveView(w *backend.Window) *backend.View { - if w == nil { - return nil - } - if v := w.Views(); len(v) > 0 { - return v[0] - } - return nil -} - -func (t *tbfe) renderView(sx, sy, w, h int, v *backend.View) { - sel := v.Sel() - substr := v.Buffer().Data() - vr := t.VisibleRegion(v) - lines := strings.Split(substr, "\n") - s, _ := v.Buffer().RowCol(vr.Begin()) - e, _ := v.Buffer().RowCol(vr.End()) - if e > 1 { - e = e - 1 - if e > h { - s = e - h - } - } - off := len(strings.Join(lines[:s], "\n")) - lines = lines[s:e] - runes := []rune(strings.Join(lines, "\n")) - x, y := sx, sy - ex, ey := sx+w, sy+h - - sub2 := "" - var ( - lastScope string - lfg, lbg = defaultFg, defaultBg - ) - - tab_size, ok := v.Settings().Get("tab_size", 4).(int) - if !ok { - tab_size = 4 - } - caret_style := termbox.AttrUnderline - if b, ok := v.Settings().Get("caret_style", "underline").(string); ok { - if b == "block" { - caret_style = termbox.AttrReverse - } - } - if b, ok := v.Settings().Get("inverse_caret_state", false).(bool); !b && ok { - if caret_style == termbox.AttrReverse { - caret_style = termbox.AttrUnderline - } else { - caret_style = termbox.AttrReverse - } - } - caret_blink := true - if b, ok := v.Settings().Get("caret_blink", true).(bool); ok { - caret_blink = b - } - - for i := range runes { - sub2 += string(runes[i]) - - if x < ex { - o := off + len(sub2) - r := primitives.Region{o, o} - fg, bg := lfg, lbg - scope := v.ScopeName(o) - if scope != lastScope { - fg, bg = defaultFg, defaultBg - lastScope = scope - na := scope - for len(na) > 0 { - sn := na - i := strings.LastIndex(sn, " ") - if i != -1 { - sn = sn[i+1:] - } - if c, ok := schemelut[sn]; ok { - fg, bg = c[0], c[1] - break - } - if i2 := strings.LastIndex(na, "."); i2 == -1 { - break - } else if i > i2 { - na = na[:i] - } else { - na = strings.TrimSpace(na[:i2]) - } - } - lfg, lbg = fg, bg - } else { - fg, bg = lfg, lbg - } - for _, r2 := range sel.Regions() { - if r2.B == r.B { - if !caret_blink || blink { - if r2.Contains(o) { - fg |= termbox.AttrReverse - } else { - fg |= caret_style - } - } - break - } else if r2.Contains(o) { - fg |= termbox.AttrReverse - break - } - } - if runes[i] == '\t' { - add := (x + 1 + (tab_size - 1)) &^ (tab_size - 1) - - for x < add { - termbox.SetCell(x, y, ' ', fg, bg) - x++ - } - continue - } else if runes[i] == '\n' { - termbox.SetCell(x, y, ' ', fg, bg) - x = sx - y++ - if y > ey { - break - } - continue - } - termbox.SetCell(x, y, runes[i], fg, bg) - } - x++ - } -} - -func (t *tbfe) clip(v *backend.View, r primitives.Region) primitives.Region { - s, _ := v.Buffer().RowCol(r.Begin()) - e, _ := v.Buffer().RowCol(r.End()) - - _, h := termbox.Size() - h -= console_height - if e-s > h { - e = s + h - } - if e2, _ := v.Buffer().RowCol(v.Buffer().TextPoint(e, 1)); e2 < e { - e = e2 - } - if e-s < h { - s = e - h - } - if s < 1 { - s = 1 - } - r.A = v.Buffer().Line(v.Buffer().TextPoint(s, 1)).A - r.B = v.Buffer().Line(v.Buffer().TextPoint(e, 1)).B - return r -} - -func (t *tbfe) Show(v *backend.View, r primitives.Region) { - t.visibleregion[v] = t.clip(v, primitives.Region{r.Begin(), v.Buffer().Size()}) -} - -func (t *tbfe) VisibleRegion(v *backend.View) primitives.Region { - if r, ok := t.visibleregion[v]; ok { - return r - } else { - t.Show(v, primitives.Region{0, 0}) - return t.visibleregion[v] - } -} - -func (t *tbfe) StatusMessage(msg string) { - t.status_message = msg -} - -func (t *tbfe) ErrorMessage(msg string) { - log4go.Error(msg) -} - -// TODO(q): Actually show a dialog -func (t *tbfe) MessageDialog(msg string) { - log4go.Info(msg) -} - -// TODO(q): Actually show a dialog -func (t *tbfe) OkCancelDialog(msg, ok string) { - log4go.Info(msg, ok) -} - -func (t *tbfe) scroll(b *primitives.Buffer, pos, delta int) { - t.Show(backend.GetEditor().Console(), primitives.Region{b.Size(), b.Size()}) -} - -func (t *tbfe) loop() { - ed := backend.GetEditor() - ed.SetFrontend(t) - //ed.LogInput(true) - //ed.LogCommands(true) - c := ed.Console() - var ( - scheme textmate.Theme - ) - - if d, err := ioutil.ReadFile("../../3rdparty/bundles/TextMate-Themes/GlitterBomb.tmTheme"); err != nil { - log4go.Error("Unable to load colorscheme definition: %s", err) - } else if err := loaders.LoadPlist(d, &scheme); err != nil { - log4go.Error("Unable to load colorscheme definition: %s", err) - } - - var ( - palLut func(col textmate.Color) termbox.Attribute - pal = make([]termbox.RGB, 0, 256) - mode256 bool - ) - - if err := termbox.SetColorMode(termbox.ColorMode256); err != nil { - log4go.Error("Unable to use 256 color mode: %s", err) - } else { - log4go.Debug("Using 256 color mode") - mode256 = true - } - - if !mode256 { - pal = pal[:10] // Not correct, but whatever - pal[termbox.ColorBlack] = termbox.RGB{0, 0, 0} - pal[termbox.ColorWhite] = termbox.RGB{255, 255, 255} - pal[termbox.ColorRed] = termbox.RGB{255, 0, 0} - pal[termbox.ColorGreen] = termbox.RGB{0, 255, 0} - pal[termbox.ColorBlue] = termbox.RGB{0, 0, 255} - pal[termbox.ColorMagenta] = termbox.RGB{255, 0, 255} - pal[termbox.ColorYellow] = termbox.RGB{255, 255, 0} - pal[termbox.ColorCyan] = termbox.RGB{0, 255, 255} - - diff := func(i, j byte) int { - v := int(i) - int(j) - if v < 0 { - return -v - } - return v - } - palLut = func(col textmate.Color) termbox.Attribute { - mindist := 10000000 - mini := 0 - for i, c := range pal { - if dist := diff(c.R, col.R) + diff(c.G, col.G) + diff(c.B, col.B); dist < mindist { - mindist = dist - mini = i - } - } - return termbox.Attribute(mini) - } - } else { - palLut = func(col textmate.Color) termbox.Attribute { - tc := termbox.RGB{col.R, col.G, col.B} - for i, c := range pal { - if c == tc { - return termbox.Attribute(i) - } - } - l := len(pal) - pal = append(pal, tc) - return termbox.Attribute(l) - } - } - for i, s := range scheme.Settings { - var ( - fi = defaultFg - bi = defaultBg - ) - if fg, ok := s.Settings["foreground"]; ok { - fi = palLut(fg) - if i == 0 { - defaultFg = fi - } - } - if bg, ok := s.Settings["background"]; ok { - bi = palLut(bg) - if i == 0 { - defaultBg = bi - } - } - schemelut[s.Scope] = [2]termbox.Attribute{fi, bi} - } - if mode256 { - termbox.SetColorPalette(pal) - } - defer func() { - termbox.Close() - fmt.Println(c.Buffer().Data()) - }() - - w := ed.NewWindow() - t.active_window = w - v := w.OpenFile("main.go", 0) - v.Settings().Set("trace", true) - c.Buffer().AddCallback(t.scroll) - - if err := v.SetSyntaxFile("../../3rdparty/bundles/GoSublime/GoSublime.tmLanguage"); err != nil { - log4go.Error("Unable to set syntax file: %s", err) - } - sel := v.Sel() - sel.Clear() - // end := v.Buffer().Size() - 2 - sel.Add(primitives.Region{0, 0}) - // sel.Add(primitives.Region{end - 22, end - 22}) - // sel.Add(primitives.Region{end - 16, end - 20}) - // sel.Add(primitives.Region{end - 13, end - 10}) - - evchan := make(chan termbox.Event) - - go func() { - for { - evchan <- termbox.PollEvent() - } - }() - - sublime.Init() - for { - blink = !blink - termbox.Clear(defaultFg, defaultBg) - w, h := termbox.Size() - - t.renderView(0, 0, w, h-console_height, v) - t.renderView(0, h-(console_height), w, (console_height - 1), c) - runes := []rune(t.status_message) - for i := 0; i < w && i < len(runes); i++ { - termbox.SetCell(i, h-1, runes[i], defaultFg, defaultBg) - } - termbox.Flush() - - blink_phase := time.Second - if p, ok := ed.Settings().Get("caret_blink_phase", 1.0).(float64); ok { - blink_phase = time.Duration(float64(time.Second) * p) - } - - select { - case ev := <-evchan: - switch ev.Type { - case termbox.EventKey: - var kp backend.KeyPress - - if ev.Ch != 0 { - kp.Key = backend.Key(ev.Ch) - } else if v2, ok := lut[ev.Key]; ok { - kp = v2 - } else { - break - } - - if ev.Key == termbox.KeyCtrlQ { - return - } - ed.HandleInput(kp) - blink = false - } - case <-time.After(blink_phase / 2): - // Divided by two since we're only doing a simple toggle blink - // TODO(q): Shouldn't redraw if blink is disabled... - } - } -} - -func main() { - if err := termbox.Init(); err != nil { - log4go.Exit(err) - } - - var t tbfe - t.visibleregion = make(map[*backend.View]primitives.Region) - t.loop() -} diff --git a/backend/textmate/testdata/main.go.res b/backend/textmate/testdata/main.go.res deleted file mode 100644 index 61b39f2..0000000 --- a/backend/textmate/testdata/main.go.res +++ /dev/null @@ -1,1792 +0,0 @@ -0-11368: "source.go" - 0-7: "keyword.control.go" - Data: "package" - 14-20: "keyword.control.go" - Data: "import" - 21-22: "meta.parens.go" - Data: "(" - 24-50: "string.quoted.double.go" - 24-25: "punctuation.definition.string.begin.go" - Data: """ - 49-50: "punctuation.definition.string.end.go" - Data: """ - 52-57: "string.quoted.double.go" - 52-53: "punctuation.definition.string.begin.go" - Data: """ - 56-57: "punctuation.definition.string.end.go" - Data: """ - 59-70: "string.quoted.double.go" - 59-60: "punctuation.definition.string.begin.go" - Data: """ - 69-70: "punctuation.definition.string.end.go" - Data: """ - 72-103: "string.quoted.double.go" - 72-73: "punctuation.definition.string.begin.go" - Data: """ - 102-103: "punctuation.definition.string.end.go" - Data: """ - 105-119: "string.quoted.double.go" - 105-106: "punctuation.definition.string.begin.go" - Data: """ - 118-119: "punctuation.definition.string.end.go" - Data: """ - 121-143: "string.quoted.double.go" - 121-122: "punctuation.definition.string.begin.go" - Data: """ - 142-143: "punctuation.definition.string.end.go" - Data: """ - 145-170: "string.quoted.double.go" - 145-146: "punctuation.definition.string.begin.go" - Data: """ - 169-170: "punctuation.definition.string.end.go" - Data: """ - 172-194: "string.quoted.double.go" - 172-173: "punctuation.definition.string.begin.go" - Data: """ - 193-194: "punctuation.definition.string.end.go" - Data: """ - 196-219: "string.quoted.double.go" - 196-197: "punctuation.definition.string.begin.go" - Data: """ - 218-219: "punctuation.definition.string.end.go" - Data: """ - 221-230: "string.quoted.double.go" - 221-222: "punctuation.definition.string.begin.go" - Data: """ - 229-230: "punctuation.definition.string.end.go" - Data: """ - 232-238: "string.quoted.double.go" - 232-233: "punctuation.definition.string.begin.go" - Data: """ - 237-238: "punctuation.definition.string.end.go" - Data: """ - 242-245: "keyword.control.go" - Data: "var" - 246-247: "meta.parens.go" - Data: "(" - 255-258: "storage.modifier.go" - Data: "map" - 267-270: "variable.other.dot-access.go" - Data: "Key" - 279-287: "variable.other.dot-access.go" - Data: "KeyPress" - 287-2788: "meta.block.go" - 287-288: "punctuation.section.block.begin.go" - Data: "{" - 299-307: "variable.other.dot-access.go" - Data: "KeyCtrlA" - 322-330: "variable.other.dot-access.go" - Data: "KeyPress" - 330-352: "meta.block.go" - 330-331: "punctuation.section.function-block.begin.go" - Data: "{" - 337-341: "constant.language.go" - Data: "true" - 348-351: "string.quoted.single.go" - 348-349: "punctuation.definition.string.begin.go" - Data: "'" - 350-351: "punctuation.definition.string.end.go" - Data: "'" - 351-352: "punctuation.section.function-block.end.go" - Data: "}" - 364-372: "variable.other.dot-access.go" - Data: "KeyCtrlB" - 387-395: "variable.other.dot-access.go" - Data: "KeyPress" - 395-417: "meta.block.go" - 395-396: "punctuation.section.function-block.begin.go" - Data: "{" - 402-406: "constant.language.go" - Data: "true" - 413-416: "string.quoted.single.go" - 413-414: "punctuation.definition.string.begin.go" - Data: "'" - 415-416: "punctuation.definition.string.end.go" - Data: "'" - 416-417: "punctuation.section.function-block.end.go" - Data: "}" - 429-437: "variable.other.dot-access.go" - Data: "KeyCtrlC" - 452-460: "variable.other.dot-access.go" - Data: "KeyPress" - 460-482: "meta.block.go" - 460-461: "punctuation.section.function-block.begin.go" - Data: "{" - 467-471: "constant.language.go" - Data: "true" - 478-481: "string.quoted.single.go" - 478-479: "punctuation.definition.string.begin.go" - Data: "'" - 480-481: "punctuation.definition.string.end.go" - Data: "'" - 481-482: "punctuation.section.function-block.end.go" - Data: "}" - 494-502: "variable.other.dot-access.go" - Data: "KeyCtrlD" - 517-525: "variable.other.dot-access.go" - Data: "KeyPress" - 525-547: "meta.block.go" - 525-526: "punctuation.section.function-block.begin.go" - Data: "{" - 532-536: "constant.language.go" - Data: "true" - 543-546: "string.quoted.single.go" - 543-544: "punctuation.definition.string.begin.go" - Data: "'" - 545-546: "punctuation.definition.string.end.go" - Data: "'" - 546-547: "punctuation.section.function-block.end.go" - Data: "}" - 559-567: "variable.other.dot-access.go" - Data: "KeyCtrlE" - 582-590: "variable.other.dot-access.go" - Data: "KeyPress" - 590-612: "meta.block.go" - 590-591: "punctuation.section.function-block.begin.go" - Data: "{" - 597-601: "constant.language.go" - Data: "true" - 608-611: "string.quoted.single.go" - 608-609: "punctuation.definition.string.begin.go" - Data: "'" - 610-611: "punctuation.definition.string.end.go" - Data: "'" - 611-612: "punctuation.section.function-block.end.go" - Data: "}" - 624-632: "variable.other.dot-access.go" - Data: "KeyCtrlF" - 647-655: "variable.other.dot-access.go" - Data: "KeyPress" - 655-677: "meta.block.go" - 655-656: "punctuation.section.function-block.begin.go" - Data: "{" - 662-666: "constant.language.go" - Data: "true" - 673-676: "string.quoted.single.go" - 673-674: "punctuation.definition.string.begin.go" - Data: "'" - 675-676: "punctuation.definition.string.end.go" - Data: "'" - 676-677: "punctuation.section.function-block.end.go" - Data: "}" - 689-697: "variable.other.dot-access.go" - Data: "KeyCtrlG" - 712-720: "variable.other.dot-access.go" - Data: "KeyPress" - 720-742: "meta.block.go" - 720-721: "punctuation.section.function-block.begin.go" - Data: "{" - 727-731: "constant.language.go" - Data: "true" - 738-741: "string.quoted.single.go" - 738-739: "punctuation.definition.string.begin.go" - Data: "'" - 740-741: "punctuation.definition.string.end.go" - Data: "'" - 741-742: "punctuation.section.function-block.end.go" - Data: "}" - 754-762: "variable.other.dot-access.go" - Data: "KeyCtrlH" - 777-785: "variable.other.dot-access.go" - Data: "KeyPress" - 785-807: "meta.block.go" - 785-786: "punctuation.section.function-block.begin.go" - Data: "{" - 792-796: "constant.language.go" - Data: "true" - 803-806: "string.quoted.single.go" - 803-804: "punctuation.definition.string.begin.go" - Data: "'" - 805-806: "punctuation.definition.string.end.go" - Data: "'" - 806-807: "punctuation.section.function-block.end.go" - Data: "}" - 819-827: "variable.other.dot-access.go" - Data: "KeyCtrlJ" - 842-850: "variable.other.dot-access.go" - Data: "KeyPress" - 850-872: "meta.block.go" - 850-851: "punctuation.section.function-block.begin.go" - Data: "{" - 857-861: "constant.language.go" - Data: "true" - 868-871: "string.quoted.single.go" - 868-869: "punctuation.definition.string.begin.go" - Data: "'" - 870-871: "punctuation.definition.string.end.go" - Data: "'" - 871-872: "punctuation.section.function-block.end.go" - Data: "}" - 884-892: "variable.other.dot-access.go" - Data: "KeyCtrlK" - 907-915: "variable.other.dot-access.go" - Data: "KeyPress" - 915-937: "meta.block.go" - 915-916: "punctuation.section.function-block.begin.go" - Data: "{" - 922-926: "constant.language.go" - Data: "true" - 933-936: "string.quoted.single.go" - 933-934: "punctuation.definition.string.begin.go" - Data: "'" - 935-936: "punctuation.definition.string.end.go" - Data: "'" - 936-937: "punctuation.section.function-block.end.go" - Data: "}" - 949-957: "variable.other.dot-access.go" - Data: "KeyCtrlL" - 972-980: "variable.other.dot-access.go" - Data: "KeyPress" - 980-1002: "meta.block.go" - 980-981: "punctuation.section.function-block.begin.go" - Data: "{" - 987-991: "constant.language.go" - Data: "true" - 998-1001: "string.quoted.single.go" - 998-999: "punctuation.definition.string.begin.go" - Data: "'" - 1000-1001: "punctuation.definition.string.end.go" - Data: "'" - 1001-1002: "punctuation.section.function-block.end.go" - Data: "}" - 1014-1022: "variable.other.dot-access.go" - Data: "KeyCtrlN" - 1037-1045: "variable.other.dot-access.go" - Data: "KeyPress" - 1045-1067: "meta.block.go" - 1045-1046: "punctuation.section.function-block.begin.go" - Data: "{" - 1052-1056: "constant.language.go" - Data: "true" - 1063-1066: "string.quoted.single.go" - 1063-1064: "punctuation.definition.string.begin.go" - Data: "'" - 1065-1066: "punctuation.definition.string.end.go" - Data: "'" - 1066-1067: "punctuation.section.function-block.end.go" - Data: "}" - 1079-1087: "variable.other.dot-access.go" - Data: "KeyCtrlO" - 1102-1110: "variable.other.dot-access.go" - Data: "KeyPress" - 1110-1132: "meta.block.go" - 1110-1111: "punctuation.section.function-block.begin.go" - Data: "{" - 1117-1121: "constant.language.go" - Data: "true" - 1128-1131: "string.quoted.single.go" - 1128-1129: "punctuation.definition.string.begin.go" - Data: "'" - 1130-1131: "punctuation.definition.string.end.go" - Data: "'" - 1131-1132: "punctuation.section.function-block.end.go" - Data: "}" - 1144-1152: "variable.other.dot-access.go" - Data: "KeyCtrlP" - 1167-1175: "variable.other.dot-access.go" - Data: "KeyPress" - 1175-1197: "meta.block.go" - 1175-1176: "punctuation.section.function-block.begin.go" - Data: "{" - 1182-1186: "constant.language.go" - Data: "true" - 1193-1196: "string.quoted.single.go" - 1193-1194: "punctuation.definition.string.begin.go" - Data: "'" - 1195-1196: "punctuation.definition.string.end.go" - Data: "'" - 1196-1197: "punctuation.section.function-block.end.go" - Data: "}" - 1209-1217: "variable.other.dot-access.go" - Data: "KeyCtrlQ" - 1232-1240: "variable.other.dot-access.go" - Data: "KeyPress" - 1240-1262: "meta.block.go" - 1240-1241: "punctuation.section.function-block.begin.go" - Data: "{" - 1247-1251: "constant.language.go" - Data: "true" - 1258-1261: "string.quoted.single.go" - 1258-1259: "punctuation.definition.string.begin.go" - Data: "'" - 1260-1261: "punctuation.definition.string.end.go" - Data: "'" - 1261-1262: "punctuation.section.function-block.end.go" - Data: "}" - 1274-1282: "variable.other.dot-access.go" - Data: "KeyCtrlR" - 1297-1305: "variable.other.dot-access.go" - Data: "KeyPress" - 1305-1327: "meta.block.go" - 1305-1306: "punctuation.section.function-block.begin.go" - Data: "{" - 1312-1316: "constant.language.go" - Data: "true" - 1323-1326: "string.quoted.single.go" - 1323-1324: "punctuation.definition.string.begin.go" - Data: "'" - 1325-1326: "punctuation.definition.string.end.go" - Data: "'" - 1326-1327: "punctuation.section.function-block.end.go" - Data: "}" - 1339-1347: "variable.other.dot-access.go" - Data: "KeyCtrlS" - 1362-1370: "variable.other.dot-access.go" - Data: "KeyPress" - 1370-1392: "meta.block.go" - 1370-1371: "punctuation.section.function-block.begin.go" - Data: "{" - 1377-1381: "constant.language.go" - Data: "true" - 1388-1391: "string.quoted.single.go" - 1388-1389: "punctuation.definition.string.begin.go" - Data: "'" - 1390-1391: "punctuation.definition.string.end.go" - Data: "'" - 1391-1392: "punctuation.section.function-block.end.go" - Data: "}" - 1404-1412: "variable.other.dot-access.go" - Data: "KeyCtrlT" - 1427-1435: "variable.other.dot-access.go" - Data: "KeyPress" - 1435-1457: "meta.block.go" - 1435-1436: "punctuation.section.function-block.begin.go" - Data: "{" - 1442-1446: "constant.language.go" - Data: "true" - 1453-1456: "string.quoted.single.go" - 1453-1454: "punctuation.definition.string.begin.go" - Data: "'" - 1455-1456: "punctuation.definition.string.end.go" - Data: "'" - 1456-1457: "punctuation.section.function-block.end.go" - Data: "}" - 1469-1477: "variable.other.dot-access.go" - Data: "KeyCtrlU" - 1492-1500: "variable.other.dot-access.go" - Data: "KeyPress" - 1500-1522: "meta.block.go" - 1500-1501: "punctuation.section.function-block.begin.go" - Data: "{" - 1507-1511: "constant.language.go" - Data: "true" - 1518-1521: "string.quoted.single.go" - 1518-1519: "punctuation.definition.string.begin.go" - Data: "'" - 1520-1521: "punctuation.definition.string.end.go" - Data: "'" - 1521-1522: "punctuation.section.function-block.end.go" - Data: "}" - 1534-1542: "variable.other.dot-access.go" - Data: "KeyCtrlV" - 1557-1565: "variable.other.dot-access.go" - Data: "KeyPress" - 1565-1587: "meta.block.go" - 1565-1566: "punctuation.section.function-block.begin.go" - Data: "{" - 1572-1576: "constant.language.go" - Data: "true" - 1583-1586: "string.quoted.single.go" - 1583-1584: "punctuation.definition.string.begin.go" - Data: "'" - 1585-1586: "punctuation.definition.string.end.go" - Data: "'" - 1586-1587: "punctuation.section.function-block.end.go" - Data: "}" - 1599-1607: "variable.other.dot-access.go" - Data: "KeyCtrlW" - 1622-1630: "variable.other.dot-access.go" - Data: "KeyPress" - 1630-1652: "meta.block.go" - 1630-1631: "punctuation.section.function-block.begin.go" - Data: "{" - 1637-1641: "constant.language.go" - Data: "true" - 1648-1651: "string.quoted.single.go" - 1648-1649: "punctuation.definition.string.begin.go" - Data: "'" - 1650-1651: "punctuation.definition.string.end.go" - Data: "'" - 1651-1652: "punctuation.section.function-block.end.go" - Data: "}" - 1664-1672: "variable.other.dot-access.go" - Data: "KeyCtrlX" - 1687-1695: "variable.other.dot-access.go" - Data: "KeyPress" - 1695-1717: "meta.block.go" - 1695-1696: "punctuation.section.function-block.begin.go" - Data: "{" - 1702-1706: "constant.language.go" - Data: "true" - 1713-1716: "string.quoted.single.go" - 1713-1714: "punctuation.definition.string.begin.go" - Data: "'" - 1715-1716: "punctuation.definition.string.end.go" - Data: "'" - 1716-1717: "punctuation.section.function-block.end.go" - Data: "}" - 1729-1737: "variable.other.dot-access.go" - Data: "KeyCtrlY" - 1752-1760: "variable.other.dot-access.go" - Data: "KeyPress" - 1760-1782: "meta.block.go" - 1760-1761: "punctuation.section.function-block.begin.go" - Data: "{" - 1767-1771: "constant.language.go" - Data: "true" - 1778-1781: "string.quoted.single.go" - 1778-1779: "punctuation.definition.string.begin.go" - Data: "'" - 1780-1781: "punctuation.definition.string.end.go" - Data: "'" - 1781-1782: "punctuation.section.function-block.end.go" - Data: "}" - 1794-1802: "variable.other.dot-access.go" - Data: "KeyCtrlZ" - 1817-1825: "variable.other.dot-access.go" - Data: "KeyPress" - 1825-1847: "meta.block.go" - 1825-1826: "punctuation.section.function-block.begin.go" - Data: "{" - 1832-1836: "constant.language.go" - Data: "true" - 1843-1846: "string.quoted.single.go" - 1843-1844: "punctuation.definition.string.begin.go" - Data: "'" - 1845-1846: "punctuation.definition.string.end.go" - Data: "'" - 1846-1847: "punctuation.section.function-block.end.go" - Data: "}" - 1859-1867: "variable.other.dot-access.go" - Data: "KeyCtrl2" - 1882-1890: "variable.other.dot-access.go" - Data: "KeyPress" - 1890-1912: "meta.block.go" - 1890-1891: "punctuation.section.function-block.begin.go" - Data: "{" - 1897-1901: "constant.language.go" - Data: "true" - 1908-1911: "string.quoted.single.go" - 1908-1909: "punctuation.definition.string.begin.go" - Data: "'" - 1910-1911: "punctuation.definition.string.end.go" - Data: "'" - 1911-1912: "punctuation.section.function-block.end.go" - Data: "}" - 1924-1932: "variable.other.dot-access.go" - Data: "KeyCtrl4" - 1947-1955: "variable.other.dot-access.go" - Data: "KeyPress" - 1955-1977: "meta.block.go" - 1955-1956: "punctuation.section.function-block.begin.go" - Data: "{" - 1962-1966: "constant.language.go" - Data: "true" - 1973-1976: "string.quoted.single.go" - 1973-1974: "punctuation.definition.string.begin.go" - Data: "'" - 1975-1976: "punctuation.definition.string.end.go" - Data: "'" - 1976-1977: "punctuation.section.function-block.end.go" - Data: "}" - 1989-1997: "variable.other.dot-access.go" - Data: "KeyCtrl5" - 2012-2020: "variable.other.dot-access.go" - Data: "KeyPress" - 2020-2042: "meta.block.go" - 2020-2021: "punctuation.section.function-block.begin.go" - Data: "{" - 2027-2031: "constant.language.go" - Data: "true" - 2038-2041: "string.quoted.single.go" - 2038-2039: "punctuation.definition.string.begin.go" - Data: "'" - 2040-2041: "punctuation.definition.string.end.go" - Data: "'" - 2041-2042: "punctuation.section.function-block.end.go" - Data: "}" - 2054-2062: "variable.other.dot-access.go" - Data: "KeyCtrl6" - 2077-2085: "variable.other.dot-access.go" - Data: "KeyPress" - 2085-2107: "meta.block.go" - 2085-2086: "punctuation.section.function-block.begin.go" - Data: "{" - 2092-2096: "constant.language.go" - Data: "true" - 2103-2106: "string.quoted.single.go" - 2103-2104: "punctuation.definition.string.begin.go" - Data: "'" - 2105-2106: "punctuation.definition.string.end.go" - Data: "'" - 2106-2107: "punctuation.section.function-block.end.go" - Data: "}" - 2119-2127: "variable.other.dot-access.go" - Data: "KeyCtrl7" - 2142-2150: "variable.other.dot-access.go" - Data: "KeyPress" - 2150-2172: "meta.block.go" - 2150-2151: "punctuation.section.function-block.begin.go" - Data: "{" - 2157-2161: "constant.language.go" - Data: "true" - 2168-2171: "string.quoted.single.go" - 2168-2169: "punctuation.definition.string.begin.go" - Data: "'" - 2170-2171: "punctuation.definition.string.end.go" - Data: "'" - 2171-2172: "punctuation.section.function-block.end.go" - Data: "}" - 2184-2192: "variable.other.dot-access.go" - Data: "KeyEnter" - 2207-2215: "variable.other.dot-access.go" - Data: "KeyPress" - 2215-2235: "meta.block.go" - 2215-2216: "punctuation.section.function-block.begin.go" - Data: "{" - 2229-2234: "variable.other.dot-access.go" - Data: "Enter" - 2234-2235: "punctuation.section.function-block.end.go" - Data: "}" - 2247-2255: "variable.other.dot-access.go" - Data: "KeySpace" - 2270-2278: "variable.other.dot-access.go" - Data: "KeyPress" - 2278-2288: "meta.block.go" - 2278-2279: "punctuation.section.function-block.begin.go" - Data: "{" - 2284-2287: "string.quoted.single.go" - 2284-2285: "punctuation.definition.string.begin.go" - Data: "'" - 2286-2287: "punctuation.definition.string.end.go" - Data: "'" - 2287-2288: "punctuation.section.function-block.end.go" - Data: "}" - 2300-2313: "variable.other.dot-access.go" - Data: "KeyBackspace2" - 2323-2331: "variable.other.dot-access.go" - Data: "KeyPress" - 2331-2355: "meta.block.go" - 2331-2332: "punctuation.section.function-block.begin.go" - Data: "{" - 2345-2354: "variable.other.dot-access.go" - Data: "Backspace" - 2354-2355: "punctuation.section.function-block.end.go" - Data: "}" - 2367-2377: "variable.other.dot-access.go" - Data: "KeyArrowUp" - 2390-2398: "variable.other.dot-access.go" - Data: "KeyPress" - 2398-2415: "meta.block.go" - 2398-2399: "punctuation.section.function-block.begin.go" - Data: "{" - 2412-2414: "variable.other.dot-access.go" - Data: "Up" - 2414-2415: "punctuation.section.function-block.end.go" - Data: "}" - 2427-2439: "variable.other.dot-access.go" - Data: "KeyArrowDown" - 2450-2458: "variable.other.dot-access.go" - Data: "KeyPress" - 2458-2477: "meta.block.go" - 2458-2459: "punctuation.section.function-block.begin.go" - Data: "{" - 2472-2476: "variable.other.dot-access.go" - Data: "Down" - 2476-2477: "punctuation.section.function-block.end.go" - Data: "}" - 2489-2501: "variable.other.dot-access.go" - Data: "KeyArrowLeft" - 2512-2520: "variable.other.dot-access.go" - Data: "KeyPress" - 2520-2539: "meta.block.go" - 2520-2521: "punctuation.section.function-block.begin.go" - Data: "{" - 2534-2538: "variable.other.dot-access.go" - Data: "Left" - 2538-2539: "punctuation.section.function-block.end.go" - Data: "}" - 2551-2564: "variable.other.dot-access.go" - Data: "KeyArrowRight" - 2574-2582: "variable.other.dot-access.go" - Data: "KeyPress" - 2582-2602: "meta.block.go" - 2582-2583: "punctuation.section.function-block.begin.go" - Data: "{" - 2596-2601: "variable.other.dot-access.go" - Data: "Right" - 2601-2602: "punctuation.section.function-block.end.go" - Data: "}" - 2614-2623: "variable.other.dot-access.go" - Data: "KeyDelete" - 2637-2645: "variable.other.dot-access.go" - Data: "KeyPress" - 2645-2666: "meta.block.go" - 2645-2646: "punctuation.section.function-block.begin.go" - Data: "{" - 2659-2665: "variable.other.dot-access.go" - Data: "Delete" - 2665-2666: "punctuation.section.function-block.end.go" - Data: "}" - 2678-2684: "variable.other.dot-access.go" - Data: "KeyEsc" - 2701-2709: "variable.other.dot-access.go" - Data: "KeyPress" - 2709-2730: "meta.block.go" - 2709-2710: "punctuation.section.function-block.begin.go" - Data: "{" - 2723-2729: "variable.other.dot-access.go" - Data: "Escape" - 2729-2730: "punctuation.section.function-block.end.go" - Data: "}" - 2742-2748: "variable.other.dot-access.go" - Data: "KeyTab" - 2765-2773: "variable.other.dot-access.go" - Data: "KeyPress" - 2773-2784: "meta.block.go" - 2773-2774: "punctuation.section.function-block.begin.go" - Data: "{" - 2779-2783: "string.quoted.single.go" - 2779-2780: "punctuation.definition.string.begin.go" - Data: "'" - 2780-2782: "constant.character.escape.go" - Data: "\t" - 2782-2783: "punctuation.definition.string.end.go" - Data: "'" - 2783-2784: "punctuation.section.function-block.end.go" - Data: "}" - 2787-2788: "punctuation.section.block.end.go" - Data: "}" - 2801-2807: "meta.function-call.go" - 2801-2802: "punctuation.whitespace.function-call.leading.go" - Data: " " - 2802-2806: "support.function.any-method.go" - Data: "make" - 2807-2810: "storage.modifier.go" - Data: "map" - 2811-2817: "storage.type.go" - Data: "string" - 2819-2820: "constant.numeric.go" - Data: "2" - 2829-2838: "variable.other.dot-access.go" - Data: "Attribute" - 2861-2871: "variable.other.dot-access.go" - Data: "ColorBlack" - 2893-2903: "variable.other.dot-access.go" - Data: "ColorWhite" - 2915-2919: "storage.type.go" - Data: "bool" - 2923-2928: "storage.modifier.go" - Data: "const" - 2946-2948: "constant.numeric.go" - Data: "20" - 2950-2954: "keyword.control.go" - Data: "type" - 2960-2966: "keyword.control.go" - Data: "struct" - 2967-3077: "meta.block.go" - 2967-2968: "punctuation.section.block.begin.go" - Data: "{" - 2985-2988: "storage.modifier.go" - Data: "map" - 2998-3002: "variable.other.dot-access.go" - Data: "View" - 3014-3020: "variable.other.dot-access.go" - Data: "Region" - 3037-3043: "storage.type.go" - Data: "string" - 3069-3075: "variable.other.dot-access.go" - Data: "Window" - 3076-3077: "punctuation.section.block.end.go" - Data: "}" - 3079-3152: "meta.function.receiver.go" - 3079-3125: "meta.function.receiver.declaration.go" - 3079-3083: "keyword.control.go" - Data: "func" - 3084-3106: "entity.name.function.go.full-name" - 3085-3092: "variable.receiver.go" - Data: "t *tbfe" - 3094-3106: "entity.name.function.go.name" - Data: "ActiveWindow" - 3107-3107: "variable.parameters.go" - Data: "" - 3109-3125: "variable.return-types.go" - Data: "*backend.Window " - 3125-3152: "meta.block.go" - 3125-3126: "punctuation.section.function-block.begin.go" - Data: "{" - 3128-3134: "keyword.control.go" - Data: "return" - 3137-3150: "variable.other.dot-access.go" - Data: "active_window" - 3151-3152: "punctuation.section.function-block.end.go" - Data: "}" - 3154-3309: "meta.function.receiver.go" - 3154-3213: "meta.function.receiver.declaration.go" - 3154-3158: "keyword.control.go" - Data: "func" - 3159-3179: "entity.name.function.go.full-name" - 3160-3167: "variable.receiver.go" - Data: "t *tbfe" - 3169-3179: "entity.name.function.go.name" - Data: "ActiveView" - 3180-3197: "variable.parameters.go" - Data: "w *backend.Window" - 3199-3213: "variable.return-types.go" - Data: "*backend.View " - 3213-3309: "meta.block.go" - 3213-3214: "punctuation.section.function-block.begin.go" - Data: "{" - 3216-3218: "keyword.control.go" - Data: "if" - 3224-3227: "constant.language.go" - Data: "nil" - 3228-3245: "meta.block.go" - 3228-3229: "punctuation.section.function-block.begin.go" - Data: "{" - 3232-3238: "keyword.control.go" - Data: "return" - 3239-3242: "constant.language.go" - Data: "nil" - 3244-3245: "punctuation.section.function-block.end.go" - Data: "}" - 3247-3249: "keyword.control.go" - Data: "if" - 3250-3254: "meta.initialization.short.go" - 3250-3254: "variable.other.go" - 3252-3254: "keyword.operator.initialize.go" - Data: ":=" - 3257-3263: "meta.function-call.go" - 3257-3262: "support.function.any-method.go" - Data: "Views" - 3265-3269: "" - 3265-3266: "punctuation.whitespace.support.function.leading.go" - Data: " " - 3266-3269: "support.function.builtin.go" - Data: "len" - 3269-3272: "meta.parens.go" - 3269-3270: "punctuation.section.parens.begin.go" - Data: "(" - 3271-3272: "punctuation.section.parens.end.go" - Data: ")" - 3275-3276: "constant.numeric.go" - Data: "0" - 3277-3295: "meta.block.go" - 3277-3278: "punctuation.section.function-block.begin.go" - Data: "{" - 3281-3287: "keyword.control.go" - Data: "return" - 3290-3291: "constant.numeric.go" - Data: "0" - 3294-3295: "punctuation.section.function-block.end.go" - Data: "}" - 3297-3303: "keyword.control.go" - Data: "return" - 3304-3307: "constant.language.go" - Data: "nil" - 3308-3309: "punctuation.section.function-block.end.go" - Data: "}" - 3311-5786: "meta.function.receiver.go" - 3311-3372: "meta.function.receiver.declaration.go" - 3311-3315: "keyword.control.go" - Data: "func" - 3316-3336: "entity.name.function.go.full-name" - 3317-3324: "variable.receiver.go" - Data: "t *tbfe" - 3326-3336: "entity.name.function.go.name" - Data: "renderView" - 3337-3370: "variable.parameters.go" - Data: "sx, sy, w, h int, v *backend.View" - 3372-3372: "variable.return-types.go" - Data: "" - 3372-5786: "meta.block.go" - 3372-3373: "punctuation.section.function-block.begin.go" - Data: "{" - 3375-3381: "meta.initialization.short.go" - 3375-3381: "variable.other.go" - 3379-3381: "keyword.operator.initialize.go" - Data: ":=" - 3384-3388: "meta.function-call.go" - 3384-3387: "support.function.any-method.go" - Data: "Sel" - 3391-3400: "meta.initialization.short.go" - 3391-3400: "variable.other.go" - 3398-3400: "keyword.operator.initialize.go" - Data: ":=" - 3403-3410: "meta.function-call.go" - 3403-3409: "support.function.any-method.go" - Data: "Buffer" - 3412-3417: "meta.function-call.go" - 3412-3416: "support.function.any-method.go" - Data: "Data" - 3420-3425: "meta.initialization.short.go" - 3420-3425: "variable.other.go" - 3423-3425: "keyword.operator.initialize.go" - Data: ":=" - 3428-3442: "meta.function-call.go" - 3428-3441: "support.function.any-method.go" - Data: "VisibleRegion" - 3446-3454: "meta.initialization.short.go" - 3446-3454: "variable.other.go" - 3452-3454: "keyword.operator.initialize.go" - Data: ":=" - 3463-3469: "meta.function-call.go" - 3463-3468: "support.function.any-method.go" - Data: "Split" - 3477-3481: "string.quoted.double.go" - 3477-3478: "punctuation.definition.string.begin.go" - Data: """ - 3478-3480: "constant.character.escape.go" - Data: "\n" - 3480-3481: "punctuation.definition.string.end.go" - Data: """ - 3484-3491: "meta.initialization.short.go" - 3484-3491: "variable.other.go" - 3489-3491: "keyword.operator.initialize.go" - Data: ":=" - 3494-3501: "meta.function-call.go" - 3494-3500: "support.function.any-method.go" - Data: "Buffer" - 3503-3510: "meta.function-call.go" - 3503-3509: "support.function.any-method.go" - Data: "RowCol" - 3513-3519: "meta.function-call.go" - 3513-3518: "support.function.any-method.go" - Data: "Begin" - 3523-3530: "meta.initialization.short.go" - 3523-3530: "variable.other.go" - 3528-3530: "keyword.operator.initialize.go" - Data: ":=" - 3533-3540: "meta.function-call.go" - 3533-3539: "support.function.any-method.go" - Data: "Buffer" - 3542-3549: "meta.function-call.go" - 3542-3548: "support.function.any-method.go" - Data: "RowCol" - 3552-3556: "meta.function-call.go" - 3552-3555: "support.function.any-method.go" - Data: "End" - 3560-3562: "keyword.control.go" - Data: "if" - 3567-3568: "constant.numeric.go" - Data: "1" - 3569-3615: "meta.block.go" - 3569-3570: "punctuation.section.function-block.begin.go" - Data: "{" - 3581-3582: "constant.numeric.go" - Data: "1" - 3585-3587: "keyword.control.go" - Data: "if" - 3594-3612: "meta.block.go" - 3594-3595: "punctuation.section.function-block.begin.go" - Data: "{" - 3611-3612: "punctuation.section.function-block.end.go" - Data: "}" - 3614-3615: "punctuation.section.function-block.end.go" - Data: "}" - 3617-3623: "meta.initialization.short.go" - 3617-3623: "variable.other.go" - 3621-3623: "keyword.operator.initialize.go" - Data: ":=" - 3623-3627: "" - 3623-3624: "punctuation.whitespace.support.function.leading.go" - Data: " " - 3624-3627: "support.function.builtin.go" - Data: "len" - 3627-3657: "meta.parens.go" - 3627-3628: "punctuation.section.parens.begin.go" - Data: "(" - 3636-3641: "meta.function-call.go" - 3636-3640: "support.function.any-method.go" - Data: "Join" - 3652-3656: "string.quoted.double.go" - 3652-3653: "punctuation.definition.string.begin.go" - Data: """ - 3653-3655: "constant.character.escape.go" - Data: "\n" - 3655-3656: "punctuation.definition.string.end.go" - Data: """ - 3656-3657: "punctuation.section.parens.end.go" - Data: ")" - 3680-3688: "meta.initialization.short.go" - 3680-3688: "variable.other.go" - 3686-3688: "keyword.operator.initialize.go" - Data: ":=" - 3691-3696: "meta.function-call.go" - 3691-3695: "support.function.any-method.go" - Data: "rune" - 3704-3709: "meta.function-call.go" - 3704-3708: "support.function.any-method.go" - Data: "Join" - 3716-3720: "string.quoted.double.go" - 3716-3717: "punctuation.definition.string.begin.go" - Data: """ - 3717-3719: "constant.character.escape.go" - Data: "\n" - 3719-3720: "punctuation.definition.string.end.go" - Data: """ - 3724-3731: "meta.initialization.short.go" - 3724-3731: "variable.other.go" - 3729-3731: "keyword.operator.initialize.go" - Data: ":=" - 3740-3749: "meta.initialization.short.go" - 3740-3749: "variable.other.go" - 3747-3749: "keyword.operator.initialize.go" - Data: ":=" - 3763-3770: "meta.initialization.short.go" - 3763-3770: "variable.other.go" - 3768-3770: "keyword.operator.initialize.go" - Data: ":=" - 3771-3773: "string.quoted.double.go" - 3771-3772: "punctuation.definition.string.begin.go" - Data: """ - 3772-3773: "punctuation.definition.string.end.go" - Data: """ - 3773-3780: "meta.function-call.go" - 3773-3775: "punctuation.whitespace.function-call.leading.go" - Data: " - " - 3775-3778: "support.function.any-method.go" - Data: "var" - 3793-3799: "storage.type.go" - Data: "string" - 3840-3855: "meta.initialization.short.go" - 3840-3855: "variable.other.go" - 3853-3855: "keyword.operator.initialize.go" - Data: ":=" - 3858-3867: "meta.function-call.go" - 3858-3866: "support.function.any-method.go" - Data: "Settings" - 3869-3873: "meta.function-call.go" - 3869-3872: "support.function.any-method.go" - Data: "Get" - 3873-3883: "string.quoted.double.go" - 3873-3874: "punctuation.definition.string.begin.go" - Data: """ - 3882-3883: "punctuation.definition.string.end.go" - Data: """ - 3885-3886: "constant.numeric.go" - Data: "4" - 3888-3893: "meta.parens.go" - 3888-3889: "punctuation.section.parens.begin.go" - Data: "(" - 3889-3892: "storage.type.go" - Data: "int" - 3892-3893: "punctuation.section.parens.end.go" - Data: ")" - 3895-3897: "keyword.control.go" - Data: "if" - 3902-3921: "meta.block.go" - 3902-3903: "punctuation.section.function-block.begin.go" - Data: "{" - 3917-3918: "constant.numeric.go" - Data: "4" - 3920-3921: "punctuation.section.function-block.end.go" - Data: "}" - 3923-3937: "meta.initialization.short.go" - 3923-3937: "variable.other.go" - 3935-3937: "keyword.operator.initialize.go" - Data: ":=" - 3946-3959: "variable.other.dot-access.go" - Data: "AttrUnderline" - 3961-3963: "keyword.control.go" - Data: "if" - 3964-3972: "meta.initialization.short.go" - 3964-3972: "variable.other.go" - 3970-3972: "keyword.operator.initialize.go" - Data: ":=" - 3975-3984: "meta.function-call.go" - 3975-3983: "support.function.any-method.go" - Data: "Settings" - 3986-3990: "meta.function-call.go" - 3986-3989: "support.function.any-method.go" - Data: "Get" - 3990-4003: "string.quoted.double.go" - 3990-3991: "punctuation.definition.string.begin.go" - Data: """ - 4002-4003: "punctuation.definition.string.end.go" - Data: """ - 4005-4016: "string.quoted.double.go" - 4005-4006: "punctuation.definition.string.begin.go" - Data: """ - 4015-4016: "punctuation.definition.string.end.go" - Data: """ - 4018-4026: "meta.parens.go" - 4018-4019: "punctuation.section.parens.begin.go" - Data: "(" - 4019-4025: "storage.type.go" - Data: "string" - 4025-4026: "punctuation.section.parens.end.go" - Data: ")" - 4031-4096: "meta.block.go" - 4031-4032: "punctuation.section.function-block.begin.go" - Data: "{" - 4035-4037: "keyword.control.go" - Data: "if" - 4043-4050: "string.quoted.double.go" - 4043-4044: "punctuation.definition.string.begin.go" - Data: """ - 4049-4050: "punctuation.definition.string.end.go" - Data: """ - 4051-4093: "meta.block.go" - 4051-4052: "punctuation.section.function-block.begin.go" - Data: "{" - 4078-4089: "variable.other.dot-access.go" - Data: "AttrReverse" - 4092-4093: "punctuation.section.function-block.end.go" - Data: "}" - 4095-4096: "punctuation.section.function-block.end.go" - Data: "}" - 4098-4100: "keyword.control.go" - Data: "if" - 4101-4109: "meta.initialization.short.go" - 4101-4109: "variable.other.go" - 4107-4109: "keyword.operator.initialize.go" - Data: ":=" - 4112-4121: "meta.function-call.go" - 4112-4120: "support.function.any-method.go" - Data: "Settings" - 4123-4127: "meta.function-call.go" - 4123-4126: "support.function.any-method.go" - Data: "Get" - 4127-4148: "string.quoted.double.go" - 4127-4128: "punctuation.definition.string.begin.go" - Data: """ - 4147-4148: "punctuation.definition.string.end.go" - Data: """ - 4150-4155: "constant.language.go" - Data: "false" - 4157-4163: "meta.parens.go" - 4157-4158: "punctuation.section.parens.begin.go" - Data: "(" - 4158-4162: "storage.type.go" - Data: "bool" - 4162-4163: "punctuation.section.parens.end.go" - Data: ")" - 4174-4311: "meta.block.go" - 4174-4175: "punctuation.section.function-block.begin.go" - Data: "{" - 4178-4180: "keyword.control.go" - Data: "if" - 4204-4215: "variable.other.dot-access.go" - Data: "AttrReverse" - 4216-4260: "meta.block.go" - 4216-4217: "punctuation.section.function-block.begin.go" - Data: "{" - 4243-4256: "variable.other.dot-access.go" - Data: "AttrUnderline" - 4259-4260: "punctuation.section.function-block.end.go" - Data: "}" - 4261-4265: "keyword.control.go" - Data: "else" - 4266-4308: "meta.block.go" - 4266-4267: "punctuation.section.function-block.begin.go" - Data: "{" - 4293-4304: "variable.other.dot-access.go" - Data: "AttrReverse" - 4307-4308: "punctuation.section.function-block.end.go" - Data: "}" - 4310-4311: "punctuation.section.function-block.end.go" - Data: "}" - 4313-4327: "meta.initialization.short.go" - 4313-4327: "variable.other.go" - 4325-4327: "keyword.operator.initialize.go" - Data: ":=" - 4328-4332: "constant.language.go" - Data: "true" - 4334-4336: "keyword.control.go" - Data: "if" - 4337-4345: "meta.initialization.short.go" - 4337-4345: "variable.other.go" - 4343-4345: "keyword.operator.initialize.go" - Data: ":=" - 4348-4357: "meta.function-call.go" - 4348-4356: "support.function.any-method.go" - Data: "Settings" - 4359-4363: "meta.function-call.go" - 4359-4362: "support.function.any-method.go" - Data: "Get" - 4363-4376: "string.quoted.double.go" - 4363-4364: "punctuation.definition.string.begin.go" - Data: """ - 4375-4376: "punctuation.definition.string.end.go" - Data: """ - 4378-4382: "constant.language.go" - Data: "true" - 4384-4390: "meta.parens.go" - 4384-4385: "punctuation.section.parens.begin.go" - Data: "(" - 4385-4389: "storage.type.go" - Data: "bool" - 4389-4390: "punctuation.section.parens.end.go" - Data: ")" - 4395-4417: "meta.block.go" - 4395-4396: "punctuation.section.function-block.begin.go" - Data: "{" - 4416-4417: "punctuation.section.function-block.end.go" - Data: "}" - 4420-4423: "keyword.control.go" - Data: "for" - 4424-4428: "meta.initialization.short.go" - 4424-4428: "variable.other.go" - 4426-4428: "keyword.operator.initialize.go" - Data: ":=" - 4429-4434: "keyword.control.go" - Data: "range" - 4441-5784: "meta.block.go" - 4441-4442: "punctuation.section.function-block.begin.go" - Data: "{" - 4452-4460: "meta.function-call.go" - 4452-4453: "punctuation.whitespace.function-call.leading.go" - Data: " " - 4453-4459: "support.function.any-method.go" - Data: "string" - 4473-4475: "keyword.control.go" - Data: "if" - 4483-5775: "meta.block.go" - 4483-4484: "punctuation.section.function-block.begin.go" - Data: "{" - 4488-4492: "meta.initialization.short.go" - 4488-4492: "variable.other.go" - 4490-4492: "keyword.operator.initialize.go" - Data: ":=" - 4498-4502: "" - 4498-4499: "punctuation.whitespace.support.function.leading.go" - Data: " " - 4499-4502: "support.function.builtin.go" - Data: "len" - 4502-4508: "meta.parens.go" - 4502-4503: "punctuation.section.parens.begin.go" - Data: "(" - 4507-4508: "punctuation.section.parens.end.go" - Data: ")" - 4512-4516: "meta.initialization.short.go" - 4512-4516: "variable.other.go" - 4514-4516: "keyword.operator.initialize.go" - Data: ":=" - 4528-4534: "variable.other.dot-access.go" - Data: "Region" - 4534-4540: "meta.block.go" - 4534-4535: "punctuation.section.function-block.begin.go" - Data: "{" - 4539-4540: "punctuation.section.function-block.end.go" - Data: "}" - 4544-4553: "meta.initialization.short.go" - 4544-4553: "variable.other.go" - 4551-4553: "keyword.operator.initialize.go" - Data: ":=" - 4566-4574: "meta.initialization.short.go" - 4566-4574: "variable.other.go" - 4572-4574: "keyword.operator.initialize.go" - Data: ":=" - 4577-4587: "meta.function-call.go" - 4577-4586: "support.function.any-method.go" - Data: "ScopeName" - 4593-4595: "keyword.control.go" - Data: "if" - 4615-5087: "meta.block.go" - 4615-4616: "punctuation.section.function-block.begin.go" - Data: "{" - 4677-4682: "meta.initialization.short.go" - 4677-4682: "variable.other.go" - 4680-4682: "keyword.operator.initialize.go" - Data: ":=" - 4693-4696: "keyword.control.go" - Data: "for" - 4696-4700: "" - 4696-4697: "punctuation.whitespace.support.function.leading.go" - Data: " " - 4697-4700: "support.function.builtin.go" - Data: "len" - 4700-4704: "meta.parens.go" - 4700-4701: "punctuation.section.parens.begin.go" - Data: "(" - 4703-4704: "punctuation.section.parens.end.go" - Data: ")" - 4707-4708: "constant.numeric.go" - Data: "0" - 4709-5060: "meta.block.go" - 4709-4710: "punctuation.section.function-block.begin.go" - Data: "{" - 4716-4721: "meta.initialization.short.go" - 4716-4721: "variable.other.go" - 4719-4721: "keyword.operator.initialize.go" - Data: ":=" - 4730-4734: "meta.initialization.short.go" - 4730-4734: "variable.other.go" - 4732-4734: "keyword.operator.initialize.go" - Data: ":=" - 4743-4753: "meta.function-call.go" - 4743-4752: "support.function.any-method.go" - Data: "LastIndex" - 4757-4760: "string.quoted.double.go" - 4757-4758: "punctuation.definition.string.begin.go" - Data: """ - 4759-4760: "punctuation.definition.string.end.go" - Data: """ - 4767-4769: "keyword.control.go" - Data: "if" - 4776-4777: "constant.numeric.go" - Data: "1" - 4778-4806: "meta.block.go" - 4778-4779: "punctuation.section.function-block.begin.go" - Data: "{" - 4796-4797: "constant.numeric.go" - Data: "1" - 4805-4806: "punctuation.section.function-block.end.go" - Data: "}" - 4812-4814: "keyword.control.go" - Data: "if" - 4815-4823: "meta.initialization.short.go" - 4815-4823: "variable.other.go" - 4821-4823: "keyword.operator.initialize.go" - Data: ":=" - 4842-4888: "meta.block.go" - 4842-4843: "punctuation.section.function-block.begin.go" - Data: "{" - 4861-4862: "constant.numeric.go" - Data: "0" - 4867-4868: "constant.numeric.go" - Data: "1" - 4876-4881: "keyword.control.go" - Data: "break" - 4887-4888: "punctuation.section.function-block.end.go" - Data: "}" - 4894-4896: "keyword.control.go" - Data: "if" - 4897-4902: "meta.initialization.short.go" - 4897-4902: "variable.other.go" - 4900-4902: "keyword.operator.initialize.go" - Data: ":=" - 4911-4921: "meta.function-call.go" - 4911-4920: "support.function.any-method.go" - Data: "LastIndex" - 4925-4928: "string.quoted.double.go" - 4925-4926: "punctuation.definition.string.begin.go" - Data: """ - 4927-4928: "punctuation.definition.string.end.go" - Data: """ - 4938-4939: "constant.numeric.go" - Data: "1" - 4940-4960: "meta.block.go" - 4940-4941: "punctuation.section.function-block.begin.go" - Data: "{" - 4948-4953: "keyword.control.go" - Data: "break" - 4959-4960: "punctuation.section.function-block.end.go" - Data: "}" - 4961-4965: "keyword.control.go" - Data: "else" - 4966-4968: "keyword.control.go" - Data: "if" - 4976-5002: "meta.block.go" - 4976-4977: "punctuation.section.function-block.begin.go" - Data: "{" - 5001-5002: "punctuation.section.function-block.end.go" - Data: "}" - 5003-5007: "keyword.control.go" - Data: "else" - 5008-5054: "meta.block.go" - 5008-5009: "punctuation.section.function-block.begin.go" - Data: "{" - 5029-5039: "meta.function-call.go" - 5029-5038: "support.function.any-method.go" - Data: "TrimSpace" - 5053-5054: "punctuation.section.function-block.end.go" - Data: "}" - 5059-5060: "punctuation.section.function-block.end.go" - Data: "}" - 5086-5087: "punctuation.section.function-block.end.go" - Data: "}" - 5088-5092: "keyword.control.go" - Data: "else" - 5093-5121: "meta.block.go" - 5093-5094: "punctuation.section.function-block.begin.go" - Data: "{" - 5120-5121: "punctuation.section.function-block.end.go" - Data: "}" - 5125-5128: "keyword.control.go" - Data: "for" - 5129-5137: "meta.initialization.short.go" - 5129-5137: "variable.other.go" - 5135-5137: "keyword.operator.initialize.go" - Data: ":=" - 5138-5143: "keyword.control.go" - Data: "range" - 5148-5156: "meta.function-call.go" - 5148-5155: "support.function.any-method.go" - Data: "Regions" - 5158-5421: "meta.block.go" - 5158-5159: "punctuation.section.function-block.begin.go" - Data: "{" - 5164-5166: "keyword.control.go" - Data: "if" - 5170-5171: "variable.other.dot-access.go" - Data: "B" - 5177-5178: "variable.other.dot-access.go" - Data: "B" - 5179-5343: "meta.block.go" - 5179-5180: "punctuation.section.function-block.begin.go" - Data: "{" - 5186-5188: "keyword.control.go" - Data: "if" - 5211-5326: "meta.block.go" - 5211-5212: "punctuation.section.function-block.begin.go" - Data: "{" - 5219-5221: "keyword.control.go" - Data: "if" - 5225-5234: "meta.function-call.go" - 5225-5233: "support.function.any-method.go" - Data: "Contains" - 5237-5279: "meta.block.go" - 5237-5238: "punctuation.section.function-block.begin.go" - Data: "{" - 5260-5271: "variable.other.dot-access.go" - Data: "AttrReverse" - 5278-5279: "punctuation.section.function-block.end.go" - Data: "}" - 5280-5284: "keyword.control.go" - Data: "else" - 5285-5319: "meta.block.go" - 5285-5286: "punctuation.section.function-block.begin.go" - Data: "{" - 5318-5319: "punctuation.section.function-block.end.go" - Data: "}" - 5325-5326: "punctuation.section.function-block.end.go" - Data: "}" - 5332-5337: "keyword.control.go" - Data: "break" - 5342-5343: "punctuation.section.function-block.end.go" - Data: "}" - 5344-5348: "keyword.control.go" - Data: "else" - 5349-5351: "keyword.control.go" - Data: "if" - 5355-5364: "meta.function-call.go" - 5355-5363: "support.function.any-method.go" - Data: "Contains" - 5367-5416: "meta.block.go" - 5367-5368: "punctuation.section.function-block.begin.go" - Data: "{" - 5388-5399: "variable.other.dot-access.go" - Data: "AttrReverse" - 5405-5410: "keyword.control.go" - Data: "break" - 5415-5416: "punctuation.section.function-block.end.go" - Data: "}" - 5420-5421: "punctuation.section.function-block.end.go" - Data: "}" - 5425-5427: "keyword.control.go" - Data: "if" - 5440-5444: "string.quoted.single.go" - 5440-5441: "punctuation.definition.string.begin.go" - Data: "'" - 5441-5443: "constant.character.escape.go" - Data: "\t" - 5443-5444: "punctuation.definition.string.end.go" - Data: "'" - 5445-5592: "meta.block.go" - 5445-5446: "punctuation.section.function-block.begin.go" - Data: "{" - 5451-5457: "meta.initialization.short.go" - 5451-5457: "variable.other.go" - 5455-5457: "keyword.operator.initialize.go" - Data: ":=" - 5458-5481: "meta.parens.go" - 5458-5459: "punctuation.section.parens.begin.go" - Data: "(" - 5463-5464: "constant.numeric.go" - Data: "1" - 5479-5480: "constant.numeric.go" - Data: "1" - 5480-5481: "punctuation.section.parens.end.go" - Data: ")" - 5486-5500: "meta.parens.go" - 5486-5487: "punctuation.section.parens.begin.go" - Data: "(" - 5498-5499: "constant.numeric.go" - Data: "1" - 5499-5500: "punctuation.section.parens.end.go" - Data: ")" - 5506-5509: "keyword.control.go" - Data: "for" - 5518-5574: "meta.block.go" - 5518-5519: "punctuation.section.function-block.begin.go" - Data: "{" - 5533-5541: "meta.function-call.go" - 5533-5540: "support.function.any-method.go" - Data: "SetCell" - 5547-5550: "string.quoted.single.go" - 5547-5548: "punctuation.definition.string.begin.go" - Data: "'" - 5549-5550: "punctuation.definition.string.end.go" - Data: "'" - 5573-5574: "punctuation.section.function-block.end.go" - Data: "}" - 5579-5587: "keyword.control.go" - Data: "continue" - 5591-5592: "punctuation.section.function-block.end.go" - Data: "}" - 5593-5597: "keyword.control.go" - Data: "else" - 5598-5600: "keyword.control.go" - Data: "if" - 5613-5617: "string.quoted.single.go" - 5613-5614: "punctuation.definition.string.begin.go" - Data: "'" - 5614-5616: "constant.character.escape.go" - Data: "\n" - 5616-5617: "punctuation.definition.string.end.go" - Data: "'" - 5618-5728: "meta.block.go" - 5618-5619: "punctuation.section.function-block.begin.go" - Data: "{" - 5632-5640: "meta.function-call.go" - 5632-5639: "support.function.any-method.go" - Data: "SetCell" - 5646-5649: "string.quoted.single.go" - 5646-5647: "punctuation.definition.string.begin.go" - Data: "'" - 5648-5649: "punctuation.definition.string.end.go" - Data: "'" - 5682-5684: "keyword.control.go" - Data: "if" - 5692-5710: "meta.block.go" - 5692-5693: "punctuation.section.function-block.begin.go" - Data: "{" - 5699-5704: "keyword.control.go" - Data: "break" - 5709-5710: "punctuation.section.function-block.end.go" - Data: "}" - 5715-5723: "keyword.control.go" - Data: "continue" - 5727-5728: "punctuation.section.function-block.end.go" - Data: "}" - 5740-5748: "meta.function-call.go" - 5740-5747: "support.function.any-method.go" - Data: "SetCell" - 5774-5775: "punctuation.section.function-block.end.go" - Data: "}" - 5783-5784: "punctuation.section.function-block.end.go" - Data: "}" - 5785-5786: "punctuation.section.function-block.end.go" - Data: "}" - 5788-6265: "meta.function.receiver.go" - 5788-5864: "meta.function.receiver.declaration.go" - 5788-5792: "keyword.control.go" - Data: "func" - 5793-5807: "entity.name.function.go.full-name" - 5794-5801: "variable.receiver.go" - Data: "t *tbfe" - 5803-5807: "entity.name.function.go.name" - Data: "clip" - 5808-5844: "variable.parameters.go" - Data: "v *backend.View, r primitives.Region" - 5846-5864: "variable.return-types.go" - Data: "primitives.Region " - 5864-6265: "meta.block.go" - 5864-5865: "punctuation.section.function-block.begin.go" - Data: "{" - 5867-5874: "meta.initialization.short.go" - 5867-5874: "variable.other.go" - 5872-5874: "keyword.operator.initialize.go" - Data: ":=" - 5877-5884: "meta.function-call.go" - 5877-5883: "support.function.any-method.go" - Data: "Buffer" - 5886-5893: "meta.function-call.go" - 5886-5892: "support.function.any-method.go" - Data: "RowCol" - 5895-5901: "meta.function-call.go" - 5895-5900: "support.function.any-method.go" - Data: "Begin" - 5905-5912: "meta.initialization.short.go" - 5905-5912: "variable.other.go" - 5910-5912: "keyword.operator.initialize.go" - Data: ":=" - 5915-5922: "meta.function-call.go" - 5915-5921: "support.function.any-method.go" - Data: "Buffer" - 5924-5931: "meta.function-call.go" - 5924-5930: "support.function.any-method.go" - Data: "RowCol" - 5933-5937: "meta.function-call.go" - 5933-5936: "support.function.any-method.go" - Data: "End" - 5942-5949: "meta.initialization.short.go" - 5942-5949: "variable.other.go" - 5947-5949: "keyword.operator.initialize.go" - Data: ":=" - 5958-5963: "meta.function-call.go" - 5958-5962: "support.function.any-method.go" - Data: "Size" - 5987-5989: "keyword.control.go" - Data: "if" - 5998-6014: "meta.block.go" - 5998-5999: "punctuation.section.function-block.begin.go" - Data: "{" - 6013-6014: "punctuation.section.function-block.end.go" - Data: "}" - 6016-6018: "keyword.control.go" - Data: "if" - 6019-6027: "meta.initialization.short.go" - 6019-6027: "variable.other.go" - 6025-6027: "keyword.operator.initialize.go" - Data: ":=" - 6030-6037: "meta.function-call.go" - 6030-6036: "support.function.any-method.go" - Data: "Buffer" - 6039-6046: "meta.function-call.go" - 6039-6045: "support.function.any-method.go" - Data: "RowCol" - 6048-6055: "meta.function-call.go" - 6048-6054: "support.function.any-method.go" - Data: "Buffer" - 6057-6067: "meta.function-call.go" - 6057-6066: "support.function.any-method.go" - Data: "TextPoint" - 6070-6071: "constant.numeric.go" - Data: "1" - 6082-6095: "meta.block.go" - 6082-6083: "punctuation.section.function-block.begin.go" - Data: "{" - 6094-6095: "punctuation.section.function-block.end.go" - Data: "}" - 6097-6099: "keyword.control.go" - Data: "if" - 6108-6124: "meta.block.go" - 6108-6109: "punctuation.section.function-block.begin.go" - Data: "{" - 6123-6124: "punctuation.section.function-block.end.go" - Data: "}" - 6126-6128: "keyword.control.go" - Data: "if" - 6133-6134: "constant.numeric.go" - Data: "1" - 6135-6147: "meta.block.go" - 6135-6136: "punctuation.section.function-block.begin.go" - Data: "{" - 6143-6144: "constant.numeric.go" - Data: "1" - 6146-6147: "punctuation.section.function-block.end.go" - Data: "}" - 6151-6152: "variable.other.dot-access.go" - Data: "A" - 6157-6164: "meta.function-call.go" - 6157-6163: "support.function.any-method.go" - Data: "Buffer" - 6166-6171: "meta.function-call.go" - 6166-6170: "support.function.any-method.go" - Data: "Line" - 6173-6180: "meta.function-call.go" - 6173-6179: "support.function.any-method.go" - Data: "Buffer" - 6182-6192: "meta.function-call.go" - 6182-6191: "support.function.any-method.go" - Data: "TextPoint" - 6195-6196: "constant.numeric.go" - Data: "1" - 6199-6200: "variable.other.dot-access.go" - Data: "A" - 6204-6205: "variable.other.dot-access.go" - Data: "B" - 6210-6217: "meta.function-call.go" - 6210-6216: "support.function.any-method.go" - Data: "Buffer" - 6219-6224: "meta.function-call.go" - 6219-6223: "support.function.any-method.go" - Data: "Line" - 6226-6233: "meta.function-call.go" - 6226-6232: "support.function.any-method.go" - Data: "Buffer" - 6235-6245: "meta.function-call.go" - 6235-6244: "support.function.any-method.go" - Data: "TextPoint" - 6248-6249: "constant.numeric.go" - Data: "1" - 6252-6253: "variable.other.dot-access.go" - Data: "B" - 6255-6261: "keyword.control.go" - Data: "return" - 6264-6265: "punctuation.section.function-block.end.go" - Data: "}" - 6267-6409: "meta.function.receiver.go" - 6267-6325: "meta.function.receiver.declaration.go" - 6267-6271: "keyword.control.go" - Data: "func" - 6272-6286: "entity.name.function.go.full-name" - 6273-6280: "variable.receiver.go" - Data: "t *tbfe" - 6282-6286: "entity.name.function.go.name" - Data: "Show" - 6287-6323: "variable.parameters.go" - Data: "v *backend.View, r primitives.Region" - 6325-6325: "variable.return-types.go" - Data: "" - 6325-6409: "meta.block.go" - 6325-6326: "punctuation.section.function-block.begin.go" - Data: "{" - 6330-6343: "variable.other.dot-access.go" - Data: "visibleregion" - 6351-6356: "meta.function-call.go" - 6351-6355: "support.function.any-method.go" - Data: "clip" - 6370-6376: "variable.other.dot-access.go" - Data: "Region" - 6376-6406: "meta.block.go" - 6376-6377: "punctuation.section.function-block.begin.go" - Data: "{" - 6379-6385: "meta.function-call.go" - 6379-6384: "support.function.any-method.go" - Data: "Begin" - 6390-6397: "meta.function-call.go" - 6390-6396: "support.function.any-method.go" - Data: "Buffer" - 6399-6404: "meta.function-call.go" - 6399-6403: "support.function.any-method.go" - Data: "Size" - 6405-6406: "punctuation.section.function-block.end.go" - Data: "}" - 6408-6409: "punctuation.section.function-block.end.go" - Data: "}" - 6411-6605: "meta.function.receiver.go" - 6411-6475: "meta.function.receiver.declaration.go" - 6411-6415: "keyword.control.go" - Data: "func" - 6416-6439: "entity.name.function.go.full-name" - 6417-6424: "variable.receiver.go" - Data: "t *tbfe" - 6426-6439: "entity.name.function.go.name" - Data: "VisibleRegion" - 6440-6455: "variable.parameters.go" - Data: "v *backend.View" - 6457-6475: "variable.return-types.go" - Data: "primitives.Region " - 6475-6605: "meta.block.go" - 6475-6476: "punctuation.section.function-block.begin.go" - Data: "{" - 6478-6480: "keyword.control.go" - Data: "if" - 6481-6489: "meta.initialization.short.go" - 6481-6489: "variable.other.go" - 6487-6489: "keyword.operator.initialize.go" - Data: ":=" - 6492-6505: "variable.other.dot-access.go" - Data: "visibleregion" - 6513-6528: "meta.block.go" - 6513-6514: "punctuation.section.function-block.begin.go" - Data: "{" - 6517-6523: "keyword.control.go" - Data: "return" - 6527-6528: "punctuation.section.function-block.end.go" - Data: "}" - 6529-6533: "keyword.control.go" - Data: "else" - 6534-6603: "meta.block.go" - 6534-6535: "punctuation.section.function-block.begin.go" - Data: "{" - 6540-6545: "meta.function-call.go" - 6540-6544: "support.function.any-method.go" - Data: "Show" - 6559-6565: "variable.other.dot-access.go" - Data: "Region" - 6565-6571: "meta.block.go" - 6565-6566: "punctuation.section.function-block.begin.go" - Data: "{" - 6566-6567: "constant.numeric.go" - Data: "0" - 6569-6570: "constant.numeric.go" - Data: "0" - 6570-6571: "punctuation.section.function-block.end.go" - Data: "}" - 6575-6581: "keyword.control.go" - Data: "return" - 6584-6597: "variable.other.dot-access.go" - Data: "visibleregion" - 6602-6603: "punctuation.section.function-block.end.go" - Data: "}" - 6604-6605: "punctuation.section.function-block.end.go" - Data: "}" - 6607-6675: "meta.function.receiver.go" - 6607-6648: "meta.function.receiver.declaration.go" - 6607-6611: "keyword.control.go" - Data: "func" - 6612-6635: "entity.name.function.go.full-name" - 6613-6620: "variable.receiver.go" - Data: "t *tbfe" - 6622-6635: "entity.name.function.go.name" - Data: "StatusMessage" - 6636-6646: "variable.parameters.go" - Data: "msg string" - 6648-6648: "variable.return-types.go" - Data: "" - 6648-6675: "meta.block.go" - 6648-6649: "punctuation.section.function-block.begin.go" - Data: "{" - 6653-6667: "variable.other.dot-access.go" - Data: "status_message" - 6674-6675: "punctuation.section.function-block.end.go" - Data: "}" - 6677-6739: "meta.function.receiver.go" - 6677-6717: "meta.function.receiver.declaration.go" - 6677-6681: "keyword.control.go" - Data: "func" - 6682-6704: "entity.name.function.go.full-name" - 6683-6690: "variable.receiver.go" - Data: "t *tbfe" - 6692-6704: "entity.name.function.go.name" - Data: "ErrorMessage" - 6705-6715: "variable.parameters.go" - Data: "msg string" - 6717-6717: "variable.return-types.go" - Data: "" - 6717-6739: "meta.block.go" - 6717-6718: "punctuation.section.function-block.begin.go" - Data: "{" - 6727-6733: "meta.function-call.go" - 6727-6732: "support.function.any-method.go" - Data: "Error" - 6738-6739: "punctuation.section.function-block.end.go" - Data: "}" - 6741-6776: "" - 6741-6776: "comment.line.double-slash.go" - 6741-6743: "punctuation.definition.comment.go" - Data: "//" - 6776-6838: "meta.function.receiver.go" - 6776-6817: "meta.function.receiver.declaration.go" - 6776-6780: "keyword.control.go" - Data: "func" - 6781-6804: "entity.name.function.go.full-name" - 6782-6789: "variable.receiver.go" - Data: "t *tbfe" - 6791-6804: "entity.name.function.go.name" - Data: "MessageDialog" - 6805-6815: "variable.parameters.go" - Data: "msg string" - 6817-6817: "variable.return-types.go" - Data: "" - 6817-6838: "meta.block.go" - 6817-6818: "punctuation.section.function-block.begin.go" - Data: "{" - 6827-6832: "meta.function-call.go" - 6827-6831: "support.function.any-method.go" - Data: "Info" - 6837-6838: "punctuation.section.function-block.end.go" - Data: "}" - 6840-6875: "" - 6840-6875: "comment.line.double-slash.go" - 6840-6842: "punctuation.definition.comment.go" - Data: "//" - 6875-6946: "meta.function.receiver.go" - 6875-6921: "meta.function.receiver.declaration.go" - 6875-6879: "keyword.control.go" - Data: "func" - 6880-6904: "entity.name.function.go.full-name" - 6881-6888: "variable.receiver.go" - Data: "t *tbfe" - 6890-6904: "entity.name.function.go.name" - Data: "OkCancelDialog" - 6905-6919: "variable.parameters.go" - Data: "msg, ok string" - 6921-6921: "variable.return-types.go" - Data: "" - 6921-6946: "meta.block.go" - 6921-6922: "punctuation.section.function-block.begin.go" - Data: "{" - 6931-6936: "meta.function-call.go" - 6931-6935: "support.function.any-method.go" - Data: "Info" - 6945-6946: "punctuation.section.function-block.end.go" - Data: "}" - 6948-7089: "meta.function.receiver.go" - 6948-7008: "meta.function.receiver.declaration.go" - 6948-6952: "keyword.control.go" - Data: "func" - 6953-6969: "entity.name.function.go.full-name" - 6954-6961: "variable.receiver.go" - Data: "t *tbfe" - 6963-6969: "entity.name.function.go.name" - Data: "scroll" - 6970-7006: "variable.parameters.go" - Data: "b *primitives.Buffer, pos, delta int" - 7008-7008: "variable.return-types.go" - Data: "" - 7008-7089: "meta.block.go" - 7008-7009: "punctuation.section.function-block.begin.go" - Data: "{" - 7013-7018: "meta.function-call.go" - 7013-7017: "support.function.any-method.go" - Data: "Show" - 7026-7036: "meta.function-call.go" - 7026-7035: "support.function.any-method.go" - Data: "GetEditor" - 7038-7046: "meta.function-call.go" - 7038-7045: "support.function.any-method.go" - Data: "Console" - 7060-7066: "variable.other.dot-access.go" - Data: "Region" - 7066-7086: "meta.block.go" - 7066-7067: "punctuation.section.function-block.begin.go" - Data: "{" - 7069-7074: "meta.function-call.go" - 7069-7073: "support.function.any-method.go" - Data: "Size" - 7079-7084: "meta.function-call.go" - 7079-7083: "support.function.any-method.go" - Data: "Size" - 7085-7086: "punctuation.section.function-block.end.go" - Data: "}" - 7088-7089: "punctuation.section.function-block.end.go" - Data: "}" - 7091-11205: "meta.function.receiver.go" - 7091-7113: "meta.function.receiver.declaration.go" - 7091-7095: "keyword.control.go" - Data: "func" - 7096-7110: "entity.name.function.go.full-name" - 7097-7104: "variable.receiver.go" - Data: "t *tbfe" - 7106-7110: "entity.name.function.go.name" - Data: "loop" - 7111-7111: "variable.parameters.go" - Data: "" - 7113-7113: "variable.return-types.go" - Data: "" - 7113-11205: "meta.block.go" - 7113-7114: "punctuation.section.function-block.begin.go" - Data: "{" - 7116-7121: "meta.initialization.short.go" - 7116-7121: "variable.other.go" - 7119-7121: "keyword.operator.initialize.go" - Data: ":=" - 7130-7140: "meta.function-call.go" - 7130-7139: "support.function.any-method.go" - Data: "GetEditor" - 7146-7158: "meta.function-call.go" - 7146-7157: "support.function.any-method.go" - Data: "SetFrontend" - 7161-7162: "" - 7161-7162: "punctuation.whitespace.comment.leading.go" - Data: " " - 7162-7182: "" - 7162-7182: "comment.line.double-slash.go" - 7162-7164: "punctuation.definition.comment.go" - Data: "//" - 7182-7183: "" - 7182-7183: "punctuation.whitespace.comment.leading.go" - Data: " " - 7183-7206: "" - 7183-7206: "comment.line.double-slash.go" - 7183-7185: "punctuation.definition.comment.go" - Data: "//" - 7207-7211: "meta.initialization.short.go" - 7207-7211: "variable.other.go" - 7209-7211: "keyword.operator.initialize.go" - Data: ":=" - 7215-7223: "meta.function-call.go" - 7215-7222: "support.function.any-method.go" - Data: "Console" - 7224-7231: "meta.function-call.go" - 7224-7226: "punctuation.whitespace.function-call.leading.go" - Data: " - " - 7226-7229: "support.function.any-method.go" - Data: "var" - 7250-7255: "variable.other.dot-access.go" - Data: "Theme" - 7261-7263: "keyword.control.go" - Data: "if" - 7264-7273: "meta.initialization.short.go" - 7264-7273: "variable.other.go" - 7271-7273: "keyword.operator.initialize.go" - Data: ":=" - 7281-7290: "meta.function-call.go" - 7281-7289: "support.function.any-method.go" - Data: "ReadFile" - 7290-7350: "string.quoted.double.go" - 7290-7291: "punctuation.definition.string.begin.go" - Data: """ - 7349-7350: "punctuation.definition.string.end.go" - Data: """ - 7360-7363: "constant.language.go" - Data: "nil" - 7364-7433: "meta.block.go" - 7364-7365: "punctuation.section.function-block.begin.go" - Data: "{" - 7375-7381: "meta.function-call.go" - 7375-7380: "support.function.any-method.go" - Data: "Error" - 7381-7424: "string.quoted.double.go" - 7381-7382: "punctuation.definition.string.begin.go" - Data: """ - 7421-7423: "constant.other.placeholder.go" - Data: "%s" - 7423-7424: "punctuation.definition.string.end.go" - Data: """ - 7432-7433: "punctuation.section.function-block.end.go" - Data: "}" - 7434-7438: "keyword.control.go" - Data: "else" - 7439-7441: "keyword.control.go" - Data: "if" - 7442-7448: "meta.initialization.short.go" - 7442-7448: "variable.other.go" - 7446-7448: "keyword.operator.initialize.go" - Data: ":=" - 7457-7467: "meta.function-call.go" - 7457-7466: "support.function.any-method.go" - Data: "LoadPlist" - 7487-7490: "constant.language.go" - Data: "nil" - 7491-7560: "meta.block.go" - 7491-7492: "punctuation.section.function-block.begin.go" - Data: "{" - 7502-7508: "meta.function-call.go" - 7502-7507: "support.function.any-method.go" - Data: "Error" - 7508-7551: "string.quoted.double.go" - 7508-7509: "punctuation.definition.string.begin.go" - Data: """ - 7548-7550: "constant.other.placeholder.go" - Data: "%s" - 7550-7551: "punctuation.definition.string.end.go" - Data: """ - 7559-7560: "punctuation.section.function-block.end.go" - Data: "}" - 7560-7568: "meta.function-call.go" - 7560-7563: "punctuation.whitespace.function-call.leading.go" - Data: " - - " - 7563-7566: "support.function.any-method.go" - Data: "var" - 7578-7584: "meta.function-call.go" - 7578-7579: "punctuation.whitespace.function-call.leading.go" - Data: " " - 7579-7583: "support.function.any-method.go" - Data: "func" - 7597-7602: "variable.other.dot-access.go" - Data: "Color" - 7612-7621: "variable.other.dot-access.go" - Data: "Attribute" - 7633-7638: "" - 7633-7634: "punctuation.whitespace.support.function.leading.go" - Data: " " - 7634-7638: "support.function.builtin.go" - Data: "make" - 7638-7661: "meta.parens.go" - 7638-7639: "punctuation.section.parens.begin.go" - Data: "(" - 7649-7652: "variable.other.dot-access.go" - Data: "RGB" - 7654-7655: "constant.numeric.go" - Data: "0" - 7657-7660: "constant.numeric.go" - Data: "256" - 7660-7661: "punctuation.section.parens.end.go" - Data: ")" - 7672-7676: "storage.type.go" - Data: "bool" - 7682-7684: "keyword.control.go" - Data: "if" - 7685-7691: "meta.initialization.short.go" - 7685-7691: "variable.other.go" - 7689-7691: "keyword.operator.initialize.go" - Data: ":=" - 7700-7713: "meta.function-call.go" - 7700-7712: "support.function.any-method.go" - Data: "SetColorMode" - 7721-7733: "variable.other.dot-access.go" - Data: "ColorMode256" - 7743-7746: "constant.language.go" - Data: "nil" - 7747-7807: "meta.block.go" - 7747-7748: "punctuation.section.function-block.begin.go" - Data: "{" - 7758-7764: "meta.function-call.go" - 7758-7763: "support.function.any-method.go" - Data: "Error" - 7764-7798: "string.quoted.double.go" - 7764-7765: "punctuation.definition.string.begin.go" - Data: """ - 7795-7797: "constant.other.placeholder.go" - Data: "%s" - 7797-7798: "punctuation.definition.string.end.go" - Data: """ - 7806-7807: "punctuation.section.function-block.end.go" - Data: "}" - 7808-7812: "keyword.control.go" - Data: "else" - 7813-7873: "meta.block.go" - 7813-7814: "punctuation.section.function-block.begin.go" - Data: "{" - 7824-7830: "meta.function-call.go" - 7824-7829: "support.function.any-method.go" - Data: "Debug" - 7830-7852: "string.quoted.double.go" - 7830-7831: "punctuation.definition.string.begin.go" - Data: """ - 7851-7852: "punctuation.definition.string.end.go" - Data: """ - 7866-7870: "constant.language.go" - Data: "true" - 7872-7873: "punctuation.section.function-block.end.go" - Data: "}" - 7876-7878: "keyword.control.go" - Data: "if" - 7888-8749: "meta.block.go" - 7888-7889: "punctuation.section.function-block.begin.go" - Data: "{" - 7903-7905: "constant.numeric.go" - Data: "10" - 7907-7936: "" - 7907-7936: "comment.line.double-slash.go" - 7907-7909: "punctuation.definition.comment.go" - Data: "//" - 7950-7960: "variable.other.dot-access.go" - Data: "ColorBlack" - 7972-7975: "variable.other.dot-access.go" - Data: "RGB" - 7975-7984: "meta.block.go" - 7975-7976: "punctuation.section.function-block.begin.go" - Data: "{" - 7976-7977: "constant.numeric.go" - Data: "0" - 7979-7980: "constant.numeric.go" - Data: "0" - 7982-7983: "constant.numeric.go" - Data: "0" - 7983-7984: "punctuation.section.function-block.end.go" - Data: "}" - 7999-8009: "variable.other.dot-access.go" - Data: "ColorWhite" - 8021-8024: "variable.other.dot-access.go" - Data: "RGB" - 8024-8039: "meta.block.go" - 8024-8025: "punctuation.section.function-block.begin.go" - Data: "{" - 8025-8028: "constant.numeric.go" - Data: "255" - 8030-8033: "constant.numeric.go" - Data: "255" - 8035-8038: "constant.numeric.go" - Data: "255" - 8038-8039: "punctuation.section.function-block.end.go" - Data: "}" - 8054-8062: "variable.other.dot-access.go" - Data: "ColorRed" - 8074-8077: "variable.other.dot-access.go" - Data: "RGB" - 8077-8088: "meta.block.go" - 8077-8078: "punctuation.section.function-block.begin.go" - Data: "{" - 8078-8081: "constant.numeric.go" - Data: "255" - 8083-8084: "constant.numeric.go" - Data: "0" - 8086-8087: "constant.numeric.go" - Data: "0" - 8087-8088: "punctuation.section.function-block.end.go" - Data: "}" - 8103-8113: "variable.other.dot-access.go" - Data: "ColorGreen" - 8125-8128: "variable.other.dot-access.go" - Data: "RGB" - 8128-8139: "meta.block.go" - 8128-8129: "punctuation.section.function-block.begin.go" - Data: "{" - 8129-8130: "constant.numeric.go" - Data: "0" - 8132-8135: "constant.numeric.go" - Data: "255" - 8137-8138: "constant.numeric.go" - Data: "0" - 8138-8139: "punctuation.section.function-block.end.go" - Data: "}" - 8154-8163: "variable.other.dot-access.go" - Data: "ColorBlue" - 8175-8178: "variable.other.dot-access.go" - Data: "RGB" - 8178-8189: "meta.block.go" - 8178-8179: "punctuation.section.function-block.begin.go" - Data: "{" - 8179-8180: "constant.numeric.go" - Data: "0" - 8182-8183: "constant.numeric.go" - Data: "0" - 8185-8188: "constant.numeric.go" - Data: "255" - 8188-8189: "punctuation.section.function-block.end.go" - Data: "}" - 8204-8216: "variable.other.dot-access.go" - Data: "ColorMagenta" - 8228-8231: "variable.other.dot-access.go" - Data: "RGB" - 8231-8244: "meta.block.go" - 8231-8232: "punctuation.section.function-block.begin.go" - Data: "{" - 8232-8235: "constant.numeric.go" - Data: "255" - 8237-8238: "constant.numeric.go" - Data: "0" - 8240-8243: "constant.numeric.go" - Data: "255" - 8243-8244: "punctuation.section.function-block.end.go" - Data: "}" - 8259-8270: "variable.other.dot-access.go" - Data: "ColorYellow" - 8282-8285: "variable.other.dot-access.go" - Data: "RGB" - 8285-8298: "meta.block.go" - 8285-8286: "punctuation.section.function-block.begin.go" - Data: "{" - 8286-8289: "constant.numeric.go" - Data: "255" - 8291-8294: "constant.numeric.go" - Data: "255" - 8296-8297: "constant.numeric.go" - Data: "0" - 8297-8298: "punctuation.section.function-block.end.go" - Data: "}" - 8313-8322: "variable.other.dot-access.go" - Data: "ColorCyan" - 8334-8337: "variable.other.dot-access.go" - Data: "RGB" - 8337-8350: "meta.block.go" - 8337-8338: "punctuation.section.function-block.begin.go" - Data: "{" - 8338-8339: "constant.numeric.go" - Data: "0" - 8341-8344: "constant.numeric.go" - Data: "255" - 8346-8349: "constant.numeric.go" - Data: "255" - 8349-8350: "punctuation.section.function-block.end.go" - Data: "}" - 8354-8361: "meta.initialization.short.go" - 8354-8361: "variable.other.go" - 8359-8361: "keyword.operator.initialize.go" - Data: ":=" - 8361-8367: "meta.function-call.go" - 8361-8362: "punctuation.whitespace.function-call.leading.go" - Data: " " - 8362-8366: "support.function.any-method.go" - Data: "func" - 8372-8376: "storage.type.go" - Data: "byte" - 8378-8381: "storage.type.go" - Data: "int" - 8382-8456: "meta.block.go" - 8382-8383: "punctuation.section.function-block.begin.go" - Data: "{" - 8387-8391: "meta.initialization.short.go" - 8387-8391: "variable.other.go" - 8389-8391: "keyword.operator.initialize.go" - Data: ":=" - 8391-8396: "meta.function-call.go" - 8391-8392: "punctuation.whitespace.function-call.leading.go" - Data: " " - 8392-8395: "support.function.any-method.go" - Data: "int" - 8400-8405: "meta.function-call.go" - 8400-8401: "punctuation.whitespace.function-call.leading.go" - Data: " " - 8401-8404: "support.function.any-method.go" - Data: "int" - 8411-8413: "keyword.control.go" - Data: "if" - 8418-8419: "constant.numeric.go" - Data: "0" - 8420-8440: "meta.block.go" - 8420-8421: "punctuation.section.function-block.begin.go" - Data: "{" - 8426-8432: "keyword.control.go" - Data: "return" - 8439-8440: "punctuation.section.function-block.end.go" - Data: "}" - 8444-8450: "keyword.control.go" - Data: "return" - 8455-8456: "punctuation.section.function-block.end.go" - Data: "}" - 8467-8473: "meta.function-call.go" - 8467-8468: "punctuation.whitespace.function-call.leading.go" - Data: " " - 8468-8472: "support.function.any-method.go" - Data: "func" - 8486-8491: "variable.other.dot-access.go" - Data: "Color" - 8501-8510: "variable.other.dot-access.go" - Data: "Attribute" - 8511-8746: "meta.block.go" - 8511-8512: "punctuation.section.function-block.begin.go" - Data: "{" - 8516-8526: "meta.initialization.short.go" - 8516-8526: "variable.other.go" - 8524-8526: "keyword.operator.initialize.go" - Data: ":=" - 8527-8535: "constant.numeric.go" - Data: "10000000" - 8539-8546: "meta.initialization.short.go" - 8539-8546: "variable.other.go" - 8544-8546: "keyword.operator.initialize.go" - Data: ":=" - 8547-8548: "constant.numeric.go" - Data: "0" - 8552-8555: "keyword.control.go" - Data: "for" - 8556-8563: "meta.initialization.short.go" - 8556-8563: "variable.other.go" - 8561-8563: "keyword.operator.initialize.go" - Data: ":=" - 8564-8569: "keyword.control.go" - Data: "range" - 8574-8708: "meta.block.go" - 8574-8575: "punctuation.section.function-block.begin.go" - Data: "{" - 8580-8582: "keyword.control.go" - Data: "if" - 8583-8590: "meta.initialization.short.go" - 8583-8590: "variable.other.go" - 8588-8590: "keyword.operator.initialize.go" - Data: ":=" - 8590-8596: "meta.function-call.go" - 8590-8591: "punctuation.whitespace.function-call.leading.go" - Data: " " - 8591-8595: "support.function.any-method.go" - Data: "diff" - 8598-8599: "variable.other.dot-access.go" - Data: "R" - 8605-8606: "variable.other.dot-access.go" - Data: "R" - 8609-8615: "meta.function-call.go" - 8609-8610: "punctuation.whitespace.function-call.leading.go" - Data: " " - 8610-8614: "support.function.any-method.go" - Data: "diff" - 8617-8618: "variable.other.dot-access.go" - Data: "G" - 8624-8625: "variable.other.dot-access.go" - Data: "G" - 8628-8634: "meta.function-call.go" - 8628-8629: "punctuation.whitespace.function-call.leading.go" - Data: " " - 8629-8633: "support.function.any-method.go" - Data: "diff" - 8636-8637: "variable.other.dot-access.go" - Data: "B" - 8643-8644: "variable.other.dot-access.go" - Data: "B" - 8662-8703: "meta.block.go" - 8662-8663: "punctuation.section.function-block.begin.go" - Data: "{" - 8702-8703: "punctuation.section.function-block.end.go" - Data: "}" - 8707-8708: "punctuation.section.function-block.end.go" - Data: "}" - 8712-8718: "keyword.control.go" - Data: "return" - 8727-8737: "meta.function-call.go" - 8727-8736: "support.function.any-method.go" - Data: "Attribute" - 8745-8746: "punctuation.section.function-block.end.go" - Data: "}" - 8748-8749: "punctuation.section.function-block.end.go" - Data: "}" - 8750-8754: "keyword.control.go" - Data: "else" - 8755-9022: "meta.block.go" - 8755-8756: "punctuation.section.function-block.begin.go" - Data: "{" - 8767-8773: "meta.function-call.go" - 8767-8768: "punctuation.whitespace.function-call.leading.go" - Data: " " - 8768-8772: "support.function.any-method.go" - Data: "func" - 8786-8791: "variable.other.dot-access.go" - Data: "Color" - 8801-8810: "variable.other.dot-access.go" - Data: "Attribute" - 8811-9019: "meta.block.go" - 8811-8812: "punctuation.section.function-block.begin.go" - Data: "{" - 8816-8821: "meta.initialization.short.go" - 8816-8821: "variable.other.go" - 8819-8821: "keyword.operator.initialize.go" - Data: ":=" - 8830-8833: "variable.other.dot-access.go" - Data: "RGB" - 8833-8854: "meta.block.go" - 8833-8834: "punctuation.section.function-block.begin.go" - Data: "{" - 8838-8839: "variable.other.dot-access.go" - Data: "R" - 8845-8846: "variable.other.dot-access.go" - Data: "G" - 8852-8853: "variable.other.dot-access.go" - Data: "B" - 8853-8854: "punctuation.section.function-block.end.go" - Data: "}" - 8858-8861: "keyword.control.go" - Data: "for" - 8862-8869: "meta.initialization.short.go" - 8862-8869: "variable.other.go" - 8867-8869: "keyword.operator.initialize.go" - Data: ":=" - 8870-8875: "keyword.control.go" - Data: "range" - 8880-8942: "meta.block.go" - 8880-8881: "punctuation.section.function-block.begin.go" - Data: "{" - 8886-8888: "keyword.control.go" - Data: "if" - 8897-8937: "meta.block.go" - 8897-8898: "punctuation.section.function-block.begin.go" - Data: "{" - 8904-8910: "keyword.control.go" - Data: "return" - 8919-8929: "meta.function-call.go" - 8919-8928: "support.function.any-method.go" - Data: "Attribute" - 8936-8937: "punctuation.section.function-block.end.go" - Data: "}" - 8941-8942: "punctuation.section.function-block.end.go" - Data: "}" - 8946-8950: "meta.initialization.short.go" - 8946-8950: "variable.other.go" - 8948-8950: "keyword.operator.initialize.go" - Data: ":=" - 8950-8954: "" - 8950-8951: "punctuation.whitespace.support.function.leading.go" - Data: " " - 8951-8954: "support.function.builtin.go" - Data: "len" - 8954-8959: "meta.parens.go" - 8954-8955: "punctuation.section.parens.begin.go" - Data: "(" - 8958-8959: "punctuation.section.parens.end.go" - Data: ")" - 8968-8976: "meta.function-call.go" - 8968-8969: "punctuation.whitespace.function-call.leading.go" - Data: " " - 8969-8975: "support.function.any-method.go" - Data: "append" - 8988-8994: "keyword.control.go" - Data: "return" - 9003-9013: "meta.function-call.go" - 9003-9012: "support.function.any-method.go" - Data: "Attribute" - 9018-9019: "punctuation.section.function-block.end.go" - Data: "}" - 9021-9022: "punctuation.section.function-block.end.go" - Data: "}" - 9024-9027: "keyword.control.go" - Data: "for" - 9028-9035: "meta.initialization.short.go" - 9028-9035: "variable.other.go" - 9033-9035: "keyword.operator.initialize.go" - Data: ":=" - 9036-9041: "keyword.control.go" - Data: "range" - 9049-9057: "variable.other.dot-access.go" - Data: "Settings" - 9058-9378: "meta.block.go" - 9058-9059: "punctuation.section.function-block.begin.go" - Data: "{" - 9059-9067: "meta.function-call.go" - 9059-9062: "punctuation.whitespace.function-call.leading.go" - Data: " - " - 9062-9065: "support.function.any-method.go" - Data: "var" - 9110-9112: "keyword.control.go" - Data: "if" - 9113-9122: "meta.initialization.short.go" - 9113-9122: "variable.other.go" - 9120-9122: "keyword.operator.initialize.go" - Data: ":=" - 9125-9133: "variable.other.dot-access.go" - Data: "Settings" - 9134-9146: "string.quoted.double.go" - 9134-9135: "punctuation.definition.string.begin.go" - Data: """ - 9145-9146: "punctuation.definition.string.end.go" - Data: """ - 9152-9215: "meta.block.go" - 9152-9153: "punctuation.section.function-block.begin.go" - Data: "{" - 9161-9169: "meta.function-call.go" - 9161-9162: "punctuation.whitespace.function-call.leading.go" - Data: " " - 9162-9168: "support.function.any-method.go" - Data: "palLut" - 9176-9178: "keyword.control.go" - Data: "if" - 9184-9185: "constant.numeric.go" - Data: "0" - 9186-9211: "meta.block.go" - 9186-9187: "punctuation.section.function-block.begin.go" - Data: "{" - 9210-9211: "punctuation.section.function-block.end.go" - Data: "}" - 9214-9215: "punctuation.section.function-block.end.go" - Data: "}" - 9218-9220: "keyword.control.go" - Data: "if" - 9221-9230: "meta.initialization.short.go" - 9221-9230: "variable.other.go" - 9228-9230: "keyword.operator.initialize.go" - Data: ":=" - 9233-9241: "variable.other.dot-access.go" - Data: "Settings" - 9242-9254: "string.quoted.double.go" - 9242-9243: "punctuation.definition.string.begin.go" - Data: """ - 9253-9254: "punctuation.definition.string.end.go" - Data: """ - 9260-9323: "meta.block.go" - 9260-9261: "punctuation.section.function-block.begin.go" - Data: "{" - 9269-9277: "meta.function-call.go" - 9269-9270: "punctuation.whitespace.function-call.leading.go" - Data: " " - 9270-9276: "support.function.any-method.go" - Data: "palLut" - 9284-9286: "keyword.control.go" - Data: "if" - 9292-9293: "constant.numeric.go" - Data: "0" - 9294-9319: "meta.block.go" - 9294-9295: "punctuation.section.function-block.begin.go" - Data: "{" - 9318-9319: "punctuation.section.function-block.end.go" - Data: "}" - 9322-9323: "punctuation.section.function-block.end.go" - Data: "}" - 9338-9343: "variable.other.dot-access.go" - Data: "Scope" - 9348-9349: "constant.numeric.go" - Data: "2" - 9358-9367: "variable.other.dot-access.go" - Data: "Attribute" - 9367-9375: "meta.block.go" - 9367-9368: "punctuation.section.function-block.begin.go" - Data: "{" - 9374-9375: "punctuation.section.function-block.end.go" - Data: "}" - 9377-9378: "punctuation.section.function-block.end.go" - Data: "}" - 9380-9382: "keyword.control.go" - Data: "if" - 9391-9426: "meta.block.go" - 9391-9392: "punctuation.section.function-block.begin.go" - Data: "{" - 9403-9419: "meta.function-call.go" - 9403-9418: "support.function.any-method.go" - Data: "SetColorPalette" - 9425-9426: "punctuation.section.function-block.end.go" - Data: "}" - 9428-9433: "keyword.control.go" - Data: "defer" - 9434-9438: "keyword.control.go" - Data: "func" - 9438-9440: "meta.parens.go" - 9438-9439: "punctuation.section.parens.begin.go" - Data: "(" - 9439-9440: "punctuation.section.parens.end.go" - Data: ")" - 9441-9496: "meta.block.go" - 9441-9442: "punctuation.section.function-block.begin.go" - Data: "{" - 9453-9459: "meta.function-call.go" - 9453-9458: "support.function.any-method.go" - Data: "Close" - 9467-9475: "meta.function-call.go" - 9467-9474: "support.function.any-method.go" - Data: "Println" - 9477-9484: "meta.function-call.go" - 9477-9483: "support.function.any-method.go" - Data: "Buffer" - 9486-9491: "meta.function-call.go" - 9486-9490: "support.function.any-method.go" - Data: "Data" - 9495-9496: "punctuation.section.function-block.end.go" - Data: "}" - 9496-9498: "meta.parens.go" - 9496-9497: "punctuation.section.parens.begin.go" - Data: "(" - 9497-9498: "punctuation.section.parens.end.go" - Data: ")" - 9501-9505: "meta.initialization.short.go" - 9501-9505: "variable.other.go" - 9503-9505: "keyword.operator.initialize.go" - Data: ":=" - 9509-9519: "meta.function-call.go" - 9509-9518: "support.function.any-method.go" - Data: "NewWindow" - 9524-9537: "variable.other.dot-access.go" - Data: "active_window" - 9543-9547: "meta.initialization.short.go" - 9543-9547: "variable.other.go" - 9545-9547: "keyword.operator.initialize.go" - Data: ":=" - 9550-9559: "meta.function-call.go" - 9550-9558: "support.function.any-method.go" - Data: "OpenFile" - 9559-9568: "string.quoted.double.go" - 9559-9560: "punctuation.definition.string.begin.go" - Data: """ - 9567-9568: "punctuation.definition.string.end.go" - Data: """ - 9570-9571: "constant.numeric.go" - Data: "0" - 9576-9585: "meta.function-call.go" - 9576-9584: "support.function.any-method.go" - Data: "Settings" - 9587-9591: "meta.function-call.go" - 9587-9590: "support.function.any-method.go" - Data: "Set" - 9591-9598: "string.quoted.double.go" - 9591-9592: "punctuation.definition.string.begin.go" - Data: """ - 9597-9598: "punctuation.definition.string.end.go" - Data: """ - 9600-9604: "constant.language.go" - Data: "true" - 9609-9616: "meta.function-call.go" - 9609-9615: "support.function.any-method.go" - Data: "Buffer" - 9618-9630: "meta.function-call.go" - 9618-9629: "support.function.any-method.go" - Data: "AddCallback" - 9632-9638: "variable.other.dot-access.go" - Data: "scroll" - 9642-9644: "keyword.control.go" - Data: "if" - 9645-9651: "meta.initialization.short.go" - 9645-9651: "variable.other.go" - 9649-9651: "keyword.operator.initialize.go" - Data: ":=" - 9654-9668: "meta.function-call.go" - 9654-9667: "support.function.any-method.go" - Data: "SetSyntaxFile" - 9668-9723: "string.quoted.double.go" - 9668-9669: "punctuation.definition.string.begin.go" - Data: """ - 9722-9723: "punctuation.definition.string.end.go" - Data: """ - 9733-9736: "constant.language.go" - Data: "nil" - 9737-9794: "meta.block.go" - 9737-9738: "punctuation.section.function-block.begin.go" - Data: "{" - 9748-9754: "meta.function-call.go" - 9748-9753: "support.function.any-method.go" - Data: "Error" - 9754-9785: "string.quoted.double.go" - 9754-9755: "punctuation.definition.string.begin.go" - Data: """ - 9782-9784: "constant.other.placeholder.go" - Data: "%s" - 9784-9785: "punctuation.definition.string.end.go" - Data: """ - 9793-9794: "punctuation.section.function-block.end.go" - Data: "}" - 9796-9802: "meta.initialization.short.go" - 9796-9802: "variable.other.go" - 9800-9802: "keyword.operator.initialize.go" - Data: ":=" - 9805-9809: "meta.function-call.go" - 9805-9808: "support.function.any-method.go" - Data: "Sel" - 9816-9822: "meta.function-call.go" - 9816-9821: "support.function.any-method.go" - Data: "Clear" - 9824-9825: "" - 9824-9825: "punctuation.whitespace.comment.leading.go" - Data: " " - 9825-9857: "" - 9825-9857: "comment.line.double-slash.go" - 9825-9827: "punctuation.definition.comment.go" - Data: "//" - 9862-9866: "meta.function-call.go" - 9862-9865: "support.function.any-method.go" - Data: "Add" - 9877-9883: "variable.other.dot-access.go" - Data: "Region" - 9883-9889: "meta.block.go" - 9883-9884: "punctuation.section.function-block.begin.go" - Data: "{" - 9884-9885: "constant.numeric.go" - Data: "0" - 9887-9888: "constant.numeric.go" - Data: "0" - 9888-9889: "punctuation.section.function-block.end.go" - Data: "}" - 9891-9892: "" - 9891-9892: "punctuation.whitespace.comment.leading.go" - Data: " " - 9892-9942: "" - 9892-9942: "comment.line.double-slash.go" - 9892-9894: "punctuation.definition.comment.go" - Data: "//" - 9942-9943: "" - 9942-9943: "punctuation.whitespace.comment.leading.go" - Data: " " - 9943-9993: "" - 9943-9993: "comment.line.double-slash.go" - 9943-9945: "punctuation.definition.comment.go" - Data: "//" - 9993-9994: "" - 9993-9994: "punctuation.whitespace.comment.leading.go" - Data: " " - 9994-10044: "" - 9994-10044: "comment.line.double-slash.go" - 9994-9996: "punctuation.definition.comment.go" - Data: "//" - 10046-10055: "meta.initialization.short.go" - 10046-10055: "variable.other.go" - 10053-10055: "keyword.operator.initialize.go" - Data: ":=" - 10055-10060: "" - 10055-10056: "punctuation.whitespace.support.function.leading.go" - Data: " " - 10056-10060: "support.function.builtin.go" - Data: "make" - 10060-10080: "meta.parens.go" - 10060-10061: "punctuation.section.parens.begin.go" - Data: "(" - 10061-10065: "storage.modifier.go" - Data: "chan" - 10074-10079: "variable.other.dot-access.go" - Data: "Event" - 10079-10080: "punctuation.section.parens.end.go" - Data: ")" - 10083-10085: "keyword.control.go" - Data: "go" - 10086-10090: "keyword.control.go" - Data: "func" - 10090-10092: "meta.parens.go" - 10090-10091: "punctuation.section.parens.begin.go" - Data: "(" - 10091-10092: "punctuation.section.parens.end.go" - Data: ")" - 10093-10142: "meta.block.go" - 10093-10094: "punctuation.section.function-block.begin.go" - Data: "{" - 10097-10100: "keyword.control.go" - Data: "for" - 10101-10139: "meta.block.go" - 10101-10102: "punctuation.section.function-block.begin.go" - Data: "{" - 10113-10115: "support.channel-operator.go" - Data: "<-" - 10124-10134: "meta.function-call.go" - 10124-10133: "support.function.any-method.go" - Data: "PollEvent" - 10138-10139: "punctuation.section.function-block.end.go" - Data: "}" - 10141-10142: "punctuation.section.function-block.end.go" - Data: "}" - 10142-10144: "meta.parens.go" - 10142-10143: "punctuation.section.parens.begin.go" - Data: "(" - 10143-10144: "punctuation.section.parens.end.go" - Data: ")" - 10155-10160: "meta.function-call.go" - 10155-10159: "support.function.any-method.go" - Data: "Init" - 10163-10166: "keyword.control.go" - Data: "for" - 10167-11203: "meta.block.go" - 10167-10168: "punctuation.section.function-block.begin.go" - Data: "{" - 10196-10202: "meta.function-call.go" - 10196-10201: "support.function.any-method.go" - Data: "Clear" - 10226-10233: "meta.initialization.short.go" - 10226-10233: "variable.other.go" - 10231-10233: "keyword.operator.initialize.go" - Data: ":=" - 10242-10247: "meta.function-call.go" - 10242-10246: "support.function.any-method.go" - Data: "Size" - 10254-10265: "meta.function-call.go" - 10254-10264: "support.function.any-method.go" - Data: "renderView" - 10265-10266: "constant.numeric.go" - Data: "0" - 10268-10269: "constant.numeric.go" - Data: "0" - 10299-10310: "meta.function-call.go" - 10299-10309: "support.function.any-method.go" - Data: "renderView" - 10310-10311: "constant.numeric.go" - Data: "0" - 10315-10331: "meta.parens.go" - 10315-10316: "punctuation.section.parens.begin.go" - Data: "(" - 10330-10331: "punctuation.section.parens.end.go" - Data: ")" - 10336-10356: "meta.parens.go" - 10336-10337: "punctuation.section.parens.begin.go" - Data: "(" - 10354-10355: "constant.numeric.go" - Data: "1" - 10355-10356: "punctuation.section.parens.end.go" - Data: ")" - 10363-10371: "meta.initialization.short.go" - 10363-10371: "variable.other.go" - 10369-10371: "keyword.operator.initialize.go" - Data: ":=" - 10374-10379: "meta.function-call.go" - 10374-10378: "support.function.any-method.go" - Data: "rune" - 10381-10395: "variable.other.dot-access.go" - Data: "status_message" - 10399-10402: "keyword.control.go" - Data: "for" - 10403-10407: "meta.initialization.short.go" - 10403-10407: "variable.other.go" - 10405-10407: "keyword.operator.initialize.go" - Data: ":=" - 10408-10409: "constant.numeric.go" - Data: "0" - 10423-10427: "" - 10423-10424: "punctuation.whitespace.support.function.leading.go" - Data: " " - 10424-10427: "support.function.builtin.go" - Data: "len" - 10427-10434: "meta.parens.go" - 10427-10428: "punctuation.section.parens.begin.go" - Data: "(" - 10433-10434: "punctuation.section.parens.end.go" - Data: ")" - 10440-10504: "meta.block.go" - 10440-10441: "punctuation.section.function-block.begin.go" - Data: "{" - 10453-10461: "meta.function-call.go" - 10453-10460: "support.function.any-method.go" - Data: "SetCell" - 10466-10467: "constant.numeric.go" - Data: "1" - 10503-10504: "punctuation.section.function-block.end.go" - Data: "}" - 10515-10521: "meta.function-call.go" - 10515-10520: "support.function.any-method.go" - Data: "Flush" - 10526-10540: "meta.initialization.short.go" - 10526-10540: "variable.other.go" - 10538-10540: "keyword.operator.initialize.go" - Data: ":=" - 10546-10552: "variable.other.dot-access.go" - Data: "Second" - 10555-10557: "keyword.control.go" - Data: "if" - 10558-10566: "meta.initialization.short.go" - 10558-10566: "variable.other.go" - 10564-10566: "keyword.operator.initialize.go" - Data: ":=" - 10570-10579: "meta.function-call.go" - 10570-10578: "support.function.any-method.go" - Data: "Settings" - 10581-10585: "meta.function-call.go" - 10581-10584: "support.function.any-method.go" - Data: "Get" - 10585-10604: "string.quoted.double.go" - 10585-10586: "punctuation.definition.string.begin.go" - Data: """ - 10603-10604: "punctuation.definition.string.end.go" - Data: """ - 10606-10609: "constant.numeric.go" - Data: "1.0" - 10611-10620: "meta.parens.go" - 10611-10612: "punctuation.section.parens.begin.go" - Data: "(" - 10612-10619: "storage.type.go" - Data: "float64" - 10619-10620: "punctuation.section.parens.end.go" - Data: ")" - 10625-10687: "meta.block.go" - 10625-10626: "punctuation.section.function-block.begin.go" - Data: "{" - 10649-10658: "meta.function-call.go" - 10649-10657: "support.function.any-method.go" - Data: "Duration" - 10658-10665: "storage.type.go" - Data: "float64" - 10665-10678: "meta.parens.go" - 10665-10666: "punctuation.section.parens.begin.go" - Data: "(" - 10671-10677: "variable.other.dot-access.go" - Data: "Second" - 10677-10678: "punctuation.section.parens.end.go" - Data: ")" - 10686-10687: "punctuation.section.function-block.end.go" - Data: "}" - 10691-10697: "keyword.control.go" - Data: "select" - 10698-11200: "meta.block.go" - 10698-10699: "punctuation.section.function-block.begin.go" - Data: "{" - 10702-10706: "keyword.control.go" - Data: "case" - 10707-10712: "meta.initialization.short.go" - 10707-10712: "variable.other.go" - 10710-10712: "keyword.operator.initialize.go" - Data: ":=" - 10713-10715: "support.channel-operator.go" - Data: "<-" - 10726-10732: "keyword.control.go" - Data: "switch" - 10736-10740: "variable.other.dot-access.go" - Data: "Type" - 10741-11036: "meta.block.go" - 10741-10742: "punctuation.section.function-block.begin.go" - Data: "{" - 10746-10750: "keyword.control.go" - Data: "case" - 10759-10767: "variable.other.dot-access.go" - Data: "EventKey" - 10769-10779: "meta.initialization.explicit.go" - 10769-10779: "variable.other.go" - 10773-10776: "keyword.control.go" - Data: "var" - 10788-10796: "variable.other.dot-access.go" - Data: "KeyPress" - 10802-10804: "keyword.control.go" - Data: "if" - 10808-10810: "variable.other.dot-access.go" - Data: "Ch" - 10814-10815: "constant.numeric.go" - Data: "0" - 10816-10856: "meta.block.go" - 10816-10817: "punctuation.section.function-block.begin.go" - Data: "{" - 10826-10829: "variable.other.dot-access.go" - Data: "Key" - 10840-10844: "meta.function-call.go" - 10840-10843: "support.function.any-method.go" - Data: "Key" - 10847-10849: "variable.other.dot-access.go" - Data: "Ch" - 10855-10856: "punctuation.section.function-block.end.go" - Data: "}" - 10857-10861: "keyword.control.go" - Data: "else" - 10862-10864: "keyword.control.go" - Data: "if" - 10865-10874: "meta.initialization.short.go" - 10865-10874: "variable.other.go" - 10872-10874: "keyword.operator.initialize.go" - Data: ":=" - 10882-10885: "variable.other.dot-access.go" - Data: "Key" - 10891-10911: "meta.block.go" - 10891-10892: "punctuation.section.function-block.begin.go" - Data: "{" - 10910-10911: "punctuation.section.function-block.end.go" - Data: "}" - 10912-10916: "keyword.control.go" - Data: "else" - 10917-10935: "meta.block.go" - 10917-10918: "punctuation.section.function-block.begin.go" - Data: "{" - 10924-10929: "keyword.control.go" - Data: "break" - 10934-10935: "punctuation.section.function-block.end.go" - Data: "}" - 10941-10943: "keyword.control.go" - Data: "if" - 10947-10950: "variable.other.dot-access.go" - Data: "Key" - 10962-10970: "variable.other.dot-access.go" - Data: "KeyCtrlQ" - 10971-10990: "meta.block.go" - 10971-10972: "punctuation.section.function-block.begin.go" - Data: "{" - 10978-10984: "keyword.control.go" - Data: "return" - 10989-10990: "punctuation.section.function-block.end.go" - Data: "}" - 10998-11010: "meta.function-call.go" - 10998-11009: "support.function.any-method.go" - Data: "HandleInput" - 11026-11031: "constant.language.go" - Data: "false" - 11035-11036: "punctuation.section.function-block.end.go" - Data: "}" - 11039-11043: "keyword.control.go" - Data: "case" - 11044-11046: "support.channel-operator.go" - Data: "<-" - 11051-11057: "meta.function-call.go" - 11051-11056: "support.function.any-method.go" - Data: "After" - 11071-11072: "constant.numeric.go" - Data: "2" - 11075-11078: "" - 11075-11078: "punctuation.whitespace.comment.leading.go" - Data: " " - 11078-11141: "" - 11078-11141: "comment.line.double-slash.go" - 11078-11080: "punctuation.definition.comment.go" - Data: "//" - 11141-11144: "" - 11141-11144: "punctuation.whitespace.comment.leading.go" - Data: " " - 11144-11197: "" - 11144-11197: "comment.line.double-slash.go" - 11144-11146: "punctuation.definition.comment.go" - Data: "//" - 11199-11200: "punctuation.section.function-block.end.go" - Data: "}" - 11202-11203: "punctuation.section.function-block.end.go" - Data: "}" - 11204-11205: "punctuation.section.function-block.end.go" - Data: "}" - 11207-11368: "meta.function.plain.go" - 11207-11219: "meta.function.declaration.go" - 11207-11211: "keyword.control.go" - Data: "func" - 11212-11216: "entity.name.function.go" - Data: "main" - 11217-11217: "variable.parameters.go" - Data: "" - 11219-11219: "variable.return-types.go" - Data: "" - 11219-11368: "meta.block.go" - 11219-11220: "punctuation.section.function-block.begin.go" - Data: "{" - 11222-11224: "keyword.control.go" - Data: "if" - 11225-11231: "meta.initialization.short.go" - 11225-11231: "variable.other.go" - 11229-11231: "keyword.operator.initialize.go" - Data: ":=" - 11240-11245: "meta.function-call.go" - 11240-11244: "support.function.any-method.go" - Data: "Init" - 11255-11258: "constant.language.go" - Data: "nil" - 11259-11282: "meta.block.go" - 11259-11260: "punctuation.section.function-block.begin.go" - Data: "{" - 11270-11275: "meta.function-call.go" - 11270-11274: "support.function.any-method.go" - Data: "Exit" - 11281-11282: "punctuation.section.function-block.end.go" - Data: "}" - 11284-11290: "meta.initialization.explicit.go" - 11284-11290: "variable.other.go" - 11285-11288: "keyword.control.go" - Data: "var" - 11299-11312: "variable.other.dot-access.go" - Data: "visibleregion" - 11314-11319: "" - 11314-11315: "punctuation.whitespace.support.function.leading.go" - Data: " " - 11315-11319: "support.function.builtin.go" - Data: "make" - 11319-11356: "meta.parens.go" - 11319-11320: "punctuation.section.parens.begin.go" - Data: "(" - 11320-11323: "storage.modifier.go" - Data: "map" - 11333-11337: "variable.other.dot-access.go" - Data: "View" - 11349-11355: "variable.other.dot-access.go" - Data: "Region" - 11355-11356: "punctuation.section.parens.end.go" - Data: ")" - 11360-11365: "meta.function-call.go" - 11360-11364: "support.function.any-method.go" - Data: "loop" - 11367-11368: "punctuation.section.function-block.end.go" - Data: "}" diff --git a/backend/textmate/testdata/plist.tmlang.res b/backend/textmate/testdata/plist.tmlang.res deleted file mode 100644 index ff0632e..0000000 --- a/backend/textmate/testdata/plist.tmlang.res +++ /dev/null @@ -1,9617 +0,0 @@ -0-27717: "text.xml.plist" - 0-38: "meta.tag.preprocessor.xml" - 0-2: "punctuation.definition.tag.xml" - Data: "" - 39-141: "meta.tag.sgml.doctype.xml" - 39-41: "punctuation.definition.tag.xml" - Data: "" - 142-27717: "" - 142-148: "meta.tag.plist.xml.plist" - 142-143: "punctuation.definition.tag.xml.plist" - Data: "<" - 143-148: "entity.name.tag.xml.plist" - 143-148: "entity.name.tag.localname.xml.plist" - Data: "plist" - 148-162: "meta.tag.plist.xml.plist" - 149-156: "entity.other.attribute-name.version.xml.plist" - Data: "version" - 156-157: "punctuation.separator.key-value.xml.plist" - Data: "=" - 157-162: "string.quoted.double.xml.plist" - 157-158: "punctuation.definition.string.begin.xml.plist" - Data: """ - 161-162: "punctuation.definition.string.end.xml.plist" - Data: """ - 162-27710: "" - 162-163: "meta.tag.plist.xml.plist" - 162-163: "punctuation.definition.tag.xml.plist" - Data: ">" - 164-27708: "" - 164-170: "meta.tag.dict.xml.plist" - 164-165: "punctuation.definition.tag.xml.plist" - Data: "<" - 165-169: "entity.name.tag.xml.plist" - 165-169: "entity.name.tag.localname.xml.plist" - Data: "dict" - 169-170: "punctuation.definition.tag.xml.plist" - Data: ">" - 172-192: "" - 172-177: "meta.tag.key.xml.plist" - 172-173: "punctuation.definition.tag.xml.plist" - Data: "<" - 173-176: "entity.name.tag.xml.plist" - 173-176: "entity.name.tag.localname.xml.plist" - Data: "key" - 176-177: "punctuation.definition.tag.xml.plist" - Data: ">" - 186-192: "meta.tag.key.xml.plist" - 186-188: "punctuation.definition.tag.xml.plist" - Data: "" - 194-202: "" - 194-202: "meta.tag.array.xml.plist" - 194-195: "punctuation.definition.tag.xml.plist" - Data: "<" - 195-200: "entity.name.tag.xml.plist" - 195-200: "entity.name.tag.localname.xml.plist" - Data: "array" - 201-202: "punctuation.definition.tag.xml.plist" - Data: ">" - 204-229: "" - 204-209: "meta.tag.key.xml.plist" - 204-205: "punctuation.definition.tag.xml.plist" - Data: "<" - 205-208: "entity.name.tag.xml.plist" - 205-208: "entity.name.tag.localname.xml.plist" - Data: "key" - 208-209: "punctuation.definition.tag.xml.plist" - Data: ">" - 223-229: "meta.tag.key.xml.plist" - 223-225: "punctuation.definition.tag.xml.plist" - Data: "" - 231-295: "" - 231-239: "meta.tag.string.xml.plist" - 231-232: "punctuation.definition.tag.xml.plist" - Data: "<" - 232-238: "entity.name.tag.xml.plist" - 232-238: "entity.name.tag.localname.xml.plist" - Data: "string" - 238-239: "punctuation.definition.tag.xml.plist" - Data: ">" - 286-295: "meta.tag.string.xml.plist" - 286-288: "punctuation.definition.tag.xml.plist" - Data: "" - 297-312: "" - 297-302: "meta.tag.key.xml.plist" - 297-298: "punctuation.definition.tag.xml.plist" - Data: "<" - 298-301: "entity.name.tag.xml.plist" - 298-301: "entity.name.tag.localname.xml.plist" - Data: "key" - 301-302: "punctuation.definition.tag.xml.plist" - Data: ">" - 306-312: "meta.tag.key.xml.plist" - 306-308: "punctuation.definition.tag.xml.plist" - Data: "" - 314-350: "" - 314-322: "meta.tag.string.xml.plist" - 314-315: "punctuation.definition.tag.xml.plist" - Data: "<" - 315-321: "entity.name.tag.xml.plist" - 315-321: "entity.name.tag.localname.xml.plist" - Data: "string" - 321-322: "punctuation.definition.tag.xml.plist" - Data: ">" - 341-350: "meta.tag.string.xml.plist" - 341-343: "punctuation.definition.tag.xml.plist" - Data: "" - 352-371: "" - 352-357: "meta.tag.key.xml.plist" - 352-353: "punctuation.definition.tag.xml.plist" - Data: "<" - 353-356: "entity.name.tag.xml.plist" - 353-356: "entity.name.tag.localname.xml.plist" - Data: "key" - 356-357: "punctuation.definition.tag.xml.plist" - Data: ">" - 365-371: "meta.tag.key.xml.plist" - 365-367: "punctuation.definition.tag.xml.plist" - Data: "" - 373-456: "" - 373-380: "meta.tag.array.xml.plist" - 373-374: "punctuation.definition.tag.xml.plist" - Data: "<" - 374-379: "entity.name.tag.xml.plist" - 374-379: "entity.name.tag.localname.xml.plist" - Data: "array" - 379-380: "punctuation.definition.tag.xml.plist" - Data: ">" - 383-446: "" - 383-389: "meta.tag.dict.xml.plist" - 383-384: "punctuation.definition.tag.xml.plist" - Data: "<" - 384-388: "entity.name.tag.xml.plist" - 384-388: "entity.name.tag.localname.xml.plist" - Data: "dict" - 388-389: "punctuation.definition.tag.xml.plist" - Data: ">" - 393-411: "" - 393-398: "meta.tag.key.xml.plist" - 393-394: "punctuation.definition.tag.xml.plist" - Data: "<" - 394-397: "entity.name.tag.xml.plist" - 394-397: "entity.name.tag.localname.xml.plist" - Data: "key" - 397-398: "punctuation.definition.tag.xml.plist" - Data: ">" - 405-411: "meta.tag.key.xml.plist" - 405-407: "punctuation.definition.tag.xml.plist" - Data: "" - 415-436: "" - 415-423: "meta.tag.string.xml.plist" - 415-416: "punctuation.definition.tag.xml.plist" - Data: "<" - 416-422: "entity.name.tag.xml.plist" - 416-422: "entity.name.tag.localname.xml.plist" - Data: "string" - 422-423: "punctuation.definition.tag.xml.plist" - Data: ">" - 427-436: "meta.tag.string.xml.plist" - 427-429: "punctuation.definition.tag.xml.plist" - Data: "" - 439-446: "meta.tag.dict.xml.plist" - 439-441: "punctuation.definition.tag.xml.plist" - Data: "" - 448-456: "meta.tag.array.xml.plist" - 448-450: "punctuation.definition.tag.xml.plist" - Data: "" - 458-479: "" - 458-463: "meta.tag.key.xml.plist" - 458-459: "punctuation.definition.tag.xml.plist" - Data: "<" - 459-462: "entity.name.tag.xml.plist" - 459-462: "entity.name.tag.localname.xml.plist" - Data: "key" - 462-463: "punctuation.definition.tag.xml.plist" - Data: ">" - 473-479: "meta.tag.key.xml.plist" - 473-475: "punctuation.definition.tag.xml.plist" - Data: "" - 481-27573: "" - 481-487: "meta.tag.dict.xml.plist" - 481-482: "punctuation.definition.tag.xml.plist" - Data: "<" - 482-486: "entity.name.tag.xml.plist" - 482-486: "entity.name.tag.localname.xml.plist" - Data: "dict" - 486-487: "punctuation.definition.tag.xml.plist" - Data: ">" - 490-504: "" - 490-495: "meta.tag.key.xml.plist" - 490-491: "punctuation.definition.tag.xml.plist" - Data: "<" - 491-494: "entity.name.tag.xml.plist" - 491-494: "entity.name.tag.localname.xml.plist" - Data: "key" - 494-495: "punctuation.definition.tag.xml.plist" - Data: ">" - 498-504: "meta.tag.key.xml.plist" - 498-500: "punctuation.definition.tag.xml.plist" - Data: "" - 507-4869: "" - 507-513: "meta.tag.dict.xml.plist" - 507-508: "punctuation.definition.tag.xml.plist" - Data: "<" - 508-512: "entity.name.tag.xml.plist" - 508-512: "entity.name.tag.localname.xml.plist" - Data: "dict" - 512-513: "punctuation.definition.tag.xml.plist" - Data: ">" - 517-536: "" - 517-522: "meta.tag.key.xml.plist" - 517-518: "punctuation.definition.tag.xml.plist" - Data: "<" - 518-521: "entity.name.tag.xml.plist" - 518-521: "entity.name.tag.localname.xml.plist" - Data: "key" - 521-522: "punctuation.definition.tag.xml.plist" - Data: ">" - 530-536: "meta.tag.key.xml.plist" - 530-532: "punctuation.definition.tag.xml.plist" - Data: "" - 540-4859: "" - 540-547: "meta.tag.array.xml.plist" - 540-541: "punctuation.definition.tag.xml.plist" - Data: "<" - 541-546: "entity.name.tag.xml.plist" - 541-546: "entity.name.tag.localname.xml.plist" - Data: "array" - 546-547: "punctuation.definition.tag.xml.plist" - Data: ">" - 552-4520: "" - 552-558: "meta.tag.dict.xml.plist" - 552-553: "punctuation.definition.tag.xml.plist" - Data: "<" - 553-557: "entity.name.tag.xml.plist" - 553-557: "entity.name.tag.localname.xml.plist" - Data: "dict" - 557-558: "punctuation.definition.tag.xml.plist" - Data: ">" - 564-580: "" - 564-569: "meta.tag.key.xml.plist" - 564-565: "punctuation.definition.tag.xml.plist" - Data: "<" - 565-568: "entity.name.tag.xml.plist" - 565-568: "entity.name.tag.localname.xml.plist" - Data: "key" - 568-569: "punctuation.definition.tag.xml.plist" - Data: ">" - 574-580: "meta.tag.key.xml.plist" - 574-576: "punctuation.definition.tag.xml.plist" - Data: "" - 586-622: "" - 586-594: "meta.tag.string.xml.plist" - 586-587: "punctuation.definition.tag.xml.plist" - Data: "<" - 587-593: "entity.name.tag.xml.plist" - 587-593: "entity.name.tag.localname.xml.plist" - Data: "string" - 593-594: "punctuation.definition.tag.xml.plist" - Data: ">" - 613-622: "meta.tag.string.xml.plist" - 613-615: "punctuation.definition.tag.xml.plist" - Data: "" - 628-647: "" - 628-633: "meta.tag.key.xml.plist" - 628-629: "punctuation.definition.tag.xml.plist" - Data: "<" - 629-632: "entity.name.tag.xml.plist" - 629-632: "entity.name.tag.localname.xml.plist" - Data: "key" - 632-633: "punctuation.definition.tag.xml.plist" - Data: ">" - 641-647: "meta.tag.key.xml.plist" - 641-643: "punctuation.definition.tag.xml.plist" - Data: "" - 653-1298: "" - 653-659: "meta.tag.dict.xml.plist" - 653-654: "punctuation.definition.tag.xml.plist" - Data: "<" - 654-658: "entity.name.tag.xml.plist" - 654-658: "entity.name.tag.localname.xml.plist" - Data: "dict" - 658-659: "punctuation.definition.tag.xml.plist" - Data: ">" - 666-678: "" - 666-671: "meta.tag.key.xml.plist" - 666-667: "punctuation.definition.tag.xml.plist" - Data: "<" - 667-670: "entity.name.tag.xml.plist" - 667-670: "entity.name.tag.localname.xml.plist" - Data: "key" - 670-671: "punctuation.definition.tag.xml.plist" - Data: ">" - 672-678: "meta.tag.key.xml.plist" - 672-674: "punctuation.definition.tag.xml.plist" - Data: "" - 685-777: "" - 685-691: "meta.tag.dict.xml.plist" - 685-686: "punctuation.definition.tag.xml.plist" - Data: "<" - 686-690: "entity.name.tag.xml.plist" - 686-690: "entity.name.tag.localname.xml.plist" - Data: "dict" - 690-691: "punctuation.definition.tag.xml.plist" - Data: ">" - 699-714: "" - 699-704: "meta.tag.key.xml.plist" - 699-700: "punctuation.definition.tag.xml.plist" - Data: "<" - 700-703: "entity.name.tag.xml.plist" - 700-703: "entity.name.tag.localname.xml.plist" - Data: "key" - 703-704: "punctuation.definition.tag.xml.plist" - Data: ">" - 708-714: "meta.tag.key.xml.plist" - 708-710: "punctuation.definition.tag.xml.plist" - Data: "" - 722-763: "" - 722-730: "meta.tag.string.xml.plist" - 722-723: "punctuation.definition.tag.xml.plist" - Data: "<" - 723-729: "entity.name.tag.xml.plist" - 723-729: "entity.name.tag.localname.xml.plist" - Data: "string" - 729-730: "punctuation.definition.tag.xml.plist" - Data: ">" - 754-763: "meta.tag.string.xml.plist" - 754-756: "punctuation.definition.tag.xml.plist" - Data: "" - 770-777: "meta.tag.dict.xml.plist" - 770-772: "punctuation.definition.tag.xml.plist" - Data: "" - 784-796: "" - 784-789: "meta.tag.key.xml.plist" - 784-785: "punctuation.definition.tag.xml.plist" - Data: "<" - 785-788: "entity.name.tag.xml.plist" - 785-788: "entity.name.tag.localname.xml.plist" - Data: "key" - 788-789: "punctuation.definition.tag.xml.plist" - Data: ">" - 790-796: "meta.tag.key.xml.plist" - 790-792: "punctuation.definition.tag.xml.plist" - Data: "" - 803-907: "" - 803-809: "meta.tag.dict.xml.plist" - 803-804: "punctuation.definition.tag.xml.plist" - Data: "<" - 804-808: "entity.name.tag.xml.plist" - 804-808: "entity.name.tag.localname.xml.plist" - Data: "dict" - 808-809: "punctuation.definition.tag.xml.plist" - Data: ">" - 817-832: "" - 817-822: "meta.tag.key.xml.plist" - 817-818: "punctuation.definition.tag.xml.plist" - Data: "<" - 818-821: "entity.name.tag.xml.plist" - 818-821: "entity.name.tag.localname.xml.plist" - Data: "key" - 821-822: "punctuation.definition.tag.xml.plist" - Data: ">" - 826-832: "meta.tag.key.xml.plist" - 826-828: "punctuation.definition.tag.xml.plist" - Data: "" - 840-893: "" - 840-848: "meta.tag.string.xml.plist" - 840-841: "punctuation.definition.tag.xml.plist" - Data: "<" - 841-847: "entity.name.tag.xml.plist" - 841-847: "entity.name.tag.localname.xml.plist" - Data: "string" - 847-848: "punctuation.definition.tag.xml.plist" - Data: ">" - 884-893: "meta.tag.string.xml.plist" - 884-886: "punctuation.definition.tag.xml.plist" - Data: "" - 900-907: "meta.tag.dict.xml.plist" - 900-902: "punctuation.definition.tag.xml.plist" - Data: "" - 914-926: "" - 914-919: "meta.tag.key.xml.plist" - 914-915: "punctuation.definition.tag.xml.plist" - Data: "<" - 915-918: "entity.name.tag.xml.plist" - 915-918: "entity.name.tag.localname.xml.plist" - Data: "key" - 918-919: "punctuation.definition.tag.xml.plist" - Data: ">" - 920-926: "meta.tag.key.xml.plist" - 920-922: "punctuation.definition.tag.xml.plist" - Data: "" - 933-1026: "" - 933-939: "meta.tag.dict.xml.plist" - 933-934: "punctuation.definition.tag.xml.plist" - Data: "<" - 934-938: "entity.name.tag.xml.plist" - 934-938: "entity.name.tag.localname.xml.plist" - Data: "dict" - 938-939: "punctuation.definition.tag.xml.plist" - Data: ">" - 947-962: "" - 947-952: "meta.tag.key.xml.plist" - 947-948: "punctuation.definition.tag.xml.plist" - Data: "<" - 948-951: "entity.name.tag.xml.plist" - 948-951: "entity.name.tag.localname.xml.plist" - Data: "key" - 951-952: "punctuation.definition.tag.xml.plist" - Data: ">" - 956-962: "meta.tag.key.xml.plist" - 956-958: "punctuation.definition.tag.xml.plist" - Data: "" - 970-1012: "" - 970-978: "meta.tag.string.xml.plist" - 970-971: "punctuation.definition.tag.xml.plist" - Data: "<" - 971-977: "entity.name.tag.xml.plist" - 971-977: "entity.name.tag.localname.xml.plist" - Data: "string" - 977-978: "punctuation.definition.tag.xml.plist" - Data: ">" - 1003-1012: "meta.tag.string.xml.plist" - 1003-1005: "punctuation.definition.tag.xml.plist" - Data: "" - 1019-1026: "meta.tag.dict.xml.plist" - 1019-1021: "punctuation.definition.tag.xml.plist" - Data: "" - 1033-1045: "" - 1033-1038: "meta.tag.key.xml.plist" - 1033-1034: "punctuation.definition.tag.xml.plist" - Data: "<" - 1034-1037: "entity.name.tag.xml.plist" - 1034-1037: "entity.name.tag.localname.xml.plist" - Data: "key" - 1037-1038: "punctuation.definition.tag.xml.plist" - Data: ">" - 1039-1045: "meta.tag.key.xml.plist" - 1039-1041: "punctuation.definition.tag.xml.plist" - Data: "" - 1052-1155: "" - 1052-1058: "meta.tag.dict.xml.plist" - 1052-1053: "punctuation.definition.tag.xml.plist" - Data: "<" - 1053-1057: "entity.name.tag.xml.plist" - 1053-1057: "entity.name.tag.localname.xml.plist" - Data: "dict" - 1057-1058: "punctuation.definition.tag.xml.plist" - Data: ">" - 1066-1081: "" - 1066-1071: "meta.tag.key.xml.plist" - 1066-1067: "punctuation.definition.tag.xml.plist" - Data: "<" - 1067-1070: "entity.name.tag.xml.plist" - 1067-1070: "entity.name.tag.localname.xml.plist" - Data: "key" - 1070-1071: "punctuation.definition.tag.xml.plist" - Data: ">" - 1075-1081: "meta.tag.key.xml.plist" - 1075-1077: "punctuation.definition.tag.xml.plist" - Data: "" - 1089-1141: "" - 1089-1097: "meta.tag.string.xml.plist" - 1089-1090: "punctuation.definition.tag.xml.plist" - Data: "<" - 1090-1096: "entity.name.tag.xml.plist" - 1090-1096: "entity.name.tag.localname.xml.plist" - Data: "string" - 1096-1097: "punctuation.definition.tag.xml.plist" - Data: ">" - 1132-1141: "meta.tag.string.xml.plist" - 1132-1134: "punctuation.definition.tag.xml.plist" - Data: "" - 1148-1155: "meta.tag.dict.xml.plist" - 1148-1150: "punctuation.definition.tag.xml.plist" - Data: "" - 1162-1174: "" - 1162-1167: "meta.tag.key.xml.plist" - 1162-1163: "punctuation.definition.tag.xml.plist" - Data: "<" - 1163-1166: "entity.name.tag.xml.plist" - 1163-1166: "entity.name.tag.localname.xml.plist" - Data: "key" - 1166-1167: "punctuation.definition.tag.xml.plist" - Data: ">" - 1168-1174: "meta.tag.key.xml.plist" - 1168-1170: "punctuation.definition.tag.xml.plist" - Data: "" - 1181-1285: "" - 1181-1187: "meta.tag.dict.xml.plist" - 1181-1182: "punctuation.definition.tag.xml.plist" - Data: "<" - 1182-1186: "entity.name.tag.xml.plist" - 1182-1186: "entity.name.tag.localname.xml.plist" - Data: "dict" - 1186-1187: "punctuation.definition.tag.xml.plist" - Data: ">" - 1195-1210: "" - 1195-1200: "meta.tag.key.xml.plist" - 1195-1196: "punctuation.definition.tag.xml.plist" - Data: "<" - 1196-1199: "entity.name.tag.xml.plist" - 1196-1199: "entity.name.tag.localname.xml.plist" - Data: "key" - 1199-1200: "punctuation.definition.tag.xml.plist" - Data: ">" - 1204-1210: "meta.tag.key.xml.plist" - 1204-1206: "punctuation.definition.tag.xml.plist" - Data: "" - 1218-1271: "" - 1218-1226: "meta.tag.string.xml.plist" - 1218-1219: "punctuation.definition.tag.xml.plist" - Data: "<" - 1219-1225: "entity.name.tag.xml.plist" - 1219-1225: "entity.name.tag.localname.xml.plist" - Data: "string" - 1225-1226: "punctuation.definition.tag.xml.plist" - Data: ">" - 1262-1271: "meta.tag.string.xml.plist" - 1262-1264: "punctuation.definition.tag.xml.plist" - Data: "" - 1278-1285: "meta.tag.dict.xml.plist" - 1278-1280: "punctuation.definition.tag.xml.plist" - Data: "" - 1291-1298: "meta.tag.dict.xml.plist" - 1291-1293: "punctuation.definition.tag.xml.plist" - Data: "" - 1304-1318: "" - 1304-1309: "meta.tag.key.xml.plist" - 1304-1305: "punctuation.definition.tag.xml.plist" - Data: "<" - 1305-1308: "entity.name.tag.xml.plist" - 1305-1308: "entity.name.tag.localname.xml.plist" - Data: "key" - 1308-1309: "punctuation.definition.tag.xml.plist" - Data: ">" - 1312-1318: "meta.tag.key.xml.plist" - 1312-1314: "punctuation.definition.tag.xml.plist" - Data: "" - 1324-1361: "" - 1324-1332: "meta.tag.string.xml.plist" - 1324-1325: "punctuation.definition.tag.xml.plist" - Data: "<" - 1325-1331: "entity.name.tag.xml.plist" - 1325-1331: "entity.name.tag.localname.xml.plist" - Data: "string" - 1331-1332: "punctuation.definition.tag.xml.plist" - Data: ">" - 1352-1361: "meta.tag.string.xml.plist" - 1352-1354: "punctuation.definition.tag.xml.plist" - Data: "" - 1367-1386: "" - 1367-1372: "meta.tag.key.xml.plist" - 1367-1368: "punctuation.definition.tag.xml.plist" - Data: "<" - 1368-1371: "entity.name.tag.xml.plist" - 1368-1371: "entity.name.tag.localname.xml.plist" - Data: "key" - 1371-1372: "punctuation.definition.tag.xml.plist" - Data: ">" - 1380-1386: "meta.tag.key.xml.plist" - 1380-1382: "punctuation.definition.tag.xml.plist" - Data: "" - 1392-4508: "" - 1392-1399: "meta.tag.array.xml.plist" - 1392-1393: "punctuation.definition.tag.xml.plist" - Data: "<" - 1393-1398: "entity.name.tag.xml.plist" - 1393-1398: "entity.name.tag.localname.xml.plist" - Data: "array" - 1398-1399: "punctuation.definition.tag.xml.plist" - Data: ">" - 1406-2889: "" - 1406-1412: "meta.tag.dict.xml.plist" - 1406-1407: "punctuation.definition.tag.xml.plist" - Data: "<" - 1407-1411: "entity.name.tag.xml.plist" - 1407-1411: "entity.name.tag.localname.xml.plist" - Data: "dict" - 1411-1412: "punctuation.definition.tag.xml.plist" - Data: ">" - 1420-1436: "" - 1420-1425: "meta.tag.key.xml.plist" - 1420-1421: "punctuation.definition.tag.xml.plist" - Data: "<" - 1421-1424: "entity.name.tag.xml.plist" - 1421-1424: "entity.name.tag.localname.xml.plist" - Data: "key" - 1424-1425: "punctuation.definition.tag.xml.plist" - Data: ">" - 1430-1436: "meta.tag.key.xml.plist" - 1430-1432: "punctuation.definition.tag.xml.plist" - Data: "" - 1444-1533: "" - 1444-1452: "meta.tag.string.xml.plist" - 1444-1445: "punctuation.definition.tag.xml.plist" - Data: "<" - 1445-1451: "entity.name.tag.xml.plist" - 1445-1451: "entity.name.tag.localname.xml.plist" - Data: "string" - 1451-1452: "punctuation.definition.tag.xml.plist" - Data: ">" - 1524-1533: "meta.tag.string.xml.plist" - 1524-1526: "punctuation.definition.tag.xml.plist" - Data: "" - 1541-1565: "" - 1541-1546: "meta.tag.key.xml.plist" - 1541-1542: "punctuation.definition.tag.xml.plist" - Data: "<" - 1542-1545: "entity.name.tag.xml.plist" - 1542-1545: "entity.name.tag.localname.xml.plist" - Data: "key" - 1545-1546: "punctuation.definition.tag.xml.plist" - Data: ">" - 1559-1565: "meta.tag.key.xml.plist" - 1559-1561: "punctuation.definition.tag.xml.plist" - Data: "" - 1573-2748: "" - 1573-1579: "meta.tag.dict.xml.plist" - 1573-1574: "punctuation.definition.tag.xml.plist" - Data: "<" - 1574-1578: "entity.name.tag.xml.plist" - 1574-1578: "entity.name.tag.localname.xml.plist" - Data: "dict" - 1578-1579: "punctuation.definition.tag.xml.plist" - Data: ">" - 1588-1600: "" - 1588-1593: "meta.tag.key.xml.plist" - 1588-1589: "punctuation.definition.tag.xml.plist" - Data: "<" - 1589-1592: "entity.name.tag.xml.plist" - 1589-1592: "entity.name.tag.localname.xml.plist" - Data: "key" - 1592-1593: "punctuation.definition.tag.xml.plist" - Data: ">" - 1594-1600: "meta.tag.key.xml.plist" - 1594-1596: "punctuation.definition.tag.xml.plist" - Data: "" - 1609-1728: "" - 1609-1615: "meta.tag.dict.xml.plist" - 1609-1610: "punctuation.definition.tag.xml.plist" - Data: "<" - 1610-1614: "entity.name.tag.xml.plist" - 1610-1614: "entity.name.tag.localname.xml.plist" - Data: "dict" - 1614-1615: "punctuation.definition.tag.xml.plist" - Data: ">" - 1625-1640: "" - 1625-1630: "meta.tag.key.xml.plist" - 1625-1626: "punctuation.definition.tag.xml.plist" - Data: "<" - 1626-1629: "entity.name.tag.xml.plist" - 1626-1629: "entity.name.tag.localname.xml.plist" - Data: "key" - 1629-1630: "punctuation.definition.tag.xml.plist" - Data: ">" - 1634-1640: "meta.tag.key.xml.plist" - 1634-1636: "punctuation.definition.tag.xml.plist" - Data: "" - 1650-1712: "" - 1650-1658: "meta.tag.string.xml.plist" - 1650-1651: "punctuation.definition.tag.xml.plist" - Data: "<" - 1651-1657: "entity.name.tag.xml.plist" - 1651-1657: "entity.name.tag.localname.xml.plist" - Data: "string" - 1657-1658: "punctuation.definition.tag.xml.plist" - Data: ">" - 1703-1712: "meta.tag.string.xml.plist" - 1703-1705: "punctuation.definition.tag.xml.plist" - Data: "" - 1721-1728: "meta.tag.dict.xml.plist" - 1721-1723: "punctuation.definition.tag.xml.plist" - Data: "" - 1737-1749: "" - 1737-1742: "meta.tag.key.xml.plist" - 1737-1738: "punctuation.definition.tag.xml.plist" - Data: "<" - 1738-1741: "entity.name.tag.xml.plist" - 1738-1741: "entity.name.tag.localname.xml.plist" - Data: "key" - 1741-1742: "punctuation.definition.tag.xml.plist" - Data: ">" - 1743-1749: "meta.tag.key.xml.plist" - 1743-1745: "punctuation.definition.tag.xml.plist" - Data: "" - 1758-1873: "" - 1758-1764: "meta.tag.dict.xml.plist" - 1758-1759: "punctuation.definition.tag.xml.plist" - Data: "<" - 1759-1763: "entity.name.tag.xml.plist" - 1759-1763: "entity.name.tag.localname.xml.plist" - Data: "dict" - 1763-1764: "punctuation.definition.tag.xml.plist" - Data: ">" - 1774-1789: "" - 1774-1779: "meta.tag.key.xml.plist" - 1774-1775: "punctuation.definition.tag.xml.plist" - Data: "<" - 1775-1778: "entity.name.tag.xml.plist" - 1775-1778: "entity.name.tag.localname.xml.plist" - Data: "key" - 1778-1779: "punctuation.definition.tag.xml.plist" - Data: ">" - 1783-1789: "meta.tag.key.xml.plist" - 1783-1785: "punctuation.definition.tag.xml.plist" - Data: "" - 1799-1857: "" - 1799-1807: "meta.tag.string.xml.plist" - 1799-1800: "punctuation.definition.tag.xml.plist" - Data: "<" - 1800-1806: "entity.name.tag.xml.plist" - 1800-1806: "entity.name.tag.localname.xml.plist" - Data: "string" - 1806-1807: "punctuation.definition.tag.xml.plist" - Data: ">" - 1848-1857: "meta.tag.string.xml.plist" - 1848-1850: "punctuation.definition.tag.xml.plist" - Data: "" - 1866-1873: "meta.tag.dict.xml.plist" - 1866-1868: "punctuation.definition.tag.xml.plist" - Data: "" - 1882-1894: "" - 1882-1887: "meta.tag.key.xml.plist" - 1882-1883: "punctuation.definition.tag.xml.plist" - Data: "<" - 1883-1886: "entity.name.tag.xml.plist" - 1883-1886: "entity.name.tag.localname.xml.plist" - Data: "key" - 1886-1887: "punctuation.definition.tag.xml.plist" - Data: ">" - 1888-1894: "meta.tag.key.xml.plist" - 1888-1890: "punctuation.definition.tag.xml.plist" - Data: "" - 1903-2007: "" - 1903-1909: "meta.tag.dict.xml.plist" - 1903-1904: "punctuation.definition.tag.xml.plist" - Data: "<" - 1904-1908: "entity.name.tag.xml.plist" - 1904-1908: "entity.name.tag.localname.xml.plist" - Data: "dict" - 1908-1909: "punctuation.definition.tag.xml.plist" - Data: ">" - 1919-1934: "" - 1919-1924: "meta.tag.key.xml.plist" - 1919-1920: "punctuation.definition.tag.xml.plist" - Data: "<" - 1920-1923: "entity.name.tag.xml.plist" - 1920-1923: "entity.name.tag.localname.xml.plist" - Data: "key" - 1923-1924: "punctuation.definition.tag.xml.plist" - Data: ">" - 1928-1934: "meta.tag.key.xml.plist" - 1928-1930: "punctuation.definition.tag.xml.plist" - Data: "" - 1944-1991: "" - 1944-1952: "meta.tag.string.xml.plist" - 1944-1945: "punctuation.definition.tag.xml.plist" - Data: "<" - 1945-1951: "entity.name.tag.xml.plist" - 1945-1951: "entity.name.tag.localname.xml.plist" - Data: "string" - 1951-1952: "punctuation.definition.tag.xml.plist" - Data: ">" - 1982-1991: "meta.tag.string.xml.plist" - 1982-1984: "punctuation.definition.tag.xml.plist" - Data: "" - 2000-2007: "meta.tag.dict.xml.plist" - 2000-2002: "punctuation.definition.tag.xml.plist" - Data: "" - 2016-2028: "" - 2016-2021: "meta.tag.key.xml.plist" - 2016-2017: "punctuation.definition.tag.xml.plist" - Data: "<" - 2017-2020: "entity.name.tag.xml.plist" - 2017-2020: "entity.name.tag.localname.xml.plist" - Data: "key" - 2020-2021: "punctuation.definition.tag.xml.plist" - Data: ">" - 2022-2028: "meta.tag.key.xml.plist" - 2022-2024: "punctuation.definition.tag.xml.plist" - Data: "" - 2037-2156: "" - 2037-2043: "meta.tag.dict.xml.plist" - 2037-2038: "punctuation.definition.tag.xml.plist" - Data: "<" - 2038-2042: "entity.name.tag.xml.plist" - 2038-2042: "entity.name.tag.localname.xml.plist" - Data: "dict" - 2042-2043: "punctuation.definition.tag.xml.plist" - Data: ">" - 2053-2068: "" - 2053-2058: "meta.tag.key.xml.plist" - 2053-2054: "punctuation.definition.tag.xml.plist" - Data: "<" - 2054-2057: "entity.name.tag.xml.plist" - 2054-2057: "entity.name.tag.localname.xml.plist" - Data: "key" - 2057-2058: "punctuation.definition.tag.xml.plist" - Data: ">" - 2062-2068: "meta.tag.key.xml.plist" - 2062-2064: "punctuation.definition.tag.xml.plist" - Data: "" - 2078-2140: "" - 2078-2086: "meta.tag.string.xml.plist" - 2078-2079: "punctuation.definition.tag.xml.plist" - Data: "<" - 2079-2085: "entity.name.tag.xml.plist" - 2079-2085: "entity.name.tag.localname.xml.plist" - Data: "string" - 2085-2086: "punctuation.definition.tag.xml.plist" - Data: ">" - 2131-2140: "meta.tag.string.xml.plist" - 2131-2133: "punctuation.definition.tag.xml.plist" - Data: "" - 2149-2156: "meta.tag.dict.xml.plist" - 2149-2151: "punctuation.definition.tag.xml.plist" - Data: "" - 2165-2177: "" - 2165-2170: "meta.tag.key.xml.plist" - 2165-2166: "punctuation.definition.tag.xml.plist" - Data: "<" - 2166-2169: "entity.name.tag.xml.plist" - 2166-2169: "entity.name.tag.localname.xml.plist" - Data: "key" - 2169-2170: "punctuation.definition.tag.xml.plist" - Data: ">" - 2171-2177: "meta.tag.key.xml.plist" - 2171-2173: "punctuation.definition.tag.xml.plist" - Data: "" - 2186-2303: "" - 2186-2192: "meta.tag.dict.xml.plist" - 2186-2187: "punctuation.definition.tag.xml.plist" - Data: "<" - 2187-2191: "entity.name.tag.xml.plist" - 2187-2191: "entity.name.tag.localname.xml.plist" - Data: "dict" - 2191-2192: "punctuation.definition.tag.xml.plist" - Data: ">" - 2202-2217: "" - 2202-2207: "meta.tag.key.xml.plist" - 2202-2203: "punctuation.definition.tag.xml.plist" - Data: "<" - 2203-2206: "entity.name.tag.xml.plist" - 2203-2206: "entity.name.tag.localname.xml.plist" - Data: "key" - 2206-2207: "punctuation.definition.tag.xml.plist" - Data: ">" - 2211-2217: "meta.tag.key.xml.plist" - 2211-2213: "punctuation.definition.tag.xml.plist" - Data: "" - 2227-2287: "" - 2227-2235: "meta.tag.string.xml.plist" - 2227-2228: "punctuation.definition.tag.xml.plist" - Data: "<" - 2228-2234: "entity.name.tag.xml.plist" - 2228-2234: "entity.name.tag.localname.xml.plist" - Data: "string" - 2234-2235: "punctuation.definition.tag.xml.plist" - Data: ">" - 2278-2287: "meta.tag.string.xml.plist" - 2278-2280: "punctuation.definition.tag.xml.plist" - Data: "" - 2296-2303: "meta.tag.dict.xml.plist" - 2296-2298: "punctuation.definition.tag.xml.plist" - Data: "" - 2312-2324: "" - 2312-2317: "meta.tag.key.xml.plist" - 2312-2313: "punctuation.definition.tag.xml.plist" - Data: "<" - 2313-2316: "entity.name.tag.xml.plist" - 2313-2316: "entity.name.tag.localname.xml.plist" - Data: "key" - 2316-2317: "punctuation.definition.tag.xml.plist" - Data: ">" - 2318-2324: "meta.tag.key.xml.plist" - 2318-2320: "punctuation.definition.tag.xml.plist" - Data: "" - 2333-2437: "" - 2333-2339: "meta.tag.dict.xml.plist" - 2333-2334: "punctuation.definition.tag.xml.plist" - Data: "<" - 2334-2338: "entity.name.tag.xml.plist" - 2334-2338: "entity.name.tag.localname.xml.plist" - Data: "dict" - 2338-2339: "punctuation.definition.tag.xml.plist" - Data: ">" - 2349-2364: "" - 2349-2354: "meta.tag.key.xml.plist" - 2349-2350: "punctuation.definition.tag.xml.plist" - Data: "<" - 2350-2353: "entity.name.tag.xml.plist" - 2350-2353: "entity.name.tag.localname.xml.plist" - Data: "key" - 2353-2354: "punctuation.definition.tag.xml.plist" - Data: ">" - 2358-2364: "meta.tag.key.xml.plist" - 2358-2360: "punctuation.definition.tag.xml.plist" - Data: "" - 2374-2421: "" - 2374-2382: "meta.tag.string.xml.plist" - 2374-2375: "punctuation.definition.tag.xml.plist" - Data: "<" - 2375-2381: "entity.name.tag.xml.plist" - 2375-2381: "entity.name.tag.localname.xml.plist" - Data: "string" - 2381-2382: "punctuation.definition.tag.xml.plist" - Data: ">" - 2412-2421: "meta.tag.string.xml.plist" - 2412-2414: "punctuation.definition.tag.xml.plist" - Data: "" - 2430-2437: "meta.tag.dict.xml.plist" - 2430-2432: "punctuation.definition.tag.xml.plist" - Data: "" - 2446-2458: "" - 2446-2451: "meta.tag.key.xml.plist" - 2446-2447: "punctuation.definition.tag.xml.plist" - Data: "<" - 2447-2450: "entity.name.tag.xml.plist" - 2447-2450: "entity.name.tag.localname.xml.plist" - Data: "key" - 2450-2451: "punctuation.definition.tag.xml.plist" - Data: ">" - 2452-2458: "meta.tag.key.xml.plist" - 2452-2454: "punctuation.definition.tag.xml.plist" - Data: "" - 2467-2586: "" - 2467-2473: "meta.tag.dict.xml.plist" - 2467-2468: "punctuation.definition.tag.xml.plist" - Data: "<" - 2468-2472: "entity.name.tag.xml.plist" - 2468-2472: "entity.name.tag.localname.xml.plist" - Data: "dict" - 2472-2473: "punctuation.definition.tag.xml.plist" - Data: ">" - 2483-2498: "" - 2483-2488: "meta.tag.key.xml.plist" - 2483-2484: "punctuation.definition.tag.xml.plist" - Data: "<" - 2484-2487: "entity.name.tag.xml.plist" - 2484-2487: "entity.name.tag.localname.xml.plist" - Data: "key" - 2487-2488: "punctuation.definition.tag.xml.plist" - Data: ">" - 2492-2498: "meta.tag.key.xml.plist" - 2492-2494: "punctuation.definition.tag.xml.plist" - Data: "" - 2508-2570: "" - 2508-2516: "meta.tag.string.xml.plist" - 2508-2509: "punctuation.definition.tag.xml.plist" - Data: "<" - 2509-2515: "entity.name.tag.xml.plist" - 2509-2515: "entity.name.tag.localname.xml.plist" - Data: "string" - 2515-2516: "punctuation.definition.tag.xml.plist" - Data: ">" - 2561-2570: "meta.tag.string.xml.plist" - 2561-2563: "punctuation.definition.tag.xml.plist" - Data: "" - 2579-2586: "meta.tag.dict.xml.plist" - 2579-2581: "punctuation.definition.tag.xml.plist" - Data: "" - 2595-2607: "" - 2595-2600: "meta.tag.key.xml.plist" - 2595-2596: "punctuation.definition.tag.xml.plist" - Data: "<" - 2596-2599: "entity.name.tag.xml.plist" - 2596-2599: "entity.name.tag.localname.xml.plist" - Data: "key" - 2599-2600: "punctuation.definition.tag.xml.plist" - Data: ">" - 2601-2607: "meta.tag.key.xml.plist" - 2601-2603: "punctuation.definition.tag.xml.plist" - Data: "" - 2616-2733: "" - 2616-2622: "meta.tag.dict.xml.plist" - 2616-2617: "punctuation.definition.tag.xml.plist" - Data: "<" - 2617-2621: "entity.name.tag.xml.plist" - 2617-2621: "entity.name.tag.localname.xml.plist" - Data: "dict" - 2621-2622: "punctuation.definition.tag.xml.plist" - Data: ">" - 2632-2647: "" - 2632-2637: "meta.tag.key.xml.plist" - 2632-2633: "punctuation.definition.tag.xml.plist" - Data: "<" - 2633-2636: "entity.name.tag.xml.plist" - 2633-2636: "entity.name.tag.localname.xml.plist" - Data: "key" - 2636-2637: "punctuation.definition.tag.xml.plist" - Data: ">" - 2641-2647: "meta.tag.key.xml.plist" - 2641-2643: "punctuation.definition.tag.xml.plist" - Data: "" - 2657-2717: "" - 2657-2665: "meta.tag.string.xml.plist" - 2657-2658: "punctuation.definition.tag.xml.plist" - Data: "<" - 2658-2664: "entity.name.tag.xml.plist" - 2658-2664: "entity.name.tag.localname.xml.plist" - Data: "string" - 2664-2665: "punctuation.definition.tag.xml.plist" - Data: ">" - 2708-2717: "meta.tag.string.xml.plist" - 2708-2710: "punctuation.definition.tag.xml.plist" - Data: "" - 2726-2733: "meta.tag.dict.xml.plist" - 2726-2728: "punctuation.definition.tag.xml.plist" - Data: "" - 2741-2748: "meta.tag.dict.xml.plist" - 2741-2743: "punctuation.definition.tag.xml.plist" - Data: "" - 2756-2770: "" - 2756-2761: "meta.tag.key.xml.plist" - 2756-2757: "punctuation.definition.tag.xml.plist" - Data: "<" - 2757-2760: "entity.name.tag.xml.plist" - 2757-2760: "entity.name.tag.localname.xml.plist" - Data: "key" - 2760-2761: "punctuation.definition.tag.xml.plist" - Data: ">" - 2764-2770: "meta.tag.key.xml.plist" - 2764-2766: "punctuation.definition.tag.xml.plist" - Data: "" - 2778-2803: "" - 2778-2786: "meta.tag.string.xml.plist" - 2778-2779: "punctuation.definition.tag.xml.plist" - Data: "<" - 2779-2785: "entity.name.tag.xml.plist" - 2779-2785: "entity.name.tag.localname.xml.plist" - Data: "string" - 2785-2786: "punctuation.definition.tag.xml.plist" - Data: ">" - 2794-2803: "meta.tag.string.xml.plist" - 2794-2796: "punctuation.definition.tag.xml.plist" - Data: "" - 2811-2826: "" - 2811-2816: "meta.tag.key.xml.plist" - 2811-2812: "punctuation.definition.tag.xml.plist" - Data: "<" - 2812-2815: "entity.name.tag.xml.plist" - 2812-2815: "entity.name.tag.localname.xml.plist" - Data: "key" - 2815-2816: "punctuation.definition.tag.xml.plist" - Data: ">" - 2820-2826: "meta.tag.key.xml.plist" - 2820-2822: "punctuation.definition.tag.xml.plist" - Data: "" - 2834-2875: "" - 2834-2842: "meta.tag.string.xml.plist" - 2834-2835: "punctuation.definition.tag.xml.plist" - Data: "<" - 2835-2841: "entity.name.tag.xml.plist" - 2835-2841: "entity.name.tag.localname.xml.plist" - Data: "string" - 2841-2842: "punctuation.definition.tag.xml.plist" - Data: ">" - 2866-2875: "meta.tag.string.xml.plist" - 2866-2868: "punctuation.definition.tag.xml.plist" - Data: "" - 2882-2889: "meta.tag.dict.xml.plist" - 2882-2884: "punctuation.definition.tag.xml.plist" - Data: "" - 2896-3524: "" - 2896-2902: "meta.tag.dict.xml.plist" - 2896-2897: "punctuation.definition.tag.xml.plist" - Data: "<" - 2897-2901: "entity.name.tag.xml.plist" - 2897-2901: "entity.name.tag.localname.xml.plist" - Data: "dict" - 2901-2902: "punctuation.definition.tag.xml.plist" - Data: ">" - 2910-2929: "" - 2910-2915: "meta.tag.key.xml.plist" - 2910-2911: "punctuation.definition.tag.xml.plist" - Data: "<" - 2911-2914: "entity.name.tag.xml.plist" - 2911-2914: "entity.name.tag.localname.xml.plist" - Data: "key" - 2914-2915: "punctuation.definition.tag.xml.plist" - Data: ">" - 2923-2929: "meta.tag.key.xml.plist" - 2923-2925: "punctuation.definition.tag.xml.plist" - Data: "" - 2937-3367: "" - 2937-2943: "meta.tag.dict.xml.plist" - 2937-2938: "punctuation.definition.tag.xml.plist" - Data: "<" - 2938-2942: "entity.name.tag.xml.plist" - 2938-2942: "entity.name.tag.localname.xml.plist" - Data: "dict" - 2942-2943: "punctuation.definition.tag.xml.plist" - Data: ">" - 2952-2964: "" - 2952-2957: "meta.tag.key.xml.plist" - 2952-2953: "punctuation.definition.tag.xml.plist" - Data: "<" - 2953-2956: "entity.name.tag.xml.plist" - 2953-2956: "entity.name.tag.localname.xml.plist" - Data: "key" - 2956-2957: "punctuation.definition.tag.xml.plist" - Data: ">" - 2958-2964: "meta.tag.key.xml.plist" - 2958-2960: "punctuation.definition.tag.xml.plist" - Data: "" - 2973-3071: "" - 2973-2979: "meta.tag.dict.xml.plist" - 2973-2974: "punctuation.definition.tag.xml.plist" - Data: "<" - 2974-2978: "entity.name.tag.xml.plist" - 2974-2978: "entity.name.tag.localname.xml.plist" - Data: "dict" - 2978-2979: "punctuation.definition.tag.xml.plist" - Data: ">" - 2989-3004: "" - 2989-2994: "meta.tag.key.xml.plist" - 2989-2990: "punctuation.definition.tag.xml.plist" - Data: "<" - 2990-2993: "entity.name.tag.xml.plist" - 2990-2993: "entity.name.tag.localname.xml.plist" - Data: "key" - 2993-2994: "punctuation.definition.tag.xml.plist" - Data: ">" - 2998-3004: "meta.tag.key.xml.plist" - 2998-3000: "punctuation.definition.tag.xml.plist" - Data: "" - 3014-3055: "" - 3014-3022: "meta.tag.string.xml.plist" - 3014-3015: "punctuation.definition.tag.xml.plist" - Data: "<" - 3015-3021: "entity.name.tag.xml.plist" - 3015-3021: "entity.name.tag.localname.xml.plist" - Data: "string" - 3021-3022: "punctuation.definition.tag.xml.plist" - Data: ">" - 3046-3055: "meta.tag.string.xml.plist" - 3046-3048: "punctuation.definition.tag.xml.plist" - Data: "" - 3064-3071: "meta.tag.dict.xml.plist" - 3064-3066: "punctuation.definition.tag.xml.plist" - Data: "" - 3080-3092: "" - 3080-3085: "meta.tag.key.xml.plist" - 3080-3081: "punctuation.definition.tag.xml.plist" - Data: "<" - 3081-3084: "entity.name.tag.xml.plist" - 3081-3084: "entity.name.tag.localname.xml.plist" - Data: "key" - 3084-3085: "punctuation.definition.tag.xml.plist" - Data: ">" - 3086-3092: "meta.tag.key.xml.plist" - 3086-3088: "punctuation.definition.tag.xml.plist" - Data: "" - 3101-3211: "" - 3101-3107: "meta.tag.dict.xml.plist" - 3101-3102: "punctuation.definition.tag.xml.plist" - Data: "<" - 3102-3106: "entity.name.tag.xml.plist" - 3102-3106: "entity.name.tag.localname.xml.plist" - Data: "dict" - 3106-3107: "punctuation.definition.tag.xml.plist" - Data: ">" - 3117-3132: "" - 3117-3122: "meta.tag.key.xml.plist" - 3117-3118: "punctuation.definition.tag.xml.plist" - Data: "<" - 3118-3121: "entity.name.tag.xml.plist" - 3118-3121: "entity.name.tag.localname.xml.plist" - Data: "key" - 3121-3122: "punctuation.definition.tag.xml.plist" - Data: ">" - 3126-3132: "meta.tag.key.xml.plist" - 3126-3128: "punctuation.definition.tag.xml.plist" - Data: "" - 3142-3195: "" - 3142-3150: "meta.tag.string.xml.plist" - 3142-3143: "punctuation.definition.tag.xml.plist" - Data: "<" - 3143-3149: "entity.name.tag.xml.plist" - 3143-3149: "entity.name.tag.localname.xml.plist" - Data: "string" - 3149-3150: "punctuation.definition.tag.xml.plist" - Data: ">" - 3186-3195: "meta.tag.string.xml.plist" - 3186-3188: "punctuation.definition.tag.xml.plist" - Data: "" - 3204-3211: "meta.tag.dict.xml.plist" - 3204-3206: "punctuation.definition.tag.xml.plist" - Data: "" - 3220-3232: "" - 3220-3225: "meta.tag.key.xml.plist" - 3220-3221: "punctuation.definition.tag.xml.plist" - Data: "<" - 3221-3224: "entity.name.tag.xml.plist" - 3221-3224: "entity.name.tag.localname.xml.plist" - Data: "key" - 3224-3225: "punctuation.definition.tag.xml.plist" - Data: ">" - 3226-3232: "meta.tag.key.xml.plist" - 3226-3228: "punctuation.definition.tag.xml.plist" - Data: "" - 3241-3352: "" - 3241-3247: "meta.tag.dict.xml.plist" - 3241-3242: "punctuation.definition.tag.xml.plist" - Data: "<" - 3242-3246: "entity.name.tag.xml.plist" - 3242-3246: "entity.name.tag.localname.xml.plist" - Data: "dict" - 3246-3247: "punctuation.definition.tag.xml.plist" - Data: ">" - 3257-3272: "" - 3257-3262: "meta.tag.key.xml.plist" - 3257-3258: "punctuation.definition.tag.xml.plist" - Data: "<" - 3258-3261: "entity.name.tag.xml.plist" - 3258-3261: "entity.name.tag.localname.xml.plist" - Data: "key" - 3261-3262: "punctuation.definition.tag.xml.plist" - Data: ">" - 3266-3272: "meta.tag.key.xml.plist" - 3266-3268: "punctuation.definition.tag.xml.plist" - Data: "" - 3282-3336: "" - 3282-3290: "meta.tag.string.xml.plist" - 3282-3283: "punctuation.definition.tag.xml.plist" - Data: "<" - 3283-3289: "entity.name.tag.xml.plist" - 3283-3289: "entity.name.tag.localname.xml.plist" - Data: "string" - 3289-3290: "punctuation.definition.tag.xml.plist" - Data: ">" - 3327-3336: "meta.tag.string.xml.plist" - 3327-3329: "punctuation.definition.tag.xml.plist" - Data: "" - 3345-3352: "meta.tag.dict.xml.plist" - 3345-3347: "punctuation.definition.tag.xml.plist" - Data: "" - 3360-3367: "meta.tag.dict.xml.plist" - 3360-3362: "punctuation.definition.tag.xml.plist" - Data: "" - 3375-3393: "" - 3375-3380: "meta.tag.key.xml.plist" - 3375-3376: "punctuation.definition.tag.xml.plist" - Data: "<" - 3376-3379: "entity.name.tag.xml.plist" - 3376-3379: "entity.name.tag.localname.xml.plist" - Data: "key" - 3379-3380: "punctuation.definition.tag.xml.plist" - Data: ">" - 3387-3393: "meta.tag.key.xml.plist" - 3387-3389: "punctuation.definition.tag.xml.plist" - Data: "" - 3401-3437: "" - 3401-3409: "meta.tag.string.xml.plist" - 3401-3402: "punctuation.definition.tag.xml.plist" - Data: "<" - 3402-3408: "entity.name.tag.xml.plist" - 3402-3408: "entity.name.tag.localname.xml.plist" - Data: "string" - 3408-3409: "punctuation.definition.tag.xml.plist" - Data: ">" - 3428-3437: "meta.tag.string.xml.plist" - 3428-3430: "punctuation.definition.tag.xml.plist" - Data: "" - 3445-3461: "" - 3445-3450: "meta.tag.key.xml.plist" - 3445-3446: "punctuation.definition.tag.xml.plist" - Data: "<" - 3446-3449: "entity.name.tag.xml.plist" - 3446-3449: "entity.name.tag.localname.xml.plist" - Data: "key" - 3449-3450: "punctuation.definition.tag.xml.plist" - Data: ">" - 3455-3461: "meta.tag.key.xml.plist" - 3455-3457: "punctuation.definition.tag.xml.plist" - Data: "" - 3469-3510: "" - 3469-3477: "meta.tag.string.xml.plist" - 3469-3470: "punctuation.definition.tag.xml.plist" - Data: "<" - 3470-3476: "entity.name.tag.xml.plist" - 3470-3476: "entity.name.tag.localname.xml.plist" - Data: "string" - 3476-3477: "punctuation.definition.tag.xml.plist" - Data: ">" - 3501-3510: "meta.tag.string.xml.plist" - 3501-3503: "punctuation.definition.tag.xml.plist" - Data: "" - 3517-3524: "meta.tag.dict.xml.plist" - 3517-3519: "punctuation.definition.tag.xml.plist" - Data: "" - 3531-4494: "" - 3531-3537: "meta.tag.dict.xml.plist" - 3531-3532: "punctuation.definition.tag.xml.plist" - Data: "<" - 3532-3536: "entity.name.tag.xml.plist" - 3532-3536: "entity.name.tag.localname.xml.plist" - Data: "dict" - 3536-3537: "punctuation.definition.tag.xml.plist" - Data: ">" - 3545-3561: "" - 3545-3550: "meta.tag.key.xml.plist" - 3545-3546: "punctuation.definition.tag.xml.plist" - Data: "<" - 3546-3549: "entity.name.tag.xml.plist" - 3546-3549: "entity.name.tag.localname.xml.plist" - Data: "key" - 3549-3550: "punctuation.definition.tag.xml.plist" - Data: ">" - 3555-3561: "meta.tag.key.xml.plist" - 3555-3557: "punctuation.definition.tag.xml.plist" - Data: "" - 3569-3608: "" - 3569-3577: "meta.tag.string.xml.plist" - 3569-3570: "punctuation.definition.tag.xml.plist" - Data: "<" - 3570-3576: "entity.name.tag.xml.plist" - 3570-3576: "entity.name.tag.localname.xml.plist" - Data: "string" - 3576-3577: "punctuation.definition.tag.xml.plist" - Data: ">" - 3599-3608: "meta.tag.string.xml.plist" - 3599-3601: "punctuation.definition.tag.xml.plist" - Data: "" - 3616-3640: "" - 3616-3621: "meta.tag.key.xml.plist" - 3616-3617: "punctuation.definition.tag.xml.plist" - Data: "<" - 3617-3620: "entity.name.tag.xml.plist" - 3617-3620: "entity.name.tag.localname.xml.plist" - Data: "key" - 3620-3621: "punctuation.definition.tag.xml.plist" - Data: ">" - 3634-3640: "meta.tag.key.xml.plist" - 3634-3636: "punctuation.definition.tag.xml.plist" - Data: "" - 3648-3937: "" - 3648-3654: "meta.tag.dict.xml.plist" - 3648-3649: "punctuation.definition.tag.xml.plist" - Data: "<" - 3649-3653: "entity.name.tag.xml.plist" - 3649-3653: "entity.name.tag.localname.xml.plist" - Data: "dict" - 3653-3654: "punctuation.definition.tag.xml.plist" - Data: ">" - 3663-3675: "" - 3663-3668: "meta.tag.key.xml.plist" - 3663-3664: "punctuation.definition.tag.xml.plist" - Data: "<" - 3664-3667: "entity.name.tag.xml.plist" - 3664-3667: "entity.name.tag.localname.xml.plist" - Data: "key" - 3667-3668: "punctuation.definition.tag.xml.plist" - Data: ">" - 3669-3675: "meta.tag.key.xml.plist" - 3669-3671: "punctuation.definition.tag.xml.plist" - Data: "" - 3684-3782: "" - 3684-3690: "meta.tag.dict.xml.plist" - 3684-3685: "punctuation.definition.tag.xml.plist" - Data: "<" - 3685-3689: "entity.name.tag.xml.plist" - 3685-3689: "entity.name.tag.localname.xml.plist" - Data: "dict" - 3689-3690: "punctuation.definition.tag.xml.plist" - Data: ">" - 3700-3715: "" - 3700-3705: "meta.tag.key.xml.plist" - 3700-3701: "punctuation.definition.tag.xml.plist" - Data: "<" - 3701-3704: "entity.name.tag.xml.plist" - 3701-3704: "entity.name.tag.localname.xml.plist" - Data: "key" - 3704-3705: "punctuation.definition.tag.xml.plist" - Data: ">" - 3709-3715: "meta.tag.key.xml.plist" - 3709-3711: "punctuation.definition.tag.xml.plist" - Data: "" - 3725-3766: "" - 3725-3733: "meta.tag.string.xml.plist" - 3725-3726: "punctuation.definition.tag.xml.plist" - Data: "<" - 3726-3732: "entity.name.tag.xml.plist" - 3726-3732: "entity.name.tag.localname.xml.plist" - Data: "string" - 3732-3733: "punctuation.definition.tag.xml.plist" - Data: ">" - 3757-3766: "meta.tag.string.xml.plist" - 3757-3759: "punctuation.definition.tag.xml.plist" - Data: "" - 3775-3782: "meta.tag.dict.xml.plist" - 3775-3777: "punctuation.definition.tag.xml.plist" - Data: "" - 3791-3803: "" - 3791-3796: "meta.tag.key.xml.plist" - 3791-3792: "punctuation.definition.tag.xml.plist" - Data: "<" - 3792-3795: "entity.name.tag.xml.plist" - 3792-3795: "entity.name.tag.localname.xml.plist" - Data: "key" - 3795-3796: "punctuation.definition.tag.xml.plist" - Data: ">" - 3797-3803: "meta.tag.key.xml.plist" - 3797-3799: "punctuation.definition.tag.xml.plist" - Data: "" - 3812-3922: "" - 3812-3818: "meta.tag.dict.xml.plist" - 3812-3813: "punctuation.definition.tag.xml.plist" - Data: "<" - 3813-3817: "entity.name.tag.xml.plist" - 3813-3817: "entity.name.tag.localname.xml.plist" - Data: "dict" - 3817-3818: "punctuation.definition.tag.xml.plist" - Data: ">" - 3828-3843: "" - 3828-3833: "meta.tag.key.xml.plist" - 3828-3829: "punctuation.definition.tag.xml.plist" - Data: "<" - 3829-3832: "entity.name.tag.xml.plist" - 3829-3832: "entity.name.tag.localname.xml.plist" - Data: "key" - 3832-3833: "punctuation.definition.tag.xml.plist" - Data: ">" - 3837-3843: "meta.tag.key.xml.plist" - 3837-3839: "punctuation.definition.tag.xml.plist" - Data: "" - 3853-3906: "" - 3853-3861: "meta.tag.string.xml.plist" - 3853-3854: "punctuation.definition.tag.xml.plist" - Data: "<" - 3854-3860: "entity.name.tag.xml.plist" - 3854-3860: "entity.name.tag.localname.xml.plist" - Data: "string" - 3860-3861: "punctuation.definition.tag.xml.plist" - Data: ">" - 3897-3906: "meta.tag.string.xml.plist" - 3897-3899: "punctuation.definition.tag.xml.plist" - Data: "" - 3915-3922: "meta.tag.dict.xml.plist" - 3915-3917: "punctuation.definition.tag.xml.plist" - Data: "" - 3930-3937: "meta.tag.dict.xml.plist" - 3930-3932: "punctuation.definition.tag.xml.plist" - Data: "" - 3945-3959: "" - 3945-3950: "meta.tag.key.xml.plist" - 3945-3946: "punctuation.definition.tag.xml.plist" - Data: "<" - 3946-3949: "entity.name.tag.xml.plist" - 3946-3949: "entity.name.tag.localname.xml.plist" - Data: "key" - 3949-3950: "punctuation.definition.tag.xml.plist" - Data: ">" - 3953-3959: "meta.tag.key.xml.plist" - 3953-3955: "punctuation.definition.tag.xml.plist" - Data: "" - 3967-4000: "" - 3967-3975: "meta.tag.string.xml.plist" - 3967-3968: "punctuation.definition.tag.xml.plist" - Data: "<" - 3968-3974: "entity.name.tag.xml.plist" - 3968-3974: "entity.name.tag.localname.xml.plist" - Data: "string" - 3974-3975: "punctuation.definition.tag.xml.plist" - Data: ">" - 3991-4000: "meta.tag.string.xml.plist" - 3991-3993: "punctuation.definition.tag.xml.plist" - Data: "" - 4008-4030: "" - 4008-4013: "meta.tag.key.xml.plist" - 4008-4009: "punctuation.definition.tag.xml.plist" - Data: "<" - 4009-4012: "entity.name.tag.xml.plist" - 4009-4012: "entity.name.tag.localname.xml.plist" - Data: "key" - 4012-4013: "punctuation.definition.tag.xml.plist" - Data: ">" - 4024-4030: "meta.tag.key.xml.plist" - 4024-4026: "punctuation.definition.tag.xml.plist" - Data: "" - 4038-4327: "" - 4038-4044: "meta.tag.dict.xml.plist" - 4038-4039: "punctuation.definition.tag.xml.plist" - Data: "<" - 4039-4043: "entity.name.tag.xml.plist" - 4039-4043: "entity.name.tag.localname.xml.plist" - Data: "dict" - 4043-4044: "punctuation.definition.tag.xml.plist" - Data: ">" - 4053-4065: "" - 4053-4058: "meta.tag.key.xml.plist" - 4053-4054: "punctuation.definition.tag.xml.plist" - Data: "<" - 4054-4057: "entity.name.tag.xml.plist" - 4054-4057: "entity.name.tag.localname.xml.plist" - Data: "key" - 4057-4058: "punctuation.definition.tag.xml.plist" - Data: ">" - 4059-4065: "meta.tag.key.xml.plist" - 4059-4061: "punctuation.definition.tag.xml.plist" - Data: "" - 4074-4172: "" - 4074-4080: "meta.tag.dict.xml.plist" - 4074-4075: "punctuation.definition.tag.xml.plist" - Data: "<" - 4075-4079: "entity.name.tag.xml.plist" - 4075-4079: "entity.name.tag.localname.xml.plist" - Data: "dict" - 4079-4080: "punctuation.definition.tag.xml.plist" - Data: ">" - 4090-4105: "" - 4090-4095: "meta.tag.key.xml.plist" - 4090-4091: "punctuation.definition.tag.xml.plist" - Data: "<" - 4091-4094: "entity.name.tag.xml.plist" - 4091-4094: "entity.name.tag.localname.xml.plist" - Data: "key" - 4094-4095: "punctuation.definition.tag.xml.plist" - Data: ">" - 4099-4105: "meta.tag.key.xml.plist" - 4099-4101: "punctuation.definition.tag.xml.plist" - Data: "" - 4115-4156: "" - 4115-4123: "meta.tag.string.xml.plist" - 4115-4116: "punctuation.definition.tag.xml.plist" - Data: "<" - 4116-4122: "entity.name.tag.xml.plist" - 4116-4122: "entity.name.tag.localname.xml.plist" - Data: "string" - 4122-4123: "punctuation.definition.tag.xml.plist" - Data: ">" - 4147-4156: "meta.tag.string.xml.plist" - 4147-4149: "punctuation.definition.tag.xml.plist" - Data: "" - 4165-4172: "meta.tag.dict.xml.plist" - 4165-4167: "punctuation.definition.tag.xml.plist" - Data: "" - 4181-4193: "" - 4181-4186: "meta.tag.key.xml.plist" - 4181-4182: "punctuation.definition.tag.xml.plist" - Data: "<" - 4182-4185: "entity.name.tag.xml.plist" - 4182-4185: "entity.name.tag.localname.xml.plist" - Data: "key" - 4185-4186: "punctuation.definition.tag.xml.plist" - Data: ">" - 4187-4193: "meta.tag.key.xml.plist" - 4187-4189: "punctuation.definition.tag.xml.plist" - Data: "" - 4202-4312: "" - 4202-4208: "meta.tag.dict.xml.plist" - 4202-4203: "punctuation.definition.tag.xml.plist" - Data: "<" - 4203-4207: "entity.name.tag.xml.plist" - 4203-4207: "entity.name.tag.localname.xml.plist" - Data: "dict" - 4207-4208: "punctuation.definition.tag.xml.plist" - Data: ">" - 4218-4233: "" - 4218-4223: "meta.tag.key.xml.plist" - 4218-4219: "punctuation.definition.tag.xml.plist" - Data: "<" - 4219-4222: "entity.name.tag.xml.plist" - 4219-4222: "entity.name.tag.localname.xml.plist" - Data: "key" - 4222-4223: "punctuation.definition.tag.xml.plist" - Data: ">" - 4227-4233: "meta.tag.key.xml.plist" - 4227-4229: "punctuation.definition.tag.xml.plist" - Data: "" - 4243-4296: "" - 4243-4251: "meta.tag.string.xml.plist" - 4243-4244: "punctuation.definition.tag.xml.plist" - Data: "<" - 4244-4250: "entity.name.tag.xml.plist" - 4244-4250: "entity.name.tag.localname.xml.plist" - Data: "string" - 4250-4251: "punctuation.definition.tag.xml.plist" - Data: ">" - 4287-4296: "meta.tag.string.xml.plist" - 4287-4289: "punctuation.definition.tag.xml.plist" - Data: "" - 4305-4312: "meta.tag.dict.xml.plist" - 4305-4307: "punctuation.definition.tag.xml.plist" - Data: "" - 4320-4327: "meta.tag.dict.xml.plist" - 4320-4322: "punctuation.definition.tag.xml.plist" - Data: "" - 4335-4354: "" - 4335-4340: "meta.tag.key.xml.plist" - 4335-4336: "punctuation.definition.tag.xml.plist" - Data: "<" - 4336-4339: "entity.name.tag.xml.plist" - 4336-4339: "entity.name.tag.localname.xml.plist" - Data: "key" - 4339-4340: "punctuation.definition.tag.xml.plist" - Data: ">" - 4348-4354: "meta.tag.key.xml.plist" - 4348-4350: "punctuation.definition.tag.xml.plist" - Data: "" - 4362-4480: "" - 4362-4369: "meta.tag.array.xml.plist" - 4362-4363: "punctuation.definition.tag.xml.plist" - Data: "<" - 4363-4368: "entity.name.tag.xml.plist" - 4363-4368: "entity.name.tag.localname.xml.plist" - Data: "array" - 4368-4369: "punctuation.definition.tag.xml.plist" - Data: ">" - 4378-4464: "" - 4378-4384: "meta.tag.dict.xml.plist" - 4378-4379: "punctuation.definition.tag.xml.plist" - Data: "<" - 4379-4383: "entity.name.tag.xml.plist" - 4379-4383: "entity.name.tag.localname.xml.plist" - Data: "dict" - 4383-4384: "punctuation.definition.tag.xml.plist" - Data: ">" - 4394-4412: "" - 4394-4399: "meta.tag.key.xml.plist" - 4394-4395: "punctuation.definition.tag.xml.plist" - Data: "<" - 4395-4398: "entity.name.tag.xml.plist" - 4395-4398: "entity.name.tag.localname.xml.plist" - Data: "key" - 4398-4399: "punctuation.definition.tag.xml.plist" - Data: ">" - 4406-4412: "meta.tag.key.xml.plist" - 4406-4408: "punctuation.definition.tag.xml.plist" - Data: "" - 4422-4448: "" - 4422-4430: "meta.tag.string.xml.plist" - 4422-4423: "punctuation.definition.tag.xml.plist" - Data: "<" - 4423-4429: "entity.name.tag.xml.plist" - 4423-4429: "entity.name.tag.localname.xml.plist" - Data: "string" - 4429-4430: "punctuation.definition.tag.xml.plist" - Data: ">" - 4439-4448: "meta.tag.string.xml.plist" - 4439-4441: "punctuation.definition.tag.xml.plist" - Data: "" - 4457-4464: "meta.tag.dict.xml.plist" - 4457-4459: "punctuation.definition.tag.xml.plist" - Data: "" - 4472-4480: "meta.tag.array.xml.plist" - 4472-4474: "punctuation.definition.tag.xml.plist" - Data: "" - 4487-4494: "meta.tag.dict.xml.plist" - 4487-4489: "punctuation.definition.tag.xml.plist" - Data: "" - 4500-4508: "meta.tag.array.xml.plist" - 4500-4502: "punctuation.definition.tag.xml.plist" - Data: "" - 4513-4520: "meta.tag.dict.xml.plist" - 4513-4515: "punctuation.definition.tag.xml.plist" - Data: "" - 4525-4602: "" - 4525-4531: "meta.tag.dict.xml.plist" - 4525-4526: "punctuation.definition.tag.xml.plist" - Data: "<" - 4526-4530: "entity.name.tag.xml.plist" - 4526-4530: "entity.name.tag.localname.xml.plist" - Data: "dict" - 4530-4531: "punctuation.definition.tag.xml.plist" - Data: ">" - 4537-4555: "" - 4537-4542: "meta.tag.key.xml.plist" - 4537-4538: "punctuation.definition.tag.xml.plist" - Data: "<" - 4538-4541: "entity.name.tag.xml.plist" - 4538-4541: "entity.name.tag.localname.xml.plist" - Data: "key" - 4541-4542: "punctuation.definition.tag.xml.plist" - Data: ">" - 4549-4555: "meta.tag.key.xml.plist" - 4549-4551: "punctuation.definition.tag.xml.plist" - Data: "" - 4561-4590: "" - 4561-4569: "meta.tag.string.xml.plist" - 4561-4562: "punctuation.definition.tag.xml.plist" - Data: "<" - 4562-4568: "entity.name.tag.xml.plist" - 4562-4568: "entity.name.tag.localname.xml.plist" - Data: "string" - 4568-4569: "punctuation.definition.tag.xml.plist" - Data: ">" - 4581-4590: "meta.tag.string.xml.plist" - 4581-4583: "punctuation.definition.tag.xml.plist" - Data: "" - 4595-4602: "meta.tag.dict.xml.plist" - 4595-4597: "punctuation.definition.tag.xml.plist" - Data: "" - 4607-4684: "" - 4607-4613: "meta.tag.dict.xml.plist" - 4607-4608: "punctuation.definition.tag.xml.plist" - Data: "<" - 4608-4612: "entity.name.tag.xml.plist" - 4608-4612: "entity.name.tag.localname.xml.plist" - Data: "dict" - 4612-4613: "punctuation.definition.tag.xml.plist" - Data: ">" - 4619-4637: "" - 4619-4624: "meta.tag.key.xml.plist" - 4619-4620: "punctuation.definition.tag.xml.plist" - Data: "<" - 4620-4623: "entity.name.tag.xml.plist" - 4620-4623: "entity.name.tag.localname.xml.plist" - Data: "key" - 4623-4624: "punctuation.definition.tag.xml.plist" - Data: ">" - 4631-4637: "meta.tag.key.xml.plist" - 4631-4633: "punctuation.definition.tag.xml.plist" - Data: "" - 4643-4672: "" - 4643-4651: "meta.tag.string.xml.plist" - 4643-4644: "punctuation.definition.tag.xml.plist" - Data: "<" - 4644-4650: "entity.name.tag.xml.plist" - 4644-4650: "entity.name.tag.localname.xml.plist" - Data: "string" - 4650-4651: "punctuation.definition.tag.xml.plist" - Data: ">" - 4663-4672: "meta.tag.string.xml.plist" - 4663-4665: "punctuation.definition.tag.xml.plist" - Data: "" - 4677-4684: "meta.tag.dict.xml.plist" - 4677-4679: "punctuation.definition.tag.xml.plist" - Data: "" - 4689-4762: "" - 4689-4695: "meta.tag.dict.xml.plist" - 4689-4690: "punctuation.definition.tag.xml.plist" - Data: "<" - 4690-4694: "entity.name.tag.xml.plist" - 4690-4694: "entity.name.tag.localname.xml.plist" - Data: "dict" - 4694-4695: "punctuation.definition.tag.xml.plist" - Data: ">" - 4701-4719: "" - 4701-4706: "meta.tag.key.xml.plist" - 4701-4702: "punctuation.definition.tag.xml.plist" - Data: "<" - 4702-4705: "entity.name.tag.xml.plist" - 4702-4705: "entity.name.tag.localname.xml.plist" - Data: "key" - 4705-4706: "punctuation.definition.tag.xml.plist" - Data: ">" - 4713-4719: "meta.tag.key.xml.plist" - 4713-4715: "punctuation.definition.tag.xml.plist" - Data: "" - 4725-4750: "" - 4725-4733: "meta.tag.string.xml.plist" - 4725-4726: "punctuation.definition.tag.xml.plist" - Data: "<" - 4726-4732: "entity.name.tag.xml.plist" - 4726-4732: "entity.name.tag.localname.xml.plist" - Data: "string" - 4732-4733: "punctuation.definition.tag.xml.plist" - Data: ">" - 4741-4750: "meta.tag.string.xml.plist" - 4741-4743: "punctuation.definition.tag.xml.plist" - Data: "" - 4755-4762: "meta.tag.dict.xml.plist" - 4755-4757: "punctuation.definition.tag.xml.plist" - Data: "" - 4767-4847: "" - 4767-4773: "meta.tag.dict.xml.plist" - 4767-4768: "punctuation.definition.tag.xml.plist" - Data: "<" - 4768-4772: "entity.name.tag.xml.plist" - 4768-4772: "entity.name.tag.localname.xml.plist" - Data: "dict" - 4772-4773: "punctuation.definition.tag.xml.plist" - Data: ">" - 4779-4797: "" - 4779-4784: "meta.tag.key.xml.plist" - 4779-4780: "punctuation.definition.tag.xml.plist" - Data: "<" - 4780-4783: "entity.name.tag.xml.plist" - 4780-4783: "entity.name.tag.localname.xml.plist" - Data: "key" - 4783-4784: "punctuation.definition.tag.xml.plist" - Data: ">" - 4791-4797: "meta.tag.key.xml.plist" - 4791-4793: "punctuation.definition.tag.xml.plist" - Data: "" - 4803-4835: "" - 4803-4811: "meta.tag.string.xml.plist" - 4803-4804: "punctuation.definition.tag.xml.plist" - Data: "<" - 4804-4810: "entity.name.tag.xml.plist" - 4804-4810: "entity.name.tag.localname.xml.plist" - Data: "string" - 4810-4811: "punctuation.definition.tag.xml.plist" - Data: ">" - 4826-4835: "meta.tag.string.xml.plist" - 4826-4828: "punctuation.definition.tag.xml.plist" - Data: "" - 4840-4847: "meta.tag.dict.xml.plist" - 4840-4842: "punctuation.definition.tag.xml.plist" - Data: "" - 4851-4859: "meta.tag.array.xml.plist" - 4851-4853: "punctuation.definition.tag.xml.plist" - Data: "" - 4862-4869: "meta.tag.dict.xml.plist" - 4862-4864: "punctuation.definition.tag.xml.plist" - Data: "" - 4872-4894: "" - 4872-4877: "meta.tag.key.xml.plist" - 4872-4873: "punctuation.definition.tag.xml.plist" - Data: "<" - 4873-4876: "entity.name.tag.xml.plist" - 4873-4876: "entity.name.tag.localname.xml.plist" - Data: "key" - 4876-4877: "punctuation.definition.tag.xml.plist" - Data: ">" - 4888-4894: "meta.tag.key.xml.plist" - 4888-4890: "punctuation.definition.tag.xml.plist" - Data: "" - 4897-5467: "" - 4897-4903: "meta.tag.dict.xml.plist" - 4897-4898: "punctuation.definition.tag.xml.plist" - Data: "<" - 4898-4902: "entity.name.tag.xml.plist" - 4898-4902: "entity.name.tag.localname.xml.plist" - Data: "dict" - 4902-4903: "punctuation.definition.tag.xml.plist" - Data: ">" - 4907-4923: "" - 4907-4912: "meta.tag.key.xml.plist" - 4907-4908: "punctuation.definition.tag.xml.plist" - Data: "<" - 4908-4911: "entity.name.tag.xml.plist" - 4908-4911: "entity.name.tag.localname.xml.plist" - Data: "key" - 4911-4912: "punctuation.definition.tag.xml.plist" - Data: ">" - 4917-4923: "meta.tag.key.xml.plist" - 4917-4919: "punctuation.definition.tag.xml.plist" - Data: "" - 4927-4951: "" - 4927-4935: "meta.tag.string.xml.plist" - 4927-4928: "punctuation.definition.tag.xml.plist" - Data: "<" - 4928-4934: "entity.name.tag.xml.plist" - 4928-4934: "entity.name.tag.localname.xml.plist" - Data: "string" - 4934-4935: "punctuation.definition.tag.xml.plist" - Data: ">" - 4942-4951: "meta.tag.string.xml.plist" - 4942-4944: "punctuation.definition.tag.xml.plist" - Data: "" - 4955-4974: "" - 4955-4960: "meta.tag.key.xml.plist" - 4955-4956: "punctuation.definition.tag.xml.plist" - Data: "<" - 4956-4959: "entity.name.tag.xml.plist" - 4956-4959: "entity.name.tag.localname.xml.plist" - Data: "key" - 4959-4960: "punctuation.definition.tag.xml.plist" - Data: ">" - 4968-4974: "meta.tag.key.xml.plist" - 4968-4970: "punctuation.definition.tag.xml.plist" - Data: "" - 4978-5119: "" - 4978-4984: "meta.tag.dict.xml.plist" - 4978-4979: "punctuation.definition.tag.xml.plist" - Data: "<" - 4979-4983: "entity.name.tag.xml.plist" - 4979-4983: "entity.name.tag.localname.xml.plist" - Data: "dict" - 4983-4984: "punctuation.definition.tag.xml.plist" - Data: ">" - 4989-5001: "" - 4989-4994: "meta.tag.key.xml.plist" - 4989-4990: "punctuation.definition.tag.xml.plist" - Data: "<" - 4990-4993: "entity.name.tag.xml.plist" - 4990-4993: "entity.name.tag.localname.xml.plist" - Data: "key" - 4993-4994: "punctuation.definition.tag.xml.plist" - Data: ">" - 4995-5001: "meta.tag.key.xml.plist" - 4995-4997: "punctuation.definition.tag.xml.plist" - Data: "" - 5006-5108: "" - 5006-5012: "meta.tag.dict.xml.plist" - 5006-5007: "punctuation.definition.tag.xml.plist" - Data: "<" - 5007-5011: "entity.name.tag.xml.plist" - 5007-5011: "entity.name.tag.localname.xml.plist" - Data: "dict" - 5011-5012: "punctuation.definition.tag.xml.plist" - Data: ">" - 5018-5033: "" - 5018-5023: "meta.tag.key.xml.plist" - 5018-5019: "punctuation.definition.tag.xml.plist" - Data: "<" - 5019-5022: "entity.name.tag.xml.plist" - 5019-5022: "entity.name.tag.localname.xml.plist" - Data: "key" - 5022-5023: "punctuation.definition.tag.xml.plist" - Data: ">" - 5027-5033: "meta.tag.key.xml.plist" - 5027-5029: "punctuation.definition.tag.xml.plist" - Data: "" - 5039-5096: "" - 5039-5047: "meta.tag.string.xml.plist" - 5039-5040: "punctuation.definition.tag.xml.plist" - Data: "<" - 5040-5046: "entity.name.tag.xml.plist" - 5040-5046: "entity.name.tag.localname.xml.plist" - Data: "string" - 5046-5047: "punctuation.definition.tag.xml.plist" - Data: ">" - 5087-5096: "meta.tag.string.xml.plist" - 5087-5089: "punctuation.definition.tag.xml.plist" - Data: "" - 5101-5108: "meta.tag.dict.xml.plist" - 5101-5103: "punctuation.definition.tag.xml.plist" - Data: "" - 5112-5119: "meta.tag.dict.xml.plist" - 5112-5114: "punctuation.definition.tag.xml.plist" - Data: "" - 5123-5137: "" - 5123-5128: "meta.tag.key.xml.plist" - 5123-5124: "punctuation.definition.tag.xml.plist" - Data: "<" - 5124-5127: "entity.name.tag.xml.plist" - 5124-5127: "entity.name.tag.localname.xml.plist" - Data: "key" - 5127-5128: "punctuation.definition.tag.xml.plist" - Data: ">" - 5131-5137: "meta.tag.key.xml.plist" - 5131-5133: "punctuation.definition.tag.xml.plist" - Data: "" - 5141-5173: "" - 5141-5149: "meta.tag.string.xml.plist" - 5141-5142: "punctuation.definition.tag.xml.plist" - Data: "<" - 5142-5148: "entity.name.tag.xml.plist" - 5142-5148: "entity.name.tag.localname.xml.plist" - Data: "string" - 5148-5149: "punctuation.definition.tag.xml.plist" - Data: ">" - 5164-5173: "meta.tag.string.xml.plist" - 5164-5166: "punctuation.definition.tag.xml.plist" - Data: "" - 5177-5192: "" - 5177-5182: "meta.tag.key.xml.plist" - 5177-5178: "punctuation.definition.tag.xml.plist" - Data: "<" - 5178-5181: "entity.name.tag.xml.plist" - 5178-5181: "entity.name.tag.localname.xml.plist" - Data: "key" - 5181-5182: "punctuation.definition.tag.xml.plist" - Data: ">" - 5186-5192: "meta.tag.key.xml.plist" - 5186-5188: "punctuation.definition.tag.xml.plist" - Data: "" - 5196-5236: "" - 5196-5204: "meta.tag.string.xml.plist" - 5196-5197: "punctuation.definition.tag.xml.plist" - Data: "<" - 5197-5203: "entity.name.tag.xml.plist" - 5197-5203: "entity.name.tag.localname.xml.plist" - Data: "string" - 5203-5204: "punctuation.definition.tag.xml.plist" - Data: ">" - 5227-5236: "meta.tag.string.xml.plist" - 5227-5229: "punctuation.definition.tag.xml.plist" - Data: "" - 5240-5259: "" - 5240-5245: "meta.tag.key.xml.plist" - 5240-5241: "punctuation.definition.tag.xml.plist" - Data: "<" - 5241-5244: "entity.name.tag.xml.plist" - 5241-5244: "entity.name.tag.localname.xml.plist" - Data: "key" - 5244-5245: "punctuation.definition.tag.xml.plist" - Data: ">" - 5253-5259: "meta.tag.key.xml.plist" - 5253-5255: "punctuation.definition.tag.xml.plist" - Data: "" - 5263-5457: "" - 5263-5270: "meta.tag.array.xml.plist" - 5263-5264: "punctuation.definition.tag.xml.plist" - Data: "<" - 5264-5269: "entity.name.tag.xml.plist" - 5264-5269: "entity.name.tag.localname.xml.plist" - Data: "array" - 5269-5270: "punctuation.definition.tag.xml.plist" - Data: ">" - 5275-5445: "" - 5275-5281: "meta.tag.dict.xml.plist" - 5275-5276: "punctuation.definition.tag.xml.plist" - Data: "<" - 5276-5280: "entity.name.tag.xml.plist" - 5276-5280: "entity.name.tag.localname.xml.plist" - Data: "dict" - 5280-5281: "punctuation.definition.tag.xml.plist" - Data: ">" - 5287-5303: "" - 5287-5292: "meta.tag.key.xml.plist" - 5287-5288: "punctuation.definition.tag.xml.plist" - Data: "<" - 5288-5291: "entity.name.tag.xml.plist" - 5288-5291: "entity.name.tag.localname.xml.plist" - Data: "key" - 5291-5292: "punctuation.definition.tag.xml.plist" - Data: ">" - 5297-5303: "meta.tag.key.xml.plist" - 5297-5299: "punctuation.definition.tag.xml.plist" - Data: "" - 5309-5340: "" - 5309-5317: "meta.tag.string.xml.plist" - 5309-5310: "punctuation.definition.tag.xml.plist" - Data: "<" - 5310-5316: "entity.name.tag.xml.plist" - 5310-5316: "entity.name.tag.localname.xml.plist" - Data: "string" - 5316-5317: "punctuation.definition.tag.xml.plist" - Data: ">" - 5331-5340: "meta.tag.string.xml.plist" - 5331-5333: "punctuation.definition.tag.xml.plist" - Data: "" - 5346-5361: "" - 5346-5351: "meta.tag.key.xml.plist" - 5346-5347: "punctuation.definition.tag.xml.plist" - Data: "<" - 5347-5350: "entity.name.tag.xml.plist" - 5347-5350: "entity.name.tag.localname.xml.plist" - Data: "key" - 5350-5351: "punctuation.definition.tag.xml.plist" - Data: ">" - 5355-5361: "meta.tag.key.xml.plist" - 5355-5357: "punctuation.definition.tag.xml.plist" - Data: "" - 5367-5433: "" - 5367-5375: "meta.tag.string.xml.plist" - 5367-5368: "punctuation.definition.tag.xml.plist" - Data: "<" - 5368-5374: "entity.name.tag.xml.plist" - 5368-5374: "entity.name.tag.localname.xml.plist" - Data: "string" - 5374-5375: "punctuation.definition.tag.xml.plist" - Data: ">" - 5424-5433: "meta.tag.string.xml.plist" - 5424-5426: "punctuation.definition.tag.xml.plist" - Data: "" - 5438-5445: "meta.tag.dict.xml.plist" - 5438-5440: "punctuation.definition.tag.xml.plist" - Data: "" - 5449-5457: "meta.tag.array.xml.plist" - 5449-5451: "punctuation.definition.tag.xml.plist" - Data: "" - 5460-5467: "meta.tag.dict.xml.plist" - 5460-5462: "punctuation.definition.tag.xml.plist" - Data: "" - 5470-5493: "" - 5470-5475: "meta.tag.key.xml.plist" - 5470-5471: "punctuation.definition.tag.xml.plist" - Data: "<" - 5471-5474: "entity.name.tag.xml.plist" - 5471-5474: "entity.name.tag.localname.xml.plist" - Data: "key" - 5474-5475: "punctuation.definition.tag.xml.plist" - Data: ">" - 5487-5493: "meta.tag.key.xml.plist" - 5487-5489: "punctuation.definition.tag.xml.plist" - Data: "" - 5496-5906: "" - 5496-5502: "meta.tag.dict.xml.plist" - 5496-5497: "punctuation.definition.tag.xml.plist" - Data: "<" - 5497-5501: "entity.name.tag.xml.plist" - 5497-5501: "entity.name.tag.localname.xml.plist" - Data: "dict" - 5501-5502: "punctuation.definition.tag.xml.plist" - Data: ">" - 5506-5525: "" - 5506-5511: "meta.tag.key.xml.plist" - 5506-5507: "punctuation.definition.tag.xml.plist" - Data: "<" - 5507-5510: "entity.name.tag.xml.plist" - 5507-5510: "entity.name.tag.localname.xml.plist" - Data: "key" - 5510-5511: "punctuation.definition.tag.xml.plist" - Data: ">" - 5519-5525: "meta.tag.key.xml.plist" - 5519-5521: "punctuation.definition.tag.xml.plist" - Data: "" - 5529-5896: "" - 5529-5536: "meta.tag.array.xml.plist" - 5529-5530: "punctuation.definition.tag.xml.plist" - Data: "<" - 5530-5535: "entity.name.tag.xml.plist" - 5530-5535: "entity.name.tag.localname.xml.plist" - Data: "array" - 5535-5536: "punctuation.definition.tag.xml.plist" - Data: ">" - 5541-5728: "" - 5541-5547: "meta.tag.dict.xml.plist" - 5541-5542: "punctuation.definition.tag.xml.plist" - Data: "<" - 5542-5546: "entity.name.tag.xml.plist" - 5542-5546: "entity.name.tag.localname.xml.plist" - Data: "dict" - 5546-5547: "punctuation.definition.tag.xml.plist" - Data: ">" - 5553-5569: "" - 5553-5558: "meta.tag.key.xml.plist" - 5553-5554: "punctuation.definition.tag.xml.plist" - Data: "<" - 5554-5557: "entity.name.tag.xml.plist" - 5554-5557: "entity.name.tag.localname.xml.plist" - Data: "key" - 5557-5558: "punctuation.definition.tag.xml.plist" - Data: ">" - 5563-5569: "meta.tag.key.xml.plist" - 5563-5565: "punctuation.definition.tag.xml.plist" - Data: "" - 5575-5637: "" - 5575-5583: "meta.tag.string.xml.plist" - 5575-5576: "punctuation.definition.tag.xml.plist" - Data: "<" - 5576-5582: "entity.name.tag.xml.plist" - 5576-5582: "entity.name.tag.localname.xml.plist" - Data: "string" - 5582-5583: "punctuation.definition.tag.xml.plist" - Data: ">" - 5583-5588: "invalid.illegal.bad-ampersand.xml.plist" - Data: "&" - 5628-5637: "meta.tag.string.xml.plist" - 5628-5630: "punctuation.definition.tag.xml.plist" - Data: "" - 5643-5658: "" - 5643-5648: "meta.tag.key.xml.plist" - 5643-5644: "punctuation.definition.tag.xml.plist" - Data: "<" - 5644-5647: "entity.name.tag.xml.plist" - 5644-5647: "entity.name.tag.localname.xml.plist" - Data: "key" - 5647-5648: "punctuation.definition.tag.xml.plist" - Data: ">" - 5652-5658: "meta.tag.key.xml.plist" - 5652-5654: "punctuation.definition.tag.xml.plist" - Data: "" - 5664-5716: "" - 5664-5672: "meta.tag.string.xml.plist" - 5664-5665: "punctuation.definition.tag.xml.plist" - Data: "<" - 5665-5671: "entity.name.tag.xml.plist" - 5665-5671: "entity.name.tag.localname.xml.plist" - Data: "string" - 5671-5672: "punctuation.definition.tag.xml.plist" - Data: ">" - 5707-5716: "meta.tag.string.xml.plist" - 5707-5709: "punctuation.definition.tag.xml.plist" - Data: "" - 5721-5728: "meta.tag.dict.xml.plist" - 5721-5723: "punctuation.definition.tag.xml.plist" - Data: "" - 5733-5884: "" - 5733-5739: "meta.tag.dict.xml.plist" - 5733-5734: "punctuation.definition.tag.xml.plist" - Data: "<" - 5734-5738: "entity.name.tag.xml.plist" - 5734-5738: "entity.name.tag.localname.xml.plist" - Data: "dict" - 5738-5739: "punctuation.definition.tag.xml.plist" - Data: ">" - 5745-5761: "" - 5745-5750: "meta.tag.key.xml.plist" - 5745-5746: "punctuation.definition.tag.xml.plist" - Data: "<" - 5746-5749: "entity.name.tag.xml.plist" - 5746-5749: "entity.name.tag.localname.xml.plist" - Data: "key" - 5749-5750: "punctuation.definition.tag.xml.plist" - Data: ">" - 5755-5761: "meta.tag.key.xml.plist" - 5755-5757: "punctuation.definition.tag.xml.plist" - Data: "" - 5767-5789: "" - 5767-5775: "meta.tag.string.xml.plist" - 5767-5768: "punctuation.definition.tag.xml.plist" - Data: "<" - 5768-5774: "entity.name.tag.xml.plist" - 5768-5774: "entity.name.tag.localname.xml.plist" - Data: "string" - 5774-5775: "punctuation.definition.tag.xml.plist" - Data: ">" - 5775-5780: "invalid.illegal.bad-ampersand.xml.plist" - Data: "&" - 5780-5789: "meta.tag.string.xml.plist" - 5780-5782: "punctuation.definition.tag.xml.plist" - Data: "" - 5795-5810: "" - 5795-5800: "meta.tag.key.xml.plist" - 5795-5796: "punctuation.definition.tag.xml.plist" - Data: "<" - 5796-5799: "entity.name.tag.xml.plist" - 5796-5799: "entity.name.tag.localname.xml.plist" - Data: "key" - 5799-5800: "punctuation.definition.tag.xml.plist" - Data: ">" - 5804-5810: "meta.tag.key.xml.plist" - 5804-5806: "punctuation.definition.tag.xml.plist" - Data: "" - 5816-5872: "" - 5816-5824: "meta.tag.string.xml.plist" - 5816-5817: "punctuation.definition.tag.xml.plist" - Data: "<" - 5817-5823: "entity.name.tag.xml.plist" - 5817-5823: "entity.name.tag.localname.xml.plist" - Data: "string" - 5823-5824: "punctuation.definition.tag.xml.plist" - Data: ">" - 5863-5872: "meta.tag.string.xml.plist" - 5863-5865: "punctuation.definition.tag.xml.plist" - Data: "" - 5877-5884: "meta.tag.dict.xml.plist" - 5877-5879: "punctuation.definition.tag.xml.plist" - Data: "" - 5888-5896: "meta.tag.array.xml.plist" - 5888-5890: "punctuation.definition.tag.xml.plist" - Data: "" - 5899-5906: "meta.tag.dict.xml.plist" - 5899-5901: "punctuation.definition.tag.xml.plist" - Data: "" - 5909-5931: "" - 5909-5914: "meta.tag.key.xml.plist" - 5909-5910: "punctuation.definition.tag.xml.plist" - Data: "<" - 5910-5913: "entity.name.tag.xml.plist" - 5910-5913: "entity.name.tag.localname.xml.plist" - Data: "key" - 5913-5914: "punctuation.definition.tag.xml.plist" - Data: ">" - 5925-5931: "meta.tag.key.xml.plist" - 5925-5927: "punctuation.definition.tag.xml.plist" - Data: "" - 5934-6591: "" - 5934-5940: "meta.tag.dict.xml.plist" - 5934-5935: "punctuation.definition.tag.xml.plist" - Data: "<" - 5935-5939: "entity.name.tag.xml.plist" - 5935-5939: "entity.name.tag.localname.xml.plist" - Data: "dict" - 5939-5940: "punctuation.definition.tag.xml.plist" - Data: ">" - 5944-5963: "" - 5944-5949: "meta.tag.key.xml.plist" - 5944-5945: "punctuation.definition.tag.xml.plist" - Data: "<" - 5945-5948: "entity.name.tag.xml.plist" - 5945-5948: "entity.name.tag.localname.xml.plist" - Data: "key" - 5948-5949: "punctuation.definition.tag.xml.plist" - Data: ">" - 5957-5963: "meta.tag.key.xml.plist" - 5957-5959: "punctuation.definition.tag.xml.plist" - Data: "" - 5967-6462: "" - 5967-5973: "meta.tag.dict.xml.plist" - 5967-5968: "punctuation.definition.tag.xml.plist" - Data: "<" - 5968-5972: "entity.name.tag.xml.plist" - 5968-5972: "entity.name.tag.localname.xml.plist" - Data: "dict" - 5972-5973: "punctuation.definition.tag.xml.plist" - Data: ">" - 5978-5990: "" - 5978-5983: "meta.tag.key.xml.plist" - 5978-5979: "punctuation.definition.tag.xml.plist" - Data: "<" - 5979-5982: "entity.name.tag.xml.plist" - 5979-5982: "entity.name.tag.localname.xml.plist" - Data: "key" - 5982-5983: "punctuation.definition.tag.xml.plist" - Data: ">" - 5984-5990: "meta.tag.key.xml.plist" - 5984-5986: "punctuation.definition.tag.xml.plist" - Data: "" - 5995-6083: "" - 5995-6001: "meta.tag.dict.xml.plist" - 5995-5996: "punctuation.definition.tag.xml.plist" - Data: "<" - 5996-6000: "entity.name.tag.xml.plist" - 5996-6000: "entity.name.tag.localname.xml.plist" - Data: "dict" - 6000-6001: "punctuation.definition.tag.xml.plist" - Data: ">" - 6007-6022: "" - 6007-6012: "meta.tag.key.xml.plist" - 6007-6008: "punctuation.definition.tag.xml.plist" - Data: "<" - 6008-6011: "entity.name.tag.xml.plist" - 6008-6011: "entity.name.tag.localname.xml.plist" - Data: "key" - 6011-6012: "punctuation.definition.tag.xml.plist" - Data: ">" - 6016-6022: "meta.tag.key.xml.plist" - 6016-6018: "punctuation.definition.tag.xml.plist" - Data: "" - 6028-6071: "" - 6028-6036: "meta.tag.string.xml.plist" - 6028-6029: "punctuation.definition.tag.xml.plist" - Data: "<" - 6029-6035: "entity.name.tag.xml.plist" - 6029-6035: "entity.name.tag.localname.xml.plist" - Data: "string" - 6035-6036: "punctuation.definition.tag.xml.plist" - Data: ">" - 6062-6071: "meta.tag.string.xml.plist" - 6062-6064: "punctuation.definition.tag.xml.plist" - Data: "" - 6076-6083: "meta.tag.dict.xml.plist" - 6076-6078: "punctuation.definition.tag.xml.plist" - Data: "" - 6088-6100: "" - 6088-6093: "meta.tag.key.xml.plist" - 6088-6089: "punctuation.definition.tag.xml.plist" - Data: "<" - 6089-6092: "entity.name.tag.xml.plist" - 6089-6092: "entity.name.tag.localname.xml.plist" - Data: "key" - 6092-6093: "punctuation.definition.tag.xml.plist" - Data: ">" - 6094-6100: "meta.tag.key.xml.plist" - 6094-6096: "punctuation.definition.tag.xml.plist" - Data: "" - 6105-6203: "" - 6105-6111: "meta.tag.dict.xml.plist" - 6105-6106: "punctuation.definition.tag.xml.plist" - Data: "<" - 6106-6110: "entity.name.tag.xml.plist" - 6106-6110: "entity.name.tag.localname.xml.plist" - Data: "dict" - 6110-6111: "punctuation.definition.tag.xml.plist" - Data: ">" - 6117-6132: "" - 6117-6122: "meta.tag.key.xml.plist" - 6117-6118: "punctuation.definition.tag.xml.plist" - Data: "<" - 6118-6121: "entity.name.tag.xml.plist" - 6118-6121: "entity.name.tag.localname.xml.plist" - Data: "key" - 6121-6122: "punctuation.definition.tag.xml.plist" - Data: ">" - 6126-6132: "meta.tag.key.xml.plist" - 6126-6128: "punctuation.definition.tag.xml.plist" - Data: "" - 6138-6191: "" - 6138-6146: "meta.tag.string.xml.plist" - 6138-6139: "punctuation.definition.tag.xml.plist" - Data: "<" - 6139-6145: "entity.name.tag.xml.plist" - 6139-6145: "entity.name.tag.localname.xml.plist" - Data: "string" - 6145-6146: "punctuation.definition.tag.xml.plist" - Data: ">" - 6182-6191: "meta.tag.string.xml.plist" - 6182-6184: "punctuation.definition.tag.xml.plist" - Data: "" - 6196-6203: "meta.tag.dict.xml.plist" - 6196-6198: "punctuation.definition.tag.xml.plist" - Data: "" - 6208-6220: "" - 6208-6213: "meta.tag.key.xml.plist" - 6208-6209: "punctuation.definition.tag.xml.plist" - Data: "<" - 6209-6212: "entity.name.tag.xml.plist" - 6209-6212: "entity.name.tag.localname.xml.plist" - Data: "key" - 6212-6213: "punctuation.definition.tag.xml.plist" - Data: ">" - 6214-6220: "meta.tag.key.xml.plist" - 6214-6216: "punctuation.definition.tag.xml.plist" - Data: "" - 6225-6331: "" - 6225-6231: "meta.tag.dict.xml.plist" - 6225-6226: "punctuation.definition.tag.xml.plist" - Data: "<" - 6226-6230: "entity.name.tag.xml.plist" - 6226-6230: "entity.name.tag.localname.xml.plist" - Data: "dict" - 6230-6231: "punctuation.definition.tag.xml.plist" - Data: ">" - 6237-6252: "" - 6237-6242: "meta.tag.key.xml.plist" - 6237-6238: "punctuation.definition.tag.xml.plist" - Data: "<" - 6238-6241: "entity.name.tag.xml.plist" - 6238-6241: "entity.name.tag.localname.xml.plist" - Data: "key" - 6241-6242: "punctuation.definition.tag.xml.plist" - Data: ">" - 6246-6252: "meta.tag.key.xml.plist" - 6246-6248: "punctuation.definition.tag.xml.plist" - Data: "" - 6258-6319: "" - 6258-6266: "meta.tag.string.xml.plist" - 6258-6259: "punctuation.definition.tag.xml.plist" - Data: "<" - 6259-6265: "entity.name.tag.xml.plist" - 6259-6265: "entity.name.tag.localname.xml.plist" - Data: "string" - 6265-6266: "punctuation.definition.tag.xml.plist" - Data: ">" - 6310-6319: "meta.tag.string.xml.plist" - 6310-6312: "punctuation.definition.tag.xml.plist" - Data: "" - 6324-6331: "meta.tag.dict.xml.plist" - 6324-6326: "punctuation.definition.tag.xml.plist" - Data: "" - 6336-6348: "" - 6336-6341: "meta.tag.key.xml.plist" - 6336-6337: "punctuation.definition.tag.xml.plist" - Data: "<" - 6337-6340: "entity.name.tag.xml.plist" - 6337-6340: "entity.name.tag.localname.xml.plist" - Data: "key" - 6340-6341: "punctuation.definition.tag.xml.plist" - Data: ">" - 6342-6348: "meta.tag.key.xml.plist" - 6342-6344: "punctuation.definition.tag.xml.plist" - Data: "" - 6353-6451: "" - 6353-6359: "meta.tag.dict.xml.plist" - 6353-6354: "punctuation.definition.tag.xml.plist" - Data: "<" - 6354-6358: "entity.name.tag.xml.plist" - 6354-6358: "entity.name.tag.localname.xml.plist" - Data: "dict" - 6358-6359: "punctuation.definition.tag.xml.plist" - Data: ">" - 6365-6380: "" - 6365-6370: "meta.tag.key.xml.plist" - 6365-6366: "punctuation.definition.tag.xml.plist" - Data: "<" - 6366-6369: "entity.name.tag.xml.plist" - 6366-6369: "entity.name.tag.localname.xml.plist" - Data: "key" - 6369-6370: "punctuation.definition.tag.xml.plist" - Data: ">" - 6374-6380: "meta.tag.key.xml.plist" - 6374-6376: "punctuation.definition.tag.xml.plist" - Data: "" - 6386-6439: "" - 6386-6394: "meta.tag.string.xml.plist" - 6386-6387: "punctuation.definition.tag.xml.plist" - Data: "<" - 6387-6393: "entity.name.tag.xml.plist" - 6387-6393: "entity.name.tag.localname.xml.plist" - Data: "string" - 6393-6394: "punctuation.definition.tag.xml.plist" - Data: ">" - 6430-6439: "meta.tag.string.xml.plist" - 6430-6432: "punctuation.definition.tag.xml.plist" - Data: "" - 6444-6451: "meta.tag.dict.xml.plist" - 6444-6446: "punctuation.definition.tag.xml.plist" - Data: "" - 6455-6462: "meta.tag.dict.xml.plist" - 6455-6457: "punctuation.definition.tag.xml.plist" - Data: "" - 6466-6484: "" - 6466-6471: "meta.tag.key.xml.plist" - 6466-6467: "punctuation.definition.tag.xml.plist" - Data: "<" - 6467-6470: "entity.name.tag.xml.plist" - 6467-6470: "entity.name.tag.localname.xml.plist" - Data: "key" - 6470-6471: "punctuation.definition.tag.xml.plist" - Data: ">" - 6478-6484: "meta.tag.key.xml.plist" - 6478-6480: "punctuation.definition.tag.xml.plist" - Data: "" - 6488-6516: "" - 6488-6496: "meta.tag.string.xml.plist" - 6488-6489: "punctuation.definition.tag.xml.plist" - Data: "<" - 6489-6495: "entity.name.tag.xml.plist" - 6489-6495: "entity.name.tag.localname.xml.plist" - Data: "string" - 6495-6496: "punctuation.definition.tag.xml.plist" - Data: ">" - 6507-6516: "meta.tag.string.xml.plist" - 6507-6509: "punctuation.definition.tag.xml.plist" - Data: "" - 6520-6536: "" - 6520-6525: "meta.tag.key.xml.plist" - 6520-6521: "punctuation.definition.tag.xml.plist" - Data: "<" - 6521-6524: "entity.name.tag.xml.plist" - 6521-6524: "entity.name.tag.localname.xml.plist" - Data: "key" - 6524-6525: "punctuation.definition.tag.xml.plist" - Data: ">" - 6530-6536: "meta.tag.key.xml.plist" - 6530-6532: "punctuation.definition.tag.xml.plist" - Data: "" - 6540-6581: "" - 6540-6548: "meta.tag.string.xml.plist" - 6540-6541: "punctuation.definition.tag.xml.plist" - Data: "<" - 6541-6547: "entity.name.tag.xml.plist" - 6541-6547: "entity.name.tag.localname.xml.plist" - Data: "string" - 6547-6548: "punctuation.definition.tag.xml.plist" - Data: ">" - 6572-6581: "meta.tag.string.xml.plist" - 6572-6574: "punctuation.definition.tag.xml.plist" - Data: "" - 6584-6591: "meta.tag.dict.xml.plist" - 6584-6586: "punctuation.definition.tag.xml.plist" - Data: "" - 6594-6619: "" - 6594-6599: "meta.tag.key.xml.plist" - 6594-6595: "punctuation.definition.tag.xml.plist" - Data: "<" - 6595-6598: "entity.name.tag.xml.plist" - 6595-6598: "entity.name.tag.localname.xml.plist" - Data: "key" - 6598-6599: "punctuation.definition.tag.xml.plist" - Data: ">" - 6613-6619: "meta.tag.key.xml.plist" - 6613-6615: "punctuation.definition.tag.xml.plist" - Data: "" - 6622-6778: "" - 6622-6628: "meta.tag.dict.xml.plist" - 6622-6623: "punctuation.definition.tag.xml.plist" - Data: "<" - 6623-6627: "entity.name.tag.xml.plist" - 6623-6627: "entity.name.tag.localname.xml.plist" - Data: "dict" - 6627-6628: "punctuation.definition.tag.xml.plist" - Data: ">" - 6632-6648: "" - 6632-6637: "meta.tag.key.xml.plist" - 6632-6633: "punctuation.definition.tag.xml.plist" - Data: "<" - 6633-6636: "entity.name.tag.xml.plist" - 6633-6636: "entity.name.tag.localname.xml.plist" - Data: "key" - 6636-6637: "punctuation.definition.tag.xml.plist" - Data: ">" - 6642-6648: "meta.tag.key.xml.plist" - 6642-6644: "punctuation.definition.tag.xml.plist" - Data: "" - 6652-6671: "" - 6652-6660: "meta.tag.string.xml.plist" - 6652-6653: "punctuation.definition.tag.xml.plist" - Data: "<" - 6653-6659: "entity.name.tag.xml.plist" - 6653-6659: "entity.name.tag.localname.xml.plist" - Data: "string" - 6659-6660: "punctuation.definition.tag.xml.plist" - Data: ">" - 6662-6671: "meta.tag.string.xml.plist" - 6662-6664: "punctuation.definition.tag.xml.plist" - Data: "" - 6675-6690: "" - 6675-6680: "meta.tag.key.xml.plist" - 6675-6676: "punctuation.definition.tag.xml.plist" - Data: "<" - 6676-6679: "entity.name.tag.xml.plist" - 6676-6679: "entity.name.tag.localname.xml.plist" - Data: "key" - 6679-6680: "punctuation.definition.tag.xml.plist" - Data: ">" - 6684-6690: "meta.tag.key.xml.plist" - 6684-6686: "punctuation.definition.tag.xml.plist" - Data: "" - 6694-6768: "" - 6694-6702: "meta.tag.string.xml.plist" - 6694-6695: "punctuation.definition.tag.xml.plist" - Data: "<" - 6695-6701: "entity.name.tag.xml.plist" - 6695-6701: "entity.name.tag.localname.xml.plist" - Data: "string" - 6701-6702: "punctuation.definition.tag.xml.plist" - Data: ">" - 6759-6768: "meta.tag.string.xml.plist" - 6759-6761: "punctuation.definition.tag.xml.plist" - Data: "" - 6771-6778: "meta.tag.dict.xml.plist" - 6771-6773: "punctuation.definition.tag.xml.plist" - Data: "" - 6781-6800: "" - 6781-6786: "meta.tag.key.xml.plist" - 6781-6782: "punctuation.definition.tag.xml.plist" - Data: "<" - 6782-6785: "entity.name.tag.xml.plist" - 6782-6785: "entity.name.tag.localname.xml.plist" - Data: "key" - 6785-6786: "punctuation.definition.tag.xml.plist" - Data: ">" - 6794-6800: "meta.tag.key.xml.plist" - 6794-6796: "punctuation.definition.tag.xml.plist" - Data: "" - 6803-27564: "" - 6803-6809: "meta.tag.dict.xml.plist" - 6803-6804: "punctuation.definition.tag.xml.plist" - Data: "<" - 6804-6808: "entity.name.tag.xml.plist" - 6804-6808: "entity.name.tag.localname.xml.plist" - Data: "dict" - 6808-6809: "punctuation.definition.tag.xml.plist" - Data: ">" - 6813-6832: "" - 6813-6818: "meta.tag.key.xml.plist" - 6813-6814: "punctuation.definition.tag.xml.plist" - Data: "<" - 6814-6817: "entity.name.tag.xml.plist" - 6814-6817: "entity.name.tag.localname.xml.plist" - Data: "key" - 6817-6818: "punctuation.definition.tag.xml.plist" - Data: ">" - 6826-6832: "meta.tag.key.xml.plist" - 6826-6828: "punctuation.definition.tag.xml.plist" - Data: "" - 6836-27554: "" - 6836-6843: "meta.tag.array.xml.plist" - 6836-6837: "punctuation.definition.tag.xml.plist" - Data: "<" - 6837-6842: "entity.name.tag.xml.plist" - 6837-6842: "entity.name.tag.localname.xml.plist" - Data: "array" - 6842-6843: "punctuation.definition.tag.xml.plist" - Data: ">" - 6848-8459: "" - 6848-6854: "meta.tag.dict.xml.plist" - 6848-6849: "punctuation.definition.tag.xml.plist" - Data: "<" - 6849-6853: "entity.name.tag.xml.plist" - 6849-6853: "entity.name.tag.localname.xml.plist" - Data: "dict" - 6853-6854: "punctuation.definition.tag.xml.plist" - Data: ">" - 6860-6879: "" - 6860-6865: "meta.tag.key.xml.plist" - 6860-6861: "punctuation.definition.tag.xml.plist" - Data: "<" - 6861-6864: "entity.name.tag.xml.plist" - 6861-6864: "entity.name.tag.localname.xml.plist" - Data: "key" - 6864-6865: "punctuation.definition.tag.xml.plist" - Data: ">" - 6873-6879: "meta.tag.key.xml.plist" - 6873-6875: "punctuation.definition.tag.xml.plist" - Data: "" - 6885-8287: "" - 6885-6891: "meta.tag.dict.xml.plist" - 6885-6886: "punctuation.definition.tag.xml.plist" - Data: "<" - 6886-6890: "entity.name.tag.xml.plist" - 6886-6890: "entity.name.tag.localname.xml.plist" - Data: "dict" - 6890-6891: "punctuation.definition.tag.xml.plist" - Data: ">" - 6898-6910: "" - 6898-6903: "meta.tag.key.xml.plist" - 6898-6899: "punctuation.definition.tag.xml.plist" - Data: "<" - 6899-6902: "entity.name.tag.xml.plist" - 6899-6902: "entity.name.tag.localname.xml.plist" - Data: "key" - 6902-6903: "punctuation.definition.tag.xml.plist" - Data: ">" - 6904-6910: "meta.tag.key.xml.plist" - 6904-6906: "punctuation.definition.tag.xml.plist" - Data: "" - 6917-7008: "" - 6917-6923: "meta.tag.dict.xml.plist" - 6917-6918: "punctuation.definition.tag.xml.plist" - Data: "<" - 6918-6922: "entity.name.tag.xml.plist" - 6918-6922: "entity.name.tag.localname.xml.plist" - Data: "dict" - 6922-6923: "punctuation.definition.tag.xml.plist" - Data: ">" - 6931-6946: "" - 6931-6936: "meta.tag.key.xml.plist" - 6931-6932: "punctuation.definition.tag.xml.plist" - Data: "<" - 6932-6935: "entity.name.tag.xml.plist" - 6932-6935: "entity.name.tag.localname.xml.plist" - Data: "key" - 6935-6936: "punctuation.definition.tag.xml.plist" - Data: ">" - 6940-6946: "meta.tag.key.xml.plist" - 6940-6942: "punctuation.definition.tag.xml.plist" - Data: "" - 6954-6994: "" - 6954-6962: "meta.tag.string.xml.plist" - 6954-6955: "punctuation.definition.tag.xml.plist" - Data: "<" - 6955-6961: "entity.name.tag.xml.plist" - 6955-6961: "entity.name.tag.localname.xml.plist" - Data: "string" - 6961-6962: "punctuation.definition.tag.xml.plist" - Data: ">" - 6985-6994: "meta.tag.string.xml.plist" - 6985-6987: "punctuation.definition.tag.xml.plist" - Data: "" - 7001-7008: "meta.tag.dict.xml.plist" - 7001-7003: "punctuation.definition.tag.xml.plist" - Data: "" - 7015-7028: "" - 7015-7020: "meta.tag.key.xml.plist" - 7015-7016: "punctuation.definition.tag.xml.plist" - Data: "<" - 7016-7019: "entity.name.tag.xml.plist" - 7016-7019: "entity.name.tag.localname.xml.plist" - Data: "key" - 7019-7020: "punctuation.definition.tag.xml.plist" - Data: ">" - 7022-7028: "meta.tag.key.xml.plist" - 7022-7024: "punctuation.definition.tag.xml.plist" - Data: "" - 7035-7138: "" - 7035-7041: "meta.tag.dict.xml.plist" - 7035-7036: "punctuation.definition.tag.xml.plist" - Data: "<" - 7036-7040: "entity.name.tag.xml.plist" - 7036-7040: "entity.name.tag.localname.xml.plist" - Data: "dict" - 7040-7041: "punctuation.definition.tag.xml.plist" - Data: ">" - 7049-7064: "" - 7049-7054: "meta.tag.key.xml.plist" - 7049-7050: "punctuation.definition.tag.xml.plist" - Data: "<" - 7050-7053: "entity.name.tag.xml.plist" - 7050-7053: "entity.name.tag.localname.xml.plist" - Data: "key" - 7053-7054: "punctuation.definition.tag.xml.plist" - Data: ">" - 7058-7064: "meta.tag.key.xml.plist" - 7058-7060: "punctuation.definition.tag.xml.plist" - Data: "" - 7072-7124: "" - 7072-7080: "meta.tag.string.xml.plist" - 7072-7073: "punctuation.definition.tag.xml.plist" - Data: "<" - 7073-7079: "entity.name.tag.xml.plist" - 7073-7079: "entity.name.tag.localname.xml.plist" - Data: "string" - 7079-7080: "punctuation.definition.tag.xml.plist" - Data: ">" - 7115-7124: "meta.tag.string.xml.plist" - 7115-7117: "punctuation.definition.tag.xml.plist" - Data: "" - 7131-7138: "meta.tag.dict.xml.plist" - 7131-7133: "punctuation.definition.tag.xml.plist" - Data: "" - 7145-7158: "" - 7145-7150: "meta.tag.key.xml.plist" - 7145-7146: "punctuation.definition.tag.xml.plist" - Data: "<" - 7146-7149: "entity.name.tag.xml.plist" - 7146-7149: "entity.name.tag.localname.xml.plist" - Data: "key" - 7149-7150: "punctuation.definition.tag.xml.plist" - Data: ">" - 7152-7158: "meta.tag.key.xml.plist" - 7152-7154: "punctuation.definition.tag.xml.plist" - Data: "" - 7165-7269: "" - 7165-7171: "meta.tag.dict.xml.plist" - 7165-7166: "punctuation.definition.tag.xml.plist" - Data: "<" - 7166-7170: "entity.name.tag.xml.plist" - 7166-7170: "entity.name.tag.localname.xml.plist" - Data: "dict" - 7170-7171: "punctuation.definition.tag.xml.plist" - Data: ">" - 7179-7194: "" - 7179-7184: "meta.tag.key.xml.plist" - 7179-7180: "punctuation.definition.tag.xml.plist" - Data: "<" - 7180-7183: "entity.name.tag.xml.plist" - 7180-7183: "entity.name.tag.localname.xml.plist" - Data: "key" - 7183-7184: "punctuation.definition.tag.xml.plist" - Data: ">" - 7188-7194: "meta.tag.key.xml.plist" - 7188-7190: "punctuation.definition.tag.xml.plist" - Data: "" - 7202-7255: "" - 7202-7210: "meta.tag.string.xml.plist" - 7202-7203: "punctuation.definition.tag.xml.plist" - Data: "<" - 7203-7209: "entity.name.tag.xml.plist" - 7203-7209: "entity.name.tag.localname.xml.plist" - Data: "string" - 7209-7210: "punctuation.definition.tag.xml.plist" - Data: ">" - 7246-7255: "meta.tag.string.xml.plist" - 7246-7248: "punctuation.definition.tag.xml.plist" - Data: "" - 7262-7269: "meta.tag.dict.xml.plist" - 7262-7264: "punctuation.definition.tag.xml.plist" - Data: "" - 7276-7288: "" - 7276-7281: "meta.tag.key.xml.plist" - 7276-7277: "punctuation.definition.tag.xml.plist" - Data: "<" - 7277-7280: "entity.name.tag.xml.plist" - 7277-7280: "entity.name.tag.localname.xml.plist" - Data: "key" - 7280-7281: "punctuation.definition.tag.xml.plist" - Data: ">" - 7282-7288: "meta.tag.key.xml.plist" - 7282-7284: "punctuation.definition.tag.xml.plist" - Data: "" - 7295-7399: "" - 7295-7301: "meta.tag.dict.xml.plist" - 7295-7296: "punctuation.definition.tag.xml.plist" - Data: "<" - 7296-7300: "entity.name.tag.xml.plist" - 7296-7300: "entity.name.tag.localname.xml.plist" - Data: "dict" - 7300-7301: "punctuation.definition.tag.xml.plist" - Data: ">" - 7309-7324: "" - 7309-7314: "meta.tag.key.xml.plist" - 7309-7310: "punctuation.definition.tag.xml.plist" - Data: "<" - 7310-7313: "entity.name.tag.xml.plist" - 7310-7313: "entity.name.tag.localname.xml.plist" - Data: "key" - 7313-7314: "punctuation.definition.tag.xml.plist" - Data: ">" - 7318-7324: "meta.tag.key.xml.plist" - 7318-7320: "punctuation.definition.tag.xml.plist" - Data: "" - 7332-7385: "" - 7332-7340: "meta.tag.string.xml.plist" - 7332-7333: "punctuation.definition.tag.xml.plist" - Data: "<" - 7333-7339: "entity.name.tag.xml.plist" - 7333-7339: "entity.name.tag.localname.xml.plist" - Data: "string" - 7339-7340: "punctuation.definition.tag.xml.plist" - Data: ">" - 7376-7385: "meta.tag.string.xml.plist" - 7376-7378: "punctuation.definition.tag.xml.plist" - Data: "" - 7392-7399: "meta.tag.dict.xml.plist" - 7392-7394: "punctuation.definition.tag.xml.plist" - Data: "" - 7406-7418: "" - 7406-7411: "meta.tag.key.xml.plist" - 7406-7407: "punctuation.definition.tag.xml.plist" - Data: "<" - 7407-7410: "entity.name.tag.xml.plist" - 7407-7410: "entity.name.tag.localname.xml.plist" - Data: "key" - 7410-7411: "punctuation.definition.tag.xml.plist" - Data: ">" - 7412-7418: "meta.tag.key.xml.plist" - 7412-7414: "punctuation.definition.tag.xml.plist" - Data: "" - 7425-7518: "" - 7425-7431: "meta.tag.dict.xml.plist" - 7425-7426: "punctuation.definition.tag.xml.plist" - Data: "<" - 7426-7430: "entity.name.tag.xml.plist" - 7426-7430: "entity.name.tag.localname.xml.plist" - Data: "dict" - 7430-7431: "punctuation.definition.tag.xml.plist" - Data: ">" - 7439-7454: "" - 7439-7444: "meta.tag.key.xml.plist" - 7439-7440: "punctuation.definition.tag.xml.plist" - Data: "<" - 7440-7443: "entity.name.tag.xml.plist" - 7440-7443: "entity.name.tag.localname.xml.plist" - Data: "key" - 7443-7444: "punctuation.definition.tag.xml.plist" - Data: ">" - 7448-7454: "meta.tag.key.xml.plist" - 7448-7450: "punctuation.definition.tag.xml.plist" - Data: "" - 7462-7504: "" - 7462-7470: "meta.tag.string.xml.plist" - 7462-7463: "punctuation.definition.tag.xml.plist" - Data: "<" - 7463-7469: "entity.name.tag.xml.plist" - 7463-7469: "entity.name.tag.localname.xml.plist" - Data: "string" - 7469-7470: "punctuation.definition.tag.xml.plist" - Data: ">" - 7495-7504: "meta.tag.string.xml.plist" - 7495-7497: "punctuation.definition.tag.xml.plist" - Data: "" - 7511-7518: "meta.tag.dict.xml.plist" - 7511-7513: "punctuation.definition.tag.xml.plist" - Data: "" - 7525-7537: "" - 7525-7530: "meta.tag.key.xml.plist" - 7525-7526: "punctuation.definition.tag.xml.plist" - Data: "<" - 7526-7529: "entity.name.tag.xml.plist" - 7526-7529: "entity.name.tag.localname.xml.plist" - Data: "key" - 7529-7530: "punctuation.definition.tag.xml.plist" - Data: ">" - 7531-7537: "meta.tag.key.xml.plist" - 7531-7533: "punctuation.definition.tag.xml.plist" - Data: "" - 7544-7647: "" - 7544-7550: "meta.tag.dict.xml.plist" - 7544-7545: "punctuation.definition.tag.xml.plist" - Data: "<" - 7545-7549: "entity.name.tag.xml.plist" - 7545-7549: "entity.name.tag.localname.xml.plist" - Data: "dict" - 7549-7550: "punctuation.definition.tag.xml.plist" - Data: ">" - 7558-7573: "" - 7558-7563: "meta.tag.key.xml.plist" - 7558-7559: "punctuation.definition.tag.xml.plist" - Data: "<" - 7559-7562: "entity.name.tag.xml.plist" - 7559-7562: "entity.name.tag.localname.xml.plist" - Data: "key" - 7562-7563: "punctuation.definition.tag.xml.plist" - Data: ">" - 7567-7573: "meta.tag.key.xml.plist" - 7567-7569: "punctuation.definition.tag.xml.plist" - Data: "" - 7581-7633: "" - 7581-7589: "meta.tag.string.xml.plist" - 7581-7582: "punctuation.definition.tag.xml.plist" - Data: "<" - 7582-7588: "entity.name.tag.xml.plist" - 7582-7588: "entity.name.tag.localname.xml.plist" - Data: "string" - 7588-7589: "punctuation.definition.tag.xml.plist" - Data: ">" - 7624-7633: "meta.tag.string.xml.plist" - 7624-7626: "punctuation.definition.tag.xml.plist" - Data: "" - 7640-7647: "meta.tag.dict.xml.plist" - 7640-7642: "punctuation.definition.tag.xml.plist" - Data: "" - 7654-7666: "" - 7654-7659: "meta.tag.key.xml.plist" - 7654-7655: "punctuation.definition.tag.xml.plist" - Data: "<" - 7655-7658: "entity.name.tag.xml.plist" - 7655-7658: "entity.name.tag.localname.xml.plist" - Data: "key" - 7658-7659: "punctuation.definition.tag.xml.plist" - Data: ">" - 7660-7666: "meta.tag.key.xml.plist" - 7660-7662: "punctuation.definition.tag.xml.plist" - Data: "" - 7673-7777: "" - 7673-7679: "meta.tag.dict.xml.plist" - 7673-7674: "punctuation.definition.tag.xml.plist" - Data: "<" - 7674-7678: "entity.name.tag.xml.plist" - 7674-7678: "entity.name.tag.localname.xml.plist" - Data: "dict" - 7678-7679: "punctuation.definition.tag.xml.plist" - Data: ">" - 7687-7702: "" - 7687-7692: "meta.tag.key.xml.plist" - 7687-7688: "punctuation.definition.tag.xml.plist" - Data: "<" - 7688-7691: "entity.name.tag.xml.plist" - 7688-7691: "entity.name.tag.localname.xml.plist" - Data: "key" - 7691-7692: "punctuation.definition.tag.xml.plist" - Data: ">" - 7696-7702: "meta.tag.key.xml.plist" - 7696-7698: "punctuation.definition.tag.xml.plist" - Data: "" - 7710-7763: "" - 7710-7718: "meta.tag.string.xml.plist" - 7710-7711: "punctuation.definition.tag.xml.plist" - Data: "<" - 7711-7717: "entity.name.tag.xml.plist" - 7711-7717: "entity.name.tag.localname.xml.plist" - Data: "string" - 7717-7718: "punctuation.definition.tag.xml.plist" - Data: ">" - 7754-7763: "meta.tag.string.xml.plist" - 7754-7756: "punctuation.definition.tag.xml.plist" - Data: "" - 7770-7777: "meta.tag.dict.xml.plist" - 7770-7772: "punctuation.definition.tag.xml.plist" - Data: "" - 7784-7796: "" - 7784-7789: "meta.tag.key.xml.plist" - 7784-7785: "punctuation.definition.tag.xml.plist" - Data: "<" - 7785-7788: "entity.name.tag.xml.plist" - 7785-7788: "entity.name.tag.localname.xml.plist" - Data: "key" - 7788-7789: "punctuation.definition.tag.xml.plist" - Data: ">" - 7790-7796: "meta.tag.key.xml.plist" - 7790-7792: "punctuation.definition.tag.xml.plist" - Data: "" - 7803-7894: "" - 7803-7809: "meta.tag.dict.xml.plist" - 7803-7804: "punctuation.definition.tag.xml.plist" - Data: "<" - 7804-7808: "entity.name.tag.xml.plist" - 7804-7808: "entity.name.tag.localname.xml.plist" - Data: "dict" - 7808-7809: "punctuation.definition.tag.xml.plist" - Data: ">" - 7817-7832: "" - 7817-7822: "meta.tag.key.xml.plist" - 7817-7818: "punctuation.definition.tag.xml.plist" - Data: "<" - 7818-7821: "entity.name.tag.xml.plist" - 7818-7821: "entity.name.tag.localname.xml.plist" - Data: "key" - 7821-7822: "punctuation.definition.tag.xml.plist" - Data: ">" - 7826-7832: "meta.tag.key.xml.plist" - 7826-7828: "punctuation.definition.tag.xml.plist" - Data: "" - 7840-7880: "" - 7840-7848: "meta.tag.string.xml.plist" - 7840-7841: "punctuation.definition.tag.xml.plist" - Data: "<" - 7841-7847: "entity.name.tag.xml.plist" - 7841-7847: "entity.name.tag.localname.xml.plist" - Data: "string" - 7847-7848: "punctuation.definition.tag.xml.plist" - Data: ">" - 7871-7880: "meta.tag.string.xml.plist" - 7871-7873: "punctuation.definition.tag.xml.plist" - Data: "" - 7887-7894: "meta.tag.dict.xml.plist" - 7887-7889: "punctuation.definition.tag.xml.plist" - Data: "" - 7901-7913: "" - 7901-7906: "meta.tag.key.xml.plist" - 7901-7902: "punctuation.definition.tag.xml.plist" - Data: "<" - 7902-7905: "entity.name.tag.xml.plist" - 7902-7905: "entity.name.tag.localname.xml.plist" - Data: "key" - 7905-7906: "punctuation.definition.tag.xml.plist" - Data: ">" - 7907-7913: "meta.tag.key.xml.plist" - 7907-7909: "punctuation.definition.tag.xml.plist" - Data: "" - 7920-8024: "" - 7920-7926: "meta.tag.dict.xml.plist" - 7920-7921: "punctuation.definition.tag.xml.plist" - Data: "<" - 7921-7925: "entity.name.tag.xml.plist" - 7921-7925: "entity.name.tag.localname.xml.plist" - Data: "dict" - 7925-7926: "punctuation.definition.tag.xml.plist" - Data: ">" - 7934-7949: "" - 7934-7939: "meta.tag.key.xml.plist" - 7934-7935: "punctuation.definition.tag.xml.plist" - Data: "<" - 7935-7938: "entity.name.tag.xml.plist" - 7935-7938: "entity.name.tag.localname.xml.plist" - Data: "key" - 7938-7939: "punctuation.definition.tag.xml.plist" - Data: ">" - 7943-7949: "meta.tag.key.xml.plist" - 7943-7945: "punctuation.definition.tag.xml.plist" - Data: "" - 7957-8010: "" - 7957-7965: "meta.tag.string.xml.plist" - 7957-7958: "punctuation.definition.tag.xml.plist" - Data: "<" - 7958-7964: "entity.name.tag.xml.plist" - 7958-7964: "entity.name.tag.localname.xml.plist" - Data: "string" - 7964-7965: "punctuation.definition.tag.xml.plist" - Data: ">" - 8001-8010: "meta.tag.string.xml.plist" - 8001-8003: "punctuation.definition.tag.xml.plist" - Data: "" - 8017-8024: "meta.tag.dict.xml.plist" - 8017-8019: "punctuation.definition.tag.xml.plist" - Data: "" - 8031-8043: "" - 8031-8036: "meta.tag.key.xml.plist" - 8031-8032: "punctuation.definition.tag.xml.plist" - Data: "<" - 8032-8035: "entity.name.tag.xml.plist" - 8032-8035: "entity.name.tag.localname.xml.plist" - Data: "key" - 8035-8036: "punctuation.definition.tag.xml.plist" - Data: ">" - 8037-8043: "meta.tag.key.xml.plist" - 8037-8039: "punctuation.definition.tag.xml.plist" - Data: "" - 8050-8155: "" - 8050-8056: "meta.tag.dict.xml.plist" - 8050-8051: "punctuation.definition.tag.xml.plist" - Data: "<" - 8051-8055: "entity.name.tag.xml.plist" - 8051-8055: "entity.name.tag.localname.xml.plist" - Data: "dict" - 8055-8056: "punctuation.definition.tag.xml.plist" - Data: ">" - 8064-8079: "" - 8064-8069: "meta.tag.key.xml.plist" - 8064-8065: "punctuation.definition.tag.xml.plist" - Data: "<" - 8065-8068: "entity.name.tag.xml.plist" - 8065-8068: "entity.name.tag.localname.xml.plist" - Data: "key" - 8068-8069: "punctuation.definition.tag.xml.plist" - Data: ">" - 8073-8079: "meta.tag.key.xml.plist" - 8073-8075: "punctuation.definition.tag.xml.plist" - Data: "" - 8087-8141: "" - 8087-8095: "meta.tag.string.xml.plist" - 8087-8088: "punctuation.definition.tag.xml.plist" - Data: "<" - 8088-8094: "entity.name.tag.xml.plist" - 8088-8094: "entity.name.tag.localname.xml.plist" - Data: "string" - 8094-8095: "punctuation.definition.tag.xml.plist" - Data: ">" - 8132-8141: "meta.tag.string.xml.plist" - 8132-8134: "punctuation.definition.tag.xml.plist" - Data: "" - 8148-8155: "meta.tag.dict.xml.plist" - 8148-8150: "punctuation.definition.tag.xml.plist" - Data: "" - 8162-8174: "" - 8162-8167: "meta.tag.key.xml.plist" - 8162-8163: "punctuation.definition.tag.xml.plist" - Data: "<" - 8163-8166: "entity.name.tag.xml.plist" - 8163-8166: "entity.name.tag.localname.xml.plist" - Data: "key" - 8166-8167: "punctuation.definition.tag.xml.plist" - Data: ">" - 8168-8174: "meta.tag.key.xml.plist" - 8168-8170: "punctuation.definition.tag.xml.plist" - Data: "" - 8181-8274: "" - 8181-8187: "meta.tag.dict.xml.plist" - 8181-8182: "punctuation.definition.tag.xml.plist" - Data: "<" - 8182-8186: "entity.name.tag.xml.plist" - 8182-8186: "entity.name.tag.localname.xml.plist" - Data: "dict" - 8186-8187: "punctuation.definition.tag.xml.plist" - Data: ">" - 8195-8210: "" - 8195-8200: "meta.tag.key.xml.plist" - 8195-8196: "punctuation.definition.tag.xml.plist" - Data: "<" - 8196-8199: "entity.name.tag.xml.plist" - 8196-8199: "entity.name.tag.localname.xml.plist" - Data: "key" - 8199-8200: "punctuation.definition.tag.xml.plist" - Data: ">" - 8204-8210: "meta.tag.key.xml.plist" - 8204-8206: "punctuation.definition.tag.xml.plist" - Data: "" - 8218-8260: "" - 8218-8226: "meta.tag.string.xml.plist" - 8218-8219: "punctuation.definition.tag.xml.plist" - Data: "<" - 8219-8225: "entity.name.tag.xml.plist" - 8219-8225: "entity.name.tag.localname.xml.plist" - Data: "string" - 8225-8226: "punctuation.definition.tag.xml.plist" - Data: ">" - 8251-8260: "meta.tag.string.xml.plist" - 8251-8253: "punctuation.definition.tag.xml.plist" - Data: "" - 8267-8274: "meta.tag.dict.xml.plist" - 8267-8269: "punctuation.definition.tag.xml.plist" - Data: "" - 8280-8287: "meta.tag.dict.xml.plist" - 8280-8282: "punctuation.definition.tag.xml.plist" - Data: "" - 8293-8311: "" - 8293-8298: "meta.tag.key.xml.plist" - 8293-8294: "punctuation.definition.tag.xml.plist" - Data: "<" - 8294-8297: "entity.name.tag.xml.plist" - 8294-8297: "entity.name.tag.localname.xml.plist" - Data: "key" - 8297-8298: "punctuation.definition.tag.xml.plist" - Data: ">" - 8305-8311: "meta.tag.key.xml.plist" - 8305-8307: "punctuation.definition.tag.xml.plist" - Data: "" - 8317-8355: "" - 8317-8325: "meta.tag.string.xml.plist" - 8317-8318: "punctuation.definition.tag.xml.plist" - Data: "<" - 8318-8324: "entity.name.tag.xml.plist" - 8318-8324: "entity.name.tag.localname.xml.plist" - Data: "string" - 8324-8325: "punctuation.definition.tag.xml.plist" - Data: ">" - 8346-8355: "meta.tag.string.xml.plist" - 8346-8348: "punctuation.definition.tag.xml.plist" - Data: "" - 8361-8377: "" - 8361-8366: "meta.tag.key.xml.plist" - 8361-8362: "punctuation.definition.tag.xml.plist" - Data: "<" - 8362-8365: "entity.name.tag.xml.plist" - 8362-8365: "entity.name.tag.localname.xml.plist" - Data: "key" - 8365-8366: "punctuation.definition.tag.xml.plist" - Data: ">" - 8371-8377: "meta.tag.key.xml.plist" - 8371-8373: "punctuation.definition.tag.xml.plist" - Data: "" - 8383-8447: "" - 8383-8391: "meta.tag.string.xml.plist" - 8383-8384: "punctuation.definition.tag.xml.plist" - Data: "<" - 8384-8390: "entity.name.tag.xml.plist" - 8384-8390: "entity.name.tag.localname.xml.plist" - Data: "string" - 8390-8391: "punctuation.definition.tag.xml.plist" - Data: ">" - 8438-8447: "meta.tag.string.xml.plist" - 8438-8440: "punctuation.definition.tag.xml.plist" - Data: "" - 8452-8459: "meta.tag.dict.xml.plist" - 8452-8454: "punctuation.definition.tag.xml.plist" - Data: "" - 8464-10074: "" - 8464-8470: "meta.tag.dict.xml.plist" - 8464-8465: "punctuation.definition.tag.xml.plist" - Data: "<" - 8465-8469: "entity.name.tag.xml.plist" - 8465-8469: "entity.name.tag.localname.xml.plist" - Data: "dict" - 8469-8470: "punctuation.definition.tag.xml.plist" - Data: ">" - 8476-8495: "" - 8476-8481: "meta.tag.key.xml.plist" - 8476-8477: "punctuation.definition.tag.xml.plist" - Data: "<" - 8477-8480: "entity.name.tag.xml.plist" - 8477-8480: "entity.name.tag.localname.xml.plist" - Data: "key" - 8480-8481: "punctuation.definition.tag.xml.plist" - Data: ">" - 8489-8495: "meta.tag.key.xml.plist" - 8489-8491: "punctuation.definition.tag.xml.plist" - Data: "" - 8501-9905: "" - 8501-8507: "meta.tag.dict.xml.plist" - 8501-8502: "punctuation.definition.tag.xml.plist" - Data: "<" - 8502-8506: "entity.name.tag.xml.plist" - 8502-8506: "entity.name.tag.localname.xml.plist" - Data: "dict" - 8506-8507: "punctuation.definition.tag.xml.plist" - Data: ">" - 8514-8526: "" - 8514-8519: "meta.tag.key.xml.plist" - 8514-8515: "punctuation.definition.tag.xml.plist" - Data: "<" - 8515-8518: "entity.name.tag.xml.plist" - 8515-8518: "entity.name.tag.localname.xml.plist" - Data: "key" - 8518-8519: "punctuation.definition.tag.xml.plist" - Data: ">" - 8520-8526: "meta.tag.key.xml.plist" - 8520-8522: "punctuation.definition.tag.xml.plist" - Data: "" - 8533-8625: "" - 8533-8539: "meta.tag.dict.xml.plist" - 8533-8534: "punctuation.definition.tag.xml.plist" - Data: "<" - 8534-8538: "entity.name.tag.xml.plist" - 8534-8538: "entity.name.tag.localname.xml.plist" - Data: "dict" - 8538-8539: "punctuation.definition.tag.xml.plist" - Data: ">" - 8547-8562: "" - 8547-8552: "meta.tag.key.xml.plist" - 8547-8548: "punctuation.definition.tag.xml.plist" - Data: "<" - 8548-8551: "entity.name.tag.xml.plist" - 8548-8551: "entity.name.tag.localname.xml.plist" - Data: "key" - 8551-8552: "punctuation.definition.tag.xml.plist" - Data: ">" - 8556-8562: "meta.tag.key.xml.plist" - 8556-8558: "punctuation.definition.tag.xml.plist" - Data: "" - 8570-8611: "" - 8570-8578: "meta.tag.string.xml.plist" - 8570-8571: "punctuation.definition.tag.xml.plist" - Data: "<" - 8571-8577: "entity.name.tag.xml.plist" - 8571-8577: "entity.name.tag.localname.xml.plist" - Data: "string" - 8577-8578: "punctuation.definition.tag.xml.plist" - Data: ">" - 8602-8611: "meta.tag.string.xml.plist" - 8602-8604: "punctuation.definition.tag.xml.plist" - Data: "" - 8618-8625: "meta.tag.dict.xml.plist" - 8618-8620: "punctuation.definition.tag.xml.plist" - Data: "" - 8632-8645: "" - 8632-8637: "meta.tag.key.xml.plist" - 8632-8633: "punctuation.definition.tag.xml.plist" - Data: "<" - 8633-8636: "entity.name.tag.xml.plist" - 8633-8636: "entity.name.tag.localname.xml.plist" - Data: "key" - 8636-8637: "punctuation.definition.tag.xml.plist" - Data: ">" - 8639-8645: "meta.tag.key.xml.plist" - 8639-8641: "punctuation.definition.tag.xml.plist" - Data: "" - 8652-8755: "" - 8652-8658: "meta.tag.dict.xml.plist" - 8652-8653: "punctuation.definition.tag.xml.plist" - Data: "<" - 8653-8657: "entity.name.tag.xml.plist" - 8653-8657: "entity.name.tag.localname.xml.plist" - Data: "dict" - 8657-8658: "punctuation.definition.tag.xml.plist" - Data: ">" - 8666-8681: "" - 8666-8671: "meta.tag.key.xml.plist" - 8666-8667: "punctuation.definition.tag.xml.plist" - Data: "<" - 8667-8670: "entity.name.tag.xml.plist" - 8667-8670: "entity.name.tag.localname.xml.plist" - Data: "key" - 8670-8671: "punctuation.definition.tag.xml.plist" - Data: ">" - 8675-8681: "meta.tag.key.xml.plist" - 8675-8677: "punctuation.definition.tag.xml.plist" - Data: "" - 8689-8741: "" - 8689-8697: "meta.tag.string.xml.plist" - 8689-8690: "punctuation.definition.tag.xml.plist" - Data: "<" - 8690-8696: "entity.name.tag.xml.plist" - 8690-8696: "entity.name.tag.localname.xml.plist" - Data: "string" - 8696-8697: "punctuation.definition.tag.xml.plist" - Data: ">" - 8732-8741: "meta.tag.string.xml.plist" - 8732-8734: "punctuation.definition.tag.xml.plist" - Data: "" - 8748-8755: "meta.tag.dict.xml.plist" - 8748-8750: "punctuation.definition.tag.xml.plist" - Data: "" - 8762-8775: "" - 8762-8767: "meta.tag.key.xml.plist" - 8762-8763: "punctuation.definition.tag.xml.plist" - Data: "<" - 8763-8766: "entity.name.tag.xml.plist" - 8763-8766: "entity.name.tag.localname.xml.plist" - Data: "key" - 8766-8767: "punctuation.definition.tag.xml.plist" - Data: ">" - 8769-8775: "meta.tag.key.xml.plist" - 8769-8771: "punctuation.definition.tag.xml.plist" - Data: "" - 8782-8886: "" - 8782-8788: "meta.tag.dict.xml.plist" - 8782-8783: "punctuation.definition.tag.xml.plist" - Data: "<" - 8783-8787: "entity.name.tag.xml.plist" - 8783-8787: "entity.name.tag.localname.xml.plist" - Data: "dict" - 8787-8788: "punctuation.definition.tag.xml.plist" - Data: ">" - 8796-8811: "" - 8796-8801: "meta.tag.key.xml.plist" - 8796-8797: "punctuation.definition.tag.xml.plist" - Data: "<" - 8797-8800: "entity.name.tag.xml.plist" - 8797-8800: "entity.name.tag.localname.xml.plist" - Data: "key" - 8800-8801: "punctuation.definition.tag.xml.plist" - Data: ">" - 8805-8811: "meta.tag.key.xml.plist" - 8805-8807: "punctuation.definition.tag.xml.plist" - Data: "" - 8819-8872: "" - 8819-8827: "meta.tag.string.xml.plist" - 8819-8820: "punctuation.definition.tag.xml.plist" - Data: "<" - 8820-8826: "entity.name.tag.xml.plist" - 8820-8826: "entity.name.tag.localname.xml.plist" - Data: "string" - 8826-8827: "punctuation.definition.tag.xml.plist" - Data: ">" - 8863-8872: "meta.tag.string.xml.plist" - 8863-8865: "punctuation.definition.tag.xml.plist" - Data: "" - 8879-8886: "meta.tag.dict.xml.plist" - 8879-8881: "punctuation.definition.tag.xml.plist" - Data: "" - 8893-8905: "" - 8893-8898: "meta.tag.key.xml.plist" - 8893-8894: "punctuation.definition.tag.xml.plist" - Data: "<" - 8894-8897: "entity.name.tag.xml.plist" - 8894-8897: "entity.name.tag.localname.xml.plist" - Data: "key" - 8897-8898: "punctuation.definition.tag.xml.plist" - Data: ">" - 8899-8905: "meta.tag.key.xml.plist" - 8899-8901: "punctuation.definition.tag.xml.plist" - Data: "" - 8912-9016: "" - 8912-8918: "meta.tag.dict.xml.plist" - 8912-8913: "punctuation.definition.tag.xml.plist" - Data: "<" - 8913-8917: "entity.name.tag.xml.plist" - 8913-8917: "entity.name.tag.localname.xml.plist" - Data: "dict" - 8917-8918: "punctuation.definition.tag.xml.plist" - Data: ">" - 8926-8941: "" - 8926-8931: "meta.tag.key.xml.plist" - 8926-8927: "punctuation.definition.tag.xml.plist" - Data: "<" - 8927-8930: "entity.name.tag.xml.plist" - 8927-8930: "entity.name.tag.localname.xml.plist" - Data: "key" - 8930-8931: "punctuation.definition.tag.xml.plist" - Data: ">" - 8935-8941: "meta.tag.key.xml.plist" - 8935-8937: "punctuation.definition.tag.xml.plist" - Data: "" - 8949-9002: "" - 8949-8957: "meta.tag.string.xml.plist" - 8949-8950: "punctuation.definition.tag.xml.plist" - Data: "<" - 8950-8956: "entity.name.tag.xml.plist" - 8950-8956: "entity.name.tag.localname.xml.plist" - Data: "string" - 8956-8957: "punctuation.definition.tag.xml.plist" - Data: ">" - 8993-9002: "meta.tag.string.xml.plist" - 8993-8995: "punctuation.definition.tag.xml.plist" - Data: "" - 9009-9016: "meta.tag.dict.xml.plist" - 9009-9011: "punctuation.definition.tag.xml.plist" - Data: "" - 9023-9035: "" - 9023-9028: "meta.tag.key.xml.plist" - 9023-9024: "punctuation.definition.tag.xml.plist" - Data: "<" - 9024-9027: "entity.name.tag.xml.plist" - 9024-9027: "entity.name.tag.localname.xml.plist" - Data: "key" - 9027-9028: "punctuation.definition.tag.xml.plist" - Data: ">" - 9029-9035: "meta.tag.key.xml.plist" - 9029-9031: "punctuation.definition.tag.xml.plist" - Data: "" - 9042-9135: "" - 9042-9048: "meta.tag.dict.xml.plist" - 9042-9043: "punctuation.definition.tag.xml.plist" - Data: "<" - 9043-9047: "entity.name.tag.xml.plist" - 9043-9047: "entity.name.tag.localname.xml.plist" - Data: "dict" - 9047-9048: "punctuation.definition.tag.xml.plist" - Data: ">" - 9056-9071: "" - 9056-9061: "meta.tag.key.xml.plist" - 9056-9057: "punctuation.definition.tag.xml.plist" - Data: "<" - 9057-9060: "entity.name.tag.xml.plist" - 9057-9060: "entity.name.tag.localname.xml.plist" - Data: "key" - 9060-9061: "punctuation.definition.tag.xml.plist" - Data: ">" - 9065-9071: "meta.tag.key.xml.plist" - 9065-9067: "punctuation.definition.tag.xml.plist" - Data: "" - 9079-9121: "" - 9079-9087: "meta.tag.string.xml.plist" - 9079-9080: "punctuation.definition.tag.xml.plist" - Data: "<" - 9080-9086: "entity.name.tag.xml.plist" - 9080-9086: "entity.name.tag.localname.xml.plist" - Data: "string" - 9086-9087: "punctuation.definition.tag.xml.plist" - Data: ">" - 9112-9121: "meta.tag.string.xml.plist" - 9112-9114: "punctuation.definition.tag.xml.plist" - Data: "" - 9128-9135: "meta.tag.dict.xml.plist" - 9128-9130: "punctuation.definition.tag.xml.plist" - Data: "" - 9142-9154: "" - 9142-9147: "meta.tag.key.xml.plist" - 9142-9143: "punctuation.definition.tag.xml.plist" - Data: "<" - 9143-9146: "entity.name.tag.xml.plist" - 9143-9146: "entity.name.tag.localname.xml.plist" - Data: "key" - 9146-9147: "punctuation.definition.tag.xml.plist" - Data: ">" - 9148-9154: "meta.tag.key.xml.plist" - 9148-9150: "punctuation.definition.tag.xml.plist" - Data: "" - 9161-9264: "" - 9161-9167: "meta.tag.dict.xml.plist" - 9161-9162: "punctuation.definition.tag.xml.plist" - Data: "<" - 9162-9166: "entity.name.tag.xml.plist" - 9162-9166: "entity.name.tag.localname.xml.plist" - Data: "dict" - 9166-9167: "punctuation.definition.tag.xml.plist" - Data: ">" - 9175-9190: "" - 9175-9180: "meta.tag.key.xml.plist" - 9175-9176: "punctuation.definition.tag.xml.plist" - Data: "<" - 9176-9179: "entity.name.tag.xml.plist" - 9176-9179: "entity.name.tag.localname.xml.plist" - Data: "key" - 9179-9180: "punctuation.definition.tag.xml.plist" - Data: ">" - 9184-9190: "meta.tag.key.xml.plist" - 9184-9186: "punctuation.definition.tag.xml.plist" - Data: "" - 9198-9250: "" - 9198-9206: "meta.tag.string.xml.plist" - 9198-9199: "punctuation.definition.tag.xml.plist" - Data: "<" - 9199-9205: "entity.name.tag.xml.plist" - 9199-9205: "entity.name.tag.localname.xml.plist" - Data: "string" - 9205-9206: "punctuation.definition.tag.xml.plist" - Data: ">" - 9241-9250: "meta.tag.string.xml.plist" - 9241-9243: "punctuation.definition.tag.xml.plist" - Data: "" - 9257-9264: "meta.tag.dict.xml.plist" - 9257-9259: "punctuation.definition.tag.xml.plist" - Data: "" - 9271-9283: "" - 9271-9276: "meta.tag.key.xml.plist" - 9271-9272: "punctuation.definition.tag.xml.plist" - Data: "<" - 9272-9275: "entity.name.tag.xml.plist" - 9272-9275: "entity.name.tag.localname.xml.plist" - Data: "key" - 9275-9276: "punctuation.definition.tag.xml.plist" - Data: ">" - 9277-9283: "meta.tag.key.xml.plist" - 9277-9279: "punctuation.definition.tag.xml.plist" - Data: "" - 9290-9394: "" - 9290-9296: "meta.tag.dict.xml.plist" - 9290-9291: "punctuation.definition.tag.xml.plist" - Data: "<" - 9291-9295: "entity.name.tag.xml.plist" - 9291-9295: "entity.name.tag.localname.xml.plist" - Data: "dict" - 9295-9296: "punctuation.definition.tag.xml.plist" - Data: ">" - 9304-9319: "" - 9304-9309: "meta.tag.key.xml.plist" - 9304-9305: "punctuation.definition.tag.xml.plist" - Data: "<" - 9305-9308: "entity.name.tag.xml.plist" - 9305-9308: "entity.name.tag.localname.xml.plist" - Data: "key" - 9308-9309: "punctuation.definition.tag.xml.plist" - Data: ">" - 9313-9319: "meta.tag.key.xml.plist" - 9313-9315: "punctuation.definition.tag.xml.plist" - Data: "" - 9327-9380: "" - 9327-9335: "meta.tag.string.xml.plist" - 9327-9328: "punctuation.definition.tag.xml.plist" - Data: "<" - 9328-9334: "entity.name.tag.xml.plist" - 9328-9334: "entity.name.tag.localname.xml.plist" - Data: "string" - 9334-9335: "punctuation.definition.tag.xml.plist" - Data: ">" - 9371-9380: "meta.tag.string.xml.plist" - 9371-9373: "punctuation.definition.tag.xml.plist" - Data: "" - 9387-9394: "meta.tag.dict.xml.plist" - 9387-9389: "punctuation.definition.tag.xml.plist" - Data: "" - 9401-9413: "" - 9401-9406: "meta.tag.key.xml.plist" - 9401-9402: "punctuation.definition.tag.xml.plist" - Data: "<" - 9402-9405: "entity.name.tag.xml.plist" - 9402-9405: "entity.name.tag.localname.xml.plist" - Data: "key" - 9405-9406: "punctuation.definition.tag.xml.plist" - Data: ">" - 9407-9413: "meta.tag.key.xml.plist" - 9407-9409: "punctuation.definition.tag.xml.plist" - Data: "" - 9420-9512: "" - 9420-9426: "meta.tag.dict.xml.plist" - 9420-9421: "punctuation.definition.tag.xml.plist" - Data: "<" - 9421-9425: "entity.name.tag.xml.plist" - 9421-9425: "entity.name.tag.localname.xml.plist" - Data: "dict" - 9425-9426: "punctuation.definition.tag.xml.plist" - Data: ">" - 9434-9449: "" - 9434-9439: "meta.tag.key.xml.plist" - 9434-9435: "punctuation.definition.tag.xml.plist" - Data: "<" - 9435-9438: "entity.name.tag.xml.plist" - 9435-9438: "entity.name.tag.localname.xml.plist" - Data: "key" - 9438-9439: "punctuation.definition.tag.xml.plist" - Data: ">" - 9443-9449: "meta.tag.key.xml.plist" - 9443-9445: "punctuation.definition.tag.xml.plist" - Data: "" - 9457-9498: "" - 9457-9465: "meta.tag.string.xml.plist" - 9457-9458: "punctuation.definition.tag.xml.plist" - Data: "<" - 9458-9464: "entity.name.tag.xml.plist" - 9458-9464: "entity.name.tag.localname.xml.plist" - Data: "string" - 9464-9465: "punctuation.definition.tag.xml.plist" - Data: ">" - 9489-9498: "meta.tag.string.xml.plist" - 9489-9491: "punctuation.definition.tag.xml.plist" - Data: "" - 9505-9512: "meta.tag.dict.xml.plist" - 9505-9507: "punctuation.definition.tag.xml.plist" - Data: "" - 9519-9531: "" - 9519-9524: "meta.tag.key.xml.plist" - 9519-9520: "punctuation.definition.tag.xml.plist" - Data: "<" - 9520-9523: "entity.name.tag.xml.plist" - 9520-9523: "entity.name.tag.localname.xml.plist" - Data: "key" - 9523-9524: "punctuation.definition.tag.xml.plist" - Data: ">" - 9525-9531: "meta.tag.key.xml.plist" - 9525-9527: "punctuation.definition.tag.xml.plist" - Data: "" - 9538-9642: "" - 9538-9544: "meta.tag.dict.xml.plist" - 9538-9539: "punctuation.definition.tag.xml.plist" - Data: "<" - 9539-9543: "entity.name.tag.xml.plist" - 9539-9543: "entity.name.tag.localname.xml.plist" - Data: "dict" - 9543-9544: "punctuation.definition.tag.xml.plist" - Data: ">" - 9552-9567: "" - 9552-9557: "meta.tag.key.xml.plist" - 9552-9553: "punctuation.definition.tag.xml.plist" - Data: "<" - 9553-9556: "entity.name.tag.xml.plist" - 9553-9556: "entity.name.tag.localname.xml.plist" - Data: "key" - 9556-9557: "punctuation.definition.tag.xml.plist" - Data: ">" - 9561-9567: "meta.tag.key.xml.plist" - 9561-9563: "punctuation.definition.tag.xml.plist" - Data: "" - 9575-9628: "" - 9575-9583: "meta.tag.string.xml.plist" - 9575-9576: "punctuation.definition.tag.xml.plist" - Data: "<" - 9576-9582: "entity.name.tag.xml.plist" - 9576-9582: "entity.name.tag.localname.xml.plist" - Data: "string" - 9582-9583: "punctuation.definition.tag.xml.plist" - Data: ">" - 9619-9628: "meta.tag.string.xml.plist" - 9619-9621: "punctuation.definition.tag.xml.plist" - Data: "" - 9635-9642: "meta.tag.dict.xml.plist" - 9635-9637: "punctuation.definition.tag.xml.plist" - Data: "" - 9649-9661: "" - 9649-9654: "meta.tag.key.xml.plist" - 9649-9650: "punctuation.definition.tag.xml.plist" - Data: "<" - 9650-9653: "entity.name.tag.xml.plist" - 9650-9653: "entity.name.tag.localname.xml.plist" - Data: "key" - 9653-9654: "punctuation.definition.tag.xml.plist" - Data: ">" - 9655-9661: "meta.tag.key.xml.plist" - 9655-9657: "punctuation.definition.tag.xml.plist" - Data: "" - 9668-9773: "" - 9668-9674: "meta.tag.dict.xml.plist" - 9668-9669: "punctuation.definition.tag.xml.plist" - Data: "<" - 9669-9673: "entity.name.tag.xml.plist" - 9669-9673: "entity.name.tag.localname.xml.plist" - Data: "dict" - 9673-9674: "punctuation.definition.tag.xml.plist" - Data: ">" - 9682-9697: "" - 9682-9687: "meta.tag.key.xml.plist" - 9682-9683: "punctuation.definition.tag.xml.plist" - Data: "<" - 9683-9686: "entity.name.tag.xml.plist" - 9683-9686: "entity.name.tag.localname.xml.plist" - Data: "key" - 9686-9687: "punctuation.definition.tag.xml.plist" - Data: ">" - 9691-9697: "meta.tag.key.xml.plist" - 9691-9693: "punctuation.definition.tag.xml.plist" - Data: "" - 9705-9759: "" - 9705-9713: "meta.tag.string.xml.plist" - 9705-9706: "punctuation.definition.tag.xml.plist" - Data: "<" - 9706-9712: "entity.name.tag.xml.plist" - 9706-9712: "entity.name.tag.localname.xml.plist" - Data: "string" - 9712-9713: "punctuation.definition.tag.xml.plist" - Data: ">" - 9750-9759: "meta.tag.string.xml.plist" - 9750-9752: "punctuation.definition.tag.xml.plist" - Data: "" - 9766-9773: "meta.tag.dict.xml.plist" - 9766-9768: "punctuation.definition.tag.xml.plist" - Data: "" - 9780-9792: "" - 9780-9785: "meta.tag.key.xml.plist" - 9780-9781: "punctuation.definition.tag.xml.plist" - Data: "<" - 9781-9784: "entity.name.tag.xml.plist" - 9781-9784: "entity.name.tag.localname.xml.plist" - Data: "key" - 9784-9785: "punctuation.definition.tag.xml.plist" - Data: ">" - 9786-9792: "meta.tag.key.xml.plist" - 9786-9788: "punctuation.definition.tag.xml.plist" - Data: "" - 9799-9892: "" - 9799-9805: "meta.tag.dict.xml.plist" - 9799-9800: "punctuation.definition.tag.xml.plist" - Data: "<" - 9800-9804: "entity.name.tag.xml.plist" - 9800-9804: "entity.name.tag.localname.xml.plist" - Data: "dict" - 9804-9805: "punctuation.definition.tag.xml.plist" - Data: ">" - 9813-9828: "" - 9813-9818: "meta.tag.key.xml.plist" - 9813-9814: "punctuation.definition.tag.xml.plist" - Data: "<" - 9814-9817: "entity.name.tag.xml.plist" - 9814-9817: "entity.name.tag.localname.xml.plist" - Data: "key" - 9817-9818: "punctuation.definition.tag.xml.plist" - Data: ">" - 9822-9828: "meta.tag.key.xml.plist" - 9822-9824: "punctuation.definition.tag.xml.plist" - Data: "" - 9836-9878: "" - 9836-9844: "meta.tag.string.xml.plist" - 9836-9837: "punctuation.definition.tag.xml.plist" - Data: "<" - 9837-9843: "entity.name.tag.xml.plist" - 9837-9843: "entity.name.tag.localname.xml.plist" - Data: "string" - 9843-9844: "punctuation.definition.tag.xml.plist" - Data: ">" - 9869-9878: "meta.tag.string.xml.plist" - 9869-9871: "punctuation.definition.tag.xml.plist" - Data: "" - 9885-9892: "meta.tag.dict.xml.plist" - 9885-9887: "punctuation.definition.tag.xml.plist" - Data: "" - 9898-9905: "meta.tag.dict.xml.plist" - 9898-9900: "punctuation.definition.tag.xml.plist" - Data: "" - 9911-9929: "" - 9911-9916: "meta.tag.key.xml.plist" - 9911-9912: "punctuation.definition.tag.xml.plist" - Data: "<" - 9912-9915: "entity.name.tag.xml.plist" - 9912-9915: "entity.name.tag.localname.xml.plist" - Data: "key" - 9915-9916: "punctuation.definition.tag.xml.plist" - Data: ">" - 9923-9929: "meta.tag.key.xml.plist" - 9923-9925: "punctuation.definition.tag.xml.plist" - Data: "" - 9935-9968: "" - 9935-9943: "meta.tag.string.xml.plist" - 9935-9936: "punctuation.definition.tag.xml.plist" - Data: "<" - 9936-9942: "entity.name.tag.xml.plist" - 9936-9942: "entity.name.tag.localname.xml.plist" - Data: "string" - 9942-9943: "punctuation.definition.tag.xml.plist" - Data: ">" - 9959-9968: "meta.tag.string.xml.plist" - 9959-9961: "punctuation.definition.tag.xml.plist" - Data: "" - 9974-9990: "" - 9974-9979: "meta.tag.key.xml.plist" - 9974-9975: "punctuation.definition.tag.xml.plist" - Data: "<" - 9975-9978: "entity.name.tag.xml.plist" - 9975-9978: "entity.name.tag.localname.xml.plist" - Data: "key" - 9978-9979: "punctuation.definition.tag.xml.plist" - Data: ">" - 9984-9990: "meta.tag.key.xml.plist" - 9984-9986: "punctuation.definition.tag.xml.plist" - Data: "" - 9996-10062: "" - 9996-10004: "meta.tag.string.xml.plist" - 9996-9997: "punctuation.definition.tag.xml.plist" - Data: "<" - 9997-10003: "entity.name.tag.xml.plist" - 9997-10003: "entity.name.tag.localname.xml.plist" - Data: "string" - 10003-10004: "punctuation.definition.tag.xml.plist" - Data: ">" - 10053-10062: "meta.tag.string.xml.plist" - 10053-10055: "punctuation.definition.tag.xml.plist" - Data: "" - 10067-10074: "meta.tag.dict.xml.plist" - 10067-10069: "punctuation.definition.tag.xml.plist" - Data: "" - 10079-11694: "" - 10079-10085: "meta.tag.dict.xml.plist" - 10079-10080: "punctuation.definition.tag.xml.plist" - Data: "<" - 10080-10084: "entity.name.tag.xml.plist" - 10080-10084: "entity.name.tag.localname.xml.plist" - Data: "dict" - 10084-10085: "punctuation.definition.tag.xml.plist" - Data: ">" - 10091-10110: "" - 10091-10096: "meta.tag.key.xml.plist" - 10091-10092: "punctuation.definition.tag.xml.plist" - Data: "<" - 10092-10095: "entity.name.tag.xml.plist" - 10092-10095: "entity.name.tag.localname.xml.plist" - Data: "key" - 10095-10096: "punctuation.definition.tag.xml.plist" - Data: ">" - 10104-10110: "meta.tag.key.xml.plist" - 10104-10106: "punctuation.definition.tag.xml.plist" - Data: "" - 10116-11522: "" - 10116-10122: "meta.tag.dict.xml.plist" - 10116-10117: "punctuation.definition.tag.xml.plist" - Data: "<" - 10117-10121: "entity.name.tag.xml.plist" - 10117-10121: "entity.name.tag.localname.xml.plist" - Data: "dict" - 10121-10122: "punctuation.definition.tag.xml.plist" - Data: ">" - 10129-10141: "" - 10129-10134: "meta.tag.key.xml.plist" - 10129-10130: "punctuation.definition.tag.xml.plist" - Data: "<" - 10130-10133: "entity.name.tag.xml.plist" - 10130-10133: "entity.name.tag.localname.xml.plist" - Data: "key" - 10133-10134: "punctuation.definition.tag.xml.plist" - Data: ">" - 10135-10141: "meta.tag.key.xml.plist" - 10135-10137: "punctuation.definition.tag.xml.plist" - Data: "" - 10148-10241: "" - 10148-10154: "meta.tag.dict.xml.plist" - 10148-10149: "punctuation.definition.tag.xml.plist" - Data: "<" - 10149-10153: "entity.name.tag.xml.plist" - 10149-10153: "entity.name.tag.localname.xml.plist" - Data: "dict" - 10153-10154: "punctuation.definition.tag.xml.plist" - Data: ">" - 10162-10177: "" - 10162-10167: "meta.tag.key.xml.plist" - 10162-10163: "punctuation.definition.tag.xml.plist" - Data: "<" - 10163-10166: "entity.name.tag.xml.plist" - 10163-10166: "entity.name.tag.localname.xml.plist" - Data: "key" - 10166-10167: "punctuation.definition.tag.xml.plist" - Data: ">" - 10171-10177: "meta.tag.key.xml.plist" - 10171-10173: "punctuation.definition.tag.xml.plist" - Data: "" - 10185-10227: "" - 10185-10193: "meta.tag.string.xml.plist" - 10185-10186: "punctuation.definition.tag.xml.plist" - Data: "<" - 10186-10192: "entity.name.tag.xml.plist" - 10186-10192: "entity.name.tag.localname.xml.plist" - Data: "string" - 10192-10193: "punctuation.definition.tag.xml.plist" - Data: ">" - 10218-10227: "meta.tag.string.xml.plist" - 10218-10220: "punctuation.definition.tag.xml.plist" - Data: "" - 10234-10241: "meta.tag.dict.xml.plist" - 10234-10236: "punctuation.definition.tag.xml.plist" - Data: "" - 10248-10261: "" - 10248-10253: "meta.tag.key.xml.plist" - 10248-10249: "punctuation.definition.tag.xml.plist" - Data: "<" - 10249-10252: "entity.name.tag.xml.plist" - 10249-10252: "entity.name.tag.localname.xml.plist" - Data: "key" - 10252-10253: "punctuation.definition.tag.xml.plist" - Data: ">" - 10255-10261: "meta.tag.key.xml.plist" - 10255-10257: "punctuation.definition.tag.xml.plist" - Data: "" - 10268-10371: "" - 10268-10274: "meta.tag.dict.xml.plist" - 10268-10269: "punctuation.definition.tag.xml.plist" - Data: "<" - 10269-10273: "entity.name.tag.xml.plist" - 10269-10273: "entity.name.tag.localname.xml.plist" - Data: "dict" - 10273-10274: "punctuation.definition.tag.xml.plist" - Data: ">" - 10282-10297: "" - 10282-10287: "meta.tag.key.xml.plist" - 10282-10283: "punctuation.definition.tag.xml.plist" - Data: "<" - 10283-10286: "entity.name.tag.xml.plist" - 10283-10286: "entity.name.tag.localname.xml.plist" - Data: "key" - 10286-10287: "punctuation.definition.tag.xml.plist" - Data: ">" - 10291-10297: "meta.tag.key.xml.plist" - 10291-10293: "punctuation.definition.tag.xml.plist" - Data: "" - 10305-10357: "" - 10305-10313: "meta.tag.string.xml.plist" - 10305-10306: "punctuation.definition.tag.xml.plist" - Data: "<" - 10306-10312: "entity.name.tag.xml.plist" - 10306-10312: "entity.name.tag.localname.xml.plist" - Data: "string" - 10312-10313: "punctuation.definition.tag.xml.plist" - Data: ">" - 10348-10357: "meta.tag.string.xml.plist" - 10348-10350: "punctuation.definition.tag.xml.plist" - Data: "" - 10364-10371: "meta.tag.dict.xml.plist" - 10364-10366: "punctuation.definition.tag.xml.plist" - Data: "" - 10378-10391: "" - 10378-10383: "meta.tag.key.xml.plist" - 10378-10379: "punctuation.definition.tag.xml.plist" - Data: "<" - 10379-10382: "entity.name.tag.xml.plist" - 10379-10382: "entity.name.tag.localname.xml.plist" - Data: "key" - 10382-10383: "punctuation.definition.tag.xml.plist" - Data: ">" - 10385-10391: "meta.tag.key.xml.plist" - 10385-10387: "punctuation.definition.tag.xml.plist" - Data: "" - 10398-10502: "" - 10398-10404: "meta.tag.dict.xml.plist" - 10398-10399: "punctuation.definition.tag.xml.plist" - Data: "<" - 10399-10403: "entity.name.tag.xml.plist" - 10399-10403: "entity.name.tag.localname.xml.plist" - Data: "dict" - 10403-10404: "punctuation.definition.tag.xml.plist" - Data: ">" - 10412-10427: "" - 10412-10417: "meta.tag.key.xml.plist" - 10412-10413: "punctuation.definition.tag.xml.plist" - Data: "<" - 10413-10416: "entity.name.tag.xml.plist" - 10413-10416: "entity.name.tag.localname.xml.plist" - Data: "key" - 10416-10417: "punctuation.definition.tag.xml.plist" - Data: ">" - 10421-10427: "meta.tag.key.xml.plist" - 10421-10423: "punctuation.definition.tag.xml.plist" - Data: "" - 10435-10488: "" - 10435-10443: "meta.tag.string.xml.plist" - 10435-10436: "punctuation.definition.tag.xml.plist" - Data: "<" - 10436-10442: "entity.name.tag.xml.plist" - 10436-10442: "entity.name.tag.localname.xml.plist" - Data: "string" - 10442-10443: "punctuation.definition.tag.xml.plist" - Data: ">" - 10479-10488: "meta.tag.string.xml.plist" - 10479-10481: "punctuation.definition.tag.xml.plist" - Data: "" - 10495-10502: "meta.tag.dict.xml.plist" - 10495-10497: "punctuation.definition.tag.xml.plist" - Data: "" - 10509-10521: "" - 10509-10514: "meta.tag.key.xml.plist" - 10509-10510: "punctuation.definition.tag.xml.plist" - Data: "<" - 10510-10513: "entity.name.tag.xml.plist" - 10510-10513: "entity.name.tag.localname.xml.plist" - Data: "key" - 10513-10514: "punctuation.definition.tag.xml.plist" - Data: ">" - 10515-10521: "meta.tag.key.xml.plist" - 10515-10517: "punctuation.definition.tag.xml.plist" - Data: "" - 10528-10632: "" - 10528-10534: "meta.tag.dict.xml.plist" - 10528-10529: "punctuation.definition.tag.xml.plist" - Data: "<" - 10529-10533: "entity.name.tag.xml.plist" - 10529-10533: "entity.name.tag.localname.xml.plist" - Data: "dict" - 10533-10534: "punctuation.definition.tag.xml.plist" - Data: ">" - 10542-10557: "" - 10542-10547: "meta.tag.key.xml.plist" - 10542-10543: "punctuation.definition.tag.xml.plist" - Data: "<" - 10543-10546: "entity.name.tag.xml.plist" - 10543-10546: "entity.name.tag.localname.xml.plist" - Data: "key" - 10546-10547: "punctuation.definition.tag.xml.plist" - Data: ">" - 10551-10557: "meta.tag.key.xml.plist" - 10551-10553: "punctuation.definition.tag.xml.plist" - Data: "" - 10565-10618: "" - 10565-10573: "meta.tag.string.xml.plist" - 10565-10566: "punctuation.definition.tag.xml.plist" - Data: "<" - 10566-10572: "entity.name.tag.xml.plist" - 10566-10572: "entity.name.tag.localname.xml.plist" - Data: "string" - 10572-10573: "punctuation.definition.tag.xml.plist" - Data: ">" - 10609-10618: "meta.tag.string.xml.plist" - 10609-10611: "punctuation.definition.tag.xml.plist" - Data: "" - 10625-10632: "meta.tag.dict.xml.plist" - 10625-10627: "punctuation.definition.tag.xml.plist" - Data: "" - 10639-10651: "" - 10639-10644: "meta.tag.key.xml.plist" - 10639-10640: "punctuation.definition.tag.xml.plist" - Data: "<" - 10640-10643: "entity.name.tag.xml.plist" - 10640-10643: "entity.name.tag.localname.xml.plist" - Data: "key" - 10643-10644: "punctuation.definition.tag.xml.plist" - Data: ">" - 10645-10651: "meta.tag.key.xml.plist" - 10645-10647: "punctuation.definition.tag.xml.plist" - Data: "" - 10658-10751: "" - 10658-10664: "meta.tag.dict.xml.plist" - 10658-10659: "punctuation.definition.tag.xml.plist" - Data: "<" - 10659-10663: "entity.name.tag.xml.plist" - 10659-10663: "entity.name.tag.localname.xml.plist" - Data: "dict" - 10663-10664: "punctuation.definition.tag.xml.plist" - Data: ">" - 10672-10687: "" - 10672-10677: "meta.tag.key.xml.plist" - 10672-10673: "punctuation.definition.tag.xml.plist" - Data: "<" - 10673-10676: "entity.name.tag.xml.plist" - 10673-10676: "entity.name.tag.localname.xml.plist" - Data: "key" - 10676-10677: "punctuation.definition.tag.xml.plist" - Data: ">" - 10681-10687: "meta.tag.key.xml.plist" - 10681-10683: "punctuation.definition.tag.xml.plist" - Data: "" - 10695-10737: "" - 10695-10703: "meta.tag.string.xml.plist" - 10695-10696: "punctuation.definition.tag.xml.plist" - Data: "<" - 10696-10702: "entity.name.tag.xml.plist" - 10696-10702: "entity.name.tag.localname.xml.plist" - Data: "string" - 10702-10703: "punctuation.definition.tag.xml.plist" - Data: ">" - 10728-10737: "meta.tag.string.xml.plist" - 10728-10730: "punctuation.definition.tag.xml.plist" - Data: "" - 10744-10751: "meta.tag.dict.xml.plist" - 10744-10746: "punctuation.definition.tag.xml.plist" - Data: "" - 10758-10770: "" - 10758-10763: "meta.tag.key.xml.plist" - 10758-10759: "punctuation.definition.tag.xml.plist" - Data: "<" - 10759-10762: "entity.name.tag.xml.plist" - 10759-10762: "entity.name.tag.localname.xml.plist" - Data: "key" - 10762-10763: "punctuation.definition.tag.xml.plist" - Data: ">" - 10764-10770: "meta.tag.key.xml.plist" - 10764-10766: "punctuation.definition.tag.xml.plist" - Data: "" - 10777-10880: "" - 10777-10783: "meta.tag.dict.xml.plist" - 10777-10778: "punctuation.definition.tag.xml.plist" - Data: "<" - 10778-10782: "entity.name.tag.xml.plist" - 10778-10782: "entity.name.tag.localname.xml.plist" - Data: "dict" - 10782-10783: "punctuation.definition.tag.xml.plist" - Data: ">" - 10791-10806: "" - 10791-10796: "meta.tag.key.xml.plist" - 10791-10792: "punctuation.definition.tag.xml.plist" - Data: "<" - 10792-10795: "entity.name.tag.xml.plist" - 10792-10795: "entity.name.tag.localname.xml.plist" - Data: "key" - 10795-10796: "punctuation.definition.tag.xml.plist" - Data: ">" - 10800-10806: "meta.tag.key.xml.plist" - 10800-10802: "punctuation.definition.tag.xml.plist" - Data: "" - 10814-10866: "" - 10814-10822: "meta.tag.string.xml.plist" - 10814-10815: "punctuation.definition.tag.xml.plist" - Data: "<" - 10815-10821: "entity.name.tag.xml.plist" - 10815-10821: "entity.name.tag.localname.xml.plist" - Data: "string" - 10821-10822: "punctuation.definition.tag.xml.plist" - Data: ">" - 10857-10866: "meta.tag.string.xml.plist" - 10857-10859: "punctuation.definition.tag.xml.plist" - Data: "" - 10873-10880: "meta.tag.dict.xml.plist" - 10873-10875: "punctuation.definition.tag.xml.plist" - Data: "" - 10887-10899: "" - 10887-10892: "meta.tag.key.xml.plist" - 10887-10888: "punctuation.definition.tag.xml.plist" - Data: "<" - 10888-10891: "entity.name.tag.xml.plist" - 10888-10891: "entity.name.tag.localname.xml.plist" - Data: "key" - 10891-10892: "punctuation.definition.tag.xml.plist" - Data: ">" - 10893-10899: "meta.tag.key.xml.plist" - 10893-10895: "punctuation.definition.tag.xml.plist" - Data: "" - 10906-11010: "" - 10906-10912: "meta.tag.dict.xml.plist" - 10906-10907: "punctuation.definition.tag.xml.plist" - Data: "<" - 10907-10911: "entity.name.tag.xml.plist" - 10907-10911: "entity.name.tag.localname.xml.plist" - Data: "dict" - 10911-10912: "punctuation.definition.tag.xml.plist" - Data: ">" - 10920-10935: "" - 10920-10925: "meta.tag.key.xml.plist" - 10920-10921: "punctuation.definition.tag.xml.plist" - Data: "<" - 10921-10924: "entity.name.tag.xml.plist" - 10921-10924: "entity.name.tag.localname.xml.plist" - Data: "key" - 10924-10925: "punctuation.definition.tag.xml.plist" - Data: ">" - 10929-10935: "meta.tag.key.xml.plist" - 10929-10931: "punctuation.definition.tag.xml.plist" - Data: "" - 10943-10996: "" - 10943-10951: "meta.tag.string.xml.plist" - 10943-10944: "punctuation.definition.tag.xml.plist" - Data: "<" - 10944-10950: "entity.name.tag.xml.plist" - 10944-10950: "entity.name.tag.localname.xml.plist" - Data: "string" - 10950-10951: "punctuation.definition.tag.xml.plist" - Data: ">" - 10987-10996: "meta.tag.string.xml.plist" - 10987-10989: "punctuation.definition.tag.xml.plist" - Data: "" - 11003-11010: "meta.tag.dict.xml.plist" - 11003-11005: "punctuation.definition.tag.xml.plist" - Data: "" - 11017-11029: "" - 11017-11022: "meta.tag.key.xml.plist" - 11017-11018: "punctuation.definition.tag.xml.plist" - Data: "<" - 11018-11021: "entity.name.tag.xml.plist" - 11018-11021: "entity.name.tag.localname.xml.plist" - Data: "key" - 11021-11022: "punctuation.definition.tag.xml.plist" - Data: ">" - 11023-11029: "meta.tag.key.xml.plist" - 11023-11025: "punctuation.definition.tag.xml.plist" - Data: "" - 11036-11129: "" - 11036-11042: "meta.tag.dict.xml.plist" - 11036-11037: "punctuation.definition.tag.xml.plist" - Data: "<" - 11037-11041: "entity.name.tag.xml.plist" - 11037-11041: "entity.name.tag.localname.xml.plist" - Data: "dict" - 11041-11042: "punctuation.definition.tag.xml.plist" - Data: ">" - 11050-11065: "" - 11050-11055: "meta.tag.key.xml.plist" - 11050-11051: "punctuation.definition.tag.xml.plist" - Data: "<" - 11051-11054: "entity.name.tag.xml.plist" - 11051-11054: "entity.name.tag.localname.xml.plist" - Data: "key" - 11054-11055: "punctuation.definition.tag.xml.plist" - Data: ">" - 11059-11065: "meta.tag.key.xml.plist" - 11059-11061: "punctuation.definition.tag.xml.plist" - Data: "" - 11073-11115: "" - 11073-11081: "meta.tag.string.xml.plist" - 11073-11074: "punctuation.definition.tag.xml.plist" - Data: "<" - 11074-11080: "entity.name.tag.xml.plist" - 11074-11080: "entity.name.tag.localname.xml.plist" - Data: "string" - 11080-11081: "punctuation.definition.tag.xml.plist" - Data: ">" - 11106-11115: "meta.tag.string.xml.plist" - 11106-11108: "punctuation.definition.tag.xml.plist" - Data: "" - 11122-11129: "meta.tag.dict.xml.plist" - 11122-11124: "punctuation.definition.tag.xml.plist" - Data: "" - 11136-11148: "" - 11136-11141: "meta.tag.key.xml.plist" - 11136-11137: "punctuation.definition.tag.xml.plist" - Data: "<" - 11137-11140: "entity.name.tag.xml.plist" - 11137-11140: "entity.name.tag.localname.xml.plist" - Data: "key" - 11140-11141: "punctuation.definition.tag.xml.plist" - Data: ">" - 11142-11148: "meta.tag.key.xml.plist" - 11142-11144: "punctuation.definition.tag.xml.plist" - Data: "" - 11155-11259: "" - 11155-11161: "meta.tag.dict.xml.plist" - 11155-11156: "punctuation.definition.tag.xml.plist" - Data: "<" - 11156-11160: "entity.name.tag.xml.plist" - 11156-11160: "entity.name.tag.localname.xml.plist" - Data: "dict" - 11160-11161: "punctuation.definition.tag.xml.plist" - Data: ">" - 11169-11184: "" - 11169-11174: "meta.tag.key.xml.plist" - 11169-11170: "punctuation.definition.tag.xml.plist" - Data: "<" - 11170-11173: "entity.name.tag.xml.plist" - 11170-11173: "entity.name.tag.localname.xml.plist" - Data: "key" - 11173-11174: "punctuation.definition.tag.xml.plist" - Data: ">" - 11178-11184: "meta.tag.key.xml.plist" - 11178-11180: "punctuation.definition.tag.xml.plist" - Data: "" - 11192-11245: "" - 11192-11200: "meta.tag.string.xml.plist" - 11192-11193: "punctuation.definition.tag.xml.plist" - Data: "<" - 11193-11199: "entity.name.tag.xml.plist" - 11193-11199: "entity.name.tag.localname.xml.plist" - Data: "string" - 11199-11200: "punctuation.definition.tag.xml.plist" - Data: ">" - 11236-11245: "meta.tag.string.xml.plist" - 11236-11238: "punctuation.definition.tag.xml.plist" - Data: "" - 11252-11259: "meta.tag.dict.xml.plist" - 11252-11254: "punctuation.definition.tag.xml.plist" - Data: "" - 11266-11278: "" - 11266-11271: "meta.tag.key.xml.plist" - 11266-11267: "punctuation.definition.tag.xml.plist" - Data: "<" - 11267-11270: "entity.name.tag.xml.plist" - 11267-11270: "entity.name.tag.localname.xml.plist" - Data: "key" - 11270-11271: "punctuation.definition.tag.xml.plist" - Data: ">" - 11272-11278: "meta.tag.key.xml.plist" - 11272-11274: "punctuation.definition.tag.xml.plist" - Data: "" - 11285-11390: "" - 11285-11291: "meta.tag.dict.xml.plist" - 11285-11286: "punctuation.definition.tag.xml.plist" - Data: "<" - 11286-11290: "entity.name.tag.xml.plist" - 11286-11290: "entity.name.tag.localname.xml.plist" - Data: "dict" - 11290-11291: "punctuation.definition.tag.xml.plist" - Data: ">" - 11299-11314: "" - 11299-11304: "meta.tag.key.xml.plist" - 11299-11300: "punctuation.definition.tag.xml.plist" - Data: "<" - 11300-11303: "entity.name.tag.xml.plist" - 11300-11303: "entity.name.tag.localname.xml.plist" - Data: "key" - 11303-11304: "punctuation.definition.tag.xml.plist" - Data: ">" - 11308-11314: "meta.tag.key.xml.plist" - 11308-11310: "punctuation.definition.tag.xml.plist" - Data: "" - 11322-11376: "" - 11322-11330: "meta.tag.string.xml.plist" - 11322-11323: "punctuation.definition.tag.xml.plist" - Data: "<" - 11323-11329: "entity.name.tag.xml.plist" - 11323-11329: "entity.name.tag.localname.xml.plist" - Data: "string" - 11329-11330: "punctuation.definition.tag.xml.plist" - Data: ">" - 11367-11376: "meta.tag.string.xml.plist" - 11367-11369: "punctuation.definition.tag.xml.plist" - Data: "" - 11383-11390: "meta.tag.dict.xml.plist" - 11383-11385: "punctuation.definition.tag.xml.plist" - Data: "" - 11397-11409: "" - 11397-11402: "meta.tag.key.xml.plist" - 11397-11398: "punctuation.definition.tag.xml.plist" - Data: "<" - 11398-11401: "entity.name.tag.xml.plist" - 11398-11401: "entity.name.tag.localname.xml.plist" - Data: "key" - 11401-11402: "punctuation.definition.tag.xml.plist" - Data: ">" - 11403-11409: "meta.tag.key.xml.plist" - 11403-11405: "punctuation.definition.tag.xml.plist" - Data: "" - 11416-11509: "" - 11416-11422: "meta.tag.dict.xml.plist" - 11416-11417: "punctuation.definition.tag.xml.plist" - Data: "<" - 11417-11421: "entity.name.tag.xml.plist" - 11417-11421: "entity.name.tag.localname.xml.plist" - Data: "dict" - 11421-11422: "punctuation.definition.tag.xml.plist" - Data: ">" - 11430-11445: "" - 11430-11435: "meta.tag.key.xml.plist" - 11430-11431: "punctuation.definition.tag.xml.plist" - Data: "<" - 11431-11434: "entity.name.tag.xml.plist" - 11431-11434: "entity.name.tag.localname.xml.plist" - Data: "key" - 11434-11435: "punctuation.definition.tag.xml.plist" - Data: ">" - 11439-11445: "meta.tag.key.xml.plist" - 11439-11441: "punctuation.definition.tag.xml.plist" - Data: "" - 11453-11495: "" - 11453-11461: "meta.tag.string.xml.plist" - 11453-11454: "punctuation.definition.tag.xml.plist" - Data: "<" - 11454-11460: "entity.name.tag.xml.plist" - 11454-11460: "entity.name.tag.localname.xml.plist" - Data: "string" - 11460-11461: "punctuation.definition.tag.xml.plist" - Data: ">" - 11486-11495: "meta.tag.string.xml.plist" - 11486-11488: "punctuation.definition.tag.xml.plist" - Data: "" - 11502-11509: "meta.tag.dict.xml.plist" - 11502-11504: "punctuation.definition.tag.xml.plist" - Data: "" - 11515-11522: "meta.tag.dict.xml.plist" - 11515-11517: "punctuation.definition.tag.xml.plist" - Data: "" - 11528-11546: "" - 11528-11533: "meta.tag.key.xml.plist" - 11528-11529: "punctuation.definition.tag.xml.plist" - Data: "<" - 11529-11532: "entity.name.tag.xml.plist" - 11529-11532: "entity.name.tag.localname.xml.plist" - Data: "key" - 11532-11533: "punctuation.definition.tag.xml.plist" - Data: ">" - 11540-11546: "meta.tag.key.xml.plist" - 11540-11542: "punctuation.definition.tag.xml.plist" - Data: "" - 11552-11586: "" - 11552-11560: "meta.tag.string.xml.plist" - 11552-11553: "punctuation.definition.tag.xml.plist" - Data: "<" - 11553-11559: "entity.name.tag.xml.plist" - 11553-11559: "entity.name.tag.localname.xml.plist" - Data: "string" - 11559-11560: "punctuation.definition.tag.xml.plist" - Data: ">" - 11577-11586: "meta.tag.string.xml.plist" - 11577-11579: "punctuation.definition.tag.xml.plist" - Data: "" - 11592-11608: "" - 11592-11597: "meta.tag.key.xml.plist" - 11592-11593: "punctuation.definition.tag.xml.plist" - Data: "<" - 11593-11596: "entity.name.tag.xml.plist" - 11593-11596: "entity.name.tag.localname.xml.plist" - Data: "key" - 11596-11597: "punctuation.definition.tag.xml.plist" - Data: ">" - 11602-11608: "meta.tag.key.xml.plist" - 11602-11604: "punctuation.definition.tag.xml.plist" - Data: "" - 11614-11682: "" - 11614-11622: "meta.tag.string.xml.plist" - 11614-11615: "punctuation.definition.tag.xml.plist" - Data: "<" - 11615-11621: "entity.name.tag.xml.plist" - 11615-11621: "entity.name.tag.localname.xml.plist" - Data: "string" - 11621-11622: "punctuation.definition.tag.xml.plist" - Data: ">" - 11673-11682: "meta.tag.string.xml.plist" - 11673-11675: "punctuation.definition.tag.xml.plist" - Data: "" - 11687-11694: "meta.tag.dict.xml.plist" - 11687-11689: "punctuation.definition.tag.xml.plist" - Data: "" - 11699-13137: "" - 11699-11705: "meta.tag.dict.xml.plist" - 11699-11700: "punctuation.definition.tag.xml.plist" - Data: "<" - 11700-11704: "entity.name.tag.xml.plist" - 11700-11704: "entity.name.tag.localname.xml.plist" - Data: "dict" - 11704-11705: "punctuation.definition.tag.xml.plist" - Data: ">" - 11711-11727: "" - 11711-11716: "meta.tag.key.xml.plist" - 11711-11712: "punctuation.definition.tag.xml.plist" - Data: "<" - 11712-11715: "entity.name.tag.xml.plist" - 11712-11715: "entity.name.tag.localname.xml.plist" - Data: "key" - 11715-11716: "punctuation.definition.tag.xml.plist" - Data: ">" - 11721-11727: "meta.tag.key.xml.plist" - 11721-11723: "punctuation.definition.tag.xml.plist" - Data: "" - 11733-11771: "" - 11733-11741: "meta.tag.string.xml.plist" - 11733-11734: "punctuation.definition.tag.xml.plist" - Data: "<" - 11734-11740: "entity.name.tag.xml.plist" - 11734-11740: "entity.name.tag.localname.xml.plist" - Data: "string" - 11740-11741: "punctuation.definition.tag.xml.plist" - Data: ">" - 11762-11771: "meta.tag.string.xml.plist" - 11762-11764: "punctuation.definition.tag.xml.plist" - Data: "" - 11777-11796: "" - 11777-11782: "meta.tag.key.xml.plist" - 11777-11778: "punctuation.definition.tag.xml.plist" - Data: "<" - 11778-11781: "entity.name.tag.xml.plist" - 11778-11781: "entity.name.tag.localname.xml.plist" - Data: "key" - 11781-11782: "punctuation.definition.tag.xml.plist" - Data: ">" - 11790-11796: "meta.tag.key.xml.plist" - 11790-11792: "punctuation.definition.tag.xml.plist" - Data: "" - 11802-12445: "" - 11802-11808: "meta.tag.dict.xml.plist" - 11802-11803: "punctuation.definition.tag.xml.plist" - Data: "<" - 11803-11807: "entity.name.tag.xml.plist" - 11803-11807: "entity.name.tag.localname.xml.plist" - Data: "dict" - 11807-11808: "punctuation.definition.tag.xml.plist" - Data: ">" - 11815-11827: "" - 11815-11820: "meta.tag.key.xml.plist" - 11815-11816: "punctuation.definition.tag.xml.plist" - Data: "<" - 11816-11819: "entity.name.tag.xml.plist" - 11816-11819: "entity.name.tag.localname.xml.plist" - Data: "key" - 11819-11820: "punctuation.definition.tag.xml.plist" - Data: ">" - 11821-11827: "meta.tag.key.xml.plist" - 11821-11823: "punctuation.definition.tag.xml.plist" - Data: "" - 11834-11924: "" - 11834-11840: "meta.tag.dict.xml.plist" - 11834-11835: "punctuation.definition.tag.xml.plist" - Data: "<" - 11835-11839: "entity.name.tag.xml.plist" - 11835-11839: "entity.name.tag.localname.xml.plist" - Data: "dict" - 11839-11840: "punctuation.definition.tag.xml.plist" - Data: ">" - 11848-11863: "" - 11848-11853: "meta.tag.key.xml.plist" - 11848-11849: "punctuation.definition.tag.xml.plist" - Data: "<" - 11849-11852: "entity.name.tag.xml.plist" - 11849-11852: "entity.name.tag.localname.xml.plist" - Data: "key" - 11852-11853: "punctuation.definition.tag.xml.plist" - Data: ">" - 11857-11863: "meta.tag.key.xml.plist" - 11857-11859: "punctuation.definition.tag.xml.plist" - Data: "" - 11871-11910: "" - 11871-11879: "meta.tag.string.xml.plist" - 11871-11872: "punctuation.definition.tag.xml.plist" - Data: "<" - 11872-11878: "entity.name.tag.xml.plist" - 11872-11878: "entity.name.tag.localname.xml.plist" - Data: "string" - 11878-11879: "punctuation.definition.tag.xml.plist" - Data: ">" - 11901-11910: "meta.tag.string.xml.plist" - 11901-11903: "punctuation.definition.tag.xml.plist" - Data: "" - 11917-11924: "meta.tag.dict.xml.plist" - 11917-11919: "punctuation.definition.tag.xml.plist" - Data: "" - 11931-11943: "" - 11931-11936: "meta.tag.key.xml.plist" - 11931-11932: "punctuation.definition.tag.xml.plist" - Data: "<" - 11932-11935: "entity.name.tag.xml.plist" - 11932-11935: "entity.name.tag.localname.xml.plist" - Data: "key" - 11935-11936: "punctuation.definition.tag.xml.plist" - Data: ">" - 11937-11943: "meta.tag.key.xml.plist" - 11937-11939: "punctuation.definition.tag.xml.plist" - Data: "" - 11950-12054: "" - 11950-11956: "meta.tag.dict.xml.plist" - 11950-11951: "punctuation.definition.tag.xml.plist" - Data: "<" - 11951-11955: "entity.name.tag.xml.plist" - 11951-11955: "entity.name.tag.localname.xml.plist" - Data: "dict" - 11955-11956: "punctuation.definition.tag.xml.plist" - Data: ">" - 11964-11979: "" - 11964-11969: "meta.tag.key.xml.plist" - 11964-11965: "punctuation.definition.tag.xml.plist" - Data: "<" - 11965-11968: "entity.name.tag.xml.plist" - 11965-11968: "entity.name.tag.localname.xml.plist" - Data: "key" - 11968-11969: "punctuation.definition.tag.xml.plist" - Data: ">" - 11973-11979: "meta.tag.key.xml.plist" - 11973-11975: "punctuation.definition.tag.xml.plist" - Data: "" - 11987-12040: "" - 11987-11995: "meta.tag.string.xml.plist" - 11987-11988: "punctuation.definition.tag.xml.plist" - Data: "<" - 11988-11994: "entity.name.tag.xml.plist" - 11988-11994: "entity.name.tag.localname.xml.plist" - Data: "string" - 11994-11995: "punctuation.definition.tag.xml.plist" - Data: ">" - 12031-12040: "meta.tag.string.xml.plist" - 12031-12033: "punctuation.definition.tag.xml.plist" - Data: "" - 12047-12054: "meta.tag.dict.xml.plist" - 12047-12049: "punctuation.definition.tag.xml.plist" - Data: "" - 12061-12073: "" - 12061-12066: "meta.tag.key.xml.plist" - 12061-12062: "punctuation.definition.tag.xml.plist" - Data: "<" - 12062-12065: "entity.name.tag.xml.plist" - 12062-12065: "entity.name.tag.localname.xml.plist" - Data: "key" - 12065-12066: "punctuation.definition.tag.xml.plist" - Data: ">" - 12067-12073: "meta.tag.key.xml.plist" - 12067-12069: "punctuation.definition.tag.xml.plist" - Data: "" - 12080-12173: "" - 12080-12086: "meta.tag.dict.xml.plist" - 12080-12081: "punctuation.definition.tag.xml.plist" - Data: "<" - 12081-12085: "entity.name.tag.xml.plist" - 12081-12085: "entity.name.tag.localname.xml.plist" - Data: "dict" - 12085-12086: "punctuation.definition.tag.xml.plist" - Data: ">" - 12094-12109: "" - 12094-12099: "meta.tag.key.xml.plist" - 12094-12095: "punctuation.definition.tag.xml.plist" - Data: "<" - 12095-12098: "entity.name.tag.xml.plist" - 12095-12098: "entity.name.tag.localname.xml.plist" - Data: "key" - 12098-12099: "punctuation.definition.tag.xml.plist" - Data: ">" - 12103-12109: "meta.tag.key.xml.plist" - 12103-12105: "punctuation.definition.tag.xml.plist" - Data: "" - 12117-12159: "" - 12117-12125: "meta.tag.string.xml.plist" - 12117-12118: "punctuation.definition.tag.xml.plist" - Data: "<" - 12118-12124: "entity.name.tag.xml.plist" - 12118-12124: "entity.name.tag.localname.xml.plist" - Data: "string" - 12124-12125: "punctuation.definition.tag.xml.plist" - Data: ">" - 12150-12159: "meta.tag.string.xml.plist" - 12150-12152: "punctuation.definition.tag.xml.plist" - Data: "" - 12166-12173: "meta.tag.dict.xml.plist" - 12166-12168: "punctuation.definition.tag.xml.plist" - Data: "" - 12180-12192: "" - 12180-12185: "meta.tag.key.xml.plist" - 12180-12181: "punctuation.definition.tag.xml.plist" - Data: "<" - 12181-12184: "entity.name.tag.xml.plist" - 12181-12184: "entity.name.tag.localname.xml.plist" - Data: "key" - 12184-12185: "punctuation.definition.tag.xml.plist" - Data: ">" - 12186-12192: "meta.tag.key.xml.plist" - 12186-12188: "punctuation.definition.tag.xml.plist" - Data: "" - 12199-12302: "" - 12199-12205: "meta.tag.dict.xml.plist" - 12199-12200: "punctuation.definition.tag.xml.plist" - Data: "<" - 12200-12204: "entity.name.tag.xml.plist" - 12200-12204: "entity.name.tag.localname.xml.plist" - Data: "dict" - 12204-12205: "punctuation.definition.tag.xml.plist" - Data: ">" - 12213-12228: "" - 12213-12218: "meta.tag.key.xml.plist" - 12213-12214: "punctuation.definition.tag.xml.plist" - Data: "<" - 12214-12217: "entity.name.tag.xml.plist" - 12214-12217: "entity.name.tag.localname.xml.plist" - Data: "key" - 12217-12218: "punctuation.definition.tag.xml.plist" - Data: ">" - 12222-12228: "meta.tag.key.xml.plist" - 12222-12224: "punctuation.definition.tag.xml.plist" - Data: "" - 12236-12288: "" - 12236-12244: "meta.tag.string.xml.plist" - 12236-12237: "punctuation.definition.tag.xml.plist" - Data: "<" - 12237-12243: "entity.name.tag.xml.plist" - 12237-12243: "entity.name.tag.localname.xml.plist" - Data: "string" - 12243-12244: "punctuation.definition.tag.xml.plist" - Data: ">" - 12279-12288: "meta.tag.string.xml.plist" - 12279-12281: "punctuation.definition.tag.xml.plist" - Data: "" - 12295-12302: "meta.tag.dict.xml.plist" - 12295-12297: "punctuation.definition.tag.xml.plist" - Data: "" - 12309-12321: "" - 12309-12314: "meta.tag.key.xml.plist" - 12309-12310: "punctuation.definition.tag.xml.plist" - Data: "<" - 12310-12313: "entity.name.tag.xml.plist" - 12310-12313: "entity.name.tag.localname.xml.plist" - Data: "key" - 12313-12314: "punctuation.definition.tag.xml.plist" - Data: ">" - 12315-12321: "meta.tag.key.xml.plist" - 12315-12317: "punctuation.definition.tag.xml.plist" - Data: "" - 12328-12432: "" - 12328-12334: "meta.tag.dict.xml.plist" - 12328-12329: "punctuation.definition.tag.xml.plist" - Data: "<" - 12329-12333: "entity.name.tag.xml.plist" - 12329-12333: "entity.name.tag.localname.xml.plist" - Data: "dict" - 12333-12334: "punctuation.definition.tag.xml.plist" - Data: ">" - 12342-12357: "" - 12342-12347: "meta.tag.key.xml.plist" - 12342-12343: "punctuation.definition.tag.xml.plist" - Data: "<" - 12343-12346: "entity.name.tag.xml.plist" - 12343-12346: "entity.name.tag.localname.xml.plist" - Data: "key" - 12346-12347: "punctuation.definition.tag.xml.plist" - Data: ">" - 12351-12357: "meta.tag.key.xml.plist" - 12351-12353: "punctuation.definition.tag.xml.plist" - Data: "" - 12365-12418: "" - 12365-12373: "meta.tag.string.xml.plist" - 12365-12366: "punctuation.definition.tag.xml.plist" - Data: "<" - 12366-12372: "entity.name.tag.xml.plist" - 12366-12372: "entity.name.tag.localname.xml.plist" - Data: "string" - 12372-12373: "punctuation.definition.tag.xml.plist" - Data: ">" - 12409-12418: "meta.tag.string.xml.plist" - 12409-12411: "punctuation.definition.tag.xml.plist" - Data: "" - 12425-12432: "meta.tag.dict.xml.plist" - 12425-12427: "punctuation.definition.tag.xml.plist" - Data: "" - 12438-12445: "meta.tag.dict.xml.plist" - 12438-12440: "punctuation.definition.tag.xml.plist" - Data: "" - 12451-12469: "" - 12451-12456: "meta.tag.key.xml.plist" - 12451-12452: "punctuation.definition.tag.xml.plist" - Data: "<" - 12452-12455: "entity.name.tag.xml.plist" - 12452-12455: "entity.name.tag.localname.xml.plist" - Data: "key" - 12455-12456: "punctuation.definition.tag.xml.plist" - Data: ">" - 12463-12469: "meta.tag.key.xml.plist" - 12463-12465: "punctuation.definition.tag.xml.plist" - Data: "" - 12475-12590: "" - 12475-12483: "meta.tag.string.xml.plist" - 12475-12476: "punctuation.definition.tag.xml.plist" - Data: "<" - 12476-12482: "entity.name.tag.xml.plist" - 12476-12482: "entity.name.tag.localname.xml.plist" - Data: "string" - 12482-12483: "punctuation.definition.tag.xml.plist" - Data: ">" - 12581-12590: "meta.tag.string.xml.plist" - 12581-12583: "punctuation.definition.tag.xml.plist" - Data: "" - 12596-12618: "" - 12596-12601: "meta.tag.key.xml.plist" - 12596-12597: "punctuation.definition.tag.xml.plist" - Data: "<" - 12597-12600: "entity.name.tag.xml.plist" - 12597-12600: "entity.name.tag.localname.xml.plist" - Data: "key" - 12600-12601: "punctuation.definition.tag.xml.plist" - Data: ">" - 12612-12618: "meta.tag.key.xml.plist" - 12612-12614: "punctuation.definition.tag.xml.plist" - Data: "" - 12624-12670: "" - 12624-12632: "meta.tag.string.xml.plist" - 12624-12625: "punctuation.definition.tag.xml.plist" - Data: "<" - 12625-12631: "entity.name.tag.xml.plist" - 12625-12631: "entity.name.tag.localname.xml.plist" - Data: "string" - 12631-12632: "punctuation.definition.tag.xml.plist" - Data: ">" - 12661-12670: "meta.tag.string.xml.plist" - 12661-12663: "punctuation.definition.tag.xml.plist" - Data: "" - 12676-12690: "" - 12676-12681: "meta.tag.key.xml.plist" - 12676-12677: "punctuation.definition.tag.xml.plist" - Data: "<" - 12677-12680: "entity.name.tag.xml.plist" - 12677-12680: "entity.name.tag.localname.xml.plist" - Data: "key" - 12680-12681: "punctuation.definition.tag.xml.plist" - Data: ">" - 12684-12690: "meta.tag.key.xml.plist" - 12684-12686: "punctuation.definition.tag.xml.plist" - Data: "" - 12696-12735: "" - 12696-12704: "meta.tag.string.xml.plist" - 12696-12697: "punctuation.definition.tag.xml.plist" - Data: "<" - 12697-12703: "entity.name.tag.xml.plist" - 12697-12703: "entity.name.tag.localname.xml.plist" - Data: "string" - 12703-12704: "punctuation.definition.tag.xml.plist" - Data: ">" - 12726-12735: "meta.tag.string.xml.plist" - 12726-12728: "punctuation.definition.tag.xml.plist" - Data: "" - 12741-12760: "" - 12741-12746: "meta.tag.key.xml.plist" - 12741-12742: "punctuation.definition.tag.xml.plist" - Data: "<" - 12742-12745: "entity.name.tag.xml.plist" - 12742-12745: "entity.name.tag.localname.xml.plist" - Data: "key" - 12745-12746: "punctuation.definition.tag.xml.plist" - Data: ">" - 12754-12760: "meta.tag.key.xml.plist" - 12754-12756: "punctuation.definition.tag.xml.plist" - Data: "" - 12766-13125: "" - 12766-12773: "meta.tag.array.xml.plist" - 12766-12767: "punctuation.definition.tag.xml.plist" - Data: "<" - 12767-12772: "entity.name.tag.xml.plist" - 12767-12772: "entity.name.tag.localname.xml.plist" - Data: "array" - 12772-12773: "punctuation.definition.tag.xml.plist" - Data: ">" - 12780-13111: "" - 12780-12786: "meta.tag.dict.xml.plist" - 12780-12781: "punctuation.definition.tag.xml.plist" - Data: "<" - 12781-12785: "entity.name.tag.xml.plist" - 12781-12785: "entity.name.tag.localname.xml.plist" - Data: "dict" - 12785-12786: "punctuation.definition.tag.xml.plist" - Data: ">" - 12794-12810: "" - 12794-12799: "meta.tag.key.xml.plist" - 12794-12795: "punctuation.definition.tag.xml.plist" - Data: "<" - 12795-12798: "entity.name.tag.xml.plist" - 12795-12798: "entity.name.tag.localname.xml.plist" - Data: "key" - 12798-12799: "punctuation.definition.tag.xml.plist" - Data: ">" - 12804-12810: "meta.tag.key.xml.plist" - 12804-12806: "punctuation.definition.tag.xml.plist" - Data: "" - 12818-12849: "" - 12818-12826: "meta.tag.string.xml.plist" - 12818-12819: "punctuation.definition.tag.xml.plist" - Data: "<" - 12819-12825: "entity.name.tag.xml.plist" - 12819-12825: "entity.name.tag.localname.xml.plist" - Data: "string" - 12825-12826: "punctuation.definition.tag.xml.plist" - Data: ">" - 12840-12849: "meta.tag.string.xml.plist" - 12840-12842: "punctuation.definition.tag.xml.plist" - Data: "" - 12857-12876: "" - 12857-12862: "meta.tag.key.xml.plist" - 12857-12858: "punctuation.definition.tag.xml.plist" - Data: "<" - 12858-12861: "entity.name.tag.xml.plist" - 12858-12861: "entity.name.tag.localname.xml.plist" - Data: "key" - 12861-12862: "punctuation.definition.tag.xml.plist" - Data: ">" - 12870-12876: "meta.tag.key.xml.plist" - 12870-12872: "punctuation.definition.tag.xml.plist" - Data: "" - 12884-13044: "" - 12884-12890: "meta.tag.dict.xml.plist" - 12884-12885: "punctuation.definition.tag.xml.plist" - Data: "<" - 12885-12889: "entity.name.tag.xml.plist" - 12885-12889: "entity.name.tag.localname.xml.plist" - Data: "dict" - 12889-12890: "punctuation.definition.tag.xml.plist" - Data: ">" - 12899-12911: "" - 12899-12904: "meta.tag.key.xml.plist" - 12899-12900: "punctuation.definition.tag.xml.plist" - Data: "<" - 12900-12903: "entity.name.tag.xml.plist" - 12900-12903: "entity.name.tag.localname.xml.plist" - Data: "key" - 12903-12904: "punctuation.definition.tag.xml.plist" - Data: ">" - 12905-12911: "meta.tag.key.xml.plist" - 12905-12907: "punctuation.definition.tag.xml.plist" - Data: "" - 12920-13029: "" - 12920-12926: "meta.tag.dict.xml.plist" - 12920-12921: "punctuation.definition.tag.xml.plist" - Data: "<" - 12921-12925: "entity.name.tag.xml.plist" - 12921-12925: "entity.name.tag.localname.xml.plist" - Data: "dict" - 12925-12926: "punctuation.definition.tag.xml.plist" - Data: ">" - 12936-12951: "" - 12936-12941: "meta.tag.key.xml.plist" - 12936-12937: "punctuation.definition.tag.xml.plist" - Data: "<" - 12937-12940: "entity.name.tag.xml.plist" - 12937-12940: "entity.name.tag.localname.xml.plist" - Data: "key" - 12940-12941: "punctuation.definition.tag.xml.plist" - Data: ">" - 12945-12951: "meta.tag.key.xml.plist" - 12945-12947: "punctuation.definition.tag.xml.plist" - Data: "" - 12961-13013: "" - 12961-12969: "meta.tag.string.xml.plist" - 12961-12962: "punctuation.definition.tag.xml.plist" - Data: "<" - 12962-12968: "entity.name.tag.xml.plist" - 12962-12968: "entity.name.tag.localname.xml.plist" - Data: "string" - 12968-12969: "punctuation.definition.tag.xml.plist" - Data: ">" - 13004-13013: "meta.tag.string.xml.plist" - 13004-13006: "punctuation.definition.tag.xml.plist" - Data: "" - 13022-13029: "meta.tag.dict.xml.plist" - 13022-13024: "punctuation.definition.tag.xml.plist" - Data: "" - 13037-13044: "meta.tag.dict.xml.plist" - 13037-13039: "punctuation.definition.tag.xml.plist" - Data: "" - 13052-13066: "" - 13052-13057: "meta.tag.key.xml.plist" - 13052-13053: "punctuation.definition.tag.xml.plist" - Data: "<" - 13053-13056: "entity.name.tag.xml.plist" - 13053-13056: "entity.name.tag.localname.xml.plist" - Data: "key" - 13056-13057: "punctuation.definition.tag.xml.plist" - Data: ">" - 13060-13066: "meta.tag.key.xml.plist" - 13060-13062: "punctuation.definition.tag.xml.plist" - Data: "" - 13074-13097: "" - 13074-13082: "meta.tag.string.xml.plist" - 13074-13075: "punctuation.definition.tag.xml.plist" - Data: "<" - 13075-13081: "entity.name.tag.xml.plist" - 13075-13081: "entity.name.tag.localname.xml.plist" - Data: "string" - 13081-13082: "punctuation.definition.tag.xml.plist" - Data: ">" - 13088-13097: "meta.tag.string.xml.plist" - 13088-13090: "punctuation.definition.tag.xml.plist" - Data: "" - 13104-13111: "meta.tag.dict.xml.plist" - 13104-13106: "punctuation.definition.tag.xml.plist" - Data: "" - 13117-13125: "meta.tag.array.xml.plist" - 13117-13119: "punctuation.definition.tag.xml.plist" - Data: "" - 13130-13137: "meta.tag.dict.xml.plist" - 13130-13132: "punctuation.definition.tag.xml.plist" - Data: "" - 13142-13977: "" - 13142-13148: "meta.tag.dict.xml.plist" - 13142-13143: "punctuation.definition.tag.xml.plist" - Data: "<" - 13143-13147: "entity.name.tag.xml.plist" - 13143-13147: "entity.name.tag.localname.xml.plist" - Data: "dict" - 13147-13148: "punctuation.definition.tag.xml.plist" - Data: ">" - 13154-13173: "" - 13154-13159: "meta.tag.key.xml.plist" - 13154-13155: "punctuation.definition.tag.xml.plist" - Data: "<" - 13155-13158: "entity.name.tag.xml.plist" - 13155-13158: "entity.name.tag.localname.xml.plist" - Data: "key" - 13158-13159: "punctuation.definition.tag.xml.plist" - Data: ">" - 13167-13173: "meta.tag.key.xml.plist" - 13167-13169: "punctuation.definition.tag.xml.plist" - Data: "" - 13179-13823: "" - 13179-13185: "meta.tag.dict.xml.plist" - 13179-13180: "punctuation.definition.tag.xml.plist" - Data: "<" - 13180-13184: "entity.name.tag.xml.plist" - 13180-13184: "entity.name.tag.localname.xml.plist" - Data: "dict" - 13184-13185: "punctuation.definition.tag.xml.plist" - Data: ">" - 13192-13204: "" - 13192-13197: "meta.tag.key.xml.plist" - 13192-13193: "punctuation.definition.tag.xml.plist" - Data: "<" - 13193-13196: "entity.name.tag.xml.plist" - 13193-13196: "entity.name.tag.localname.xml.plist" - Data: "key" - 13196-13197: "punctuation.definition.tag.xml.plist" - Data: ">" - 13198-13204: "meta.tag.key.xml.plist" - 13198-13200: "punctuation.definition.tag.xml.plist" - Data: "" - 13211-13302: "" - 13211-13217: "meta.tag.dict.xml.plist" - 13211-13212: "punctuation.definition.tag.xml.plist" - Data: "<" - 13212-13216: "entity.name.tag.xml.plist" - 13212-13216: "entity.name.tag.localname.xml.plist" - Data: "dict" - 13216-13217: "punctuation.definition.tag.xml.plist" - Data: ">" - 13225-13240: "" - 13225-13230: "meta.tag.key.xml.plist" - 13225-13226: "punctuation.definition.tag.xml.plist" - Data: "<" - 13226-13229: "entity.name.tag.xml.plist" - 13226-13229: "entity.name.tag.localname.xml.plist" - Data: "key" - 13229-13230: "punctuation.definition.tag.xml.plist" - Data: ">" - 13234-13240: "meta.tag.key.xml.plist" - 13234-13236: "punctuation.definition.tag.xml.plist" - Data: "" - 13248-13288: "" - 13248-13256: "meta.tag.string.xml.plist" - 13248-13249: "punctuation.definition.tag.xml.plist" - Data: "<" - 13249-13255: "entity.name.tag.xml.plist" - 13249-13255: "entity.name.tag.localname.xml.plist" - Data: "string" - 13255-13256: "punctuation.definition.tag.xml.plist" - Data: ">" - 13279-13288: "meta.tag.string.xml.plist" - 13279-13281: "punctuation.definition.tag.xml.plist" - Data: "" - 13295-13302: "meta.tag.dict.xml.plist" - 13295-13297: "punctuation.definition.tag.xml.plist" - Data: "" - 13309-13321: "" - 13309-13314: "meta.tag.key.xml.plist" - 13309-13310: "punctuation.definition.tag.xml.plist" - Data: "<" - 13310-13313: "entity.name.tag.xml.plist" - 13310-13313: "entity.name.tag.localname.xml.plist" - Data: "key" - 13313-13314: "punctuation.definition.tag.xml.plist" - Data: ">" - 13315-13321: "meta.tag.key.xml.plist" - 13315-13317: "punctuation.definition.tag.xml.plist" - Data: "" - 13328-13432: "" - 13328-13334: "meta.tag.dict.xml.plist" - 13328-13329: "punctuation.definition.tag.xml.plist" - Data: "<" - 13329-13333: "entity.name.tag.xml.plist" - 13329-13333: "entity.name.tag.localname.xml.plist" - Data: "dict" - 13333-13334: "punctuation.definition.tag.xml.plist" - Data: ">" - 13342-13357: "" - 13342-13347: "meta.tag.key.xml.plist" - 13342-13343: "punctuation.definition.tag.xml.plist" - Data: "<" - 13343-13346: "entity.name.tag.xml.plist" - 13343-13346: "entity.name.tag.localname.xml.plist" - Data: "key" - 13346-13347: "punctuation.definition.tag.xml.plist" - Data: ">" - 13351-13357: "meta.tag.key.xml.plist" - 13351-13353: "punctuation.definition.tag.xml.plist" - Data: "" - 13365-13418: "" - 13365-13373: "meta.tag.string.xml.plist" - 13365-13366: "punctuation.definition.tag.xml.plist" - Data: "<" - 13366-13372: "entity.name.tag.xml.plist" - 13366-13372: "entity.name.tag.localname.xml.plist" - Data: "string" - 13372-13373: "punctuation.definition.tag.xml.plist" - Data: ">" - 13409-13418: "meta.tag.string.xml.plist" - 13409-13411: "punctuation.definition.tag.xml.plist" - Data: "" - 13425-13432: "meta.tag.dict.xml.plist" - 13425-13427: "punctuation.definition.tag.xml.plist" - Data: "" - 13439-13451: "" - 13439-13444: "meta.tag.key.xml.plist" - 13439-13440: "punctuation.definition.tag.xml.plist" - Data: "<" - 13440-13443: "entity.name.tag.xml.plist" - 13440-13443: "entity.name.tag.localname.xml.plist" - Data: "key" - 13443-13444: "punctuation.definition.tag.xml.plist" - Data: ">" - 13445-13451: "meta.tag.key.xml.plist" - 13445-13447: "punctuation.definition.tag.xml.plist" - Data: "" - 13458-13551: "" - 13458-13464: "meta.tag.dict.xml.plist" - 13458-13459: "punctuation.definition.tag.xml.plist" - Data: "<" - 13459-13463: "entity.name.tag.xml.plist" - 13459-13463: "entity.name.tag.localname.xml.plist" - Data: "dict" - 13463-13464: "punctuation.definition.tag.xml.plist" - Data: ">" - 13472-13487: "" - 13472-13477: "meta.tag.key.xml.plist" - 13472-13473: "punctuation.definition.tag.xml.plist" - Data: "<" - 13473-13476: "entity.name.tag.xml.plist" - 13473-13476: "entity.name.tag.localname.xml.plist" - Data: "key" - 13476-13477: "punctuation.definition.tag.xml.plist" - Data: ">" - 13481-13487: "meta.tag.key.xml.plist" - 13481-13483: "punctuation.definition.tag.xml.plist" - Data: "" - 13495-13537: "" - 13495-13503: "meta.tag.string.xml.plist" - 13495-13496: "punctuation.definition.tag.xml.plist" - Data: "<" - 13496-13502: "entity.name.tag.xml.plist" - 13496-13502: "entity.name.tag.localname.xml.plist" - Data: "string" - 13502-13503: "punctuation.definition.tag.xml.plist" - Data: ">" - 13528-13537: "meta.tag.string.xml.plist" - 13528-13530: "punctuation.definition.tag.xml.plist" - Data: "" - 13544-13551: "meta.tag.dict.xml.plist" - 13544-13546: "punctuation.definition.tag.xml.plist" - Data: "" - 13558-13570: "" - 13558-13563: "meta.tag.key.xml.plist" - 13558-13559: "punctuation.definition.tag.xml.plist" - Data: "<" - 13559-13562: "entity.name.tag.xml.plist" - 13559-13562: "entity.name.tag.localname.xml.plist" - Data: "key" - 13562-13563: "punctuation.definition.tag.xml.plist" - Data: ">" - 13564-13570: "meta.tag.key.xml.plist" - 13564-13566: "punctuation.definition.tag.xml.plist" - Data: "" - 13577-13680: "" - 13577-13583: "meta.tag.dict.xml.plist" - 13577-13578: "punctuation.definition.tag.xml.plist" - Data: "<" - 13578-13582: "entity.name.tag.xml.plist" - 13578-13582: "entity.name.tag.localname.xml.plist" - Data: "dict" - 13582-13583: "punctuation.definition.tag.xml.plist" - Data: ">" - 13591-13606: "" - 13591-13596: "meta.tag.key.xml.plist" - 13591-13592: "punctuation.definition.tag.xml.plist" - Data: "<" - 13592-13595: "entity.name.tag.xml.plist" - 13592-13595: "entity.name.tag.localname.xml.plist" - Data: "key" - 13595-13596: "punctuation.definition.tag.xml.plist" - Data: ">" - 13600-13606: "meta.tag.key.xml.plist" - 13600-13602: "punctuation.definition.tag.xml.plist" - Data: "" - 13614-13666: "" - 13614-13622: "meta.tag.string.xml.plist" - 13614-13615: "punctuation.definition.tag.xml.plist" - Data: "<" - 13615-13621: "entity.name.tag.xml.plist" - 13615-13621: "entity.name.tag.localname.xml.plist" - Data: "string" - 13621-13622: "punctuation.definition.tag.xml.plist" - Data: ">" - 13657-13666: "meta.tag.string.xml.plist" - 13657-13659: "punctuation.definition.tag.xml.plist" - Data: "" - 13673-13680: "meta.tag.dict.xml.plist" - 13673-13675: "punctuation.definition.tag.xml.plist" - Data: "" - 13687-13699: "" - 13687-13692: "meta.tag.key.xml.plist" - 13687-13688: "punctuation.definition.tag.xml.plist" - Data: "<" - 13688-13691: "entity.name.tag.xml.plist" - 13688-13691: "entity.name.tag.localname.xml.plist" - Data: "key" - 13691-13692: "punctuation.definition.tag.xml.plist" - Data: ">" - 13693-13699: "meta.tag.key.xml.plist" - 13693-13695: "punctuation.definition.tag.xml.plist" - Data: "" - 13706-13810: "" - 13706-13712: "meta.tag.dict.xml.plist" - 13706-13707: "punctuation.definition.tag.xml.plist" - Data: "<" - 13707-13711: "entity.name.tag.xml.plist" - 13707-13711: "entity.name.tag.localname.xml.plist" - Data: "dict" - 13711-13712: "punctuation.definition.tag.xml.plist" - Data: ">" - 13720-13735: "" - 13720-13725: "meta.tag.key.xml.plist" - 13720-13721: "punctuation.definition.tag.xml.plist" - Data: "<" - 13721-13724: "entity.name.tag.xml.plist" - 13721-13724: "entity.name.tag.localname.xml.plist" - Data: "key" - 13724-13725: "punctuation.definition.tag.xml.plist" - Data: ">" - 13729-13735: "meta.tag.key.xml.plist" - 13729-13731: "punctuation.definition.tag.xml.plist" - Data: "" - 13743-13796: "" - 13743-13751: "meta.tag.string.xml.plist" - 13743-13744: "punctuation.definition.tag.xml.plist" - Data: "<" - 13744-13750: "entity.name.tag.xml.plist" - 13744-13750: "entity.name.tag.localname.xml.plist" - Data: "string" - 13750-13751: "punctuation.definition.tag.xml.plist" - Data: ">" - 13787-13796: "meta.tag.string.xml.plist" - 13787-13789: "punctuation.definition.tag.xml.plist" - Data: "" - 13803-13810: "meta.tag.dict.xml.plist" - 13803-13805: "punctuation.definition.tag.xml.plist" - Data: "" - 13816-13823: "meta.tag.dict.xml.plist" - 13816-13818: "punctuation.definition.tag.xml.plist" - Data: "" - 13829-13847: "" - 13829-13834: "meta.tag.key.xml.plist" - 13829-13830: "punctuation.definition.tag.xml.plist" - Data: "<" - 13830-13833: "entity.name.tag.xml.plist" - 13830-13833: "entity.name.tag.localname.xml.plist" - Data: "key" - 13833-13834: "punctuation.definition.tag.xml.plist" - Data: ">" - 13841-13847: "meta.tag.key.xml.plist" - 13841-13843: "punctuation.definition.tag.xml.plist" - Data: "" - 13853-13893: "" - 13853-13861: "meta.tag.string.xml.plist" - 13853-13854: "punctuation.definition.tag.xml.plist" - Data: "<" - 13854-13860: "entity.name.tag.xml.plist" - 13854-13860: "entity.name.tag.localname.xml.plist" - Data: "string" - 13860-13861: "punctuation.definition.tag.xml.plist" - Data: ">" - 13884-13893: "meta.tag.string.xml.plist" - 13884-13886: "punctuation.definition.tag.xml.plist" - Data: "" - 13899-13915: "" - 13899-13904: "meta.tag.key.xml.plist" - 13899-13900: "punctuation.definition.tag.xml.plist" - Data: "<" - 13900-13903: "entity.name.tag.xml.plist" - 13900-13903: "entity.name.tag.localname.xml.plist" - Data: "key" - 13903-13904: "punctuation.definition.tag.xml.plist" - Data: ">" - 13909-13915: "meta.tag.key.xml.plist" - 13909-13911: "punctuation.definition.tag.xml.plist" - Data: "" - 13921-13965: "" - 13921-13929: "meta.tag.string.xml.plist" - 13921-13922: "punctuation.definition.tag.xml.plist" - Data: "<" - 13922-13928: "entity.name.tag.xml.plist" - 13922-13928: "entity.name.tag.localname.xml.plist" - Data: "string" - 13928-13929: "punctuation.definition.tag.xml.plist" - Data: ">" - 13956-13965: "meta.tag.string.xml.plist" - 13956-13958: "punctuation.definition.tag.xml.plist" - Data: "" - 13970-13977: "meta.tag.dict.xml.plist" - 13970-13972: "punctuation.definition.tag.xml.plist" - Data: "" - 13982-14814: "" - 13982-13988: "meta.tag.dict.xml.plist" - 13982-13983: "punctuation.definition.tag.xml.plist" - Data: "<" - 13983-13987: "entity.name.tag.xml.plist" - 13983-13987: "entity.name.tag.localname.xml.plist" - Data: "dict" - 13987-13988: "punctuation.definition.tag.xml.plist" - Data: ">" - 13994-14013: "" - 13994-13999: "meta.tag.key.xml.plist" - 13994-13995: "punctuation.definition.tag.xml.plist" - Data: "<" - 13995-13998: "entity.name.tag.xml.plist" - 13995-13998: "entity.name.tag.localname.xml.plist" - Data: "key" - 13998-13999: "punctuation.definition.tag.xml.plist" - Data: ">" - 14007-14013: "meta.tag.key.xml.plist" - 14007-14009: "punctuation.definition.tag.xml.plist" - Data: "" - 14019-14664: "" - 14019-14025: "meta.tag.dict.xml.plist" - 14019-14020: "punctuation.definition.tag.xml.plist" - Data: "<" - 14020-14024: "entity.name.tag.xml.plist" - 14020-14024: "entity.name.tag.localname.xml.plist" - Data: "dict" - 14024-14025: "punctuation.definition.tag.xml.plist" - Data: ">" - 14032-14044: "" - 14032-14037: "meta.tag.key.xml.plist" - 14032-14033: "punctuation.definition.tag.xml.plist" - Data: "<" - 14033-14036: "entity.name.tag.xml.plist" - 14033-14036: "entity.name.tag.localname.xml.plist" - Data: "key" - 14036-14037: "punctuation.definition.tag.xml.plist" - Data: ">" - 14038-14044: "meta.tag.key.xml.plist" - 14038-14040: "punctuation.definition.tag.xml.plist" - Data: "" - 14051-14143: "" - 14051-14057: "meta.tag.dict.xml.plist" - 14051-14052: "punctuation.definition.tag.xml.plist" - Data: "<" - 14052-14056: "entity.name.tag.xml.plist" - 14052-14056: "entity.name.tag.localname.xml.plist" - Data: "dict" - 14056-14057: "punctuation.definition.tag.xml.plist" - Data: ">" - 14065-14080: "" - 14065-14070: "meta.tag.key.xml.plist" - 14065-14066: "punctuation.definition.tag.xml.plist" - Data: "<" - 14066-14069: "entity.name.tag.xml.plist" - 14066-14069: "entity.name.tag.localname.xml.plist" - Data: "key" - 14069-14070: "punctuation.definition.tag.xml.plist" - Data: ">" - 14074-14080: "meta.tag.key.xml.plist" - 14074-14076: "punctuation.definition.tag.xml.plist" - Data: "" - 14088-14129: "" - 14088-14096: "meta.tag.string.xml.plist" - 14088-14089: "punctuation.definition.tag.xml.plist" - Data: "<" - 14089-14095: "entity.name.tag.xml.plist" - 14089-14095: "entity.name.tag.localname.xml.plist" - Data: "string" - 14095-14096: "punctuation.definition.tag.xml.plist" - Data: ">" - 14120-14129: "meta.tag.string.xml.plist" - 14120-14122: "punctuation.definition.tag.xml.plist" - Data: "" - 14136-14143: "meta.tag.dict.xml.plist" - 14136-14138: "punctuation.definition.tag.xml.plist" - Data: "" - 14150-14162: "" - 14150-14155: "meta.tag.key.xml.plist" - 14150-14151: "punctuation.definition.tag.xml.plist" - Data: "<" - 14151-14154: "entity.name.tag.xml.plist" - 14151-14154: "entity.name.tag.localname.xml.plist" - Data: "key" - 14154-14155: "punctuation.definition.tag.xml.plist" - Data: ">" - 14156-14162: "meta.tag.key.xml.plist" - 14156-14158: "punctuation.definition.tag.xml.plist" - Data: "" - 14169-14273: "" - 14169-14175: "meta.tag.dict.xml.plist" - 14169-14170: "punctuation.definition.tag.xml.plist" - Data: "<" - 14170-14174: "entity.name.tag.xml.plist" - 14170-14174: "entity.name.tag.localname.xml.plist" - Data: "dict" - 14174-14175: "punctuation.definition.tag.xml.plist" - Data: ">" - 14183-14198: "" - 14183-14188: "meta.tag.key.xml.plist" - 14183-14184: "punctuation.definition.tag.xml.plist" - Data: "<" - 14184-14187: "entity.name.tag.xml.plist" - 14184-14187: "entity.name.tag.localname.xml.plist" - Data: "key" - 14187-14188: "punctuation.definition.tag.xml.plist" - Data: ">" - 14192-14198: "meta.tag.key.xml.plist" - 14192-14194: "punctuation.definition.tag.xml.plist" - Data: "" - 14206-14259: "" - 14206-14214: "meta.tag.string.xml.plist" - 14206-14207: "punctuation.definition.tag.xml.plist" - Data: "<" - 14207-14213: "entity.name.tag.xml.plist" - 14207-14213: "entity.name.tag.localname.xml.plist" - Data: "string" - 14213-14214: "punctuation.definition.tag.xml.plist" - Data: ">" - 14250-14259: "meta.tag.string.xml.plist" - 14250-14252: "punctuation.definition.tag.xml.plist" - Data: "" - 14266-14273: "meta.tag.dict.xml.plist" - 14266-14268: "punctuation.definition.tag.xml.plist" - Data: "" - 14280-14292: "" - 14280-14285: "meta.tag.key.xml.plist" - 14280-14281: "punctuation.definition.tag.xml.plist" - Data: "<" - 14281-14284: "entity.name.tag.xml.plist" - 14281-14284: "entity.name.tag.localname.xml.plist" - Data: "key" - 14284-14285: "punctuation.definition.tag.xml.plist" - Data: ">" - 14286-14292: "meta.tag.key.xml.plist" - 14286-14288: "punctuation.definition.tag.xml.plist" - Data: "" - 14299-14392: "" - 14299-14305: "meta.tag.dict.xml.plist" - 14299-14300: "punctuation.definition.tag.xml.plist" - Data: "<" - 14300-14304: "entity.name.tag.xml.plist" - 14300-14304: "entity.name.tag.localname.xml.plist" - Data: "dict" - 14304-14305: "punctuation.definition.tag.xml.plist" - Data: ">" - 14313-14328: "" - 14313-14318: "meta.tag.key.xml.plist" - 14313-14314: "punctuation.definition.tag.xml.plist" - Data: "<" - 14314-14317: "entity.name.tag.xml.plist" - 14314-14317: "entity.name.tag.localname.xml.plist" - Data: "key" - 14317-14318: "punctuation.definition.tag.xml.plist" - Data: ">" - 14322-14328: "meta.tag.key.xml.plist" - 14322-14324: "punctuation.definition.tag.xml.plist" - Data: "" - 14336-14378: "" - 14336-14344: "meta.tag.string.xml.plist" - 14336-14337: "punctuation.definition.tag.xml.plist" - Data: "<" - 14337-14343: "entity.name.tag.xml.plist" - 14337-14343: "entity.name.tag.localname.xml.plist" - Data: "string" - 14343-14344: "punctuation.definition.tag.xml.plist" - Data: ">" - 14369-14378: "meta.tag.string.xml.plist" - 14369-14371: "punctuation.definition.tag.xml.plist" - Data: "" - 14385-14392: "meta.tag.dict.xml.plist" - 14385-14387: "punctuation.definition.tag.xml.plist" - Data: "" - 14399-14411: "" - 14399-14404: "meta.tag.key.xml.plist" - 14399-14400: "punctuation.definition.tag.xml.plist" - Data: "<" - 14400-14403: "entity.name.tag.xml.plist" - 14400-14403: "entity.name.tag.localname.xml.plist" - Data: "key" - 14403-14404: "punctuation.definition.tag.xml.plist" - Data: ">" - 14405-14411: "meta.tag.key.xml.plist" - 14405-14407: "punctuation.definition.tag.xml.plist" - Data: "" - 14418-14521: "" - 14418-14424: "meta.tag.dict.xml.plist" - 14418-14419: "punctuation.definition.tag.xml.plist" - Data: "<" - 14419-14423: "entity.name.tag.xml.plist" - 14419-14423: "entity.name.tag.localname.xml.plist" - Data: "dict" - 14423-14424: "punctuation.definition.tag.xml.plist" - Data: ">" - 14432-14447: "" - 14432-14437: "meta.tag.key.xml.plist" - 14432-14433: "punctuation.definition.tag.xml.plist" - Data: "<" - 14433-14436: "entity.name.tag.xml.plist" - 14433-14436: "entity.name.tag.localname.xml.plist" - Data: "key" - 14436-14437: "punctuation.definition.tag.xml.plist" - Data: ">" - 14441-14447: "meta.tag.key.xml.plist" - 14441-14443: "punctuation.definition.tag.xml.plist" - Data: "" - 14455-14507: "" - 14455-14463: "meta.tag.string.xml.plist" - 14455-14456: "punctuation.definition.tag.xml.plist" - Data: "<" - 14456-14462: "entity.name.tag.xml.plist" - 14456-14462: "entity.name.tag.localname.xml.plist" - Data: "string" - 14462-14463: "punctuation.definition.tag.xml.plist" - Data: ">" - 14498-14507: "meta.tag.string.xml.plist" - 14498-14500: "punctuation.definition.tag.xml.plist" - Data: "" - 14514-14521: "meta.tag.dict.xml.plist" - 14514-14516: "punctuation.definition.tag.xml.plist" - Data: "" - 14528-14540: "" - 14528-14533: "meta.tag.key.xml.plist" - 14528-14529: "punctuation.definition.tag.xml.plist" - Data: "<" - 14529-14532: "entity.name.tag.xml.plist" - 14529-14532: "entity.name.tag.localname.xml.plist" - Data: "key" - 14532-14533: "punctuation.definition.tag.xml.plist" - Data: ">" - 14534-14540: "meta.tag.key.xml.plist" - 14534-14536: "punctuation.definition.tag.xml.plist" - Data: "" - 14547-14651: "" - 14547-14553: "meta.tag.dict.xml.plist" - 14547-14548: "punctuation.definition.tag.xml.plist" - Data: "<" - 14548-14552: "entity.name.tag.xml.plist" - 14548-14552: "entity.name.tag.localname.xml.plist" - Data: "dict" - 14552-14553: "punctuation.definition.tag.xml.plist" - Data: ">" - 14561-14576: "" - 14561-14566: "meta.tag.key.xml.plist" - 14561-14562: "punctuation.definition.tag.xml.plist" - Data: "<" - 14562-14565: "entity.name.tag.xml.plist" - 14562-14565: "entity.name.tag.localname.xml.plist" - Data: "key" - 14565-14566: "punctuation.definition.tag.xml.plist" - Data: ">" - 14570-14576: "meta.tag.key.xml.plist" - 14570-14572: "punctuation.definition.tag.xml.plist" - Data: "" - 14584-14637: "" - 14584-14592: "meta.tag.string.xml.plist" - 14584-14585: "punctuation.definition.tag.xml.plist" - Data: "<" - 14585-14591: "entity.name.tag.xml.plist" - 14585-14591: "entity.name.tag.localname.xml.plist" - Data: "string" - 14591-14592: "punctuation.definition.tag.xml.plist" - Data: ">" - 14628-14637: "meta.tag.string.xml.plist" - 14628-14630: "punctuation.definition.tag.xml.plist" - Data: "" - 14644-14651: "meta.tag.dict.xml.plist" - 14644-14646: "punctuation.definition.tag.xml.plist" - Data: "" - 14657-14664: "meta.tag.dict.xml.plist" - 14657-14659: "punctuation.definition.tag.xml.plist" - Data: "" - 14670-14688: "" - 14670-14675: "meta.tag.key.xml.plist" - 14670-14671: "punctuation.definition.tag.xml.plist" - Data: "<" - 14671-14674: "entity.name.tag.xml.plist" - 14671-14674: "entity.name.tag.localname.xml.plist" - Data: "key" - 14674-14675: "punctuation.definition.tag.xml.plist" - Data: ">" - 14682-14688: "meta.tag.key.xml.plist" - 14682-14684: "punctuation.definition.tag.xml.plist" - Data: "" - 14694-14729: "" - 14694-14702: "meta.tag.string.xml.plist" - 14694-14695: "punctuation.definition.tag.xml.plist" - Data: "<" - 14695-14701: "entity.name.tag.xml.plist" - 14695-14701: "entity.name.tag.localname.xml.plist" - Data: "string" - 14701-14702: "punctuation.definition.tag.xml.plist" - Data: ">" - 14720-14729: "meta.tag.string.xml.plist" - 14720-14722: "punctuation.definition.tag.xml.plist" - Data: "" - 14735-14751: "" - 14735-14740: "meta.tag.key.xml.plist" - 14735-14736: "punctuation.definition.tag.xml.plist" - Data: "<" - 14736-14739: "entity.name.tag.xml.plist" - 14736-14739: "entity.name.tag.localname.xml.plist" - Data: "key" - 14739-14740: "punctuation.definition.tag.xml.plist" - Data: ">" - 14745-14751: "meta.tag.key.xml.plist" - 14745-14747: "punctuation.definition.tag.xml.plist" - Data: "" - 14757-14802: "" - 14757-14765: "meta.tag.string.xml.plist" - 14757-14758: "punctuation.definition.tag.xml.plist" - Data: "<" - 14758-14764: "entity.name.tag.xml.plist" - 14758-14764: "entity.name.tag.localname.xml.plist" - Data: "string" - 14764-14765: "punctuation.definition.tag.xml.plist" - Data: ">" - 14793-14802: "meta.tag.string.xml.plist" - 14793-14795: "punctuation.definition.tag.xml.plist" - Data: "" - 14807-14814: "meta.tag.dict.xml.plist" - 14807-14809: "punctuation.definition.tag.xml.plist" - Data: "" - 14819-15654: "" - 14819-14825: "meta.tag.dict.xml.plist" - 14819-14820: "punctuation.definition.tag.xml.plist" - Data: "<" - 14820-14824: "entity.name.tag.xml.plist" - 14820-14824: "entity.name.tag.localname.xml.plist" - Data: "dict" - 14824-14825: "punctuation.definition.tag.xml.plist" - Data: ">" - 14831-14850: "" - 14831-14836: "meta.tag.key.xml.plist" - 14831-14832: "punctuation.definition.tag.xml.plist" - Data: "<" - 14832-14835: "entity.name.tag.xml.plist" - 14832-14835: "entity.name.tag.localname.xml.plist" - Data: "key" - 14835-14836: "punctuation.definition.tag.xml.plist" - Data: ">" - 14844-14850: "meta.tag.key.xml.plist" - 14844-14846: "punctuation.definition.tag.xml.plist" - Data: "" - 14856-15502: "" - 14856-14862: "meta.tag.dict.xml.plist" - 14856-14857: "punctuation.definition.tag.xml.plist" - Data: "<" - 14857-14861: "entity.name.tag.xml.plist" - 14857-14861: "entity.name.tag.localname.xml.plist" - Data: "dict" - 14861-14862: "punctuation.definition.tag.xml.plist" - Data: ">" - 14869-14881: "" - 14869-14874: "meta.tag.key.xml.plist" - 14869-14870: "punctuation.definition.tag.xml.plist" - Data: "<" - 14870-14873: "entity.name.tag.xml.plist" - 14870-14873: "entity.name.tag.localname.xml.plist" - Data: "key" - 14873-14874: "punctuation.definition.tag.xml.plist" - Data: ">" - 14875-14881: "meta.tag.key.xml.plist" - 14875-14877: "punctuation.definition.tag.xml.plist" - Data: "" - 14888-14981: "" - 14888-14894: "meta.tag.dict.xml.plist" - 14888-14889: "punctuation.definition.tag.xml.plist" - Data: "<" - 14889-14893: "entity.name.tag.xml.plist" - 14889-14893: "entity.name.tag.localname.xml.plist" - Data: "dict" - 14893-14894: "punctuation.definition.tag.xml.plist" - Data: ">" - 14902-14917: "" - 14902-14907: "meta.tag.key.xml.plist" - 14902-14903: "punctuation.definition.tag.xml.plist" - Data: "<" - 14903-14906: "entity.name.tag.xml.plist" - 14903-14906: "entity.name.tag.localname.xml.plist" - Data: "key" - 14906-14907: "punctuation.definition.tag.xml.plist" - Data: ">" - 14911-14917: "meta.tag.key.xml.plist" - 14911-14913: "punctuation.definition.tag.xml.plist" - Data: "" - 14925-14967: "" - 14925-14933: "meta.tag.string.xml.plist" - 14925-14926: "punctuation.definition.tag.xml.plist" - Data: "<" - 14926-14932: "entity.name.tag.xml.plist" - 14926-14932: "entity.name.tag.localname.xml.plist" - Data: "string" - 14932-14933: "punctuation.definition.tag.xml.plist" - Data: ">" - 14958-14967: "meta.tag.string.xml.plist" - 14958-14960: "punctuation.definition.tag.xml.plist" - Data: "" - 14974-14981: "meta.tag.dict.xml.plist" - 14974-14976: "punctuation.definition.tag.xml.plist" - Data: "" - 14988-15000: "" - 14988-14993: "meta.tag.key.xml.plist" - 14988-14989: "punctuation.definition.tag.xml.plist" - Data: "<" - 14989-14992: "entity.name.tag.xml.plist" - 14989-14992: "entity.name.tag.localname.xml.plist" - Data: "key" - 14992-14993: "punctuation.definition.tag.xml.plist" - Data: ">" - 14994-15000: "meta.tag.key.xml.plist" - 14994-14996: "punctuation.definition.tag.xml.plist" - Data: "" - 15007-15111: "" - 15007-15013: "meta.tag.dict.xml.plist" - 15007-15008: "punctuation.definition.tag.xml.plist" - Data: "<" - 15008-15012: "entity.name.tag.xml.plist" - 15008-15012: "entity.name.tag.localname.xml.plist" - Data: "dict" - 15012-15013: "punctuation.definition.tag.xml.plist" - Data: ">" - 15021-15036: "" - 15021-15026: "meta.tag.key.xml.plist" - 15021-15022: "punctuation.definition.tag.xml.plist" - Data: "<" - 15022-15025: "entity.name.tag.xml.plist" - 15022-15025: "entity.name.tag.localname.xml.plist" - Data: "key" - 15025-15026: "punctuation.definition.tag.xml.plist" - Data: ">" - 15030-15036: "meta.tag.key.xml.plist" - 15030-15032: "punctuation.definition.tag.xml.plist" - Data: "" - 15044-15097: "" - 15044-15052: "meta.tag.string.xml.plist" - 15044-15045: "punctuation.definition.tag.xml.plist" - Data: "<" - 15045-15051: "entity.name.tag.xml.plist" - 15045-15051: "entity.name.tag.localname.xml.plist" - Data: "string" - 15051-15052: "punctuation.definition.tag.xml.plist" - Data: ">" - 15088-15097: "meta.tag.string.xml.plist" - 15088-15090: "punctuation.definition.tag.xml.plist" - Data: "" - 15104-15111: "meta.tag.dict.xml.plist" - 15104-15106: "punctuation.definition.tag.xml.plist" - Data: "" - 15118-15130: "" - 15118-15123: "meta.tag.key.xml.plist" - 15118-15119: "punctuation.definition.tag.xml.plist" - Data: "<" - 15119-15122: "entity.name.tag.xml.plist" - 15119-15122: "entity.name.tag.localname.xml.plist" - Data: "key" - 15122-15123: "punctuation.definition.tag.xml.plist" - Data: ">" - 15124-15130: "meta.tag.key.xml.plist" - 15124-15126: "punctuation.definition.tag.xml.plist" - Data: "" - 15137-15230: "" - 15137-15143: "meta.tag.dict.xml.plist" - 15137-15138: "punctuation.definition.tag.xml.plist" - Data: "<" - 15138-15142: "entity.name.tag.xml.plist" - 15138-15142: "entity.name.tag.localname.xml.plist" - Data: "dict" - 15142-15143: "punctuation.definition.tag.xml.plist" - Data: ">" - 15151-15166: "" - 15151-15156: "meta.tag.key.xml.plist" - 15151-15152: "punctuation.definition.tag.xml.plist" - Data: "<" - 15152-15155: "entity.name.tag.xml.plist" - 15152-15155: "entity.name.tag.localname.xml.plist" - Data: "key" - 15155-15156: "punctuation.definition.tag.xml.plist" - Data: ">" - 15160-15166: "meta.tag.key.xml.plist" - 15160-15162: "punctuation.definition.tag.xml.plist" - Data: "" - 15174-15216: "" - 15174-15182: "meta.tag.string.xml.plist" - 15174-15175: "punctuation.definition.tag.xml.plist" - Data: "<" - 15175-15181: "entity.name.tag.xml.plist" - 15175-15181: "entity.name.tag.localname.xml.plist" - Data: "string" - 15181-15182: "punctuation.definition.tag.xml.plist" - Data: ">" - 15207-15216: "meta.tag.string.xml.plist" - 15207-15209: "punctuation.definition.tag.xml.plist" - Data: "" - 15223-15230: "meta.tag.dict.xml.plist" - 15223-15225: "punctuation.definition.tag.xml.plist" - Data: "" - 15237-15249: "" - 15237-15242: "meta.tag.key.xml.plist" - 15237-15238: "punctuation.definition.tag.xml.plist" - Data: "<" - 15238-15241: "entity.name.tag.xml.plist" - 15238-15241: "entity.name.tag.localname.xml.plist" - Data: "key" - 15241-15242: "punctuation.definition.tag.xml.plist" - Data: ">" - 15243-15249: "meta.tag.key.xml.plist" - 15243-15245: "punctuation.definition.tag.xml.plist" - Data: "" - 15256-15359: "" - 15256-15262: "meta.tag.dict.xml.plist" - 15256-15257: "punctuation.definition.tag.xml.plist" - Data: "<" - 15257-15261: "entity.name.tag.xml.plist" - 15257-15261: "entity.name.tag.localname.xml.plist" - Data: "dict" - 15261-15262: "punctuation.definition.tag.xml.plist" - Data: ">" - 15270-15285: "" - 15270-15275: "meta.tag.key.xml.plist" - 15270-15271: "punctuation.definition.tag.xml.plist" - Data: "<" - 15271-15274: "entity.name.tag.xml.plist" - 15271-15274: "entity.name.tag.localname.xml.plist" - Data: "key" - 15274-15275: "punctuation.definition.tag.xml.plist" - Data: ">" - 15279-15285: "meta.tag.key.xml.plist" - 15279-15281: "punctuation.definition.tag.xml.plist" - Data: "" - 15293-15345: "" - 15293-15301: "meta.tag.string.xml.plist" - 15293-15294: "punctuation.definition.tag.xml.plist" - Data: "<" - 15294-15300: "entity.name.tag.xml.plist" - 15294-15300: "entity.name.tag.localname.xml.plist" - Data: "string" - 15300-15301: "punctuation.definition.tag.xml.plist" - Data: ">" - 15336-15345: "meta.tag.string.xml.plist" - 15336-15338: "punctuation.definition.tag.xml.plist" - Data: "" - 15352-15359: "meta.tag.dict.xml.plist" - 15352-15354: "punctuation.definition.tag.xml.plist" - Data: "" - 15366-15378: "" - 15366-15371: "meta.tag.key.xml.plist" - 15366-15367: "punctuation.definition.tag.xml.plist" - Data: "<" - 15367-15370: "entity.name.tag.xml.plist" - 15367-15370: "entity.name.tag.localname.xml.plist" - Data: "key" - 15370-15371: "punctuation.definition.tag.xml.plist" - Data: ">" - 15372-15378: "meta.tag.key.xml.plist" - 15372-15374: "punctuation.definition.tag.xml.plist" - Data: "" - 15385-15489: "" - 15385-15391: "meta.tag.dict.xml.plist" - 15385-15386: "punctuation.definition.tag.xml.plist" - Data: "<" - 15386-15390: "entity.name.tag.xml.plist" - 15386-15390: "entity.name.tag.localname.xml.plist" - Data: "dict" - 15390-15391: "punctuation.definition.tag.xml.plist" - Data: ">" - 15399-15414: "" - 15399-15404: "meta.tag.key.xml.plist" - 15399-15400: "punctuation.definition.tag.xml.plist" - Data: "<" - 15400-15403: "entity.name.tag.xml.plist" - 15400-15403: "entity.name.tag.localname.xml.plist" - Data: "key" - 15403-15404: "punctuation.definition.tag.xml.plist" - Data: ">" - 15408-15414: "meta.tag.key.xml.plist" - 15408-15410: "punctuation.definition.tag.xml.plist" - Data: "" - 15422-15475: "" - 15422-15430: "meta.tag.string.xml.plist" - 15422-15423: "punctuation.definition.tag.xml.plist" - Data: "<" - 15423-15429: "entity.name.tag.xml.plist" - 15423-15429: "entity.name.tag.localname.xml.plist" - Data: "string" - 15429-15430: "punctuation.definition.tag.xml.plist" - Data: ">" - 15466-15475: "meta.tag.string.xml.plist" - 15466-15468: "punctuation.definition.tag.xml.plist" - Data: "" - 15482-15489: "meta.tag.dict.xml.plist" - 15482-15484: "punctuation.definition.tag.xml.plist" - Data: "" - 15495-15502: "meta.tag.dict.xml.plist" - 15495-15497: "punctuation.definition.tag.xml.plist" - Data: "" - 15508-15526: "" - 15508-15513: "meta.tag.key.xml.plist" - 15508-15509: "punctuation.definition.tag.xml.plist" - Data: "<" - 15509-15512: "entity.name.tag.xml.plist" - 15509-15512: "entity.name.tag.localname.xml.plist" - Data: "key" - 15512-15513: "punctuation.definition.tag.xml.plist" - Data: ">" - 15520-15526: "meta.tag.key.xml.plist" - 15520-15522: "punctuation.definition.tag.xml.plist" - Data: "" - 15532-15568: "" - 15532-15540: "meta.tag.string.xml.plist" - 15532-15533: "punctuation.definition.tag.xml.plist" - Data: "<" - 15533-15539: "entity.name.tag.xml.plist" - 15533-15539: "entity.name.tag.localname.xml.plist" - Data: "string" - 15539-15540: "punctuation.definition.tag.xml.plist" - Data: ">" - 15559-15568: "meta.tag.string.xml.plist" - 15559-15561: "punctuation.definition.tag.xml.plist" - Data: "" - 15574-15590: "" - 15574-15579: "meta.tag.key.xml.plist" - 15574-15575: "punctuation.definition.tag.xml.plist" - Data: "<" - 15575-15578: "entity.name.tag.xml.plist" - 15575-15578: "entity.name.tag.localname.xml.plist" - Data: "key" - 15578-15579: "punctuation.definition.tag.xml.plist" - Data: ">" - 15584-15590: "meta.tag.key.xml.plist" - 15584-15586: "punctuation.definition.tag.xml.plist" - Data: "" - 15596-15642: "" - 15596-15604: "meta.tag.string.xml.plist" - 15596-15597: "punctuation.definition.tag.xml.plist" - Data: "<" - 15597-15603: "entity.name.tag.xml.plist" - 15597-15603: "entity.name.tag.localname.xml.plist" - Data: "string" - 15603-15604: "punctuation.definition.tag.xml.plist" - Data: ">" - 15633-15642: "meta.tag.string.xml.plist" - 15633-15635: "punctuation.definition.tag.xml.plist" - Data: "" - 15647-15654: "meta.tag.dict.xml.plist" - 15647-15649: "punctuation.definition.tag.xml.plist" - Data: "" - 15659-16485: "" - 15659-15665: "meta.tag.dict.xml.plist" - 15659-15660: "punctuation.definition.tag.xml.plist" - Data: "<" - 15660-15664: "entity.name.tag.xml.plist" - 15660-15664: "entity.name.tag.localname.xml.plist" - Data: "dict" - 15664-15665: "punctuation.definition.tag.xml.plist" - Data: ">" - 15671-15690: "" - 15671-15676: "meta.tag.key.xml.plist" - 15671-15672: "punctuation.definition.tag.xml.plist" - Data: "<" - 15672-15675: "entity.name.tag.xml.plist" - 15672-15675: "entity.name.tag.localname.xml.plist" - Data: "key" - 15675-15676: "punctuation.definition.tag.xml.plist" - Data: ">" - 15684-15690: "meta.tag.key.xml.plist" - 15684-15686: "punctuation.definition.tag.xml.plist" - Data: "" - 15696-16339: "" - 15696-15702: "meta.tag.dict.xml.plist" - 15696-15697: "punctuation.definition.tag.xml.plist" - Data: "<" - 15697-15701: "entity.name.tag.xml.plist" - 15697-15701: "entity.name.tag.localname.xml.plist" - Data: "dict" - 15701-15702: "punctuation.definition.tag.xml.plist" - Data: ">" - 15709-15721: "" - 15709-15714: "meta.tag.key.xml.plist" - 15709-15710: "punctuation.definition.tag.xml.plist" - Data: "<" - 15710-15713: "entity.name.tag.xml.plist" - 15710-15713: "entity.name.tag.localname.xml.plist" - Data: "key" - 15713-15714: "punctuation.definition.tag.xml.plist" - Data: ">" - 15715-15721: "meta.tag.key.xml.plist" - 15715-15717: "punctuation.definition.tag.xml.plist" - Data: "" - 15728-15818: "" - 15728-15734: "meta.tag.dict.xml.plist" - 15728-15729: "punctuation.definition.tag.xml.plist" - Data: "<" - 15729-15733: "entity.name.tag.xml.plist" - 15729-15733: "entity.name.tag.localname.xml.plist" - Data: "dict" - 15733-15734: "punctuation.definition.tag.xml.plist" - Data: ">" - 15742-15757: "" - 15742-15747: "meta.tag.key.xml.plist" - 15742-15743: "punctuation.definition.tag.xml.plist" - Data: "<" - 15743-15746: "entity.name.tag.xml.plist" - 15743-15746: "entity.name.tag.localname.xml.plist" - Data: "key" - 15746-15747: "punctuation.definition.tag.xml.plist" - Data: ">" - 15751-15757: "meta.tag.key.xml.plist" - 15751-15753: "punctuation.definition.tag.xml.plist" - Data: "" - 15765-15804: "" - 15765-15773: "meta.tag.string.xml.plist" - 15765-15766: "punctuation.definition.tag.xml.plist" - Data: "<" - 15766-15772: "entity.name.tag.xml.plist" - 15766-15772: "entity.name.tag.localname.xml.plist" - Data: "string" - 15772-15773: "punctuation.definition.tag.xml.plist" - Data: ">" - 15795-15804: "meta.tag.string.xml.plist" - 15795-15797: "punctuation.definition.tag.xml.plist" - Data: "" - 15811-15818: "meta.tag.dict.xml.plist" - 15811-15813: "punctuation.definition.tag.xml.plist" - Data: "" - 15825-15837: "" - 15825-15830: "meta.tag.key.xml.plist" - 15825-15826: "punctuation.definition.tag.xml.plist" - Data: "<" - 15826-15829: "entity.name.tag.xml.plist" - 15826-15829: "entity.name.tag.localname.xml.plist" - Data: "key" - 15829-15830: "punctuation.definition.tag.xml.plist" - Data: ">" - 15831-15837: "meta.tag.key.xml.plist" - 15831-15833: "punctuation.definition.tag.xml.plist" - Data: "" - 15844-15948: "" - 15844-15850: "meta.tag.dict.xml.plist" - 15844-15845: "punctuation.definition.tag.xml.plist" - Data: "<" - 15845-15849: "entity.name.tag.xml.plist" - 15845-15849: "entity.name.tag.localname.xml.plist" - Data: "dict" - 15849-15850: "punctuation.definition.tag.xml.plist" - Data: ">" - 15858-15873: "" - 15858-15863: "meta.tag.key.xml.plist" - 15858-15859: "punctuation.definition.tag.xml.plist" - Data: "<" - 15859-15862: "entity.name.tag.xml.plist" - 15859-15862: "entity.name.tag.localname.xml.plist" - Data: "key" - 15862-15863: "punctuation.definition.tag.xml.plist" - Data: ">" - 15867-15873: "meta.tag.key.xml.plist" - 15867-15869: "punctuation.definition.tag.xml.plist" - Data: "" - 15881-15934: "" - 15881-15889: "meta.tag.string.xml.plist" - 15881-15882: "punctuation.definition.tag.xml.plist" - Data: "<" - 15882-15888: "entity.name.tag.xml.plist" - 15882-15888: "entity.name.tag.localname.xml.plist" - Data: "string" - 15888-15889: "punctuation.definition.tag.xml.plist" - Data: ">" - 15925-15934: "meta.tag.string.xml.plist" - 15925-15927: "punctuation.definition.tag.xml.plist" - Data: "" - 15941-15948: "meta.tag.dict.xml.plist" - 15941-15943: "punctuation.definition.tag.xml.plist" - Data: "" - 15955-15967: "" - 15955-15960: "meta.tag.key.xml.plist" - 15955-15956: "punctuation.definition.tag.xml.plist" - Data: "<" - 15956-15959: "entity.name.tag.xml.plist" - 15956-15959: "entity.name.tag.localname.xml.plist" - Data: "key" - 15959-15960: "punctuation.definition.tag.xml.plist" - Data: ">" - 15961-15967: "meta.tag.key.xml.plist" - 15961-15963: "punctuation.definition.tag.xml.plist" - Data: "" - 15974-16067: "" - 15974-15980: "meta.tag.dict.xml.plist" - 15974-15975: "punctuation.definition.tag.xml.plist" - Data: "<" - 15975-15979: "entity.name.tag.xml.plist" - 15975-15979: "entity.name.tag.localname.xml.plist" - Data: "dict" - 15979-15980: "punctuation.definition.tag.xml.plist" - Data: ">" - 15988-16003: "" - 15988-15993: "meta.tag.key.xml.plist" - 15988-15989: "punctuation.definition.tag.xml.plist" - Data: "<" - 15989-15992: "entity.name.tag.xml.plist" - 15989-15992: "entity.name.tag.localname.xml.plist" - Data: "key" - 15992-15993: "punctuation.definition.tag.xml.plist" - Data: ">" - 15997-16003: "meta.tag.key.xml.plist" - 15997-15999: "punctuation.definition.tag.xml.plist" - Data: "" - 16011-16053: "" - 16011-16019: "meta.tag.string.xml.plist" - 16011-16012: "punctuation.definition.tag.xml.plist" - Data: "<" - 16012-16018: "entity.name.tag.xml.plist" - 16012-16018: "entity.name.tag.localname.xml.plist" - Data: "string" - 16018-16019: "punctuation.definition.tag.xml.plist" - Data: ">" - 16044-16053: "meta.tag.string.xml.plist" - 16044-16046: "punctuation.definition.tag.xml.plist" - Data: "" - 16060-16067: "meta.tag.dict.xml.plist" - 16060-16062: "punctuation.definition.tag.xml.plist" - Data: "" - 16074-16086: "" - 16074-16079: "meta.tag.key.xml.plist" - 16074-16075: "punctuation.definition.tag.xml.plist" - Data: "<" - 16075-16078: "entity.name.tag.xml.plist" - 16075-16078: "entity.name.tag.localname.xml.plist" - Data: "key" - 16078-16079: "punctuation.definition.tag.xml.plist" - Data: ">" - 16080-16086: "meta.tag.key.xml.plist" - 16080-16082: "punctuation.definition.tag.xml.plist" - Data: "" - 16093-16196: "" - 16093-16099: "meta.tag.dict.xml.plist" - 16093-16094: "punctuation.definition.tag.xml.plist" - Data: "<" - 16094-16098: "entity.name.tag.xml.plist" - 16094-16098: "entity.name.tag.localname.xml.plist" - Data: "dict" - 16098-16099: "punctuation.definition.tag.xml.plist" - Data: ">" - 16107-16122: "" - 16107-16112: "meta.tag.key.xml.plist" - 16107-16108: "punctuation.definition.tag.xml.plist" - Data: "<" - 16108-16111: "entity.name.tag.xml.plist" - 16108-16111: "entity.name.tag.localname.xml.plist" - Data: "key" - 16111-16112: "punctuation.definition.tag.xml.plist" - Data: ">" - 16116-16122: "meta.tag.key.xml.plist" - 16116-16118: "punctuation.definition.tag.xml.plist" - Data: "" - 16130-16182: "" - 16130-16138: "meta.tag.string.xml.plist" - 16130-16131: "punctuation.definition.tag.xml.plist" - Data: "<" - 16131-16137: "entity.name.tag.xml.plist" - 16131-16137: "entity.name.tag.localname.xml.plist" - Data: "string" - 16137-16138: "punctuation.definition.tag.xml.plist" - Data: ">" - 16173-16182: "meta.tag.string.xml.plist" - 16173-16175: "punctuation.definition.tag.xml.plist" - Data: "" - 16189-16196: "meta.tag.dict.xml.plist" - 16189-16191: "punctuation.definition.tag.xml.plist" - Data: "" - 16203-16215: "" - 16203-16208: "meta.tag.key.xml.plist" - 16203-16204: "punctuation.definition.tag.xml.plist" - Data: "<" - 16204-16207: "entity.name.tag.xml.plist" - 16204-16207: "entity.name.tag.localname.xml.plist" - Data: "key" - 16207-16208: "punctuation.definition.tag.xml.plist" - Data: ">" - 16209-16215: "meta.tag.key.xml.plist" - 16209-16211: "punctuation.definition.tag.xml.plist" - Data: "" - 16222-16326: "" - 16222-16228: "meta.tag.dict.xml.plist" - 16222-16223: "punctuation.definition.tag.xml.plist" - Data: "<" - 16223-16227: "entity.name.tag.xml.plist" - 16223-16227: "entity.name.tag.localname.xml.plist" - Data: "dict" - 16227-16228: "punctuation.definition.tag.xml.plist" - Data: ">" - 16236-16251: "" - 16236-16241: "meta.tag.key.xml.plist" - 16236-16237: "punctuation.definition.tag.xml.plist" - Data: "<" - 16237-16240: "entity.name.tag.xml.plist" - 16237-16240: "entity.name.tag.localname.xml.plist" - Data: "key" - 16240-16241: "punctuation.definition.tag.xml.plist" - Data: ">" - 16245-16251: "meta.tag.key.xml.plist" - 16245-16247: "punctuation.definition.tag.xml.plist" - Data: "" - 16259-16312: "" - 16259-16267: "meta.tag.string.xml.plist" - 16259-16260: "punctuation.definition.tag.xml.plist" - Data: "<" - 16260-16266: "entity.name.tag.xml.plist" - 16260-16266: "entity.name.tag.localname.xml.plist" - Data: "string" - 16266-16267: "punctuation.definition.tag.xml.plist" - Data: ">" - 16303-16312: "meta.tag.string.xml.plist" - 16303-16305: "punctuation.definition.tag.xml.plist" - Data: "" - 16319-16326: "meta.tag.dict.xml.plist" - 16319-16321: "punctuation.definition.tag.xml.plist" - Data: "" - 16332-16339: "meta.tag.dict.xml.plist" - 16332-16334: "punctuation.definition.tag.xml.plist" - Data: "" - 16345-16363: "" - 16345-16350: "meta.tag.key.xml.plist" - 16345-16346: "punctuation.definition.tag.xml.plist" - Data: "<" - 16346-16349: "entity.name.tag.xml.plist" - 16346-16349: "entity.name.tag.localname.xml.plist" - Data: "key" - 16349-16350: "punctuation.definition.tag.xml.plist" - Data: ">" - 16357-16363: "meta.tag.key.xml.plist" - 16357-16359: "punctuation.definition.tag.xml.plist" - Data: "" - 16369-16402: "" - 16369-16377: "meta.tag.string.xml.plist" - 16369-16370: "punctuation.definition.tag.xml.plist" - Data: "<" - 16370-16376: "entity.name.tag.xml.plist" - 16370-16376: "entity.name.tag.localname.xml.plist" - Data: "string" - 16376-16377: "punctuation.definition.tag.xml.plist" - Data: ">" - 16393-16402: "meta.tag.string.xml.plist" - 16393-16395: "punctuation.definition.tag.xml.plist" - Data: "" - 16408-16424: "" - 16408-16413: "meta.tag.key.xml.plist" - 16408-16409: "punctuation.definition.tag.xml.plist" - Data: "<" - 16409-16412: "entity.name.tag.xml.plist" - 16409-16412: "entity.name.tag.localname.xml.plist" - Data: "key" - 16412-16413: "punctuation.definition.tag.xml.plist" - Data: ">" - 16418-16424: "meta.tag.key.xml.plist" - 16418-16420: "punctuation.definition.tag.xml.plist" - Data: "" - 16430-16473: "" - 16430-16438: "meta.tag.string.xml.plist" - 16430-16431: "punctuation.definition.tag.xml.plist" - Data: "<" - 16431-16437: "entity.name.tag.xml.plist" - 16431-16437: "entity.name.tag.localname.xml.plist" - Data: "string" - 16437-16438: "punctuation.definition.tag.xml.plist" - Data: ">" - 16464-16473: "meta.tag.string.xml.plist" - 16464-16466: "punctuation.definition.tag.xml.plist" - Data: "" - 16478-16485: "meta.tag.dict.xml.plist" - 16478-16480: "punctuation.definition.tag.xml.plist" - Data: "" - 16490-17512: "" - 16490-16496: "meta.tag.dict.xml.plist" - 16490-16491: "punctuation.definition.tag.xml.plist" - Data: "<" - 16491-16495: "entity.name.tag.xml.plist" - 16491-16495: "entity.name.tag.localname.xml.plist" - Data: "dict" - 16495-16496: "punctuation.definition.tag.xml.plist" - Data: ">" - 16502-16518: "" - 16502-16507: "meta.tag.key.xml.plist" - 16502-16503: "punctuation.definition.tag.xml.plist" - Data: "<" - 16503-16506: "entity.name.tag.xml.plist" - 16503-16506: "entity.name.tag.localname.xml.plist" - Data: "key" - 16506-16507: "punctuation.definition.tag.xml.plist" - Data: ">" - 16512-16518: "meta.tag.key.xml.plist" - 16512-16514: "punctuation.definition.tag.xml.plist" - Data: "" - 16524-16563: "" - 16524-16532: "meta.tag.string.xml.plist" - 16524-16525: "punctuation.definition.tag.xml.plist" - Data: "<" - 16525-16531: "entity.name.tag.xml.plist" - 16525-16531: "entity.name.tag.localname.xml.plist" - Data: "string" - 16531-16532: "punctuation.definition.tag.xml.plist" - Data: ">" - 16554-16563: "meta.tag.string.xml.plist" - 16554-16556: "punctuation.definition.tag.xml.plist" - Data: "" - 16569-16588: "" - 16569-16574: "meta.tag.key.xml.plist" - 16569-16570: "punctuation.definition.tag.xml.plist" - Data: "<" - 16570-16573: "entity.name.tag.xml.plist" - 16570-16573: "entity.name.tag.localname.xml.plist" - Data: "key" - 16573-16574: "punctuation.definition.tag.xml.plist" - Data: ">" - 16582-16588: "meta.tag.key.xml.plist" - 16582-16584: "punctuation.definition.tag.xml.plist" - Data: "" - 16594-17238: "" - 16594-16600: "meta.tag.dict.xml.plist" - 16594-16595: "punctuation.definition.tag.xml.plist" - Data: "<" - 16595-16599: "entity.name.tag.xml.plist" - 16595-16599: "entity.name.tag.localname.xml.plist" - Data: "dict" - 16599-16600: "punctuation.definition.tag.xml.plist" - Data: ">" - 16607-16619: "" - 16607-16612: "meta.tag.key.xml.plist" - 16607-16608: "punctuation.definition.tag.xml.plist" - Data: "<" - 16608-16611: "entity.name.tag.xml.plist" - 16608-16611: "entity.name.tag.localname.xml.plist" - Data: "key" - 16611-16612: "punctuation.definition.tag.xml.plist" - Data: ">" - 16613-16619: "meta.tag.key.xml.plist" - 16613-16615: "punctuation.definition.tag.xml.plist" - Data: "" - 16626-16717: "" - 16626-16632: "meta.tag.dict.xml.plist" - 16626-16627: "punctuation.definition.tag.xml.plist" - Data: "<" - 16627-16631: "entity.name.tag.xml.plist" - 16627-16631: "entity.name.tag.localname.xml.plist" - Data: "dict" - 16631-16632: "punctuation.definition.tag.xml.plist" - Data: ">" - 16640-16655: "" - 16640-16645: "meta.tag.key.xml.plist" - 16640-16641: "punctuation.definition.tag.xml.plist" - Data: "<" - 16641-16644: "entity.name.tag.xml.plist" - 16641-16644: "entity.name.tag.localname.xml.plist" - Data: "key" - 16644-16645: "punctuation.definition.tag.xml.plist" - Data: ">" - 16649-16655: "meta.tag.key.xml.plist" - 16649-16651: "punctuation.definition.tag.xml.plist" - Data: "" - 16663-16703: "" - 16663-16671: "meta.tag.string.xml.plist" - 16663-16664: "punctuation.definition.tag.xml.plist" - Data: "<" - 16664-16670: "entity.name.tag.xml.plist" - 16664-16670: "entity.name.tag.localname.xml.plist" - Data: "string" - 16670-16671: "punctuation.definition.tag.xml.plist" - Data: ">" - 16694-16703: "meta.tag.string.xml.plist" - 16694-16696: "punctuation.definition.tag.xml.plist" - Data: "" - 16710-16717: "meta.tag.dict.xml.plist" - 16710-16712: "punctuation.definition.tag.xml.plist" - Data: "" - 16724-16736: "" - 16724-16729: "meta.tag.key.xml.plist" - 16724-16725: "punctuation.definition.tag.xml.plist" - Data: "<" - 16725-16728: "entity.name.tag.xml.plist" - 16725-16728: "entity.name.tag.localname.xml.plist" - Data: "key" - 16728-16729: "punctuation.definition.tag.xml.plist" - Data: ">" - 16730-16736: "meta.tag.key.xml.plist" - 16730-16732: "punctuation.definition.tag.xml.plist" - Data: "" - 16743-16847: "" - 16743-16749: "meta.tag.dict.xml.plist" - 16743-16744: "punctuation.definition.tag.xml.plist" - Data: "<" - 16744-16748: "entity.name.tag.xml.plist" - 16744-16748: "entity.name.tag.localname.xml.plist" - Data: "dict" - 16748-16749: "punctuation.definition.tag.xml.plist" - Data: ">" - 16757-16772: "" - 16757-16762: "meta.tag.key.xml.plist" - 16757-16758: "punctuation.definition.tag.xml.plist" - Data: "<" - 16758-16761: "entity.name.tag.xml.plist" - 16758-16761: "entity.name.tag.localname.xml.plist" - Data: "key" - 16761-16762: "punctuation.definition.tag.xml.plist" - Data: ">" - 16766-16772: "meta.tag.key.xml.plist" - 16766-16768: "punctuation.definition.tag.xml.plist" - Data: "" - 16780-16833: "" - 16780-16788: "meta.tag.string.xml.plist" - 16780-16781: "punctuation.definition.tag.xml.plist" - Data: "<" - 16781-16787: "entity.name.tag.xml.plist" - 16781-16787: "entity.name.tag.localname.xml.plist" - Data: "string" - 16787-16788: "punctuation.definition.tag.xml.plist" - Data: ">" - 16824-16833: "meta.tag.string.xml.plist" - 16824-16826: "punctuation.definition.tag.xml.plist" - Data: "" - 16840-16847: "meta.tag.dict.xml.plist" - 16840-16842: "punctuation.definition.tag.xml.plist" - Data: "" - 16854-16866: "" - 16854-16859: "meta.tag.key.xml.plist" - 16854-16855: "punctuation.definition.tag.xml.plist" - Data: "<" - 16855-16858: "entity.name.tag.xml.plist" - 16855-16858: "entity.name.tag.localname.xml.plist" - Data: "key" - 16858-16859: "punctuation.definition.tag.xml.plist" - Data: ">" - 16860-16866: "meta.tag.key.xml.plist" - 16860-16862: "punctuation.definition.tag.xml.plist" - Data: "" - 16873-16966: "" - 16873-16879: "meta.tag.dict.xml.plist" - 16873-16874: "punctuation.definition.tag.xml.plist" - Data: "<" - 16874-16878: "entity.name.tag.xml.plist" - 16874-16878: "entity.name.tag.localname.xml.plist" - Data: "dict" - 16878-16879: "punctuation.definition.tag.xml.plist" - Data: ">" - 16887-16902: "" - 16887-16892: "meta.tag.key.xml.plist" - 16887-16888: "punctuation.definition.tag.xml.plist" - Data: "<" - 16888-16891: "entity.name.tag.xml.plist" - 16888-16891: "entity.name.tag.localname.xml.plist" - Data: "key" - 16891-16892: "punctuation.definition.tag.xml.plist" - Data: ">" - 16896-16902: "meta.tag.key.xml.plist" - 16896-16898: "punctuation.definition.tag.xml.plist" - Data: "" - 16910-16952: "" - 16910-16918: "meta.tag.string.xml.plist" - 16910-16911: "punctuation.definition.tag.xml.plist" - Data: "<" - 16911-16917: "entity.name.tag.xml.plist" - 16911-16917: "entity.name.tag.localname.xml.plist" - Data: "string" - 16917-16918: "punctuation.definition.tag.xml.plist" - Data: ">" - 16943-16952: "meta.tag.string.xml.plist" - 16943-16945: "punctuation.definition.tag.xml.plist" - Data: "" - 16959-16966: "meta.tag.dict.xml.plist" - 16959-16961: "punctuation.definition.tag.xml.plist" - Data: "" - 16973-16985: "" - 16973-16978: "meta.tag.key.xml.plist" - 16973-16974: "punctuation.definition.tag.xml.plist" - Data: "<" - 16974-16977: "entity.name.tag.xml.plist" - 16974-16977: "entity.name.tag.localname.xml.plist" - Data: "key" - 16977-16978: "punctuation.definition.tag.xml.plist" - Data: ">" - 16979-16985: "meta.tag.key.xml.plist" - 16979-16981: "punctuation.definition.tag.xml.plist" - Data: "" - 16992-17095: "" - 16992-16998: "meta.tag.dict.xml.plist" - 16992-16993: "punctuation.definition.tag.xml.plist" - Data: "<" - 16993-16997: "entity.name.tag.xml.plist" - 16993-16997: "entity.name.tag.localname.xml.plist" - Data: "dict" - 16997-16998: "punctuation.definition.tag.xml.plist" - Data: ">" - 17006-17021: "" - 17006-17011: "meta.tag.key.xml.plist" - 17006-17007: "punctuation.definition.tag.xml.plist" - Data: "<" - 17007-17010: "entity.name.tag.xml.plist" - 17007-17010: "entity.name.tag.localname.xml.plist" - Data: "key" - 17010-17011: "punctuation.definition.tag.xml.plist" - Data: ">" - 17015-17021: "meta.tag.key.xml.plist" - 17015-17017: "punctuation.definition.tag.xml.plist" - Data: "" - 17029-17081: "" - 17029-17037: "meta.tag.string.xml.plist" - 17029-17030: "punctuation.definition.tag.xml.plist" - Data: "<" - 17030-17036: "entity.name.tag.xml.plist" - 17030-17036: "entity.name.tag.localname.xml.plist" - Data: "string" - 17036-17037: "punctuation.definition.tag.xml.plist" - Data: ">" - 17072-17081: "meta.tag.string.xml.plist" - 17072-17074: "punctuation.definition.tag.xml.plist" - Data: "" - 17088-17095: "meta.tag.dict.xml.plist" - 17088-17090: "punctuation.definition.tag.xml.plist" - Data: "" - 17102-17114: "" - 17102-17107: "meta.tag.key.xml.plist" - 17102-17103: "punctuation.definition.tag.xml.plist" - Data: "<" - 17103-17106: "entity.name.tag.xml.plist" - 17103-17106: "entity.name.tag.localname.xml.plist" - Data: "key" - 17106-17107: "punctuation.definition.tag.xml.plist" - Data: ">" - 17108-17114: "meta.tag.key.xml.plist" - 17108-17110: "punctuation.definition.tag.xml.plist" - Data: "" - 17121-17225: "" - 17121-17127: "meta.tag.dict.xml.plist" - 17121-17122: "punctuation.definition.tag.xml.plist" - Data: "<" - 17122-17126: "entity.name.tag.xml.plist" - 17122-17126: "entity.name.tag.localname.xml.plist" - Data: "dict" - 17126-17127: "punctuation.definition.tag.xml.plist" - Data: ">" - 17135-17150: "" - 17135-17140: "meta.tag.key.xml.plist" - 17135-17136: "punctuation.definition.tag.xml.plist" - Data: "<" - 17136-17139: "entity.name.tag.xml.plist" - 17136-17139: "entity.name.tag.localname.xml.plist" - Data: "key" - 17139-17140: "punctuation.definition.tag.xml.plist" - Data: ">" - 17144-17150: "meta.tag.key.xml.plist" - 17144-17146: "punctuation.definition.tag.xml.plist" - Data: "" - 17158-17211: "" - 17158-17166: "meta.tag.string.xml.plist" - 17158-17159: "punctuation.definition.tag.xml.plist" - Data: "<" - 17159-17165: "entity.name.tag.xml.plist" - 17159-17165: "entity.name.tag.localname.xml.plist" - Data: "string" - 17165-17166: "punctuation.definition.tag.xml.plist" - Data: ">" - 17202-17211: "meta.tag.string.xml.plist" - 17202-17204: "punctuation.definition.tag.xml.plist" - Data: "" - 17218-17225: "meta.tag.dict.xml.plist" - 17218-17220: "punctuation.definition.tag.xml.plist" - Data: "" - 17231-17238: "meta.tag.dict.xml.plist" - 17231-17233: "punctuation.definition.tag.xml.plist" - Data: "" - 17244-17262: "" - 17244-17249: "meta.tag.key.xml.plist" - 17244-17245: "punctuation.definition.tag.xml.plist" - Data: "<" - 17245-17248: "entity.name.tag.xml.plist" - 17245-17248: "entity.name.tag.localname.xml.plist" - Data: "key" - 17248-17249: "punctuation.definition.tag.xml.plist" - Data: ">" - 17256-17262: "meta.tag.key.xml.plist" - 17256-17258: "punctuation.definition.tag.xml.plist" - Data: "" - 17268-17295: "" - 17268-17276: "meta.tag.string.xml.plist" - 17268-17269: "punctuation.definition.tag.xml.plist" - Data: "<" - 17269-17275: "entity.name.tag.xml.plist" - 17269-17275: "entity.name.tag.localname.xml.plist" - Data: "string" - 17275-17276: "punctuation.definition.tag.xml.plist" - Data: ">" - 17286-17295: "meta.tag.string.xml.plist" - 17286-17288: "punctuation.definition.tag.xml.plist" - Data: "" - 17301-17315: "" - 17301-17306: "meta.tag.key.xml.plist" - 17301-17302: "punctuation.definition.tag.xml.plist" - Data: "<" - 17302-17305: "entity.name.tag.xml.plist" - 17302-17305: "entity.name.tag.localname.xml.plist" - Data: "key" - 17305-17306: "punctuation.definition.tag.xml.plist" - Data: ">" - 17309-17315: "meta.tag.key.xml.plist" - 17309-17311: "punctuation.definition.tag.xml.plist" - Data: "" - 17321-17361: "" - 17321-17329: "meta.tag.string.xml.plist" - 17321-17322: "punctuation.definition.tag.xml.plist" - Data: "<" - 17322-17328: "entity.name.tag.xml.plist" - 17322-17328: "entity.name.tag.localname.xml.plist" - Data: "string" - 17328-17329: "punctuation.definition.tag.xml.plist" - Data: ">" - 17352-17361: "meta.tag.string.xml.plist" - 17352-17354: "punctuation.definition.tag.xml.plist" - Data: "" - 17367-17386: "" - 17367-17372: "meta.tag.key.xml.plist" - 17367-17368: "punctuation.definition.tag.xml.plist" - Data: "<" - 17368-17371: "entity.name.tag.xml.plist" - 17368-17371: "entity.name.tag.localname.xml.plist" - Data: "key" - 17371-17372: "punctuation.definition.tag.xml.plist" - Data: ">" - 17380-17386: "meta.tag.key.xml.plist" - 17380-17382: "punctuation.definition.tag.xml.plist" - Data: "" - 17392-17500: "" - 17392-17399: "meta.tag.array.xml.plist" - 17392-17393: "punctuation.definition.tag.xml.plist" - Data: "<" - 17393-17398: "entity.name.tag.xml.plist" - 17393-17398: "entity.name.tag.localname.xml.plist" - Data: "array" - 17398-17399: "punctuation.definition.tag.xml.plist" - Data: ">" - 17406-17486: "" - 17406-17412: "meta.tag.dict.xml.plist" - 17406-17407: "punctuation.definition.tag.xml.plist" - Data: "<" - 17407-17411: "entity.name.tag.xml.plist" - 17407-17411: "entity.name.tag.localname.xml.plist" - Data: "dict" - 17411-17412: "punctuation.definition.tag.xml.plist" - Data: ">" - 17420-17438: "" - 17420-17425: "meta.tag.key.xml.plist" - 17420-17421: "punctuation.definition.tag.xml.plist" - Data: "<" - 17421-17424: "entity.name.tag.xml.plist" - 17421-17424: "entity.name.tag.localname.xml.plist" - Data: "key" - 17424-17425: "punctuation.definition.tag.xml.plist" - Data: ">" - 17432-17438: "meta.tag.key.xml.plist" - 17432-17434: "punctuation.definition.tag.xml.plist" - Data: "" - 17446-17472: "" - 17446-17454: "meta.tag.string.xml.plist" - 17446-17447: "punctuation.definition.tag.xml.plist" - Data: "<" - 17447-17453: "entity.name.tag.xml.plist" - 17447-17453: "entity.name.tag.localname.xml.plist" - Data: "string" - 17453-17454: "punctuation.definition.tag.xml.plist" - Data: ">" - 17463-17472: "meta.tag.string.xml.plist" - 17463-17465: "punctuation.definition.tag.xml.plist" - Data: "" - 17479-17486: "meta.tag.dict.xml.plist" - 17479-17481: "punctuation.definition.tag.xml.plist" - Data: "" - 17492-17500: "meta.tag.array.xml.plist" - 17492-17494: "punctuation.definition.tag.xml.plist" - Data: "" - 17505-17512: "meta.tag.dict.xml.plist" - 17505-17507: "punctuation.definition.tag.xml.plist" - Data: "" - 17517-18537: "" - 17517-17523: "meta.tag.dict.xml.plist" - 17517-17518: "punctuation.definition.tag.xml.plist" - Data: "<" - 17518-17522: "entity.name.tag.xml.plist" - 17518-17522: "entity.name.tag.localname.xml.plist" - Data: "dict" - 17522-17523: "punctuation.definition.tag.xml.plist" - Data: ">" - 17529-17545: "" - 17529-17534: "meta.tag.key.xml.plist" - 17529-17530: "punctuation.definition.tag.xml.plist" - Data: "<" - 17530-17533: "entity.name.tag.xml.plist" - 17530-17533: "entity.name.tag.localname.xml.plist" - Data: "key" - 17533-17534: "punctuation.definition.tag.xml.plist" - Data: ">" - 17539-17545: "meta.tag.key.xml.plist" - 17539-17541: "punctuation.definition.tag.xml.plist" - Data: "" - 17551-17591: "" - 17551-17559: "meta.tag.string.xml.plist" - 17551-17552: "punctuation.definition.tag.xml.plist" - Data: "<" - 17552-17558: "entity.name.tag.xml.plist" - 17552-17558: "entity.name.tag.localname.xml.plist" - Data: "string" - 17558-17559: "punctuation.definition.tag.xml.plist" - Data: ">" - 17582-17591: "meta.tag.string.xml.plist" - 17582-17584: "punctuation.definition.tag.xml.plist" - Data: "" - 17597-17616: "" - 17597-17602: "meta.tag.key.xml.plist" - 17597-17598: "punctuation.definition.tag.xml.plist" - Data: "<" - 17598-17601: "entity.name.tag.xml.plist" - 17598-17601: "entity.name.tag.localname.xml.plist" - Data: "key" - 17601-17602: "punctuation.definition.tag.xml.plist" - Data: ">" - 17610-17616: "meta.tag.key.xml.plist" - 17610-17612: "punctuation.definition.tag.xml.plist" - Data: "" - 17622-18267: "" - 17622-17628: "meta.tag.dict.xml.plist" - 17622-17623: "punctuation.definition.tag.xml.plist" - Data: "<" - 17623-17627: "entity.name.tag.xml.plist" - 17623-17627: "entity.name.tag.localname.xml.plist" - Data: "dict" - 17627-17628: "punctuation.definition.tag.xml.plist" - Data: ">" - 17635-17647: "" - 17635-17640: "meta.tag.key.xml.plist" - 17635-17636: "punctuation.definition.tag.xml.plist" - Data: "<" - 17636-17639: "entity.name.tag.xml.plist" - 17636-17639: "entity.name.tag.localname.xml.plist" - Data: "key" - 17639-17640: "punctuation.definition.tag.xml.plist" - Data: ">" - 17641-17647: "meta.tag.key.xml.plist" - 17641-17643: "punctuation.definition.tag.xml.plist" - Data: "" - 17654-17746: "" - 17654-17660: "meta.tag.dict.xml.plist" - 17654-17655: "punctuation.definition.tag.xml.plist" - Data: "<" - 17655-17659: "entity.name.tag.xml.plist" - 17655-17659: "entity.name.tag.localname.xml.plist" - Data: "dict" - 17659-17660: "punctuation.definition.tag.xml.plist" - Data: ">" - 17668-17683: "" - 17668-17673: "meta.tag.key.xml.plist" - 17668-17669: "punctuation.definition.tag.xml.plist" - Data: "<" - 17669-17672: "entity.name.tag.xml.plist" - 17669-17672: "entity.name.tag.localname.xml.plist" - Data: "key" - 17672-17673: "punctuation.definition.tag.xml.plist" - Data: ">" - 17677-17683: "meta.tag.key.xml.plist" - 17677-17679: "punctuation.definition.tag.xml.plist" - Data: "" - 17691-17732: "" - 17691-17699: "meta.tag.string.xml.plist" - 17691-17692: "punctuation.definition.tag.xml.plist" - Data: "<" - 17692-17698: "entity.name.tag.xml.plist" - 17692-17698: "entity.name.tag.localname.xml.plist" - Data: "string" - 17698-17699: "punctuation.definition.tag.xml.plist" - Data: ">" - 17723-17732: "meta.tag.string.xml.plist" - 17723-17725: "punctuation.definition.tag.xml.plist" - Data: "" - 17739-17746: "meta.tag.dict.xml.plist" - 17739-17741: "punctuation.definition.tag.xml.plist" - Data: "" - 17753-17765: "" - 17753-17758: "meta.tag.key.xml.plist" - 17753-17754: "punctuation.definition.tag.xml.plist" - Data: "<" - 17754-17757: "entity.name.tag.xml.plist" - 17754-17757: "entity.name.tag.localname.xml.plist" - Data: "key" - 17757-17758: "punctuation.definition.tag.xml.plist" - Data: ">" - 17759-17765: "meta.tag.key.xml.plist" - 17759-17761: "punctuation.definition.tag.xml.plist" - Data: "" - 17772-17876: "" - 17772-17778: "meta.tag.dict.xml.plist" - 17772-17773: "punctuation.definition.tag.xml.plist" - Data: "<" - 17773-17777: "entity.name.tag.xml.plist" - 17773-17777: "entity.name.tag.localname.xml.plist" - Data: "dict" - 17777-17778: "punctuation.definition.tag.xml.plist" - Data: ">" - 17786-17801: "" - 17786-17791: "meta.tag.key.xml.plist" - 17786-17787: "punctuation.definition.tag.xml.plist" - Data: "<" - 17787-17790: "entity.name.tag.xml.plist" - 17787-17790: "entity.name.tag.localname.xml.plist" - Data: "key" - 17790-17791: "punctuation.definition.tag.xml.plist" - Data: ">" - 17795-17801: "meta.tag.key.xml.plist" - 17795-17797: "punctuation.definition.tag.xml.plist" - Data: "" - 17809-17862: "" - 17809-17817: "meta.tag.string.xml.plist" - 17809-17810: "punctuation.definition.tag.xml.plist" - Data: "<" - 17810-17816: "entity.name.tag.xml.plist" - 17810-17816: "entity.name.tag.localname.xml.plist" - Data: "string" - 17816-17817: "punctuation.definition.tag.xml.plist" - Data: ">" - 17853-17862: "meta.tag.string.xml.plist" - 17853-17855: "punctuation.definition.tag.xml.plist" - Data: "" - 17869-17876: "meta.tag.dict.xml.plist" - 17869-17871: "punctuation.definition.tag.xml.plist" - Data: "" - 17883-17895: "" - 17883-17888: "meta.tag.key.xml.plist" - 17883-17884: "punctuation.definition.tag.xml.plist" - Data: "<" - 17884-17887: "entity.name.tag.xml.plist" - 17884-17887: "entity.name.tag.localname.xml.plist" - Data: "key" - 17887-17888: "punctuation.definition.tag.xml.plist" - Data: ">" - 17889-17895: "meta.tag.key.xml.plist" - 17889-17891: "punctuation.definition.tag.xml.plist" - Data: "" - 17902-17995: "" - 17902-17908: "meta.tag.dict.xml.plist" - 17902-17903: "punctuation.definition.tag.xml.plist" - Data: "<" - 17903-17907: "entity.name.tag.xml.plist" - 17903-17907: "entity.name.tag.localname.xml.plist" - Data: "dict" - 17907-17908: "punctuation.definition.tag.xml.plist" - Data: ">" - 17916-17931: "" - 17916-17921: "meta.tag.key.xml.plist" - 17916-17917: "punctuation.definition.tag.xml.plist" - Data: "<" - 17917-17920: "entity.name.tag.xml.plist" - 17917-17920: "entity.name.tag.localname.xml.plist" - Data: "key" - 17920-17921: "punctuation.definition.tag.xml.plist" - Data: ">" - 17925-17931: "meta.tag.key.xml.plist" - 17925-17927: "punctuation.definition.tag.xml.plist" - Data: "" - 17939-17981: "" - 17939-17947: "meta.tag.string.xml.plist" - 17939-17940: "punctuation.definition.tag.xml.plist" - Data: "<" - 17940-17946: "entity.name.tag.xml.plist" - 17940-17946: "entity.name.tag.localname.xml.plist" - Data: "string" - 17946-17947: "punctuation.definition.tag.xml.plist" - Data: ">" - 17972-17981: "meta.tag.string.xml.plist" - 17972-17974: "punctuation.definition.tag.xml.plist" - Data: "" - 17988-17995: "meta.tag.dict.xml.plist" - 17988-17990: "punctuation.definition.tag.xml.plist" - Data: "" - 18002-18014: "" - 18002-18007: "meta.tag.key.xml.plist" - 18002-18003: "punctuation.definition.tag.xml.plist" - Data: "<" - 18003-18006: "entity.name.tag.xml.plist" - 18003-18006: "entity.name.tag.localname.xml.plist" - Data: "key" - 18006-18007: "punctuation.definition.tag.xml.plist" - Data: ">" - 18008-18014: "meta.tag.key.xml.plist" - 18008-18010: "punctuation.definition.tag.xml.plist" - Data: "" - 18021-18124: "" - 18021-18027: "meta.tag.dict.xml.plist" - 18021-18022: "punctuation.definition.tag.xml.plist" - Data: "<" - 18022-18026: "entity.name.tag.xml.plist" - 18022-18026: "entity.name.tag.localname.xml.plist" - Data: "dict" - 18026-18027: "punctuation.definition.tag.xml.plist" - Data: ">" - 18035-18050: "" - 18035-18040: "meta.tag.key.xml.plist" - 18035-18036: "punctuation.definition.tag.xml.plist" - Data: "<" - 18036-18039: "entity.name.tag.xml.plist" - 18036-18039: "entity.name.tag.localname.xml.plist" - Data: "key" - 18039-18040: "punctuation.definition.tag.xml.plist" - Data: ">" - 18044-18050: "meta.tag.key.xml.plist" - 18044-18046: "punctuation.definition.tag.xml.plist" - Data: "" - 18058-18110: "" - 18058-18066: "meta.tag.string.xml.plist" - 18058-18059: "punctuation.definition.tag.xml.plist" - Data: "<" - 18059-18065: "entity.name.tag.xml.plist" - 18059-18065: "entity.name.tag.localname.xml.plist" - Data: "string" - 18065-18066: "punctuation.definition.tag.xml.plist" - Data: ">" - 18101-18110: "meta.tag.string.xml.plist" - 18101-18103: "punctuation.definition.tag.xml.plist" - Data: "" - 18117-18124: "meta.tag.dict.xml.plist" - 18117-18119: "punctuation.definition.tag.xml.plist" - Data: "" - 18131-18143: "" - 18131-18136: "meta.tag.key.xml.plist" - 18131-18132: "punctuation.definition.tag.xml.plist" - Data: "<" - 18132-18135: "entity.name.tag.xml.plist" - 18132-18135: "entity.name.tag.localname.xml.plist" - Data: "key" - 18135-18136: "punctuation.definition.tag.xml.plist" - Data: ">" - 18137-18143: "meta.tag.key.xml.plist" - 18137-18139: "punctuation.definition.tag.xml.plist" - Data: "" - 18150-18254: "" - 18150-18156: "meta.tag.dict.xml.plist" - 18150-18151: "punctuation.definition.tag.xml.plist" - Data: "<" - 18151-18155: "entity.name.tag.xml.plist" - 18151-18155: "entity.name.tag.localname.xml.plist" - Data: "dict" - 18155-18156: "punctuation.definition.tag.xml.plist" - Data: ">" - 18164-18179: "" - 18164-18169: "meta.tag.key.xml.plist" - 18164-18165: "punctuation.definition.tag.xml.plist" - Data: "<" - 18165-18168: "entity.name.tag.xml.plist" - 18165-18168: "entity.name.tag.localname.xml.plist" - Data: "key" - 18168-18169: "punctuation.definition.tag.xml.plist" - Data: ">" - 18173-18179: "meta.tag.key.xml.plist" - 18173-18175: "punctuation.definition.tag.xml.plist" - Data: "" - 18187-18240: "" - 18187-18195: "meta.tag.string.xml.plist" - 18187-18188: "punctuation.definition.tag.xml.plist" - Data: "<" - 18188-18194: "entity.name.tag.xml.plist" - 18188-18194: "entity.name.tag.localname.xml.plist" - Data: "string" - 18194-18195: "punctuation.definition.tag.xml.plist" - Data: ">" - 18231-18240: "meta.tag.string.xml.plist" - 18231-18233: "punctuation.definition.tag.xml.plist" - Data: "" - 18247-18254: "meta.tag.dict.xml.plist" - 18247-18249: "punctuation.definition.tag.xml.plist" - Data: "" - 18260-18267: "meta.tag.dict.xml.plist" - 18260-18262: "punctuation.definition.tag.xml.plist" - Data: "" - 18273-18291: "" - 18273-18278: "meta.tag.key.xml.plist" - 18273-18274: "punctuation.definition.tag.xml.plist" - Data: "<" - 18274-18277: "entity.name.tag.xml.plist" - 18274-18277: "entity.name.tag.localname.xml.plist" - Data: "key" - 18277-18278: "punctuation.definition.tag.xml.plist" - Data: ">" - 18285-18291: "meta.tag.key.xml.plist" - 18285-18287: "punctuation.definition.tag.xml.plist" - Data: "" - 18297-18319: "" - 18297-18305: "meta.tag.string.xml.plist" - 18297-18298: "punctuation.definition.tag.xml.plist" - Data: "<" - 18298-18304: "entity.name.tag.xml.plist" - 18298-18304: "entity.name.tag.localname.xml.plist" - Data: "string" - 18304-18305: "punctuation.definition.tag.xml.plist" - Data: ">" - 18310-18319: "meta.tag.string.xml.plist" - 18310-18312: "punctuation.definition.tag.xml.plist" - Data: "" - 18325-18339: "" - 18325-18330: "meta.tag.key.xml.plist" - 18325-18326: "punctuation.definition.tag.xml.plist" - Data: "<" - 18326-18329: "entity.name.tag.xml.plist" - 18326-18329: "entity.name.tag.localname.xml.plist" - Data: "key" - 18329-18330: "punctuation.definition.tag.xml.plist" - Data: ">" - 18333-18339: "meta.tag.key.xml.plist" - 18333-18335: "punctuation.definition.tag.xml.plist" - Data: "" - 18345-18386: "" - 18345-18353: "meta.tag.string.xml.plist" - 18345-18346: "punctuation.definition.tag.xml.plist" - Data: "<" - 18346-18352: "entity.name.tag.xml.plist" - 18346-18352: "entity.name.tag.localname.xml.plist" - Data: "string" - 18352-18353: "punctuation.definition.tag.xml.plist" - Data: ">" - 18377-18386: "meta.tag.string.xml.plist" - 18377-18379: "punctuation.definition.tag.xml.plist" - Data: "" - 18392-18411: "" - 18392-18397: "meta.tag.key.xml.plist" - 18392-18393: "punctuation.definition.tag.xml.plist" - Data: "<" - 18393-18396: "entity.name.tag.xml.plist" - 18393-18396: "entity.name.tag.localname.xml.plist" - Data: "key" - 18396-18397: "punctuation.definition.tag.xml.plist" - Data: ">" - 18405-18411: "meta.tag.key.xml.plist" - 18405-18407: "punctuation.definition.tag.xml.plist" - Data: "" - 18417-18525: "" - 18417-18424: "meta.tag.array.xml.plist" - 18417-18418: "punctuation.definition.tag.xml.plist" - Data: "<" - 18418-18423: "entity.name.tag.xml.plist" - 18418-18423: "entity.name.tag.localname.xml.plist" - Data: "array" - 18423-18424: "punctuation.definition.tag.xml.plist" - Data: ">" - 18431-18511: "" - 18431-18437: "meta.tag.dict.xml.plist" - 18431-18432: "punctuation.definition.tag.xml.plist" - Data: "<" - 18432-18436: "entity.name.tag.xml.plist" - 18432-18436: "entity.name.tag.localname.xml.plist" - Data: "dict" - 18436-18437: "punctuation.definition.tag.xml.plist" - Data: ">" - 18445-18463: "" - 18445-18450: "meta.tag.key.xml.plist" - 18445-18446: "punctuation.definition.tag.xml.plist" - Data: "<" - 18446-18449: "entity.name.tag.xml.plist" - 18446-18449: "entity.name.tag.localname.xml.plist" - Data: "key" - 18449-18450: "punctuation.definition.tag.xml.plist" - Data: ">" - 18457-18463: "meta.tag.key.xml.plist" - 18457-18459: "punctuation.definition.tag.xml.plist" - Data: "" - 18471-18497: "" - 18471-18479: "meta.tag.string.xml.plist" - 18471-18472: "punctuation.definition.tag.xml.plist" - Data: "<" - 18472-18478: "entity.name.tag.xml.plist" - 18472-18478: "entity.name.tag.localname.xml.plist" - Data: "string" - 18478-18479: "punctuation.definition.tag.xml.plist" - Data: ">" - 18488-18497: "meta.tag.string.xml.plist" - 18488-18490: "punctuation.definition.tag.xml.plist" - Data: "" - 18504-18511: "meta.tag.dict.xml.plist" - 18504-18506: "punctuation.definition.tag.xml.plist" - Data: "" - 18517-18525: "meta.tag.array.xml.plist" - 18517-18519: "punctuation.definition.tag.xml.plist" - Data: "" - 18530-18537: "meta.tag.dict.xml.plist" - 18530-18532: "punctuation.definition.tag.xml.plist" - Data: "" - 18542-20060: "" - 18542-18548: "meta.tag.dict.xml.plist" - 18542-18543: "punctuation.definition.tag.xml.plist" - Data: "<" - 18543-18547: "entity.name.tag.xml.plist" - 18543-18547: "entity.name.tag.localname.xml.plist" - Data: "dict" - 18547-18548: "punctuation.definition.tag.xml.plist" - Data: ">" - 18554-18570: "" - 18554-18559: "meta.tag.key.xml.plist" - 18554-18555: "punctuation.definition.tag.xml.plist" - Data: "<" - 18555-18558: "entity.name.tag.xml.plist" - 18555-18558: "entity.name.tag.localname.xml.plist" - Data: "key" - 18558-18559: "punctuation.definition.tag.xml.plist" - Data: ">" - 18564-18570: "meta.tag.key.xml.plist" - 18564-18566: "punctuation.definition.tag.xml.plist" - Data: "" - 18576-18617: "" - 18576-18584: "meta.tag.string.xml.plist" - 18576-18577: "punctuation.definition.tag.xml.plist" - Data: "<" - 18577-18583: "entity.name.tag.xml.plist" - 18577-18583: "entity.name.tag.localname.xml.plist" - Data: "string" - 18583-18584: "punctuation.definition.tag.xml.plist" - Data: ">" - 18608-18617: "meta.tag.string.xml.plist" - 18608-18610: "punctuation.definition.tag.xml.plist" - Data: "" - 18623-18642: "" - 18623-18628: "meta.tag.key.xml.plist" - 18623-18624: "punctuation.definition.tag.xml.plist" - Data: "<" - 18624-18627: "entity.name.tag.xml.plist" - 18624-18627: "entity.name.tag.localname.xml.plist" - Data: "key" - 18627-18628: "punctuation.definition.tag.xml.plist" - Data: ">" - 18636-18642: "meta.tag.key.xml.plist" - 18636-18638: "punctuation.definition.tag.xml.plist" - Data: "" - 18648-19294: "" - 18648-18654: "meta.tag.dict.xml.plist" - 18648-18649: "punctuation.definition.tag.xml.plist" - Data: "<" - 18649-18653: "entity.name.tag.xml.plist" - 18649-18653: "entity.name.tag.localname.xml.plist" - Data: "dict" - 18653-18654: "punctuation.definition.tag.xml.plist" - Data: ">" - 18661-18673: "" - 18661-18666: "meta.tag.key.xml.plist" - 18661-18662: "punctuation.definition.tag.xml.plist" - Data: "<" - 18662-18665: "entity.name.tag.xml.plist" - 18662-18665: "entity.name.tag.localname.xml.plist" - Data: "key" - 18665-18666: "punctuation.definition.tag.xml.plist" - Data: ">" - 18667-18673: "meta.tag.key.xml.plist" - 18667-18669: "punctuation.definition.tag.xml.plist" - Data: "" - 18680-18773: "" - 18680-18686: "meta.tag.dict.xml.plist" - 18680-18681: "punctuation.definition.tag.xml.plist" - Data: "<" - 18681-18685: "entity.name.tag.xml.plist" - 18681-18685: "entity.name.tag.localname.xml.plist" - Data: "dict" - 18685-18686: "punctuation.definition.tag.xml.plist" - Data: ">" - 18694-18709: "" - 18694-18699: "meta.tag.key.xml.plist" - 18694-18695: "punctuation.definition.tag.xml.plist" - Data: "<" - 18695-18698: "entity.name.tag.xml.plist" - 18695-18698: "entity.name.tag.localname.xml.plist" - Data: "key" - 18698-18699: "punctuation.definition.tag.xml.plist" - Data: ">" - 18703-18709: "meta.tag.key.xml.plist" - 18703-18705: "punctuation.definition.tag.xml.plist" - Data: "" - 18717-18759: "" - 18717-18725: "meta.tag.string.xml.plist" - 18717-18718: "punctuation.definition.tag.xml.plist" - Data: "<" - 18718-18724: "entity.name.tag.xml.plist" - 18718-18724: "entity.name.tag.localname.xml.plist" - Data: "string" - 18724-18725: "punctuation.definition.tag.xml.plist" - Data: ">" - 18750-18759: "meta.tag.string.xml.plist" - 18750-18752: "punctuation.definition.tag.xml.plist" - Data: "" - 18766-18773: "meta.tag.dict.xml.plist" - 18766-18768: "punctuation.definition.tag.xml.plist" - Data: "" - 18780-18792: "" - 18780-18785: "meta.tag.key.xml.plist" - 18780-18781: "punctuation.definition.tag.xml.plist" - Data: "<" - 18781-18784: "entity.name.tag.xml.plist" - 18781-18784: "entity.name.tag.localname.xml.plist" - Data: "key" - 18784-18785: "punctuation.definition.tag.xml.plist" - Data: ">" - 18786-18792: "meta.tag.key.xml.plist" - 18786-18788: "punctuation.definition.tag.xml.plist" - Data: "" - 18799-18903: "" - 18799-18805: "meta.tag.dict.xml.plist" - 18799-18800: "punctuation.definition.tag.xml.plist" - Data: "<" - 18800-18804: "entity.name.tag.xml.plist" - 18800-18804: "entity.name.tag.localname.xml.plist" - Data: "dict" - 18804-18805: "punctuation.definition.tag.xml.plist" - Data: ">" - 18813-18828: "" - 18813-18818: "meta.tag.key.xml.plist" - 18813-18814: "punctuation.definition.tag.xml.plist" - Data: "<" - 18814-18817: "entity.name.tag.xml.plist" - 18814-18817: "entity.name.tag.localname.xml.plist" - Data: "key" - 18817-18818: "punctuation.definition.tag.xml.plist" - Data: ">" - 18822-18828: "meta.tag.key.xml.plist" - 18822-18824: "punctuation.definition.tag.xml.plist" - Data: "" - 18836-18889: "" - 18836-18844: "meta.tag.string.xml.plist" - 18836-18837: "punctuation.definition.tag.xml.plist" - Data: "<" - 18837-18843: "entity.name.tag.xml.plist" - 18837-18843: "entity.name.tag.localname.xml.plist" - Data: "string" - 18843-18844: "punctuation.definition.tag.xml.plist" - Data: ">" - 18880-18889: "meta.tag.string.xml.plist" - 18880-18882: "punctuation.definition.tag.xml.plist" - Data: "" - 18896-18903: "meta.tag.dict.xml.plist" - 18896-18898: "punctuation.definition.tag.xml.plist" - Data: "" - 18910-18922: "" - 18910-18915: "meta.tag.key.xml.plist" - 18910-18911: "punctuation.definition.tag.xml.plist" - Data: "<" - 18911-18914: "entity.name.tag.xml.plist" - 18911-18914: "entity.name.tag.localname.xml.plist" - Data: "key" - 18914-18915: "punctuation.definition.tag.xml.plist" - Data: ">" - 18916-18922: "meta.tag.key.xml.plist" - 18916-18918: "punctuation.definition.tag.xml.plist" - Data: "" - 18929-19022: "" - 18929-18935: "meta.tag.dict.xml.plist" - 18929-18930: "punctuation.definition.tag.xml.plist" - Data: "<" - 18930-18934: "entity.name.tag.xml.plist" - 18930-18934: "entity.name.tag.localname.xml.plist" - Data: "dict" - 18934-18935: "punctuation.definition.tag.xml.plist" - Data: ">" - 18943-18958: "" - 18943-18948: "meta.tag.key.xml.plist" - 18943-18944: "punctuation.definition.tag.xml.plist" - Data: "<" - 18944-18947: "entity.name.tag.xml.plist" - 18944-18947: "entity.name.tag.localname.xml.plist" - Data: "key" - 18947-18948: "punctuation.definition.tag.xml.plist" - Data: ">" - 18952-18958: "meta.tag.key.xml.plist" - 18952-18954: "punctuation.definition.tag.xml.plist" - Data: "" - 18966-19008: "" - 18966-18974: "meta.tag.string.xml.plist" - 18966-18967: "punctuation.definition.tag.xml.plist" - Data: "<" - 18967-18973: "entity.name.tag.xml.plist" - 18967-18973: "entity.name.tag.localname.xml.plist" - Data: "string" - 18973-18974: "punctuation.definition.tag.xml.plist" - Data: ">" - 18999-19008: "meta.tag.string.xml.plist" - 18999-19001: "punctuation.definition.tag.xml.plist" - Data: "" - 19015-19022: "meta.tag.dict.xml.plist" - 19015-19017: "punctuation.definition.tag.xml.plist" - Data: "" - 19029-19041: "" - 19029-19034: "meta.tag.key.xml.plist" - 19029-19030: "punctuation.definition.tag.xml.plist" - Data: "<" - 19030-19033: "entity.name.tag.xml.plist" - 19030-19033: "entity.name.tag.localname.xml.plist" - Data: "key" - 19033-19034: "punctuation.definition.tag.xml.plist" - Data: ">" - 19035-19041: "meta.tag.key.xml.plist" - 19035-19037: "punctuation.definition.tag.xml.plist" - Data: "" - 19048-19151: "" - 19048-19054: "meta.tag.dict.xml.plist" - 19048-19049: "punctuation.definition.tag.xml.plist" - Data: "<" - 19049-19053: "entity.name.tag.xml.plist" - 19049-19053: "entity.name.tag.localname.xml.plist" - Data: "dict" - 19053-19054: "punctuation.definition.tag.xml.plist" - Data: ">" - 19062-19077: "" - 19062-19067: "meta.tag.key.xml.plist" - 19062-19063: "punctuation.definition.tag.xml.plist" - Data: "<" - 19063-19066: "entity.name.tag.xml.plist" - 19063-19066: "entity.name.tag.localname.xml.plist" - Data: "key" - 19066-19067: "punctuation.definition.tag.xml.plist" - Data: ">" - 19071-19077: "meta.tag.key.xml.plist" - 19071-19073: "punctuation.definition.tag.xml.plist" - Data: "" - 19085-19137: "" - 19085-19093: "meta.tag.string.xml.plist" - 19085-19086: "punctuation.definition.tag.xml.plist" - Data: "<" - 19086-19092: "entity.name.tag.xml.plist" - 19086-19092: "entity.name.tag.localname.xml.plist" - Data: "string" - 19092-19093: "punctuation.definition.tag.xml.plist" - Data: ">" - 19128-19137: "meta.tag.string.xml.plist" - 19128-19130: "punctuation.definition.tag.xml.plist" - Data: "" - 19144-19151: "meta.tag.dict.xml.plist" - 19144-19146: "punctuation.definition.tag.xml.plist" - Data: "" - 19158-19170: "" - 19158-19163: "meta.tag.key.xml.plist" - 19158-19159: "punctuation.definition.tag.xml.plist" - Data: "<" - 19159-19162: "entity.name.tag.xml.plist" - 19159-19162: "entity.name.tag.localname.xml.plist" - Data: "key" - 19162-19163: "punctuation.definition.tag.xml.plist" - Data: ">" - 19164-19170: "meta.tag.key.xml.plist" - 19164-19166: "punctuation.definition.tag.xml.plist" - Data: "" - 19177-19281: "" - 19177-19183: "meta.tag.dict.xml.plist" - 19177-19178: "punctuation.definition.tag.xml.plist" - Data: "<" - 19178-19182: "entity.name.tag.xml.plist" - 19178-19182: "entity.name.tag.localname.xml.plist" - Data: "dict" - 19182-19183: "punctuation.definition.tag.xml.plist" - Data: ">" - 19191-19206: "" - 19191-19196: "meta.tag.key.xml.plist" - 19191-19192: "punctuation.definition.tag.xml.plist" - Data: "<" - 19192-19195: "entity.name.tag.xml.plist" - 19192-19195: "entity.name.tag.localname.xml.plist" - Data: "key" - 19195-19196: "punctuation.definition.tag.xml.plist" - Data: ">" - 19200-19206: "meta.tag.key.xml.plist" - 19200-19202: "punctuation.definition.tag.xml.plist" - Data: "" - 19214-19267: "" - 19214-19222: "meta.tag.string.xml.plist" - 19214-19215: "punctuation.definition.tag.xml.plist" - Data: "<" - 19215-19221: "entity.name.tag.xml.plist" - 19215-19221: "entity.name.tag.localname.xml.plist" - Data: "string" - 19221-19222: "punctuation.definition.tag.xml.plist" - Data: ">" - 19258-19267: "meta.tag.string.xml.plist" - 19258-19260: "punctuation.definition.tag.xml.plist" - Data: "" - 19274-19281: "meta.tag.dict.xml.plist" - 19274-19276: "punctuation.definition.tag.xml.plist" - Data: "" - 19287-19294: "meta.tag.dict.xml.plist" - 19287-19289: "punctuation.definition.tag.xml.plist" - Data: "" - 19300-19318: "" - 19300-19305: "meta.tag.key.xml.plist" - 19300-19301: "punctuation.definition.tag.xml.plist" - Data: "<" - 19301-19304: "entity.name.tag.xml.plist" - 19301-19304: "entity.name.tag.localname.xml.plist" - Data: "key" - 19304-19305: "punctuation.definition.tag.xml.plist" - Data: ">" - 19312-19318: "meta.tag.key.xml.plist" - 19312-19314: "punctuation.definition.tag.xml.plist" - Data: "" - 19324-19348: "" - 19324-19332: "meta.tag.string.xml.plist" - 19324-19325: "punctuation.definition.tag.xml.plist" - Data: "<" - 19325-19331: "entity.name.tag.xml.plist" - 19325-19331: "entity.name.tag.localname.xml.plist" - Data: "string" - 19331-19332: "punctuation.definition.tag.xml.plist" - Data: ">" - 19339-19348: "meta.tag.string.xml.plist" - 19339-19341: "punctuation.definition.tag.xml.plist" - Data: "" - 19354-19376: "" - 19354-19359: "meta.tag.key.xml.plist" - 19354-19355: "punctuation.definition.tag.xml.plist" - Data: "<" - 19355-19358: "entity.name.tag.xml.plist" - 19355-19358: "entity.name.tag.localname.xml.plist" - Data: "key" - 19358-19359: "punctuation.definition.tag.xml.plist" - Data: ">" - 19370-19376: "meta.tag.key.xml.plist" - 19370-19372: "punctuation.definition.tag.xml.plist" - Data: "" - 19382-19428: "" - 19382-19390: "meta.tag.string.xml.plist" - 19382-19383: "punctuation.definition.tag.xml.plist" - Data: "<" - 19383-19389: "entity.name.tag.xml.plist" - 19383-19389: "entity.name.tag.localname.xml.plist" - Data: "string" - 19389-19390: "punctuation.definition.tag.xml.plist" - Data: ">" - 19419-19428: "meta.tag.string.xml.plist" - 19419-19421: "punctuation.definition.tag.xml.plist" - Data: "" - 19434-19448: "" - 19434-19439: "meta.tag.key.xml.plist" - 19434-19435: "punctuation.definition.tag.xml.plist" - Data: "<" - 19435-19438: "entity.name.tag.xml.plist" - 19435-19438: "entity.name.tag.localname.xml.plist" - Data: "key" - 19438-19439: "punctuation.definition.tag.xml.plist" - Data: ">" - 19442-19448: "meta.tag.key.xml.plist" - 19442-19444: "punctuation.definition.tag.xml.plist" - Data: "" - 19454-19496: "" - 19454-19462: "meta.tag.string.xml.plist" - 19454-19455: "punctuation.definition.tag.xml.plist" - Data: "<" - 19455-19461: "entity.name.tag.xml.plist" - 19455-19461: "entity.name.tag.localname.xml.plist" - Data: "string" - 19461-19462: "punctuation.definition.tag.xml.plist" - Data: ">" - 19487-19496: "meta.tag.string.xml.plist" - 19487-19489: "punctuation.definition.tag.xml.plist" - Data: "" - 19502-19521: "" - 19502-19507: "meta.tag.key.xml.plist" - 19502-19503: "punctuation.definition.tag.xml.plist" - Data: "<" - 19503-19506: "entity.name.tag.xml.plist" - 19503-19506: "entity.name.tag.localname.xml.plist" - Data: "key" - 19506-19507: "punctuation.definition.tag.xml.plist" - Data: ">" - 19515-19521: "meta.tag.key.xml.plist" - 19515-19517: "punctuation.definition.tag.xml.plist" - Data: "" - 19527-20048: "" - 19527-19534: "meta.tag.array.xml.plist" - 19527-19528: "punctuation.definition.tag.xml.plist" - Data: "<" - 19528-19533: "entity.name.tag.xml.plist" - 19528-19533: "entity.name.tag.localname.xml.plist" - Data: "array" - 19533-19534: "punctuation.definition.tag.xml.plist" - Data: ">" - 19541-19625: "" - 19541-19547: "meta.tag.dict.xml.plist" - 19541-19542: "punctuation.definition.tag.xml.plist" - Data: "<" - 19542-19546: "entity.name.tag.xml.plist" - 19542-19546: "entity.name.tag.localname.xml.plist" - Data: "dict" - 19546-19547: "punctuation.definition.tag.xml.plist" - Data: ">" - 19555-19573: "" - 19555-19560: "meta.tag.key.xml.plist" - 19555-19556: "punctuation.definition.tag.xml.plist" - Data: "<" - 19556-19559: "entity.name.tag.xml.plist" - 19556-19559: "entity.name.tag.localname.xml.plist" - Data: "key" - 19559-19560: "punctuation.definition.tag.xml.plist" - Data: ">" - 19567-19573: "meta.tag.key.xml.plist" - 19567-19569: "punctuation.definition.tag.xml.plist" - Data: "" - 19581-19611: "" - 19581-19589: "meta.tag.string.xml.plist" - 19581-19582: "punctuation.definition.tag.xml.plist" - Data: "<" - 19582-19588: "entity.name.tag.xml.plist" - 19582-19588: "entity.name.tag.localname.xml.plist" - Data: "string" - 19588-19589: "punctuation.definition.tag.xml.plist" - Data: ">" - 19602-19611: "meta.tag.string.xml.plist" - 19602-19604: "punctuation.definition.tag.xml.plist" - Data: "" - 19618-19625: "meta.tag.dict.xml.plist" - 19618-19620: "punctuation.definition.tag.xml.plist" - Data: "" - 19632-20034: "" - 19632-19638: "meta.tag.dict.xml.plist" - 19632-19633: "punctuation.definition.tag.xml.plist" - Data: "<" - 19633-19637: "entity.name.tag.xml.plist" - 19633-19637: "entity.name.tag.localname.xml.plist" - Data: "dict" - 19637-19638: "punctuation.definition.tag.xml.plist" - Data: ">" - 19646-19662: "" - 19646-19651: "meta.tag.key.xml.plist" - 19646-19647: "punctuation.definition.tag.xml.plist" - Data: "<" - 19647-19650: "entity.name.tag.xml.plist" - 19647-19650: "entity.name.tag.localname.xml.plist" - Data: "key" - 19650-19651: "punctuation.definition.tag.xml.plist" - Data: ">" - 19656-19662: "meta.tag.key.xml.plist" - 19656-19658: "punctuation.definition.tag.xml.plist" - Data: "" - 19670-19701: "" - 19670-19678: "meta.tag.string.xml.plist" - 19670-19671: "punctuation.definition.tag.xml.plist" - Data: "<" - 19671-19677: "entity.name.tag.xml.plist" - 19671-19677: "entity.name.tag.localname.xml.plist" - Data: "string" - 19677-19678: "punctuation.definition.tag.xml.plist" - Data: ">" - 19692-19701: "meta.tag.string.xml.plist" - 19692-19694: "punctuation.definition.tag.xml.plist" - Data: "" - 19709-19728: "" - 19709-19714: "meta.tag.key.xml.plist" - 19709-19710: "punctuation.definition.tag.xml.plist" - Data: "<" - 19710-19713: "entity.name.tag.xml.plist" - 19710-19713: "entity.name.tag.localname.xml.plist" - Data: "key" - 19713-19714: "punctuation.definition.tag.xml.plist" - Data: ">" - 19722-19728: "meta.tag.key.xml.plist" - 19722-19724: "punctuation.definition.tag.xml.plist" - Data: "" - 19736-19894: "" - 19736-19742: "meta.tag.dict.xml.plist" - 19736-19737: "punctuation.definition.tag.xml.plist" - Data: "<" - 19737-19741: "entity.name.tag.xml.plist" - 19737-19741: "entity.name.tag.localname.xml.plist" - Data: "dict" - 19741-19742: "punctuation.definition.tag.xml.plist" - Data: ">" - 19751-19763: "" - 19751-19756: "meta.tag.key.xml.plist" - 19751-19752: "punctuation.definition.tag.xml.plist" - Data: "<" - 19752-19755: "entity.name.tag.xml.plist" - 19752-19755: "entity.name.tag.localname.xml.plist" - Data: "key" - 19755-19756: "punctuation.definition.tag.xml.plist" - Data: ">" - 19757-19763: "meta.tag.key.xml.plist" - 19757-19759: "punctuation.definition.tag.xml.plist" - Data: "" - 19772-19879: "" - 19772-19778: "meta.tag.dict.xml.plist" - 19772-19773: "punctuation.definition.tag.xml.plist" - Data: "<" - 19773-19777: "entity.name.tag.xml.plist" - 19773-19777: "entity.name.tag.localname.xml.plist" - Data: "dict" - 19777-19778: "punctuation.definition.tag.xml.plist" - Data: ">" - 19788-19803: "" - 19788-19793: "meta.tag.key.xml.plist" - 19788-19789: "punctuation.definition.tag.xml.plist" - Data: "<" - 19789-19792: "entity.name.tag.xml.plist" - 19789-19792: "entity.name.tag.localname.xml.plist" - Data: "key" - 19792-19793: "punctuation.definition.tag.xml.plist" - Data: ">" - 19797-19803: "meta.tag.key.xml.plist" - 19797-19799: "punctuation.definition.tag.xml.plist" - Data: "" - 19813-19863: "" - 19813-19821: "meta.tag.string.xml.plist" - 19813-19814: "punctuation.definition.tag.xml.plist" - Data: "<" - 19814-19820: "entity.name.tag.xml.plist" - 19814-19820: "entity.name.tag.localname.xml.plist" - Data: "string" - 19820-19821: "punctuation.definition.tag.xml.plist" - Data: ">" - 19854-19863: "meta.tag.string.xml.plist" - 19854-19856: "punctuation.definition.tag.xml.plist" - Data: "" - 19872-19879: "meta.tag.dict.xml.plist" - 19872-19874: "punctuation.definition.tag.xml.plist" - Data: "" - 19887-19894: "meta.tag.dict.xml.plist" - 19887-19889: "punctuation.definition.tag.xml.plist" - Data: "" - 19902-19916: "" - 19902-19907: "meta.tag.key.xml.plist" - 19902-19903: "punctuation.definition.tag.xml.plist" - Data: "<" - 19903-19906: "entity.name.tag.xml.plist" - 19903-19906: "entity.name.tag.localname.xml.plist" - Data: "key" - 19906-19907: "punctuation.definition.tag.xml.plist" - Data: ">" - 19910-19916: "meta.tag.key.xml.plist" - 19910-19912: "punctuation.definition.tag.xml.plist" - Data: "" - 19924-19947: "" - 19924-19932: "meta.tag.string.xml.plist" - 19924-19925: "punctuation.definition.tag.xml.plist" - Data: "<" - 19925-19931: "entity.name.tag.xml.plist" - 19925-19931: "entity.name.tag.localname.xml.plist" - Data: "string" - 19931-19932: "punctuation.definition.tag.xml.plist" - Data: ">" - 19938-19947: "meta.tag.string.xml.plist" - 19938-19940: "punctuation.definition.tag.xml.plist" - Data: "" - 19955-19970: "" - 19955-19960: "meta.tag.key.xml.plist" - 19955-19956: "punctuation.definition.tag.xml.plist" - Data: "<" - 19956-19959: "entity.name.tag.xml.plist" - 19956-19959: "entity.name.tag.localname.xml.plist" - Data: "key" - 19959-19960: "punctuation.definition.tag.xml.plist" - Data: ">" - 19964-19970: "meta.tag.key.xml.plist" - 19964-19966: "punctuation.definition.tag.xml.plist" - Data: "" - 19978-20020: "" - 19978-19986: "meta.tag.string.xml.plist" - 19978-19979: "punctuation.definition.tag.xml.plist" - Data: "<" - 19979-19985: "entity.name.tag.xml.plist" - 19979-19985: "entity.name.tag.localname.xml.plist" - Data: "string" - 19985-19986: "punctuation.definition.tag.xml.plist" - Data: ">" - 20011-20020: "meta.tag.string.xml.plist" - 20011-20013: "punctuation.definition.tag.xml.plist" - Data: "" - 20027-20034: "meta.tag.dict.xml.plist" - 20027-20029: "punctuation.definition.tag.xml.plist" - Data: "" - 20040-20048: "meta.tag.array.xml.plist" - 20040-20042: "punctuation.definition.tag.xml.plist" - Data: "" - 20053-20060: "meta.tag.dict.xml.plist" - 20053-20055: "punctuation.definition.tag.xml.plist" - Data: "" - 20065-22246: "" - 20065-20071: "meta.tag.dict.xml.plist" - 20065-20066: "punctuation.definition.tag.xml.plist" - Data: "<" - 20066-20070: "entity.name.tag.xml.plist" - 20066-20070: "entity.name.tag.localname.xml.plist" - Data: "dict" - 20070-20071: "punctuation.definition.tag.xml.plist" - Data: ">" - 20077-20093: "" - 20077-20082: "meta.tag.key.xml.plist" - 20077-20078: "punctuation.definition.tag.xml.plist" - Data: "<" - 20078-20081: "entity.name.tag.xml.plist" - 20078-20081: "entity.name.tag.localname.xml.plist" - Data: "key" - 20081-20082: "punctuation.definition.tag.xml.plist" - Data: ">" - 20087-20093: "meta.tag.key.xml.plist" - 20087-20089: "punctuation.definition.tag.xml.plist" - Data: "" - 20099-20138: "" - 20099-20107: "meta.tag.string.xml.plist" - 20099-20100: "punctuation.definition.tag.xml.plist" - Data: "<" - 20100-20106: "entity.name.tag.xml.plist" - 20100-20106: "entity.name.tag.localname.xml.plist" - Data: "string" - 20106-20107: "punctuation.definition.tag.xml.plist" - Data: ">" - 20129-20138: "meta.tag.string.xml.plist" - 20129-20131: "punctuation.definition.tag.xml.plist" - Data: "" - 20144-20163: "" - 20144-20149: "meta.tag.key.xml.plist" - 20144-20145: "punctuation.definition.tag.xml.plist" - Data: "<" - 20145-20148: "entity.name.tag.xml.plist" - 20145-20148: "entity.name.tag.localname.xml.plist" - Data: "key" - 20148-20149: "punctuation.definition.tag.xml.plist" - Data: ">" - 20157-20163: "meta.tag.key.xml.plist" - 20157-20159: "punctuation.definition.tag.xml.plist" - Data: "" - 20169-20813: "" - 20169-20175: "meta.tag.dict.xml.plist" - 20169-20170: "punctuation.definition.tag.xml.plist" - Data: "<" - 20170-20174: "entity.name.tag.xml.plist" - 20170-20174: "entity.name.tag.localname.xml.plist" - Data: "dict" - 20174-20175: "punctuation.definition.tag.xml.plist" - Data: ">" - 20182-20194: "" - 20182-20187: "meta.tag.key.xml.plist" - 20182-20183: "punctuation.definition.tag.xml.plist" - Data: "<" - 20183-20186: "entity.name.tag.xml.plist" - 20183-20186: "entity.name.tag.localname.xml.plist" - Data: "key" - 20186-20187: "punctuation.definition.tag.xml.plist" - Data: ">" - 20188-20194: "meta.tag.key.xml.plist" - 20188-20190: "punctuation.definition.tag.xml.plist" - Data: "" - 20201-20292: "" - 20201-20207: "meta.tag.dict.xml.plist" - 20201-20202: "punctuation.definition.tag.xml.plist" - Data: "<" - 20202-20206: "entity.name.tag.xml.plist" - 20202-20206: "entity.name.tag.localname.xml.plist" - Data: "dict" - 20206-20207: "punctuation.definition.tag.xml.plist" - Data: ">" - 20215-20230: "" - 20215-20220: "meta.tag.key.xml.plist" - 20215-20216: "punctuation.definition.tag.xml.plist" - Data: "<" - 20216-20219: "entity.name.tag.xml.plist" - 20216-20219: "entity.name.tag.localname.xml.plist" - Data: "key" - 20219-20220: "punctuation.definition.tag.xml.plist" - Data: ">" - 20224-20230: "meta.tag.key.xml.plist" - 20224-20226: "punctuation.definition.tag.xml.plist" - Data: "" - 20238-20278: "" - 20238-20246: "meta.tag.string.xml.plist" - 20238-20239: "punctuation.definition.tag.xml.plist" - Data: "<" - 20239-20245: "entity.name.tag.xml.plist" - 20239-20245: "entity.name.tag.localname.xml.plist" - Data: "string" - 20245-20246: "punctuation.definition.tag.xml.plist" - Data: ">" - 20269-20278: "meta.tag.string.xml.plist" - 20269-20271: "punctuation.definition.tag.xml.plist" - Data: "" - 20285-20292: "meta.tag.dict.xml.plist" - 20285-20287: "punctuation.definition.tag.xml.plist" - Data: "" - 20299-20311: "" - 20299-20304: "meta.tag.key.xml.plist" - 20299-20300: "punctuation.definition.tag.xml.plist" - Data: "<" - 20300-20303: "entity.name.tag.xml.plist" - 20300-20303: "entity.name.tag.localname.xml.plist" - Data: "key" - 20303-20304: "punctuation.definition.tag.xml.plist" - Data: ">" - 20305-20311: "meta.tag.key.xml.plist" - 20305-20307: "punctuation.definition.tag.xml.plist" - Data: "" - 20318-20422: "" - 20318-20324: "meta.tag.dict.xml.plist" - 20318-20319: "punctuation.definition.tag.xml.plist" - Data: "<" - 20319-20323: "entity.name.tag.xml.plist" - 20319-20323: "entity.name.tag.localname.xml.plist" - Data: "dict" - 20323-20324: "punctuation.definition.tag.xml.plist" - Data: ">" - 20332-20347: "" - 20332-20337: "meta.tag.key.xml.plist" - 20332-20333: "punctuation.definition.tag.xml.plist" - Data: "<" - 20333-20336: "entity.name.tag.xml.plist" - 20333-20336: "entity.name.tag.localname.xml.plist" - Data: "key" - 20336-20337: "punctuation.definition.tag.xml.plist" - Data: ">" - 20341-20347: "meta.tag.key.xml.plist" - 20341-20343: "punctuation.definition.tag.xml.plist" - Data: "" - 20355-20408: "" - 20355-20363: "meta.tag.string.xml.plist" - 20355-20356: "punctuation.definition.tag.xml.plist" - Data: "<" - 20356-20362: "entity.name.tag.xml.plist" - 20356-20362: "entity.name.tag.localname.xml.plist" - Data: "string" - 20362-20363: "punctuation.definition.tag.xml.plist" - Data: ">" - 20399-20408: "meta.tag.string.xml.plist" - 20399-20401: "punctuation.definition.tag.xml.plist" - Data: "" - 20415-20422: "meta.tag.dict.xml.plist" - 20415-20417: "punctuation.definition.tag.xml.plist" - Data: "" - 20429-20441: "" - 20429-20434: "meta.tag.key.xml.plist" - 20429-20430: "punctuation.definition.tag.xml.plist" - Data: "<" - 20430-20433: "entity.name.tag.xml.plist" - 20430-20433: "entity.name.tag.localname.xml.plist" - Data: "key" - 20433-20434: "punctuation.definition.tag.xml.plist" - Data: ">" - 20435-20441: "meta.tag.key.xml.plist" - 20435-20437: "punctuation.definition.tag.xml.plist" - Data: "" - 20448-20541: "" - 20448-20454: "meta.tag.dict.xml.plist" - 20448-20449: "punctuation.definition.tag.xml.plist" - Data: "<" - 20449-20453: "entity.name.tag.xml.plist" - 20449-20453: "entity.name.tag.localname.xml.plist" - Data: "dict" - 20453-20454: "punctuation.definition.tag.xml.plist" - Data: ">" - 20462-20477: "" - 20462-20467: "meta.tag.key.xml.plist" - 20462-20463: "punctuation.definition.tag.xml.plist" - Data: "<" - 20463-20466: "entity.name.tag.xml.plist" - 20463-20466: "entity.name.tag.localname.xml.plist" - Data: "key" - 20466-20467: "punctuation.definition.tag.xml.plist" - Data: ">" - 20471-20477: "meta.tag.key.xml.plist" - 20471-20473: "punctuation.definition.tag.xml.plist" - Data: "" - 20485-20527: "" - 20485-20493: "meta.tag.string.xml.plist" - 20485-20486: "punctuation.definition.tag.xml.plist" - Data: "<" - 20486-20492: "entity.name.tag.xml.plist" - 20486-20492: "entity.name.tag.localname.xml.plist" - Data: "string" - 20492-20493: "punctuation.definition.tag.xml.plist" - Data: ">" - 20518-20527: "meta.tag.string.xml.plist" - 20518-20520: "punctuation.definition.tag.xml.plist" - Data: "" - 20534-20541: "meta.tag.dict.xml.plist" - 20534-20536: "punctuation.definition.tag.xml.plist" - Data: "" - 20548-20560: "" - 20548-20553: "meta.tag.key.xml.plist" - 20548-20549: "punctuation.definition.tag.xml.plist" - Data: "<" - 20549-20552: "entity.name.tag.xml.plist" - 20549-20552: "entity.name.tag.localname.xml.plist" - Data: "key" - 20552-20553: "punctuation.definition.tag.xml.plist" - Data: ">" - 20554-20560: "meta.tag.key.xml.plist" - 20554-20556: "punctuation.definition.tag.xml.plist" - Data: "" - 20567-20670: "" - 20567-20573: "meta.tag.dict.xml.plist" - 20567-20568: "punctuation.definition.tag.xml.plist" - Data: "<" - 20568-20572: "entity.name.tag.xml.plist" - 20568-20572: "entity.name.tag.localname.xml.plist" - Data: "dict" - 20572-20573: "punctuation.definition.tag.xml.plist" - Data: ">" - 20581-20596: "" - 20581-20586: "meta.tag.key.xml.plist" - 20581-20582: "punctuation.definition.tag.xml.plist" - Data: "<" - 20582-20585: "entity.name.tag.xml.plist" - 20582-20585: "entity.name.tag.localname.xml.plist" - Data: "key" - 20585-20586: "punctuation.definition.tag.xml.plist" - Data: ">" - 20590-20596: "meta.tag.key.xml.plist" - 20590-20592: "punctuation.definition.tag.xml.plist" - Data: "" - 20604-20656: "" - 20604-20612: "meta.tag.string.xml.plist" - 20604-20605: "punctuation.definition.tag.xml.plist" - Data: "<" - 20605-20611: "entity.name.tag.xml.plist" - 20605-20611: "entity.name.tag.localname.xml.plist" - Data: "string" - 20611-20612: "punctuation.definition.tag.xml.plist" - Data: ">" - 20647-20656: "meta.tag.string.xml.plist" - 20647-20649: "punctuation.definition.tag.xml.plist" - Data: "" - 20663-20670: "meta.tag.dict.xml.plist" - 20663-20665: "punctuation.definition.tag.xml.plist" - Data: "" - 20677-20689: "" - 20677-20682: "meta.tag.key.xml.plist" - 20677-20678: "punctuation.definition.tag.xml.plist" - Data: "<" - 20678-20681: "entity.name.tag.xml.plist" - 20678-20681: "entity.name.tag.localname.xml.plist" - Data: "key" - 20681-20682: "punctuation.definition.tag.xml.plist" - Data: ">" - 20683-20689: "meta.tag.key.xml.plist" - 20683-20685: "punctuation.definition.tag.xml.plist" - Data: "" - 20696-20800: "" - 20696-20702: "meta.tag.dict.xml.plist" - 20696-20697: "punctuation.definition.tag.xml.plist" - Data: "<" - 20697-20701: "entity.name.tag.xml.plist" - 20697-20701: "entity.name.tag.localname.xml.plist" - Data: "dict" - 20701-20702: "punctuation.definition.tag.xml.plist" - Data: ">" - 20710-20725: "" - 20710-20715: "meta.tag.key.xml.plist" - 20710-20711: "punctuation.definition.tag.xml.plist" - Data: "<" - 20711-20714: "entity.name.tag.xml.plist" - 20711-20714: "entity.name.tag.localname.xml.plist" - Data: "key" - 20714-20715: "punctuation.definition.tag.xml.plist" - Data: ">" - 20719-20725: "meta.tag.key.xml.plist" - 20719-20721: "punctuation.definition.tag.xml.plist" - Data: "" - 20733-20786: "" - 20733-20741: "meta.tag.string.xml.plist" - 20733-20734: "punctuation.definition.tag.xml.plist" - Data: "<" - 20734-20740: "entity.name.tag.xml.plist" - 20734-20740: "entity.name.tag.localname.xml.plist" - Data: "string" - 20740-20741: "punctuation.definition.tag.xml.plist" - Data: ">" - 20777-20786: "meta.tag.string.xml.plist" - 20777-20779: "punctuation.definition.tag.xml.plist" - Data: "" - 20793-20800: "meta.tag.dict.xml.plist" - 20793-20795: "punctuation.definition.tag.xml.plist" - Data: "" - 20806-20813: "meta.tag.dict.xml.plist" - 20806-20808: "punctuation.definition.tag.xml.plist" - Data: "" - 20819-20837: "" - 20819-20824: "meta.tag.key.xml.plist" - 20819-20820: "punctuation.definition.tag.xml.plist" - Data: "<" - 20820-20823: "entity.name.tag.xml.plist" - 20820-20823: "entity.name.tag.localname.xml.plist" - Data: "key" - 20823-20824: "punctuation.definition.tag.xml.plist" - Data: ">" - 20831-20837: "meta.tag.key.xml.plist" - 20831-20833: "punctuation.definition.tag.xml.plist" - Data: "" - 20843-20867: "" - 20843-20851: "meta.tag.string.xml.plist" - 20843-20844: "punctuation.definition.tag.xml.plist" - Data: "<" - 20844-20850: "entity.name.tag.xml.plist" - 20844-20850: "entity.name.tag.localname.xml.plist" - Data: "string" - 20850-20851: "punctuation.definition.tag.xml.plist" - Data: ">" - 20858-20867: "meta.tag.string.xml.plist" - 20858-20860: "punctuation.definition.tag.xml.plist" - Data: "" - 20873-20887: "" - 20873-20878: "meta.tag.key.xml.plist" - 20873-20874: "punctuation.definition.tag.xml.plist" - Data: "<" - 20874-20877: "entity.name.tag.xml.plist" - 20874-20877: "entity.name.tag.localname.xml.plist" - Data: "key" - 20877-20878: "punctuation.definition.tag.xml.plist" - Data: ">" - 20881-20887: "meta.tag.key.xml.plist" - 20881-20883: "punctuation.definition.tag.xml.plist" - Data: "" - 20893-20933: "" - 20893-20901: "meta.tag.string.xml.plist" - 20893-20894: "punctuation.definition.tag.xml.plist" - Data: "<" - 20894-20900: "entity.name.tag.xml.plist" - 20894-20900: "entity.name.tag.localname.xml.plist" - Data: "string" - 20900-20901: "punctuation.definition.tag.xml.plist" - Data: ">" - 20924-20933: "meta.tag.string.xml.plist" - 20924-20926: "punctuation.definition.tag.xml.plist" - Data: "" - 20939-20958: "" - 20939-20944: "meta.tag.key.xml.plist" - 20939-20940: "punctuation.definition.tag.xml.plist" - Data: "<" - 20940-20943: "entity.name.tag.xml.plist" - 20940-20943: "entity.name.tag.localname.xml.plist" - Data: "key" - 20943-20944: "punctuation.definition.tag.xml.plist" - Data: ">" - 20952-20958: "meta.tag.key.xml.plist" - 20952-20954: "punctuation.definition.tag.xml.plist" - Data: "" - 20964-22234: "" - 20964-20971: "meta.tag.array.xml.plist" - 20964-20965: "punctuation.definition.tag.xml.plist" - Data: "<" - 20965-20970: "entity.name.tag.xml.plist" - 20965-20970: "entity.name.tag.localname.xml.plist" - Data: "array" - 20970-20971: "punctuation.definition.tag.xml.plist" - Data: ">" - 20978-21875: "" - 20978-20984: "meta.tag.dict.xml.plist" - 20978-20979: "punctuation.definition.tag.xml.plist" - Data: "<" - 20979-20983: "entity.name.tag.xml.plist" - 20979-20983: "entity.name.tag.localname.xml.plist" - Data: "dict" - 20983-20984: "punctuation.definition.tag.xml.plist" - Data: ">" - 20992-21008: "" - 20992-20997: "meta.tag.key.xml.plist" - 20992-20993: "punctuation.definition.tag.xml.plist" - Data: "<" - 20993-20996: "entity.name.tag.xml.plist" - 20993-20996: "entity.name.tag.localname.xml.plist" - Data: "key" - 20996-20997: "punctuation.definition.tag.xml.plist" - Data: ">" - 21002-21008: "meta.tag.key.xml.plist" - 21002-21004: "punctuation.definition.tag.xml.plist" - Data: "" - 21016-21049: "" - 21016-21024: "meta.tag.string.xml.plist" - 21016-21017: "punctuation.definition.tag.xml.plist" - Data: "<" - 21017-21023: "entity.name.tag.xml.plist" - 21017-21023: "entity.name.tag.localname.xml.plist" - Data: "string" - 21023-21024: "punctuation.definition.tag.xml.plist" - Data: ">" - 21040-21049: "meta.tag.string.xml.plist" - 21040-21042: "punctuation.definition.tag.xml.plist" - Data: "" - 21057-21076: "" - 21057-21062: "meta.tag.key.xml.plist" - 21057-21058: "punctuation.definition.tag.xml.plist" - Data: "<" - 21058-21061: "entity.name.tag.xml.plist" - 21058-21061: "entity.name.tag.localname.xml.plist" - Data: "key" - 21061-21062: "punctuation.definition.tag.xml.plist" - Data: ">" - 21070-21076: "meta.tag.key.xml.plist" - 21070-21072: "punctuation.definition.tag.xml.plist" - Data: "" - 21084-21379: "" - 21084-21090: "meta.tag.dict.xml.plist" - 21084-21085: "punctuation.definition.tag.xml.plist" - Data: "<" - 21085-21089: "entity.name.tag.xml.plist" - 21085-21089: "entity.name.tag.localname.xml.plist" - Data: "dict" - 21089-21090: "punctuation.definition.tag.xml.plist" - Data: ">" - 21099-21111: "" - 21099-21104: "meta.tag.key.xml.plist" - 21099-21100: "punctuation.definition.tag.xml.plist" - Data: "<" - 21100-21103: "entity.name.tag.xml.plist" - 21100-21103: "entity.name.tag.localname.xml.plist" - Data: "key" - 21103-21104: "punctuation.definition.tag.xml.plist" - Data: ">" - 21105-21111: "meta.tag.key.xml.plist" - 21105-21107: "punctuation.definition.tag.xml.plist" - Data: "" - 21120-21229: "" - 21120-21126: "meta.tag.dict.xml.plist" - 21120-21121: "punctuation.definition.tag.xml.plist" - Data: "<" - 21121-21125: "entity.name.tag.xml.plist" - 21121-21125: "entity.name.tag.localname.xml.plist" - Data: "dict" - 21125-21126: "punctuation.definition.tag.xml.plist" - Data: ">" - 21136-21151: "" - 21136-21141: "meta.tag.key.xml.plist" - 21136-21137: "punctuation.definition.tag.xml.plist" - Data: "<" - 21137-21140: "entity.name.tag.xml.plist" - 21137-21140: "entity.name.tag.localname.xml.plist" - Data: "key" - 21140-21141: "punctuation.definition.tag.xml.plist" - Data: ">" - 21145-21151: "meta.tag.key.xml.plist" - 21145-21147: "punctuation.definition.tag.xml.plist" - Data: "" - 21161-21213: "" - 21161-21169: "meta.tag.string.xml.plist" - 21161-21162: "punctuation.definition.tag.xml.plist" - Data: "<" - 21162-21168: "entity.name.tag.xml.plist" - 21162-21168: "entity.name.tag.localname.xml.plist" - Data: "string" - 21168-21169: "punctuation.definition.tag.xml.plist" - Data: ">" - 21204-21213: "meta.tag.string.xml.plist" - 21204-21206: "punctuation.definition.tag.xml.plist" - Data: "" - 21222-21229: "meta.tag.dict.xml.plist" - 21222-21224: "punctuation.definition.tag.xml.plist" - Data: "" - 21238-21250: "" - 21238-21243: "meta.tag.key.xml.plist" - 21238-21239: "punctuation.definition.tag.xml.plist" - Data: "<" - 21239-21242: "entity.name.tag.xml.plist" - 21239-21242: "entity.name.tag.localname.xml.plist" - Data: "key" - 21242-21243: "punctuation.definition.tag.xml.plist" - Data: ">" - 21244-21250: "meta.tag.key.xml.plist" - 21244-21246: "punctuation.definition.tag.xml.plist" - Data: "" - 21259-21364: "" - 21259-21265: "meta.tag.dict.xml.plist" - 21259-21260: "punctuation.definition.tag.xml.plist" - Data: "<" - 21260-21264: "entity.name.tag.xml.plist" - 21260-21264: "entity.name.tag.localname.xml.plist" - Data: "dict" - 21264-21265: "punctuation.definition.tag.xml.plist" - Data: ">" - 21275-21290: "" - 21275-21280: "meta.tag.key.xml.plist" - 21275-21276: "punctuation.definition.tag.xml.plist" - Data: "<" - 21276-21279: "entity.name.tag.xml.plist" - 21276-21279: "entity.name.tag.localname.xml.plist" - Data: "key" - 21279-21280: "punctuation.definition.tag.xml.plist" - Data: ">" - 21284-21290: "meta.tag.key.xml.plist" - 21284-21286: "punctuation.definition.tag.xml.plist" - Data: "" - 21300-21348: "" - 21300-21308: "meta.tag.string.xml.plist" - 21300-21301: "punctuation.definition.tag.xml.plist" - Data: "<" - 21301-21307: "entity.name.tag.xml.plist" - 21301-21307: "entity.name.tag.localname.xml.plist" - Data: "string" - 21307-21308: "punctuation.definition.tag.xml.plist" - Data: ">" - 21339-21348: "meta.tag.string.xml.plist" - 21339-21341: "punctuation.definition.tag.xml.plist" - Data: "" - 21357-21364: "meta.tag.dict.xml.plist" - 21357-21359: "punctuation.definition.tag.xml.plist" - Data: "" - 21372-21379: "meta.tag.dict.xml.plist" - 21372-21374: "punctuation.definition.tag.xml.plist" - Data: "" - 21387-21401: "" - 21387-21392: "meta.tag.key.xml.plist" - 21387-21388: "punctuation.definition.tag.xml.plist" - Data: "<" - 21388-21391: "entity.name.tag.xml.plist" - 21388-21391: "entity.name.tag.localname.xml.plist" - Data: "key" - 21391-21392: "punctuation.definition.tag.xml.plist" - Data: ">" - 21395-21401: "meta.tag.key.xml.plist" - 21395-21397: "punctuation.definition.tag.xml.plist" - Data: "" - 21409-21434: "" - 21409-21417: "meta.tag.string.xml.plist" - 21409-21410: "punctuation.definition.tag.xml.plist" - Data: "<" - 21410-21416: "entity.name.tag.xml.plist" - 21410-21416: "entity.name.tag.localname.xml.plist" - Data: "string" - 21416-21417: "punctuation.definition.tag.xml.plist" - Data: ">" - 21425-21434: "meta.tag.string.xml.plist" - 21425-21427: "punctuation.definition.tag.xml.plist" - Data: "" - 21442-21461: "" - 21442-21447: "meta.tag.key.xml.plist" - 21442-21443: "punctuation.definition.tag.xml.plist" - Data: "<" - 21443-21446: "entity.name.tag.xml.plist" - 21443-21446: "entity.name.tag.localname.xml.plist" - Data: "key" - 21446-21447: "punctuation.definition.tag.xml.plist" - Data: ">" - 21455-21461: "meta.tag.key.xml.plist" - 21455-21457: "punctuation.definition.tag.xml.plist" - Data: "" - 21469-21861: "" - 21469-21476: "meta.tag.array.xml.plist" - 21469-21470: "punctuation.definition.tag.xml.plist" - Data: "<" - 21470-21475: "entity.name.tag.xml.plist" - 21470-21475: "entity.name.tag.localname.xml.plist" - Data: "array" - 21475-21476: "punctuation.definition.tag.xml.plist" - Data: ">" - 21485-21670: "" - 21485-21491: "meta.tag.dict.xml.plist" - 21485-21486: "punctuation.definition.tag.xml.plist" - Data: "<" - 21486-21490: "entity.name.tag.xml.plist" - 21486-21490: "entity.name.tag.localname.xml.plist" - Data: "dict" - 21490-21491: "punctuation.definition.tag.xml.plist" - Data: ">" - 21501-21517: "" - 21501-21506: "meta.tag.key.xml.plist" - 21501-21502: "punctuation.definition.tag.xml.plist" - Data: "<" - 21502-21505: "entity.name.tag.xml.plist" - 21502-21505: "entity.name.tag.localname.xml.plist" - Data: "key" - 21505-21506: "punctuation.definition.tag.xml.plist" - Data: ">" - 21511-21517: "meta.tag.key.xml.plist" - 21511-21513: "punctuation.definition.tag.xml.plist" - Data: "" - 21527-21571: "" - 21527-21535: "meta.tag.string.xml.plist" - 21527-21528: "punctuation.definition.tag.xml.plist" - Data: "<" - 21528-21534: "entity.name.tag.xml.plist" - 21528-21534: "entity.name.tag.localname.xml.plist" - Data: "string" - 21534-21535: "punctuation.definition.tag.xml.plist" - Data: ">" - 21562-21571: "meta.tag.string.xml.plist" - 21562-21564: "punctuation.definition.tag.xml.plist" - Data: "" - 21581-21596: "" - 21581-21586: "meta.tag.key.xml.plist" - 21581-21582: "punctuation.definition.tag.xml.plist" - Data: "<" - 21582-21585: "entity.name.tag.xml.plist" - 21582-21585: "entity.name.tag.localname.xml.plist" - Data: "key" - 21585-21586: "punctuation.definition.tag.xml.plist" - Data: ">" - 21590-21596: "meta.tag.key.xml.plist" - 21590-21592: "punctuation.definition.tag.xml.plist" - Data: "" - 21606-21654: "" - 21606-21614: "meta.tag.string.xml.plist" - 21606-21607: "punctuation.definition.tag.xml.plist" - Data: "<" - 21607-21613: "entity.name.tag.xml.plist" - 21607-21613: "entity.name.tag.localname.xml.plist" - Data: "string" - 21613-21614: "punctuation.definition.tag.xml.plist" - Data: ">" - 21645-21654: "meta.tag.string.xml.plist" - 21645-21647: "punctuation.definition.tag.xml.plist" - Data: "" - 21663-21670: "meta.tag.dict.xml.plist" - 21663-21665: "punctuation.definition.tag.xml.plist" - Data: "" - 21679-21845: "" - 21679-21685: "meta.tag.dict.xml.plist" - 21679-21680: "punctuation.definition.tag.xml.plist" - Data: "<" - 21680-21684: "entity.name.tag.xml.plist" - 21680-21684: "entity.name.tag.localname.xml.plist" - Data: "dict" - 21684-21685: "punctuation.definition.tag.xml.plist" - Data: ">" - 21695-21711: "" - 21695-21700: "meta.tag.key.xml.plist" - 21695-21696: "punctuation.definition.tag.xml.plist" - Data: "<" - 21696-21699: "entity.name.tag.xml.plist" - 21696-21699: "entity.name.tag.localname.xml.plist" - Data: "key" - 21699-21700: "punctuation.definition.tag.xml.plist" - Data: ">" - 21705-21711: "meta.tag.key.xml.plist" - 21705-21707: "punctuation.definition.tag.xml.plist" - Data: "" - 21721-21739: "" - 21721-21729: "meta.tag.string.xml.plist" - 21721-21722: "punctuation.definition.tag.xml.plist" - Data: "<" - 21722-21728: "entity.name.tag.xml.plist" - 21722-21728: "entity.name.tag.localname.xml.plist" - Data: "string" - 21728-21729: "punctuation.definition.tag.xml.plist" - Data: ">" - 21730-21739: "meta.tag.string.xml.plist" - 21730-21732: "punctuation.definition.tag.xml.plist" - Data: "" - 21749-21764: "" - 21749-21754: "meta.tag.key.xml.plist" - 21749-21750: "punctuation.definition.tag.xml.plist" - Data: "<" - 21750-21753: "entity.name.tag.xml.plist" - 21750-21753: "entity.name.tag.localname.xml.plist" - Data: "key" - 21753-21754: "punctuation.definition.tag.xml.plist" - Data: ">" - 21758-21764: "meta.tag.key.xml.plist" - 21758-21760: "punctuation.definition.tag.xml.plist" - Data: "" - 21774-21829: "" - 21774-21782: "meta.tag.string.xml.plist" - 21774-21775: "punctuation.definition.tag.xml.plist" - Data: "<" - 21775-21781: "entity.name.tag.xml.plist" - 21775-21781: "entity.name.tag.localname.xml.plist" - Data: "string" - 21781-21782: "punctuation.definition.tag.xml.plist" - Data: ">" - 21820-21829: "meta.tag.string.xml.plist" - 21820-21822: "punctuation.definition.tag.xml.plist" - Data: "" - 21838-21845: "meta.tag.dict.xml.plist" - 21838-21840: "punctuation.definition.tag.xml.plist" - Data: "" - 21853-21861: "meta.tag.array.xml.plist" - 21853-21855: "punctuation.definition.tag.xml.plist" - Data: "" - 21868-21875: "meta.tag.dict.xml.plist" - 21868-21870: "punctuation.definition.tag.xml.plist" - Data: "" - 21882-22057: "" - 21882-21888: "meta.tag.dict.xml.plist" - 21882-21883: "punctuation.definition.tag.xml.plist" - Data: "<" - 21883-21887: "entity.name.tag.xml.plist" - 21883-21887: "entity.name.tag.localname.xml.plist" - Data: "dict" - 21887-21888: "punctuation.definition.tag.xml.plist" - Data: ">" - 21896-21912: "" - 21896-21901: "meta.tag.key.xml.plist" - 21896-21897: "punctuation.definition.tag.xml.plist" - Data: "<" - 21897-21900: "entity.name.tag.xml.plist" - 21897-21900: "entity.name.tag.localname.xml.plist" - Data: "key" - 21900-21901: "punctuation.definition.tag.xml.plist" - Data: ">" - 21906-21912: "meta.tag.key.xml.plist" - 21906-21908: "punctuation.definition.tag.xml.plist" - Data: "" - 21920-21964: "" - 21920-21928: "meta.tag.string.xml.plist" - 21920-21921: "punctuation.definition.tag.xml.plist" - Data: "<" - 21921-21927: "entity.name.tag.xml.plist" - 21921-21927: "entity.name.tag.localname.xml.plist" - Data: "string" - 21927-21928: "punctuation.definition.tag.xml.plist" - Data: ">" - 21955-21964: "meta.tag.string.xml.plist" - 21955-21957: "punctuation.definition.tag.xml.plist" - Data: "" - 21972-21987: "" - 21972-21977: "meta.tag.key.xml.plist" - 21972-21973: "punctuation.definition.tag.xml.plist" - Data: "<" - 21973-21976: "entity.name.tag.xml.plist" - 21973-21976: "entity.name.tag.localname.xml.plist" - Data: "key" - 21976-21977: "punctuation.definition.tag.xml.plist" - Data: ">" - 21981-21987: "meta.tag.key.xml.plist" - 21981-21983: "punctuation.definition.tag.xml.plist" - Data: "" - 21995-22043: "" - 21995-22003: "meta.tag.string.xml.plist" - 21995-21996: "punctuation.definition.tag.xml.plist" - Data: "<" - 21996-22002: "entity.name.tag.xml.plist" - 21996-22002: "entity.name.tag.localname.xml.plist" - Data: "string" - 22002-22003: "punctuation.definition.tag.xml.plist" - Data: ">" - 22034-22043: "meta.tag.string.xml.plist" - 22034-22036: "punctuation.definition.tag.xml.plist" - Data: "" - 22050-22057: "meta.tag.dict.xml.plist" - 22050-22052: "punctuation.definition.tag.xml.plist" - Data: "" - 22064-22220: "" - 22064-22070: "meta.tag.dict.xml.plist" - 22064-22065: "punctuation.definition.tag.xml.plist" - Data: "<" - 22065-22069: "entity.name.tag.xml.plist" - 22065-22069: "entity.name.tag.localname.xml.plist" - Data: "dict" - 22069-22070: "punctuation.definition.tag.xml.plist" - Data: ">" - 22078-22094: "" - 22078-22083: "meta.tag.key.xml.plist" - 22078-22079: "punctuation.definition.tag.xml.plist" - Data: "<" - 22079-22082: "entity.name.tag.xml.plist" - 22079-22082: "entity.name.tag.localname.xml.plist" - Data: "key" - 22082-22083: "punctuation.definition.tag.xml.plist" - Data: ">" - 22088-22094: "meta.tag.key.xml.plist" - 22088-22090: "punctuation.definition.tag.xml.plist" - Data: "" - 22102-22120: "" - 22102-22110: "meta.tag.string.xml.plist" - 22102-22103: "punctuation.definition.tag.xml.plist" - Data: "<" - 22103-22109: "entity.name.tag.xml.plist" - 22103-22109: "entity.name.tag.localname.xml.plist" - Data: "string" - 22109-22110: "punctuation.definition.tag.xml.plist" - Data: ">" - 22111-22120: "meta.tag.string.xml.plist" - 22111-22113: "punctuation.definition.tag.xml.plist" - Data: "" - 22128-22143: "" - 22128-22133: "meta.tag.key.xml.plist" - 22128-22129: "punctuation.definition.tag.xml.plist" - Data: "<" - 22129-22132: "entity.name.tag.xml.plist" - 22129-22132: "entity.name.tag.localname.xml.plist" - Data: "key" - 22132-22133: "punctuation.definition.tag.xml.plist" - Data: ">" - 22137-22143: "meta.tag.key.xml.plist" - 22137-22139: "punctuation.definition.tag.xml.plist" - Data: "" - 22151-22206: "" - 22151-22159: "meta.tag.string.xml.plist" - 22151-22152: "punctuation.definition.tag.xml.plist" - Data: "<" - 22152-22158: "entity.name.tag.xml.plist" - 22152-22158: "entity.name.tag.localname.xml.plist" - Data: "string" - 22158-22159: "punctuation.definition.tag.xml.plist" - Data: ">" - 22197-22206: "meta.tag.string.xml.plist" - 22197-22199: "punctuation.definition.tag.xml.plist" - Data: "" - 22213-22220: "meta.tag.dict.xml.plist" - 22213-22215: "punctuation.definition.tag.xml.plist" - Data: "" - 22226-22234: "meta.tag.array.xml.plist" - 22226-22228: "punctuation.definition.tag.xml.plist" - Data: "" - 22239-22246: "meta.tag.dict.xml.plist" - 22239-22241: "punctuation.definition.tag.xml.plist" - Data: "" - 22251-23521: "" - 22251-22257: "meta.tag.dict.xml.plist" - 22251-22252: "punctuation.definition.tag.xml.plist" - Data: "<" - 22252-22256: "entity.name.tag.xml.plist" - 22252-22256: "entity.name.tag.localname.xml.plist" - Data: "dict" - 22256-22257: "punctuation.definition.tag.xml.plist" - Data: ">" - 22263-22279: "" - 22263-22268: "meta.tag.key.xml.plist" - 22263-22264: "punctuation.definition.tag.xml.plist" - Data: "<" - 22264-22267: "entity.name.tag.xml.plist" - 22264-22267: "entity.name.tag.localname.xml.plist" - Data: "key" - 22267-22268: "punctuation.definition.tag.xml.plist" - Data: ">" - 22273-22279: "meta.tag.key.xml.plist" - 22273-22275: "punctuation.definition.tag.xml.plist" - Data: "" - 22285-22327: "" - 22285-22293: "meta.tag.string.xml.plist" - 22285-22286: "punctuation.definition.tag.xml.plist" - Data: "<" - 22286-22292: "entity.name.tag.xml.plist" - 22286-22292: "entity.name.tag.localname.xml.plist" - Data: "string" - 22292-22293: "punctuation.definition.tag.xml.plist" - Data: ">" - 22318-22327: "meta.tag.string.xml.plist" - 22318-22320: "punctuation.definition.tag.xml.plist" - Data: "" - 22333-22352: "" - 22333-22338: "meta.tag.key.xml.plist" - 22333-22334: "punctuation.definition.tag.xml.plist" - Data: "<" - 22334-22337: "entity.name.tag.xml.plist" - 22334-22337: "entity.name.tag.localname.xml.plist" - Data: "key" - 22337-22338: "punctuation.definition.tag.xml.plist" - Data: ">" - 22346-22352: "meta.tag.key.xml.plist" - 22346-22348: "punctuation.definition.tag.xml.plist" - Data: "" - 22358-23005: "" - 22358-22364: "meta.tag.dict.xml.plist" - 22358-22359: "punctuation.definition.tag.xml.plist" - Data: "<" - 22359-22363: "entity.name.tag.xml.plist" - 22359-22363: "entity.name.tag.localname.xml.plist" - Data: "dict" - 22363-22364: "punctuation.definition.tag.xml.plist" - Data: ">" - 22371-22383: "" - 22371-22376: "meta.tag.key.xml.plist" - 22371-22372: "punctuation.definition.tag.xml.plist" - Data: "<" - 22372-22375: "entity.name.tag.xml.plist" - 22372-22375: "entity.name.tag.localname.xml.plist" - Data: "key" - 22375-22376: "punctuation.definition.tag.xml.plist" - Data: ">" - 22377-22383: "meta.tag.key.xml.plist" - 22377-22379: "punctuation.definition.tag.xml.plist" - Data: "" - 22390-22484: "" - 22390-22396: "meta.tag.dict.xml.plist" - 22390-22391: "punctuation.definition.tag.xml.plist" - Data: "<" - 22391-22395: "entity.name.tag.xml.plist" - 22391-22395: "entity.name.tag.localname.xml.plist" - Data: "dict" - 22395-22396: "punctuation.definition.tag.xml.plist" - Data: ">" - 22404-22419: "" - 22404-22409: "meta.tag.key.xml.plist" - 22404-22405: "punctuation.definition.tag.xml.plist" - Data: "<" - 22405-22408: "entity.name.tag.xml.plist" - 22405-22408: "entity.name.tag.localname.xml.plist" - Data: "key" - 22408-22409: "punctuation.definition.tag.xml.plist" - Data: ">" - 22413-22419: "meta.tag.key.xml.plist" - 22413-22415: "punctuation.definition.tag.xml.plist" - Data: "" - 22427-22470: "" - 22427-22435: "meta.tag.string.xml.plist" - 22427-22428: "punctuation.definition.tag.xml.plist" - Data: "<" - 22428-22434: "entity.name.tag.xml.plist" - 22428-22434: "entity.name.tag.localname.xml.plist" - Data: "string" - 22434-22435: "punctuation.definition.tag.xml.plist" - Data: ">" - 22461-22470: "meta.tag.string.xml.plist" - 22461-22463: "punctuation.definition.tag.xml.plist" - Data: "" - 22477-22484: "meta.tag.dict.xml.plist" - 22477-22479: "punctuation.definition.tag.xml.plist" - Data: "" - 22491-22503: "" - 22491-22496: "meta.tag.key.xml.plist" - 22491-22492: "punctuation.definition.tag.xml.plist" - Data: "<" - 22492-22495: "entity.name.tag.xml.plist" - 22492-22495: "entity.name.tag.localname.xml.plist" - Data: "key" - 22495-22496: "punctuation.definition.tag.xml.plist" - Data: ">" - 22497-22503: "meta.tag.key.xml.plist" - 22497-22499: "punctuation.definition.tag.xml.plist" - Data: "" - 22510-22614: "" - 22510-22516: "meta.tag.dict.xml.plist" - 22510-22511: "punctuation.definition.tag.xml.plist" - Data: "<" - 22511-22515: "entity.name.tag.xml.plist" - 22511-22515: "entity.name.tag.localname.xml.plist" - Data: "dict" - 22515-22516: "punctuation.definition.tag.xml.plist" - Data: ">" - 22524-22539: "" - 22524-22529: "meta.tag.key.xml.plist" - 22524-22525: "punctuation.definition.tag.xml.plist" - Data: "<" - 22525-22528: "entity.name.tag.xml.plist" - 22525-22528: "entity.name.tag.localname.xml.plist" - Data: "key" - 22528-22529: "punctuation.definition.tag.xml.plist" - Data: ">" - 22533-22539: "meta.tag.key.xml.plist" - 22533-22535: "punctuation.definition.tag.xml.plist" - Data: "" - 22547-22600: "" - 22547-22555: "meta.tag.string.xml.plist" - 22547-22548: "punctuation.definition.tag.xml.plist" - Data: "<" - 22548-22554: "entity.name.tag.xml.plist" - 22548-22554: "entity.name.tag.localname.xml.plist" - Data: "string" - 22554-22555: "punctuation.definition.tag.xml.plist" - Data: ">" - 22591-22600: "meta.tag.string.xml.plist" - 22591-22593: "punctuation.definition.tag.xml.plist" - Data: "" - 22607-22614: "meta.tag.dict.xml.plist" - 22607-22609: "punctuation.definition.tag.xml.plist" - Data: "" - 22621-22633: "" - 22621-22626: "meta.tag.key.xml.plist" - 22621-22622: "punctuation.definition.tag.xml.plist" - Data: "<" - 22622-22625: "entity.name.tag.xml.plist" - 22622-22625: "entity.name.tag.localname.xml.plist" - Data: "key" - 22625-22626: "punctuation.definition.tag.xml.plist" - Data: ">" - 22627-22633: "meta.tag.key.xml.plist" - 22627-22629: "punctuation.definition.tag.xml.plist" - Data: "" - 22640-22733: "" - 22640-22646: "meta.tag.dict.xml.plist" - 22640-22641: "punctuation.definition.tag.xml.plist" - Data: "<" - 22641-22645: "entity.name.tag.xml.plist" - 22641-22645: "entity.name.tag.localname.xml.plist" - Data: "dict" - 22645-22646: "punctuation.definition.tag.xml.plist" - Data: ">" - 22654-22669: "" - 22654-22659: "meta.tag.key.xml.plist" - 22654-22655: "punctuation.definition.tag.xml.plist" - Data: "<" - 22655-22658: "entity.name.tag.xml.plist" - 22655-22658: "entity.name.tag.localname.xml.plist" - Data: "key" - 22658-22659: "punctuation.definition.tag.xml.plist" - Data: ">" - 22663-22669: "meta.tag.key.xml.plist" - 22663-22665: "punctuation.definition.tag.xml.plist" - Data: "" - 22677-22719: "" - 22677-22685: "meta.tag.string.xml.plist" - 22677-22678: "punctuation.definition.tag.xml.plist" - Data: "<" - 22678-22684: "entity.name.tag.xml.plist" - 22678-22684: "entity.name.tag.localname.xml.plist" - Data: "string" - 22684-22685: "punctuation.definition.tag.xml.plist" - Data: ">" - 22710-22719: "meta.tag.string.xml.plist" - 22710-22712: "punctuation.definition.tag.xml.plist" - Data: "" - 22726-22733: "meta.tag.dict.xml.plist" - 22726-22728: "punctuation.definition.tag.xml.plist" - Data: "" - 22740-22752: "" - 22740-22745: "meta.tag.key.xml.plist" - 22740-22741: "punctuation.definition.tag.xml.plist" - Data: "<" - 22741-22744: "entity.name.tag.xml.plist" - 22741-22744: "entity.name.tag.localname.xml.plist" - Data: "key" - 22744-22745: "punctuation.definition.tag.xml.plist" - Data: ">" - 22746-22752: "meta.tag.key.xml.plist" - 22746-22748: "punctuation.definition.tag.xml.plist" - Data: "" - 22759-22862: "" - 22759-22765: "meta.tag.dict.xml.plist" - 22759-22760: "punctuation.definition.tag.xml.plist" - Data: "<" - 22760-22764: "entity.name.tag.xml.plist" - 22760-22764: "entity.name.tag.localname.xml.plist" - Data: "dict" - 22764-22765: "punctuation.definition.tag.xml.plist" - Data: ">" - 22773-22788: "" - 22773-22778: "meta.tag.key.xml.plist" - 22773-22774: "punctuation.definition.tag.xml.plist" - Data: "<" - 22774-22777: "entity.name.tag.xml.plist" - 22774-22777: "entity.name.tag.localname.xml.plist" - Data: "key" - 22777-22778: "punctuation.definition.tag.xml.plist" - Data: ">" - 22782-22788: "meta.tag.key.xml.plist" - 22782-22784: "punctuation.definition.tag.xml.plist" - Data: "" - 22796-22848: "" - 22796-22804: "meta.tag.string.xml.plist" - 22796-22797: "punctuation.definition.tag.xml.plist" - Data: "<" - 22797-22803: "entity.name.tag.xml.plist" - 22797-22803: "entity.name.tag.localname.xml.plist" - Data: "string" - 22803-22804: "punctuation.definition.tag.xml.plist" - Data: ">" - 22839-22848: "meta.tag.string.xml.plist" - 22839-22841: "punctuation.definition.tag.xml.plist" - Data: "" - 22855-22862: "meta.tag.dict.xml.plist" - 22855-22857: "punctuation.definition.tag.xml.plist" - Data: "" - 22869-22881: "" - 22869-22874: "meta.tag.key.xml.plist" - 22869-22870: "punctuation.definition.tag.xml.plist" - Data: "<" - 22870-22873: "entity.name.tag.xml.plist" - 22870-22873: "entity.name.tag.localname.xml.plist" - Data: "key" - 22873-22874: "punctuation.definition.tag.xml.plist" - Data: ">" - 22875-22881: "meta.tag.key.xml.plist" - 22875-22877: "punctuation.definition.tag.xml.plist" - Data: "" - 22888-22992: "" - 22888-22894: "meta.tag.dict.xml.plist" - 22888-22889: "punctuation.definition.tag.xml.plist" - Data: "<" - 22889-22893: "entity.name.tag.xml.plist" - 22889-22893: "entity.name.tag.localname.xml.plist" - Data: "dict" - 22893-22894: "punctuation.definition.tag.xml.plist" - Data: ">" - 22902-22917: "" - 22902-22907: "meta.tag.key.xml.plist" - 22902-22903: "punctuation.definition.tag.xml.plist" - Data: "<" - 22903-22906: "entity.name.tag.xml.plist" - 22903-22906: "entity.name.tag.localname.xml.plist" - Data: "key" - 22906-22907: "punctuation.definition.tag.xml.plist" - Data: ">" - 22911-22917: "meta.tag.key.xml.plist" - 22911-22913: "punctuation.definition.tag.xml.plist" - Data: "" - 22925-22978: "" - 22925-22933: "meta.tag.string.xml.plist" - 22925-22926: "punctuation.definition.tag.xml.plist" - Data: "<" - 22926-22932: "entity.name.tag.xml.plist" - 22926-22932: "entity.name.tag.localname.xml.plist" - Data: "string" - 22932-22933: "punctuation.definition.tag.xml.plist" - Data: ">" - 22969-22978: "meta.tag.string.xml.plist" - 22969-22971: "punctuation.definition.tag.xml.plist" - Data: "" - 22985-22992: "meta.tag.dict.xml.plist" - 22985-22987: "punctuation.definition.tag.xml.plist" - Data: "" - 22998-23005: "meta.tag.dict.xml.plist" - 22998-23000: "punctuation.definition.tag.xml.plist" - Data: "" - 23011-23029: "" - 23011-23016: "meta.tag.key.xml.plist" - 23011-23012: "punctuation.definition.tag.xml.plist" - Data: "<" - 23012-23015: "entity.name.tag.xml.plist" - 23012-23015: "entity.name.tag.localname.xml.plist" - Data: "key" - 23015-23016: "punctuation.definition.tag.xml.plist" - Data: ">" - 23023-23029: "meta.tag.key.xml.plist" - 23023-23025: "punctuation.definition.tag.xml.plist" - Data: "" - 23035-23059: "" - 23035-23043: "meta.tag.string.xml.plist" - 23035-23036: "punctuation.definition.tag.xml.plist" - Data: "<" - 23036-23042: "entity.name.tag.xml.plist" - 23036-23042: "entity.name.tag.localname.xml.plist" - Data: "string" - 23042-23043: "punctuation.definition.tag.xml.plist" - Data: ">" - 23050-23059: "meta.tag.string.xml.plist" - 23050-23052: "punctuation.definition.tag.xml.plist" - Data: "" - 23065-23079: "" - 23065-23070: "meta.tag.key.xml.plist" - 23065-23066: "punctuation.definition.tag.xml.plist" - Data: "<" - 23066-23069: "entity.name.tag.xml.plist" - 23066-23069: "entity.name.tag.localname.xml.plist" - Data: "key" - 23069-23070: "punctuation.definition.tag.xml.plist" - Data: ">" - 23073-23079: "meta.tag.key.xml.plist" - 23073-23075: "punctuation.definition.tag.xml.plist" - Data: "" - 23085-23128: "" - 23085-23093: "meta.tag.string.xml.plist" - 23085-23086: "punctuation.definition.tag.xml.plist" - Data: "<" - 23086-23092: "entity.name.tag.xml.plist" - 23086-23092: "entity.name.tag.localname.xml.plist" - Data: "string" - 23092-23093: "punctuation.definition.tag.xml.plist" - Data: ">" - 23119-23128: "meta.tag.string.xml.plist" - 23119-23121: "punctuation.definition.tag.xml.plist" - Data: "" - 23134-23153: "" - 23134-23139: "meta.tag.key.xml.plist" - 23134-23135: "punctuation.definition.tag.xml.plist" - Data: "<" - 23135-23138: "entity.name.tag.xml.plist" - 23135-23138: "entity.name.tag.localname.xml.plist" - Data: "key" - 23138-23139: "punctuation.definition.tag.xml.plist" - Data: ">" - 23147-23153: "meta.tag.key.xml.plist" - 23147-23149: "punctuation.definition.tag.xml.plist" - Data: "" - 23159-23509: "" - 23159-23166: "meta.tag.array.xml.plist" - 23159-23160: "punctuation.definition.tag.xml.plist" - Data: "<" - 23160-23165: "entity.name.tag.xml.plist" - 23160-23165: "entity.name.tag.localname.xml.plist" - Data: "array" - 23165-23166: "punctuation.definition.tag.xml.plist" - Data: ">" - 23173-23332: "" - 23173-23179: "meta.tag.dict.xml.plist" - 23173-23174: "punctuation.definition.tag.xml.plist" - Data: "<" - 23174-23178: "entity.name.tag.xml.plist" - 23174-23178: "entity.name.tag.localname.xml.plist" - Data: "dict" - 23178-23179: "punctuation.definition.tag.xml.plist" - Data: ">" - 23187-23203: "" - 23187-23192: "meta.tag.key.xml.plist" - 23187-23188: "punctuation.definition.tag.xml.plist" - Data: "<" - 23188-23191: "entity.name.tag.xml.plist" - 23188-23191: "entity.name.tag.localname.xml.plist" - Data: "key" - 23191-23192: "punctuation.definition.tag.xml.plist" - Data: ">" - 23197-23203: "meta.tag.key.xml.plist" - 23197-23199: "punctuation.definition.tag.xml.plist" - Data: "" - 23211-23236: "" - 23211-23219: "meta.tag.string.xml.plist" - 23211-23212: "punctuation.definition.tag.xml.plist" - Data: "<" - 23212-23218: "entity.name.tag.xml.plist" - 23212-23218: "entity.name.tag.localname.xml.plist" - Data: "string" - 23218-23219: "punctuation.definition.tag.xml.plist" - Data: ">" - 23227-23236: "meta.tag.string.xml.plist" - 23227-23229: "punctuation.definition.tag.xml.plist" - Data: "" - 23244-23259: "" - 23244-23249: "meta.tag.key.xml.plist" - 23244-23245: "punctuation.definition.tag.xml.plist" - Data: "<" - 23245-23248: "entity.name.tag.xml.plist" - 23245-23248: "entity.name.tag.localname.xml.plist" - Data: "key" - 23248-23249: "punctuation.definition.tag.xml.plist" - Data: ">" - 23253-23259: "meta.tag.key.xml.plist" - 23253-23255: "punctuation.definition.tag.xml.plist" - Data: "" - 23267-23318: "" - 23267-23275: "meta.tag.string.xml.plist" - 23267-23268: "punctuation.definition.tag.xml.plist" - Data: "<" - 23268-23274: "entity.name.tag.xml.plist" - 23268-23274: "entity.name.tag.localname.xml.plist" - Data: "string" - 23274-23275: "punctuation.definition.tag.xml.plist" - Data: ">" - 23309-23318: "meta.tag.string.xml.plist" - 23309-23311: "punctuation.definition.tag.xml.plist" - Data: "" - 23325-23332: "meta.tag.dict.xml.plist" - 23325-23327: "punctuation.definition.tag.xml.plist" - Data: "" - 23339-23495: "" - 23339-23345: "meta.tag.dict.xml.plist" - 23339-23340: "punctuation.definition.tag.xml.plist" - Data: "<" - 23340-23344: "entity.name.tag.xml.plist" - 23340-23344: "entity.name.tag.localname.xml.plist" - Data: "dict" - 23344-23345: "punctuation.definition.tag.xml.plist" - Data: ">" - 23353-23369: "" - 23353-23358: "meta.tag.key.xml.plist" - 23353-23354: "punctuation.definition.tag.xml.plist" - Data: "<" - 23354-23357: "entity.name.tag.xml.plist" - 23354-23357: "entity.name.tag.localname.xml.plist" - Data: "key" - 23357-23358: "punctuation.definition.tag.xml.plist" - Data: ">" - 23363-23369: "meta.tag.key.xml.plist" - 23363-23365: "punctuation.definition.tag.xml.plist" - Data: "" - 23377-23395: "" - 23377-23385: "meta.tag.string.xml.plist" - 23377-23378: "punctuation.definition.tag.xml.plist" - Data: "<" - 23378-23384: "entity.name.tag.xml.plist" - 23378-23384: "entity.name.tag.localname.xml.plist" - Data: "string" - 23384-23385: "punctuation.definition.tag.xml.plist" - Data: ">" - 23386-23395: "meta.tag.string.xml.plist" - 23386-23388: "punctuation.definition.tag.xml.plist" - Data: "" - 23403-23418: "" - 23403-23408: "meta.tag.key.xml.plist" - 23403-23404: "punctuation.definition.tag.xml.plist" - Data: "<" - 23404-23407: "entity.name.tag.xml.plist" - 23404-23407: "entity.name.tag.localname.xml.plist" - Data: "key" - 23407-23408: "punctuation.definition.tag.xml.plist" - Data: ">" - 23412-23418: "meta.tag.key.xml.plist" - 23412-23414: "punctuation.definition.tag.xml.plist" - Data: "" - 23426-23481: "" - 23426-23434: "meta.tag.string.xml.plist" - 23426-23427: "punctuation.definition.tag.xml.plist" - Data: "<" - 23427-23433: "entity.name.tag.xml.plist" - 23427-23433: "entity.name.tag.localname.xml.plist" - Data: "string" - 23433-23434: "punctuation.definition.tag.xml.plist" - Data: ">" - 23472-23481: "meta.tag.string.xml.plist" - 23472-23474: "punctuation.definition.tag.xml.plist" - Data: "" - 23488-23495: "meta.tag.dict.xml.plist" - 23488-23490: "punctuation.definition.tag.xml.plist" - Data: "" - 23501-23509: "meta.tag.array.xml.plist" - 23501-23503: "punctuation.definition.tag.xml.plist" - Data: "" - 23514-23521: "meta.tag.dict.xml.plist" - 23514-23516: "punctuation.definition.tag.xml.plist" - Data: "" - 23526-24354: "" - 23526-23532: "meta.tag.dict.xml.plist" - 23526-23527: "punctuation.definition.tag.xml.plist" - Data: "<" - 23527-23531: "entity.name.tag.xml.plist" - 23527-23531: "entity.name.tag.localname.xml.plist" - Data: "dict" - 23531-23532: "punctuation.definition.tag.xml.plist" - Data: ">" - 23538-23557: "" - 23538-23543: "meta.tag.key.xml.plist" - 23538-23539: "punctuation.definition.tag.xml.plist" - Data: "<" - 23539-23542: "entity.name.tag.xml.plist" - 23539-23542: "entity.name.tag.localname.xml.plist" - Data: "key" - 23542-23543: "punctuation.definition.tag.xml.plist" - Data: ">" - 23551-23557: "meta.tag.key.xml.plist" - 23551-23553: "punctuation.definition.tag.xml.plist" - Data: "" - 23563-24210: "" - 23563-23569: "meta.tag.dict.xml.plist" - 23563-23564: "punctuation.definition.tag.xml.plist" - Data: "<" - 23564-23568: "entity.name.tag.xml.plist" - 23564-23568: "entity.name.tag.localname.xml.plist" - Data: "dict" - 23568-23569: "punctuation.definition.tag.xml.plist" - Data: ">" - 23576-23588: "" - 23576-23581: "meta.tag.key.xml.plist" - 23576-23577: "punctuation.definition.tag.xml.plist" - Data: "<" - 23577-23580: "entity.name.tag.xml.plist" - 23577-23580: "entity.name.tag.localname.xml.plist" - Data: "key" - 23580-23581: "punctuation.definition.tag.xml.plist" - Data: ">" - 23582-23588: "meta.tag.key.xml.plist" - 23582-23584: "punctuation.definition.tag.xml.plist" - Data: "" - 23595-23689: "" - 23595-23601: "meta.tag.dict.xml.plist" - 23595-23596: "punctuation.definition.tag.xml.plist" - Data: "<" - 23596-23600: "entity.name.tag.xml.plist" - 23596-23600: "entity.name.tag.localname.xml.plist" - Data: "dict" - 23600-23601: "punctuation.definition.tag.xml.plist" - Data: ">" - 23609-23624: "" - 23609-23614: "meta.tag.key.xml.plist" - 23609-23610: "punctuation.definition.tag.xml.plist" - Data: "<" - 23610-23613: "entity.name.tag.xml.plist" - 23610-23613: "entity.name.tag.localname.xml.plist" - Data: "key" - 23613-23614: "punctuation.definition.tag.xml.plist" - Data: ">" - 23618-23624: "meta.tag.key.xml.plist" - 23618-23620: "punctuation.definition.tag.xml.plist" - Data: "" - 23632-23675: "" - 23632-23640: "meta.tag.string.xml.plist" - 23632-23633: "punctuation.definition.tag.xml.plist" - Data: "<" - 23633-23639: "entity.name.tag.xml.plist" - 23633-23639: "entity.name.tag.localname.xml.plist" - Data: "string" - 23639-23640: "punctuation.definition.tag.xml.plist" - Data: ">" - 23666-23675: "meta.tag.string.xml.plist" - 23666-23668: "punctuation.definition.tag.xml.plist" - Data: "" - 23682-23689: "meta.tag.dict.xml.plist" - 23682-23684: "punctuation.definition.tag.xml.plist" - Data: "" - 23696-23708: "" - 23696-23701: "meta.tag.key.xml.plist" - 23696-23697: "punctuation.definition.tag.xml.plist" - Data: "<" - 23697-23700: "entity.name.tag.xml.plist" - 23697-23700: "entity.name.tag.localname.xml.plist" - Data: "key" - 23700-23701: "punctuation.definition.tag.xml.plist" - Data: ">" - 23702-23708: "meta.tag.key.xml.plist" - 23702-23704: "punctuation.definition.tag.xml.plist" - Data: "" - 23715-23819: "" - 23715-23721: "meta.tag.dict.xml.plist" - 23715-23716: "punctuation.definition.tag.xml.plist" - Data: "<" - 23716-23720: "entity.name.tag.xml.plist" - 23716-23720: "entity.name.tag.localname.xml.plist" - Data: "dict" - 23720-23721: "punctuation.definition.tag.xml.plist" - Data: ">" - 23729-23744: "" - 23729-23734: "meta.tag.key.xml.plist" - 23729-23730: "punctuation.definition.tag.xml.plist" - Data: "<" - 23730-23733: "entity.name.tag.xml.plist" - 23730-23733: "entity.name.tag.localname.xml.plist" - Data: "key" - 23733-23734: "punctuation.definition.tag.xml.plist" - Data: ">" - 23738-23744: "meta.tag.key.xml.plist" - 23738-23740: "punctuation.definition.tag.xml.plist" - Data: "" - 23752-23805: "" - 23752-23760: "meta.tag.string.xml.plist" - 23752-23753: "punctuation.definition.tag.xml.plist" - Data: "<" - 23753-23759: "entity.name.tag.xml.plist" - 23753-23759: "entity.name.tag.localname.xml.plist" - Data: "string" - 23759-23760: "punctuation.definition.tag.xml.plist" - Data: ">" - 23796-23805: "meta.tag.string.xml.plist" - 23796-23798: "punctuation.definition.tag.xml.plist" - Data: "" - 23812-23819: "meta.tag.dict.xml.plist" - 23812-23814: "punctuation.definition.tag.xml.plist" - Data: "" - 23826-23838: "" - 23826-23831: "meta.tag.key.xml.plist" - 23826-23827: "punctuation.definition.tag.xml.plist" - Data: "<" - 23827-23830: "entity.name.tag.xml.plist" - 23827-23830: "entity.name.tag.localname.xml.plist" - Data: "key" - 23830-23831: "punctuation.definition.tag.xml.plist" - Data: ">" - 23832-23838: "meta.tag.key.xml.plist" - 23832-23834: "punctuation.definition.tag.xml.plist" - Data: "" - 23845-23938: "" - 23845-23851: "meta.tag.dict.xml.plist" - 23845-23846: "punctuation.definition.tag.xml.plist" - Data: "<" - 23846-23850: "entity.name.tag.xml.plist" - 23846-23850: "entity.name.tag.localname.xml.plist" - Data: "dict" - 23850-23851: "punctuation.definition.tag.xml.plist" - Data: ">" - 23859-23874: "" - 23859-23864: "meta.tag.key.xml.plist" - 23859-23860: "punctuation.definition.tag.xml.plist" - Data: "<" - 23860-23863: "entity.name.tag.xml.plist" - 23860-23863: "entity.name.tag.localname.xml.plist" - Data: "key" - 23863-23864: "punctuation.definition.tag.xml.plist" - Data: ">" - 23868-23874: "meta.tag.key.xml.plist" - 23868-23870: "punctuation.definition.tag.xml.plist" - Data: "" - 23882-23924: "" - 23882-23890: "meta.tag.string.xml.plist" - 23882-23883: "punctuation.definition.tag.xml.plist" - Data: "<" - 23883-23889: "entity.name.tag.xml.plist" - 23883-23889: "entity.name.tag.localname.xml.plist" - Data: "string" - 23889-23890: "punctuation.definition.tag.xml.plist" - Data: ">" - 23915-23924: "meta.tag.string.xml.plist" - 23915-23917: "punctuation.definition.tag.xml.plist" - Data: "" - 23931-23938: "meta.tag.dict.xml.plist" - 23931-23933: "punctuation.definition.tag.xml.plist" - Data: "" - 23945-23957: "" - 23945-23950: "meta.tag.key.xml.plist" - 23945-23946: "punctuation.definition.tag.xml.plist" - Data: "<" - 23946-23949: "entity.name.tag.xml.plist" - 23946-23949: "entity.name.tag.localname.xml.plist" - Data: "key" - 23949-23950: "punctuation.definition.tag.xml.plist" - Data: ">" - 23951-23957: "meta.tag.key.xml.plist" - 23951-23953: "punctuation.definition.tag.xml.plist" - Data: "" - 23964-24067: "" - 23964-23970: "meta.tag.dict.xml.plist" - 23964-23965: "punctuation.definition.tag.xml.plist" - Data: "<" - 23965-23969: "entity.name.tag.xml.plist" - 23965-23969: "entity.name.tag.localname.xml.plist" - Data: "dict" - 23969-23970: "punctuation.definition.tag.xml.plist" - Data: ">" - 23978-23993: "" - 23978-23983: "meta.tag.key.xml.plist" - 23978-23979: "punctuation.definition.tag.xml.plist" - Data: "<" - 23979-23982: "entity.name.tag.xml.plist" - 23979-23982: "entity.name.tag.localname.xml.plist" - Data: "key" - 23982-23983: "punctuation.definition.tag.xml.plist" - Data: ">" - 23987-23993: "meta.tag.key.xml.plist" - 23987-23989: "punctuation.definition.tag.xml.plist" - Data: "" - 24001-24053: "" - 24001-24009: "meta.tag.string.xml.plist" - 24001-24002: "punctuation.definition.tag.xml.plist" - Data: "<" - 24002-24008: "entity.name.tag.xml.plist" - 24002-24008: "entity.name.tag.localname.xml.plist" - Data: "string" - 24008-24009: "punctuation.definition.tag.xml.plist" - Data: ">" - 24044-24053: "meta.tag.string.xml.plist" - 24044-24046: "punctuation.definition.tag.xml.plist" - Data: "" - 24060-24067: "meta.tag.dict.xml.plist" - 24060-24062: "punctuation.definition.tag.xml.plist" - Data: "" - 24074-24086: "" - 24074-24079: "meta.tag.key.xml.plist" - 24074-24075: "punctuation.definition.tag.xml.plist" - Data: "<" - 24075-24078: "entity.name.tag.xml.plist" - 24075-24078: "entity.name.tag.localname.xml.plist" - Data: "key" - 24078-24079: "punctuation.definition.tag.xml.plist" - Data: ">" - 24080-24086: "meta.tag.key.xml.plist" - 24080-24082: "punctuation.definition.tag.xml.plist" - Data: "" - 24093-24197: "" - 24093-24099: "meta.tag.dict.xml.plist" - 24093-24094: "punctuation.definition.tag.xml.plist" - Data: "<" - 24094-24098: "entity.name.tag.xml.plist" - 24094-24098: "entity.name.tag.localname.xml.plist" - Data: "dict" - 24098-24099: "punctuation.definition.tag.xml.plist" - Data: ">" - 24107-24122: "" - 24107-24112: "meta.tag.key.xml.plist" - 24107-24108: "punctuation.definition.tag.xml.plist" - Data: "<" - 24108-24111: "entity.name.tag.xml.plist" - 24108-24111: "entity.name.tag.localname.xml.plist" - Data: "key" - 24111-24112: "punctuation.definition.tag.xml.plist" - Data: ">" - 24116-24122: "meta.tag.key.xml.plist" - 24116-24118: "punctuation.definition.tag.xml.plist" - Data: "" - 24130-24183: "" - 24130-24138: "meta.tag.string.xml.plist" - 24130-24131: "punctuation.definition.tag.xml.plist" - Data: "<" - 24131-24137: "entity.name.tag.xml.plist" - 24131-24137: "entity.name.tag.localname.xml.plist" - Data: "string" - 24137-24138: "punctuation.definition.tag.xml.plist" - Data: ">" - 24174-24183: "meta.tag.string.xml.plist" - 24174-24176: "punctuation.definition.tag.xml.plist" - Data: "" - 24190-24197: "meta.tag.dict.xml.plist" - 24190-24192: "punctuation.definition.tag.xml.plist" - Data: "" - 24203-24210: "meta.tag.dict.xml.plist" - 24203-24205: "punctuation.definition.tag.xml.plist" - Data: "" - 24216-24234: "" - 24216-24221: "meta.tag.key.xml.plist" - 24216-24217: "punctuation.definition.tag.xml.plist" - Data: "<" - 24217-24220: "entity.name.tag.xml.plist" - 24217-24220: "entity.name.tag.localname.xml.plist" - Data: "key" - 24220-24221: "punctuation.definition.tag.xml.plist" - Data: ">" - 24228-24234: "meta.tag.key.xml.plist" - 24228-24230: "punctuation.definition.tag.xml.plist" - Data: "" - 24240-24264: "" - 24240-24248: "meta.tag.string.xml.plist" - 24240-24241: "punctuation.definition.tag.xml.plist" - Data: "<" - 24241-24247: "entity.name.tag.xml.plist" - 24241-24247: "entity.name.tag.localname.xml.plist" - Data: "string" - 24247-24248: "punctuation.definition.tag.xml.plist" - Data: ">" - 24255-24264: "meta.tag.string.xml.plist" - 24255-24257: "punctuation.definition.tag.xml.plist" - Data: "" - 24270-24286: "" - 24270-24275: "meta.tag.key.xml.plist" - 24270-24271: "punctuation.definition.tag.xml.plist" - Data: "<" - 24271-24274: "entity.name.tag.xml.plist" - 24271-24274: "entity.name.tag.localname.xml.plist" - Data: "key" - 24274-24275: "punctuation.definition.tag.xml.plist" - Data: ">" - 24280-24286: "meta.tag.key.xml.plist" - 24280-24282: "punctuation.definition.tag.xml.plist" - Data: "" - 24292-24342: "" - 24292-24300: "meta.tag.string.xml.plist" - 24292-24293: "punctuation.definition.tag.xml.plist" - Data: "<" - 24293-24299: "entity.name.tag.xml.plist" - 24293-24299: "entity.name.tag.localname.xml.plist" - Data: "string" - 24299-24300: "punctuation.definition.tag.xml.plist" - Data: ">" - 24333-24342: "meta.tag.string.xml.plist" - 24333-24335: "punctuation.definition.tag.xml.plist" - Data: "" - 24347-24354: "meta.tag.dict.xml.plist" - 24347-24349: "punctuation.definition.tag.xml.plist" - Data: "" - 24359-25791: "" - 24359-24365: "meta.tag.dict.xml.plist" - 24359-24360: "punctuation.definition.tag.xml.plist" - Data: "<" - 24360-24364: "entity.name.tag.xml.plist" - 24360-24364: "entity.name.tag.localname.xml.plist" - Data: "dict" - 24364-24365: "punctuation.definition.tag.xml.plist" - Data: ">" - 24371-24387: "" - 24371-24376: "meta.tag.key.xml.plist" - 24371-24372: "punctuation.definition.tag.xml.plist" - Data: "<" - 24372-24375: "entity.name.tag.xml.plist" - 24372-24375: "entity.name.tag.localname.xml.plist" - Data: "key" - 24375-24376: "punctuation.definition.tag.xml.plist" - Data: ">" - 24381-24387: "meta.tag.key.xml.plist" - 24381-24383: "punctuation.definition.tag.xml.plist" - Data: "" - 24393-24432: "" - 24393-24401: "meta.tag.string.xml.plist" - 24393-24394: "punctuation.definition.tag.xml.plist" - Data: "<" - 24394-24400: "entity.name.tag.xml.plist" - 24394-24400: "entity.name.tag.localname.xml.plist" - Data: "string" - 24400-24401: "punctuation.definition.tag.xml.plist" - Data: ">" - 24423-24432: "meta.tag.string.xml.plist" - 24423-24425: "punctuation.definition.tag.xml.plist" - Data: "" - 24438-24457: "" - 24438-24443: "meta.tag.key.xml.plist" - 24438-24439: "punctuation.definition.tag.xml.plist" - Data: "<" - 24439-24442: "entity.name.tag.xml.plist" - 24439-24442: "entity.name.tag.localname.xml.plist" - Data: "key" - 24442-24443: "punctuation.definition.tag.xml.plist" - Data: ">" - 24451-24457: "meta.tag.key.xml.plist" - 24451-24453: "punctuation.definition.tag.xml.plist" - Data: "" - 24463-25107: "" - 24463-24469: "meta.tag.dict.xml.plist" - 24463-24464: "punctuation.definition.tag.xml.plist" - Data: "<" - 24464-24468: "entity.name.tag.xml.plist" - 24464-24468: "entity.name.tag.localname.xml.plist" - Data: "dict" - 24468-24469: "punctuation.definition.tag.xml.plist" - Data: ">" - 24476-24488: "" - 24476-24481: "meta.tag.key.xml.plist" - 24476-24477: "punctuation.definition.tag.xml.plist" - Data: "<" - 24477-24480: "entity.name.tag.xml.plist" - 24477-24480: "entity.name.tag.localname.xml.plist" - Data: "key" - 24480-24481: "punctuation.definition.tag.xml.plist" - Data: ">" - 24482-24488: "meta.tag.key.xml.plist" - 24482-24484: "punctuation.definition.tag.xml.plist" - Data: "" - 24495-24586: "" - 24495-24501: "meta.tag.dict.xml.plist" - 24495-24496: "punctuation.definition.tag.xml.plist" - Data: "<" - 24496-24500: "entity.name.tag.xml.plist" - 24496-24500: "entity.name.tag.localname.xml.plist" - Data: "dict" - 24500-24501: "punctuation.definition.tag.xml.plist" - Data: ">" - 24509-24524: "" - 24509-24514: "meta.tag.key.xml.plist" - 24509-24510: "punctuation.definition.tag.xml.plist" - Data: "<" - 24510-24513: "entity.name.tag.xml.plist" - 24510-24513: "entity.name.tag.localname.xml.plist" - Data: "key" - 24513-24514: "punctuation.definition.tag.xml.plist" - Data: ">" - 24518-24524: "meta.tag.key.xml.plist" - 24518-24520: "punctuation.definition.tag.xml.plist" - Data: "" - 24532-24572: "" - 24532-24540: "meta.tag.string.xml.plist" - 24532-24533: "punctuation.definition.tag.xml.plist" - Data: "<" - 24533-24539: "entity.name.tag.xml.plist" - 24533-24539: "entity.name.tag.localname.xml.plist" - Data: "string" - 24539-24540: "punctuation.definition.tag.xml.plist" - Data: ">" - 24563-24572: "meta.tag.string.xml.plist" - 24563-24565: "punctuation.definition.tag.xml.plist" - Data: "" - 24579-24586: "meta.tag.dict.xml.plist" - 24579-24581: "punctuation.definition.tag.xml.plist" - Data: "" - 24593-24605: "" - 24593-24598: "meta.tag.key.xml.plist" - 24593-24594: "punctuation.definition.tag.xml.plist" - Data: "<" - 24594-24597: "entity.name.tag.xml.plist" - 24594-24597: "entity.name.tag.localname.xml.plist" - Data: "key" - 24597-24598: "punctuation.definition.tag.xml.plist" - Data: ">" - 24599-24605: "meta.tag.key.xml.plist" - 24599-24601: "punctuation.definition.tag.xml.plist" - Data: "" - 24612-24716: "" - 24612-24618: "meta.tag.dict.xml.plist" - 24612-24613: "punctuation.definition.tag.xml.plist" - Data: "<" - 24613-24617: "entity.name.tag.xml.plist" - 24613-24617: "entity.name.tag.localname.xml.plist" - Data: "dict" - 24617-24618: "punctuation.definition.tag.xml.plist" - Data: ">" - 24626-24641: "" - 24626-24631: "meta.tag.key.xml.plist" - 24626-24627: "punctuation.definition.tag.xml.plist" - Data: "<" - 24627-24630: "entity.name.tag.xml.plist" - 24627-24630: "entity.name.tag.localname.xml.plist" - Data: "key" - 24630-24631: "punctuation.definition.tag.xml.plist" - Data: ">" - 24635-24641: "meta.tag.key.xml.plist" - 24635-24637: "punctuation.definition.tag.xml.plist" - Data: "" - 24649-24702: "" - 24649-24657: "meta.tag.string.xml.plist" - 24649-24650: "punctuation.definition.tag.xml.plist" - Data: "<" - 24650-24656: "entity.name.tag.xml.plist" - 24650-24656: "entity.name.tag.localname.xml.plist" - Data: "string" - 24656-24657: "punctuation.definition.tag.xml.plist" - Data: ">" - 24693-24702: "meta.tag.string.xml.plist" - 24693-24695: "punctuation.definition.tag.xml.plist" - Data: "" - 24709-24716: "meta.tag.dict.xml.plist" - 24709-24711: "punctuation.definition.tag.xml.plist" - Data: "" - 24723-24735: "" - 24723-24728: "meta.tag.key.xml.plist" - 24723-24724: "punctuation.definition.tag.xml.plist" - Data: "<" - 24724-24727: "entity.name.tag.xml.plist" - 24724-24727: "entity.name.tag.localname.xml.plist" - Data: "key" - 24727-24728: "punctuation.definition.tag.xml.plist" - Data: ">" - 24729-24735: "meta.tag.key.xml.plist" - 24729-24731: "punctuation.definition.tag.xml.plist" - Data: "" - 24742-24835: "" - 24742-24748: "meta.tag.dict.xml.plist" - 24742-24743: "punctuation.definition.tag.xml.plist" - Data: "<" - 24743-24747: "entity.name.tag.xml.plist" - 24743-24747: "entity.name.tag.localname.xml.plist" - Data: "dict" - 24747-24748: "punctuation.definition.tag.xml.plist" - Data: ">" - 24756-24771: "" - 24756-24761: "meta.tag.key.xml.plist" - 24756-24757: "punctuation.definition.tag.xml.plist" - Data: "<" - 24757-24760: "entity.name.tag.xml.plist" - 24757-24760: "entity.name.tag.localname.xml.plist" - Data: "key" - 24760-24761: "punctuation.definition.tag.xml.plist" - Data: ">" - 24765-24771: "meta.tag.key.xml.plist" - 24765-24767: "punctuation.definition.tag.xml.plist" - Data: "" - 24779-24821: "" - 24779-24787: "meta.tag.string.xml.plist" - 24779-24780: "punctuation.definition.tag.xml.plist" - Data: "<" - 24780-24786: "entity.name.tag.xml.plist" - 24780-24786: "entity.name.tag.localname.xml.plist" - Data: "string" - 24786-24787: "punctuation.definition.tag.xml.plist" - Data: ">" - 24812-24821: "meta.tag.string.xml.plist" - 24812-24814: "punctuation.definition.tag.xml.plist" - Data: "" - 24828-24835: "meta.tag.dict.xml.plist" - 24828-24830: "punctuation.definition.tag.xml.plist" - Data: "" - 24842-24854: "" - 24842-24847: "meta.tag.key.xml.plist" - 24842-24843: "punctuation.definition.tag.xml.plist" - Data: "<" - 24843-24846: "entity.name.tag.xml.plist" - 24843-24846: "entity.name.tag.localname.xml.plist" - Data: "key" - 24846-24847: "punctuation.definition.tag.xml.plist" - Data: ">" - 24848-24854: "meta.tag.key.xml.plist" - 24848-24850: "punctuation.definition.tag.xml.plist" - Data: "" - 24861-24964: "" - 24861-24867: "meta.tag.dict.xml.plist" - 24861-24862: "punctuation.definition.tag.xml.plist" - Data: "<" - 24862-24866: "entity.name.tag.xml.plist" - 24862-24866: "entity.name.tag.localname.xml.plist" - Data: "dict" - 24866-24867: "punctuation.definition.tag.xml.plist" - Data: ">" - 24875-24890: "" - 24875-24880: "meta.tag.key.xml.plist" - 24875-24876: "punctuation.definition.tag.xml.plist" - Data: "<" - 24876-24879: "entity.name.tag.xml.plist" - 24876-24879: "entity.name.tag.localname.xml.plist" - Data: "key" - 24879-24880: "punctuation.definition.tag.xml.plist" - Data: ">" - 24884-24890: "meta.tag.key.xml.plist" - 24884-24886: "punctuation.definition.tag.xml.plist" - Data: "" - 24898-24950: "" - 24898-24906: "meta.tag.string.xml.plist" - 24898-24899: "punctuation.definition.tag.xml.plist" - Data: "<" - 24899-24905: "entity.name.tag.xml.plist" - 24899-24905: "entity.name.tag.localname.xml.plist" - Data: "string" - 24905-24906: "punctuation.definition.tag.xml.plist" - Data: ">" - 24941-24950: "meta.tag.string.xml.plist" - 24941-24943: "punctuation.definition.tag.xml.plist" - Data: "" - 24957-24964: "meta.tag.dict.xml.plist" - 24957-24959: "punctuation.definition.tag.xml.plist" - Data: "" - 24971-24983: "" - 24971-24976: "meta.tag.key.xml.plist" - 24971-24972: "punctuation.definition.tag.xml.plist" - Data: "<" - 24972-24975: "entity.name.tag.xml.plist" - 24972-24975: "entity.name.tag.localname.xml.plist" - Data: "key" - 24975-24976: "punctuation.definition.tag.xml.plist" - Data: ">" - 24977-24983: "meta.tag.key.xml.plist" - 24977-24979: "punctuation.definition.tag.xml.plist" - Data: "" - 24990-25094: "" - 24990-24996: "meta.tag.dict.xml.plist" - 24990-24991: "punctuation.definition.tag.xml.plist" - Data: "<" - 24991-24995: "entity.name.tag.xml.plist" - 24991-24995: "entity.name.tag.localname.xml.plist" - Data: "dict" - 24995-24996: "punctuation.definition.tag.xml.plist" - Data: ">" - 25004-25019: "" - 25004-25009: "meta.tag.key.xml.plist" - 25004-25005: "punctuation.definition.tag.xml.plist" - Data: "<" - 25005-25008: "entity.name.tag.xml.plist" - 25005-25008: "entity.name.tag.localname.xml.plist" - Data: "key" - 25008-25009: "punctuation.definition.tag.xml.plist" - Data: ">" - 25013-25019: "meta.tag.key.xml.plist" - 25013-25015: "punctuation.definition.tag.xml.plist" - Data: "" - 25027-25080: "" - 25027-25035: "meta.tag.string.xml.plist" - 25027-25028: "punctuation.definition.tag.xml.plist" - Data: "<" - 25028-25034: "entity.name.tag.xml.plist" - 25028-25034: "entity.name.tag.localname.xml.plist" - Data: "string" - 25034-25035: "punctuation.definition.tag.xml.plist" - Data: ">" - 25071-25080: "meta.tag.string.xml.plist" - 25071-25073: "punctuation.definition.tag.xml.plist" - Data: "" - 25087-25094: "meta.tag.dict.xml.plist" - 25087-25089: "punctuation.definition.tag.xml.plist" - Data: "" - 25100-25107: "meta.tag.dict.xml.plist" - 25100-25102: "punctuation.definition.tag.xml.plist" - Data: "" - 25113-25131: "" - 25113-25118: "meta.tag.key.xml.plist" - 25113-25114: "punctuation.definition.tag.xml.plist" - Data: "<" - 25114-25117: "entity.name.tag.xml.plist" - 25114-25117: "entity.name.tag.localname.xml.plist" - Data: "key" - 25117-25118: "punctuation.definition.tag.xml.plist" - Data: ">" - 25125-25131: "meta.tag.key.xml.plist" - 25125-25127: "punctuation.definition.tag.xml.plist" - Data: "" - 25137-25158: "" - 25137-25145: "meta.tag.string.xml.plist" - 25137-25138: "punctuation.definition.tag.xml.plist" - Data: "<" - 25138-25144: "entity.name.tag.xml.plist" - 25138-25144: "entity.name.tag.localname.xml.plist" - Data: "string" - 25144-25145: "punctuation.definition.tag.xml.plist" - Data: ">" - 25149-25158: "meta.tag.string.xml.plist" - 25149-25151: "punctuation.definition.tag.xml.plist" - Data: "" - 25164-25178: "" - 25164-25169: "meta.tag.key.xml.plist" - 25164-25165: "punctuation.definition.tag.xml.plist" - Data: "<" - 25165-25168: "entity.name.tag.xml.plist" - 25165-25168: "entity.name.tag.localname.xml.plist" - Data: "key" - 25168-25169: "punctuation.definition.tag.xml.plist" - Data: ">" - 25172-25178: "meta.tag.key.xml.plist" - 25172-25174: "punctuation.definition.tag.xml.plist" - Data: "" - 25184-25224: "" - 25184-25192: "meta.tag.string.xml.plist" - 25184-25185: "punctuation.definition.tag.xml.plist" - Data: "<" - 25185-25191: "entity.name.tag.xml.plist" - 25185-25191: "entity.name.tag.localname.xml.plist" - Data: "string" - 25191-25192: "punctuation.definition.tag.xml.plist" - Data: ">" - 25215-25224: "meta.tag.string.xml.plist" - 25215-25217: "punctuation.definition.tag.xml.plist" - Data: "" - 25230-25249: "" - 25230-25235: "meta.tag.key.xml.plist" - 25230-25231: "punctuation.definition.tag.xml.plist" - Data: "<" - 25231-25234: "entity.name.tag.xml.plist" - 25231-25234: "entity.name.tag.localname.xml.plist" - Data: "key" - 25234-25235: "punctuation.definition.tag.xml.plist" - Data: ">" - 25243-25249: "meta.tag.key.xml.plist" - 25243-25245: "punctuation.definition.tag.xml.plist" - Data: "" - 25255-25779: "" - 25255-25262: "meta.tag.array.xml.plist" - 25255-25256: "punctuation.definition.tag.xml.plist" - Data: "<" - 25256-25261: "entity.name.tag.xml.plist" - 25256-25261: "entity.name.tag.localname.xml.plist" - Data: "array" - 25261-25262: "punctuation.definition.tag.xml.plist" - Data: ">" - 25269-25432: "" - 25269-25275: "meta.tag.dict.xml.plist" - 25269-25270: "punctuation.definition.tag.xml.plist" - Data: "<" - 25270-25274: "entity.name.tag.xml.plist" - 25270-25274: "entity.name.tag.localname.xml.plist" - Data: "dict" - 25274-25275: "punctuation.definition.tag.xml.plist" - Data: ">" - 25283-25299: "" - 25283-25288: "meta.tag.key.xml.plist" - 25283-25284: "punctuation.definition.tag.xml.plist" - Data: "<" - 25284-25287: "entity.name.tag.xml.plist" - 25284-25287: "entity.name.tag.localname.xml.plist" - Data: "key" - 25287-25288: "punctuation.definition.tag.xml.plist" - Data: ">" - 25293-25299: "meta.tag.key.xml.plist" - 25293-25295: "punctuation.definition.tag.xml.plist" - Data: "" - 25307-25337: "" - 25307-25315: "meta.tag.string.xml.plist" - 25307-25308: "punctuation.definition.tag.xml.plist" - Data: "<" - 25308-25314: "entity.name.tag.xml.plist" - 25308-25314: "entity.name.tag.localname.xml.plist" - Data: "string" - 25314-25315: "punctuation.definition.tag.xml.plist" - Data: ">" - 25328-25337: "meta.tag.string.xml.plist" - 25328-25330: "punctuation.definition.tag.xml.plist" - Data: "" - 25345-25360: "" - 25345-25350: "meta.tag.key.xml.plist" - 25345-25346: "punctuation.definition.tag.xml.plist" - Data: "<" - 25346-25349: "entity.name.tag.xml.plist" - 25346-25349: "entity.name.tag.localname.xml.plist" - Data: "key" - 25349-25350: "punctuation.definition.tag.xml.plist" - Data: ">" - 25354-25360: "meta.tag.key.xml.plist" - 25354-25356: "punctuation.definition.tag.xml.plist" - Data: "" - 25368-25418: "" - 25368-25376: "meta.tag.string.xml.plist" - 25368-25369: "punctuation.definition.tag.xml.plist" - Data: "<" - 25369-25375: "entity.name.tag.xml.plist" - 25369-25375: "entity.name.tag.localname.xml.plist" - Data: "string" - 25375-25376: "punctuation.definition.tag.xml.plist" - Data: ">" - 25409-25418: "meta.tag.string.xml.plist" - 25409-25411: "punctuation.definition.tag.xml.plist" - Data: "" - 25425-25432: "meta.tag.dict.xml.plist" - 25425-25427: "punctuation.definition.tag.xml.plist" - Data: "" - 25439-25590: "" - 25439-25445: "meta.tag.dict.xml.plist" - 25439-25440: "punctuation.definition.tag.xml.plist" - Data: "<" - 25440-25444: "entity.name.tag.xml.plist" - 25440-25444: "entity.name.tag.localname.xml.plist" - Data: "dict" - 25444-25445: "punctuation.definition.tag.xml.plist" - Data: ">" - 25453-25469: "" - 25453-25458: "meta.tag.key.xml.plist" - 25453-25454: "punctuation.definition.tag.xml.plist" - Data: "<" - 25454-25457: "entity.name.tag.xml.plist" - 25454-25457: "entity.name.tag.localname.xml.plist" - Data: "key" - 25457-25458: "punctuation.definition.tag.xml.plist" - Data: ">" - 25463-25469: "meta.tag.key.xml.plist" - 25463-25465: "punctuation.definition.tag.xml.plist" - Data: "" - 25477-25495: "" - 25477-25485: "meta.tag.string.xml.plist" - 25477-25478: "punctuation.definition.tag.xml.plist" - Data: "<" - 25478-25484: "entity.name.tag.xml.plist" - 25478-25484: "entity.name.tag.localname.xml.plist" - Data: "string" - 25484-25485: "punctuation.definition.tag.xml.plist" - Data: ">" - 25486-25495: "meta.tag.string.xml.plist" - 25486-25488: "punctuation.definition.tag.xml.plist" - Data: "" - 25503-25518: "" - 25503-25508: "meta.tag.key.xml.plist" - 25503-25504: "punctuation.definition.tag.xml.plist" - Data: "<" - 25504-25507: "entity.name.tag.xml.plist" - 25504-25507: "entity.name.tag.localname.xml.plist" - Data: "key" - 25507-25508: "punctuation.definition.tag.xml.plist" - Data: ">" - 25512-25518: "meta.tag.key.xml.plist" - 25512-25514: "punctuation.definition.tag.xml.plist" - Data: "" - 25526-25576: "" - 25526-25534: "meta.tag.string.xml.plist" - 25526-25527: "punctuation.definition.tag.xml.plist" - Data: "<" - 25527-25533: "entity.name.tag.xml.plist" - 25527-25533: "entity.name.tag.localname.xml.plist" - Data: "string" - 25533-25534: "punctuation.definition.tag.xml.plist" - Data: ">" - 25567-25576: "meta.tag.string.xml.plist" - 25567-25569: "punctuation.definition.tag.xml.plist" - Data: "" - 25583-25590: "meta.tag.dict.xml.plist" - 25583-25585: "punctuation.definition.tag.xml.plist" - Data: "" - 25597-25765: "" - 25597-25603: "meta.tag.dict.xml.plist" - 25597-25598: "punctuation.definition.tag.xml.plist" - Data: "<" - 25598-25602: "entity.name.tag.xml.plist" - 25598-25602: "entity.name.tag.localname.xml.plist" - Data: "dict" - 25602-25603: "punctuation.definition.tag.xml.plist" - Data: ">" - 25611-25627: "" - 25611-25616: "meta.tag.key.xml.plist" - 25611-25612: "punctuation.definition.tag.xml.plist" - Data: "<" - 25612-25615: "entity.name.tag.xml.plist" - 25612-25615: "entity.name.tag.localname.xml.plist" - Data: "key" - 25615-25616: "punctuation.definition.tag.xml.plist" - Data: ">" - 25621-25627: "meta.tag.key.xml.plist" - 25621-25623: "punctuation.definition.tag.xml.plist" - Data: "" - 25635-25660: "" - 25635-25643: "meta.tag.string.xml.plist" - 25635-25636: "punctuation.definition.tag.xml.plist" - Data: "<" - 25636-25642: "entity.name.tag.xml.plist" - 25636-25642: "entity.name.tag.localname.xml.plist" - Data: "string" - 25642-25643: "punctuation.definition.tag.xml.plist" - Data: ">" - 25651-25660: "meta.tag.string.xml.plist" - 25651-25653: "punctuation.definition.tag.xml.plist" - Data: "" - 25668-25683: "" - 25668-25673: "meta.tag.key.xml.plist" - 25668-25669: "punctuation.definition.tag.xml.plist" - Data: "<" - 25669-25672: "entity.name.tag.xml.plist" - 25669-25672: "entity.name.tag.localname.xml.plist" - Data: "key" - 25672-25673: "punctuation.definition.tag.xml.plist" - Data: ">" - 25677-25683: "meta.tag.key.xml.plist" - 25677-25679: "punctuation.definition.tag.xml.plist" - Data: "" - 25691-25751: "" - 25691-25699: "meta.tag.string.xml.plist" - 25691-25692: "punctuation.definition.tag.xml.plist" - Data: "<" - 25692-25698: "entity.name.tag.xml.plist" - 25692-25698: "entity.name.tag.localname.xml.plist" - Data: "string" - 25698-25699: "punctuation.definition.tag.xml.plist" - Data: ">" - 25742-25751: "meta.tag.string.xml.plist" - 25742-25744: "punctuation.definition.tag.xml.plist" - Data: "" - 25758-25765: "meta.tag.dict.xml.plist" - 25758-25760: "punctuation.definition.tag.xml.plist" - Data: "" - 25771-25779: "meta.tag.array.xml.plist" - 25771-25773: "punctuation.definition.tag.xml.plist" - Data: "" - 25784-25791: "meta.tag.dict.xml.plist" - 25784-25786: "punctuation.definition.tag.xml.plist" - Data: "" - 25796-27293: "" - 25796-25802: "meta.tag.dict.xml.plist" - 25796-25797: "punctuation.definition.tag.xml.plist" - Data: "<" - 25797-25801: "entity.name.tag.xml.plist" - 25797-25801: "entity.name.tag.localname.xml.plist" - Data: "dict" - 25801-25802: "punctuation.definition.tag.xml.plist" - Data: ">" - 25808-25824: "" - 25808-25813: "meta.tag.key.xml.plist" - 25808-25809: "punctuation.definition.tag.xml.plist" - Data: "<" - 25809-25812: "entity.name.tag.xml.plist" - 25809-25812: "entity.name.tag.localname.xml.plist" - Data: "key" - 25812-25813: "punctuation.definition.tag.xml.plist" - Data: ">" - 25818-25824: "meta.tag.key.xml.plist" - 25818-25820: "punctuation.definition.tag.xml.plist" - Data: "" - 25830-25869: "" - 25830-25838: "meta.tag.string.xml.plist" - 25830-25831: "punctuation.definition.tag.xml.plist" - Data: "<" - 25831-25837: "entity.name.tag.xml.plist" - 25831-25837: "entity.name.tag.localname.xml.plist" - Data: "string" - 25837-25838: "punctuation.definition.tag.xml.plist" - Data: ">" - 25860-25869: "meta.tag.string.xml.plist" - 25860-25862: "punctuation.definition.tag.xml.plist" - Data: "" - 25875-25894: "" - 25875-25880: "meta.tag.key.xml.plist" - 25875-25876: "punctuation.definition.tag.xml.plist" - Data: "<" - 25876-25879: "entity.name.tag.xml.plist" - 25876-25879: "entity.name.tag.localname.xml.plist" - Data: "key" - 25879-25880: "punctuation.definition.tag.xml.plist" - Data: ">" - 25888-25894: "meta.tag.key.xml.plist" - 25888-25890: "punctuation.definition.tag.xml.plist" - Data: "" - 25900-26544: "" - 25900-25906: "meta.tag.dict.xml.plist" - 25900-25901: "punctuation.definition.tag.xml.plist" - Data: "<" - 25901-25905: "entity.name.tag.xml.plist" - 25901-25905: "entity.name.tag.localname.xml.plist" - Data: "dict" - 25905-25906: "punctuation.definition.tag.xml.plist" - Data: ">" - 25913-25925: "" - 25913-25918: "meta.tag.key.xml.plist" - 25913-25914: "punctuation.definition.tag.xml.plist" - Data: "<" - 25914-25917: "entity.name.tag.xml.plist" - 25914-25917: "entity.name.tag.localname.xml.plist" - Data: "key" - 25917-25918: "punctuation.definition.tag.xml.plist" - Data: ">" - 25919-25925: "meta.tag.key.xml.plist" - 25919-25921: "punctuation.definition.tag.xml.plist" - Data: "" - 25932-26023: "" - 25932-25938: "meta.tag.dict.xml.plist" - 25932-25933: "punctuation.definition.tag.xml.plist" - Data: "<" - 25933-25937: "entity.name.tag.xml.plist" - 25933-25937: "entity.name.tag.localname.xml.plist" - Data: "dict" - 25937-25938: "punctuation.definition.tag.xml.plist" - Data: ">" - 25946-25961: "" - 25946-25951: "meta.tag.key.xml.plist" - 25946-25947: "punctuation.definition.tag.xml.plist" - Data: "<" - 25947-25950: "entity.name.tag.xml.plist" - 25947-25950: "entity.name.tag.localname.xml.plist" - Data: "key" - 25950-25951: "punctuation.definition.tag.xml.plist" - Data: ">" - 25955-25961: "meta.tag.key.xml.plist" - 25955-25957: "punctuation.definition.tag.xml.plist" - Data: "" - 25969-26009: "" - 25969-25977: "meta.tag.string.xml.plist" - 25969-25970: "punctuation.definition.tag.xml.plist" - Data: "<" - 25970-25976: "entity.name.tag.xml.plist" - 25970-25976: "entity.name.tag.localname.xml.plist" - Data: "string" - 25976-25977: "punctuation.definition.tag.xml.plist" - Data: ">" - 26000-26009: "meta.tag.string.xml.plist" - 26000-26002: "punctuation.definition.tag.xml.plist" - Data: "" - 26016-26023: "meta.tag.dict.xml.plist" - 26016-26018: "punctuation.definition.tag.xml.plist" - Data: "" - 26030-26042: "" - 26030-26035: "meta.tag.key.xml.plist" - 26030-26031: "punctuation.definition.tag.xml.plist" - Data: "<" - 26031-26034: "entity.name.tag.xml.plist" - 26031-26034: "entity.name.tag.localname.xml.plist" - Data: "key" - 26034-26035: "punctuation.definition.tag.xml.plist" - Data: ">" - 26036-26042: "meta.tag.key.xml.plist" - 26036-26038: "punctuation.definition.tag.xml.plist" - Data: "" - 26049-26153: "" - 26049-26055: "meta.tag.dict.xml.plist" - 26049-26050: "punctuation.definition.tag.xml.plist" - Data: "<" - 26050-26054: "entity.name.tag.xml.plist" - 26050-26054: "entity.name.tag.localname.xml.plist" - Data: "dict" - 26054-26055: "punctuation.definition.tag.xml.plist" - Data: ">" - 26063-26078: "" - 26063-26068: "meta.tag.key.xml.plist" - 26063-26064: "punctuation.definition.tag.xml.plist" - Data: "<" - 26064-26067: "entity.name.tag.xml.plist" - 26064-26067: "entity.name.tag.localname.xml.plist" - Data: "key" - 26067-26068: "punctuation.definition.tag.xml.plist" - Data: ">" - 26072-26078: "meta.tag.key.xml.plist" - 26072-26074: "punctuation.definition.tag.xml.plist" - Data: "" - 26086-26139: "" - 26086-26094: "meta.tag.string.xml.plist" - 26086-26087: "punctuation.definition.tag.xml.plist" - Data: "<" - 26087-26093: "entity.name.tag.xml.plist" - 26087-26093: "entity.name.tag.localname.xml.plist" - Data: "string" - 26093-26094: "punctuation.definition.tag.xml.plist" - Data: ">" - 26130-26139: "meta.tag.string.xml.plist" - 26130-26132: "punctuation.definition.tag.xml.plist" - Data: "" - 26146-26153: "meta.tag.dict.xml.plist" - 26146-26148: "punctuation.definition.tag.xml.plist" - Data: "" - 26160-26172: "" - 26160-26165: "meta.tag.key.xml.plist" - 26160-26161: "punctuation.definition.tag.xml.plist" - Data: "<" - 26161-26164: "entity.name.tag.xml.plist" - 26161-26164: "entity.name.tag.localname.xml.plist" - Data: "key" - 26164-26165: "punctuation.definition.tag.xml.plist" - Data: ">" - 26166-26172: "meta.tag.key.xml.plist" - 26166-26168: "punctuation.definition.tag.xml.plist" - Data: "" - 26179-26272: "" - 26179-26185: "meta.tag.dict.xml.plist" - 26179-26180: "punctuation.definition.tag.xml.plist" - Data: "<" - 26180-26184: "entity.name.tag.xml.plist" - 26180-26184: "entity.name.tag.localname.xml.plist" - Data: "dict" - 26184-26185: "punctuation.definition.tag.xml.plist" - Data: ">" - 26193-26208: "" - 26193-26198: "meta.tag.key.xml.plist" - 26193-26194: "punctuation.definition.tag.xml.plist" - Data: "<" - 26194-26197: "entity.name.tag.xml.plist" - 26194-26197: "entity.name.tag.localname.xml.plist" - Data: "key" - 26197-26198: "punctuation.definition.tag.xml.plist" - Data: ">" - 26202-26208: "meta.tag.key.xml.plist" - 26202-26204: "punctuation.definition.tag.xml.plist" - Data: "" - 26216-26258: "" - 26216-26224: "meta.tag.string.xml.plist" - 26216-26217: "punctuation.definition.tag.xml.plist" - Data: "<" - 26217-26223: "entity.name.tag.xml.plist" - 26217-26223: "entity.name.tag.localname.xml.plist" - Data: "string" - 26223-26224: "punctuation.definition.tag.xml.plist" - Data: ">" - 26249-26258: "meta.tag.string.xml.plist" - 26249-26251: "punctuation.definition.tag.xml.plist" - Data: "" - 26265-26272: "meta.tag.dict.xml.plist" - 26265-26267: "punctuation.definition.tag.xml.plist" - Data: "" - 26279-26291: "" - 26279-26284: "meta.tag.key.xml.plist" - 26279-26280: "punctuation.definition.tag.xml.plist" - Data: "<" - 26280-26283: "entity.name.tag.xml.plist" - 26280-26283: "entity.name.tag.localname.xml.plist" - Data: "key" - 26283-26284: "punctuation.definition.tag.xml.plist" - Data: ">" - 26285-26291: "meta.tag.key.xml.plist" - 26285-26287: "punctuation.definition.tag.xml.plist" - Data: "" - 26298-26401: "" - 26298-26304: "meta.tag.dict.xml.plist" - 26298-26299: "punctuation.definition.tag.xml.plist" - Data: "<" - 26299-26303: "entity.name.tag.xml.plist" - 26299-26303: "entity.name.tag.localname.xml.plist" - Data: "dict" - 26303-26304: "punctuation.definition.tag.xml.plist" - Data: ">" - 26312-26327: "" - 26312-26317: "meta.tag.key.xml.plist" - 26312-26313: "punctuation.definition.tag.xml.plist" - Data: "<" - 26313-26316: "entity.name.tag.xml.plist" - 26313-26316: "entity.name.tag.localname.xml.plist" - Data: "key" - 26316-26317: "punctuation.definition.tag.xml.plist" - Data: ">" - 26321-26327: "meta.tag.key.xml.plist" - 26321-26323: "punctuation.definition.tag.xml.plist" - Data: "" - 26335-26387: "" - 26335-26343: "meta.tag.string.xml.plist" - 26335-26336: "punctuation.definition.tag.xml.plist" - Data: "<" - 26336-26342: "entity.name.tag.xml.plist" - 26336-26342: "entity.name.tag.localname.xml.plist" - Data: "string" - 26342-26343: "punctuation.definition.tag.xml.plist" - Data: ">" - 26378-26387: "meta.tag.string.xml.plist" - 26378-26380: "punctuation.definition.tag.xml.plist" - Data: "" - 26394-26401: "meta.tag.dict.xml.plist" - 26394-26396: "punctuation.definition.tag.xml.plist" - Data: "" - 26408-26420: "" - 26408-26413: "meta.tag.key.xml.plist" - 26408-26409: "punctuation.definition.tag.xml.plist" - Data: "<" - 26409-26412: "entity.name.tag.xml.plist" - 26409-26412: "entity.name.tag.localname.xml.plist" - Data: "key" - 26412-26413: "punctuation.definition.tag.xml.plist" - Data: ">" - 26414-26420: "meta.tag.key.xml.plist" - 26414-26416: "punctuation.definition.tag.xml.plist" - Data: "" - 26427-26531: "" - 26427-26433: "meta.tag.dict.xml.plist" - 26427-26428: "punctuation.definition.tag.xml.plist" - Data: "<" - 26428-26432: "entity.name.tag.xml.plist" - 26428-26432: "entity.name.tag.localname.xml.plist" - Data: "dict" - 26432-26433: "punctuation.definition.tag.xml.plist" - Data: ">" - 26441-26456: "" - 26441-26446: "meta.tag.key.xml.plist" - 26441-26442: "punctuation.definition.tag.xml.plist" - Data: "<" - 26442-26445: "entity.name.tag.xml.plist" - 26442-26445: "entity.name.tag.localname.xml.plist" - Data: "key" - 26445-26446: "punctuation.definition.tag.xml.plist" - Data: ">" - 26450-26456: "meta.tag.key.xml.plist" - 26450-26452: "punctuation.definition.tag.xml.plist" - Data: "" - 26464-26517: "" - 26464-26472: "meta.tag.string.xml.plist" - 26464-26465: "punctuation.definition.tag.xml.plist" - Data: "<" - 26465-26471: "entity.name.tag.xml.plist" - 26465-26471: "entity.name.tag.localname.xml.plist" - Data: "string" - 26471-26472: "punctuation.definition.tag.xml.plist" - Data: ">" - 26508-26517: "meta.tag.string.xml.plist" - 26508-26510: "punctuation.definition.tag.xml.plist" - Data: "" - 26524-26531: "meta.tag.dict.xml.plist" - 26524-26526: "punctuation.definition.tag.xml.plist" - Data: "" - 26537-26544: "meta.tag.dict.xml.plist" - 26537-26539: "punctuation.definition.tag.xml.plist" - Data: "" - 26550-26568: "" - 26550-26555: "meta.tag.key.xml.plist" - 26550-26551: "punctuation.definition.tag.xml.plist" - Data: "<" - 26551-26554: "entity.name.tag.xml.plist" - 26551-26554: "entity.name.tag.localname.xml.plist" - Data: "key" - 26554-26555: "punctuation.definition.tag.xml.plist" - Data: ">" - 26562-26568: "meta.tag.key.xml.plist" - 26562-26564: "punctuation.definition.tag.xml.plist" - Data: "" - 26574-26595: "" - 26574-26582: "meta.tag.string.xml.plist" - 26574-26575: "punctuation.definition.tag.xml.plist" - Data: "<" - 26575-26581: "entity.name.tag.xml.plist" - 26575-26581: "entity.name.tag.localname.xml.plist" - Data: "string" - 26581-26582: "punctuation.definition.tag.xml.plist" - Data: ">" - 26586-26595: "meta.tag.string.xml.plist" - 26586-26588: "punctuation.definition.tag.xml.plist" - Data: "" - 26601-26615: "" - 26601-26606: "meta.tag.key.xml.plist" - 26601-26602: "punctuation.definition.tag.xml.plist" - Data: "<" - 26602-26605: "entity.name.tag.xml.plist" - 26602-26605: "entity.name.tag.localname.xml.plist" - Data: "key" - 26605-26606: "punctuation.definition.tag.xml.plist" - Data: ">" - 26609-26615: "meta.tag.key.xml.plist" - 26609-26611: "punctuation.definition.tag.xml.plist" - Data: "" - 26621-26661: "" - 26621-26629: "meta.tag.string.xml.plist" - 26621-26622: "punctuation.definition.tag.xml.plist" - Data: "<" - 26622-26628: "entity.name.tag.xml.plist" - 26622-26628: "entity.name.tag.localname.xml.plist" - Data: "string" - 26628-26629: "punctuation.definition.tag.xml.plist" - Data: ">" - 26652-26661: "meta.tag.string.xml.plist" - 26652-26654: "punctuation.definition.tag.xml.plist" - Data: "" - 26667-26686: "" - 26667-26672: "meta.tag.key.xml.plist" - 26667-26668: "punctuation.definition.tag.xml.plist" - Data: "<" - 26668-26671: "entity.name.tag.xml.plist" - 26668-26671: "entity.name.tag.localname.xml.plist" - Data: "key" - 26671-26672: "punctuation.definition.tag.xml.plist" - Data: ">" - 26680-26686: "meta.tag.key.xml.plist" - 26680-26682: "punctuation.definition.tag.xml.plist" - Data: "" - 26692-27281: "" - 26692-26699: "meta.tag.array.xml.plist" - 26692-26693: "punctuation.definition.tag.xml.plist" - Data: "<" - 26693-26698: "entity.name.tag.xml.plist" - 26693-26698: "entity.name.tag.localname.xml.plist" - Data: "array" - 26698-26699: "punctuation.definition.tag.xml.plist" - Data: ">" - 26706-27267: "" - 26706-26712: "meta.tag.dict.xml.plist" - 26706-26707: "punctuation.definition.tag.xml.plist" - Data: "<" - 26707-26711: "entity.name.tag.xml.plist" - 26707-26711: "entity.name.tag.localname.xml.plist" - Data: "dict" - 26711-26712: "punctuation.definition.tag.xml.plist" - Data: ">" - 26720-26736: "" - 26720-26725: "meta.tag.key.xml.plist" - 26720-26721: "punctuation.definition.tag.xml.plist" - Data: "<" - 26721-26724: "entity.name.tag.xml.plist" - 26721-26724: "entity.name.tag.localname.xml.plist" - Data: "key" - 26724-26725: "punctuation.definition.tag.xml.plist" - Data: ">" - 26730-26736: "meta.tag.key.xml.plist" - 26730-26732: "punctuation.definition.tag.xml.plist" - Data: "" - 26744-27176: "" - 26744-26752: "meta.tag.string.xml.plist" - 26744-26745: "punctuation.definition.tag.xml.plist" - Data: "<" - 26745-26751: "entity.name.tag.xml.plist" - 26745-26751: "entity.name.tag.localname.xml.plist" - Data: "string" - 26751-26752: "punctuation.definition.tag.xml.plist" - Data: ">" - 27167-27176: "meta.tag.string.xml.plist" - 27167-27169: "punctuation.definition.tag.xml.plist" - Data: "" - 27184-27199: "" - 27184-27189: "meta.tag.key.xml.plist" - 27184-27185: "punctuation.definition.tag.xml.plist" - Data: "<" - 27185-27188: "entity.name.tag.xml.plist" - 27185-27188: "entity.name.tag.localname.xml.plist" - Data: "key" - 27188-27189: "punctuation.definition.tag.xml.plist" - Data: ">" - 27193-27199: "meta.tag.key.xml.plist" - 27193-27195: "punctuation.definition.tag.xml.plist" - Data: "" - 27207-27253: "" - 27207-27215: "meta.tag.string.xml.plist" - 27207-27208: "punctuation.definition.tag.xml.plist" - Data: "<" - 27208-27214: "entity.name.tag.xml.plist" - 27208-27214: "entity.name.tag.localname.xml.plist" - Data: "string" - 27214-27215: "punctuation.definition.tag.xml.plist" - Data: ">" - 27244-27253: "meta.tag.string.xml.plist" - 27244-27246: "punctuation.definition.tag.xml.plist" - Data: "" - 27260-27267: "meta.tag.dict.xml.plist" - 27260-27262: "punctuation.definition.tag.xml.plist" - Data: "" - 27273-27281: "meta.tag.array.xml.plist" - 27273-27275: "punctuation.definition.tag.xml.plist" - Data: "" - 27286-27293: "meta.tag.dict.xml.plist" - 27286-27288: "punctuation.definition.tag.xml.plist" - Data: "" - 27298-27375: "" - 27298-27304: "meta.tag.dict.xml.plist" - 27298-27299: "punctuation.definition.tag.xml.plist" - Data: "<" - 27299-27303: "entity.name.tag.xml.plist" - 27299-27303: "entity.name.tag.localname.xml.plist" - Data: "dict" - 27303-27304: "punctuation.definition.tag.xml.plist" - Data: ">" - 27310-27328: "" - 27310-27315: "meta.tag.key.xml.plist" - 27310-27311: "punctuation.definition.tag.xml.plist" - Data: "<" - 27311-27314: "entity.name.tag.xml.plist" - 27311-27314: "entity.name.tag.localname.xml.plist" - Data: "key" - 27314-27315: "punctuation.definition.tag.xml.plist" - Data: ">" - 27322-27328: "meta.tag.key.xml.plist" - 27322-27324: "punctuation.definition.tag.xml.plist" - Data: "" - 27334-27363: "" - 27334-27342: "meta.tag.string.xml.plist" - 27334-27335: "punctuation.definition.tag.xml.plist" - Data: "<" - 27335-27341: "entity.name.tag.xml.plist" - 27335-27341: "entity.name.tag.localname.xml.plist" - Data: "string" - 27341-27342: "punctuation.definition.tag.xml.plist" - Data: ">" - 27354-27363: "meta.tag.string.xml.plist" - 27354-27356: "punctuation.definition.tag.xml.plist" - Data: "" - 27368-27375: "meta.tag.dict.xml.plist" - 27368-27370: "punctuation.definition.tag.xml.plist" - Data: "" - 27380-27457: "" - 27380-27386: "meta.tag.dict.xml.plist" - 27380-27381: "punctuation.definition.tag.xml.plist" - Data: "<" - 27381-27385: "entity.name.tag.xml.plist" - 27381-27385: "entity.name.tag.localname.xml.plist" - Data: "dict" - 27385-27386: "punctuation.definition.tag.xml.plist" - Data: ">" - 27392-27410: "" - 27392-27397: "meta.tag.key.xml.plist" - 27392-27393: "punctuation.definition.tag.xml.plist" - Data: "<" - 27393-27396: "entity.name.tag.xml.plist" - 27393-27396: "entity.name.tag.localname.xml.plist" - Data: "key" - 27396-27397: "punctuation.definition.tag.xml.plist" - Data: ">" - 27404-27410: "meta.tag.key.xml.plist" - 27404-27406: "punctuation.definition.tag.xml.plist" - Data: "" - 27416-27445: "" - 27416-27424: "meta.tag.string.xml.plist" - 27416-27417: "punctuation.definition.tag.xml.plist" - Data: "<" - 27417-27423: "entity.name.tag.xml.plist" - 27417-27423: "entity.name.tag.localname.xml.plist" - Data: "string" - 27423-27424: "punctuation.definition.tag.xml.plist" - Data: ">" - 27436-27445: "meta.tag.string.xml.plist" - 27436-27438: "punctuation.definition.tag.xml.plist" - Data: "" - 27450-27457: "meta.tag.dict.xml.plist" - 27450-27452: "punctuation.definition.tag.xml.plist" - Data: "" - 27462-27542: "" - 27462-27468: "meta.tag.dict.xml.plist" - 27462-27463: "punctuation.definition.tag.xml.plist" - Data: "<" - 27463-27467: "entity.name.tag.xml.plist" - 27463-27467: "entity.name.tag.localname.xml.plist" - Data: "dict" - 27467-27468: "punctuation.definition.tag.xml.plist" - Data: ">" - 27474-27492: "" - 27474-27479: "meta.tag.key.xml.plist" - 27474-27475: "punctuation.definition.tag.xml.plist" - Data: "<" - 27475-27478: "entity.name.tag.xml.plist" - 27475-27478: "entity.name.tag.localname.xml.plist" - Data: "key" - 27478-27479: "punctuation.definition.tag.xml.plist" - Data: ">" - 27486-27492: "meta.tag.key.xml.plist" - 27486-27488: "punctuation.definition.tag.xml.plist" - Data: "" - 27498-27530: "" - 27498-27506: "meta.tag.string.xml.plist" - 27498-27499: "punctuation.definition.tag.xml.plist" - Data: "<" - 27499-27505: "entity.name.tag.xml.plist" - 27499-27505: "entity.name.tag.localname.xml.plist" - Data: "string" - 27505-27506: "punctuation.definition.tag.xml.plist" - Data: ">" - 27521-27530: "meta.tag.string.xml.plist" - 27521-27523: "punctuation.definition.tag.xml.plist" - Data: "" - 27535-27542: "meta.tag.dict.xml.plist" - 27535-27537: "punctuation.definition.tag.xml.plist" - Data: "" - 27546-27554: "meta.tag.array.xml.plist" - 27546-27548: "punctuation.definition.tag.xml.plist" - Data: "" - 27557-27564: "meta.tag.dict.xml.plist" - 27557-27559: "punctuation.definition.tag.xml.plist" - Data: "" - 27566-27573: "meta.tag.dict.xml.plist" - 27566-27568: "punctuation.definition.tag.xml.plist" - Data: "" - 27575-27595: "" - 27575-27580: "meta.tag.key.xml.plist" - 27575-27576: "punctuation.definition.tag.xml.plist" - Data: "<" - 27576-27579: "entity.name.tag.xml.plist" - 27576-27579: "entity.name.tag.localname.xml.plist" - Data: "key" - 27579-27580: "punctuation.definition.tag.xml.plist" - Data: ">" - 27589-27595: "meta.tag.key.xml.plist" - 27589-27591: "punctuation.definition.tag.xml.plist" - Data: "" - 27597-27628: "" - 27597-27605: "meta.tag.string.xml.plist" - 27597-27598: "punctuation.definition.tag.xml.plist" - Data: "<" - 27598-27604: "entity.name.tag.xml.plist" - 27598-27604: "entity.name.tag.localname.xml.plist" - Data: "string" - 27604-27605: "punctuation.definition.tag.xml.plist" - Data: ">" - 27619-27628: "meta.tag.string.xml.plist" - 27619-27621: "punctuation.definition.tag.xml.plist" - Data: "" - 27630-27645: "" - 27630-27635: "meta.tag.key.xml.plist" - 27630-27631: "punctuation.definition.tag.xml.plist" - Data: "<" - 27631-27634: "entity.name.tag.xml.plist" - 27631-27634: "entity.name.tag.localname.xml.plist" - Data: "key" - 27634-27635: "punctuation.definition.tag.xml.plist" - Data: ">" - 27639-27645: "meta.tag.key.xml.plist" - 27639-27641: "punctuation.definition.tag.xml.plist" - Data: "" - 27647-27700: "" - 27647-27655: "meta.tag.string.xml.plist" - 27647-27648: "punctuation.definition.tag.xml.plist" - Data: "<" - 27648-27654: "entity.name.tag.xml.plist" - 27648-27654: "entity.name.tag.localname.xml.plist" - Data: "string" - 27654-27655: "punctuation.definition.tag.xml.plist" - Data: ">" - 27691-27700: "meta.tag.string.xml.plist" - 27691-27693: "punctuation.definition.tag.xml.plist" - Data: "" - 27701-27708: "meta.tag.dict.xml.plist" - 27701-27703: "punctuation.definition.tag.xml.plist" - Data: "" - 27709-27710: "meta.tag.plist.xml.plist" - 27709-27710: "punctuation.definition.tag.xml.plist" - Data: "<" - 27710-27717: "meta.tag.plist.xml.plist" - 27710-27711: "punctuation.definition.tag.xml.plist" - Data: "/" - 27711-27716: "entity.name.tag.xml.plist" - 27711-27716: "entity.name.tag.localname.xml.plist" - Data: "plist" - 27716-27717: "punctuation.definition.tag.xml.plist" - Data: ">" diff --git a/backend/textmate/testdata/plist2.tmlang b/backend/textmate/testdata/plist2.tmlang deleted file mode 100644 index cc245d6..0000000 --- a/backend/textmate/testdata/plist2.tmlang +++ /dev/null @@ -1,19 +0,0 @@ - - - - - fileTypes - - firstLineMatch - \s*<\?xml .*\n\s*<!DOCTYPE\s*(?i:plist)\s - name - Property List (XML) - patterns - - - include - #xml - - - - diff --git a/backend/textmate/testdata/plist2.tmlang.res b/backend/textmate/testdata/plist2.tmlang.res deleted file mode 100644 index 32d44a4..0000000 --- a/backend/textmate/testdata/plist2.tmlang.res +++ /dev/null @@ -1,166 +0,0 @@ -0-473: "text.xml.plist" - 0-38: "meta.tag.preprocessor.xml" - 0-2: "punctuation.definition.tag.xml" - Data: "" - 39-141: "meta.tag.sgml.doctype.xml" - 39-41: "punctuation.definition.tag.xml" - Data: "" - 142-473: "" - 142-148: "meta.tag.plist.xml.plist" - 142-143: "punctuation.definition.tag.xml.plist" - Data: "<" - 143-148: "entity.name.tag.xml.plist" - 143-148: "entity.name.tag.localname.xml.plist" - Data: "plist" - 148-162: "meta.tag.plist.xml.plist" - 149-156: "entity.other.attribute-name.version.xml.plist" - Data: "version" - 156-157: "punctuation.separator.key-value.xml.plist" - Data: "=" - 157-162: "string.quoted.double.xml.plist" - 157-158: "punctuation.definition.string.begin.xml.plist" - Data: """ - 161-162: "punctuation.definition.string.end.xml.plist" - Data: """ - 162-466: "" - 162-163: "meta.tag.plist.xml.plist" - 162-163: "punctuation.definition.tag.xml.plist" - Data: ">" - 164-464: "" - 164-170: "meta.tag.dict.xml.plist" - 164-165: "punctuation.definition.tag.xml.plist" - Data: "<" - 165-169: "entity.name.tag.xml.plist" - 165-169: "entity.name.tag.localname.xml.plist" - Data: "dict" - 169-170: "punctuation.definition.tag.xml.plist" - Data: ">" - 172-192: "" - 172-177: "meta.tag.key.xml.plist" - 172-173: "punctuation.definition.tag.xml.plist" - Data: "<" - 173-176: "entity.name.tag.xml.plist" - 173-176: "entity.name.tag.localname.xml.plist" - Data: "key" - 176-177: "punctuation.definition.tag.xml.plist" - Data: ">" - 186-192: "meta.tag.key.xml.plist" - 186-188: "punctuation.definition.tag.xml.plist" - Data: "" - 194-202: "" - 194-202: "meta.tag.array.xml.plist" - 194-195: "punctuation.definition.tag.xml.plist" - Data: "<" - 195-200: "entity.name.tag.xml.plist" - 195-200: "entity.name.tag.localname.xml.plist" - Data: "array" - 201-202: "punctuation.definition.tag.xml.plist" - Data: ">" - 204-229: "" - 204-209: "meta.tag.key.xml.plist" - 204-205: "punctuation.definition.tag.xml.plist" - Data: "<" - 205-208: "entity.name.tag.xml.plist" - 205-208: "entity.name.tag.localname.xml.plist" - Data: "key" - 208-209: "punctuation.definition.tag.xml.plist" - Data: ">" - 223-229: "meta.tag.key.xml.plist" - 223-225: "punctuation.definition.tag.xml.plist" - Data: "" - 231-295: "" - 231-239: "meta.tag.string.xml.plist" - 231-232: "punctuation.definition.tag.xml.plist" - Data: "<" - 232-238: "entity.name.tag.xml.plist" - 232-238: "entity.name.tag.localname.xml.plist" - Data: "string" - 238-239: "punctuation.definition.tag.xml.plist" - Data: ">" - 286-295: "meta.tag.string.xml.plist" - 286-288: "punctuation.definition.tag.xml.plist" - Data: "" - 297-312: "" - 297-302: "meta.tag.key.xml.plist" - 297-298: "punctuation.definition.tag.xml.plist" - Data: "<" - 298-301: "entity.name.tag.xml.plist" - 298-301: "entity.name.tag.localname.xml.plist" - Data: "key" - 301-302: "punctuation.definition.tag.xml.plist" - Data: ">" - 306-312: "meta.tag.key.xml.plist" - 306-308: "punctuation.definition.tag.xml.plist" - Data: "" - 314-350: "" - 314-322: "meta.tag.string.xml.plist" - 314-315: "punctuation.definition.tag.xml.plist" - Data: "<" - 315-321: "entity.name.tag.xml.plist" - 315-321: "entity.name.tag.localname.xml.plist" - Data: "string" - 321-322: "punctuation.definition.tag.xml.plist" - Data: ">" - 341-350: "meta.tag.string.xml.plist" - 341-343: "punctuation.definition.tag.xml.plist" - Data: "" - 352-371: "" - 352-357: "meta.tag.key.xml.plist" - 352-353: "punctuation.definition.tag.xml.plist" - Data: "<" - 353-356: "entity.name.tag.xml.plist" - 353-356: "entity.name.tag.localname.xml.plist" - Data: "key" - 356-357: "punctuation.definition.tag.xml.plist" - Data: ">" - 365-371: "meta.tag.key.xml.plist" - 365-367: "punctuation.definition.tag.xml.plist" - Data: "" - 373-456: "" - 373-380: "meta.tag.array.xml.plist" - 373-374: "punctuation.definition.tag.xml.plist" - Data: "<" - 374-379: "entity.name.tag.xml.plist" - 374-379: "entity.name.tag.localname.xml.plist" - Data: "array" - 379-380: "punctuation.definition.tag.xml.plist" - Data: ">" - 383-446: "" - 383-389: "meta.tag.dict.xml.plist" - 383-384: "punctuation.definition.tag.xml.plist" - Data: "<" - 384-388: "entity.name.tag.xml.plist" - 384-388: "entity.name.tag.localname.xml.plist" - Data: "dict" - 388-389: "punctuation.definition.tag.xml.plist" - Data: ">" - 393-411: "" - 393-398: "meta.tag.key.xml.plist" - 393-394: "punctuation.definition.tag.xml.plist" - Data: "<" - 394-397: "entity.name.tag.xml.plist" - 394-397: "entity.name.tag.localname.xml.plist" - Data: "key" - 397-398: "punctuation.definition.tag.xml.plist" - Data: ">" - 405-411: "meta.tag.key.xml.plist" - 405-407: "punctuation.definition.tag.xml.plist" - Data: "" - 415-436: "" - 415-423: "meta.tag.string.xml.plist" - 415-416: "punctuation.definition.tag.xml.plist" - Data: "<" - 416-422: "entity.name.tag.xml.plist" - 416-422: "entity.name.tag.localname.xml.plist" - Data: "string" - 422-423: "punctuation.definition.tag.xml.plist" - Data: ">" - 427-436: "meta.tag.string.xml.plist" - 427-429: "punctuation.definition.tag.xml.plist" - Data: "" - 439-446: "meta.tag.dict.xml.plist" - 439-441: "punctuation.definition.tag.xml.plist" - Data: "" - 448-456: "meta.tag.array.xml.plist" - 448-450: "punctuation.definition.tag.xml.plist" - Data: "" - 457-464: "meta.tag.dict.xml.plist" - 457-459: "punctuation.definition.tag.xml.plist" - Data: "" - 465-466: "meta.tag.plist.xml.plist" - 465-466: "punctuation.definition.tag.xml.plist" - Data: "<" - 466-473: "meta.tag.plist.xml.plist" - 466-467: "punctuation.definition.tag.xml.plist" - Data: "/" - 467-472: "entity.name.tag.xml.plist" - 467-472: "entity.name.tag.localname.xml.plist" - Data: "plist" - 472-473: "punctuation.definition.tag.xml.plist" - Data: ">" diff --git a/backend/textmate/testdata/utf.go b/backend/textmate/testdata/utf.go deleted file mode 100644 index 6a5b1fe..0000000 --- a/backend/textmate/testdata/utf.go +++ /dev/null @@ -1,35 +0,0 @@ -package primitives - -import ( - "testing" -) - -func TestActionsUtf(t *testing.T) { - type Test struct { - action Action - expected string - } - const init = "€þıœəßðĸʒ×ŋµåäö𝄞" - - buffer := Buffer{data: []rune(init)} - tests := []Test{ - {NewInsertAction(&buffer, 0, "𝄞€ŋ"), "𝄞€ŋ€þıœəßðĸʒ×ŋµåäö𝄞"}, - {NewInsertAction(&buffer, 1, "𝄞€ŋ"), "€𝄞€ŋþıœəßðĸʒ×ŋµåäö𝄞"}, - {NewInsertAction(&buffer, 10, "𝄞€ŋ"), "€þıœəßðĸʒ×𝄞€ŋŋµåäö𝄞"}, - {NewEraseAction(&buffer, Region{0, 0}), "€þıœəßðĸʒ×ŋµåäö𝄞"}, - {NewEraseAction(&buffer, Region{0, 1}), "þıœəßðĸʒ×ŋµåäö𝄞"}, - {NewEraseAction(&buffer, Region{0, 3}), "œəßðĸʒ×ŋµåäö𝄞"}, - {NewEraseAction(&buffer, Region{6, 9}), "€þıœəß×ŋµåäö𝄞"}, - {NewReplaceAction(&buffer, Region{3, 6}, "𝄞öäå"), "€þı𝄞öäåðĸʒ×ŋµåäö𝄞"}, - } - for i, test := range tests { - test.action.Apply() - if d := buffer.String(); d != test.expected { - t.Errorf("Apply %d\n\tExpected %v\n\tBut got %v", i, []rune(test.expected), []rune(d)) - } - test.action.Undo() - if d := buffer.String(); d != init { - t.Errorf("Undo %d, Expected %s, but got %s", i, init, d) - } - } -} diff --git a/backend/textmate/testdata/utf.go.res b/backend/textmate/testdata/utf.go.res deleted file mode 100644 index 427495a..0000000 --- a/backend/textmate/testdata/utf.go.res +++ /dev/null @@ -1,202 +0,0 @@ -0-1063: "source.go" - 0-7: "keyword.control.go" - Data: "package" - 20-26: "keyword.control.go" - Data: "import" - 27-28: "meta.parens.go" - Data: "(" - 30-39: "string.quoted.double.go" - 30-31: "punctuation.definition.string.begin.go" - Data: """ - 38-39: "punctuation.definition.string.end.go" - Data: """ - 43-1063: "meta.function.plain.go" - 43-77: "meta.function.declaration.go" - 43-47: "keyword.control.go" - Data: "func" - 48-62: "entity.name.function.go" - Data: "TestActionsUtf" - 63-75: "variable.parameters.go" - Data: "t *testing.T" - 77-77: "variable.return-types.go" - Data: "" - 77-1063: "meta.block.go" - 77-78: "punctuation.section.function-block.begin.go" - Data: "{" - 80-84: "keyword.control.go" - Data: "type" - 90-96: "keyword.control.go" - Data: "struct" - 97-137: "meta.block.go" - 97-98: "punctuation.section.function-block.begin.go" - Data: "{" - 128-134: "storage.type.go" - Data: "string" - 136-137: "punctuation.section.function-block.end.go" - Data: "}" - 139-144: "storage.modifier.go" - Data: "const" - 152-170: "string.quoted.double.go" - 152-153: "punctuation.definition.string.begin.go" - Data: """ - 169-170: "punctuation.definition.string.end.go" - Data: """ - 173-182: "meta.initialization.short.go" - 173-182: "variable.other.go" - 180-182: "keyword.operator.initialize.go" - Data: ":=" - 189-209: "meta.block.go" - 189-190: "punctuation.section.function-block.begin.go" - Data: "{" - 198-203: "meta.function-call.go" - 198-202: "support.function.any-method.go" - Data: "rune" - 208-209: "punctuation.section.function-block.end.go" - Data: "}" - 211-219: "meta.initialization.short.go" - 211-219: "variable.other.go" - 217-219: "keyword.operator.initialize.go" - Data: ":=" - 226-739: "meta.block.go" - 226-227: "punctuation.section.function-block.begin.go" - Data: "{" - 230-289: "meta.block.go" - 230-231: "punctuation.section.function-block.begin.go" - Data: "{" - 231-247: "meta.function-call.go" - 231-246: "support.function.any-method.go" - Data: "NewInsertAction" - 256-257: "constant.numeric.go" - Data: "0" - 259-264: "string.quoted.double.go" - 259-260: "punctuation.definition.string.begin.go" - Data: """ - 263-264: "punctuation.definition.string.end.go" - Data: """ - 267-288: "string.quoted.double.go" - 267-268: "punctuation.definition.string.begin.go" - Data: """ - 287-288: "punctuation.definition.string.end.go" - Data: """ - 288-289: "punctuation.section.function-block.end.go" - Data: "}" - 293-352: "meta.block.go" - 293-294: "punctuation.section.function-block.begin.go" - Data: "{" - 294-310: "meta.function-call.go" - 294-309: "support.function.any-method.go" - Data: "NewInsertAction" - 319-320: "constant.numeric.go" - Data: "1" - 322-327: "string.quoted.double.go" - 322-323: "punctuation.definition.string.begin.go" - Data: """ - 326-327: "punctuation.definition.string.end.go" - Data: """ - 330-351: "string.quoted.double.go" - 330-331: "punctuation.definition.string.begin.go" - Data: """ - 350-351: "punctuation.definition.string.end.go" - Data: """ - 351-352: "punctuation.section.function-block.end.go" - Data: "}" - 356-416: "meta.block.go" - 356-357: "punctuation.section.function-block.begin.go" - Data: "{" - 357-373: "meta.function-call.go" - 357-372: "support.function.any-method.go" - Data: "NewInsertAction" - 382-384: "constant.numeric.go" - Data: "10" - 386-391: "string.quoted.double.go" - 386-387: "punctuation.definition.string.begin.go" - Data: """ - 390-391: "punctuation.definition.string.end.go" - Data: """ - 394-415: "string.quoted.double.go" - 394-395: "punctuation.definition.string.begin.go" - Data: """ - 414-415: "punctuation.definition.string.end.go" - Data: """ - 415-416: "punctuation.section.function-block.end.go" - Data: "}" - 420-479: "meta.block.go" - 420-421: "punctuation.section.function-block.begin.go" - Data: "{" - 421-436: "meta.function-call.go" - 421-435: "support.function.any-method.go" - Data: "NewEraseAction" - 451-457: "meta.block.go" - 451-452: "punctuation.section.function-block.begin.go" - Data: "{" - 452-453: "constant.numeric.go" - Data: "0" - 455-456: "constant.numeric.go" - Data: "0" - 456-457: "punctuation.section.function-block.end.go" - Data: "}" - 460-478: "string.quoted.double.go" - 460-461: "punctuation.definition.string.begin.go" - Data: """ - 477-478: "punctuation.definition.string.end.go" - Data: """ - 478-479: "punctuation.section.function-block.end.go" - Data: "}" - 483-541: "meta.block.go" - 483-484: "punctuation.section.function-block.begin.go" - Data: "{" - 484-499: "meta.function-call.go" - 484-498: "support.function.any-method.go" - Data: "NewEraseAction" - 514-520: "meta.block.go" - 514-515: "punctuation.section.function-block.begin.go" - Data: "{" - 515-516: "constant.numeric.go" - Data: "0" - 518-519: "constant.numeric.go" - Data: "1" - 519-520: "punctuation.section.function-block.end.go" - Data: "}" - 523-540: "string.quoted.double.go" - 523-524: "punctuation.definition.string.begin.go" - Data: """ - 539-540: "punctuation.definition.string.end.go" - Data: """ - 540-541: "punctuation.section.function-block.end.go" - Data: "}" - 545-601: "meta.block.go" - 545-546: "punctuation.section.function-block.begin.go" - Data: "{" - 546-561: "meta.function-call.go" - 546-560: "support.function.any-method.go" - Data: "NewEraseAction" - 576-582: "meta.block.go" - 576-577: "punctuation.section.function-block.begin.go" - Data: "{" - 577-578: "constant.numeric.go" - Data: "0" - 580-581: "constant.numeric.go" - Data: "3" - 581-582: "punctuation.section.function-block.end.go" - Data: "}" - 585-600: "string.quoted.double.go" - 585-586: "punctuation.definition.string.begin.go" - Data: """ - 599-600: "punctuation.definition.string.end.go" - Data: """ - 600-601: "punctuation.section.function-block.end.go" - Data: "}" - 605-661: "meta.block.go" - 605-606: "punctuation.section.function-block.begin.go" - Data: "{" - 606-621: "meta.function-call.go" - 606-620: "support.function.any-method.go" - Data: "NewEraseAction" - 636-642: "meta.block.go" - 636-637: "punctuation.section.function-block.begin.go" - Data: "{" - 637-638: "constant.numeric.go" - Data: "6" - 640-641: "constant.numeric.go" - Data: "9" - 641-642: "punctuation.section.function-block.end.go" - Data: "}" - 645-660: "string.quoted.double.go" - 645-646: "punctuation.definition.string.begin.go" - Data: """ - 659-660: "punctuation.definition.string.end.go" - Data: """ - 660-661: "punctuation.section.function-block.end.go" - Data: "}" - 665-735: "meta.block.go" - 665-666: "punctuation.section.function-block.begin.go" - Data: "{" - 666-683: "meta.function-call.go" - 666-682: "support.function.any-method.go" - Data: "NewReplaceAction" - 698-704: "meta.block.go" - 698-699: "punctuation.section.function-block.begin.go" - Data: "{" - 699-700: "constant.numeric.go" - Data: "3" - 702-703: "constant.numeric.go" - Data: "6" - 703-704: "punctuation.section.function-block.end.go" - Data: "}" - 706-712: "string.quoted.double.go" - 706-707: "punctuation.definition.string.begin.go" - Data: """ - 711-712: "punctuation.definition.string.end.go" - Data: """ - 715-734: "string.quoted.double.go" - 715-716: "punctuation.definition.string.begin.go" - Data: """ - 733-734: "punctuation.definition.string.end.go" - Data: """ - 734-735: "punctuation.section.function-block.end.go" - Data: "}" - 738-739: "punctuation.section.function-block.end.go" - Data: "}" - 741-744: "keyword.control.go" - Data: "for" - 745-755: "meta.initialization.short.go" - 745-755: "variable.other.go" - 753-755: "keyword.operator.initialize.go" - Data: ":=" - 756-761: "keyword.control.go" - Data: "range" - 768-1061: "meta.block.go" - 768-769: "punctuation.section.function-block.begin.go" - Data: "{" - 777-783: "variable.other.dot-access.go" - Data: "action" - 784-790: "meta.function-call.go" - 784-789: "support.function.any-method.go" - Data: "Apply" - 794-796: "keyword.control.go" - Data: "if" - 797-801: "meta.initialization.short.go" - 797-801: "variable.other.go" - 799-801: "keyword.operator.initialize.go" - Data: ":=" - 809-816: "meta.function-call.go" - 809-815: "support.function.any-method.go" - Data: "String" - 829-837: "variable.other.dot-access.go" - Data: "expected" - 838-934: "meta.block.go" - 838-839: "punctuation.section.function-block.begin.go" - Data: "{" - 845-852: "meta.function-call.go" - 845-851: "support.function.any-method.go" - Data: "Errorf" - 852-892: "string.quoted.double.go" - 852-853: "punctuation.definition.string.begin.go" - Data: """ - 859-861: "constant.other.placeholder.go" - Data: "%d" - 861-863: "constant.character.escape.go" - Data: "\n" - 863-865: "constant.character.escape.go" - Data: "\t" - 874-876: "constant.other.placeholder.go" - Data: "%v" - 876-878: "constant.character.escape.go" - Data: "\n" - 878-880: "constant.character.escape.go" - Data: "\t" - 889-891: "constant.other.placeholder.go" - Data: "%v" - 891-892: "punctuation.definition.string.end.go" - Data: """ - 899-904: "meta.function-call.go" - 899-903: "support.function.any-method.go" - Data: "rune" - 909-917: "variable.other.dot-access.go" - Data: "expected" - 922-927: "meta.function-call.go" - 922-926: "support.function.any-method.go" - Data: "rune" - 933-934: "punctuation.section.function-block.end.go" - Data: "}" - 942-948: "variable.other.dot-access.go" - Data: "action" - 949-954: "meta.function-call.go" - 949-953: "support.function.any-method.go" - Data: "Undo" - 958-960: "keyword.control.go" - Data: "if" - 961-965: "meta.initialization.short.go" - 961-965: "variable.other.go" - 963-965: "keyword.operator.initialize.go" - Data: ":=" - 973-980: "meta.function-call.go" - 973-979: "support.function.any-method.go" - Data: "String" - 993-1058: "meta.block.go" - 993-994: "punctuation.section.function-block.begin.go" - Data: "{" - 1000-1007: "meta.function-call.go" - 1000-1006: "support.function.any-method.go" - Data: "Errorf" - 1007-1041: "string.quoted.double.go" - 1007-1008: "punctuation.definition.string.begin.go" - Data: """ - 1013-1015: "constant.other.placeholder.go" - Data: "%d" - 1026-1028: "constant.other.placeholder.go" - Data: "%s" - 1038-1040: "constant.other.placeholder.go" - Data: "%s" - 1040-1041: "punctuation.definition.string.end.go" - Data: """ - 1057-1058: "punctuation.section.function-block.end.go" - Data: "}" - 1060-1061: "punctuation.section.function-block.end.go" - Data: "}" - 1062-1063: "punctuation.section.function-block.end.go" - Data: "}" diff --git a/backend/textmate/theme.go b/backend/textmate/theme.go deleted file mode 100644 index 08a88f2..0000000 --- a/backend/textmate/theme.go +++ /dev/null @@ -1,158 +0,0 @@ -// Copyright 2013 The lime Authors. -// Use of this source code is governed by a 2-clause -// BSD-style license that can be found in the LICENSE file. - -package textmate - -import ( - "encoding/json" - "fmt" - "github.com/limetext/lime/backend/loaders" - "github.com/limetext/lime/backend/log" - "github.com/limetext/lime/backend/render" - "github.com/limetext/lime/backend/util" - "image/color" - "io/ioutil" - "sort" - "strconv" - "strings" -) - -type ( - Color color.RGBA - - // TODO(q): personally I don't care about the font style attributes - Settings map[string]Color - - ScopeSetting struct { - Name string - Scope string - Settings Settings - } - Theme struct { - GutterSettings Settings - Name string - Settings []ScopeSetting - UUID UUID - } -) - -func LoadTheme(filename string) (*Theme, error) { - var scheme Theme - if d, err := ioutil.ReadFile(filename); err != nil { - return nil, fmt.Errorf("Unable to load colorscheme definition: %s", err) - } else if err := loaders.LoadPlist(d, &scheme); err != nil { - return nil, fmt.Errorf("Unable to load colorscheme definition: %s", err) - } - - return &scheme, nil -} - -func (s ScopeSetting) String() (ret string) { - ret = fmt.Sprintf("%s - %s\n", s.Name, s.Scope) - keys := make([]string, 0, len(s.Settings)) - for k := range s.Settings { - keys = append(keys, k) - } - sort.Strings(keys) - for _, k := range keys { - ret += fmt.Sprintf("\t\t%s: %s\n", k, s.Settings[k]) - } - return -} - -func (t Theme) String() (ret string) { - ret = fmt.Sprintf("%s - %s\n", t.Name, t.UUID) - for i := range t.Settings { - ret += fmt.Sprintf("\t%s", t.Settings[i]) - } - return -} - -func (c Color) String() string { - return fmt.Sprintf("0x%02X%02X%02X%02X", c.A, c.R, c.G, c.B) -} - -func (c *Color) UnmarshalJSON(data []byte) error { - i64, err := strconv.ParseInt(string(data[2:len(data)-1]), 16, 64) - if err != nil { - log.Warn("Couldn't properly load color from %s: %s", string(data), err) - } - c.A = uint8((i64 >> 24) & 0xff) - c.R = uint8((i64 >> 16) & 0xff) - c.G = uint8((i64 >> 8) & 0xff) - c.B = uint8((i64 >> 0) & 0xff) - return nil -} - -func (s *Settings) UnmarshalJSON(data []byte) error { - *s = make(Settings) - tmp := make(map[string]json.RawMessage) - if err := json.Unmarshal(data, &tmp); err != nil { - return err - } - for k, v := range tmp { - if strings.HasPrefix(k, "font") { - continue - } - var c Color - if err := json.Unmarshal(v, &c); err != nil { - return err - } - (*s)[k] = c - } - return nil -} - -func (t *Theme) ClosestMatchingSetting(scope string) *ScopeSetting { - pe := util.Prof.Enter("ClosestMatchingSetting") - defer pe.Exit() - na := scope - for len(na) > 0 { - sn := na - i := strings.LastIndex(sn, " ") - if i != -1 { - sn = sn[i+1:] - } - - for j := range t.Settings { - if t.Settings[j].Scope == sn { - return &t.Settings[j] - } - } - if i2 := strings.LastIndex(na, "."); i2 == -1 { - break - } else if i > i2 { - na = na[:i] - } else { - na = strings.TrimSpace(na[:i2]) - } - } - return &t.Settings[0] -} - -func (t *Theme) Spice(vr *render.ViewRegions) (ret render.Flavour) { - pe := util.Prof.Enter("Spice") - defer pe.Exit() - if len(t.Settings) == 0 { - return - } - def := &t.Settings[0] - - s := t.ClosestMatchingSetting(vr.Scope) - fg, ok := s.Settings["foreground"] - if !ok { - fg = def.Settings["foreground"] - } - ret.Foreground = render.Colour(fg) - bname := "background" - if vr.Flags&render.SELECTION != 0 { - bname = "selection" - } - bg, ok := s.Settings[bname] - if !ok { - bg = def.Settings[bname] - } - ret.Background = render.Colour(bg) - return -} diff --git a/backend/textmate/theme_test.go b/backend/textmate/theme_test.go deleted file mode 100644 index 3492783..0000000 --- a/backend/textmate/theme_test.go +++ /dev/null @@ -1,75 +0,0 @@ -// Copyright 2013 The lime Authors. -// Use of this source code is governed by a 2-clause -// BSD-style license that can be found in the LICENSE file. - -package textmate - -import ( - "fmt" - "github.com/limetext/lime/backend/loaders" - "github.com/limetext/lime/backend/util" - "io/ioutil" - "testing" -) - -func TestLoadTheme(t *testing.T) { - type Test struct { - in string - out string - } - tests := []Test{ - { - "testdata/Monokai.tmTheme", - "testdata/Monokai.tmTheme.res", - }, - } - for _, test := range tests { - if d, err := ioutil.ReadFile(test.in); err != nil { - t.Logf("Couldn't load file %s: %s", test.in, err) - } else { - var theme Theme - if err := loaders.LoadPlist(d, &theme); err != nil { - t.Error(err) - } else { - str := fmt.Sprintf("%s", theme) - if d, err := ioutil.ReadFile(test.out); err != nil { - if err := ioutil.WriteFile(test.out, []byte(str), 0644); err != nil { - t.Error(err) - } - } else if diff := util.Diff(string(d), str); diff != "" { - t.Error(diff) - } - - } - } - } -} - -func TestLoadThemeFromPlist(t *testing.T) { - f := "testdata/Monokai.tmTheme" - th, err := LoadTheme(f) - if err != nil { - t.Errorf("Tried to load %s, but got an error: %v", f, err) - } - - n := "Monokai" - if th.Name != n { - t.Errorf("Tried to load %s, but got %s", f, th) - } -} - -func TestLoadThemeFromNonPlist(t *testing.T) { - f := "testdata/Monokai.tmTheme.res" - _, err := LoadTheme(f) - if err == nil { - t.Errorf("Tried to load %s, expecting an error, but didn't get one", f) - } -} - -func TestLoadThemeFromMissingFile(t *testing.T) { - f := "testdata/MissingFile" - _, err := LoadTheme(f) - if err == nil { - t.Errorf("Tried to load %s, expecting an error, but didn't get one", f) - } -} diff --git a/backend/textmate/uuid.go b/backend/textmate/uuid.go deleted file mode 100644 index 1e7711d..0000000 --- a/backend/textmate/uuid.go +++ /dev/null @@ -1,8 +0,0 @@ -// Copyright 2013 The lime Authors. -// Use of this source code is governed by a 2-clause -// BSD-style license that can be found in the LICENSE file. - -package textmate - -// TODO(q) -type UUID string diff --git a/backend/undo.go b/backend/undo.go deleted file mode 100644 index d8085e8..0000000 --- a/backend/undo.go +++ /dev/null @@ -1,137 +0,0 @@ -// Copyright 2013 The lime Authors. -// Use of this source code is governed by a 2-clause -// BSD-style license that can be found in the LICENSE file. - -package backend - -type ( - UndoStack struct { - position int - actions []*Edit - } -) - -// Adds the provided Edit object to the UndoStack, potentially -// destroying the old redo stack if one had been created. -// TODO(.): It would be nice with branched undo histories -func (us *UndoStack) Add(a *Edit) { - if us.position != len(us.actions) { - us.actions = us.actions[0:us.position] - } - us.actions = append(us.actions, a) - us.position++ -} - -// index returns the real index in the UndoStack of an undo item -// relative to the current position. -// -// When modifying_only is set to true, only actions actually modifying -// the buffer (as opposed to just moving the cursor) are counted as an -// index. Also see comment in Undo. -func (us *UndoStack) index(relative int, modifying_only bool) int { - dir := -1 - i := us.position - if relative > 0 { - dir = 1 - } else { - i-- - } - relative *= dir - for ; i >= 0 && i < len(us.actions) && relative > 0; i += dir { - if modifying_only { - if us.actions[i].composite.Len() != 0 { - relative-- - } - } else { - relative-- - } - } - if i >= 0 && i < len(us.actions) { - return i - } else { - return -1 - } -} - -// Reverts the last action on the UndoStack. -// -// When the argument "hard" is set to true, -// the "last action" will be the last action that -// modified the contents of the buffer (rather than just -// changing the cursor position). In this case, all -// actions between the current action and the last "hard" -// action will be reverted. -func (us *UndoStack) Undo(hard bool) { - if us.position <= 0 { - // Nothing to undo - return - } - to := us.index(0, hard) - if to == -1 { - to = 0 - } - for us.position > to { - us.position-- - us.actions[us.position].Undo() - } -} - -// Re-applies the next action in the undo stack -// if there are any actions on the stack that had -// been undone. -// -// See comment in Undo regarding the use of "hard". -func (us *UndoStack) Redo(hard bool) { - if us.position >= len(us.actions) { - // No more actions to redo - return - } - to := us.index(1, hard) - if to == -1 { - to = len(us.actions) - } - for us.position < to { - us.actions[us.position].Apply() - us.position++ - } -} - -// Returns the current position in the UndoStack. -func (us *UndoStack) Position() int { - return us.position -} - -// Glues all edits from the position given by mark, -// to the current position in the UndoStack, replacing -// them by a single entry which will now be composite -// of all those other actions. -// -// In other words, after the glue operation -// a single "undo" operation will then undo all of those edits -// and a single redo after that will redo them all again. -func (us *UndoStack) GlueFrom(mark int) { - if mark >= us.position { - return - } - var e Edit - e.command = "sequence" - type entry struct { - name string - args Args - } - e.v = us.actions[mark].v - e.savedSel.AddAll(us.actions[mark].savedSel.Regions()) - - entries := make([]entry, us.position-mark) - for i := range entries { - a := us.actions[i+mark] - entries[i].name = a.command - entries[i].args = a.args - e.composite.Add(a) - } - us.position = mark - us.actions = us.actions[:mark+1] - e.args = make(Args) - e.args["commands"] = entries - us.Add(&e) -} diff --git a/backend/undo_test.go b/backend/undo_test.go deleted file mode 100644 index cac6478..0000000 --- a/backend/undo_test.go +++ /dev/null @@ -1,208 +0,0 @@ -// Copyright 2014 The lime Authors. -// Use of this source code is governed by a 2-clause -// BSD-style license that can be found in the LICENSE file. - -package backend - -import ( - "github.com/limetext/text" - "testing" -) - -func TestUndoStackIndex(t *testing.T) { - us := UndoStack{} - - w := GetEditor().NewWindow() - defer w.Close() - - v := w.NewFile() - defer func() { - v.SetScratch(true) - v.Close() - }() - - e := v.BeginEdit() - v.Erase(e, text.Region{}) - v.EndEdit(e) - us.Add(e) - - e = v.BeginEdit() - v.Erase(e, text.Region{}) - v.EndEdit(e) - us.Add(e) - - if i := us.index(-1, false); i != 0 { - t.Errorf("Expected 0, but it got %d", i) - } -} - -func TestUndoStackAdd(t *testing.T) { - us := UndoStack{} - - w := GetEditor().NewWindow() - defer w.Close() - - v := w.NewFile() - defer func() { - v.SetScratch(true) - v.Close() - }() - - e := v.BeginEdit() - v.Erase(e, text.Region{}) - v.EndEdit(e) - us.Add(e) - - e = v.BeginEdit() - v.Erase(e, text.Region{}) - v.EndEdit(e) - us.Add(e) - - if us.Position() != 2 { - t.Errorf("Expected the UndoStack positon to be 2, but it was %d", us.Position()) - } - if len(us.actions) != 2 { - t.Errorf("Expected the UndoStack to only contain 2 things, but it had %d", len(us.actions)) - } - - us.Undo(false) - us.Undo(false) - - e = v.BeginEdit() - v.Erase(e, text.Region{}) - v.EndEdit(e) - us.Add(e) - - if us.Position() != 1 { - t.Errorf("Expected the UndoStack positon to be 1, but it was %d", us.Position()) - } - if len(us.actions) != 1 { - t.Errorf("Expected the UndoStack to only contain 1 thing, but it had %d", len(us.actions)) - } -} - -func TestUndoStackUndo(t *testing.T) { - us := UndoStack{} - us.Undo(false) - - if us.Position() != 0 { - t.Errorf("Expected the UndoStack positon to be 0, but it was %d", us.Position()) - } - - w := GetEditor().NewWindow() - defer w.Close() - - v := w.NewFile() - defer func() { - v.SetScratch(true) - v.Close() - }() - - e := v.BeginEdit() - v.Erase(e, text.Region{}) - v.EndEdit(e) - us.Add(e) - - e = v.BeginEdit() - v.Erase(e, text.Region{}) - v.EndEdit(e) - us.Add(e) - - us.Undo(false) - - if us.Position() != 1 { - t.Errorf("Expected the UndoStack positon to be 1, but it was %d", us.Position()) - } - if len(us.actions) != 2 { - t.Errorf("Expected the UndoStack to only contain 2 things, but it had %d", len(us.actions)) - } -} - -func TestUndoStackRedo(t *testing.T) { - us := UndoStack{} - us.Redo(false) - - if us.Position() != 0 { - t.Errorf("Expected the UndoStack positon to be 0, but it was %d", us.Position()) - } - - w := GetEditor().NewWindow() - defer w.Close() - - v := w.NewFile() - defer func() { - v.SetScratch(true) - v.Close() - }() - - e := v.BeginEdit() - v.Erase(e, text.Region{}) - v.EndEdit(e) - us.Add(e) - - e = v.BeginEdit() - v.Erase(e, text.Region{}) - v.EndEdit(e) - us.Add(e) - - us.Undo(false) - us.Redo(false) - - if us.Position() != 2 { - t.Errorf("Expected the UndoStack positon to be 1, but it was %d", us.Position()) - } - if len(us.actions) != 2 { - t.Errorf("Expected the UndoStack to only contain 2 things, but it had %d", len(us.actions)) - } -} - -func TestUndoStackGlueFrom(t *testing.T) { - us := UndoStack{} - - w := GetEditor().NewWindow() - defer w.Close() - - v := w.NewFile() - defer func() { - v.SetScratch(true) - v.Close() - }() - - e := v.BeginEdit() - v.Erase(e, text.Region{}) - v.EndEdit(e) - us.Add(e) - - e = v.BeginEdit() - v.Erase(e, text.Region{}) - v.EndEdit(e) - us.Add(e) - - e = v.BeginEdit() - v.Erase(e, text.Region{}) - v.EndEdit(e) - us.Add(e) - - e = v.BeginEdit() - v.Erase(e, text.Region{}) - v.EndEdit(e) - us.Add(e) - - us.GlueFrom(1) - - if us.Position() != 2 { - t.Errorf("Expected the UndoStack positon to be 2, but it was %d", us.Position()) - } - if len(us.actions) != 2 { - t.Errorf("Expected the UndoStack to only contain 2 things, but it had %d", len(us.actions)) - } - - us.GlueFrom(10) - - if us.Position() != 2 { - t.Errorf("Expected the UndoStack positon to be 2, but it was %d", us.Position()) - } - if len(us.actions) != 2 { - t.Errorf("Expected the UndoStack to only contain 2 things, but it had %d", len(us.actions)) - } -} diff --git a/backend/util/case.go b/backend/util/case.go deleted file mode 100644 index 5df079d..0000000 --- a/backend/util/case.go +++ /dev/null @@ -1,24 +0,0 @@ -// Copyright 2014 The lime Authors. -// Use of this source code is governed by a 2-clause -// BSD-style license that can be found in the LICENSE file. - -package util - -import ( - "regexp" - "strings" -) - -func PascalCaseToSnakeCase(in string) string { - casere := regexp.MustCompile(`([A-Z])`) - - first := true - return casere.ReplaceAllStringFunc(in, func(in string) string { - if first { - first = false - return strings.ToLower(in) - } - return "_" + strings.ToLower(in) - }) - -} diff --git a/backend/util/case_test.go b/backend/util/case_test.go deleted file mode 100644 index 371a741..0000000 --- a/backend/util/case_test.go +++ /dev/null @@ -1,33 +0,0 @@ -// Copyright 2014 The lime Authors. -// Use of this source code is governed by a 2-clause -// BSD-style license that can be found in the LICENSE file. - -package util - -import ( - "testing" -) - -func TestPascalCaseToSnakeCase(t *testing.T) { - tests := []struct { - in string - out string - }{ - { - "TestString", - "test_string", - }, - { - "Teststring", - "teststring", - }, - } - - for i, test := range tests { - out := PascalCaseToSnakeCase(test.in) - - if out != test.out { - t.Errorf("Test %d: Expected %s, but got %s", i, test.out, out) - } - } -} diff --git a/backend/util/diff.go b/backend/util/diff.go deleted file mode 100644 index b12147a..0000000 --- a/backend/util/diff.go +++ /dev/null @@ -1,96 +0,0 @@ -// Copyright 2013 The lime Authors. -// Use of this source code is governed by a 2-clause -// BSD-style license that can be found in the LICENSE file. - -package util - -import ( - "strings" -) - -// Naive algorithm from http://en.wikipedia.org/wiki/Longest_common_subsequence_problem -func mDiff(av, bv []string, context int) (ret []string) { - matrix := make([]int, (len(av)+1)*(len(bv)+1)) - pitch := (len(bv) + 1) - for i, a := range av { - mp := (i+1)*pitch + 1 - - for _, b := range bv { - if a == b { - matrix[mp] = matrix[mp-1-pitch] + 1 - } else if matrix[mp-1] > matrix[mp-pitch] { - matrix[mp] = matrix[mp-1] - } else { - matrix[mp] = matrix[mp-pitch] - } - mp++ - } - } - - var innerContext func(i, count int) - innerContext = func(i, count int) { - i-- - count-- - if count > 0 { - innerContext(i, count) - } - ret = append(ret, " "+av[i]) - } - - var inner func(i, j, k, iLast, contextLast int) - inner = func(i, j, k, iLast, contextLast int) { - changed := false - if i > 0 && j > 0 && av[i-1] == bv[j-1] { - c := contextLast - if k > 0 { - c = i - 1 - } - - inner(i-1, j-1, k-1, iLast, c) - - // add context before the change - if k > 0 { - ret = append(ret, " "+av[i-1]) - } - } else if j > 0 && (i == 0 || matrix[i*pitch+j-1] >= matrix[(i-1)*pitch+j]) { - changed = true - inner(i, j-1, context, i, contextLast) - ret = append(ret, "+ "+bv[j-1]) - } else if i > 0 && (j == 0 || matrix[i*pitch+j-1] < matrix[(i-1)*pitch+j]) { - changed = true - inner(i-1, j, context, i-1, contextLast) - ret = append(ret, "- "+av[i-1]) - } - - if changed { - // add context after the change - l := iLast - if l > contextLast { - l = contextLast - } - - m := l - i - if m > 0 { - if m > context { - m = context - } - innerContext(i+m, m) - } - } - } - - inner(len(av), len(bv), 0, len(av), len(av)) - return -} - -func Diff(a, b string) string { - if a == b { - return "" - } - a = strings.Replace(a, "\r\n", "\n", -1) - b = strings.Replace(b, "\r\n", "\n", -1) - if a == b { - return "" - } - return strings.Join(mDiff(strings.Split(a, "\n"), strings.Split(b, "\n"), 3), "\n") -} diff --git a/backend/util/diff_test.go b/backend/util/diff_test.go deleted file mode 100644 index e084ad4..0000000 --- a/backend/util/diff_test.go +++ /dev/null @@ -1,230 +0,0 @@ -// Copyright 2014 The lime Authors. -// Use of this source code is governed by a 2-clause -// BSD-style license that can be found in the LICENSE file. - -package util - -import ( - "testing" -) - -func TestDiff(t *testing.T) { - tests := []struct { - a, b, exp string - }{ - { - "test string", - "test string", - "", - }, - - { - "test\nstring", - "test\nstring", - "", - }, - - { - "test\r\nstring", - "test\nstring", - "", - }, - - { - "test\n\rstring", - "test\nstring", - " test\n- \rstring\n+ string", - }, - { - "test\nstring", - "test\n\rstring", - " test\n- string\n+ \rstring", - }, - - { - "t3st\nstring", - "test\nstring", - "- t3st\n+ test\n string", - }, - { - "test\nstring", - "t3st\nstring", - "- test\n+ t3st\n string", - }, - - { - "t3st\nstr1ng", - "test\nstring", - "- t3st\n- str1ng\n+ test\n+ string", - }, - { - "test\nstring", - "t3st\nstr1ng", - "- test\n- string\n+ t3st\n+ str1ng", - }, - - { - "t3st\nstr\n1ng", - "test\nstr\ning", - "- t3st\n+ test\n str\n- 1ng\n+ ing", - }, - { - "test\nstr\ning", - "t3st\nstr\n1ng", - "- test\n+ t3st\n str\n- ing\n+ 1ng", - }, - - { - "t\ne\nst\nstr\n1ng", - "t\ne\nst\nstr\ning", - " e\n st\n str\n- 1ng\n+ ing", - }, - { - "t\ne\nst\nstr\ning", - "t\ne\nst\nstr\n1ng", - " e\n st\n str\n- ing\n+ 1ng", - }, - - { - "t3\nst\nstr\nin\ng", - "te\nst\nstr\nin\ng", - "- t3\n+ te\n st\n str\n in", - }, - { - "te\nst\nstr\nin\ng", - "t3\nst\nstr\nin\ng", - "- te\n+ t3\n st\n str\n in", - }, - - { - "t\n3st\nstring", - "t\nest\nstring", - " t\n- 3st\n+ est\n string", - }, - { - "t\nest\nstring", - "t\n3st\nstring", - " t\n- est\n+ 3st\n string", - }, - - { - "t3\nst\nstr\n1ng", - "te\nst\nstr\ning", - "- t3\n+ te\n st\n str\n- 1ng\n+ ing", - }, - { - "te\nst\nstr\ning", - "t3\nst\nstr\n1ng", - "- te\n+ t3\n st\n str\n- ing\n+ 1ng", - }, - - { - "T\ne\nst\ns\nt\nr\n1ng", - "t\ne\nst\ns\nt\nr\ning", - "- T\n+ t\n e\n st\n s\n t\n r\n- 1ng\n+ ing", - }, - { - "t\ne\ns\nt\ns\nt\nr\ning", - "T\ne\ns\nt\ns\nt\nr\n1ng", - "- t\n+ T\n e\n s\n t\n s\n t\n r\n- ing\n+ 1ng", - }, - - { - "T\ne\ns\nt\ns\nt\nr\n1ng", - "t\ne\ns\nt\ns\nt\nr\ning", - "- T\n+ t\n e\n s\n t\n s\n t\n r\n- 1ng\n+ ing", - }, - { - "t\ne\ns\nt\ns\nt\nr\ning", - "T\ne\ns\nt\ns\nt\nr\n1ng", - "- t\n+ T\n e\n s\n t\n s\n t\n r\n- ing\n+ 1ng", - }, - - { - "T\ne\ns\nt\n\ns\nt\nr\n1ng", - "t\ne\ns\nt\n\ns\nt\nr\ning", - // TODO: No divider? - "- T\n+ t\n e\n s\n t\n s\n t\n r\n- 1ng\n+ ing", - }, - { - "t\ne\ns\nt\n\ns\nt\nr\ning", - "T\ne\ns\nt\n\ns\nt\nr\n1ng", - // TODO: No divider? - "- t\n+ T\n e\n s\n t\n s\n t\n r\n- ing\n+ 1ng", - }, - - { - "teststr", - "teststring", - "- teststr\n+ teststring", - }, - { - "teststring", - "teststr", - "- teststring\n+ teststr", - }, - - { - "test", - "test\nstring", - " test\n+ string", - }, - { - "test\nstring", - "test", - " test\n- string", - }, - - { - "string", - "test\nstring", - "+ test\n string", - }, - { - "test\nstring", - "string", - "- test\n string", - }, - - { - "str", - "test\nstr\ning", - "+ test\n str\n+ ing", - }, - { - "test\nstr\ning", - "str", - "- test\n str\n- ing", - }, - - { - "ing", - "test\nstr\ning", - "+ test\n+ str\n ing", - }, - { - "test\nstr\ning", - "ing", - "- test\n- str\n ing", - }, - - { - "test", - "test\nstr\ning", - " test\n+ str\n+ ing", - }, - { - "test\nstr\ning", - "test", - " test\n- str\n- ing", - }, - } - - for i, test := range tests { - out := Diff(test.a, test.b) - - if out != test.exp { - t.Errorf("Test %d: Expected:\n%s\n\nBut got:\n%s", i, test.exp, out) - } - } -} diff --git a/backend/util/doc.go b/backend/util/doc.go deleted file mode 100644 index 60bd282..0000000 --- a/backend/util/doc.go +++ /dev/null @@ -1,6 +0,0 @@ -// Copyright 2014 The lime Authors. -// Use of this source code is governed by a 2-clause -// BSD-style license that can be found in the LICENSE file. - -// Contains various utility functions. -package util diff --git a/backend/util/op.go b/backend/util/op.go deleted file mode 100644 index e195793..0000000 --- a/backend/util/op.go +++ /dev/null @@ -1,46 +0,0 @@ -// Copyright 2013 The lime Authors. -// Use of this source code is governed by a 2-clause -// BSD-style license that can be found in the LICENSE file. - -package util - -import ( - "encoding/json" -) - -type ( - // A comparison operation used in context queries. - Op int -) - -const ( - OpEqual Op = iota //< Compare for equality. - OpNotEqual //< Compare for difference. - OpRegexMatch //< Compare for a regular expression match. - OpNotRegexMatch //< Compare for a regular expression difference. - OpRegexContains //< Compare whether the given regular expression matches some substring of the operand. - OpNotRegexContains //< Compare whether the given regular expression does not match some substring of the operand. -) - -func (o *Op) UnmarshalJSON(d []byte) error { - var tmp string - if err := json.Unmarshal(d, &tmp); err != nil { - return err - } - switch tmp { - default: - *o = OpEqual - case "not_equal": - *o = OpNotEqual - case "regex_match": - *o = OpRegexMatch - case "not_regex_match": - *o = OpNotRegexMatch - case "regex_contains": - *o = OpRegexContains - case "not_regex_contains": - *o = OpNotRegexContains - } - - return nil -} diff --git a/backend/util/op_test.go b/backend/util/op_test.go deleted file mode 100644 index 0034456..0000000 --- a/backend/util/op_test.go +++ /dev/null @@ -1,105 +0,0 @@ -// Copyright 2014 The lime Authors. -// Use of this source code is governed by a 2-clause -// BSD-style license that can be found in the LICENSE file. - -package util - -import ( - "encoding/json" - "testing" -) - -func TestUnmarshalJSONError(t *testing.T) { - var o Op - err := o.UnmarshalJSON(nil) - if err == nil { - t.Error("Should have found error trying to unmarshal nil") - } -} - -func TestUnmarshalJSONDefault(t *testing.T) { - var o Op - d, err := json.Marshal("") - if err != nil { - t.Error("Error marshalling JSON", err) - return - } - err = o.UnmarshalJSON(d) - if err != nil { - t.Error("Error unmarshalling JSON") - } -} - -func TestUnmarshalJSON_Not_equal(t *testing.T) { - var o Op - d, err := json.Marshal("not_equal") - if err != nil { - t.Error("Error marshalling JSON", err) - return - } - err = o.UnmarshalJSON(d) - if err != nil { - t.Error("Error unmarshalling JSON") - } -} - -func TestUnmarshalJSON_Regex_match(t *testing.T) { - var o Op - d, err := json.Marshal("regex_match") - if err != nil { - t.Error("Error marshalling JSON", err) - return - } - err = o.UnmarshalJSON(d) - if err != nil { - t.Error("Error unmarshalling JSON") - } -} -func TestUnmarshalJSON_Not_regex_match(t *testing.T) { - var o Op - d, err := json.Marshal("not_regex_match") - if err != nil { - t.Error("Error marshalling JSON", err) - return - } - err = o.UnmarshalJSON(d) - if err != nil { - t.Error("Error unmarshalling JSON") - } -} -func TestUnmarshalJSON_Regex_contains(t *testing.T) { - var o Op - d, err := json.Marshal("regex_contains") - if err != nil { - t.Error("Error marshalling JSON", err) - return - } - err = o.UnmarshalJSON(d) - if err != nil { - t.Error("Error unmarshalling JSON") - } -} -func TestUnmarshalJSON_Not_regex_contains(t *testing.T) { - var o Op - d, err := json.Marshal("not_regex_contains") - if err != nil { - t.Error("Error marshalling JSON", err) - return - } - err = o.UnmarshalJSON(d) - if err != nil { - t.Error("Error unmarshalling JSON") - } -} -func TestUnmarshalJSON_Notequal(t *testing.T) { - var o Op - d, err := json.Marshal("not_equal") - if err != nil { - t.Error("Error marshalling JSON", err) - return - } - err = o.UnmarshalJSON(d) - if err != nil { - t.Error("Error unmarshalling JSON") - } -} diff --git a/backend/util/profile.go b/backend/util/profile.go deleted file mode 100644 index 17d0547..0000000 --- a/backend/util/profile.go +++ /dev/null @@ -1,105 +0,0 @@ -// Copyright 2013 The lime Authors. -// Use of this source code is governed by a 2-clause -// BSD-style license that can be found in the LICENSE file. - -package util - -import ( - "fmt" - "sort" - "sync" - "time" -) - -type ( - ProfileEntry struct { - Calls int - Tottime time.Duration - } - Profiler struct { - mutex sync.Mutex - data map[string]ProfileEntry - } - ProfToken struct { - Name string - start time.Time - } - ProfileResult struct { - Name string - ProfileEntry - } - prsorter struct { - data []ProfileResult - less func(i, j int) bool - } -) - -var Prof = Profiler{data: make(map[string]ProfileEntry)} - -func (p *Profiler) Enter(name string) ProfToken { - return ProfToken{name, time.Now()} -} - -func (pt *ProfToken) Exit() { - Prof.mutex.Lock() - defer Prof.mutex.Unlock() - e := Prof.data[pt.Name] - e.Calls++ - e.Tottime += time.Since(pt.start) - Prof.data[pt.Name] = e -} - -func (ps *prsorter) Less(i, j int) bool { - return ps.less(i, j) -} -func (ps *prsorter) Len() int { - return len(ps.data) -} - -func (ps *prsorter) Swap(i, j int) { - ps.data[i], ps.data[j] = ps.data[j], ps.data[i] -} - -func (p *Profiler) SortByName() []ProfileResult { - ret := p.Results() - sort.Sort(&prsorter{ret, func(i, j int) bool { return ret[i].Name < ret[j].Name }}) - return ret -} - -func (p *Profiler) SortByTotalTime() []ProfileResult { - ret := p.Results() - sort.Sort(&prsorter{ret, func(i, j int) bool { return ret[i].Tottime < ret[j].Tottime }}) - return ret -} - -func (p *Profiler) SortByAvgTime() []ProfileResult { - ret := p.Results() - sort.Sort(&prsorter{ret, func(i, j int) bool { return ret[i].Avg() < ret[j].Avg() }}) - return ret -} - -func (p *Profiler) Results() (ret []ProfileResult) { - p.mutex.Lock() - defer p.mutex.Unlock() - for k, v := range p.data { - ret = append(ret, ProfileResult{k, v}) - } - return ret -} - -func (v *ProfileResult) Avg() time.Duration { - return v.Tottime / time.Duration(v.Calls) -} - -func (v ProfileResult) String() string { - return fmt.Sprintf("%64s %6d, %20s, %20s", v.Name, v.Calls, v.Tottime, v.Avg()) -} - -func (p *Profiler) String() (ret string) { - pr := p.SortByAvgTime() - ret = fmt.Sprintf("%64s %6s, %20s, %20s\n", "Name", "Calls", "Total Time", "Average") - for _, v := range pr { - ret += fmt.Sprintf("%s\n", v) - } - return ret -} diff --git a/backend/util/profile_test.go b/backend/util/profile_test.go deleted file mode 100644 index 90a90a1..0000000 --- a/backend/util/profile_test.go +++ /dev/null @@ -1,120 +0,0 @@ -// Copyright 2014 The lime Authors. -// Use of this source code is governed by a 2-clause -// BSD-style license that can be found in the LICENSE file. - -package util - -import ( - "testing" - "time" -) - -func TestSortByName(t *testing.T) { - Prof.data["A"] = ProfileEntry{Calls: 1, Tottime: time.Duration(5)} - Prof.data["B"] = ProfileEntry{Calls: 1, Tottime: time.Duration(4)} - Prof.data["C"] = ProfileEntry{Calls: 1, Tottime: time.Duration(3)} - Prof.data["D"] = ProfileEntry{Calls: 1, Tottime: time.Duration(2)} - results := Prof.SortByName() - if results[0].Name != "A" { - t.Errorf("TestSortByName expected A, but got %s", results[0].Name) - } - if results[1].Name != "B" { - t.Errorf("TestSortByName expected B, but got %s", results[1].Name) - } - if results[2].Name != "C" { - t.Errorf("TestSortByName expected C, but got %s", results[2].Name) - } - if results[3].Name != "D" { - t.Errorf("TestSortByName expected D, but got %s", results[3].Name) - } -} - -func TestSortByTime(t *testing.T) { - Prof.data["A"] = ProfileEntry{Calls: 1, Tottime: time.Duration(1)} - Prof.data["C"] = ProfileEntry{Calls: 1, Tottime: time.Duration(2)} - Prof.data["D"] = ProfileEntry{Calls: 1, Tottime: time.Duration(3)} - Prof.data["B"] = ProfileEntry{Calls: 1, Tottime: time.Duration(4)} - results := Prof.SortByTotalTime() - if results[0].Name != "A" { - t.Errorf("TestSortByTime expected A, but got %s", results[0].Name) - } - if results[1].Name != "C" { - t.Errorf("TestSortByTime expected C, but got %s", results[1].Name) - } - if results[2].Name != "D" { - t.Errorf("TestSortByTime expected D, but got %s", results[2].Name) - } - if results[3].Name != "B" { - t.Errorf("TestSortByTime expected B, but got %s", results[3].Name) - } -} - -func TestSortByAvgTime(t *testing.T) { - Prof.data["A"] = ProfileEntry{Calls: 1, Tottime: time.Duration(1)} - Prof.data["C"] = ProfileEntry{Calls: 1, Tottime: time.Duration(2)} - Prof.data["D"] = ProfileEntry{Calls: 1, Tottime: time.Duration(3)} - Prof.data["B"] = ProfileEntry{Calls: 1, Tottime: time.Duration(4)} - results := Prof.SortByAvgTime() - if results[0].Name != "A" { - t.Errorf("TestSortByTime expected A, but got %s", results[0].Name) - } - if results[1].Name != "C" { - t.Errorf("TestSortByTime expected C, but got %s", results[1].Name) - } - if results[2].Name != "D" { - t.Errorf("TestSortByTime expected D, but got %s", results[2].Name) - } - if results[3].Name != "B" { - t.Errorf("TestSortByTime expected B, but got %s", results[3].Name) - } -} - -func TestEnter(t *testing.T) { - profiler := &Profiler{} - pt := profiler.Enter("some name") - - if &pt == nil { - t.Errorf("Returned a nil ProfileToken") - } -} - -func TestExit(t *testing.T) { - ptoken := &ProfToken{} - ptoken.Exit() -} - -func TestLess(t *testing.T) { - ps := &prsorter{nil, func(i, j int) bool { - return i < j - }} - result := ps.Less(4, 5) - if !result { - t.Errorf("Less returned incorrect result for 4 < 5") - } -} - -func TestLen(t *testing.T) { - ps := &prsorter{nil, func(i, j int) bool { - return i < j - }} - if ps.Len() != 0 { - t.Errorf("Incorrect length of Data (nil data should be 0 len)") - } -} - -func TestSwap(t *testing.T) { - pr0 := &ProfileResult{"pr1", *&ProfileEntry{}} - pr1 := &ProfileResult{"pr2", *&ProfileEntry{}} - prList := []ProfileResult{*pr0, *pr1} - - ps := &prsorter{prList, func(i, j int) bool { return i < j }} - ps.Swap(0, 1) - - if ps.data[0] != *pr1 || ps.data[1] != *pr0 { - t.Errorf("prsorter swapped incorrectly!") - } -} - -func TestString(t *testing.T) { - Prof.String() -} diff --git a/backend/view.go b/backend/view.go deleted file mode 100644 index a9525dd..0000000 --- a/backend/view.go +++ /dev/null @@ -1,994 +0,0 @@ -// Copyright 2013 The lime Authors. -// Use of this source code is governed by a 2-clause -// BSD-style license that can be found in the LICENSE file. - -package backend - -import ( - "fmt" - "github.com/limetext/lime/backend/log" - "github.com/limetext/lime/backend/packages" - "github.com/limetext/lime/backend/parser" - "github.com/limetext/lime/backend/render" - "github.com/limetext/lime/backend/textmate" - . "github.com/limetext/lime/backend/util" - "github.com/limetext/rubex" - . "github.com/limetext/text" - "io/ioutil" - "os" - "path" - "reflect" - "regexp" - "runtime/debug" - "strings" - "sync" -) - -type ( - // A View provides a view into a specific underlying buffer - // with its own set of selections, settings, viewport, etc. - // Multiple Views can share the same underlying data buffer. - View struct { - HasSettings - HasId - name string - window *Window - buffer Buffer - selection RegionSet - undoStack UndoStack - scratch bool - overwrite bool - cursyntax string - syntax parser.SyntaxHighlighter - regions render.ViewRegionMap - editstack []*Edit - lock sync.Mutex - reparseChan chan parseReq - status map[string]string - } - parseReq struct { - forced bool - } -) - -func newView(w *Window) *View { - ret := &View{window: w, regions: make(render.ViewRegionMap)} - ret.status = make(map[string]string) - ret.loadSettings() - - ret.Settings().AddOnChange("lime.view.syntax", func(name string) { - ret.lock.Lock() - defer ret.lock.Unlock() - - if name != "syntax" { - return - } - syn, _ := ret.Settings().Get("syntax", "").(string) - if syn != ret.cursyntax { - ret.cursyntax = syn - ret.reparse(true) - ret.loadSettings() - } - }) - - ret.reparseChan = make(chan parseReq, 32) - go ret.parsethread() - ret.Settings().Set("is_widget", false) - return ret -} - -func (v *View) setBuffer(b Buffer) error { - if v.buffer != nil { - return fmt.Errorf("There is already a buffer set") - } - v.buffer = b - // TODO(q): Dynamically load the correct syntax file - b.AddObserver(v) - return nil -} - -// BufferObserver - -func (v *View) Erased(changed_buffer Buffer, region_removed Region, data_removed []rune) { - v.flush(region_removed.B, region_removed.A-region_removed.B) -} - -func (v *View) Inserted(changed_buffer Buffer, region_inserted Region, data_inserted []rune) { - v.flush(region_inserted.A, region_inserted.B-region_inserted.A) -} - -// End of Buffer Observer - -// Flush is called every time the underlying buffer is changed. -// It calls Adjust() on all the regions associated with this view, -// triggers the "OnModified" event, and adds a reparse request -// to the parse go-routine. -func (v *View) flush(position, delta int) { - func() { - v.lock.Lock() - defer v.lock.Unlock() - - e := Prof.Enter("view.flush") - defer e.Exit() - // TODO(.): issue #211 - v.selection.Adjust(position, delta) - if v.syntax != nil { - v.syntax.Adjust(position, delta) - } - for k, v2 := range v.regions { - v2.Regions.Adjust(position, delta) - v.regions[k] = v2 - } - }() - OnModified.Call(v) - v.reparse(false) -} - -// parsethread() would be the go-routine used for dealing with reparsing the -// current buffer when it has been modified. Each opened view has its own -// go-routine parsethread() which sits idle and waits for requests to be sent -// on this view's reparseChan. -// -// The Buffer's ChangeCount, as well as the parse request's "forced" attribute -// is used to determined if a parse actually needs to happen or not. -// -// If it is decided that a reparse should take place, a snapshot of the Buffer is -// taken and a parse is performed. Upon completion of this parse operation, -// and if the snapshot of the buffer has not already become outdated, -// then the regions of the view associated with syntax highlighting is updated. -// -// Changes made to the Buffer during the time when there is no accurate -// parse of the buffer is a monkey-patched version of the old syntax highlighting -// regions, which in most instances will be accurate. -// -// See package lime/backend/parser for more details. -func (v *View) parsethread() { - pc := 0 - lastParse := -1 - doparse := func() (ret bool) { - p := Prof.Enter("syntax.parse") - defer p.Exit() - defer func() { - if r := recover(); r != nil { - log.Errorf("Panic in parse thread: %v\n%s", r, string(debug.Stack())) - if pc > 0 { - panic(r) - } - pc++ - } - }() - - b := v.buffer - sub := b.Substr(Region{0, b.Size()}) - - source, _ := v.Settings().Get("syntax", "").(string) - if len(source) == 0 { - return - } - - // TODO: Allow other parsers instead of this hardcoded textmate version - pr, err := textmate.NewLanguageParser(source, sub) - if err != nil { - log.Errorf("Couldn't parse: %v", err) - return - } - - syn, err := parser.NewSyntaxHighlighter(pr) - if err != nil { - log.Errorf("Couldn't create syntaxhighlighter: %v", err) - return - } - - // Only set if it isn't invalid already, otherwise the - // current syntax highlighting will be more accurate - // as it will have had incremental adjustments done to it - if v.buffer.ChangeCount() != lastParse { - return - } - - v.lock.Lock() - defer v.lock.Unlock() - - v.syntax = syn - for k := range v.regions { - if strings.HasPrefix(k, "lime.syntax") { - delete(v.regions, k) - } - } - - for k, v2 := range syn.Flatten() { - if v2.Regions.HasNonEmpty() { - v.regions[k] = v2 - } - } - - return true - } - - v.lock.Lock() - ch := v.reparseChan - v.lock.Unlock() - defer v.cleanup() - if ch == nil { - return - } - - for pr := range ch { - if cc := v.buffer.ChangeCount(); lastParse != cc || pr.forced { - lastParse = cc - if doparse() { - v.Settings().Set("lime.syntax.updated", lastParse) - } - } - } -} - -// Send a reparse request via the reparse channel. -// If "forced" is set to true, then a reparse will be made -// even if the Buffer appears to not have changed. -// -// The actual parsing is done in a separate go-routine, for which the -// "lime.syntax.updated" setting will be set once it has finished. -// -// Note that it's presumed that the function calling this function -// has locked the view! -func (v *View) reparse(forced bool) { - if v.isClosed() { - // No point in issuing a re-parse if the view has been closed - return - } - if len(v.reparseChan) < cap(v.reparseChan) || forced { - v.reparseChan <- parseReq{forced} - } -} - -// Will load view settings respect to current syntax -// e.g if current syntax is Python settings order will be: -// Packages/Python/Python.sublime-settings -// Packages/User/Python.sublime-settings -// -func (v *View) loadSettings() { - syntax := v.Settings().Get("syntax", "").(string) - - if syntax == "" { - v.Settings().SetParent(v.window) - return - } - - defSettings, usrSettings := &HasSettings{}, &HasSettings{} - - defSettings.Settings().SetParent(v.window) - usrSettings.Settings().SetParent(defSettings) - v.Settings().SetParent(usrSettings) - - ed := GetEditor() - if r, err := rubex.Compile(`([A-Za-z]+?)\.(?:[^.]+)$`); err != nil { - log.Error(err) - return - } else if s := r.FindStringSubmatch(syntax); s != nil { - p := path.Join(LIME_PACKAGES_PATH, s[1], s[1]+".sublime-settings") - ed.load(packages.NewPacket(p, defSettings.Settings())) - - p = path.Join(LIME_USER_PACKAGES_PATH, s[1]+".sublime-settings") - ed.load(packages.NewPacket(p, usrSettings.Settings())) - } -} - -// Returns the full concatenated nested scope name at point. -// See package lime/backend/parser for details. -func (v *View) ScopeName(point int) string { - v.lock.Lock() - defer v.lock.Unlock() - if v.syntax != nil { - return v.syntax.ScopeName(point) - } - return "" -} - -// Returns the Region of the innermost scope that contains "point". -// See package lime/backend/parser for details. -func (v *View) ExtractScope(point int) Region { - v.lock.Lock() - defer v.lock.Unlock() - if v.syntax != nil { - return v.syntax.ScopeExtent(point) - } - return Region{} -} - -// ScoreSelector() takes a point and a selector string and returns a score -// as to how good that specific selector matches the scope name at -// that point. -func (v *View) ScoreSelector(point int, selector string) int { - // TODO(.): The algorithm to determine the score has not been compared - // to what ST3 actually does. Not sure if any plugin I personally - // care about uses this functionality, and if it does if it requires - // specific scores to be returned. - // - // The overall implementation should be fine as a higher score is - // returned the more specific a selector is due to the innermost - // scope name being concatenated last in the string returned by ScopeName - if sn := v.ScopeName(point); len(sn) > 0 { - return 1 + strings.Index(sn, selector) - } - return 0 -} - -// Sel() returns a pointer to the RegionSet used by this View -// to mark possibly multiple cursor positions and selection -// regions. -// -// Some quick notes: -// The actual cursor position is always in Region.B. -// Region{0,0} is a cursor at the start of the text (before any characters in the text). -// -// Region{0,1} has the cursor at position 1 (after the first character), -// but also selects/highlights the first character. In this instance Region.A = 0, Region.B = 1, -// Region.Start() returns 0 and Region.End() returns 1. -// -// Region{1,0} has the cursor at position 0 (before the first character), -// but also selects/highlights the first character. Think holding shift and pressing left on your keyboard. -// In this instance Region.A = 1, Region.B = 0, Region.Start() returns 0 and Region.End() returns 1. -// -func (v *View) Sel() *RegionSet { - // BUG(.): Sometimes Sel becomes empty. There should always be at a minimum 1 valid cursor. - return &v.selection -} - -// Returns the window this View belongs to. -func (v *View) Window() *Window { - return v.window -} - -// Returns the underlying Buffer that this View is a view into. -func (v *View) Buffer() Buffer { - return v.buffer -} - -// Inserts text at the given position in the provided edit object. -// Tabs are (sometimes, depending on the View's settings) translated to spaces. -// The return value is the length of the string that was inserted. -func (v *View) Insert(edit *Edit, point int, value string) int { - if t, ok := v.Settings().Get("translate_tabs_to_spaces", false).(bool); ok && t && strings.Contains(value, "\t") { - tab_size, ok := v.Settings().Get("tab_size", 4).(int) - if !ok { - tab_size = 4 - } - - lines := strings.Split(value, "\n") - for i, li := range lines { - for { - idx := strings.Index(li, "\t") - if idx == -1 { - break - } - ai := idx - if i == 0 { - _, col := v.buffer.RowCol(point) - ai = col + 1 - } - add := 1 + ((ai + (tab_size - 1)) &^ (tab_size - 1)) - spaces := "" - for j := ai; j < add; j++ { - spaces += " " - } - li = li[:idx] + spaces + li[idx+1:] - } - lines[i] = li - } - value = strings.Join(lines, "\n") - } - edit.composite.AddExec(NewInsertAction(v.buffer, point, value)) - // TODO(.): I think this should rather be the number of runes inserted? - // The spec states that len() of a string returns the number of bytes, - // which isn't very useful as all other buffer values are IIRC in runes. - // http://golang.org/ref/spec#Length_and_capacity - return len(value) -} - -// Adds an Erase action of the given Region to the provided Edit object. -func (v *View) Erase(edit *Edit, r Region) { - edit.composite.AddExec(NewEraseAction(v.buffer, r)) -} - -// Adds a Replace action of the given Region to the provided Edit object. -func (v *View) Replace(edit *Edit, r Region, value string) { - edit.composite.AddExec(NewReplaceAction(v.buffer, r, value)) -} - -// Creates a new Edit object. Think of it a bit like starting an SQL transaction. -// Another Edit object should not be created before ending the previous one. -// -// TODO(.): Is nesting edits ever valid? Perhaps a nil edit should be returned if the previous wasn't ended? -// What if it will never be ended? Leaving the buffer in a broken state where no more changes can be made to -// it is obviously not good and is the reason why ST3 removed the ability to manually create Edit objects -// to stop people from breaking the undo stack. -func (v *View) BeginEdit() *Edit { - e := newEdit(v) - v.editstack = append(v.editstack, e) - return e -} - -// Ends the given Edit object. -func (v *View) EndEdit(edit *Edit) { - if edit.invalid { - // This happens when nesting Edits and the child Edit ends after the parent edit. - log.Fine("This edit has already been invalidated: %v, %v", edit, v.editstack) - return - } - - // Find the position of this Edit object in this View's Edit stack. - // If plugins, commands, etc are well-behaved the ended edit should be - // last in the stack, but shit happens and we cannot count on this being the case. - i := len(v.editstack) - 1 - for i := len(v.editstack) - 1; i >= 0; i-- { - if v.editstack[i] == edit { - break - } - } - if i == -1 { - // TODO(.): Under what instances does this happen again? - log.Errorf("This edit isn't even in the stack... where did it come from? %v, %v", edit, v.editstack) - return - } - - var selection_modified bool - - if l := len(v.editstack) - 1; i != l { - // TODO(.): See TODO in BeginEdit - log.Errorf("This edit wasn't last in the stack... %d != %d: %v, %v", i, l, edit, v.editstack) - } - - // Invalidate all Edits "below" and including this Edit. - for j := len(v.editstack) - 1; j >= i; j-- { - current_edit := v.editstack[j] - current_edit.invalid = true - sel_same := reflect.DeepEqual(*v.Sel(), current_edit.savedSel) - buf_same := v.buffer.ChangeCount() == current_edit.savedCount - eq := (sel_same && buf_same && current_edit.composite.Len() == 0) - if !eq && !sel_same { - selection_modified = true - } - if v.IsScratch() || current_edit.bypassUndo || eq { - continue - } - switch { - case i == 0: - // Well-behaved, no nested edits! - fallthrough - case j != i: - // BOO! Someone began another Edit without finishing the first one. - // In this instance, the parent Edit ended before the child. - // TODO(.): What would be the correct way to handle this? - v.undoStack.Add(edit) - default: - // BOO! Also poorly-behaved. This Edit object began after the parent began, - // but was finished before the parent finished. - // - // Add it as a child of the parent Edit so that undoing the parent - // will undo this edit as well. - v.editstack[i-1].composite.Add(current_edit) - } - } - // Pop this Edit and all the children off the Edit stack. - v.editstack = v.editstack[:i] - if selection_modified { - OnSelectionModified.Call(v) - } -} - -// Sets the scratch property of the view. -// TODO(.): Couldn't this just be a value in the View's Settings? -func (v *View) SetScratch(s bool) { - v.lock.Lock() - defer v.lock.Unlock() - v.scratch = s -} - -// Checks the scratch property of the view. -// TODO(.): Couldn't this just be a value in the View's Settings? -func (v *View) IsScratch() bool { - v.lock.Lock() - defer v.lock.Unlock() - return v.scratch -} - -// Sets the overwrite status property of the view. -// TODO(.): Couldn't this just be a value in the View's Settings? -func (v *View) OverwriteStatus() bool { - v.lock.Lock() - defer v.lock.Unlock() - return v.overwrite -} - -// Checks the overwrite status property of the view. -// TODO(.): Couldn't this just be a value in the View's Settings? -func (v *View) SetOverwriteStatus(s bool) { - v.lock.Lock() - defer v.lock.Unlock() - v.overwrite = s -} - -// Returns whether the underlying Buffer has any unsaved modifications. -// Note that Scratch buffers are never considered dirty. -func (v *View) IsDirty() bool { - if v.IsScratch() { - return false - } - lastSave, _ := v.Settings().Get("lime.last_save_change_count", -1).(int) - return v.buffer.ChangeCount() != lastSave -} - -func (v *View) FileChanged(filename string) { - log.Finest("Reloading %s", filename) - - if saving, ok := v.Settings().Get("lime.saving", false).(bool); ok && saving { - // This reload was triggered by ourselves saving to this file, so don't reload it - return - } - if !GetEditor().Frontend().OkCancelDialog("File was changed by another program, reload?", "reload") { - return - } - - if d, err := ioutil.ReadFile(filename); err != nil { - log.Errorf("Could not read file: %s\n. Error was: %v", filename, err) - } else { - edit := v.BeginEdit() - end := v.buffer.Size() - v.Replace(edit, Region{0, end}, string(d)) - v.EndEdit(edit) - } -} - -// Saves the file -func (v *View) Save() error { - return v.SaveAs(v.buffer.FileName()) -} - -// Saves the file to the specified filename -func (v *View) SaveAs(name string) (err error) { - log.Fine("SaveAs(%s)", name) - v.Settings().Set("lime.saving", true) - defer v.Settings().Erase("lime.saving") - var atomic bool - OnPreSave.Call(v) - if atomic, _ = v.Settings().Get("atomic_save", true).(bool); v.buffer.FileName() == "" || !atomic { - if err := v.nonAtomicSave(name); err != nil { - return err - } - } else { - n, err := ioutil.TempDir(path.Dir(v.buffer.FileName()), "lime") - if err != nil { - return err - } - tmpf := path.Join(n, "tmp") - if err := v.nonAtomicSave(tmpf); err != nil { - return err - } - if err := os.Rename(tmpf, name); err != nil { - // When we want to save as a file in another directory - // we can't go with os.Rename so we need to force - // not atomic saving sometimes as 4th test in TestSaveAsOpenFile - if err := v.nonAtomicSave(name); err != nil { - return err - } - } - if err := os.RemoveAll(n); err != nil { - return err - } - } - - ed := GetEditor() - if fn := v.buffer.FileName(); fn != name { - v.buffer.SetFileName(name) - if fn != "" { - ed.UnWatch(fn, v) - } - ed.Watch(name, v) - } - - v.Settings().Set("lime.last_save_change_count", v.buffer.ChangeCount()) - OnPostSave.Call(v) - return nil -} - -func (v *View) nonAtomicSave(name string) error { - data := []byte(v.buffer.Substr(Region{0, v.buffer.Size()})) - if err := ioutil.WriteFile(name, data, 0644); err != nil { - return err - } - return nil -} - -// Returns the CommandHistory entry at the given relative index. -// -// When "modifying_only" is set to true, only commands that actually changed -// the Buffer in some way (as opposed to just moving the cursor around) are counted as -// an index. That would be a "hard" command as it is referred to in UndoStack.Undo. -func (v *View) CommandHistory(idx int, modifying_only bool) (name string, args Args, count int) { - // TODO(.): merge history when possible - if i := v.undoStack.index(idx, modifying_only); i != -1 { - e := v.undoStack.actions[i] - return e.command, e.args, 1 - } - return "", nil, 0 -} - -func (v *View) runCommand(cmd TextCommand, name string) error { - e := v.BeginEdit() - e.command = name - // e.args = args - e.bypassUndo = cmd.BypassUndo() - - defer func() { - v.EndEdit(e) - if r := recover(); r != nil { - log.Errorf("Paniced while running text command %s %v: %v\n%s", name, cmd, r, string(debug.Stack())) - } - }() - p := Prof.Enter("view.cmd." + name) - defer p.Exit() - return cmd.Run(v, e) -} - -// AddRegions lets users mark text regions in a view with a scope name, gutter icon and ViewRegionflags -// which are then optionally used to alter the display of those regions. -// -// Typical uses would be to draw squiggly lines under misspelled words, show an icon in the gutter to -// indicate a breakpoint, keeping track of snippet or auto-completion fields, highlight code compilation -// warnings, etc. -// -// The regions will be automatically adjusted as appropriate when the underlying buffer is changed. -func (v *View) AddRegions(key string, regions []Region, scope, icon string, flags render.ViewRegionFlags) { - vr := render.ViewRegions{Scope: scope, Icon: icon, Flags: flags} - vr.Regions.AddAll(regions) - - v.lock.Lock() - defer v.lock.Unlock() - v.regions[key] = vr -} - -// Returns the Regions associated with the given key. -func (v *View) GetRegions(key string) (ret []Region) { - v.lock.Lock() - defer v.lock.Unlock() - vr := v.regions[key] - rs := vr.Regions.Regions() - ret = make([]Region, len(rs)) - copy(ret, rs) - return -} - -// Removes the Regions associated with the given key from the view. -func (v *View) EraseRegions(key string) { - v.lock.Lock() - defer v.lock.Unlock() - delete(v.regions, key) -} - -// Returns the UndoStack of this view. Tread lightly. -func (v *View) UndoStack() *UndoStack { - return &v.undoStack -} - -// Transform() takes a ColourScheme and a viewport and returns a Recipe suitable -// for rendering the contents of this View that is visible in that viewport. -func (v *View) Transform(scheme render.ColourScheme, viewport Region) render.Recipe { - pe := Prof.Enter("view.Transform") - defer pe.Exit() - v.lock.Lock() - defer v.lock.Unlock() - if v.syntax == nil { - return nil - } - rr := make(render.ViewRegionMap) - for k, v := range v.regions { - rr[k] = *v.Clone() - } - rs := render.ViewRegions{Flags: render.SELECTION} - rs.Regions.AddAll(v.selection.Regions()) - rr["lime.selection"] = rs - return render.Transform(scheme, rr, viewport) -} - -func (v *View) cleanup() { - v.lock.Lock() - defer v.lock.Unlock() - - // TODO(.): There can be multiple views into a single Buffer, - // need to do some reference counting to see when it should be - // closed - v.buffer.Close() - v.buffer = nil -} - -func (v *View) isClosed() bool { - return v.reparseChan == nil -} - -// Initiate the "close" operation of this view. -// Returns "true" if the view was closed. Otherwise returns "false". -func (v *View) Close() bool { - OnPreClose.Call(v) - if v.IsDirty() { - close_anyway := GetEditor().Frontend().OkCancelDialog("File has been modified since last save, close anyway?", "Close") - if !close_anyway { - return false - } - } - if n := v.buffer.FileName(); n != "" { - GetEditor().UnWatch(n, v) - } - - // Call the event first while there's still access possible to the underlying - // buffer - OnClose.Call(v) - - v.window.remove(v) - - // Closing the reparseChan, and setting to nil will eventually clean up other resources - // when the parseThread exits - v.lock.Lock() - defer v.lock.Unlock() - close(v.reparseChan) - v.reparseChan = nil - - return true -} - -const ( - CLASS_WORD_START = 1 << iota - CLASS_WORD_END - CLASS_PUNCTUATION_START - CLASS_PUNCTUATION_END - CLASS_SUB_WORD_START - CLASS_SUB_WORD_END - CLASS_LINE_START - CLASS_LINE_END - CLASS_EMPTY_LINE - CLASS_MIDDLE_WORD - CLASS_WORD_START_WITH_PUNCTUATION - CLASS_WORD_END_WITH_PUNCTUATION - CLASS_OPENING_PARENTHESIS - CLASS_CLOSING_PARENTHESIS - - DEFAULT_SEPARATORS = "[!\"#$%&'()*+,\\-./:;<=>?@\\[\\\\\\]^`{|}~]" -) - -// Classifies point, returning a bitwise OR of zero or more of defined flags -func (v *View) Classify(point int) (res int) { - var a, b string = "", "" - ws := v.Settings().Get("word_separators", DEFAULT_SEPARATORS).(string) - if point > 0 { - a = v.buffer.Substr(Region{point - 1, point}) - } - if point < v.buffer.Size() { - b = v.buffer.Substr(Region{point, point + 1}) - } - - // Out of range - if v.buffer.Size() == 0 || point < 0 || point > v.buffer.Size() { - res = 3520 - return - } - - // If before and after the point are separators return 0 - if re, err := rubex.Compile(ws); err != nil { - log.Error(err) - } else if a == b && re.MatchString(a) { - res = 0 - return - } - - // SubWord start & end - if re, err := rubex.Compile("[A-Z]"); err != nil { - log.Error(err) - } else { - if re.MatchString(b) && !re.MatchString(a) { - res |= CLASS_SUB_WORD_START - res |= CLASS_SUB_WORD_END - } - } - if a == "_" && b != "_" { - res |= CLASS_SUB_WORD_START - } - if b == "_" && a != "_" { - res |= CLASS_SUB_WORD_END - } - - // Punc start & end - if re, err := rubex.Compile(ws); err != nil { - log.Error(err) - } else { - // Why ws != ""? See https://github.com/limetext/rubex/issues/2 - if ((re.MatchString(b) && ws != "") || b == "") && !(re.MatchString(a) && ws != "") { - res |= CLASS_PUNCTUATION_START - } - if ((re.MatchString(a) && ws != "") || a == "") && !(re.MatchString(b) && ws != "") { - res |= CLASS_PUNCTUATION_END - } - // Word start & end - if re1, err := rubex.Compile("\\w"); err != nil { - log.Error(err) - } else if re2, err := rubex.Compile("\\s"); err != nil { - log.Error(err) - } else { - if re1.MatchString(b) && ((re.MatchString(a) && ws != "") || re2.MatchString(a) || a == "") { - res |= CLASS_WORD_START - } - if re1.MatchString(a) && ((re.MatchString(b) && ws != "") || re2.MatchString(b) || b == "") { - res |= CLASS_WORD_END - } - } - } - - // Line start & end - if a == "\n" || a == "" { - res |= CLASS_LINE_START - } - if b == "\n" || b == "" { - res |= CLASS_LINE_END - if ws == "" { - res |= CLASS_WORD_END - } - } - - // Empty line - if (a == "\n" && b == "\n") || (a == "" && b == "") { - res |= CLASS_EMPTY_LINE - } - // Middle word - if re, err := rubex.Compile("\\w"); err != nil { - log.Error(err) - } else { - if re.MatchString(a) && re.MatchString(b) { - res |= CLASS_MIDDLE_WORD - } - } - - // Word start & end with punc - if re, err := rubex.Compile("\\s"); err != nil { - log.Error(err) - } else { - if (res&CLASS_PUNCTUATION_START != 0) && (re.MatchString(a) || a == "") { - res |= CLASS_WORD_START_WITH_PUNCTUATION - } - if (res&CLASS_PUNCTUATION_END != 0) && (re.MatchString(b) || b == "") { - res |= CLASS_WORD_END_WITH_PUNCTUATION - } - } - - // Openning & closing parentheses - if re, err := rubex.Compile("[(\\[{]"); err != nil { - log.Error(err) - } else { - if re.MatchString(a) || re.MatchString(b) { - res |= CLASS_OPENING_PARENTHESIS - } - } - if re, err := rubex.Compile("[)\\]}]"); err != nil { - log.Error(err) - } else { - if re.MatchString(a) || re.MatchString(b) { - res |= CLASS_CLOSING_PARENTHESIS - } - } - // TODO: isn't this a bug? what's the relation between - // ',' and parentheses - if a == "," { - res |= CLASS_OPENING_PARENTHESIS - } - if b == "," { - res |= CLASS_CLOSING_PARENTHESIS - } - - return -} - -// Finds the next location after point that matches the given classes -// Searches backward if forward is false -func (v *View) FindByClass(point int, forward bool, classes int) int { - i := -1 - if forward { - i = 1 - } - size := v.buffer.Size() - // Sublime doesn't consider initial point even if it matches. - for p := point + i; ; p += i { - if p <= 0 { - return 0 - } - if p >= size { - return size - } - if v.Classify(p)&classes != 0 { - return p - } - } -} - -// Expands the selection until the point on each side matches the given classes -func (v *View) ExpandByClass(r Region, classes int) Region { - // Sublime doesn't consider the points the region starts on. - // If not already on edge of buffer, expand by 1 in both directions. - a := r.A - if a > 0 { - a -= 1 - } else if a < 0 { - a = 0 - } - - b := r.B - size := v.buffer.Size() - if b < size { - b += 1 - } else if b > size { - b = size - } - - for ; a > 0 && (v.Classify(a)&classes == 0); a -= 1 { - } - for ; b < size && (v.Classify(b)&classes == 0); b += 1 { - } - return Region{a, b} -} - -const ( - LITERAL = 1 << iota - IGNORECASE -) - -func (v *View) Find(pat string, pos int, flags int) Region { - r := Region{pos, v.buffer.Size()} - s := v.buffer.Substr(r) - - if flags&LITERAL != 0 { - pat = "\\Q" + pat - } - if flags&IGNORECASE != 0 { - pat = "(?im)" + pat - } else { - pat = "(?m)" + pat - } - // Using regexp instead of rubex because rubex doesn't - // support flag for treating pattern as a literal text - if re, err := regexp.Compile(pat); err != nil { - log.Error(err) - } else if loc := re.FindStringIndex(s); loc != nil { - return Region{pos + loc[0], pos + loc[1]} - } - return Region{-1, -1} -} - -func (v *View) Status() map[string]string { - m := make(map[string]string) - v.lock.Lock() - defer v.lock.Unlock() - - for k, v := range v.status { - m[k] = v - } - return m -} - -func (v *View) SetStatus(key string, val string) { - v.lock.Lock() - defer v.lock.Unlock() - v.status[key] = val -} - -func (v *View) GetStatus(key string) string { - v.lock.Lock() - defer v.lock.Unlock() - return v.status[key] -} - -func (v *View) EraseStatus(key string) { - v.lock.Lock() - defer v.lock.Unlock() - delete(v.status, key) -} - -func (v *View) SetSyntaxFile(file string) { - v.Settings().Set("syntax", file) -} diff --git a/backend/view_test.go b/backend/view_test.go deleted file mode 100644 index 037eb67..0000000 --- a/backend/view_test.go +++ /dev/null @@ -1,1079 +0,0 @@ -// Copyright 2013 The lime Authors. -// Use of this source code is governed by a 2-clause -// BSD-style license that can be found in the LICENSE file. - -package backend - -import ( - "fmt" - "github.com/limetext/lime/backend/textmate" - "github.com/limetext/lime/backend/util" - "github.com/limetext/text" - "io/ioutil" - "math/rand" - "os" - "reflect" - "sync" - "testing" - "time" -) - -func TestView(t *testing.T) { - w := GetEditor().NewWindow() - defer w.Close() - - v := w.NewFile() - defer func() { - v.SetScratch(true) - v.Close() - }() - - edit := v.BeginEdit() - v.Insert(edit, 0, "abcd") - v.EndEdit(edit) - v.selection.Clear() - r := []text.Region{ - {A: 0, B: 0}, - {A: 1, B: 1}, - {A: 2, B: 2}, - {A: 3, B: 3}, - } - for _, r2 := range r { - v.selection.Add(r2) - } - - edit = v.BeginEdit() - for _, ins := range "1234" { - for i := 0; i < v.selection.Len(); i++ { - v.Insert(edit, v.selection.Get(i).Begin(), string(ins)) - } - } - v.EndEdit(edit) - - if d := v.buffer.Substr(text.Region{A: 0, B: v.buffer.Size()}); d != "1234a1234b1234c1234d" { - t.Error(d) - } - v.undoStack.Undo(true) - if d := v.buffer.Substr(text.Region{A: 0, B: v.buffer.Size()}); d != "abcd" { - t.Error("expected 'abcd', but got: ", d) - } - v.undoStack.Redo(true) - if d := v.buffer.Substr(text.Region{A: 0, B: v.buffer.Size()}); d != "1234a1234b1234c1234d" { - t.Error("expected '1234a1234b1234c1234d', but got: ", d) - } - - v.selection.Clear() - r = []text.Region{ - {A: 0, B: 0}, - {A: 5, B: 5}, - {A: 10, B: 10}, - {A: 15, B: 15}, - } - for _, r2 := range r { - v.selection.Add(r2) - } - - edit = v.BeginEdit() - for _, ins := range []string{"hello ", "world"} { - for i := 0; i < v.selection.Len(); i++ { - v.Insert(edit, v.selection.Get(i).Begin(), ins) - } - } - v.EndEdit(edit) - - if d := v.buffer.Substr(text.Region{A: 0, B: v.buffer.Size()}); d != "hello world1234ahello world1234bhello world1234chello world1234d" { - t.Error(d) - } - v.undoStack.Undo(true) - - if d := v.buffer.Substr(text.Region{A: 0, B: v.buffer.Size()}); d != "1234a1234b1234c1234d" { - t.Error("expected '1234a1234b1234c1234d', but got: ", d) - } - v.undoStack.Undo(true) - if d := v.buffer.Substr(text.Region{A: 0, B: v.buffer.Size()}); d != "abcd" { - t.Error("expected 'abcd', but got: ", d) - } - v.undoStack.Undo(true) - if d := v.buffer.Substr(text.Region{A: 0, B: v.buffer.Size()}); d != "" { - t.Error("expected '', but got: ", d) - } - v.undoStack.Redo(true) - if d := v.buffer.Substr(text.Region{A: 0, B: v.buffer.Size()}); d != "abcd" { - t.Error("expected 'abcd', but got: ", d) - } - - v.undoStack.Redo(true) - if d := v.buffer.Substr(text.Region{A: 0, B: v.buffer.Size()}); d != "1234a1234b1234c1234d" { - t.Error("expected '1234a1234b1234c1234d', but got: ", d) - } - - v.undoStack.Redo(true) - if d := v.buffer.Substr(text.Region{A: 0, B: v.buffer.Size()}); d != "hello world1234ahello world1234bhello world1234chello world1234d" { - t.Error(d) - } -} - -func TestErase(t *testing.T) { - w := GetEditor().NewWindow() - defer w.Close() - - v := w.NewFile() - defer func() { - v.SetScratch(true) - v.Close() - }() - - s := v.Sel() - - edit := v.BeginEdit() - v.Insert(edit, 0, "1234abcd5678abcd") - v.EndEdit(edit) - s.Clear() - v.Sel().Add(text.Region{A: 4, B: 8}) - v.Sel().Add(text.Region{A: 12, B: 16}) - - edit = v.BeginEdit() - for i := 0; i < s.Len(); i++ { - v.Erase(edit, s.Get(i)) - } - v.EndEdit(edit) - if !reflect.DeepEqual(s.Regions(), []text.Region{{A: 4, B: 4}, {A: 8, B: 8}}) { - t.Error(s) - } - if d := v.buffer.Substr(text.Region{A: 0, B: v.buffer.Size()}); d != "12345678" { - t.Error(d) - } -} - -// This is not 100% what ST3 does -func TestExtractScope(t *testing.T) { - w := GetEditor().NewWindow() - defer w.Close() - - v := w.NewFile() - defer func() { - v.SetScratch(true) - v.Close() - }() - - const ( - in = "textmate/testdata/main.go" - expfile = "testdata/scoperange.res" - syntax = "textmate/testdata/Go.tmLanguage" - ) - v.Settings().Set("syntax", syntax) - if d, err := ioutil.ReadFile(in); err != nil { - t.Fatal(err) - } else { - // v.rootNode = nil - e := v.BeginEdit() - v.Insert(e, 0, string(d)) - v.EndEdit(e) - last := text.Region{A: -1, B: -1} - str := "" - nr := text.Region{A: 0, B: 0} - for v.ExtractScope(1) == nr { - time.Sleep(time.Millisecond) - } - for i := 0; i < v.buffer.Size(); i++ { - if r := v.ExtractScope(i); r != last { - str += fmt.Sprintf("%d (%d, %d)\n", i, r.A, r.B) - last = r - } - } - if d, err := ioutil.ReadFile(expfile); err != nil { - if err := ioutil.WriteFile(expfile, []byte(str), 0644); err != nil { - t.Error(err) - } - } else if diff := util.Diff(string(d), str); diff != "" { - t.Error(diff) - } - } -} - -// This is not 100% what ST3 does, but IMO ST3 is wrong -func TestScopeName(t *testing.T) { - w := GetEditor().NewWindow() - defer w.Close() - - v := w.NewFile() - defer func() { - v.SetScratch(true) - v.Close() - }() - - const ( - in = "textmate/testdata/main.go" - expfile = "testdata/scopename.res" - syntax = "textmate/testdata/Go.tmLanguage" - ) - v.Settings().Set("syntax", syntax) - if d, err := ioutil.ReadFile(in); err != nil { - t.Fatal(err) - } else { - // v.rootNode = nil - e := v.BeginEdit() - v.Insert(e, 0, string(d)) - v.EndEdit(e) - last := "" - str := "" - lasti := 0 - for v.ScopeName(1) == "" { - time.Sleep(250 * time.Millisecond) - } - for i := 0; i < v.buffer.Size(); i++ { - if name := v.ScopeName(i); name != last { - if last != "" { - str += fmt.Sprintf("%d-%d: %s\n", lasti, i, last) - lasti = i - } - last = name - } - } - if i := v.Buffer().Size(); lasti != i { - str += fmt.Sprintf("%d-%d: %s\n", lasti, i, last) - } - if d, err := ioutil.ReadFile(expfile); err != nil { - if err := ioutil.WriteFile(expfile, []byte(str), 0644); err != nil { - t.Error(err) - } - } else if diff := util.Diff(string(d), str); diff != "" { - t.Error(diff) - } - } -} - -func TestStress(t *testing.T) { - if testing.Short() { - t.SkipNow() - } - ed := GetEditor() - w := ed.NewWindow() - defer w.Close() - - v := w.OpenFile("../frontend/termbox/main.go", 0) - defer func() { - v.SetScratch(true) - v.Close() - }() - - syntax := "../packages/go.tmbundle/Syntaxes/Go.tmLanguage" - v.Settings().Set("syntax", syntax) - for i := 0; i < 1000; i++ { - e := v.BeginEdit() - for i := 0; i < 100; i++ { - v.Insert(e, 0, "h") - } - for i := 0; i < 100; i++ { - v.Erase(e, text.Region{A: 0, B: 1}) - } - v.EndEdit(e) - } -} - -func TestTransform(t *testing.T) { - w := GetEditor().NewWindow() - defer w.Close() - - v := w.NewFile() - defer func() { - v.SetScratch(true) - v.Close() - }() - - sc, err := textmate.LoadTheme("../packages/themes/TextMate-Themes/GlitterBomb.tmTheme") - if err != nil { - t.Fatal(err) - } - - d, err := ioutil.ReadFile("view.go") - if err != nil { - t.Fatal(err) - } - e := v.BeginEdit() - v.Insert(e, 0, string(d)) - v.EndEdit(e) - - if v.Transform(sc, text.Region{A: 0, B: 100}) != nil { - t.Error("Expected view.Transform return nil when the syntax isn't set yet") - } - - v.Settings().Set("syntax", "textmate/testdata/Go.tmLanguage") - - time.Sleep(time.Second) - a := v.Transform(sc, text.Region{A: 0, B: 100}).Transcribe() - v.Transform(sc, text.Region{A: 100, B: 200}).Transcribe() - c := v.Transform(sc, text.Region{A: 0, B: 100}).Transcribe() - if !reflect.DeepEqual(a, c) { - t.Errorf("not equal:\n%v\n%v", a, c) - } -} - -func BenchmarkTransformTranscribe(b *testing.B) { - b.StopTimer() - w := GetEditor().NewWindow() - defer w.Close() - - v := w.NewFile() - - defer func() { - v.SetScratch(true) - v.Close() - }() - - sc, err := textmate.LoadTheme("../packages/themes/TextMate-Themes/GlitterBomb.tmTheme") - if err != nil { - b.Fatal(err) - } - - v.Settings().Set("syntax", "textmate/testdata/Go.tmLanguage") - - d, err := ioutil.ReadFile("view.go") - if err != nil { - b.Fatal(err) - } - var wg sync.WaitGroup - wg.Add(1) - v.Settings().AddOnChange("benchmark", func(key string) { - if key == "lime.syntax.updated" { - wg.Done() - } - }) - e := v.BeginEdit() - v.Insert(e, 0, string(d)) - v.EndEdit(e) - wg.Wait() - b.StartTimer() - for i := 0; i < b.N; i++ { - v.Transform(sc, text.Region{A: 0, B: v.Buffer().Size()}).Transcribe() - } - fmt.Println(util.Prof.String()) -} - -func TestSaveAsNewFile(t *testing.T) { - tests := []struct { - text string - atomic bool - file string - }{ - { - "abc", - false, - "testdata/test", - }, - { - "abc", - true, - "testdata/test", - }, - } - - w := GetEditor().NewWindow() - defer w.Close() - - for i, test := range tests { - v := w.NewFile() - - v.Settings().Set("atomic_save", test.atomic) - - e := v.BeginEdit() - - v.Insert(e, 0, test.text) - v.EndEdit(e) - if err := v.SaveAs(test.file); err != nil { - t.Fatalf("Test %d: Can't save to `%s`: %s", i, test.file, err) - } - - if v.IsDirty() { - t.Errorf("Test %d: Expected the view to be clean, but it wasn't", i) - } - - data, err := ioutil.ReadFile(test.file) - if err != nil { - t.Fatalf("Test %d: Can't read `%s`: %s", i, test.file, err) - } - if string(data) != test.text { - t.Errorf("Test %d: Expected `%s` contain %s, but got %s", i, test.file, test.text, data) - } - - v.Close() - - if err = os.Remove(test.file); err != nil { - t.Errorf("Test %d: Couldn't remove test file %s", i, test.file) - } - } -} - -func TestSaveAsOpenFile(t *testing.T) { - var testfile string = "testdata/Default.sublime-settings" - - buf, err := ioutil.ReadFile(testfile) - if err != nil { - t.Fatalf("Can't read test file `%s`: %s", testfile, err) - } - - tests := []struct { - atomic bool - as string - }{ - { - true, - "User.sublime-settings", - }, - { - true, - "testdata/User.sublime-settings", - }, - { - true, - "../User.sublime-settings", - }, - { - true, - os.TempDir() + "/User.sublime-settings", - }, - { - false, - "User.sublime-settings", - }, - { - false, - "testdata/User.sublime-settings", - }, - } - - w := GetEditor().NewWindow() - defer w.Close() - - for i, test := range tests { - v := w.OpenFile(testfile, 0) - - v.Settings().Set("atomic_save", test.atomic) - if err := v.SaveAs(test.as); err != nil { - t.Fatalf("Test %d: Can't save to `%s`: %s", i, test.as, err) - } - - if v.IsDirty() { - t.Errorf("Test %d: Expected the view to be clean, but it wasn't", i) - } - - if _, err := os.Stat(test.as); os.IsNotExist(err) { - t.Fatalf("Test %d: The file `%s` wasn't created", i, test.as) - } - - data, err := ioutil.ReadFile(test.as) - if err != nil { - t.Fatalf("Test %d: Can't read `%s`: %s", i, test.as, err) - } - if string(data) != string(buf) { - t.Errorf("Test %d: Expected `%s` contain %s, but got %s", i, test.as, string(buf), data) - } - - v.Close() - - if err := os.Remove(test.as); err != nil { - t.Errorf("Test %d: Couldn't remove test file %s", i, test.as) - } - } -} - -func TestClassify(t *testing.T) { - tests := []struct { - text string - points []int - expect []int - }{ - { - "", - []int{0, 10}, - []int{3520, 3520}, - }, - { - "abc Hi -test lime,te-xt\n\tclassify test-ing", - []int{0, 4, 5, 6, 7, 8, 13, 17, 18, 20, 21, 23, 24, 25, 34, 38, 39, 42}, - []int{73, 49, 512, 2, 1028, 9, 1, 8198, 4105, 6, 9, 130, 64, 1, 1, 6, 9, 134}, - }, - { - "(tes)ting cl][assify\n\npare(,,)nthe\\ses\n\t\n// Use", - []int{0, 4, 12, 13, 14, 20, 21, 22, 26, 27, 28, 29, 30, 34, 35, 39, 40, 41, 42, 43, 44, 47}, - []int{5188, 8198, 8198, 12288, 4105, 130, 448, 65, 4102, 12288, 0, 12288, 8201, 6, 9, 64, 128, 1092, 0, 2056, 49, 134}, - }, - { - "view__classify", - []int{4, 5, 6}, - []int{544, 512, 528}, - }, - } - - w := GetEditor().NewWindow() - defer w.Close() - - for i, test := range tests { - v := w.NewFile() - defer func() { - v.SetScratch(true) - v.Close() - }() - - e := v.BeginEdit() - v.Insert(e, 0, test.text) - v.EndEdit(e) - for j, point := range test.points { - if res := v.Classify(point); test.expect[j] != res { - t.Errorf("Test %d: Expected %d from view.Classify(%d) but, got %d", i, test.expect[j], point, res) - } - } - } -} - -func TestFindByClass(t *testing.T) { - tests := []struct { - text string - point int - forward bool - classes int - expect int - }{ - { - "abc Hi -test lime", - 1, - true, - CLASS_PUNCTUATION_START, - 7, - }, - { - "abc Hi -test lime", - 8, - true, - CLASS_PUNCTUATION_START, - 17, - }, - { - "abc Hi -test lime", - 5, - true, - CLASS_WORD_START, - 8, - }, - { - "abc Hi -test lime", - 5, - false, - CLASS_EMPTY_LINE, - 0, - }, - { - "abc Hi -test lime", - 9, - false, - CLASS_SUB_WORD_START, - 4, - }, - { - "abc Hi -test lime", - 9, - false, - CLASS_WORD_END | CLASS_PUNCTUATION_END, - 8, - }, - { - "abc Hi -test lime", - 0, - true, - CLASS_WORD_START | CLASS_WORD_END, - 3, - }, - } - - w := GetEditor().NewWindow() - defer w.Close() - - for i, test := range tests { - v := w.NewFile() - defer func() { - v.SetScratch(true) - v.Close() - }() - - e := v.BeginEdit() - v.Insert(e, 0, test.text) - v.EndEdit(e) - if res := v.FindByClass(test.point, test.forward, test.classes); res != test.expect { - t.Errorf("Test %d: Expected %d from view.FindByClass but, got %d", i, test.expect, res) - } - } -} - -func TestExpandByClass(t *testing.T) { - tests := []struct { - text string - start text.Region - classes int - expect text.Region - }{ - { - "abc Hi -test lime", - text.Region{A: 1, B: 2}, - CLASS_WORD_START, - text.Region{A: 0, B: 4}, - }, - { - "abc Hi -test lime", - text.Region{A: 8, B: 10}, - CLASS_WORD_START | CLASS_WORD_END, - text.Region{A: 6, B: 12}, - }, - { - "abc Hi -test lime", - text.Region{A: 12, B: 14}, - CLASS_PUNCTUATION_START, - text.Region{A: 7, B: 17}, - }, - { - "abc Hi -test lime", - text.Region{A: 12, B: 14}, - CLASS_PUNCTUATION_END, - text.Region{A: 8, B: 17}, - }, - { - "abc Hi -test lime", - text.Region{A: 9, B: 11}, - CLASS_WORD_START | CLASS_WORD_END, - text.Region{A: 8, B: 12}, - }, - { - "abc Hi -test lime", - text.Region{A: -1, B: 20}, - CLASS_WORD_START, - text.Region{A: 0, B: 17}, - }, - } - - w := GetEditor().NewWindow() - defer w.Close() - - for i, test := range tests { - v := w.NewFile() - defer func() { - v.SetScratch(true) - v.Close() - }() - - e := v.BeginEdit() - v.Insert(e, 0, test.text) - v.EndEdit(e) - if res := v.ExpandByClass(test.start, test.classes); res != test.expect { - t.Errorf("Test %d: Expected %v from view.ExpandByClass, but got %v", i, test.expect, res) - } - } -} - -func TestSetBuffer(t *testing.T) { - var w Window - - v := newView(&w) - defer func() { - v.SetScratch(true) - v.Close() - }() - - b := text.NewBuffer() - b.SetName("test") - - _ = v.setBuffer(b) - - if v.buffer.Name() != b.Name() { - t.Errorf("Expected buffer called %s, but got %s", b.Name(), v.buffer.Name()) - } -} - -func TestSetBufferTwice(t *testing.T) { - var w Window - - v := newView(&w) - defer func() { - v.SetScratch(true) - v.Close() - }() - - b1 := text.NewBuffer() - b1.SetName("test1") - - _ = v.setBuffer(b1) - - b2 := text.NewBuffer() - b2.SetName("test2") - - err := v.setBuffer(b2) - - if err == nil { - t.Errorf("Expected setting the second buffer to cause an error, but it didn't.") - } - - if v.buffer.Name() != b1.Name() { - t.Errorf("Expected buffer called %s, but got %s", b1.Name(), v.buffer.Name()) - } -} - -func TestWindow(t *testing.T) { - w := GetEditor().NewWindow() - defer w.Close() - - v := w.NewFile() - defer func() { - v.SetScratch(true) - v.Close() - }() - - if v.Window() != w { - t.Errorf("Expected the set window to be the one that spawned the view, but it isn't.") - } -} - -func TestSetScratch(t *testing.T) { - w := GetEditor().NewWindow() - defer w.Close() - - v := w.NewFile() - defer func() { - v.SetScratch(true) - v.Close() - }() - - def := v.IsScratch() - - v.SetScratch(!def) - - if v.IsScratch() == def { - t.Errorf("Expected the view to be scratch = %v, but it was %v", !def, v.IsScratch()) - } -} - -func TestSetOverwriteStatus(t *testing.T) { - w := GetEditor().NewWindow() - defer w.Close() - - v := w.NewFile() - defer func() { - v.SetScratch(true) - v.Close() - }() - - def := v.OverwriteStatus() - - v.SetOverwriteStatus(!def) - - if v.OverwriteStatus() == def { - t.Errorf("Expected the view to be overwrite = %v, but it was %v", !def, v.OverwriteStatus()) - } -} - -func TestIsDirtyWhenScratch(t *testing.T) { - w := GetEditor().NewWindow() - defer w.Close() - - v := w.NewFile() - defer v.Close() - - v.SetScratch(true) - - if v.IsDirty() { - t.Errorf("Expected the view not to be marked as dirty, but it was") - } -} - -func TestIsDirtyWhenClean(t *testing.T) { - w := GetEditor().NewWindow() - defer w.Close() - - v := w.OpenFile("testdata/Default.sublime-keymap", 0) - defer v.Close() - - v.Save() - - if v.IsDirty() { - t.Errorf("Expected the view not to be marked as dirty, but it was") - } -} - -func TestIsDirtyWhenDirty(t *testing.T) { - w := GetEditor().NewWindow() - defer w.Close() - - v := w.NewFile() - defer func() { - v.SetScratch(true) - v.Close() - }() - - v.SetScratch(false) - v.buffer.Insert(0, "test") - - if !v.IsDirty() { - t.Errorf("Expected the view to be marked as dirty, but it wasn't") - } -} - -func TestCloseView(t *testing.T) { - w := GetEditor().NewWindow() - defer w.Close() - - l := len(w.Views()) - - v := w.OpenFile("testdata/Default.sublime-keymap", 0) - - v.Save() - v.Close() - - if len(w.Views()) != l { - t.Errorf("Expected %d views, but got %d", l, len(w.Views())) - } -} - -func TestCloseView2(t *testing.T) { - const testfile = "testdata/Default.sublime-keymap" - fe := GetEditor().Frontend() - if dfe, ok := fe.(*DummyFrontend); ok { - // Make it trigger a reload - dfe.SetDefaultAction(true) - } - - // Make sure a closed view isn't reloaded after it has been closed - w := GetEditor().NewWindow() - defer w.Close() - - v := w.OpenFile(testfile, 0) - - v.SetScratch(true) - v.Close() - - if data, err := ioutil.ReadFile(testfile); err != nil { - t.Errorf("Couldn't load file: %s", err) - return - } else if err = ioutil.WriteFile(testfile, data, 0644); err != nil { - t.Errorf("Couldn't save file: %s", err) - return - } -} - -func TestViewLoadSettings(t *testing.T) { - GetEditor().loadSettings() - - w := GetEditor().NewWindow() - defer w.Close() - - v := w.NewFile() - defer func() { - v.SetScratch(true) - v.Close() - }() - - if v.Settings().Get("translate_tabs_to_spaces", true).(bool) != false { - t.Error("Expected `translate_tabs_to_spaces` be false for a new view but is true") - } - - v.Settings().Set("syntax", "../packages/python.tmbundle/Syntaxes/Python.tmLanguage") - if v.Settings().Get("translate_tabs_to_spaces", false).(bool) != true { - t.Error("Expected `translate_tabs_to_spaces` be true for python syntax but is false") - } -} - -func BenchmarkScopeNameLinear(b *testing.B) { - w := GetEditor().NewWindow() - defer w.Close() - - v := w.NewFile() - defer func() { - v.SetScratch(true) - v.Close() - }() - - const ( - in = "textmate/language_test.go" - syntax = "textmate/testdata/Go.tmLanguage" - ) - b.StopTimer() - v.Settings().Set("syntax", syntax) - if d, err := ioutil.ReadFile(in); err != nil { - b.Fatal(err) - } else { - e := v.BeginEdit() - v.Insert(e, 0, string(d)) - v.EndEdit(e) - b.StartTimer() - for j := 0; j < b.N; j++ { - for i := 0; i < v.buffer.Size(); i++ { - v.ScopeName(i) - } - } - } -} - -func BenchmarkScopeNameRandom(b *testing.B) { - w := GetEditor().NewWindow() - defer w.Close() - - v := w.NewFile() - defer func() { - v.SetScratch(true) - v.Close() - }() - - const ( - in = "textmate/language_test.go" - syntax = "textmate/testdata/Go.tmLanguage" - ) - b.StopTimer() - v.Settings().Set("syntax", syntax) - if d, err := ioutil.ReadFile(in); err != nil { - b.Fatal(err) - } else { - e := v.BeginEdit() - v.Insert(e, 0, string(d)) - v.EndEdit(e) - p := rand.Perm(b.N) - b.StartTimer() - for _, i := range p { - v.ScopeName(i) - } - } -} - -func TestFind(t *testing.T) { - in := "testing\nview.find\n[lite*r.al|ignoreCAsE]\n\tabra_kadabra\n\n" - tests := []struct { - pat string - pos int - flags int - exp text.Region - }{ - {"view", 2, 0, text.Region{8, 12}}, - {"eof", 50, 0, text.Region{-1, -1}}, - {"caSE", 10, IGNORECASE, text.Region{35, 39}}, - {"[lite*r", 1, LITERAL, text.Region{18, 25}}, - {".Al", 1, LITERAL | IGNORECASE, text.Region{25, 28}}, - {"^\n", 4, 0, text.Region{55, 56}}, - {"[A-C]", 4, 0, text.Region{35, 36}}, - {"abra$", 4, 0, text.Region{50, 54}}, - {"i(nd|ng)", 4, 0, text.Region{4, 7}}, - {"p?aSe", 4, IGNORECASE, text.Region{36, 39}}, - } - - w := GetEditor().NewWindow() - defer w.Close() - - v := w.NewFile() - defer func() { - v.SetScratch(true) - v.Close() - }() - - e := v.BeginEdit() - v.Insert(e, 0, in) - v.EndEdit(e) - - for i, test := range tests { - if ret := v.Find(test.pat, test.pos, test.flags); !reflect.DeepEqual(ret, test.exp) { - t.Errorf("Test %d: Expected return region be %s, but got %s", i, test.exp, ret) - } - } -} - -func TestSetStatus(t *testing.T) { - tests := []struct { - keys, vals []string - exp map[string]string - }{ - { - []string{"a", "", "d"}, - []string{"b", "c", ""}, - map[string]string{"a": "b", "": "c", "d": ""}, - }, - } - - w := GetEditor().NewWindow() - defer w.Close() - - v := w.NewFile() - defer func() { - v.SetScratch(true) - v.Close() - }() - - for i, test := range tests { - for j, key := range test.keys { - v.SetStatus(key, test.vals[j]) - } - if !reflect.DeepEqual(v.status, test.exp) { - t.Errorf("Test %d: Expected %v be equal to %v", i, v.status, test.exp) - } - } -} - -func TestGetStatus(t *testing.T) { - tests := []struct { - st map[string]string - get map[string]string - }{ - { - map[string]string{"a": "b", "": "c", "d": ""}, - map[string]string{"a": "b", "": "c", "d": ""}, - }, - } - - w := GetEditor().NewWindow() - defer w.Close() - - v := w.NewFile() - defer func() { - v.SetScratch(true) - v.Close() - }() - - for i, test := range tests { - v.status = test.st - for key, exp := range test.get { - if val := v.GetStatus(key); val != exp { - t.Errorf("Test %d: Expected key %s value be %s, but got %s", i, key, exp, val) - } - } - } -} - -func TestEraseStatus(t *testing.T) { - tests := []struct { - st map[string]string - keys []string - exp map[string]string - }{ - { - map[string]string{"a": "b", "c": "d"}, - []string{"a"}, - map[string]string{"c": "d"}, - }, - { - map[string]string{"a": "b", "": "c", "d": ""}, - []string{"", "d"}, - map[string]string{"a": "b"}, - }, - } - - w := GetEditor().NewWindow() - defer w.Close() - - v := w.NewFile() - defer func() { - v.SetScratch(true) - v.Close() - }() - - for i, test := range tests { - v.status = test.st - for _, key := range test.keys { - v.EraseStatus(key) - } - if !reflect.DeepEqual(v.status, test.exp) { - t.Errorf("Test %d: Expected %v be equal to %v", i, v.status, test.exp) - } - } -} diff --git a/backend/watch/testdata/dummy.txt b/backend/watch/testdata/dummy.txt deleted file mode 100644 index e69de29..0000000 diff --git a/backend/watch/testdata/test.txt b/backend/watch/testdata/test.txt deleted file mode 100644 index e69de29..0000000 diff --git a/backend/watch/util.go b/backend/watch/util.go deleted file mode 100644 index a3b6fae..0000000 --- a/backend/watch/util.go +++ /dev/null @@ -1,26 +0,0 @@ -// Copyright 2014 The lime Authors. -// Use of this source code is governed by a 2-clause -// BSD-style license that can be found in the LICENSE file. - -package watch - -// Checks if element exists in a slice -func exist(paths []string, name string) bool { - for _, p := range paths { - if p == name { - return true - } - } - return false -} - -// Removes an element from slice -func remove(slice []string, name string) []string { - for i, el := range slice { - if el == name { - slice[i], slice = slice[len(slice)-1], slice[:len(slice)-1] - break - } - } - return slice -} diff --git a/backend/watch/util_test.go b/backend/watch/util_test.go deleted file mode 100644 index 911156c..0000000 --- a/backend/watch/util_test.go +++ /dev/null @@ -1,51 +0,0 @@ -// Copyright 2014 The lime Authors. -// Use of this source code is governed by a 2-clause -// BSD-style license that can be found in the LICENSE file. - -package watch - -import ( - "reflect" - "testing" -) - -func TestExist(t *testing.T) { - test := struct { - array []string - elms []string - exps []bool - }{ - []string{"a", "b", "c", "d"}, - []string{"a", "t", "A"}, - []bool{true, false, false}, - } - for i, exp := range test.exps { - if exist(test.array, test.elms[i]) != exp { - t.Errorf("Expected in %v exist result of element %s be %v, but got %v", test.array, test.elms[i], exp, exist(test.array, test.elms[i])) - } - } -} - -func TestRemove(t *testing.T) { - tests := []struct { - slice []string - remove string - exp []string - }{ - { - []string{"a", "b", "c"}, - "a", - []string{"c", "b"}, - }, - { - []string{"a", "b", "c"}, - "k", - []string{"a", "b", "c"}, - }, - } - for i, test := range tests { - if exp := remove(test.slice, test.remove); !reflect.DeepEqual(exp, test.exp) { - t.Errorf("Test %d: Expected %v be equal to %v", i, exp, test.exp) - } - } -} diff --git a/backend/watch/watch.go b/backend/watch/watch.go deleted file mode 100644 index 6463f89..0000000 --- a/backend/watch/watch.go +++ /dev/null @@ -1,266 +0,0 @@ -// Copyright 2014 The lime Authors. -// Use of this source code is governed by a 2-clause -// BSD-style license that can be found in the LICENSE file. - -package watch - -import ( - "errors" - "os" - "path/filepath" - "sync" - - "github.com/limetext/lime/backend/log" - "gopkg.in/fsnotify.v1" -) - -type ( - FileChangedCallback interface { - FileChanged(string) - } - FileCreatedCallback interface { - FileCreated(string) - } - FileRemovedCallback interface { - FileRemoved(string) - } - FileRenamedCallback interface { - FileRenamed(string) - } - - // Wrapper around fsnotify watcher to suit lime needs - // Enables: - // - Watching directories, we will have less individual watchers - // - Have multiple subscribers on one file or directory resolves #285 - // - Watching a path which doesn't exist yet - // - Watching and applying action on certain events - Watcher struct { - wchr *fsnotify.Watcher - watched map[string][]interface{} - watchers []string // helper variable for paths we created watcher on - dirs []string // helper variable for dirs we are watching - lock sync.Mutex - } -) - -func NewWatcher() (*Watcher, error) { - wchr, err := fsnotify.NewWatcher() - if err != nil { - return nil, err - } - w := &Watcher{wchr: wchr} - w.watched = make(map[string][]interface{}) - w.watchers = make([]string, 0) - w.dirs = make([]string, 0) - - return w, nil -} - -func (w *Watcher) Watch(name string, cb interface{}) error { - log.Finest("Watch(%s)", name) - fi, err := os.Stat(name) - isDir := err == nil && fi.IsDir() - // If the file doesn't exist currently we will add watcher for file - // directory and look for create event inside the directory - if os.IsNotExist(err) { - log.Fine("%s doesn't exist, Watching parent directory", name) - if err := w.Watch(filepath.Dir(name), nil); err != nil { - return err - } - } - w.lock.Lock() - defer w.lock.Unlock() - if err := w.add(name, cb); err != nil { - if !isDir { - return err - } - if exist(w.dirs, name) { - log.Debug("%s is watched already", name) - return nil - } - } - // If exists in watchers we are already watching the path - // Or - // If the file is under one of watched dirs - // - // no need to create watcher - if exist(w.watchers, name) || (!isDir && exist(w.dirs, filepath.Dir(name))) { - return nil - } - if err := w.watch(name); err != nil { - return err - } - if isDir { - w.flushDir(name) - } - return nil -} - -func (w *Watcher) add(name string, cb interface{}) error { - numok := 0 - if _, ok := cb.(FileChangedCallback); ok { - numok++ - } - if _, ok := cb.(FileCreatedCallback); ok { - numok++ - } - if _, ok := cb.(FileRemovedCallback); ok { - numok++ - } - if _, ok := cb.(FileRenamedCallback); ok { - numok++ - } - if numok == 0 { - return errors.New("The callback argument does satisfy any File*Callback interfaces") - } - w.watched[name] = append(w.watched[name], cb) - return nil -} - -func (w *Watcher) watch(name string) error { - if err := w.wchr.Add(name); err != nil { - return err - } - w.watchers = append(w.watchers, name) - return nil -} - -// Remove watchers created on files under this directory because -// one watcher on the parent directory is enough for all of them -func (w *Watcher) flushDir(name string) { - if exist(w.dirs, name) { - return - } - w.dirs = append(w.dirs, name) - for _, p := range w.watchers { - if filepath.Dir(p) == name && !exist(w.dirs, p) { - if err := w.removeWatch(p); err != nil { - log.Errorf("Couldn't unwatch file %s: %s", p, err) - } - } - } -} - -func (w *Watcher) UnWatch(name string, cb interface{}) error { - log.Finest("UnWatch(%s)", name) - w.lock.Lock() - defer w.lock.Unlock() - if cb == nil { - return w.unWatch(name) - } - for i, c := range w.watched[name] { - if c == cb { - w.watched[name][i] = w.watched[name][len(w.watched[name])-1] - w.watched[name][len(w.watched[name])-1] = nil - w.watched[name] = w.watched[name][:len(w.watched[name])-1] - break - } - } - if len(w.watched[name]) == 0 { - w.unWatch(name) - } - return nil -} - -func (w *Watcher) unWatch(name string) error { - delete(w.watched, name) - if err := w.removeWatch(name); err != nil { - return err - } - return nil -} - -func (w *Watcher) removeWatch(name string) error { - if err := w.wchr.Remove(name); err != nil { - return err - } - w.watchers = remove(w.watchers, name) - if exist(w.dirs, name) { - w.removeDir(name) - } - return nil -} - -// Put back watchers on watching files under the directory -func (w *Watcher) removeDir(name string) { - for p, _ := range w.watched { - if filepath.Dir(p) == name { - if err := w.watch(p); err != nil { - log.Errorf("Could not watch: %s", err) - continue - } - } - } - w.dirs = remove(w.dirs, name) -} - -func (w *Watcher) Observe() { - for { - select { - case ev := <-w.wchr.Events: - func() { - w.lock.Lock() - defer w.lock.Unlock() - w.apply(ev) - name := ev.Name - // If the name refers to a directory run all watched - // callbacks for wathed files under the directory - if exist(w.dirs, name) { - for p, _ := range w.watched { - if filepath.Dir(p) == name { - ev.Name = p - w.apply(ev) - } - } - } - dir := filepath.Dir(name) - // The watcher will be removed if the file is deleted - // so we need to watch the parent directory for when the - // file is created again - if ev.Op&fsnotify.Remove != 0 { - w.watchers = remove(w.watchers, name) - w.lock.Unlock() - w.Watch(dir, nil) - w.lock.Lock() - } - // We will apply parent directory FileChanged callbacks to, - // if one of the files inside the directory has changed - if cbs, exist := w.watched[dir]; ev.Op&fsnotify.Write != 0 && exist { - for _, cb := range cbs { - if c, ok := cb.(FileChangedCallback); ok { - c.FileChanged(dir) - } - } - } - - }() - case err := <-w.wchr.Errors: - log.Errorf("Watcher error: %s", err) - } - } -} - -func (w *Watcher) apply(ev fsnotify.Event) { - for _, cb := range w.watched[ev.Name] { - if ev.Op&fsnotify.Create != 0 { - if c, ok := cb.(FileCreatedCallback); ok { - c.FileCreated(ev.Name) - } - } - if ev.Op&fsnotify.Write != 0 { - if c, ok := cb.(FileChangedCallback); ok { - c.FileChanged(ev.Name) - } - } - if ev.Op&fsnotify.Remove != 0 { - if c, ok := cb.(FileRemovedCallback); ok { - c.FileRemoved(ev.Name) - } - } - if ev.Op&fsnotify.Rename != 0 { - if c, ok := cb.(FileRenamedCallback); ok { - c.FileRenamed(ev.Name) - } - } - } -} diff --git a/backend/watch/watch_test.go b/backend/watch/watch_test.go deleted file mode 100644 index aedcaa9..0000000 --- a/backend/watch/watch_test.go +++ /dev/null @@ -1,417 +0,0 @@ -// Copyright 2014 The lime Authors. -// Use of this source code is governed by a 2-clause -// BSD-style license that can be found in the LICENSE file. - -package watch - -import ( - "io/ioutil" - "os" - "reflect" - "sync" - "testing" -) - -func newWatcher(t *testing.T) *Watcher { - watcher, err := NewWatcher() - if err != nil { - t.Fatalf("Couldn't create watcher: %s", err) - } - return watcher -} -func wclose(t *testing.T, watcher *Watcher) { - if err := watcher.wchr.Close(); err != nil { - t.Fatalf("Couldn't close watcher: %s", err) - } -} - -func watch(t *testing.T, watcher *Watcher, name string, cb interface{}) { - if err := watcher.Watch(name, cb); err != nil { - t.Fatalf("Couldn' Watch %s : %s", name, err) - } -} - -func unwatch(t *testing.T, watcher *Watcher, name string, cb interface{}) { - if err := watcher.UnWatch(name, cb); err != nil { - t.Fatalf("Couldn' UnWatch %s : %s", name, err) - } -} - -func TestNewWatcher(t *testing.T) { - watcher := newWatcher(t) - defer wclose(t, watcher) - if len(watcher.dirs) != 0 { - t.Errorf("Expected len(dirs) of new watcher %d, but got %d", 0, len(watcher.dirs)) - } - if len(watcher.watchers) != 0 { - t.Errorf("Expected len(watchers) of new watcher %d, but got %d", 0, len(watcher.watchers)) - } -} - -type dummy struct { - text string - name string - wg sync.WaitGroup - lock sync.Mutex -} - -func (d *dummy) FileChanged(name string) { - d.lock.Lock() - defer d.lock.Unlock() - defer d.wg.Done() - d.text = "Changed" -} - -func (d *dummy) FileCreated(name string) { - d.lock.Lock() - defer d.lock.Unlock() - defer d.wg.Done() - d.text = "Created" -} - -func (d *dummy) FileRemoved(name string) { - d.lock.Lock() - defer d.lock.Unlock() - defer d.wg.Done() - d.text = "Removed" -} - -func (d *dummy) FileRenamed(name string) { - d.lock.Lock() - defer d.lock.Unlock() - defer d.wg.Done() - d.text = "Renamed" -} - -func (d *dummy) Text() string { - d.lock.Lock() - defer d.lock.Unlock() - return d.text -} - -func TestWatch(t *testing.T) { - tests := []struct { - paths []string - expWatched []string - expWatchers []string - }{ - { - []string{"testdata/dummy.txt", "testdata/test.txt"}, - []string{"testdata/dummy.txt", "testdata/test.txt"}, - []string{"testdata/dummy.txt", "testdata/test.txt"}, - }, - { - []string{"testdata", "testdata/dummy.txt", "testdata/test.txt"}, - []string{"testdata", "testdata/dummy.txt", "testdata/test.txt"}, - []string{"testdata"}, - }, - { - []string{"testdata/dummy.txt", "testdata/test.txt", "testdata"}, - []string{"testdata", "testdata/dummy.txt", "testdata/test.txt"}, - []string{"testdata"}, - }, - } - d := new(dummy) - for i, test := range tests { - watcher := newWatcher(t) - for _, name := range test.paths { - watch(t, watcher, name, d) - } - if len(watcher.watched) != len(test.expWatched) { - t.Errorf("Test %d: Expected watched %v keys equal to %v", i, watcher.watched, test.expWatched) - } - for _, p := range test.expWatched { - if _, exist := watcher.watched[p]; !exist { - t.Errorf("Test %d: Expected %s exist in watched", i, p) - } - } - if !reflect.DeepEqual(test.expWatchers, watcher.watchers) { - t.Errorf("Test %d: Expected watchers %v, but got %v", i, test.expWatchers, watcher.watchers) - } - wclose(t, watcher) - } -} - -func Testwatch(t *testing.T) { - watcher := newWatcher(t) - defer wclose(t, watcher) - if err := watcher.watch("testdata/dummy.txt"); err != nil { - t.Fatalf("Couldn't watch %s", "testdata/dummy.txt") - } - if err := watcher.watch("testdata/test.txt"); err != nil { - t.Fatalf("Couldn't watch %s", "testdata/test.txt") - } - if !reflect.DeepEqual(watcher.watchers, []string{"testdata/dummy.txt", "testdata/test.txt"}) { - t.Errorf("Expected watchers %v, but got %v", []string{"testdata/dummy.txt", "testdata/test.txt"}, watcher.watchers) - } -} - -func TestAdd(t *testing.T) { - watcher := newWatcher(t) - defer wclose(t, watcher) - d := new(dummy) - watcher.add("test", d) - if cb := watcher.watched["test"][0]; cb != d { - t.Errorf("Expected watcher['test'][0] callback equal to %v, but got %v", d, cb) - } -} - -func TestFlushDir(t *testing.T) { - name := "testdata/dummy.txt" - dir := "testdata" - watcher := newWatcher(t) - defer wclose(t, watcher) - d := new(dummy) - watch(t, watcher, name, d) - if !reflect.DeepEqual(watcher.watchers, []string{name}) { - t.Errorf("Expected watchers equal to %v, but got %v", []string{name}, watcher.watchers) - } - watcher.flushDir(dir) - if !reflect.DeepEqual(watcher.dirs, []string{dir}) { - t.Errorf("Expected dirs equal to %v, but got %v", []string{dir}, watcher.dirs) - } - if !reflect.DeepEqual(watcher.watchers, []string{}) { - t.Errorf("Expected watchers equal to %v, but got %v", []string{}, watcher.watchers) - } -} - -func TestUnWatch(t *testing.T) { - name := "testdata/dummy.txt" - watcher := newWatcher(t) - defer wclose(t, watcher) - d := new(dummy) - watch(t, watcher, name, d) - unwatch(t, watcher, name, d) - if len(watcher.watched) != 0 { - t.Errorf("Expected watcheds be empty, but got %v", watcher.watched) - } -} - -func TestUnWatchAll(t *testing.T) { - name := "testdata/dummy.txt" - watcher := newWatcher(t) - defer wclose(t, watcher) - d1 := new(dummy) - d2 := new(dummy) - watch(t, watcher, name, d1) - watch(t, watcher, name, d2) - if l := len(watcher.watched[name]); l != 2 { - t.Errorf("Expected len of watched['%s'] be %d, but got %d", name, 2, l) - } - unwatch(t, watcher, name, nil) - if _, exist := watcher.watched[name]; exist { - t.Errorf("Expected all %s watched be removed", name) - } - if !reflect.DeepEqual(watcher.watchers, []string{}) { - t.Errorf("Expected watchers be empty but got %v", watcher.watchers) - } -} - -func TestUnWatchDirectory(t *testing.T) { - name := "testdata/dummy.txt" - dir := "testdata" - watcher := newWatcher(t) - defer wclose(t, watcher) - d := new(dummy) - watch(t, watcher, name, d) - watch(t, watcher, dir, nil) - if !reflect.DeepEqual(watcher.watchers, []string{"testdata"}) { - t.Fatalf("Expected watchers be equal to %s, but got %s", []string{"testdata"}, watcher.watchers) - } - unwatch(t, watcher, dir, nil) - if !reflect.DeepEqual(watcher.watchers, []string{name}) { - t.Errorf("Expected watchers be equal to %s, but got %s", []string{name}, watcher.watchers) - } -} - -func TestUnWatchOneOfSubscribers(t *testing.T) { - name := "testdata/dummy.txt" - watcher := newWatcher(t) - defer wclose(t, watcher) - d1 := new(dummy) - d2 := new(dummy) - watch(t, watcher, name, d1) - watch(t, watcher, name, d2) - if len(watcher.watched[name]) != 2 { - t.Fatalf("Expected watched[%s] length be %d, but got %d", name, 2, len(watcher.watched[name])) - } - unwatch(t, watcher, name, d1) - if !reflect.DeepEqual(watcher.watchers, []string{name}) { - t.Errorf("Expected watchers be equal to %s, but got %s", []string{name}, watcher.watchers) - } - if len(watcher.watched[name]) != 1 { - t.Errorf("Expected watched[%s] length be %d, but got %d", name, 1, len(watcher.watched[name])) - } -} - -func TestunWatch(t *testing.T) { - name := "testdata/dummy.txt" - watcher := newWatcher(t) - defer wclose(t, watcher) - d1 := new(dummy) - d2 := new(dummy) - watch(t, watcher, name, d1) - watch(t, watcher, name, d2) - if err := watcher.unWatch(name); err != nil { - t.Fatalf("Couldn't unWatch %s: %s", name, err) - } - if _, exist := watcher.watched[name]; exist { - t.Errorf("Expected all %s watched be removed", name) - } - if !reflect.DeepEqual(watcher.watchers, []string{}) { - t.Errorf("Expected watchers be empty but got %v", watcher.watchers) - } -} - -func TestRemoveWatch(t *testing.T) { - name := "testdata/dummy.txt" - watcher := newWatcher(t) - defer wclose(t, watcher) - d := new(dummy) - watch(t, watcher, name, d) - watcher.removeWatch(name) - if !reflect.DeepEqual(watcher.watchers, []string{}) { - t.Errorf("Expected watchers be empty but got %v", watcher.watchers) - } -} - -func TestRemoveDir(t *testing.T) { - name := "testdata/dummy.txt" - dir := "testdata" - watcher := newWatcher(t) - defer wclose(t, watcher) - d := new(dummy) - watch(t, watcher, dir, d) - watch(t, watcher, name, d) - if !reflect.DeepEqual(watcher.watchers, []string{dir}) { - t.Errorf("Expected watchers be equal to %s, but got %s", []string{dir}, watcher.watchers) - } - if !reflect.DeepEqual(watcher.dirs, []string{dir}) { - t.Errorf("Expected dirs be equal to %s, but got %s", []string{dir}, watcher.dirs) - } - watcher.removeDir(dir) - if !reflect.DeepEqual(watcher.dirs, []string{}) { - t.Errorf("Expected dirs be empty but got %v", watcher.dirs) - } - if !reflect.DeepEqual(watcher.watchers, []string{dir, name}) { - t.Errorf("Expected watchers be equal to %s, but got %s", []string{name}, watcher.watchers) - } -} - -func TestObserve(t *testing.T) { - name := "testdata/test.txt" - watcher := newWatcher(t) - defer ioutil.WriteFile(name, []byte(""), 0644) - defer wclose(t, watcher) - d := &dummy{name: name} - watch(t, watcher, name, d) - go watcher.Observe() - - d.wg.Add(1) - if err := ioutil.WriteFile(name, []byte("test"), 0644); err != nil { - t.Fatalf("WriteFile error: %s", err) - } - d.wg.Wait() - if d.Text() != "Changed" { - t.Errorf("Expected dummy Text %s, but got %s", "Changed", d.Text()) - } -} - -func TestObserveDirectory(t *testing.T) { - dir := "testdata" - name := "testdata/test.txt" - watcher := newWatcher(t) - defer ioutil.WriteFile(name, []byte(""), 0644) - defer wclose(t, watcher) - d := &dummy{name: dir} - watch(t, watcher, dir, d) - go watcher.Observe() - - if !reflect.DeepEqual(watcher.watchers, []string{"testdata"}) { - t.Errorf("Expected watchers be equal to %v, but got %v", []string{"testdata"}, watcher.watchers) - } - d.wg.Add(1) - if err := ioutil.WriteFile(name, []byte("test"), 0644); err != nil { - t.Fatalf("WriteFile error: %s", err) - } - d.wg.Wait() - if d.Text() != "Changed" { - t.Errorf("Expected dummy Text %s, but got %s", "Changed", d.Text()) - } -} - -func TestCreateEvent(t *testing.T) { - name := "testdata/new.txt" - defer os.Remove(name) - watcher := newWatcher(t) - defer wclose(t, watcher) - d := &dummy{name: name} - watch(t, watcher, name, d) - go watcher.Observe() - - if !reflect.DeepEqual(watcher.watchers, []string{"testdata"}) { - t.Errorf("Expected watchers be equal to %v, but got %v", []string{"testdata"}, watcher.watchers) - } - d.wg.Add(1) - - if f, err := os.Create(name); err != nil { - t.Fatalf("File creation error: %s", err) - } else { - f.Close() - } - d.wg.Wait() - if d.Text() != "Created" { - t.Errorf("Expected dummy Text %s, but got %s", "Created", d.Text()) - } -} - -func TestDeleteEvent(t *testing.T) { - if os.ExpandEnv("$TRAVIS") != "" { - // This test just times out on travis (ie the callback is never called). - // See https://github.com/limetext/lime/issues/438 - t.Skip("Skipping test as it doesn't work with travis") - return - } - name := "testdata/dummy.txt" - watcher := newWatcher(t) - defer wclose(t, watcher) - d := &dummy{name: name} - watch(t, watcher, name, d) - go watcher.Observe() - - d.wg.Add(1) - if err := os.Remove(name); err != nil { - t.Fatalf("Couldn't remove file %s: %s", name, err) - } - d.wg.Wait() - if d.Text() != "Removed" { - t.Errorf("Expected dummy Text %s, but got %s", "Removed", d.Text()) - } - d.wg.Add(1) - if f, err := os.Create(name); err != nil { - t.Errorf("Couldn't create file: %s", err) - } else { - f.Close() - } - d.wg.Wait() - if d.Text() != "Created" { - t.Errorf("Expected dummy Text %s, but got %s", "Created", d.Text()) - } -} - -func TestRenameEvent(t *testing.T) { - name := "testdata/test.txt" - defer os.Rename("testdata/rename.txt", name) - watcher := newWatcher(t) - defer wclose(t, watcher) - d := &dummy{name: name} - watch(t, watcher, name, d) - go watcher.Observe() - - d.wg.Add(1) - os.Rename(name, "testdata/rename.txt") - d.wg.Wait() - if d.Text() != "Renamed" { - t.Errorf("Expected dummy Text %s, but got %s", "Renamed", d.Text()) - } -} diff --git a/backend/window.go b/backend/window.go deleted file mode 100644 index 561ec98..0000000 --- a/backend/window.go +++ /dev/null @@ -1,138 +0,0 @@ -// Copyright 2013 The lime Authors. -// Use of this source code is governed by a 2-clause -// BSD-style license that can be found in the LICENSE file. - -package backend - -import ( - "github.com/limetext/lime/backend/log" - "github.com/limetext/text" - "io/ioutil" - "path/filepath" - "runtime/debug" - "sync" -) - -type Window struct { - text.HasId - text.HasSettings - views []*View - active_view *View - lock sync.Mutex -} - -func (w *Window) NewFile() *View { - w.lock.Lock() - defer w.lock.Unlock() - - w.views = append(w.views, newView(w)) - v := w.views[len(w.views)-1] - - v.Settings().SetParent(w) - v.setBuffer(text.NewBuffer()) - v.selection.Clear() - v.selection.Add(text.Region{A: 0, B: 0}) - v.Settings().Set("lime.last_save_change_count", v.buffer.ChangeCount()) - - OnNew.Call(v) - w.SetActiveView(v) - - return v -} - -func (w *Window) Views() []*View { - w.lock.Lock() - defer w.lock.Unlock() - ret := make([]*View, len(w.views)) - copy(ret, w.views) - return ret -} - -func (w *Window) remove(v *View) { - w.lock.Lock() - defer w.lock.Unlock() - for i, vv := range w.views { - if v == vv { - end := len(w.views) - 1 - if i != end { - copy(w.views[i:], w.views[i+1:]) - } - w.views = w.views[:end] - return - } - } - log.Errorf("Wanted to remove view %+v, but it doesn't appear to be a child of this window", v) -} - -func (w *Window) OpenFile(filename string, flags int) *View { - v := w.NewFile() - - v.SetScratch(true) - e := v.BeginEdit() - if fn, err := filepath.Abs(filename); err != nil { - v.Buffer().SetFileName(filename) - } else { - v.Buffer().SetFileName(fn) - } - if d, err := ioutil.ReadFile(filename); err != nil { - log.Errorf("Couldn't load file %s: %s", filename, err) - } else { - v.Insert(e, 0, string(d)) - } - v.EndEdit(e) - v.selection.Clear() - v.selection.Add(text.Region{A: 0, B: 0}) - v.Settings().Set("lime.last_save_change_count", v.buffer.ChangeCount()) - v.SetScratch(false) - - OnLoad.Call(v) - w.SetActiveView(v) - - return v -} - -func (w *Window) SetActiveView(v *View) { - if w.active_view != nil { - OnDeactivated.Call(w.active_view) - } - w.active_view = v - if w.active_view != nil { - OnActivated.Call(w.active_view) - } -} - -func (w *Window) ActiveView() *View { - return w.active_view -} - -// Closes the Window and all its Views. -// Returns "true" if the Window closed successfully. Otherwise returns "false". -func (w *Window) Close() bool { - if !w.CloseAllViews() { - return false - } - GetEditor().remove(w) - - return true -} - -// Closes all of the Window's Views. -// Returns "true" if all the Views closed successfully. Otherwise returns "false". -func (w *Window) CloseAllViews() bool { - for len(w.views) > 0 { - if !w.views[0].Close() { - return false - } - } - - return true -} - -func (w *Window) runCommand(c WindowCommand, name string) error { - defer func() { - if r := recover(); r != nil { - log.Errorf("Paniced while running window command %s %v: %v\n%s", name, c, r, string(debug.Stack())) - } - }() - return c.Run(w) -} diff --git a/backend/window_test.go b/backend/window_test.go deleted file mode 100644 index 2099b94..0000000 --- a/backend/window_test.go +++ /dev/null @@ -1,159 +0,0 @@ -// Copyright 2013 The lime Authors. -// Use of this source code is governed by a 2-clause -// BSD-style license that can be found in the LICENSE file. - -package backend - -import ( - "testing" -) - -func TestWindowNewFile(t *testing.T) { - w := GetEditor().NewWindow() - defer w.Close() - - v := w.NewFile() - defer func() { - v.SetScratch(true) - v.Close() - }() - - if len(w.Views()) != 1 { - t.Errorf("Expected 1 view, but got %d", len(w.Views())) - } -} - -func TestWindowRemove(t *testing.T) { - w := GetEditor().NewWindow() - defer w.Close() - - v0 := w.NewFile() - defer v0.Close() - - v1 := w.NewFile() - defer v1.Close() - - v2 := w.NewFile() - defer v2.Close() - - l := len(w.Views()) - - w.remove(v1) - - if len(w.Views()) != l-1 { - t.Errorf("Expected %d open views, but got %d", l-1, len(w.Views())) - } -} - -func TestWindowActiveView(t *testing.T) { - w := GetEditor().NewWindow() - defer w.Close() - - v0 := w.NewFile() - defer v0.Close() - - v1 := w.NewFile() - defer v1.Close() - - if w.ActiveView() != v1 { - t.Error("Expected v1 to be the active view, but it wasn't") - } -} - -func TestWindowClose(t *testing.T) { - ed := GetEditor() - l := len(ed.Windows()) - w := ed.NewWindow() - - for _, v := range w.Views() { - v.SetScratch(true) - v.Close() - } - - w.Close() - - if len(ed.Windows()) != l { - t.Errorf("Expected window to close, but we have %d still open", len(ed.Windows())) - } -} - -func TestWindowCloseFail(t *testing.T) { - ed := GetEditor() - - fe := ed.Frontend() - if dfe, ok := fe.(*DummyFrontend); ok { - dfe.SetDefaultAction(false) - } - - w := ed.NewWindow() - l := len(ed.Windows()) - - v := w.NewFile() - defer func() { - v.SetScratch(true) - v.Close() - }() - - edit := v.BeginEdit() - v.Insert(edit, 0, "test") - v.EndEdit(edit) - - if w.Close() { - t.Errorf("Expected window to fail to close, but it didn't") - } - - if len(ed.Windows()) != l { - t.Error("Expected window not to close, but it did") - } -} - -func TestWindowCloseAllViews(t *testing.T) { - w := GetEditor().NewWindow() - defer w.Close() - - w.NewFile() - w.NewFile() - - w.CloseAllViews() - - if len(w.Views()) != 0 { - t.Errorf("Expected 0 open views, but got %d", len(w.Views())) - } -} - -func TestWindowCloseAllViewsFail(t *testing.T) { - ed := GetEditor() - - fe := ed.Frontend() - if dfe, ok := fe.(*DummyFrontend); ok { - dfe.SetDefaultAction(false) - } - - w := ed.NewWindow() - defer w.Close() - - w.NewFile() - v := w.NewFile() - - l := len(w.Views()) - - w.NewFile() - defer func() { - for _, vw := range w.Views() { - vw.SetScratch(true) - vw.Close() - } - }() - - edit := v.BeginEdit() - v.Insert(edit, 0, "test") - v.EndEdit(edit) - - if w.CloseAllViews() { - t.Errorf("Expected views to fail to close, but they didn't") - } - - if len(w.Views()) != l { - t.Error("Expected only one view to close, but more did") - } -} diff --git a/frontend/html/index.html b/frontend/html/index.html deleted file mode 100644 index 0e754f7..0000000 --- a/frontend/html/index.html +++ /dev/null @@ -1,357 +0,0 @@ - - - - -Lime - - - - - - - - -
-
-
- Tab Size/Spaces: 4 - Go -
- - git branch: master - INSERT MODE - Line xx, Column yy - -
- - - - \ No newline at end of file diff --git a/frontend/html/main.go b/frontend/html/main.go deleted file mode 100644 index 5bd9391..0000000 --- a/frontend/html/main.go +++ /dev/null @@ -1,534 +0,0 @@ -// Copyright 2013 The lime Authors. -// Use of this source code is governed by a 2-clause -// BSD-style license that can be found in the LICENSE file. - -package main - -import ( - "bufio" - "bytes" - "flag" - "fmt" - "github.com/limetext/gopy/lib" - "github.com/limetext/lime/backend" - _ "github.com/limetext/lime/backend/commands" - "github.com/limetext/lime/backend/keys" - "github.com/limetext/lime/backend/log" - "github.com/limetext/lime/backend/render" - _ "github.com/limetext/lime/backend/sublime" - "github.com/limetext/lime/backend/textmate" - "github.com/limetext/lime/backend/util" - . "github.com/limetext/text" - "golang.org/x/net/websocket" - "io" - "io/ioutil" - "net/http" - "net/url" - "os" - "path" - "runtime/debug" - "strconv" - "strings" - "sync" - "time" - "unicode" - "unicode/utf8" -) - -var ( - scheme *textmate.Theme - blink bool - port = flag.Int("port", 8080, "Configures which port to host lime on") -) - -const ( - console_height = 20 - render_chan_len = 2 -) - -type layout struct { - x, y int - width, height int - visible Region - lastUpdate int -} -type tbfe struct { - layout map[*backend.View]layout - status_message string - dorender chan bool - lock sync.Mutex - dirty bool -} - -func (t *tbfe) Erased(changed_buffer Buffer, region_removed Region, data_removed []rune) { - t.scroll(changed_buffer) -} - -func (t *tbfe) Inserted(changed_buffer Buffer, region_inserted Region, data_inserted []rune) { - t.scroll(changed_buffer) -} - -func htmlcol(c render.Colour) string { - return fmt.Sprintf("%02X%02X%02X", c.R, c.G, c.B) -} - -func (t *tbfe) renderView(wr io.Writer, v *backend.View, lay layout) { - p := util.Prof.Enter("render") - defer p.Exit() - - vr := lay.visible - runes := v.Buffer().Substr(vr) - recipie := v.Transform(scheme, vr).Transcribe() - highlight_line := false - if b, ok := v.Settings().Get("highlight_line", highlight_line).(bool); ok { - highlight_line = b - } - lastEnd := 0 - for _, reg := range recipie { - if lastEnd != reg.Region.Begin() { - io.WriteString(wr, runes[lastEnd:reg.Region.Begin()]) - } - fmt.Fprintf(wr, "%s", htmlcol(reg.Flavour.Foreground), htmlcol(reg.Flavour.Background), runes[reg.Region.Begin():reg.Region.End()]) - lastEnd = reg.Region.End() - } - if lastEnd != vr.End() { - io.WriteString(wr, v.Buffer().Substr(Region{lastEnd, vr.End()})) - } -} - -func (t *tbfe) clip(v *backend.View, s, e int) Region { - p := util.Prof.Enter("clip") - defer p.Exit() - h := t.layout[v].height - if e-s > h { - e = s + h - } else if e-s < h { - s = e - h - } - if e2, _ := v.Buffer().RowCol(v.Buffer().TextPoint(e, 0)); e2 < e { - e = e2 - } - if s < 0 { - s = 0 - } - e = s + h - r := Region{v.Buffer().TextPoint(s, 0), v.Buffer().TextPoint(e, 0)} - return v.Buffer().LineR(r) -} - -func (t *tbfe) Show(v *backend.View, r Region) { - t.lock.Lock() - l := t.layout[v] - t.lock.Unlock() - if l.visible.Covers(r) { - return - } - p := util.Prof.Enter("show") - defer p.Exit() - - lv := l.visible - - s1, _ := v.Buffer().RowCol(lv.Begin()) - e1, _ := v.Buffer().RowCol(lv.End()) - s2, _ := v.Buffer().RowCol(r.Begin()) - e2, _ := v.Buffer().RowCol(r.End()) - - r1 := Region{s1, e1} - r2 := Region{s2, e2} - - r3 := r1.Cover(r2) - diff := 0 - if d1, d2 := Abs(r1.Begin()-r3.Begin()), Abs(r1.End()-r3.End()); d1 > d2 { - diff = r3.Begin() - r1.Begin() - } else { - diff = r3.End() - r1.End() - } - r3.A = r1.Begin() + diff - r3.B = r1.End() + diff - - r3 = t.clip(v, r3.A, r3.B) - l.visible = r3 - t.lock.Lock() - t.layout[v] = l - t.lock.Unlock() -} - -func (t *tbfe) VisibleRegion(v *backend.View) Region { - t.lock.Lock() - r, ok := t.layout[v] - t.lock.Unlock() - if !ok || r.lastUpdate != v.Buffer().ChangeCount() { - t.Show(v, r.visible) - t.lock.Lock() - r = t.layout[v] - t.lock.Unlock() - } - return r.visible -} - -func (t *tbfe) StatusMessage(msg string) { - t.lock.Lock() - defer t.lock.Unlock() - t.status_message = msg - - t.BroadcastData(map[string]interface{}{"type": "statusMessage", "msg": msg}) -} - -func (t *tbfe) ErrorMessage(msg string) { - log.Error(msg) - - t.BroadcastData(map[string]interface{}{"type": "errorMessage", "msg": msg}) -} - -func (t *tbfe) MessageDialog(msg string) { - log.Info(msg) - - t.BroadcastData(map[string]interface{}{"type": "messageDialog", "msg": msg}) -} - -// TODO: wait for client response, return true/false -func (t *tbfe) OkCancelDialog(msg, ok string) bool { - log.Info(msg, ok) - - t.BroadcastData(map[string]interface{}{"type": "okCancelDialog", "msg": msg, "ok": ok}) - - return false -} - -func (t *tbfe) scroll(b Buffer) { - t.Show(backend.GetEditor().Console(), Region{b.Size(), b.Size()}) -} - -var pc = 0 - -func (t *tbfe) render(w io.Writer) { - defer func() { - if r := recover(); r != nil { - log.Errorf("Panic in renderthread: %v\n%s", r, string(debug.Stack())) - if pc > 1 { - panic(r) - } - pc++ - } - }() - vs := make([]*backend.View, 0, len(t.layout)) - l := make([]layout, 0, len(t.layout)) - for k, v := range t.layout { - vs = append(vs, k) - l = append(l, v) - } - for i, v := range vs { - t.renderView(w, v, l[i]) - } - // runes := []rune(t.status_message) -} - -// key HandleFunc for the http /key endpoint. This only happens if the client -// doesn't support websockets. -func (t *tbfe) key(w http.ResponseWriter, req *http.Request) { - log.Debug("key: %s", req) - kc := req.FormValue("keyCode") - var kp keys.KeyPress - v, _ := strconv.ParseInt(kc, 10, 32) - - if req.FormValue("altKey") == "true" { - kp.Alt = true - } - if req.FormValue("ctrlKey") == "true" { - kp.Ctrl = true - } - if req.FormValue("metaKey") == "true" { - kp.Super = true - } - if req.FormValue("shiftKey") == "true" { - kp.Shift = true - } - - if !kp.Shift { - v = int64(unicode.ToLower(rune(v))) - } - kp.Key = keys.Key(v) - kp.Text = string(v) - backend.GetEditor().HandleInput(kp) -} - -func (t *tbfe) view(w http.ResponseWriter, req *http.Request) { - log.Debug("view: %s", req) - if t.dirty { - t.dirty = false - t.render(w) - } else { - w.WriteHeader(404) - } -} - -func (t *tbfe) theme(w http.ResponseWriter, req *http.Request) { - log.Debug("theme: %s", req) - - reqpath, _ := url.QueryUnescape(req.RequestURI) - - // Make sure the URL starts with "/themes/" - // Don't allow ".." in URLs - if !strings.HasPrefix(reqpath, "/themes/") || strings.Index(reqpath, "..") != -1 { - w.WriteHeader(404) - return - } - - filepath := path.Join("../../packages", reqpath) - - exists := false - if s, err := os.Stat(filepath); err == nil { - if !s.IsDir() { - exists = true - } - } - - if exists { - fi, err := os.Open(filepath) - if err != nil { - w.WriteHeader(500) - log.Error(err) - return - } - - defer fi.Close() - - io.Copy(w, fi) - } else { - w.WriteHeader(404) - } -} - -func (t *tbfe) ServeHTTP(w http.ResponseWriter, req *http.Request) { - s := time.Now() - w.Header().Set("Content-Type", "text/html") - log.Debug("Serving client: %s", req) - - c := scheme.Spice(&render.ViewRegions{}) - - html, err := ioutil.ReadFile("index.html") - if err != nil { - w.WriteHeader(404) - panic(err) - } - - r := strings.NewReplacer("{{foregroundColor}}", htmlcol(c.Foreground), "{{backgroundColor}}", htmlcol(c.Background)) - r.WriteString(w, string(html)) - - log.Debug("Done serving client: %s", time.Since(s)) -} - -var clients []*websocket.Conn - -func (t *tbfe) WebsocketServer(ws *websocket.Conn) { - clients = append(clients, ws) - - // Send status message - if t.status_message != "" { - websocket.JSON.Send(ws, map[string]string{"type": "statusMessage", "msg": t.status_message}) - } - - // Send cursor position - websocket.JSON.Send(ws, t.GetSelectionMessage(backend.GetEditor().ActiveWindow().ActiveView())) - - // Send editor content - var buf bytes.Buffer - t.render(bufio.NewWriter(&buf)) - websocket.Message.Send(ws, buf.Bytes()) - buf.Reset() - - var data map[string]interface{} - var kp keys.KeyPress - for { - err := websocket.JSON.Receive(ws, &data) - if err != nil { - log.Error(err) - return - } - //log.LogDebug("Received: %s", data) - - msgType := data["type"].(string) - - if msgType == "key" { - kp.Alt = data["altKey"].(bool) - kp.Ctrl = data["ctrlKey"].(bool) - kp.Super = data["metaKey"].(bool) - kp.Shift = data["shiftKey"].(bool) - - if keyName, ok := data["key"].(string); ok { - if utf8.RuneCountInString(keyName) == 1 { // One char - r, _ := utf8.DecodeRuneInString(keyName) - kp.Key = keys.Key(int64(r)) - } else { - // TODO: automatic lookup instead of this manual lookup - // See https://github.com/limetext/lime/pull/421/files#r19269236 - keymap := map[string]keys.Key{ - "ArrowLeft": keys.Left, - "ArrowUp": keys.Up, - "ArrowRight": keys.Right, - "ArrowDown": keys.Down, - "Left": keys.Left, - "Up": keys.Up, - "Right": keys.Right, - "Down": keys.Down, - "Enter": keys.Enter, - "Escape": keys.Escape, - "Backspace": keys.Backspace, - "Delete": keys.Delete, - "Del": keys.Delete, // Deprecated: some old browsers still use "Del" instead of "Delete" - "KeypadEnter": keys.KeypadEnter, - "F1": keys.F1, - "F2": keys.F2, - "F3": keys.F3, - "F4": keys.F4, - "F5": keys.F5, - "F6": keys.F6, - "F7": keys.F7, - "F8": keys.F8, - "F9": keys.F9, - "F10": keys.F10, - "F11": keys.F11, - "F12": keys.F12, - "Insert": keys.Insert, - "PageUp": keys.PageUp, - "PageDown": keys.PageDown, - "Home": keys.Home, - "End": keys.End, - "Break": keys.Break, - } - - if key, ok := keymap[keyName]; ok { - kp.Key = key - } else { - log.Debug("Unknown key: %s", keyName) - continue - } - } - } else { - v := int64(data["keyCode"].(float64)) - if !kp.Shift { - v = int64(unicode.ToLower(rune(v))) - } - kp.Key = keys.Key(v) - kp.Text = string(v) - } - - backend.GetEditor().HandleInput(kp) - } else if msgType == "command" { - command := data["name"].(string) - //args := data["args"].([]string) //TODO: add arguments support - - ed := backend.GetEditor() - go ed.RunCommand(command, make(backend.Args)) - } else { - log.Info("Unhandled message type: %s", msgType) - } - } -} - -func (t *tbfe) BroadcastData(data map[string]interface{}) { - for _, ws := range clients { - websocket.JSON.Send(ws, data) - } -} - -func (t *tbfe) SetDirty() { - t.dirty = true - - var buf bytes.Buffer - t.render(bufio.NewWriter(&buf)) - for _, ws := range clients { - websocket.Message.Send(ws, buf.Bytes()) - } -} - -func (t *tbfe) GetSelectionMessage(v *backend.View) map[string]interface{} { - return map[string]interface{}{ - "type": "selection", - "sel": v.Sel().Regions(), - } -} - -func (t *tbfe) loop() { - backend.OnNew.Add(func(v *backend.View) { - v.Settings().AddOnChange("lime.frontend.html.render", func(name string) { - if name != "lime.syntax.updated" { - return - } - t.SetDirty() - }) - }) - // TODO: maybe not useful? - /*backend.OnModified.Add(func(v *backend.View) { - t.SetDirty() - })*/ - backend.OnSelectionModified.Add(func(v *backend.View) { - t.BroadcastData(t.GetSelectionMessage(v)) - }) - - ed := backend.GetEditor() - ed.SetFrontend(t) - ed.LogInput(false) - ed.LogCommands(false) - c := ed.Console() - if sc, err := textmate.LoadTheme("../../packages/themes/TextMate-Themes/Monokai.tmTheme"); err != nil { - log.Error(err) - } else { - scheme = sc - } - - defer func() { - fmt.Println(util.Prof) - }() - - w := ed.NewWindow() - v := w.OpenFile("main.go", 0) - //v.Settings().Set("trace", true) - v.Settings().Set("syntax", "../../packages/go.tmbundle/Syntaxes/Go.tmLanguage") - c.Buffer().AddObserver(t) - - sel := v.Sel() - sel.Clear() - // end := v.Buffer().Size() - 2 - sel.Add(Region{0, 0}) - // sel.Add(Region{end - 22, end - 22}) - // sel.Add(Region{end - 16, end - 20}) - // sel.Add(Region{end - 13, end - 10}) - - { - w, h := 800, 600 - t.lock.Lock() - t.layout[v] = layout{0, 0, w, h - console_height - 1, Region{}, 0} - t.layout[c] = layout{0, h - console_height + 1, w, console_height - 5, Region{}, 0} - t.lock.Unlock() - t.Show(v, Region{1, 1}) - } - t.Show(v, Region{100, 100}) - t.Show(v, Region{1, 1}) - - go ed.Init() - log.Debug("Serving on port %d", *port) - http.HandleFunc("/", t.ServeHTTP) - http.HandleFunc("/view", t.view) - http.HandleFunc("/key", t.key) - http.HandleFunc("/themes/", t.theme) - http.Handle("/ws", websocket.Handler(t.WebsocketServer)) - if err := http.ListenAndServe(fmt.Sprintf("localhost:%d", *port), nil); err != nil { - log.Errorf("Error serving: %s", err) - } - log.Debug("Done") -} - -func main() { - flag.Parse() - log.AddFilter("file", log.FINEST, log.NewConsoleLogWriter()) - defer func() { - py.NewLock() - py.Finalize() - }() - - var t tbfe - t.dorender = make(chan bool, render_chan_len) - t.layout = make(map[*backend.View]layout) - t.loop() -} diff --git a/frontend/html/main_test.go b/frontend/html/main_test.go deleted file mode 100644 index 1f02bf8..0000000 --- a/frontend/html/main_test.go +++ /dev/null @@ -1,5 +0,0 @@ -// Copyright 2014 The lime Authors. -// Use of this source code is governed by a 2-clause -// BSD-style license that can be found in the LICENSE file. - -package main diff --git a/frontend/qml/LimeView.qml b/frontend/qml/LimeView.qml deleted file mode 100644 index dc88761..0000000 --- a/frontend/qml/LimeView.qml +++ /dev/null @@ -1,422 +0,0 @@ -import QtQuick 2.0 -import QtQuick.Layouts 1.0 - -Item { - id: viewItem - - property var myView - property bool isMinimap: false - property int fontSize: isMinimap ? 4 : 12 - property string fontFace: "Helvetica" - property var cursor: Qt.IBeamCursor - property bool ctrl: false - - function getCurrentSelection() { - if (!myView || !myView.back()) return null; - return myView.back().sel(); - } - - function addLine() { - view.model.append({}); - } - - function insertLine(idx) { - view.model.insert(idx, {}); - } - - Rectangle { - color: frontend.defaultBg() - anchors.fill: parent - } - - onMyViewChanged: { - if (!isMinimap) { - view.model.clear(); - view.myView = myView; - myView.fix(viewItem); - } - } - - onFontSizeChanged: { - dummy.font.pointSize = fontSize; - } - - ListView { - id: view - model: ListModel {} - anchors.fill: parent - boundsBehavior: Flickable.StopAtBounds - cacheBuffer: contentHeight - interactive: false - clip: true - z: 4 - - property var myView - property bool showBars: false - property var cursor: parent.cursor - - delegate: Rectangle { - color: "transparent" - width: parent.width - height: childrenRect.height - - Text { - property var line: !myView ? null : myView.line(index) - font.family: viewItem.fontFace - font.pointSize: viewItem.fontSize - text: !line ? "" : line.text+" " - textFormat: TextEdit.RichText - color: "white" - } - } - - states: [ - State { - name: "ShowBars" - when: view.movingVertically || view.movingHorizontally || view.flickingVertically || view.flickingHorizontally - PropertyChanges { - target: view - showBars: true - } - }, - State { - name: "HideBars" - when: !view.movingVertically && !view.movingHorizontally && !view.flickingVertically && !view.flickingHorizontally - PropertyChanges { - target: view - showBars: false - } - } - ] - - MouseArea { - property var point: new Object() - - enabled: !isMinimap - x: 0 - y: 0 - cursorShape: parent.cursor - propagateComposedEvents: true - height: parent.height - width: parent.width-verticalScrollBar.width - - function colFromMouseX(lineIndex, mouseX) { - - var line = myView.back().buffer().line(myView.back().buffer().textPoint(lineIndex, 0)), - lineText = myView.back().buffer().substr(line); - - dummy.text = lineText; - - // if the click was farther right than the last character of - // the line then return the last character's column - if(mouseX > dummy.width) { - return myView.back().buffer().rowCol(line.b)[1] - } - - // fixme: why do we need this magic number? - var OFFSET_MAGIC_NUMBER = 0.5; - - // calculate a column from a given mouse x coordinate and the line text. - var col = Math.floor(OFFSET_MAGIC_NUMBER + lineText.length * (mouseX / dummy.width)); - if (col < 0) col = 0; - - // Trying to find closest column to clicked position - dummy.text = "" + lineText.substr(0, col) + ""; - - var d = Math.abs(mouseX - dummy.width), - add = (mouseX > dummy.width) ? 1 : -1; - - while (col >= 0 && col < lineText.length && Math.abs(mouseX - dummy.width) <= d) { - d = Math.abs(mouseX - dummy.width); - col += add; - dummy.text = "" + lineText.substr(0, col) + ""; - } - col -= add; - - return col; - } - - Text { - // just used to measure the text. - // If we change an actual displayed item's text, - // there's a risk (or is it always happening?) - // that the backend stored text data is no longer - // connected with that text item and hence changes - // made backend side aren't propagated. - id: dummy - font.family: viewItem.fontFace - textFormat: TextEdit.RichText - visible: false - Component.onCompleted: { - dummy.font.pointSize = viewItem.fontSize - } - } - - onPositionChanged: { - var item = view.itemAt(0, mouse.y+view.contentY), - index = view.indexAt(0, mouse.y+view.contentY), - selection = getCurrentSelection(); - - if (item != null && selection != null) { - var col = colFromMouseX(index, mouse.x); - point.r = myView.back().buffer().textPoint(index, col); - if (point.p != null && point.p != point.r) { - // Remove the last region and replace it with new one - var r = selection.get(selection.len()-1); - selection.substract(r); - selection.add(myView.region(point.p, point.r)); - onSelectionModified(); - } - } - point.r = null; - } - - onPressed: { - // TODO: - // Changing caret position doesn't work on empty lines - if (!isMinimap) { - - var item = view.itemAt(0, mouse.y+view.contentY), - index = view.indexAt(0, mouse.y+view.contentY); - - if (item != null) { - var col = colFromMouseX(index, mouse.x); - point.p = myView.back().buffer().textPoint(index, col) - - if (!ctrl) { - getCurrentSelection().clear(); - } - - getCurrentSelection().add(myView.region(point.p, point.p)) - onSelectionModified(); - } - } - } - - onDoubleClicked: { - if (!isMinimap) { - - var item = view.itemAt(0, mouse.y+view.contentY), - index = view.indexAt(0, mouse.y+view.contentY); - - if (item != null) { - var col = colFromMouseX(index, mouse.x); - point.p = myView.back().buffer().textPoint(index, col) - - if (!ctrl) { - getCurrentSelection().clear(); - } - - getCurrentSelection().add(myView.back().expandByClass(myView.region(point.p, point.p), 1|2|4|8)) - onSelectionModified(); - } - } - } - - onWheel: { - var delta = wheel.pixelDelta, - scaleFactor = 30; - - if (delta.x == 0 && delta.y == 0) { - delta = wheel.angleDelta; - scaleFactor = 15; - } - - view.flick(delta.x*scaleFactor, delta.y*scaleFactor); - wheel.accepted = true; - } - } - - Rectangle { - id: verticalScrollBar - - visible: !isMinimap - width: 10 - radius: width - height: view.visibleArea.heightRatio * view.height - anchors.right: view.right - opacity: (view.showBars || ma.containsMouse || ma.drag.active) ? 0.5 : 0.0 - - onYChanged: { - if (ma.drag.active) { - view.contentY = y*(view.contentHeight-view.height)/(view.height-height); - } - } - - states: [ - State { - when: !ma.drag.active - PropertyChanges { - target: verticalScrollBar - y: view.visibleArea.yPosition*view.height - } - } - ] - - Behavior on opacity { PropertyAnimation {} } - } - - MouseArea { - id: ma - enabled: true - width: verticalScrollBar.width - height: view.height - anchors.right: parent.right - hoverEnabled: true - drag.target: verticalScrollBar - drag.minimumY: 0 - drag.maximumY: view.height-verticalScrollBar.height - } - } - - Repeater { - id: highlightedLines - model: (!isMinimap && getCurrentSelection()) ? getCurrentSelection().len() : 0 - - delegate: Rectangle { - property var rowcol - property var cursor: children[0] - - color: "#444444" - radius: 2 - border.color: "#1c1c1c" - height: cursor.height - y: getYPosition(rowcol) - z: 3 - - function getYPosition(rowCol) { - if(rowCol) { - return rowcol[0] * (view.contentHeight/view.count) - view.contentY; - } - return 0; - } - - Text { - color: "#F8F8F0" - font.family: viewItem.fontFace - font.pointSize: viewItem.fontSize - } - } - } - - function onSelectionModified() { - if (myView == undefined) return; - - var selection = getCurrentSelection(), - backend = myView.back(), - buf = backend.buffer(), - of = 0; // todo: rename 'of' to something more descriptive - - highlightedLines.model = myView.regionLines(); - - for(var i = 0; i < selection.len(); i++) { - var rect = highlightedLines.itemAt(i), - s = selection.get(i); - - if (!s || !rect) continue; - - var rowcol, - lns = getLinesFromSelection(s, buf); - - // checks if we moved cursor forward or backward - if (s.b <= s.a) lns.reverse(); - for(var j = 0; j < lns.length; j++) { - rect = highlightedLines.itemAt(i+of); - of++; - rowcol = buf.rowCol(lns[j].a); - rect.rowcol = rowcol; - rect.x = getCursorOffset(lns[j].a, rowcol, rect.cursor, buf); - rowcol = buf.rowCol(lns[j].b); - rect.width = getCursorOffset(lns[j].b, rowcol, rect.cursor, buf) - rect.x; - } - of--; - - rect.cursor.x = (s.b <= s.a) ? 0 : rect.width; - rect.cursor.opacity = 1; - - var caretStyle = myView.setting("caret_style"), - inverseCaretState = myView.setting("inverse_caret_state"); - - if (caretStyle == "underscore") { - if (inverseCaretState) { - rect.cursor.text = "_"; - if (rect.width != 0) - rect.cursor.x -= rect.cursor.width; - } else { - rect.cursor.text = "|"; - // Shift the cursor to the edge of the character - rect.cursor.x -= 4; - } - } - } - // Clearing - for(var i = of + selection.len()+1; i < highlightedLines.count; i++) { - var rect = highlightedLines.itemAt(i); - if (!rect) continue; - rect.width = 0; - } - } - - // getCursorOffset returns the x coordinate for the cursor. - function getCursorOffset(cursorIndex, rowcol, cursor, buf) { - - var line = buf.line(cursorIndex), - currentLineText = buf.substr(line); - - // text from the beginning of the line to the given column - var textToCursor = currentLineText.substr(0, rowcol[1]); - - cursor.textFormat = TextEdit.RichText; - cursor.text = "" + textToCursor + ""; - - var cursorOffset = cursor.width; - - cursor.textFormat = TextEdit.PlainText; - cursor.text = ""; - - return (!cursorOffset) ? 0 : cursorOffset; - } - - // getLinesFromSelection returns an array of lines from the given - // selection and buffer. Works like buffer.Lines() - // - // note: the selection could be inverted, for example if a user starts - // selecting from the bottom up. This makes sure that the start of - // the selection is where the user stopped selecting. - function getLinesFromSelection(selection, buf) { - var lines = []; - - var safeSelection = (selection.b > selection.a) ? - { a: selection.a, b: selection.b }: - { a: selection.b, b: selection.a }; - - var rowCol = { - a: buf.rowCol(safeSelection.a), - b: buf.rowCol(safeSelection.b) - }; - - for(var i = rowCol.a[0]; i <= rowCol.b[0]; i++) { - var lr = buf.line(buf.textPoint(i, 0)), - a = (i == rowCol.a[0]) ? safeSelection.a : lr.a, - b = (i == rowCol.b[0]) ? safeSelection.b : lr.b, - res = (b > a) ? {a: a, b: b} : {a: b, b: a}; - lines.push(res); - } - - return lines; - } - - Timer { - interval: 100 - repeat: true - running: true - onTriggered: { - var o = 0.5 + 0.5 * Math.sin(Date.now()*0.008); - - for (var i = 0; i < highlightedLines.count; i++) { - var rect = highlightedLines.itemAt(i); - rect.cursor.opacity = o; - } - } - } -} diff --git a/frontend/qml/ToolTip.qml b/frontend/qml/ToolTip.qml deleted file mode 100644 index 9479978..0000000 --- a/frontend/qml/ToolTip.qml +++ /dev/null @@ -1,94 +0,0 @@ -import QtQuick 2.0 -import QtQuick.Controls 1.1 -import QtGraphicalEffects 1.0 - - -Item { - id: toolTipRoot - height: toolTipContainer.height - width: toolTipContainer.width - visible: false - clip: false - z: parent.parent.parent.z+100 - opacity: visible ? 1 : 0 - Behavior on opacity { PropertyAnimation { duration: 250} } - - property alias text: toolTip.text - property alias backgroundColor: content.color - property alias textColor: toolTip.color - property alias font: toolTip.font - - - MouseArea { - id: mouseItem - anchors.fill: parent; - hoverEnabled: true; - acceptedButtons: Qt.NoButton - onPositionChanged: { - function getAbsolutePosition(node) { - var returnPos = {}; - returnPos.x = 0; - returnPos.y = 0; - if(node !== undefined && node !== null) { - var parentValue = getAbsolutePosition(node.parent); - returnPos.x = parentValue.x + node.x; - returnPos.y = parentValue.y + node.y; - } - return returnPos; - } - var pos = getAbsolutePosition(this); - pos.x += mouse.x; - pos.y += mouse.y; - toolTipContainer.x = pos.x; - toolTipContainer.y = pos.y + 5; - } - Timer { - interval: 500 - running: mouseItem.containsMouse - repeat: false - onTriggered: { - toolTipRoot.visible = true; - } - } - onExited: { - toolTipRoot.visible = false; - } - } - - Component.onCompleted: { - mouseItem.parent = toolTipRoot.parent; - } - - Item { - id: toolTipContainer - width: content.width + toolTipShadow.radius - height: content.height + toolTipShadow.radius - z: toolTipRoot.z - - Rectangle { - id: content - width: toolTip.width + 10 - height: toolTip.contentHeight + 10 - Text { - x: 5 - y: 5 - id: toolTip - wrapMode: Text.WrapAnywhere - } - } - } - - DropShadow { - id: toolTipShadow - z: toolTipRoot.z - anchors.fill: source - cached: true - horizontalOffset: 4 - verticalOffset: 4 - radius: 8.0 - samples: 16 - color: "#80000000" - smooth: true - source: toolTipContainer - } -} diff --git a/frontend/qml/dialogs/OpenDialog.qml b/frontend/qml/dialogs/OpenDialog.qml deleted file mode 100644 index c0bc499..0000000 --- a/frontend/qml/dialogs/OpenDialog.qml +++ /dev/null @@ -1,30 +0,0 @@ -import QtQuick 2.0 -import QtQuick.Dialogs 1.0 - -FileDialog { - id: openDialog - title: qsTr("Open File") - folder: { - if (tabs.count == 0) return "/"; - - var fn = myWindow.view(tabs.currentIndex).title.text; - var sp = (Qt.platform.os == "windows") ? "\\" : "/"; - return fn.substring(0, fn.lastIndexOf(sp)+1); - } - selectMultiple: true - onAccepted: { - var _chosenFiles= openDialog.fileUrls; - var _urls = []; - for (var i = 0; i < _chosenFiles.length; i++) { - _urls[i] = _chosenFiles[i].toString(); - if(_urls[i].length >= 7 && _urls[i].slice(0, 7) == "file://") { - _urls[i] = _urls[i].slice(7) - } - console.log("Choosed: " + _urls[i]); - frontend.runCommandWithArgs("open_file", {"path" : _urls[i]}); - } - } - onRejected: { - console.log("Canceled.") - } -} diff --git a/frontend/qml/dialogs/qmldir b/frontend/qml/dialogs/qmldir deleted file mode 100644 index 3022072..0000000 --- a/frontend/qml/dialogs/qmldir +++ /dev/null @@ -1 +0,0 @@ -OpenDialog ./OpenDialog.qml \ No newline at end of file diff --git a/frontend/qml/frontend_view.go b/frontend/qml/frontend_view.go deleted file mode 100644 index 5bcd824..0000000 --- a/frontend/qml/frontend_view.go +++ /dev/null @@ -1,168 +0,0 @@ -// Copyright 2013 The lime Authors. -// Use of this source code is governed by a 2-clause -// BSD-style license that can be found in the LICENSE file. - -package main - -import ( - "bytes" - "fmt" - "io" - "strings" - - "gopkg.in/qml.v1" - - "github.com/limetext/lime/backend" - "github.com/limetext/lime/backend/render" - "github.com/limetext/lime/backend/util" - . "github.com/limetext/text" -) - -// A helper glue structure connecting the backend View with the qml code that -// then ends up rendering it. -type frontendView struct { - bv *backend.View - qv qml.Object - FormattedLine []*lineStruct - Title lineStruct -} - -// This allows us to trigger a qml.Changed on a specific line in the view so -// that only it is re-rendered by qml -type lineStruct struct { - Text string -} - -// htmlcol returns the hex color value for the given Colour object -func htmlcol(c render.Colour) string { - return fmt.Sprintf("%02X%02X%02X", c.R, c.G, c.B) -} - -func (fv *frontendView) Line(index int) *lineStruct { - return fv.FormattedLine[index] -} - -func (fv *frontendView) Region(a int, b int) Region { - return Region{a, b} -} - -func (fv *frontendView) RegionLines() int { - var count int = 0 - regs := fv.bv.Sel().Regions() - if fv.bv.Buffer() != nil { - for _, r := range regs { - count += len(fv.bv.Buffer().Lines(r)) - } - } - return count -} - -func (fv *frontendView) Setting(name string) interface{} { - return fv.Back().Settings().Get(name, nil) -} - -func (fv *frontendView) Back() *backend.View { - return fv.bv -} - -func (fv *frontendView) Fix(obj qml.Object) { - fv.qv = obj - - for i := range fv.FormattedLine { - _ = i - obj.Call("addLine") - } -} - -func (fv *frontendView) bufferChanged(buf Buffer, pos, delta int) { - prof := util.Prof.Enter("frontendView.bufferChanged") - defer prof.Exit() - - row1, _ := buf.RowCol(pos) - row2, _ := buf.RowCol(pos + delta) - if row1 > row2 { - row1, row2 = row2, row1 - } - - if delta > 0 && fv.qv != nil { - r1 := row1 - if add := strings.Count(buf.Substr(Region{pos, pos + delta}), "\n"); add > 0 { - nn := make([]*lineStruct, len(fv.FormattedLine)+add) - copy(nn, fv.FormattedLine[:r1]) - copy(nn[r1+add:], fv.FormattedLine[r1:]) - for i := 0; i < add; i++ { - nn[r1+i] = &lineStruct{Text: ""} - } - fv.FormattedLine = nn - for i := 0; i < add; i++ { - fv.qv.Call("insertLine", r1+i) - } - } - } - - for i := row1; i <= row2; i++ { - fv.formatLine(i) - } -} - -func (fv *frontendView) Erased(changed_buffer Buffer, region_removed Region, data_removed []rune) { - fv.bufferChanged(changed_buffer, region_removed.B, region_removed.A-region_removed.B) -} - -func (fv *frontendView) Inserted(changed_buffer Buffer, region_inserted Region, data_inserted []rune) { - fv.bufferChanged(changed_buffer, region_inserted.A, region_inserted.B-region_inserted.A) -} - -func (fv *frontendView) onChange(name string) { - if name != "lime.syntax.updated" { - return - } - // force redraw, as the syntax regions might have changed... - for i := range fv.FormattedLine { - fv.formatLine(i) - } -} - -func (fv *frontendView) formatLine(line int) { - prof := util.Prof.Enter("frontendView.formatLine") - defer prof.Exit() - buf := bytes.NewBuffer(nil) - vr := fv.bv.Buffer().Line(fv.bv.Buffer().TextPoint(line, 0)) - for line >= len(fv.FormattedLine) { - fv.FormattedLine = append(fv.FormattedLine, &lineStruct{Text: ""}) - if fv.qv != nil { - fv.qv.Call("addLine") - } - } - if vr.Size() == 0 { - if fv.FormattedLine[line].Text != "" { - fv.FormattedLine[line].Text = "" - t.qmlChanged(fv.FormattedLine[line], fv.FormattedLine[line]) - } - return - } - recipie := fv.bv.Transform(scheme, vr).Transcribe() - highlight_line := false - if b, ok := fv.bv.Settings().Get("highlight_line", highlight_line).(bool); ok { - highlight_line = b - } - lastEnd := vr.Begin() - - for _, reg := range recipie { - if lastEnd != reg.Region.Begin() { - fmt.Fprintf(buf, "%s", fv.bv.Buffer().Substr(Region{lastEnd, reg.Region.Begin()})) - } - fmt.Fprintf(buf, "%s", htmlcol(reg.Flavour.Foreground), htmlcol(reg.Flavour.Background), fv.bv.Buffer().Substr(reg.Region)) - lastEnd = reg.Region.End() - } - if lastEnd != vr.End() { - io.WriteString(buf, fv.bv.Buffer().Substr(Region{lastEnd, vr.End()})) - } - - str := buf.String() - - if fv.FormattedLine[line].Text != str { - fv.FormattedLine[line].Text = str - t.qmlChanged(fv.FormattedLine[line], fv.FormattedLine[line]) - } -} diff --git a/frontend/qml/frontend_window.go b/frontend/qml/frontend_window.go deleted file mode 100644 index 2436ee8..0000000 --- a/frontend/qml/frontend_window.go +++ /dev/null @@ -1,50 +0,0 @@ -// Copyright 2013 The lime Authors. -// Use of this source code is governed by a 2-clause -// BSD-style license that can be found in the LICENSE file. - -package main - -import ( - "github.com/limetext/lime/backend" - "gopkg.in/qml.v1" - "sync" -) - -// A helper glue structure connecting the backend Window with the qml.Window -type frontendWindow struct { - bw *backend.Window - views []*frontendView - window *qml.Window -} - -// Instantiates a new window, and launches a new goroutine waiting for it -// to be closed. The WaitGroup is increased at function entry and decreased -// once the window closes. -func (fw *frontendWindow) launch(wg *sync.WaitGroup, component qml.Object) { - wg.Add(1) - fw.window = component.CreateWindow(nil) - fw.window.Show() - fw.window.Set("myWindow", fw) - - go func() { - fw.window.Wait() - wg.Done() - }() -} - -func (fw *frontendWindow) View(idx int) *frontendView { - return fw.views[idx] -} - -func (fw *frontendWindow) ActiveViewIndex() int { - for i, v := range fw.views { - if v.bv == fw.bw.ActiveView() { - return i - } - } - return 0 -} - -func (fw *frontendWindow) Back() *backend.Window { - return fw.bw -} diff --git a/frontend/qml/keys.go b/frontend/qml/keys.go deleted file mode 100644 index bf92ce4..0000000 --- a/frontend/qml/keys.go +++ /dev/null @@ -1,195 +0,0 @@ -// Copyright 2013 The lime Authors. -// Use of this source code is governed by a 2-clause -// BSD-style license that can be found in the LICENSE file. - -package main - -import ( - "github.com/limetext/lime/backend/keys" -) - -// http://qt-project.org/doc/qt-5.1/qtcore/qt.html#Key-enum -var lut = map[int]keys.Key{ - 0x01000000: keys.Escape, - 0x01000001: '\t', - // 0x01000002 // Qt::Key_Backtab - 0x01000003: keys.Backspace, - 0x01000004: keys.Enter, - 0x01000005: keys.KeypadEnter, - 0x01000006: keys.Insert, - 0x01000007: keys.Delete, - 0x01000008: keys.Break, - // 0x01000009 // Qt::Key_Print - // 0x0100000a // Qt::Key_SysReq - // 0x0100000b // Qt::Key_Clear - 0x01000010: keys.Home, - 0x01000011: keys.End, - 0x01000012: keys.Left, - 0x01000013: keys.Up, - 0x01000014: keys.Right, - 0x01000015: keys.Down, - 0x01000016: keys.PageUp, - 0x01000017: keys.PageDown, - // 0x01000020 // Qt::Key_Shift - // 0x01000021 // Qt::Key_Control On Mac OS X, this corresponds to the Command keys. - // 0x01000022 // Qt::Key_Meta On Mac OS X, this corresponds to the Control keys. On Windows keyboards, this key is mapped to the Windows key. - // 0x01000023 // Qt::Key_Alt - // 0x01001103 // Qt::Key_AltGr On Windows, when the KeyDown event for this key is sent, the Ctrl+Alt modifiers are also set. - // 0x01000024 // Qt::Key_CapsLock - // 0x01000025 // Qt::Key_NumLock - // 0x01000026 // Qt::Key_ScrollLock - 0x01000030: keys.F1, - 0x01000031: keys.F2, - 0x01000032: keys.F3, - 0x01000033: keys.F4, - 0x01000034: keys.F5, - 0x01000035: keys.F6, - 0x01000036: keys.F7, - 0x01000037: keys.F8, - 0x01000038: keys.F9, - 0x01000039: keys.F10, - 0x0100003a: keys.F11, - 0x0100003b: keys.F12, - // 0x01000053 // Qt::Key_Super_L - // 0x01000054 // Qt::Key_Super_R - // 0x01000055 // Qt::Key_Menu - // 0x01000056 // Qt::Key_Hyper_L - // 0x01000057 // Qt::Key_Hyper_R - // 0x01000058 // Qt::Key_Help - // 0x01000059 // Qt::Key_Clear - // 0x01000060 // Qt::Key_Direction_R - 0x20: ' ', - 0x21: '!', - 0x22: '"', - 0x23: '#', - 0x24: '$', - 0x25: '%', - 0x26: '&', - 0x27: '\'', - 0x28: '(', - 0x29: ')', - 0x2a: '*', - 0x2b: '+', - 0x2c: ',', - 0x2d: '-', - 0x2e: '.', - 0x2f: '/', - 0x30: '0', - 0x31: '1', - 0x32: '2', - 0x33: '3', - 0x34: '4', - 0x35: '5', - 0x36: '6', - 0x37: '7', - 0x38: '8', - 0x39: '9', - 0x3a: ':', - 0x3b: ';', - 0x3c: '<', - 0x3d: '=', - 0x3e: '>', - 0x3f: '?', - 0x40: '@', - 0x41: 'a', - 0x42: 'b', - 0x43: 'c', - 0x44: 'd', - 0x45: 'e', - 0x46: 'f', - 0x47: 'g', - 0x48: 'h', - 0x49: 'i', - 0x4A: 'j', - 0x4B: 'k', - 0x4C: 'l', - 0x4d: 'm', - 0x4e: 'n', - 0x4f: 'o', - 0x50: 'p', - 0x51: 'q', - 0x52: 'r', - 0x53: 's', - 0x54: 't', - 0x55: 'u', - 0x56: 'v', - 0x57: 'w', - 0x58: 'x', - 0x59: 'y', - 0x5a: 'z', - 0x5b: '[', - 0x5c: '\\', - 0x5d: ']', - 0x5e: '°', // Qt::Key_AsciiCircum - 0x5f: '_', // Qt::Key_Underscore - 0x60: '`', // Qt::Key_QuoteLeft - 0x7b: '{', // Qt::Key_BraceLeft - 0x7c: '|', // Qt::Key_Bar - 0x7d: '}', // Qt::Key_BraceRight - 0x7e: '~', // Qt::Key_AsciiTilde - // 0x0a0: '', // Qt::Key_nobreakspace - // 0x0a1: '', // Qt::Key_exclamdown - // 0x0a2: '', // Qt::Key_cent - // 0x0a3: '', // Qt::Key_sterling - // 0x0a4: '', // Qt::Key_currency - // 0x0a5: '', // Qt::Key_yen - // 0x0a6: '', // Qt::Key_brokenbar - // 0x0a7: '', // Qt::Key_section - // 0x0a8: '', // Qt::Key_diaeresis - // 0x0a9: '', // Qt::Key_copyright - // 0x0aa: '', // Qt::Key_ordfeminine - // 0x0ab: '', // Qt::Key_guillemotleft - // 0x0ac: '', // Qt::Key_notsign - // 0x0ad: '', // Qt::Key_hyphen - // 0x0ae: '', // Qt::Key_registered - // 0x0af: '', // Qt::Key_macron - 0x0b0: '°', // Qt::Key_degree - // 0x0b1: '', // Qt::Key_plusminus - 0x0b2: '²', // Qt::Key_twosuperior - 0x0b3: '³', // Qt::Key_threesuperior - 0x0b4: '´', // Qt::Key_acute - // 0x0b5: '', // Qt::Key_mu - // 0x0b6: '', // Qt::Key_paragraph - // 0x0b7: '', // Qt::Key_periodcentered - // 0x0b8: '', // Qt::Key_cedilla - // 0x0b9: '', // Qt::Key_onesuperior - // 0x0ba: '', // Qt::Key_masculine - // 0x0bb: '', // Qt::Key_guillemotright - // 0x0bc: '', // Qt::Key_onequarter - // 0x0bd: '', // Qt::Key_onehalf - // 0x0be: '', // Qt::Key_threequarters - // 0x0bf: '', // Qt::Key_questiondown - // 0x0c0: '', // Qt::Key_Agrave - // 0x0c1: '', // Qt::Key_Aacute - // 0x0c2: '', // Qt::Key_Acircumflex - // 0x0c3: '', // Qt::Key_Atilde - 0x0c4: 'ä', // Qt::Key_Adiaeresis - // 0x0c5: '', // Qt::Key_Aring - // 0x0c6: '', // Qt::Key_AE - // 0x0c7: '', // Qt::Key_Ccedilla - // 0x0c8: '', // Qt::Key_Egrave - // 0x0c9: '', // Qt::Key_Eacute - // 0x0ca: '', // Qt::Key_Ecircumflex - // 0x0cb: '', // Qt::Key_Ediaeresis - // 0x0cc: '', // Qt::Key_Igrave - // 0x0cd: '', // Qt::Key_Iacute - // 0x0ce: '', // Qt::Key_Icircumflex - // 0x0cf: '', // Qt::Key_Idiaeresis - // 0x0d0: '', // Qt::Key_ETH - // 0x0d1: '', // Qt::Key_Ntilde - // 0x0d2: '', // Qt::Key_Ograve - // 0x0d3: '', // Qt::Key_Oacute - // 0x0d4: '', // Qt::Key_Ocircumflex - // 0x0d5: '', // Qt::Key_Otilde - 0x0d6: 'ö', // Qt::Key_Odiaeresis - // 0x0d7: '', // Qt::Key_multiply - // 0x0d8: '', // Qt::Key_Ooblique - // 0x0d9: '', // Qt::Key_Ugrave - // 0x0da: '', // Qt::Key_Uacute - // 0x0db: '', // Qt::Key_Ucircumflex - 0x0dc: 'ü', // Qt::Key_Udiaeresis - // 0x0dd: '', // Qt::Key_Yacute - // 0x0de: '', // Qt::Key_THORN - // 0x0df: '', // Qt::Key_ssharp - // 0x0f7: '', // Qt::Key_division -} diff --git a/frontend/qml/lime.pro b/frontend/qml/lime.pro deleted file mode 100644 index 22c2751..0000000 --- a/frontend/qml/lime.pro +++ /dev/null @@ -1,6 +0,0 @@ -SOURCES = \ - *.qml \ - dialogs/*.qml - -TRANSLATIONS = \ - i18n/lime_fr.ts diff --git a/frontend/qml/main.go b/frontend/qml/main.go deleted file mode 100644 index 2616ed5..0000000 --- a/frontend/qml/main.go +++ /dev/null @@ -1,44 +0,0 @@ -// Copyright 2013 The lime Authors. -// Use of this source code is governed by a 2-clause -// BSD-style license that can be found in the LICENSE file. - -package main - -import ( - "runtime" - - "gopkg.in/qml.v1" - - "github.com/limetext/gopy/lib" - "github.com/limetext/lime/backend" - _ "github.com/limetext/lime/backend/commands" - "github.com/limetext/lime/backend/log" - "github.com/limetext/lime/backend/textmate" -) - -const ( - console_height = 20 - render_chan_len = 2 -) - -var ( - t *qmlfrontend - - scheme *textmate.Theme - blink bool -) - -func main() { - // Need to lock the OS thread as OSX GUI requires GUI stuff to run in the main thread - runtime.LockOSThread() - - log.AddFilter("file", log.DEBUG, log.NewConsoleLogWriter()) - defer func() { - py.NewLock() - py.Finalize() - }() - - t = &qmlfrontend{windows: make(map[*backend.Window]*frontendWindow)} - go t.qmlBatchLoop() - qml.Run(t.loop) -} diff --git a/frontend/qml/main.qml b/frontend/qml/main.qml deleted file mode 100644 index f39e1ee..0000000 --- a/frontend/qml/main.qml +++ /dev/null @@ -1,335 +0,0 @@ -import QtQuick 2.0 -import QtQuick.Controls 1.0 -import QtQuick.Controls.Styles 1.0 -import QtQuick.Dialogs 1.0 -import QtQuick.Layouts 1.0 -import QtGraphicalEffects 1.0 - -import "dialogs" - -ApplicationWindow { - id: window - width: 800 - height: 600 - title: "Lime" - - property var myWindow - - function view() { - return tabs.getTab(tabs.currentIndex).item; - } - - menuBar: MenuBar { - id: menu - Menu { - title: qsTr("&File") - MenuItem { - text: qsTr("&New File") - shortcut: "Ctrl+N" - onTriggered: frontend.runCommand("new_file"); - } - MenuItem { - text: qsTr("&Open File...") - shortcut: "Ctrl+O" - onTriggered: openDialog.open(); - } - MenuItem { - text: qsTr("&Save") - shortcut: "Ctrl+S" - onTriggered: frontend.runCommand("save"); - } - MenuItem { - text: qsTr("&Save As...") - shortcut: "Shift+Ctrl+S" - // TODO(.) : qml doesn't have a ready dialog like FileDialog - // onTriggered: saveAsDialog.open() - } - MenuItem { - text: qsTr("&Save All") - onTriggered: frontend.runCommand("save_all") - } - MenuSeparator{} - MenuItem { - text: qsTr("&New Window") - shortcut: "Shift+Ctrl+N" - onTriggered: frontend.runCommand("new_window"); - } - MenuItem { - text: qsTr("&Close Window") - shortcut: "Shift+Ctrl+W" - onTriggered: frontend.runCommand("close_window"); - } - MenuSeparator{} - MenuItem { - text: qsTr("&Close File") - shortcut: "Ctrl+W" - onTriggered: frontend.runCommand("close_view"); - } - MenuItem { - text: qsTr("&Close All Files") - onTriggered: frontend.runCommand("close_all"); - } - MenuSeparator{} - MenuItem { - text: qsTr("&Quit") - shortcut: "Ctrl+Q" - onTriggered: Qt.quit(); // frontend.runCommand("quit"); - } - } - Menu { - title: qsTr("Find") - MenuItem { - text: qsTr("Find Next") - onTriggered: frontend.runCommand("find_next"); - } - } - Menu { - title: qsTr("&Edit") - MenuItem { - text: qsTr("&Undo") - shortcut: "Ctrl+Z" - onTriggered: frontend.runCommand("undo"); - } - MenuItem { - text: qsTr("&Redo") - shortcut: "Ctrl+Y" - onTriggered: frontend.runCommand("redo"); - } - Menu { - title: qsTr("&Undo Selection") - MenuItem { - text: qsTr("&Soft Undo") - shortcut: "Ctrl+U" - onTriggered: frontend.runCommand("soft_undo"); - } - MenuItem { - text: qsTr("&Soft Redo") - shortcut: "Shift+Ctrl+U" - onTriggered: frontend.runCommand("soft_redo"); - } - } - MenuSeparator{} - MenuItem { - text: qsTr("&Copy") - shortcut: "Ctrl+C" - onTriggered: frontend.runCommand("copy"); - } - MenuItem { - text: qsTr("&Cut") - shortcut: "Ctrl+X" - onTriggered: frontend.runCommand("cut"); - } - MenuItem { - text: qsTr("&Paste") - shortcut: "Ctrl+V" - onTriggered: frontend.runCommand("paste"); - } - } - Menu { - title: qsTr("&View") - MenuItem { - text: qsTr("Sh&ow/Hide Console") - shortcut: "Ctrl+`" - onTriggered: if (consoleView.visible == true) { consoleView.visible=false } else { consoleView.visible=true } - } - MenuItem { - text: qsTr("Show/Hide Minimap") - onTriggered: if (minimap.visible == true) { minimap.visible=false } else { minimap.visible=true } - } - MenuItem { - text: qsTr("Sh&ow/Hide Statusbar") - onTriggered: if (statusBar.visible == true) { statusBar.visible=false } else { statusBar.visible=true } - } - } - } - - statusBar: StatusBar { - id: statusBar - style: StatusBarStyle { - background: Image { - source: "../../packages/themes/soda/Soda Dark/status-bar-background.png" - } - } - - property color textColor: "#969696" - - RowLayout { - anchors.fill: parent - id: statusBarRowLayout - spacing: 15 - - RowLayout { - anchors.fill: parent - spacing: 3 - - Label { - text: "git branch: master" - color: statusBar.textColor - } - - Label { - text: "INSERT MODE" - color: statusBar.textColor - } - - Label { - id: statusBarCaretPos - text: "Line xx, Column yy" - color: statusBar.textColor - } - } - - Label { - id: statusBarIndent - text: "Tab Size/Spaces: 4" - color: statusBar.textColor - Layout.alignment: Qt.AlignRight - } - - Label { - id: statusBarLanguage - text: "Go" - color: statusBar.textColor - Layout.alignment: Qt.AlignRight - } - } - } - - Item { - anchors.fill: parent - Keys.onPressed: { - view().ctrl = (event.key == Qt.Key_Control) ? true : false; - event.accepted = frontend.handleInput(event.text, event.key, event.modifiers) - } - Keys.onReleased: { - view().ctrl = (event.key == Qt.Key_Control) ? false : view().ctrl; - } - focus: true // Focus required for Keys.onPressed - SplitView { - anchors.fill: parent - orientation: Qt.Vertical - SplitView { - Layout.fillHeight: true - TabView { - Layout.fillHeight: true - Layout.fillWidth: true - id: tabs - objectName: "tabs" - style: TabViewStyle { - frameOverlap: 0 - tab: Item { - implicitWidth: 180 - implicitHeight: 28 - ToolTip { - backgroundColor: "#BECCCC66" - textColor: "black" - font.pointSize: 8 - text: styleData.title - Component.onCompleted: { - this.parent = tabs; - } - } - BorderImage { - source: styleData.selected ? "../../packages/themes/soda/Soda Dark/tab-active.png" : "../../packages/themes/soda/Soda Dark/tab-inactive.png" - border { left: 5; top: 5; right: 5; bottom: 5 } - width: 180 - height: 25 - Text { - id: tab_title - anchors.centerIn: parent - text: styleData.title.replace(/^.*[\\\/]/, '') - color: frontend.defaultFg() - anchors.verticalCenterOffset: 1 - } - } - } - tabBar: Image { - fillMode: Image.TileHorizontally - source: "../../packages/themes/soda/Soda Dark/tabset-background.png" - } - tabsMovable: true - frame: Rectangle { color: frontend.defaultBg() } - tabOverlap: 5 - } - function resetminimap() { - var rv = view().children[1]; - minimap.myView = null; - minimap.children[1].model = rv.model.count; - minimap.myView = myWindow.view(currentIndex); - minimap.realView = rv; - } - Component.onCompleted: { - resetminimap(); - } - onCurrentIndexChanged: { - myWindow.back().setActiveView(myWindow.view(currentIndex).back()); - resetminimap(); - } - } - LimeView { - Layout.maximumWidth: 100 - Layout.minimumWidth: 100 - Layout.preferredWidth: 100 - width: 100 - isMinimap: true - cursor: Qt.ArrowCursor - property var realView - property var oldView - - function scroll() { - var p = percentage(realView); - children[1].contentY = p*(children[1].contentHeight-height); - if (!ma.drag.active) { - minimapArea.y = p*(height-minimapArea.height) - } - } - - onRealViewChanged: { - if (oldView) { - oldView.contentYChanged.disconnect(scroll); - } - realView.contentYChanged.connect(scroll); - oldView = realView; - } - function percentage(view) { - return view.visibleArea.yPosition/(1-view.visibleArea.heightRatio); - } - id: minimap - Rectangle { - id: minimapArea - width: parent.width - height: parent.realView ? parent.realView.visibleArea.heightRatio*parent.children[1].contentHeight : parent.height - color: "white" - opacity: 0.1 - onYChanged: { - if (ma.drag.active) { - parent.realView.contentY = y*(parent.realView.contentHeight-parent.realView.height)/(parent.height-height); - } - } - onHeightChanged: { - parent.scroll(); - } - MouseArea { - id: ma - drag.target: parent - anchors.fill: parent - drag.minimumX: 0 - drag.minimumY: 0 - drag.maximumY: parent.parent.height-height - drag.maximumX: parent.parent.width-width - } - } - } - } - LimeView { - id: consoleView - visible: false - myView: frontend.console - height: 100 - } - } - } - OpenDialog { - id: openDialog - } -} diff --git a/frontend/qml/main_test.go b/frontend/qml/main_test.go deleted file mode 100644 index 1f02bf8..0000000 --- a/frontend/qml/main_test.go +++ /dev/null @@ -1,5 +0,0 @@ -// Copyright 2014 The lime Authors. -// Use of this source code is governed by a 2-clause -// BSD-style license that can be found in the LICENSE file. - -package main diff --git a/frontend/qml/qml_dialog.go b/frontend/qml/qml_dialog.go deleted file mode 100644 index 16a52bb..0000000 --- a/frontend/qml/qml_dialog.go +++ /dev/null @@ -1,54 +0,0 @@ -// Copyright 2013 The lime Authors. -// Use of this source code is governed by a 2-clause -// BSD-style license that can be found in the LICENSE file. - -package main - -import ( - "github.com/limetext/lime/backend/log" - "gopkg.in/qml.v1" - "sync" -) - -type ( - qmlDialog struct{} -) - -func (q *qmlDialog) Show(msg, icon string) (ret int) { - src := `import QtQuick 2.2 -import QtQuick.Dialogs 1.1 - -Item {MessageDialog { - objectName: "realDialog" - id: messageDialog - title: "May I have your attention please" - text: "` + msg + `" - icon: ` + icon + ` - standardButtons: StandardButton.Ok | StandardButton.Cancel - Component.onCompleted: visible = true -}}` - engine := qml.NewEngine() - engine.Context().SetVar("q", q) - component, err := engine.LoadString("dialog.qml", src) - if err != nil { - log.Errorf("Unable to instanciate dialog: %s", err) - return 0 - } - var wg sync.WaitGroup - wg.Add(1) - obj := component.Create(nil) - obj = obj.ObjectByName("realDialog") - obj.On("accepted", func() { - ret = 1 - wg.Done() - }) - obj.On("rejected", func() { - ret = 0 - wg.Done() - }) - - wg.Wait() - engine.Destroy() - log.Debug("returning %d", ret) - return -} diff --git a/frontend/qml/qml_frontend.go b/frontend/qml/qml_frontend.go deleted file mode 100644 index 52ab380..0000000 --- a/frontend/qml/qml_frontend.go +++ /dev/null @@ -1,430 +0,0 @@ -// Copyright 2013 The lime Authors. -// Use of this source code is governed by a 2-clause -// BSD-style license that can be found in the LICENSE file. - -package main - -import ( - "fmt" - "image/color" - "runtime" - "strings" - "sync" - "time" - - "gopkg.in/fsnotify.v0" - "gopkg.in/qml.v1" - - "github.com/limetext/lime/backend" - "github.com/limetext/lime/backend/keys" - "github.com/limetext/lime/backend/log" - "github.com/limetext/lime/backend/render" - _ "github.com/limetext/lime/backend/sublime" - "github.com/limetext/lime/backend/textmate" - "github.com/limetext/lime/backend/util" - . "github.com/limetext/text" -) - -var limeViewComponent qml.Object - -const ( - batching_enabled = true - qmlMainFile = "main.qml" - qmlViewFile = "LimeView.qml" - - // http://qt-project.org/doc/qt-5.1/qtcore/qt.html#KeyboardModifier-enum - shift_mod = 0x02000000 - ctrl_mod = 0x04000000 - alt_mod = 0x08000000 - meta_mod = 0x10000000 - keypad_mod = 0x20000000 -) - -// keeping track of frontend state -type qmlfrontend struct { - status_message string - lock sync.Mutex - windows map[*backend.Window]*frontendWindow - Console *frontendView - qmlDispatch chan qmlDispatch -} - -// Used for batching qml.Changed calls -type qmlDispatch struct{ value, field interface{} } - -func (t *qmlfrontend) Window(w *backend.Window) *frontendWindow { - return t.windows[w] -} - -func (t *qmlfrontend) Show(v *backend.View, r Region) { - // TODO -} - -func (t *qmlfrontend) VisibleRegion(v *backend.View) Region { - // TODO - return Region{0, v.Buffer().Size()} -} - -func (t *qmlfrontend) StatusMessage(msg string) { - t.lock.Lock() - defer t.lock.Unlock() - t.status_message = msg -} - -func (t *qmlfrontend) ErrorMessage(msg string) { - log.Error(msg) - var q qmlDialog - q.Show(msg, "StandardIcon.Critical") -} - -func (t *qmlfrontend) MessageDialog(msg string) { - var q qmlDialog - q.Show(msg, "StandardIcon.Information") -} - -func (t *qmlfrontend) OkCancelDialog(msg, ok string) bool { - var q qmlDialog - return q.Show(msg, "StandardIcon.Question") == 1 -} - -func (t *qmlfrontend) scroll(b Buffer) { - t.Show(backend.GetEditor().Console(), Region{b.Size(), b.Size()}) -} - -func (t *qmlfrontend) Erased(changed_buffer Buffer, region_removed Region, data_removed []rune) { - t.scroll(changed_buffer) -} - -func (t *qmlfrontend) Inserted(changed_buffer Buffer, region_inserted Region, data_inserted []rune) { - t.scroll(changed_buffer) -} - -// Apparently calling qml.Changed also triggers a re-draw, meaning that typed text is at the -// mercy of how quick Qt happens to be rendering. -// Try setting batching_enabled = false to see the effects of non-batching -func (t *qmlfrontend) qmlBatchLoop() { - queue := make(map[qmlDispatch]bool) - t.qmlDispatch = make(chan qmlDispatch, 1000) - for { - if len(queue) > 0 { - select { - case <-time.After(time.Millisecond * 20): - // Nothing happened for 20 milliseconds, so dispatch all queued changes - for k := range queue { - qml.Changed(k.value, k.field) - } - queue = make(map[qmlDispatch]bool) - case d := <-t.qmlDispatch: - queue[d] = true - } - } else { - queue[<-t.qmlDispatch] = true - } - } -} - -func (t *qmlfrontend) qmlChanged(value, field interface{}) { - if !batching_enabled { - qml.Changed(value, field) - } else { - t.qmlDispatch <- qmlDispatch{value, field} - } -} - -func (t *qmlfrontend) DefaultBg() color.RGBA { - c := scheme.Spice(&render.ViewRegions{}) - c.Background.A = 0xff - return color.RGBA(c.Background) -} - -func (t *qmlfrontend) DefaultFg() color.RGBA { - c := scheme.Spice(&render.ViewRegions{}) - c.Foreground.A = 0xff - return color.RGBA(c.Foreground) -} - -// Called when a new view is opened -func (t *qmlfrontend) onNew(v *backend.View) { - fv := &frontendView{bv: v} - v.Buffer().AddObserver(fv) - v.Settings().AddOnChange("blah", fv.onChange) - - fv.Title.Text = v.Buffer().FileName() - if len(fv.Title.Text) == 0 { - fv.Title.Text = "untitled" - } - - w2 := t.windows[v.Window()] - w2.views = append(w2.views, fv) - - tabs := w2.window.ObjectByName("tabs") - tab := tabs.Call("addTab", "", limeViewComponent).(qml.Object) - try_now := func() { - item := tab.Property("item").(qml.Object) - if item.Addr() == 0 { - // Happens as the item isn't actually loaded until we switch to the tab. - // Hence connecting to the loaded signal - return - } - item.Set("myView", fv) - item.Set("fontSize", v.Settings().Get("font_size", 12).(float64)) - item.Set("fontFace", v.Settings().Get("font_face", "Helvetica").(string)) - } - tab.On("loaded", try_now) - try_now() - tabs.Set("currentIndex", tabs.Property("count").(int)-1) -} - -// called when a view is closed -func (t *qmlfrontend) onClose(v *backend.View) { - w2 := t.windows[v.Window()] - for i := range w2.views { - if w2.views[i].bv == v { - w2.window.ObjectByName("tabs").Call("removeTab", i) - copy(w2.views[i:], w2.views[i+1:]) - w2.views = w2.views[:len(w2.views)-1] - return - } - } - log.Error("Couldn't find closed view...") -} - -// called when a view has loaded -func (t *qmlfrontend) onLoad(v *backend.View) { - w2 := t.windows[v.Window()] - i := 0 - for i = range w2.views { - if w2.views[i].bv == v { - break - } - } - v2 := w2.views[i] - v2.Title.Text = v.Buffer().FileName() - tabs := w2.window.ObjectByName("tabs") - tabs.Set("currentIndex", w2.ActiveViewIndex()) - tab := tabs.Call("getTab", i).(qml.Object) - tab.Set("title", v2.Title.Text) -} - -func (t *qmlfrontend) onSelectionModified(v *backend.View) { - w2 := t.windows[v.Window()] - i := 0 - for i = range w2.views { - if w2.views[i].bv == v { - break - } - } - v2 := w2.views[i] - v2.qv.Call("onSelectionModified") -} - -// Launches the provided command in a new goroutine -// (to avoid locking up the GUI) -func (t *qmlfrontend) RunCommand(command string) { - t.RunCommandWithArgs(command, make(backend.Args)) -} - -func (t *qmlfrontend) RunCommandWithArgs(command string, args backend.Args) { - ed := backend.GetEditor() - go ed.RunCommand(command, args) -} - -func (t *qmlfrontend) HandleInput(text string, keycode int, modifiers int) bool { - log.Debug("qmlfrontend.HandleInput: text=%v, key=%x, modifiers=%x", text, keycode, modifiers) - shift := false - alt := false - ctrl := false - super := false - - if key, ok := lut[keycode]; ok { - ed := backend.GetEditor() - - if (modifiers & shift_mod) != 0 { - shift = true - } - if (modifiers & alt_mod) != 0 { - alt = true - } - if (modifiers & ctrl_mod) != 0 { - if runtime.GOOS == "darwin" { - super = true - } else { - ctrl = true - } - } - if (modifiers & meta_mod) != 0 { - if runtime.GOOS == "darwin" { - ctrl = true - } else { - super = true - } - } - - ed.HandleInput(keys.KeyPress{Text: text, Key: key, Shift: shift, Alt: alt, Ctrl: ctrl, Super: super}) - return true - } - return false -} - -// Quit closes all open windows to de-reference all qml objects -func (t *qmlfrontend) Quit() (err error) { - // todo: handle changed files that aren't saved. - for _, v := range t.windows { - if v.window != nil { - v.window.Hide() - v.window.Destroy() - v.window = nil - } - } - return -} - -func (t *qmlfrontend) loop() (err error) { - backend.OnNew.Add(t.onNew) - backend.OnClose.Add(t.onClose) - backend.OnLoad.Add(t.onLoad) - backend.OnSelectionModified.Add(t.onSelectionModified) - - ed := backend.GetEditor() - ed.SetFrontend(t) - ed.LogInput(false) - ed.LogCommands(false) - c := ed.Console() - t.Console = &frontendView{bv: c} - c.Buffer().AddObserver(t.Console) - c.Buffer().AddObserver(t) - go ed.Init() - - var ( - engine *qml.Engine - component qml.Object - // WaitGroup keeping track of open windows - wg sync.WaitGroup - ) - - // create and setup a new engine, destroying - // the old one if one exists. - // - // This is needed to re-load qml files to get - // the new file contents from disc as otherwise - // the old file would still be what is referenced. - newEngine := func() (err error) { - if engine != nil { - log.Debug("calling destroy") - // TODO(.): calling this appears to make the editor *very* crash-prone, just let it leak for now - // engine.Destroy() - engine = nil - } - log.Debug("calling newEngine") - engine = qml.NewEngine() - engine.On("quit", t.Quit) - log.Debug("setvar frontend") - engine.Context().SetVar("frontend", t) - log.Debug("setvar editor") - engine.Context().SetVar("editor", backend.GetEditor()) - - log.Debug("loadfile") - component, err = engine.LoadFile(qmlMainFile) - if err != nil { - return err - } - limeViewComponent, err = engine.LoadFile(qmlViewFile) - return - } - if err := newEngine(); err != nil { - log.Error(err) - } - - backend.OnNewWindow.Add(func(w *backend.Window) { - fw := &frontendWindow{bw: w} - t.windows[w] = fw - if component != nil { - fw.launch(&wg, component) - } - }) - - // TODO: should be done backend side - if sc, err := textmate.LoadTheme("../../packages/themes/TextMate-Themes/Monokai.tmTheme"); err != nil { - log.Error(err) - } else { - scheme = sc - } - - defer func() { - fmt.Println(util.Prof) - }() - - w := ed.NewWindow() - v := w.OpenFile("main.go", 0) - // TODO: should be done backend side - v.SetSyntaxFile("../../packages/go.tmbundle/Syntaxes/Go.tmLanguage") - v = w.OpenFile("../../backend/editor.go", 0) - // TODO: should be done backend side - v.SetSyntaxFile("../../packages/go.tmbundle/Syntaxes/Go.tmLanguage") - - watch, err := fsnotify.NewWatcher() - if err != nil { - log.Errorf("Unable to create file watcher: %s", err) - return - } - defer watch.Close() - watch.Watch(".") - defer watch.RemoveWatch(".") - - reloadRequested := false - - go func() { - for { - select { - case ev := <-watch.Event: - if ev != nil && strings.HasSuffix(ev.Name, ".qml") && ev.IsModify() && !ev.IsAttrib() { - reloadRequested = true - t.Quit() - } - } - } - }() - - for { - // Reset reload status - reloadRequested = false - - log.Debug("Waiting for all windows to close") - // wg would be the WaitGroup all windows belong to, so first we wait for - // all windows to close. - wg.Wait() - log.Debug("All windows closed. reloadRequest: %v", reloadRequested) - // then we check if there's a reload request in the pipe - if !reloadRequested || len(t.windows) == 0 { - // This would be a genuine exit; all windows closed by the user - break - } - - // *We* closed all windows because we want to reload freshly changed qml - // files. - for { - log.Debug("Calling newEngine") - if err := newEngine(); err != nil { - // Reset reload status - reloadRequested = false - log.Error(err) - for !reloadRequested { - // This loop allows us to re-try reloading - // if there was an error in the file this time, - // we just loop around again when we receive the next - // reload request (ie on the next save of the file). - time.Sleep(time.Second) - } - continue - } - log.Debug("break") - break - } - log.Debug("re-launching all windows") - // Succeeded loading the file, re-launch all windows - for _, v := range t.windows { - v.launch(&wg, component) - } - } - return -} diff --git a/frontend/quietyou.go b/frontend/quietyou.go deleted file mode 100644 index 53b2bc6..0000000 --- a/frontend/quietyou.go +++ /dev/null @@ -1,5 +0,0 @@ -// Copyright 2013 The lime Authors. -// Use of this source code is governed by a 2-clause -// BSD-style license that can be found in the LICENSE file. -// just to silence go test -package frontend diff --git a/frontend/termbox/main.go b/frontend/termbox/main.go deleted file mode 100644 index af98a87..0000000 --- a/frontend/termbox/main.go +++ /dev/null @@ -1,820 +0,0 @@ -// Copyright 2013 The lime Authors. -// Use of this source code is governed by a 2-clause -// BSD-style license that can be found in the LICENSE file. -package main - -import ( - "flag" - "fmt" - "path" - "runtime/debug" - "strconv" - "sync" - "time" - - "github.com/limetext/gopy/lib" - "github.com/limetext/lime/backend" - _ "github.com/limetext/lime/backend/commands" - "github.com/limetext/lime/backend/keys" - "github.com/limetext/lime/backend/log" - _ "github.com/limetext/lime/backend/sublime" - "github.com/limetext/lime/backend/textmate" - "github.com/limetext/lime/backend/util" - "github.com/limetext/termbox-go" - . "github.com/limetext/text" -) - -var ( - lut = map[termbox.Key]keys.KeyPress{ - // Omission of these are intentional due to map collisions - // termbox.KeyCtrlTilde: keys.KeyPress{Ctrl: true, Key: '~'}, - // termbox.KeyCtrlBackslash: keys.KeyPress{Ctrl: true, Key: '\\'}, - // termbox.KeyCtrlSlash: keys.KeyPress{Ctrl: true, Key: '/'}, - // termbox.KeyCtrlUnderscore: keys.KeyPress{Ctrl: true, Key: '_'}, - // termbox.KeyCtrlLsqBracket: keys.KeyPress{Ctrl: true, Key: '{'}, - // termbox.KeyCtrlRsqBracket: keys.KeyPress{Ctrl: true, Key: '}'}, - // termbox.KeyCtrl3: - // termbox.KeyCtrl8 - // termbox.KeyCtrl2: keys.KeyPress{Ctrl: true, Key: '2'}, - termbox.KeyCtrlSpace: {Ctrl: true, Key: ' '}, - termbox.KeyCtrlA: {Ctrl: true, Key: 'a'}, - termbox.KeyCtrlB: {Ctrl: true, Key: 'b'}, - termbox.KeyCtrlC: {Ctrl: true, Key: 'c'}, - termbox.KeyCtrlD: {Ctrl: true, Key: 'd'}, - termbox.KeyCtrlE: {Ctrl: true, Key: 'e'}, - termbox.KeyCtrlF: {Ctrl: true, Key: 'f'}, - termbox.KeyCtrlG: {Ctrl: true, Key: 'g'}, - termbox.KeyCtrlH: {Ctrl: true, Key: 'h'}, - termbox.KeyCtrlJ: {Ctrl: true, Key: 'j'}, - termbox.KeyCtrlK: {Ctrl: true, Key: 'k'}, - termbox.KeyCtrlL: {Ctrl: true, Key: 'l'}, - termbox.KeyCtrlN: {Ctrl: true, Key: 'n'}, - termbox.KeyCtrlO: {Ctrl: true, Key: 'o'}, - termbox.KeyCtrlP: {Ctrl: true, Key: 'p'}, - termbox.KeyCtrlQ: {Ctrl: true, Key: 'q'}, - termbox.KeyCtrlR: {Ctrl: true, Key: 'r'}, - termbox.KeyCtrlS: {Ctrl: true, Key: 's'}, - termbox.KeyCtrlT: {Ctrl: true, Key: 't'}, - termbox.KeyCtrlU: {Ctrl: true, Key: 'u'}, - termbox.KeyCtrlV: {Ctrl: true, Key: 'v'}, - termbox.KeyCtrlW: {Ctrl: true, Key: 'w'}, - termbox.KeyCtrlX: {Ctrl: true, Key: 'x'}, - termbox.KeyCtrlY: {Ctrl: true, Key: 'y'}, - termbox.KeyCtrlZ: {Ctrl: true, Key: 'z'}, - termbox.KeyCtrl4: {Ctrl: true, Key: '4'}, - termbox.KeyCtrl5: {Ctrl: true, Key: '5'}, - termbox.KeyCtrl6: {Ctrl: true, Key: '6'}, - termbox.KeyCtrl7: {Ctrl: true, Key: '7'}, - termbox.KeyEnter: {Key: keys.Enter}, - termbox.KeySpace: {Key: ' '}, - termbox.KeyBackspace2: {Key: keys.Backspace}, - termbox.KeyArrowUp: {Key: keys.Up}, - termbox.KeyArrowDown: {Key: keys.Down}, - termbox.KeyArrowLeft: {Key: keys.Left}, - termbox.KeyArrowRight: {Key: keys.Right}, - termbox.KeyDelete: {Key: keys.Delete}, - termbox.KeyEsc: {Key: keys.Escape}, - termbox.KeyPgup: {Key: keys.PageUp}, - termbox.KeyPgdn: {Key: keys.PageDown}, - termbox.KeyF1: {Key: keys.F1}, - termbox.KeyF2: {Key: keys.F2}, - termbox.KeyF3: {Key: keys.F3}, - termbox.KeyF4: {Key: keys.F4}, - termbox.KeyF5: {Key: keys.F5}, - termbox.KeyF6: {Key: keys.F6}, - termbox.KeyF7: {Key: keys.F7}, - termbox.KeyF8: {Key: keys.F8}, - termbox.KeyF9: {Key: keys.F9}, - termbox.KeyF10: {Key: keys.F10}, - termbox.KeyF11: {Key: keys.F11}, - termbox.KeyF12: {Key: keys.F12}, - termbox.KeyTab: {Key: '\t'}, - } - palLut func(col textmate.Color) termbox.Attribute - scheme *textmate.Theme - defaultBg = termbox.ColorBlack - defaultFg = termbox.ColorWhite - blink bool -) - -// Command line flags -var ( - showConsole = flag.Bool("console", false, "Display console") - consoleHeight = flag.Int("consoleHeight", 20, "Height of console") - rotateLog = flag.Bool("rotateLog", false, "Rotate debug log") -) - -const ( - render_chan_len = 2 - statusbarHeight = 1 -) - -type ( - layout struct { - x, y int - width, height int - visible Region - lastUpdate int - } - - tbfe struct { - layout map[*backend.View]layout - window_layout layout - status_message string - dorender chan bool - shutdown chan bool - lock sync.Mutex - editor *backend.Editor - console *backend.View - currentView *backend.View - currentWindow *backend.Window - } - - tbfeBufferDeltaObserver struct { - t *tbfe - view *backend.View - } -) - -// Creates and initializes the frontend. -func createFrontend() *tbfe { - var t tbfe - t.dorender = make(chan bool, render_chan_len) - t.shutdown = make(chan bool, 2) - t.layout = make(map[*backend.View]layout) - - t.editor = t.setupEditor() - t.console = t.editor.Console() - t.currentWindow = t.editor.NewWindow() - - // Assuming that all extra arguments are files - if files := flag.Args(); len(files) > 0 { - for _, file := range files { - t.currentView = createNewView(file, t.currentWindow) - } - } else { - t.currentView = t.currentWindow.NewFile() - } - w, h := termbox.Size() - t.handleResize(h, w, true) - - t.console.Buffer().AddObserver(&t) - t.setupCallbacks(t.currentView) - - path := path.Join(backend.LIME_PACKAGES_PATH, "themes", "TextMate-Themes", "Monokai.tmTheme") - if sc, err := textmate.LoadTheme(path); err != nil { - log.Error(err) - } else { - scheme = sc - } - - setColorMode() - setSchemeSettings() - - return &t -} - -func (t *tbfe) renderView(v *backend.View, lay layout) { - p := util.Prof.Enter("render") - defer p.Exit() - - sx, sy, w, h := lay.x, lay.y, lay.width, lay.height - vr := lay.visible - runes := v.Buffer().Substr(vr) - x, y := sx, sy - ex, ey := sx+w, sy+h - - style, _ := v.Settings().Get("caret_style", "underline").(string) - inverse, _ := v.Settings().Get("inverse_caret_state", false).(bool) - - caretStyle := getCaretStyle(style, inverse) - oldCaretStyle := caretStyle - - caretBlink, _ := v.Settings().Get("caret_blink", true).(bool) - if caretBlink && blink { - caretStyle = 0 - } - - tabSize := 4 - if i, ok := v.Settings().Get("tab_size", tabSize).(int); ok { - tabSize = i - } - - lineNumbers, _ := v.Settings().Get("line_numbers", true).(bool) - - recipie := v.Transform(scheme, vr).Transcribe() - - fg, bg := defaultFg, defaultBg - sel := v.Sel() - - line, _ := v.Buffer().RowCol(vr.Begin()) - eofline, _ := v.Buffer().RowCol(v.Buffer().Size()) - lineNumberRenderSize := len(intToRunes(eofline)) - - for i, r := range runes { - o := vr.Begin() + i - curr := 0 - fg, bg = defaultFg, defaultBg - - if lineNumbers { - renderLineNumber(&line, &x, y, lineNumberRenderSize, fg, bg) - } - - // TODO: doc - for curr < len(recipie) && (o >= recipie[curr].Region.Begin()) { - if o < recipie[curr].Region.End() { - fg = palLut(textmate.Color(recipie[curr].Flavour.Foreground)) - bg = palLut(textmate.Color(recipie[curr].Flavour.Background)) - } - curr++ - } - - iscursor := sel.Contains(Region{o, o}) - if iscursor { - fg = fg | caretStyle - termbox.SetCell(x, y, ' ', fg, bg) - } - - if r == '\t' { - add := (x + 1 + (tabSize - 1)) &^ (tabSize - 1) - for ; x < add; x++ { - if x < ex { - termbox.SetCell(x, y, ' ', fg, bg) - } - // A long cursor looks weird - fg = fg & ^(termbox.AttrUnderline | termbox.AttrReverse) - } - continue - } else if r == '\n' { - x = sx - if y++; y > ey { - break - } else if lineNumbers { - // This results in additional calls to renderLineNumber. - // Maybe just accumulate positions needing line numbers, rendering them - // after the loop? - renderLineNumber(&line, &x, y, lineNumberRenderSize, defaultFg, defaultBg) - } - continue - } - if x < ex { - termbox.SetCell(x, y, r, fg, bg) - } - x++ - } - fg, bg = defaultFg, defaultBg - // Need this if the cursor is at the end of the buffer - o := vr.Begin() + len(runes) - iscursor := sel.Contains(Region{o, o}) - if iscursor { - fg = fg | caretStyle - termbox.SetCell(x, y, ' ', fg, bg) - } - - // restore original caretStyle before blink modification - caretStyle = oldCaretStyle - - if rs := sel.Regions(); len(rs) > 0 { - if r := rs[len(rs)-1]; !vr.Covers(r) { - t.Show(v, r) - } - } - - fg, bg = defaultFg, palLut(textmate.Color{28, 29, 26, 1}) - y = t.window_layout.height - statusbarHeight - // Draw status bar bottom of window - for i := 0; i < t.window_layout.width; i++ { - termbox.SetCell(i, y, ' ', fg, bg) - } - t.renderLStatus(v, y, fg, bg) - // The right status - rns := []rune(fmt.Sprintf("Tab Size:%d %s", tabSize, "Go")) - x = t.window_layout.width - 1 - len(rns) - addRunes(x, y, rns, fg, bg) -} - -func (t *tbfe) renderLStatus(v *backend.View, y int, fg, bg termbox.Attribute) { - st := v.Status() - sel := v.Sel() - j := 0 - - for k, v := range st { - s := fmt.Sprintf("%s: %s, ", k, v) - addString(j, y, s, fg, bg) - } - - if sel.Len() == 0 { - return - } else if l := sel.Len(); l > 1 { - s := fmt.Sprintf("%d selection regions", l) - j = addString(j, y, s, fg, bg) - } else if r := sel.Get(0); r.Size() == 0 { - row, col := v.Buffer().RowCol(r.A) - s := fmt.Sprintf("Line %d, Column %d", row, col) - j = addString(j, y, s, fg, bg) - } else { - ls := v.Buffer().Lines(r) - s := v.Buffer().Substr(r) - if len(ls) < 2 { - s := fmt.Sprintf("%d characters selected", len(s)) - j = addString(j, y, s, fg, bg) - } else { - s := fmt.Sprintf("%d lines %d characters selected", len(ls), len(s)) - j = addString(j, y, s, fg, bg) - } - } - - if t.status_message != "" { - s := fmt.Sprintf("; %s", t.status_message) - addString(j, y, s, fg, bg) - } -} - -func addString(x, y int, s string, fg, bg termbox.Attribute) int { - runes := []rune(s) - addRunes(x, y, runes, fg, bg) - x += len(runes) - return x -} - -func addRunes(x, y int, runes []rune, fg, bg termbox.Attribute) { - for i, r := range runes { - termbox.SetCell(x+i, y, r, fg, bg) - } -} - -func (t *tbfe) clip(v *backend.View, s, e int) Region { - p := util.Prof.Enter("clip") - defer p.Exit() - t.lock.Lock() - h := t.layout[v].height - t.lock.Unlock() - if e-s > h { - e = s + h - } else if e-s < h { - s = e - h - } - if e2, _ := v.Buffer().RowCol(v.Buffer().TextPoint(e, 0)); e2 < e { - e = e2 - } - if s < 0 { - s = 0 - } - e = s + h - r := Region{v.Buffer().TextPoint(s, 0), v.Buffer().TextPoint(e, 0)} - return v.Buffer().LineR(r) -} - -func (t *tbfe) Show(v *backend.View, r Region) { - t.lock.Lock() - l := t.layout[v] - t.lock.Unlock() - p := util.Prof.Enter("show") - defer p.Exit() - - lv := l.visible - - s1, _ := v.Buffer().RowCol(lv.Begin()) - e1, _ := v.Buffer().RowCol(lv.End()) - s2, _ := v.Buffer().RowCol(r.Begin()) - e2, _ := v.Buffer().RowCol(r.End()) - - r1 := Region{s1, e1} - r2 := Region{s2, e2} - - r3 := r1.Cover(r2) - diff := 0 - if d1, d2 := Abs(r1.Begin()-r3.Begin()), Abs(r1.End()-r3.End()); d1 > d2 { - diff = r3.Begin() - r1.Begin() - } else { - diff = r3.End() - r1.End() - } - r3.A = r1.Begin() + diff - r3.B = r1.End() + diff - - r3 = t.clip(v, r3.A, r3.B) - l.visible = r3 - t.lock.Lock() - t.layout[v] = l - t.lock.Unlock() - t.render() -} - -func (t *tbfe) VisibleRegion(v *backend.View) Region { - t.lock.Lock() - r, ok := t.layout[v] - t.lock.Unlock() - if !ok || r.lastUpdate != v.Buffer().ChangeCount() { - t.Show(v, r.visible) - t.lock.Lock() - r = t.layout[v] - t.lock.Unlock() - } - return r.visible -} - -func (t *tbfe) StatusMessage(msg string) { - t.lock.Lock() - defer t.lock.Unlock() - t.status_message = msg -} - -func (t *tbfe) ErrorMessage(msg string) { - log.Error(msg) -} - -// TODO(q): Actually show a dialog -func (t *tbfe) MessageDialog(msg string) { - log.Info(msg) -} - -// TODO(q): Actually show a dialog -func (t *tbfe) OkCancelDialog(msg, ok string) bool { - log.Info(msg, ok) - return false -} - -func (t *tbfe) scroll(b Buffer) { - t.Show(backend.GetEditor().Console(), Region{b.Size(), b.Size()}) -} - -func (t *tbfe) Erased(changed_buffer Buffer, region_removed Region, data_removed []rune) { - t.scroll(changed_buffer) -} - -func (t *tbfe) Inserted(changed_buffer Buffer, region_inserted Region, data_inserted []rune) { - t.scroll(changed_buffer) -} - -func (t *tbfe) setupCallbacks(view *backend.View) { - // Ensure that the visible region currently presented is - // inclusive of the insert/erase delta. - view.Buffer().AddObserver(&tbfeBufferDeltaObserver{t: t, view: view}) - - backend.OnNew.Add(func(v *backend.View) { - v.Settings().AddOnChange("lime.frontend.termbox.render", func(name string) { t.render() }) - }) - - backend.OnModified.Add(func(v *backend.View) { - t.render() - }) - - backend.OnSelectionModified.Add(func(v *backend.View) { - t.render() - }) -} - -func (t *tbfe) setupEditor() *backend.Editor { - ed := backend.GetEditor() - ed.SetFrontend(t) - ed.LogInput(false) - ed.LogCommands(false) - - return ed -} - -func (t *tbfe) render() { - t.lock.Lock() - defer t.lock.Unlock() - if len(t.dorender) < cap(t.dorender) { - t.dorender <- true - } -} - -func (t *tbfe) renderthread() { - pc := 0 - dorender := func() { - defer func() { - if r := recover(); r != nil { - log.Errorf("Panic in renderthread: %v\n%s", r, string(debug.Stack())) - if pc > 1 { - panic(r) - } - pc++ - } - }() - termbox.Clear(defaultFg, defaultBg) - - t.lock.Lock() - vs := make([]*backend.View, 0, len(t.layout)) - ls := make([]layout, 0, len(t.layout)) - for v, l := range t.layout { - vs = append(vs, v) - ls = append(ls, l) - } - t.lock.Unlock() - - for i, v := range vs { - t.renderView(v, ls[i]) - } - - termbox.Flush() - } - - for range t.dorender { - dorender() - } -} - -func (t *tbfe) handleResize(height, width int, init bool) { - // This should handle multiple views in a less hardcoded fashion. - // After all, it is possible to *not* have a view in a window. - t.lock.Lock() - if init { - t.layout[t.currentView] = layout{0, 0, 0, 0, Region{}, 0} - t.window_layout = layout{0, 0, 0, 0, Region{}, 0} - t.layout[t.console] = layout{0, 0, 0, 0, Region{}, 0} - } - - t.window_layout.height = height - t.window_layout.width = width - - view_layout := t.layout[t.currentView] - view_layout.height = height - statusbarHeight - view_layout.width = width - t.layout[t.currentView] = view_layout - if *showConsole { - view_layout := t.layout[t.currentView] - view_layout.height = height - *consoleHeight - statusbarHeight - 1 - view_layout.width = width - - console_layout := t.layout[t.console] - console_layout.y = height - *consoleHeight - statusbarHeight - console_layout.width = width - console_layout.height = *consoleHeight - - t.layout[t.console] = console_layout - t.layout[t.currentView] = view_layout - } - t.lock.Unlock() - - // Ensure that the new visible region is recalculated - t.Show(t.currentView, t.VisibleRegion(t.currentView)) -} - -func (t *tbfe) handleInput(ev termbox.Event) { - if ev.Key == termbox.KeyCtrlQ { - t.shutdown <- true - } - - var kp keys.KeyPress - if ev.Ch != 0 { - kp.Key = keys.Key(ev.Ch) - kp.Text = string(ev.Ch) - } else if v2, ok := lut[ev.Key]; ok { - kp = v2 - kp.Text = string(kp.Key) - } else { - return - } - - t.editor.HandleInput(kp) -} - -func (t *tbfe) loop() { - timechan := make(chan bool, 0) - - // Only set up the timers if we should actually blink the cursor - // This should somehow be changable on an OnSettingsChanged callback - if p, _ := t.editor.Settings().Get("caret_blink", true).(bool); p { - duration := time.Second / 2 - if p, ok := t.editor.Settings().Get("caret_blink_phase", 1.0).(float64); ok { - duration = time.Duration(float64(time.Second)*p) / 2 - } - timer := time.NewTimer(duration) - - defer func() { - timer.Stop() - close(timechan) - }() - - go func() { - for range timer.C { - timechan <- true - timer.Reset(duration) - } - }() - } - - // Due to termbox still running, we can't close evchan - evchan := make(chan termbox.Event, 32) - go func() { - for { - evchan <- termbox.PollEvent() - } - }() - - for { - p := util.Prof.Enter("mainloop") - select { - case ev := <-evchan: - mp := util.Prof.Enter("evchan") - switch ev.Type { - case termbox.EventError: - log.Debug("error occured") - return - case termbox.EventResize: - t.handleResize(ev.Height, ev.Width, false) - case termbox.EventKey: - t.handleInput(ev) - blink = false - } - mp.Exit() - - case <-timechan: - blink = !blink - t.render() - - case <-t.shutdown: - return - } - p.Exit() - } -} - -func (bdo *tbfeBufferDeltaObserver) Erased(changed_buffer Buffer, region_removed Region, data_removed []rune) { - ensureVisibleRegionContainsInsertOrEraseDelta(bdo.t, bdo.view, region_removed.A-region_removed.B) -} - -func (bdo *tbfeBufferDeltaObserver) Inserted(changed_buffer Buffer, region_inserted Region, data_inserted []rune) { - ensureVisibleRegionContainsInsertOrEraseDelta(bdo.t, bdo.view, region_inserted.B-region_inserted.A) -} - -func ensureVisibleRegionContainsInsertOrEraseDelta(t *tbfe, view *backend.View, delta int) { - t.lock.Lock() - visible := t.layout[view].visible - t.lock.Unlock() - t.Show(view, Region{visible.Begin(), visible.End() + delta}) -} - -func intToRunes(n int) (runes []rune) { - lineStr := strconv.FormatInt(int64(n), 10) - - return []rune(lineStr) -} - -func padLineRunes(line []rune, totalLineSize int) (padded []rune) { - currentLineSize := len(line) - if currentLineSize < totalLineSize { - padding := (totalLineSize - currentLineSize) - - for i := 0; i < padding; i++ { - padded = append(padded, ' ') - } - } - - padded = append(padded, line...) - padded = append(padded, ' ') - - return -} - -func renderLineNumber(line, x *int, y, lineNumberRenderSize int, fg, bg termbox.Attribute) { - if *x == 0 { - lineRunes := padLineRunes(intToRunes(*line), lineNumberRenderSize) - - for _, num := range lineRunes { - termbox.SetCell(*x, y, num, fg, bg) - *x++ - } - - *line++ - } - -} - -func getCaretStyle(style string, inverse bool) termbox.Attribute { - caret_style := termbox.AttrUnderline - - if style == "block" { - caret_style = termbox.AttrReverse - } - - if inverse { - if caret_style == termbox.AttrReverse { - caret_style = termbox.AttrUnderline - } else { - caret_style = termbox.AttrReverse - } - } - - return caret_style -} - -func setColorMode() { - var ( - mode256 bool - pal = make([]termbox.RGB, 0, 256) - ) - - if err := termbox.SetColorMode(termbox.ColorMode256); err != nil { - log.Errorf("Unable to use 256 color mode: %s", err) - } else { - log.Debug("Using 256 color mode") - mode256 = true - } - - if !mode256 { - pal = pal[:10] // Not correct, but whatever - pal[termbox.ColorBlack] = termbox.RGB{R: 0, G: 0, B: 0} - pal[termbox.ColorWhite] = termbox.RGB{R: 255, G: 255, B: 255} - pal[termbox.ColorRed] = termbox.RGB{R: 255, G: 0, B: 0} - pal[termbox.ColorGreen] = termbox.RGB{R: 0, G: 255, B: 0} - pal[termbox.ColorBlue] = termbox.RGB{R: 0, G: 0, B: 255} - pal[termbox.ColorMagenta] = termbox.RGB{R: 255, G: 0, B: 255} - pal[termbox.ColorYellow] = termbox.RGB{R: 255, G: 255, B: 0} - pal[termbox.ColorCyan] = termbox.RGB{R: 0, G: 255, B: 255} - - diff := func(i, j byte) int { - v := int(i) - int(j) - if v < 0 { - return -v - } - return v - } - palLut = func(col textmate.Color) termbox.Attribute { - mindist := 10000000 - mini := 0 - for i, c := range pal { - if dist := diff(c.R, col.R) + diff(c.G, col.G) + diff(c.B, col.B); dist < mindist { - mindist = dist - mini = i - } - } - return termbox.Attribute(mini) - } - } else { - palLut = func(col textmate.Color) termbox.Attribute { - tc := termbox.RGB{R: col.R, G: col.G, B: col.B} - for i, c := range pal { - if c == tc { - return termbox.Attribute(i) - } - } - l := len(pal) - log.Debug("Adding colour: %d %+v %+v", l, col, tc) - pal = append(pal, tc) - termbox.SetColorPalette(pal) - return termbox.Attribute(l) - } - } -} - -func setSchemeSettings() { - for i, s := range scheme.Settings { - var ( - fi = defaultFg - bi = defaultBg - ) - if fg, ok := s.Settings["foreground"]; ok { - fi = palLut(fg) - if i == 0 { - defaultFg = fi - } - } - if bg, ok := s.Settings["background"]; ok { - bi = palLut(bg) - if i == 0 { - defaultBg = bi - } - } - } -} - -func createNewView(filename string, window *backend.Window) *backend.View { - v := window.OpenFile(filename, 0) - - v.Settings().Set("trace", true) - v.SetSyntaxFile("../../packages/go.tmbundle/Syntaxes/Go.tmLanguage") - - return v -} - -func main() { - flag.Parse() - - log.AddFilter("file", log.FINEST, log.NewFileLogWriter("debug.log", *rotateLog)) - defer func() { - py.NewLock() - py.Finalize() - }() - - if err := termbox.Init(); err != nil { - log.Close(err) - return - } - - defer func() { - termbox.Close() - log.Debug(util.Prof) - if err := recover(); err != nil { - log.Critical(err) - panic(err) - } - }() - - t := createFrontend() - go t.renderthread() - go t.editor.Init() - t.loop() -} diff --git a/frontend/termbox/main_test.go b/frontend/termbox/main_test.go deleted file mode 100644 index e87acd6..0000000 --- a/frontend/termbox/main_test.go +++ /dev/null @@ -1,177 +0,0 @@ -// Copyright 2013 The lime Authors. -// Use of this source code is governed by a 2-clause -// BSD-style license that can be found in the LICENSE file. - -package main - -import ( - "github.com/limetext/lime/backend" - "github.com/limetext/termbox-go" - . "github.com/limetext/text" - "testing" - "time" -) - -func TestPadLineRunes(t *testing.T) { - var testPadData = []struct { - line int - total int - expected []rune - }{ - {1, 3, []rune{' ', ' ', '1', ' '}}, - {10, 3, []rune{' ', '1', '0', ' '}}, - {100, 3, []rune{'1', '0', '0', ' '}}, - } - - for _, p := range testPadData { - runes := intToRunes(p.line) - padded := padLineRunes(runes, p.total) - - for i, r := range p.expected { - if r != padded[i] { - t.Error("Expected runes to be padded") - } - } - } -} - -func TestIntToRunes(t *testing.T) { - actual := intToRunes(100) - expected := []rune{'1', '0', '0'} - for i, r := range expected { - if actual[i] != r { - t.Error("Expected int to be transformed to runes") - } - } -} - -func TestGetCaretStyle(t *testing.T) { - var testcases = []struct { - style string - inverse bool - expected termbox.Attribute - }{ - {"", false, termbox.AttrUnderline}, - {"block", false, termbox.AttrReverse}, - {"", true, termbox.AttrReverse}, - } - - for _, tc := range testcases { - if style := getCaretStyle(tc.style, tc.inverse); style != tc.expected { - t.Errorf("Expected %v, got %v", tc.expected, style) - } - } -} - -func TestUpdateVisibleRegion(t *testing.T) { - var ( - fe tbfe - e = backend.GetEditor() - w = e.NewWindow() - v = w.NewFile() - ) - - fe.layout = make(map[*backend.View]layout) - fe.layout[v] = layout{0, 0, 100, 100 - *consoleHeight - 1, Region{}, 0} - fe.setupCallbacks(v) - - edit := v.BeginEdit() - v.Insert(edit, 0, "foo") - v.EndEdit(edit) - - if end := fe.layout[v].visible.End(); end != 3 { - t.Fatalf("Expected 3, got %d", end) - } -} - -func TestCreateFrontend(t *testing.T) { - var frontend *tbfe - frontendWasCreated := make(chan bool, 0) - go func() { - frontend = createFrontend() - frontendWasCreated <- true - }() - - select { - case <-frontendWasCreated: - break - case <-time.After(2 * time.Second): - t.Error("Frontend was not created within timeout") - } - - frontend.lock.Lock() - defer frontend.lock.Unlock() - - *showConsole = true - if frontend.editor == nil { - t.Error("Editor is nil") - } - - if frontend.console == nil { - t.Error("Current console is nil") - } - - if frontend.currentWindow == nil { - t.Error("Current window is nil") - } - - if frontend.currentView == nil { - t.Error("Current view is nil") - } - - if _, ok := frontend.layout[frontend.currentView]; !ok { - t.Error("Current view not in layout") - } - - if _, ok := frontend.layout[frontend.console]; !ok { - t.Error("Console view not in layout") - } - - if len(frontend.layout) != 2 { - t.Errorf("Layout has length %d, but should have length 2", len(frontend.layout)) - } -} - -func TestLoopShutdown(t *testing.T) { - frontend := createFrontend() - - loopHasExited := make(chan bool, 0) - go func() { - frontend.loop() - loopHasExited <- true - }() - - frontend.shutdown <- true - - select { - case <-loopHasExited: - break - case <-time.After(2 * time.Second): - t.Error("Loop did not terminate within timeout") - } -} - -func TestHandleInput(t *testing.T) { - frontend := createFrontend() - - event_a := termbox.Event{ - Type: termbox.EventKey, - Ch: 'a', - } - event_b := termbox.Event{ - Type: termbox.EventKey, - Ch: 'b', - } - expected := "ab" - - frontend.handleInput(event_a) - frontend.handleInput(event_b) - - // Allow the event to be handled in the call chain - time.Sleep(10 * time.Millisecond) - - buffer := frontend.currentView.Buffer() - if substring := buffer.Substr(Region{A: 0, B: buffer.Size()}); substring != expected { - t.Errorf("Expected %q to be in editor's buffer, but got %q.", expected, substring) - } -} diff --git a/packages/Default/Default (OSX).sublime-keymap b/packages/Default/Default (OSX).sublime-keymap deleted file mode 100644 index 64eeded..0000000 --- a/packages/Default/Default (OSX).sublime-keymap +++ /dev/null @@ -1,3 +0,0 @@ -[ - { "keys": ["super+w"], "command": "close"}, -] diff --git a/packages/Default/Default.sublime-keymap b/packages/Default/Default.sublime-keymap deleted file mode 100644 index b079c4e..0000000 --- a/packages/Default/Default.sublime-keymap +++ /dev/null @@ -1,53 +0,0 @@ -[ - { "keys": ["up"], "command": "move", "args": {"by": "lines", "forward": false} }, - { "keys": ["down"], "command": "move", "args": {"by": "lines", "forward": true} }, - { "keys": ["left"], "command": "move", "args": {"by": "characters", "forward": false} }, - { "keys": ["right"], "command": "move", "args": {"by": "characters", "forward": true} }, - { "keys": ["shift+up"], "command": "move", "args": {"by": "lines", "forward": false, "extend": true} }, - { "keys": ["shift+down"], "command": "move", "args": {"by": "lines", "forward": true, "extend": true} }, - { "keys": ["shift+left"], "command": "move", "args": {"by": "characters", "forward": false, "extend": true} }, - { "keys": ["shift+right"], "command": "move", "args": {"by": "characters", "forward": true, "extend": true} }, - - { "keys": ["ctrl+left"], "command": "move", "args": {"by": "words", "forward": false} }, - { "keys": ["ctrl+right"], "command": "move", "args": {"by": "word_ends", "forward": true} }, - { "keys": ["ctrl+shift+left"], "command": "move", "args": {"by": "words", "forward": false, "extend": true} }, - { "keys": ["ctrl+shift+right"], "command": "move", "args": {"by": "word_ends", "forward": true, "extend": true} }, - - { "keys": ["alt+left"], "command": "move", "args": {"by": "subwords", "forward": false} }, - { "keys": ["alt+right"], "command": "move", "args": {"by": "subword_ends", "forward": true} }, - { "keys": ["alt+shift+left"], "command": "move", "args": {"by": "subwords", "forward": false, "extend": true} }, - { "keys": ["alt+shift+right"], "command": "move", "args": {"by": "subword_ends", "forward": true, "extend": true} }, - - { "keys": ["home"], "command": "move_to", "args": {"to": "bol", "extend": false} }, - { "keys": ["end"], "command": "move_to", "args": {"to": "eol", "extend": false} }, - { "keys": ["shift+home"], "command": "move_to", "args": {"to": "bol", "extend": true} }, - { "keys": ["shift+end"], "command": "move_to", "args": {"to": "eol", "extend": true} }, - { "keys": ["shift+end"], "command": "move_to", "args": {"to": "eol", "extend": true} }, - { "keys": ["ctrl+home"], "command": "move_to", "args": {"to": "bof", "extend": false} }, - { "keys": ["ctrl+end"], "command": "move_to", "args": {"to": "eof", "extend": false} }, - { "keys": ["ctrl+shift+end"], "command": "move_to", "args": {"to": "bof", "extend": true} }, - { "keys": ["ctrl+shift+end"], "command": "move_to", "args": {"to": "eof", "extend": true} }, - - { "keys": ["ctrl+t"], "command": "transpose"}, - - { "keys": ["backspace"], "command": "left_delete"}, - { "keys": ["delete"], "command": "right_delete"}, - { "keys": ["enter"], "command": "insert", "args": {"characters": "\n"}}, - { "keys": ["escape"], "command": "single_selection", "context": [ { "key": "num_selections", "operator": "not_equal", "operand": 1 } ] }, - - { "keys": ["ctrl+z"], "command": "undo"}, - { "keys": ["ctrl+r"], "command": "redo"}, - - { "keys": ["ctrl+a"], "command": "select_all"}, - { "keys": ["ctrl+d"], "command": "find_under_expand"}, - { "keys": ["f3"], "command": "find_next"}, - - { "keys": ["ctrl+c"], "command": "copy"}, - { "keys": ["ctrl+x"], "command": "cut"}, - { "keys": ["ctrl+v"], "command": "paste"}, - - { "keys": ["ctrl+shift+n"], "command": "new_window"}, - { "keys": ["ctrl+shift+w"], "command": "close_window"}, - { "keys": ["ctrl+n"], "command": "new_file"}, - { "keys": ["ctrl+s"], "command": "save"}, -] diff --git a/packages/Default/Preferences (Linux).sublime-settings b/packages/Default/Preferences (Linux).sublime-settings deleted file mode 100644 index ccd4d8b..0000000 --- a/packages/Default/Preferences (Linux).sublime-settings +++ /dev/null @@ -1,4 +0,0 @@ -{ - "font_face": "Monospace", - "font_size": 10 -} diff --git a/packages/Default/Preferences (OSX).sublime-settings b/packages/Default/Preferences (OSX).sublime-settings deleted file mode 100644 index 1e9f637..0000000 --- a/packages/Default/Preferences (OSX).sublime-settings +++ /dev/null @@ -1,4 +0,0 @@ -{ - "font_face": "Menlo", - "font_size": 12 -} diff --git a/packages/Default/Preferences (Windows).sublime-settings b/packages/Default/Preferences (Windows).sublime-settings deleted file mode 100644 index 0eeb1f9..0000000 --- a/packages/Default/Preferences (Windows).sublime-settings +++ /dev/null @@ -1,4 +0,0 @@ -{ - "font_face": "Consolas", - "font_size": 10 -} diff --git a/packages/Default/Preferences.sublime-settings b/packages/Default/Preferences.sublime-settings deleted file mode 100644 index 85fd710..0000000 --- a/packages/Default/Preferences.sublime-settings +++ /dev/null @@ -1,26 +0,0 @@ -{ - // The number of spaces a tab is equal to. Valid values are powers of two: 2, 4, 8, 16 - "tab_size": 4, - - // Set to true to insert spaces when tab is pressed - "translate_tabs_to_spaces": false, - - // If translate_tabs_to_spaces is true, use_tab_stops will make tab and - // backspace insert/delete up to the next tabstop - "use_tab_stops": true, - - // Valid styles are "block" and "underscore" - "caret_style": "underscore", - - // Whether or not the caret will blink - "caret_blink": true, - - // How fast the blinking is performed if enabled - "caret_blink_phase": 1.0, - - // Whether to render line numbers - "line_numbers": true, - - // If true searches will continue from the beginning after reaching end of file - "find_wrap": true -} diff --git a/packages/Default/history_list.py b/packages/Default/history_list.py deleted file mode 100644 index 4fac5b0..0000000 --- a/packages/Default/history_list.py +++ /dev/null @@ -1,10 +0,0 @@ -class Hack: - - def push_selection(self, a): - print("push_selection not implemented") - pass - - -def get_jump_history(a): - print("get_jump_history not implemented") - return Hack() diff --git a/packages/Diff.tmbundle b/packages/Diff.tmbundle deleted file mode 160000 index 62de2cc..0000000 --- a/packages/Diff.tmbundle +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 62de2cca5cc5cfb77308fdc94d963f35e2d808d1 diff --git a/packages/GoSublime b/packages/GoSublime deleted file mode 160000 index f846829..0000000 --- a/packages/GoSublime +++ /dev/null @@ -1 +0,0 @@ -Subproject commit f846829261c6d9f21686cd199e6ecaa69cb89daf diff --git a/packages/Python/Python.sublime-settings b/packages/Python/Python.sublime-settings deleted file mode 100644 index 93ff930..0000000 --- a/packages/Python/Python.sublime-settings +++ /dev/null @@ -1,3 +0,0 @@ -{ - "translate_tabs_to_spaces": true, -} diff --git a/packages/User/.gitignore b/packages/User/.gitignore deleted file mode 100644 index 72e8ffc..0000000 --- a/packages/User/.gitignore +++ /dev/null @@ -1 +0,0 @@ -* diff --git a/packages/Vintageous b/packages/Vintageous deleted file mode 160000 index 5e3882c..0000000 --- a/packages/Vintageous +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 5e3882c5ef2a0445a45563abee0c8b2a547ec47a diff --git a/packages/_Package Testing/sample.txt b/packages/_Package Testing/sample.txt deleted file mode 100644 index 8c8434e..0000000 --- a/packages/_Package Testing/sample.txt +++ /dev/null @@ -1,186 +0,0 @@ -Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus nunc tellus, consectetur a condimentum a, lacinia vitae eros. Mauris fermentum faucibus ullamcorper. Ut quis dui quis lectus varius ultricies. Ut laoreet ultricies erat, ac adipiscing augue sagittis ac. Fusce nibh arcu, sodales vitae sodales in, sagittis at lacus. Pellentesque nec sapien pharetra nunc lacinia congue. Sed consequat cursus lectus, a pretium urna porta posuere. Nam molestie diam at nunc fringilla aliquam. Morbi ullamcorper commodo felis quis mattis. Quisque pellentesque, massa ac posuere sollicitudin, mi enim pretium lorem, ut lobortis libero ante vel diam. Ut auctor, quam ac sagittis hendrerit, augue sem accumsan turpis, at scelerisque nulla justo a nisi. Mauris lacinia, purus eget semper faucibus, urna lorem tempor diam, in adipiscing tellus massa id mi. Aenean eu ipsum velit. -Suspendisse luctus mattis nisi. Ut non nunc vel leo scelerisque posuere ut quis sem. Proin eget urna dolor. Nam id cursus mauris. Phasellus est arcu, egestas sed dictum non, mollis at massa. Praesent aliquet pharetra orci, sit amet venenatis libero pellentesque venenatis. Nam rutrum consectetur ante, at gravida lorem feugiat non. Proin sed ligula sapien, eu euismod eros. Proin molestie hendrerit nisl dapibus tincidunt. Proin ac ligula augue, sodales pretium nisl. In hac habitasse platea dictumst. Phasellus ac orci in purus pretium mollis ut at nisl. Mauris eget libero massa, quis bibendum risus. Phasellus sit amet velit at nisl auctor porta in sit amet dolor. In risus mauris, placerat eu elementum ut, tincidunt at nulla. -Morbi posuere nunc eu felis convallis ornare. Etiam eu nulla in lectus suscipit imperdiet. Vivamus venenatis semper eros nec mollis. Etiam orci ipsum, scelerisque tristique tristique ac, laoreet ac tellus. Aenean laoreet commodo sodales. Phasellus vel enim sed arcu vehicula gravida eu vestibulum nibh. Nulla volutpat pharetra felis. -Morbi vel ipsum libero. Donec ac augue in magna auctor consequat et eu metus. Praesent pharetra nisl ac magna varius consectetur. Vestibulum sagittis augue sit amet felis pulvinar consequat. Fusce tempus, arcu ac tristique tincidunt, elit quam tempus libero, sed dapibus eros orci at diam. Nulla hendrerit, eros et vulputate feugiat, neque risus lacinia enim, eget convallis orci massa vel lorem. In bibendum magna vel diam facilisis dapibus. -Aliquam erat volutpat. Morbi venenatis fermentum lectus, ut sodales erat fermentum id. Proin ut nisl at metus ultrices aliquet. Donec velit tellus, viverra sed placerat volutpat, pellentesque et elit. Curabitur convallis sapien nec dui iaculis pharetra. Aliquam in odio quis lectus ornare fermentum at a felis. Ut eget arcu elit. Ut ut enim dui, id placerat leo. Vivamus eleifend tellus vel lectus commodo pharetra. Sed velit ipsum, lobortis nec varius at, dictum vel ligula. Sed eros elit, faucibus eu rhoncus tincidunt, tempor quis lacus. -Nunc tempus, tortor vel vestibulum accumsan, massa diam adipiscing lacus, sed tincidunt elit nisl ut ante. Fusce in nibh non augue sodales viverra eu a justo. Duis mollis scelerisque tortor ut feugiat. Aliquam id elementum purus. Donec facilisis sapien a nibh posuere feugiat. Curabitur pharetra, mauris sit amet fringilla vulputate, neque justo condimentum diam, at tincidunt est eros vel magna. Etiam eget nisi ut felis rhoncus placerat. Ut ut tellus ac massa dignissim faucibus sed sit amet arcu. Proin vehicula laoreet lorem ac elementum. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nulla facilisi. Aenean vel diam ultrices massa luctus suscipit. -In vehicula gravida turpis, feugiat varius eros pulvinar nec. Proin laoreet nulla at ligula elementum ac auctor sem imperdiet. Nullam congue nisl at est ullamcorper vitae volutpat nulla hendrerit. Vivamus nec nisi mi. Duis venenatis magna vel sem rhoncus nec feugiat risus ullamcorper. Morbi interdum, mi a pellentesque luctus, nisl leo eleifend nisi, at hendrerit enim diam a enim. Curabitur mauris nisi, ornare vehicula pretium in, ullamcorper ut metus. Duis erat est, posuere nec elementum ut, facilisis mattis diam. Nunc rhoncus molestie nisi sed vulputate. Nam vel arcu lacus. Nulla vitae metus justo, in auctor eros. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec augue augue, tincidunt ac malesuada a, suscipit ac lorem. -Maecenas scelerisque lectus at orci faucibus at pretium arcu venenatis. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Duis dapibus mattis ipsum, a laoreet nisl sodales ut. Nulla facilisi. Donec eget nisi ligula, ac tincidunt odio. Sed dui dolor, faucibus non venenatis sit amet, cursus quis purus. Sed ut quam justo, non luctus est. Aliquam erat volutpat. Phasellus congue erat vel sem mattis sit amet suscipit metus consectetur. Maecenas a lectus orci. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Sed mi libero, viverra sit amet scelerisque vel, consectetur auctor nisl. Suspendisse potenti. Aliquam erat volutpat. -In in laoreet odio. Mauris non ipsum egestas augue convallis laoreet. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Aenean placerat magna in odio blandit sed luctus erat sagittis. Aenean tincidunt dui mollis nisi luctus consectetur sodales nibh facilisis. Aenean mollis dictum tellus, sed vulputate turpis dignissim sit amet. Morbi viverra, turpis a vulputate dapibus, ligula orci posuere arcu, lobortis pellentesque dui felis nec risus. Suspendisse gravida leo in mi fringilla et iaculis magna ultricies. Duis interdum nunc lacus, et suscipit lectus. Suspendisse varius bibendum risus, in cursus lacus vehicula vel. -Vivamus in ornare felis. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Phasellus placerat condimentum nulla a porta. Aliquam vitae orci convallis nulla euismod suscipit non non lorem. Suspendisse at augue urna, in ultricies elit. Fusce scelerisque magna eu lectus rutrum sed tincidunt justo auctor. Pellentesque dictum dui at est viverra fringilla. Sed sodales pharetra libero, at sodales mauris commodo in. Proin hendrerit nisl nec mi auctor sit amet congue erat ullamcorper. Proin iaculis sapien et neque tempus non egestas nisl tincidunt. Fusce rhoncus ipsum at leo bibendum nec sagittis dui condimentum. Donec augue nisi, sodales non consectetur eget, tempor eget diam. -Ut vitae nulla vitae ligula tincidunt cursus ac vitae ante. Donec felis augue, sodales at viverra sit amet, ornare ac est. Aenean eu enim vitae lacus congue suscipit quis in risus. Duis pulvinar, tellus sed egestas volutpat, mauris magna imperdiet tortor, et pellentesque libero risus eu sem. Cras id molestie tellus. Nam sit amet lacus vel odio sollicitudin suscipit. Suspendisse fringilla massa ut diam facilisis laoreet. Suspendisse ante metus, fringilla vel dignissim ac, laoreet ac tortor. Donec sollicitudin purus non metus viverra quis viverra ante feugiat. Fusce placerat ultricies augue, ac scelerisque orci porttitor nec. Quisque tempor lacinia placerat. -Pellentesque ultrices aliquam pulvinar. Ut vel odio et sem adipiscing commodo quis vitae mauris. Maecenas auctor, sapien facilisis rhoncus facilisis, libero odio sagittis velit, ut dignissim lacus libero varius dolor. Ut ligula velit, pretium eu faucibus non, volutpat vel ante. Quisque in dolor id est porta laoreet. Nunc tincidunt gravida purus, eu elementum sem sagittis vitae. Sed cursus est sed erat faucibus commodo at in risus. Curabitur ac ligula ac libero porttitor vestibulum. Donec dictum lobortis arcu, vel eleifend leo molestie eget. Sed ipsum dolor, dignissim eget auctor a, accumsan ut arcu. Etiam et elementum nibh. Vivamus tincidunt nisl in nunc ullamcorper suscipit. -Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Mauris faucibus neque a sapien lobortis aliquam. Sed mi orci, iaculis sit amet mattis quis, blandit id nisl. Quisque semper eros id metus accumsan vulputate tempus tortor pellentesque. Etiam lacus tortor, varius eu facilisis id, scelerisque quis mauris. Morbi dapibus scelerisque purus sed faucibus. Phasellus vel urna non felis tincidunt venenatis in et odio. Aenean nec leo massa, eu rutrum turpis. Duis pharetra hendrerit mollis. -Donec eu turpis nibh. Suspendisse ut sem sed tortor mattis ultrices. Curabitur pretium risus feugiat sem molestie porttitor. Praesent a est in turpis fermentum vulputate. Suspendisse iaculis dolor vel neque egestas interdum. Quisque libero ipsum, dictum vel cursus nec, consequat dapibus ligula. Quisque elementum mattis blandit. Proin et tortor diam. Phasellus semper venenatis suscipit. Nulla at velit quis tortor commodo condimentum. - -Nam massa neque, porttitor sit amet consequat vitae, commodo nec ante. Cras commodo augue et sapien adipiscing placerat ut eget nulla. Nunc sagittis tempus odio, suscipit euismod tellus hendrerit at. Etiam lacinia, turpis quis pellentesque volutpat, diam dui congue mauris, at bibendum nisl turpis id mi. Mauris dictum fringilla purus, a posuere nibh hendrerit ac. Nulla at velit eu lectus eleifend lobortis vitae eget dui. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Cras quis elit nunc. Pellentesque placerat fermentum odio, vel volutpat libero semper sit amet. Phasellus faucibus odio quis eros iaculis sagittis. - -Praesent at purus enim. Morbi quis neque eu massa mattis eleifend sit amet at nibh. Sed fringilla pellentesque ligula, a tincidunt lacus pulvinar pulvinar. Suspendisse rutrum erat sit amet tortor commodo ultricies. Curabitur venenatis iaculis tristique. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis justo leo, bibendum id semper id, interdum et purus. Aliquam est erat, suscipit eget auctor nec, dictum et est. Sed ultricies consequat tempus. - -Fusce in nunc nulla. Donec a lectus vitae est ullamcorper sodales. Maecenas ut nisi urna. Aenean nulla justo, faucibus sed posuere vel, tincidunt id sem. In sed lorem eget dolor pulvinar luctus. Sed in augue est. Sed vulputate nunc lectus. Nulla interdum faucibus lacus a ullamcorper. Integer in turpis sed orci bibendum fringilla mattis ut libero. Donec placerat fermentum tellus id dictum. - -Quisque ullamcorper dui eget turpis mollis fermentum. Curabitur dictum felis sed velit pretium aliquet. Integer ultricies adipiscing nibh, non faucibus leo porta non. Integer vel velit eget nisl blandit volutpat. Maecenas aliquam, quam vel bibendum facilisis, nulla tellus varius ante, a tempus ligula sapien vitae metus. Pellentesque in dictum massa. Fusce vel tortor felis, at vulputate eros. Vivamus eget massa sem, non egestas risus. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Suspendisse eleifend porttitor risus at eleifend. Etiam egestas aliquam nisi, vel bibendum mi egestas quis. - -Nullam dapibus vestibulum mauris eu dapibus. Vestibulum luctus erat at dui cursus at pulvinar lorem euismod. Donec cursus blandit nulla vitae ornare. Aenean ultricies porta malesuada. Cras metus arcu, consectetur sit amet molestie ut, molestie vel erat. Maecenas augue neque, imperdiet venenatis commodo eget, consectetur nec velit. Proin hendrerit rhoncus elit, eget molestie quam pellentesque nec. Etiam ipsum lectus, sagittis dictum sagittis eget, consectetur adipiscing dui. In hac habitasse platea dictumst. Vivamus consectetur ante at metus feugiat ac ultrices enim volutpat. Donec lacus felis, rhoncus et convallis vitae, auctor eget tortor. - -Ut fermentum posuere varius. Mauris varius luctus quam sit amet vulputate. Cras vitae urna sit amet est adipiscing porta gravida quis dui. Quisque consequat risus condimentum dui tincidunt condimentum. Ut auctor, ligula in hendrerit vulputate, ante nunc condimentum tellus, a dapibus ipsum mauris ac nibh. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Nulla facilisi. - -Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Vivamus elementum hendrerit fringilla. Mauris venenatis placerat porta. Nulla molestie, lectus a scelerisque accumsan, eros turpis rhoncus enim, et mattis quam eros vel tortor. Nunc tempus elit vel tortor ullamcorper at pellentesque nisl gravida. Praesent varius facilisis nulla, id lobortis urna condimentum quis. Duis sit amet nulla a dui commodo egestas eget vel eros. Nulla facilisi. Cras euismod, dui eu iaculis vulputate, odio quam porta odio, quis placerat sem elit a lorem. Proin magna mi, adipiscing sed imperdiet sit amet, mattis quis quam. Duis sollicitudin tempor placerat. Duis vitae orci vel tellus fringilla aliquet. - -Proin adipiscing luctus feugiat. Sed sem justo, tempus quis consequat et, ultrices dictum est. Vivamus elit enim, semper varius venenatis id, malesuada nec nisi. Etiam dolor lacus, lacinia scelerisque fringilla eu, sollicitudin ut justo. Vivamus aliquet, velit feugiat imperdiet scelerisque, risus nibh interdum massa, eget cursus metus est quis ante. Etiam consequat massa at sapien sagittis tempus. Donec pellentesque volutpat orci nec placerat. Phasellus et lacus metus. Donec tempor imperdiet sapien nec pharetra. Curabitur imperdiet, est et venenatis pulvinar, quam felis placerat diam, ut blandit urna dolor eget nunc. Ut vel urna mi, ut viverra eros. Nam mollis eros facilisis erat blandit consectetur. Etiam egestas scelerisque quam, a iaculis sapien condimentum ut. - -Morbi ac orci sem, ultrices gravida augue. Etiam id enim in arcu rutrum rhoncus eget at nunc. Sed congue consequat lacinia. Aliquam feugiat nunc at lectus mattis pretium. Pellentesque magna nunc, elementum eu hendrerit sed, vestibulum quis magna. Nullam laoreet tristique sollicitudin. Vivamus tellus nibh, congue ac fermentum elementum, viverra eu nulla. Phasellus tristique mattis ante, id tempus quam auctor in. Nullam porta neque ac arcu iaculis tristique. Donec rutrum erat lorem. Nunc quam felis, porttitor non lacinia sodales, vehicula sed massa. Maecenas id massa ante, id iaculis sapien. Suspendisse fermentum metus sit amet magna egestas luctus. Curabitur eget justo massa, at dapibus augue. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nullam et augue augue, id gravida neque. - -Suspendisse justo justo, hendrerit at pellentesque vel, tempus et diam. Sed luctus, risus quis accumsan facilisis, erat nisi vehicula risus, sit amet volutpat arcu orci eget nibh. Morbi neque velit, mollis ac adipiscing quis, scelerisque in massa. Aliquam gravida congue nulla sit amet placerat. In lacus dui, suscipit vitae facilisis id, iaculis in erat. Ut tincidunt erat at leo egestas tristique interdum erat porttitor. Morbi ultricies adipiscing lacus in blandit. Cras at ipsum dolor. Pellentesque a metus nec diam ornare tristique. Integer congue augue eu elit fringilla consectetur fermentum leo consectetur. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Suspendisse lorem odio, gravida eget porttitor ullamcorper, sodales vel orci. Fusce ac risus odio, eu tempor nisl. - -Aliquam erat volutpat. Nunc lacinia pharetra sem sit amet varius. Nunc ac dui ante. Duis erat nibh, semper auctor hendrerit vitae, faucibus et lorem. Cras vitae commodo est. Mauris sed diam quis libero fermentum iaculis. Cras aliquet commodo quam eu facilisis. Sed in lectus tellus, non commodo purus. Phasellus et turpis ut dui molestie porta. Aliquam scelerisque sodales augue, vitae gravida nibh commodo a. Nulla metus mauris, tempor sed vulputate a, consectetur at libero. Duis ipsum velit, bibendum in fringilla et, condimentum vel quam. Mauris id lorem ut tellus tempus facilisis. - -Suspendisse fermentum est ut nibh rutrum non adipiscing sapien sollicitudin. Etiam euismod magna et justo rhoncus tristique. Cras elementum est nec risus cursus ultrices dapibus nunc interdum. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Nulla facilisi. Cras rhoncus, tortor nec placerat gravida, nisl ante pharetra ipsum, quis fermentum tortor nunc ac leo. Vivamus gravida, magna quis cursus faucibus, sem orci viverra turpis, in vestibulum augue arcu eu elit. Mauris vulputate fringilla porttitor. Sed quis orci non nisi dignissim accumsan suscipit vitae arcu. Integer fermentum dictum justo sit amet rutrum. Cras suscipit condimentum nunc eu porttitor. Pellentesque metus dui, ornare et scelerisque eget, pulvinar et velit. Phasellus lorem dui, gravida vitae commodo a, euismod ac felis. Nam pharetra porttitor bibendum. Nunc lorem enim, hendrerit ac fermentum id, imperdiet gravida ligula. Phasellus ultricies accumsan euismod. - -Duis sed massa purus. Donec id fermentum tortor. Praesent vehicula elit in lacus sollicitudin scelerisque. Duis vitae turpis mauris. Etiam mauris massa, vestibulum in tempor quis, adipiscing vitae odio. Ut fermentum tempor nulla sed lobortis. Phasellus imperdiet pulvinar nisi eget vehicula. Quisque placerat felis in dolor porttitor dictum. Etiam condimentum erat imperdiet erat placerat egestas. Vestibulum sollicitudin leo vel quam consectetur mattis. Praesent vulputate, lorem vel tristique dapibus, nisi ipsum porta eros, vel adipiscing urna mauris sed magna. Pellentesque velit ante, placerat et placerat ac, vehicula sed nisi. - -Duis sollicitudin ornare est, ac consequat nunc semper at. Nunc porta neque at ante mattis sit amet imperdiet urna commodo. Duis metus lacus, tincidunt non ultrices non, rhoncus eu lorem. Suspendisse ac nisi vel lorem iaculis posuere. Cras non rhoncus tortor. Vestibulum in sodales mi. Fusce purus velit, ullamcorper nec convallis non, semper vel diam. Duis gravida tortor pulvinar lacus posuere sed lobortis leo posuere. - -Mauris tincidunt sapien ut diam mollis sit amet consequat urna hendrerit. Pellentesque ullamcorper auctor ipsum sed molestie. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Integer at tellus libero. In fermentum tempor est id varius. Donec dapibus arcu quis nisl pulvinar ut bibendum erat bibendum. Suspendisse potenti. Morbi id risus a nibh lobortis euismod non ut lacus. Etiam luctus purus ac dui euismod vitae iaculis metus ultricies. Donec sodales fringilla urna vitae sodales. - -Maecenas suscipit arcu sed ligula volutpat nec commodo tellus laoreet. Ut id velit libero, vitae faucibus arcu. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Nullam tortor lacus, volutpat et consectetur sit amet, dictum a leo. Nam urna justo, feugiat id faucibus eget, laoreet sed erat. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus lectus neque, iaculis quis elementum vel, pulvinar a leo. Ut pulvinar, lacus a sagittis tincidunt, nunc diam rhoncus mi, vitae laoreet quam nulla vel lacus. Nunc tellus nunc, interdum non ultrices eu, fringilla non eros. - -Vestibulum semper, tellus id gravida ultricies, mi ligula blandit diam, a bibendum enim neque ut metus. Nulla pellentesque molestie augue. Aliquam erat volutpat. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Proin sit amet tortor nisi, eget tincidunt turpis. Integer vitae elit vel lorem faucibus auctor. Nulla laoreet erat in felis aliquet ac venenatis tellus fermentum. Morbi id lectus at tellus volutpat feugiat. Sed at mauris enim. Integer varius dictum purus, eget gravida ligula feugiat nec. Sed sollicitudin risus et sapien porta posuere. Pellentesque consectetur nisi eu odio tristique sit amet sollicitudin ante facilisis. Morbi aliquam purus id elit adipiscing vulputate. - -Ut vel diam et elit ultricies cursus vel ac dui. Nam id dolor nec purus tempus viverra. Mauris non magna in ante tempus porttitor sit amet sit amet massa. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Praesent nec diam leo. Etiam sed accumsan augue. Duis malesuada ornare turpis, nec luctus dui pellentesque quis. Ut vitae pretium neque. - -Vivamus sit amet metus neque, id pellentesque ipsum. Vivamus faucibus, nisl non sodales dignissim, dolor risus fermentum dui, sed luctus ante ligula at lectus. Mauris feugiat sodales metus, sit amet ornare lectus pulvinar in. Fusce iaculis tellus vel orci pulvinar venenatis. Etiam et justo lorem. Vestibulum malesuada placerat nisi lobortis placerat. Donec eu massa turpis, lobortis consequat risus. Praesent elit lectus, tristique ac imperdiet nec, imperdiet non tellus. - -Donec lobortis massa non felis tincidunt eu euismod velit placerat. Cras sodales mollis mi et commodo. Nullam pretium dui sit amet enim vestibulum dapibus. Suspendisse velit nibh, commodo ac aliquam id, dictum a nunc. Donec euismod porttitor enim, tincidunt varius tellus gravida id. Donec auctor imperdiet massa, nec sodales eros elementum rutrum. Etiam nec ipsum vel arcu facilisis mattis a eu leo. Maecenas mauris mi, sagittis ut pulvinar quis, malesuada at dui. Nulla nunc arcu, bibendum vel tempor eget, scelerisque varius leo. Sed sed tellus ac quam luctus blandit. Nam odio augue, consectetur at varius id, iaculis at justo. Donec rhoncus laoreet lorem sed iaculis. Aenean ac libero eget arcu mattis convallis. - -Nulla facilisi. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Mauris ullamcorper, est sit amet tempus posuere, sem enim eleifend sapien, vitae fermentum ante lectus a felis. Nunc metus velit, vulputate ac consequat sit amet, accumsan nec eros. Praesent sit amet mi leo. Aliquam erat volutpat. Nulla nulla nisi, hendrerit in cursus nec, sodales quis odio. Pellentesque dignissim consequat sapien sit amet feugiat. Duis ullamcorper metus quis massa mattis bibendum. - -Nulla sodales mauris eget orci ullamcorper aliquam. Fusce eget turpis tellus, sed pharetra quam. Nunc sit amet massa est. Morbi et lacus id justo mattis venenatis faucibus faucibus lorem. Maecenas sit amet mauris nulla, et eleifend erat. Fusce vulputate scelerisque scelerisque. Etiam posuere ornare auctor. Nam id ligula massa, eget auctor dui. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Quisque quam orci, dapibus at ullamcorper in, varius et dui. Fusce vestibulum, mauris vitae bibendum aliquam, purus tellus tempus nisl, in tempor metus nisl et quam. Nunc id interdum lectus. Donec vulputate urna eleifend mi vulputate laoreet rhoncus tellus dapibus. Cras pellentesque, magna quis imperdiet ornare, justo quam tincidunt erat, congue ultrices urna nulla a justo. Mauris tellus dui, posuere et sollicitudin sit amet, varius vel ante. - -Integer venenatis vestibulum mi, vel varius enim tincidunt faucibus. Suspendisse nec dui nisl, ut rutrum nisi. Morbi eu mi eget felis imperdiet euismod. Duis vestibulum porta gravida. Vivamus velit libero, hendrerit consectetur pulvinar non, vulputate eu dui. Aliquam consectetur imperdiet nulla id suscipit. Nam dapibus elit eu enim sagittis dictum. Nam faucibus nisl interdum libero tempor sit amet elementum lacus volutpat. - -Sed erat arcu, iaculis in dapibus id, pellentesque id risus. In hac habitasse platea dictumst. Morbi ac placerat nulla. Pellentesque adipiscing velit at lorem volutpat adipiscing. Etiam molestie facilisis dapibus. Aenean cursus commodo augue, et commodo risus vestibulum vel. Phasellus laoreet egestas justo, quis faucibus turpis adipiscing nec. Ut hendrerit scelerisque ante, et fringilla mauris dictum ac. Integer eu dolor nulla. Phasellus consectetur luctus tellus id vestibulum. Quisque convallis, tellus sit amet commodo feugiat, orci arcu suscipit augue, vel venenatis massa odio sed elit. Aenean ac odio sapien, id imperdiet mi. Ut non nunc tortor. Pellentesque lorem sapien, porta eget commodo ac, viverra vitae lectus. Nam blandit nibh malesuada odio sagittis viverra. Duis congue, erat vel accumsan semper, purus justo semper felis, nec accumsan lorem magna a neque. - -Phasellus nec tempor enim. Mauris malesuada tempus dignissim. Aenean dolor metus, aliquam non elementum ut, condimentum quis eros. Nam molestie ipsum eget augue convallis a iaculis odio sodales. Aenean lacinia pharetra vulputate. Aliquam erat volutpat. Vivamus at massa ut sapien congue commodo. Vivamus elit sem, ultrices eget ornare sed, porttitor ut est. Vestibulum adipiscing mi non libero rutrum tristique. Suspendisse id pharetra enim. Suspendisse vitae tellus ipsum. In blandit nibh sed sapien pharetra adipiscing. Aliquam vestibulum ligula a dolor iaculis eu sagittis arcu vehicula. Donec vehicula, massa nec egestas ultrices, eros nibh consectetur metus, sed cursus tellus metus nec arcu. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Proin eu tincidunt nisi. - -Aliquam quis euismod ipsum. Integer vestibulum semper lorem, at posuere massa consequat a. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Donec non suscipit tellus. In scelerisque auctor orci quis tincidunt. Pellentesque ultricies turpis nec risus ullamcorper ullamcorper. Sed vel urna tempor purus aliquet dignissim. Nulla dapibus, metus quis aliquam rutrum, dolor orci feugiat dolor, ac blandit dui risus et ipsum. Nullam pellentesque elementum nisl. Sed vestibulum nisl sed eros vehicula tempor. Maecenas molestie ultricies venenatis. Mauris sodales tellus in nulla faucibus quis imperdiet libero elementum. - -Proin cursus dolor eget leo porta ut rutrum risus volutpat. Cras ligula augue, convallis id lobortis pellentesque, pharetra sit amet est. Nullam sapien sem, porttitor tristique aliquet eu, bibendum vel est. Sed viverra, lacus eu dapibus aliquet, urna sapien porttitor dolor, eu ornare eros neque molestie turpis. Ut non nunc eget tortor adipiscing viverra. Nunc vel sem eu dui accumsan bibendum tincidunt eu urna. Curabitur sit amet libero ut enim consectetur pulvinar. Donec blandit ornare quam. Pellentesque quam metus, pulvinar id vestibulum mollis, tempus at quam. Fusce nulla lacus, lobortis quis sollicitudin vitae, viverra at arcu. Fusce in tortor et arcu ultrices pellentesque. - -Donec et tincidunt magna. Vestibulum quis tellus nunc, sit amet sodales nunc. Curabitur mollis condimentum egestas. Aliquam lacus orci, laoreet ut convallis eu, viverra sit amet ante. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Sed nunc libero, ultricies eget luctus vitae, bibendum at augue. Vestibulum gravida suscipit dolor, sagittis vestibulum elit ornare at. Nulla pretium viverra nibh at malesuada. Sed eget ipsum orci, nec adipiscing libero. Integer vehicula fermentum purus nec tempus. Pellentesque pulvinar tortor eget arcu porttitor faucibus. Nullam lorem orci, cursus et dapibus eu, blandit in ante. Phasellus at nibh quis neque egestas tincidunt. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; - -Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Aenean mauris tellus, aliquet nec auctor non, rutrum sit amet tellus. Nunc nec blandit eros. Nulla iaculis eleifend aliquet. Proin tortor tortor, ullamcorper at tincidunt sed, dignissim in ipsum. Maecenas elit dolor, interdum ac sollicitudin a, aliquet at ipsum. Proin at ante quis elit adipiscing congue vitae vitae urna. Vestibulum malesuada ultrices tellus, at varius velit bibendum sit amet. - -In sed libero sit amet nulla sollicitudin rutrum id vel mi. Proin at nunc orci, vitae pellentesque mauris. Duis dignissim quam sit amet odio imperdiet volutpat. Nullam scelerisque porta sapien, nec accumsan urna dignissim non. Donec ornare dolor nec mauris volutpat nec tempus nibh vulputate. Fusce vestibulum adipiscing sapien, vel vulputate nibh placerat nec. Sed sem lorem, molestie eu aliquet nec, dapibus eu tortor. Morbi ligula ligula, blandit quis tempor eget, egestas at lacus. Vivamus tempus viverra accumsan. Nullam vulputate, lectus sit amet commodo scelerisque, enim elit auctor orci, eu fermentum massa eros eu lectus. Vivamus blandit magna urna. Suspendisse potenti. - -Morbi commodo pellentesque augue quis pretium. Nullam posuere, mauris non fringilla condimentum, metus sapien rutrum urna, nec blandit sapien augue nec turpis. Sed sollicitudin elementum leo, non vestibulum est egestas at. Fusce sit amet ante vitae mauris porta consequat. Nulla et eros odio, eu vestibulum sem. Cras hendrerit pretium justo et accumsan. Duis quis nulla sit amet lorem rhoncus eleifend a ut elit. Vestibulum fringilla neque in enim vehicula vulputate. Quisque faucibus, nunc eget fringilla aliquet, diam tortor gravida orci, pulvinar semper dui orci vitae quam. Duis eros sapien, posuere eget ultrices in, tempus at ante. Sed accumsan commodo turpis, eget volutpat sapien consequat rutrum. Phasellus mollis est et lectus elementum fringilla. - -Maecenas a mauris non enim hendrerit fringilla. Aliquam facilisis pellentesque tincidunt. Aliquam adipiscing eleifend ultrices. Nulla facilisi. Aliquam erat volutpat. Mauris gravida mattis urna, sit amet ornare magna pharetra et. Ut et magna vitae massa pellentesque vestibulum ut ut mi. Aenean non ipsum odio. Nullam interdum tortor vitae orci lobortis in lobortis magna ultricies. Maecenas id dignissim tellus. - -Cras ligula dui, ultrices ut aliquet eget, consectetur euismod ligula. Nunc laoreet tortor scelerisque sapien auctor id laoreet enim commodo. Nam blandit libero at urna sodales aliquet. Maecenas eleifend dolor at orci adipiscing quis dapibus magna sodales. Donec elementum elementum dolor sit amet pulvinar. Aliquam erat volutpat. Pellentesque et arcu vitae lorem elementum blandit in tincidunt sem. Nunc sit amet mauris sit amet metus bibendum ultrices. Praesent nec lectus mi, vitae faucibus ipsum. Sed eu purus dui. Maecenas adipiscing, lacus vitae elementum accumsan, arcu neque elementum urna, varius varius ante ante id mi. Aliquam pretium risus non nibh adipiscing semper. Curabitur quis magna erat. Donec at dolor non mauris lacinia dignissim. Ut tincidunt pellentesque lectus vel elementum. Nulla venenatis sollicitudin diam, vitae scelerisque enim ornare in. - -Aliquam erat volutpat. Suspendisse dolor lectus, pharetra et ultrices et, molestie at turpis. Aenean rutrum accumsan eleifend. Pellentesque quis neque sed ipsum hendrerit consectetur et aliquam risus. In ultrices consectetur nunc et volutpat. Proin lacinia adipiscing urna et pellentesque. Sed et erat lectus. Nam cursus hendrerit ligula feugiat auctor. Duis risus tellus, pretium vel auctor nec, varius id ante. Nunc elementum malesuada condimentum. Sed eget sem eleifend erat varius imperdiet. Fusce lobortis dignissim adipiscing. Nunc sodales, quam ac accumsan varius, ipsum urna congue ligula, id pulvinar mi lorem ac magna. Proin mauris odio, vehicula ut laoreet eget, dictum eu justo. Nullam ultricies neque eros, sit amet rhoncus tellus. Integer tempus, purus sed mattis convallis, leo ante porttitor risus, in ultricies libero nisl et nulla. - -Etiam dapibus feugiat diam ut bibendum. Etiam turpis ante, rhoncus at pretium quis, tincidunt vel neque. Quisque augue orci, adipiscing id condimentum in, tempus et velit. Phasellus iaculis, leo sed bibendum tempus, ipsum nisl pellentesque dolor, sed tincidunt metus elit quis orci. Vivamus eget nisi vitae eros laoreet bibendum. Cras molestie urna eu dui ullamcorper mollis. Donec adipiscing ultricies magna ac rutrum. Nam fringilla dui nisi. Mauris ut augue a eros sollicitudin fermentum et eu neque. Ut sit amet augue dui, eget condimentum enim. Integer libero ligula, gravida non ultricies ut, vehicula vitae ipsum. - -Aliquam semper luctus lectus quis vulputate. Donec varius congue augue quis commodo. Suspendisse in leo velit, sit amet vulputate sem. Sed pulvinar tristique urna, ac tempus sem volutpat et. Nulla ac interdum eros. Fusce rhoncus nisi sit amet justo elementum sed congue sapien condimentum. Donec sed turpis mauris, eget placerat odio. - -Phasellus accumsan ante ut nulla venenatis condimentum. Phasellus vel dui at libero pulvinar ullamcorper ut viverra nibh. Curabitur at tortor mauris, a sollicitudin nulla. Praesent aliquam ipsum ut dolor luctus commodo. Suspendisse ac felis neque, quis hendrerit sem. Maecenas sed ipsum ante. In ultricies interdum nibh, in convallis lectus pretium volutpat. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Maecenas malesuada porta imperdiet. Nam pellentesque lacus a ante adipiscing sit amet blandit libero sodales. Sed vulputate neque eu nunc egestas a elementum quam tincidunt. Quisque in tortor ut quam lacinia blandit eget sed ligula. Vestibulum pharetra varius tortor eget iaculis. Maecenas facilisis facilisis arcu, eu tristique lectus pellentesque nec. In vel est velit. Integer vel est vel enim fermentum scelerisque vel in quam. - -Quisque consectetur risus at purus tempor aliquam. Vestibulum fermentum ante at sapien gravida sit amet dictum erat gravida. Praesent fermentum ullamcorper mauris, sit amet ornare mi semper nec. Proin sed vulputate leo. Nulla ut nibh a est luctus commodo. Phasellus faucibus condimentum metus ut euismod. Cras sit amet enim eget magna condimentum ullamcorper. Suspendisse ut dui eget enim rhoncus bibendum. Aenean vel condimentum metus. Pellentesque non enim erat, et fermentum libero. Donec feugiat ligula vitae erat sodales eget tristique elit posuere. Morbi malesuada leo tempus dui venenatis nec consequat risus venenatis. Quisque ac nisl ligula. Morbi convallis, justo ut rutrum vulputate, lorem dolor congue ipsum, accumsan feugiat sapien lorem sit amet tellus. Quisque pharetra, magna sit amet egestas consectetur, est lacus venenatis nunc, sed vestibulum risus orci quis nulla. Quisque placerat imperdiet condimentum. - -Fusce ornare auctor nisl, vel gravida ante sollicitudin ornare. Praesent quis blandit erat. Donec vel metus purus, vel faucibus orci. Pellentesque sed elit in ante vestibulum sagittis in eget purus. Integer nisi urna, ornare in tristique in, iaculis vitae ipsum. Vivamus metus lectus, pellentesque et ultricies sit amet, mollis vitae quam. Donec euismod facilisis nibh. Nunc dapibus mollis ante, eget dignissim erat pretium ut. - -Aliquam aliquam enim nulla. Maecenas elementum accumsan elit, id feugiat tortor adipiscing in. Praesent tortor augue, suscipit eu pellentesque in, commodo ut erat. Mauris a placerat eros. Fusce porttitor elementum quam vitae mattis. Aenean diam est, consectetur nec iaculis sed, suscipit sit amet nibh. Maecenas lacinia enim nec diam sollicitudin interdum vitae sed mauris. Etiam sollicitudin nunc sed nisi blandit euismod. Ut lacus quam, ultrices in euismod nec, congue eu ligula. Aliquam interdum odio id lectus vulputate vulputate. Sed vitae purus erat. Aliquam at ligula urna, et auctor risus. Ut enim lacus, euismod vitae fermentum rhoncus, dictum in velit. - -Cras pellentesque porttitor nisi, nec volutpat odio interdum sit amet. Curabitur tellus lacus, gravida sit amet convallis id, convallis quis mauris. Nulla luctus est posuere lectus auctor non ullamcorper leo egestas. Ut dapibus, sem sit amet posuere commodo, nisl nisi consequat libero, eu scelerisque quam tortor vel est. Maecenas faucibus dictum pretium. Nunc dapibus pretium fringilla. Aenean ornare fermentum mi, vel dapibus quam dictum vitae. Proin dictum, odio ut interdum iaculis, elit leo euismod justo, et blandit libero est et nibh. Sed et orci eget ante accumsan suscipit. In viverra nisl nibh. Nullam feugiat, eros eu auctor condimentum, massa nisi ultrices elit, in vehicula odio mauris quis felis. Pellentesque pellentesque augue eget elit venenatis consequat. Vivamus feugiat feugiat felis eget convallis. Aenean ornare malesuada ante nec luctus. Fusce eleifend, nisi vel sagittis commodo, tellus leo tincidunt est, ut ultricies lectus urna eu magna. - -Integer sit amet urna ut justo consequat auctor. Pellentesque at diam neque, sit amet venenatis urna. Sed elit metus, tempor in scelerisque sed, fermentum sit amet mauris. Phasellus auctor congue mi, sit amet hendrerit arcu molestie vitae. Mauris venenatis interdum leo, non porttitor mauris varius non. Nulla facilisi. Donec molestie euismod adipiscing. Integer rutrum est at nibh suscipit accumsan. In sit amet leo lacus. Maecenas consectetur molestie congue. Pellentesque aliquet volutpat augue eu fermentum. - -Maecenas suscipit mauris lobortis enim tempus eu consectetur risus pulvinar. Quisque at lectus elit, quis pulvinar odio. Proin sollicitudin ullamcorper velit, et aliquet velit congue sed. Aenean ipsum dolor, ullamcorper at mollis sed, pellentesque eget nisl. Suspendisse eu ligula dui. Duis velit dui, vehicula et mattis non, scelerisque et ligula. Etiam sit amet iaculis enim. Praesent pharetra nunc viverra lacus pharetra eleifend. Nunc dictum, libero ac rutrum interdum, mauris dolor aliquet ante, eu accumsan massa ipsum dictum magna. Praesent vulputate ante sed purus tempor eget tempor nulla mattis. Nullam purus nunc, egestas vitae cursus quis, congue faucibus eros. Morbi augue turpis, pharetra sit amet condimentum quis, semper id nisl. Aenean pharetra ornare bibendum. - -Maecenas euismod ornare nisi, non sollicitudin turpis rhoncus vitae. Vivamus justo turpis, ultrices sed tempor ac, convallis ac dolor. Nunc tempus convallis ante, non cursus felis tristique vel. Donec malesuada mi sed leo luctus ac vehicula massa tempus. Morbi sagittis semper augue, ac mattis justo condimentum a. Donec ut enim erat. Fusce suscipit, turpis at consequat imperdiet, lacus eros ullamcorper magna, ac fermentum elit ipsum eu enim. Sed id augue nec magna faucibus dictum eu vel nisl. Nullam dolor leo, dictum sed aliquam vel, pulvinar id mauris. Quisque elit orci, varius vitae dapibus eget, vulputate ac augue. Pellentesque ut sapien ut nunc hendrerit varius vitae quis arcu. - -Nunc quis tortor sit amet tellus ultrices blandit id sed lacus. Vivamus scelerisque luctus diam nec posuere. Nullam varius eleifend lacus id aliquet. Nulla lectus enim, hendrerit quis volutpat vel, imperdiet eu neque. Donec sodales tempor interdum. Morbi bibendum justo eu ante molestie pharetra. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Sed ante leo, bibendum tempor suscipit vitae, feugiat vitae nisl. Mauris nec leo turpis, tristique consequat ligula. Curabitur mauris urna, ultrices id posuere nec, vestibulum non enim. Suspendisse potenti. In hac habitasse platea dictumst. Pellentesque vel elit arcu. - -Vivamus tincidunt velit non elit elementum sodales. Sed vitae tristique nisl. Ut nunc neque, accumsan sit amet pharetra nec, auctor in arcu. Pellentesque velit est, dapibus eu euismod eu, mollis in lacus. Praesent sit amet est nec ante condimentum suscipit. Donec aliquet, ligula eget pellentesque dapibus, neque massa porttitor erat, a luctus magna mi in nisi. Pellentesque pharetra, ipsum at sollicitudin ullamcorper, diam mauris pharetra nisl, sit amet accumsan mi odio in ante. Suspendisse pulvinar, metus in luctus sollicitudin, erat sem blandit risus, a viverra lectus nunc vel tortor. Integer sagittis turpis eget quam mollis at aliquet lectus congue. Phasellus aliquam bibendum lectus a semper. Duis blandit faucibus risus id cursus. Fusce eu sapien eros. Curabitur id egestas velit. - -Nulla sit amet ante ipsum. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Fusce tortor nisl, rhoncus ut tincidunt in, faucibus accumsan nisl. Mauris commodo bibendum ligula, in pulvinar erat semper eu. Ut vitae urna a nibh facilisis semper non ac justo. Duis nec sapien in orci bibendum consequat sed id odio. Suspendisse iaculis tempor faucibus. Phasellus vestibulum bibendum fermentum. Mauris tortor dolor, semper gravida vehicula ut, mattis et odio. In facilisis aliquet aliquam. In eleifend commodo elit nec consectetur. Integer et lectus sed felis hendrerit viverra vel vitae libero. - -In a condimentum risus. Integer scelerisque, massa in tincidunt dapibus, ante eros porta augue, a suscipit sapien metus a urna. Donec a dolor ac sem rutrum venenatis. Morbi nisi mauris, pharetra a eleifend eu, porttitor et diam. Proin dictum sollicitudin lectus, sit amet congue arcu ultricies non. Praesent laoreet elit sed risus varius in viverra mi posuere. Aenean sed facilisis justo. Cras fermentum erat sit amet justo ultrices sit amet sagittis diam egestas. - -Mauris viverra, felis non venenatis mattis, nibh dolor mattis est, nec sodales augue ante volutpat lacus. Nunc ultrices lacinia tellus lobortis vestibulum. Maecenas turpis neque, elementum eu faucibus vel, elementum sed leo. Donec bibendum nisl lorem. In sed arcu quam. Praesent vulputate interdum imperdiet. Nam ut leo ipsum, elementum fringilla tellus. Integer vitae vehicula felis. Nullam aliquam condimentum varius. Phasellus tempor urna auctor odio imperdiet sodales. Sed ac neque risus, at semper erat. Sed quam nibh, feugiat ac suscipit eget, elementum eu nisi. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; - -Ut vulputate porta tristique. Aliquam at augue neque. Aenean lacinia neque faucibus ante iaculis congue. Phasellus dictum dictum nisi eu rhoncus. Nam sit amet diam sed dui condimentum mollis. Maecenas vel lorem at ante dapibus varius ac vitae libero. Cras vel ante et dui auctor ultricies. - -Nam vehicula eros in justo iaculis eget accumsan diam porta. Integer ut lobortis elit. Maecenas id lacus sit amet leo commodo interdum. Proin erat tellus, venenatis at pellentesque ac, sagittis vel est. Praesent dictum dictum odio fermentum varius. Etiam eu risus non urna sodales lobortis et eu dolor. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Sed lobortis turpis at dolor eleifend ornare. - -Etiam tempor ante auctor ligula volutpat luctus. Etiam fringilla pellentesque dui, a posuere orci bibendum in. Donec tristique tellus eu lorem venenatis in imperdiet libero fermentum. Praesent ut sem nec dui fermentum tristique et vel lacus. Nunc urna lorem, faucibus vel viverra eu, rhoncus eget justo. Donec tortor dui, facilisis at sollicitudin vitae, interdum vitae orci. Mauris euismod sem sed felis laoreet tincidunt. Praesent lorem nunc, sodales id rutrum et, imperdiet eu nisi. Vivamus lectus sapien, volutpat vel dictum nec, vestibulum at nulla. Proin suscipit enim eget nulla euismod varius. Morbi blandit tortor nec velit ultricies congue. Sed ac odio dolor. Suspendisse quis enim est, id ultricies felis. Vivamus in leo nec justo dictum pulvinar. - -Morbi enim eros, euismod sed malesuada nec, pharetra vel nibh. Quisque mauris turpis, aliquet sit amet imperdiet non, ornare sit amet neque. Nullam id est quis libero porta molestie. Pellentesque at erat a leo condimentum sodales in at diam. Mauris blandit est sit amet nibh feugiat vitae imperdiet sapien tristique. Mauris et mi non sapien interdum accumsan. Cras lobortis urna id sem dapibus in blandit purus fringilla. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Phasellus vitae quam quis lectus faucibus adipiscing. Suspendisse et metus nec felis feugiat rutrum sed id neque. Aliquam accumsan suscipit vulputate. Nam pulvinar tincidunt aliquam. - -Donec fermentum pharetra lacinia. Integer nulla risus, malesuada sed faucibus ut, viverra nec enim. Cras sagittis posuere mauris, id luctus quam consequat sed. Cras tincidunt erat sed velit ultricies adipiscing. Praesent commodo dapibus porta. Etiam at risus id justo egestas tempus a eget magna. Sed eget ipsum eget diam vestibulum semper. Nam a lectus mauris, eleifend laoreet nibh. Pellentesque odio nisi, condimentum id feugiat vitae, pellentesque sit amet enim. Curabitur arcu tortor, vulputate et blandit nec, interdum vel sem. Aenean sagittis leo vitae eros pretium in aliquet lacus molestie. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Donec cursus, dolor in imperdiet iaculis, arcu felis ornare eros, id bibendum mi arcu eget justo. Aliquam quis turpis leo, id tincidunt augue. Proin congue congue purus quis dictum. - -Maecenas eu massa eget diam ornare ullamcorper non eget dolor. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc quis risus sem. Pellentesque bibendum sollicitudin vestibulum. Pellentesque vel rhoncus nulla. Pellentesque magna erat, euismod sit amet vehicula venenatis, malesuada vitae erat. Nullam posuere posuere egestas. - -Nulla lobortis sapien vitae eros fringilla at facilisis sem vehicula. Aenean ullamcorper, tortor non dictum fringilla, mauris eros eleifend odio, at porttitor turpis dolor id erat. Nam aliquam tempus urna, ac sagittis lorem pharetra vitae. Cras luctus mattis odio mollis aliquam. Vestibulum congue ornare pretium. In ullamcorper turpis in augue laoreet blandit. Maecenas urna lacus, tempor ac molestie id, posuere sit amet sapien. Sed vitae sapien nunc, in iaculis nibh. Quisque egestas est cursus neque pharetra varius. Cras fermentum lorem id risus sollicitudin faucibus. Maecenas dictum tempus elementum. Phasellus congue urna et eros interdum non laoreet arcu feugiat. - -Fusce egestas fringilla nisi a ultrices. Donec dignissim, neque id scelerisque sollicitudin, turpis neque facilisis dolor, vel viverra leo leo sed metus. Aliquam suscipit placerat adipiscing. In commodo, nibh at luctus blandit, arcu libero congue ligula, sed facilisis tortor mi non mauris. In eu felis non velit suscipit congue eget sit amet tortor. Suspendisse tempor, nisi ornare accumsan posuere, metus augue rhoncus ante, eget vestibulum nunc nisi sit amet metus. Duis eu mauris enim, nec lacinia mi. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Sed lobortis magna nec felis scelerisque et lobortis lacus viverra. Nullam quis dui metus, a ullamcorper orci. Vivamus eleifend auctor libero, eu adipiscing odio semper quis. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec feugiat laoreet leo in faucibus. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Vestibulum convallis facilisis turpis, quis scelerisque est accumsan malesuada. - -Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Vivamus at lorem dui. Nunc quis ligula id neque cursus condimentum non vel massa. Sed iaculis rhoncus tortor, non tincidunt libero placerat in. Mauris pharetra scelerisque auctor. In hac habitasse platea dictumst. Fusce mollis tincidunt feugiat. Proin et magna turpis, ac fringilla lorem. - -Sed ultricies, sapien eget tincidunt posuere, massa leo elementum purus, vel lacinia turpis mi id massa. In ut bibendum lorem. Pellentesque euismod hendrerit ante, imperdiet eleifend dolor interdum quis. Aenean est arcu, bibendum vitae consectetur viverra, iaculis quis justo. Sed consequat consequat leo, sit amet condimentum lorem mollis ut. Integer purus sapien, sagittis sit amet luctus in, pellentesque vel purus. Curabitur dolor justo, euismod eu sagittis id, sollicitudin sed lorem. Aliquam risus sapien, auctor sed varius blandit, dictum in sapien. Aenean nulla ligula, porttitor in blandit sit amet, feugiat eu nulla. Duis luctus sollicitudin turpis, vitae varius diam cursus vel. Cras imperdiet adipiscing accumsan. Ut vitae arcu elit. Duis quis neque at lacus sodales accumsan. Nam ac orci quis nisl tincidunt rhoncus. Quisque accumsan eleifend est quis hendrerit. Proin et elit ut justo ultrices dignissim a vitae nulla. - -Donec diam ante, congue sollicitudin imperdiet egestas, cursus blandit tortor. Ut ac tortor est, at varius ante. Nulla ut iaculis urna. Ut turpis leo, eleifend ac pharetra id, tincidunt in nunc. Fusce tempor elementum nibh, quis volutpat sem tincidunt ut. Etiam malesuada, dolor id semper lacinia, ipsum orci facilisis ipsum, eget sagittis velit nulla iaculis leo. Duis id sem ipsum, non hendrerit risus. Cras sed ligula sed lacus molestie porttitor ac id massa. Vestibulum accumsan enim in orci pretium vitae scelerisque enim egestas. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Sed sodales vestibulum mauris, adipiscing sagittis lacus pharetra eu. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Morbi mollis nisl est. Sed placerat nulla ac enim pulvinar euismod. Quisque eget orci libero, sed sollicitudin leo. Nullam ac odio non nisl molestie vehicula eget a arcu. - -Aenean in tellus nunc, eu porttitor eros. Etiam vel orci sed ipsum dictum ultricies at a nunc. Mauris ante tortor, auctor a varius posuere, pulvinar id nulla. Vestibulum eleifend sem bibendum mauris mattis varius. Phasellus feugiat ligula lacus. Vivamus arcu eros, fermentum id fermentum in, egestas vel sapien. Morbi sodales sem et nisi volutpat venenatis. Sed posuere, augue ut sodales iaculis, lacus augue placerat orci, ac ornare lorem elit posuere mauris. Proin a varius nisl. Praesent volutpat, libero ut vulputate euismod, massa lectus tincidunt justo, a porttitor ante dui id purus. Pellentesque vehicula nisi sed nunc vehicula sit amet euismod eros consequat. Nunc ut eros magna, eget porttitor nisi. Integer risus ante, viverra in lacinia sit amet, semper id lacus. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Maecenas nunc leo, imperdiet at fermentum non, convallis tempus ante. - -Sed molestie risus vitae ipsum accumsan interdum. Suspendisse potenti. Aenean consectetur gravida pellentesque. Cras sollicitudin leo ac lectus ultrices placerat tristique eros volutpat. Fusce pellentesque sagittis massa at pellentesque. Donec interdum odio a ipsum lacinia vel egestas leo volutpat. Morbi porta, urna in auctor placerat, sapien sapien facilisis turpis, ac feugiat odio lacus at ipsum. Morbi vulputate tellus at lectus imperdiet eget egestas eros ultricies. Pellentesque consectetur egestas arcu, nec aliquam nisi cursus a. In viverra mauris eu ipsum iaculis interdum. Pellentesque elementum lectus id elit placerat eget viverra lectus consequat. Cras quis felis velit. Integer malesuada, est at ultricies congue, turpis massa convallis odio, viverra porttitor urna nulla sit amet tortor. Mauris euismod felis aliquam dolor congue quis tristique enim tristique. Aenean hendrerit consectetur ultrices. In hac habitasse platea dictumst. - -Donec rutrum odio nec nisi vehicula vitae fringilla est tincidunt. Quisque mattis aliquet dolor sed venenatis. Sed eu purus sit amet risus sollicitudin mattis semper id tellus. Curabitur et dictum odio. Sed vel mi orci, quis ultrices elit. Maecenas volutpat ligula dapibus lacus mattis eget dictum quam laoreet. Etiam vel fringilla leo. Vestibulum pulvinar augue at quam vulputate quis tempor risus pulvinar. Nunc mattis elit nec leo pretium at dignissim enim ultricies. Vestibulum facilisis augue ac massa sollicitudin et rutrum felis pharetra. Morbi ante tellus, cursus a posuere nec, pellentesque id mauris. Sed quis enim sem, vitae feugiat sapien. Aenean vitae tellus eu enim tincidunt interdum ac in purus. Aliquam venenatis congue lorem ac scelerisque. Quisque aliquet lectus id ipsum adipiscing commodo. - -Proin viverra turpis at tellus cursus consectetur. Donec molestie massa in erat ullamcorper sed porttitor metus pharetra. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Curabitur adipiscing pharetra semper. Donec nec neque urna. Vestibulum ullamcorper nibh id massa vehicula at commodo diam porttitor. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Fusce scelerisque sollicitudin velit et lobortis. Duis porttitor adipiscing turpis, ut porta dolor fermentum a. Nullam a risus a metus luctus varius. Maecenas posuere congue tristique. Donec luctus congue elementum. Etiam tincidunt dictum massa et commodo. Phasellus tincidunt magna dictum risus congue lacinia. - -Aliquam posuere eros eu sem sagittis porttitor. Suspendisse ac leo erat, nec aliquet felis. Aliquam erat volutpat. In eu pharetra quam. Vivamus nec lectus nec purus dapibus ultrices. Nullam cursus suscipit enim in varius. Morbi a gravida nulla. Praesent sit amet quam vel massa imperdiet suscipit. Nunc at vulputate lectus. - -Sed at nisi risus. Aenean sodales ultrices molestie. Nulla vel eros magna, malesuada consectetur lacus. Sed in tortor quam. Suspendisse tincidunt quam feugiat mauris pretium quis euismod ante hendrerit. In ut elit vitae ipsum cursus accumsan non at nibh. Duis et pretium felis. Pellentesque et elit erat. Quisque sit amet orci tincidunt nulla consequat condimentum. - -Lorem ipsum dolor sit amet, consectetur adipiscing elit. Ut egestas ipsum ac dolor fermentum et dictum nulla luctus. Nam est lorem, sagittis eget imperdiet et, pellentesque quis justo. Suspendisse varius nibh vel mi tincidunt rhoncus. Vivamus iaculis neque ac arcu vestibulum convallis auctor ligula congue. Aliquam in tortor nec magna euismod gravida. Aenean sit amet eros a purus tincidunt mollis eget ac leo. Curabitur scelerisque, nisl congue dictum molestie, arcu mauris molestie magna, eu scelerisque arcu turpis vitae felis. In porttitor, lectus vitae pellentesque aliquet, nisl tellus bibendum nisl, ut porttitor nibh augue ac lacus. Mauris fringilla volutpat massa vel semper. Ut sit amet orci at ante laoreet ornare. Donec ac lacus justo. In fringilla porta ipsum, sed commodo eros faucibus in. Mauris sapien mi, rhoncus vitae porta dapibus, luctus et justo. - -Pellentesque felis lectus, lacinia eget elementum non, adipiscing a purus. Sed risus eros, iaculis posuere vehicula et, interdum nec nisl. Nulla vehicula, nulla in adipiscing sollicitudin, nulla augue venenatis felis, ac eleifend risus velit vel diam. Curabitur sollicitudin lacus vel massa porttitor consectetur. Ut commodo iaculis fringilla. Suspendisse auctor molestie nunc, sed gravida nunc condimentum sed. Phasellus cursus luctus velit id imperdiet. Morbi luctus accumsan sem eget aliquet. - -Duis volutpat, augue nec pharetra vulputate, ligula libero malesuada dui, vitae vestibulum metus magna condimentum nunc. Nullam et congue lacus. Vivamus adipiscing, orci sit amet rhoncus mattis, nulla urna mattis velit, sit amet pulvinar augue felis eu ante. Duis porttitor tincidunt sapien nec laoreet. Nulla egestas neque id odio venenatis ac facilisis libero fringilla. Sed nec massa sit amet tellus cursus aliquet. Ut in risus urna, sit amet tristique libero. Vestibulum mauris dolor, malesuada in fermentum at, ornare non dui. Etiam vel molestie ipsum. Etiam sed lacus lectus. Ut tincidunt velit id nulla tristique gravida. Aliquam hendrerit suscipit est, at viverra tortor iaculis id. Mauris sollicitudin nisi nec justo convallis quis tempus quam pellentesque. Donec augue dui, gravida ut feugiat vitae, facilisis ut odio. Proin at neque vehicula urna semper placerat nec in urna. - -Integer consectetur, massa sed dignissim hendrerit, augue ipsum facilisis nunc, eu fermentum justo risus vel sapien. Proin eleifend placerat arcu sed vehicula. Duis non imperdiet dui. In pulvinar elit vitae augue mattis laoreet. Maecenas risus dui, laoreet at viverra non, volutpat ac elit. Quisque elit arcu, laoreet et rutrum eu, cursus eget nunc. Maecenas vitae ultricies nunc. Ut nec dolor id ipsum volutpat porttitor ac ac erat. - -Nunc ac risus eu risus mollis tempor et eu quam. Donec risus nisl, faucibus vehicula aliquet sed, porttitor sed mauris. Phasellus hendrerit pretium pharetra. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Nunc quis vestibulum nibh. Aenean vehicula turpis dui, nec dictum felis. Curabitur commodo lobortis rutrum. - -Morbi sagittis condimentum velit, a aliquet massa cursus id. Donec massa purus, varius eu fermentum ut, tempor nec erat. Aliquam lobortis eros non lorem interdum porttitor. Aliquam vitae nisi et metus hendrerit commodo ut ut dolor. Ut vel fermentum magna. Nam fringilla orci sem, sed tincidunt nisl. Donec pellentesque rutrum interdum. Nulla faucibus justo augue. Vestibulum tristique est egestas magna scelerisque consequat. Curabitur dapibus ante sem. Duis congue enim nec risus blandit luctus. Duis eu eros tempus orci viverra fermentum. - -Curabitur a nibh erat, id mattis enim. Curabitur varius lacinia eros, id rutrum libero fermentum id. Mauris eget augue id enim egestas pharetra accumsan at nunc. Etiam consequat eros quis massa venenatis a pellentesque est vehicula. Quisque commodo iaculis magna, et tincidunt lacus accumsan ut. Pellentesque ac felis ac dolor tristique imperdiet. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Nulla non laoreet dolor. Nam sed aliquam arcu. Cras at ligula in metus dignissim scelerisque. Morbi vitae nisl quam. - -Donec tristique euismod tempor. Aenean tristique nisl quis justo consectetur semper hendrerit magna posuere. Mauris pellentesque elementum auctor. Sed vestibulum consequat consequat. Praesent posuere leo nec turpis luctus vitae egestas turpis feugiat. Suspendisse scelerisque sodales eleifend. Sed ultrices tincidunt euismod. Integer in risus quam, nec ultrices ligula. Phasellus vestibulum bibendum vestibulum. Proin commodo ligula et purus vulputate dignissim vel sed sem. Nulla facilisi. Morbi tellus justo, ullamcorper in egestas nec, facilisis nec justo. Nulla tempor lorem quis metus molestie sed fermentum orci tristique. - -Praesent ipsum nisi, ultrices suscipit consequat fringilla, faucibus eget nibh. Morbi fermentum mauris eget lacus viverra semper. Donec sapien eros, pretium at fringilla dignissim, vestibulum et ipsum. Nulla ornare dui laoreet nisl malesuada adipiscing. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Nulla iaculis lorem ut tellus porttitor egestas. Phasellus nec urna id tellus pretium tempor vel ac sem. Aenean a sem augue, sit amet condimentum tortor. Sed condimentum mauris a ipsum tristique ullamcorper cursus tellus pellentesque. Integer sapien erat, bibendum nec dapibus vel, mollis ac nisi. Sed sed accumsan nunc. Donec in tempor risus. In et suscipit mauris. Quisque mollis odio eget ipsum imperdiet vitae viverra purus semper. Pellentesque porttitor pretium luctus. Sed a metus eu mi viverra elementum. - -Fusce a magna id nibh dapibus dictum. Aenean sodales, ligula at scelerisque placerat, nisl nulla rutrum nisi, eu posuere lectus arcu ac risus. Mauris vel lacus mauris, at cursus lectus. Integer in ante eget turpis bibendum vulputate. Nam quam mauris, malesuada at pulvinar et, auctor quis leo. Ut rutrum eros eu augue mattis id tristique justo hendrerit. Cras vitae erat nec odio auctor pharetra. Curabitur elit est, consectetur sit amet laoreet vel, mattis sed lacus. Integer cursus quam quis justo porttitor interdum. Pellentesque dapibus fringilla libero vitae dictum. Donec eleifend erat quis augue feugiat sit amet pharetra lectus condimentum. Vivamus nec venenatis enim. Suspendisse et luctus dolor. Curabitur tristique, sem a consequat dapibus, eros lectus porttitor turpis, non commodo lacus tortor nec nulla. Nam cursus elementum iaculis. Sed vehicula porttitor ornare. - -Ut at turpis eget leo ultricies molestie. Praesent eros nulla, sagittis a malesuada non, convallis eu nibh. Vestibulum sodales mi ac mi hendrerit fermentum. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Quisque et elit a dui dictum venenatis. Morbi ipsum justo, posuere in viverra et, porta id tortor. Duis sed turpis sed metus lobortis eleifend. Phasellus lobortis, metus nec auctor aliquam, metus velit sodales dui, sed varius lectus leo vel justo. In ac elit turpis. Curabitur dictum nisi vel nisl consequat ornare. Vivamus dapibus augue eu urna pulvinar id vehicula ligula dapibus. Phasellus sed ultricies magna. Proin volutpat ultricies cursus. - -Quisque viverra turpis egestas lacus tristique et blandit lorem pharetra. Vivamus non urna quis enim dapibus egestas ut quis augue. Sed non leo purus. Morbi sit amet turpis mauris, eu vestibulum ipsum. Aliquam erat volutpat. Suspendisse non gravida lacus. Suspendisse potenti. Curabitur pellentesque elit sollicitudin tellus malesuada a imperdiet nisi congue. Nulla magna turpis, malesuada a ullamcorper ac, sollicitudin egestas ipsum. Nulla facilisi. Nulla rutrum lectus consequat purus facilisis eu adipiscing neque ultrices. In malesuada diam sed arcu varius ornare. Sed vitae bibendum metus. - -Donec scelerisque volutpat sem, sit amet malesuada ante porta id. Maecenas tincidunt, odio ut semper aliquet, metus nisi dignissim justo, nec lobortis nulla ante eget est. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; In facilisis urna et quam convallis mattis. Nullam in metus eget mauris fermentum varius. Sed pharetra dictum molestie. Aenean ac lorem sit amet orci viverra viverra. Nulla lectus orci, eleifend vitae faucibus at, vehicula quis mi. Aliquam non risus nec nulla porta eleifend. Duis venenatis lacus a ante luctus rhoncus. Nulla consequat, urna non suscipit consequat, purus purus pharetra ante, nec ultricies diam mi et dolor. Etiam vestibulum mattis quam, at convallis arcu rutrum quis. Duis suscipit mattis sagittis. Maecenas in sollicitudin erat. In suscipit posuere fringilla. - -Cras luctus massa non dolor placerat dignissim. Praesent nec mattis eros. Vivamus et erat vitae dolor commodo aliquam eget sit amet lacus. Proin nunc justo, imperdiet non porttitor non, vehicula id augue. Vivamus mauris lacus, eleifend in commodo at, feugiat eu ante. Maecenas tortor magna, posuere quis tempus eget, vulputate vel mauris. Donec id leo odio, dapibus porta nisl. Mauris eros ante, euismod vehicula mattis iaculis, convallis at turpis. Donec egestas dictum tempor. Maecenas sed commodo mauris. In hac habitasse platea dictumst. Sed vestibulum luctus sollicitudin. Aliquam accumsan semper lectus et posuere. Fusce aliquet magna in velit cursus viverra. Suspendisse suscipit est nec purus fringilla fermentum. - -Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Ut cursus ipsum in orci volutpat ut interdum leo fermentum. Ut vitae felis non tellus venenatis condimentum. Morbi turpis nibh, sagittis id imperdiet vel, porttitor sed arcu. Phasellus euismod tempus quam non vestibulum. Nullam erat quam, dictum a porttitor quis, pellentesque nec erat. Vestibulum sed leo lectus. Vivamus blandit tristique arcu, vel vulputate diam porttitor ut. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Mauris cursus nunc et felis dapibus in tristique velit tincidunt. Morbi viverra risus a tellus scelerisque pharetra. Donec eros eros, convallis in vehicula quis, pharetra nec lorem. - -Vestibulum volutpat risus id ante ornare eget lobortis diam dapibus. Aenean ut felis massa, at accumsan purus. Nunc id est eu odio pretium bibendum. Phasellus sollicitudin bibendum lectus ut eleifend. Donec in diam nec leo aliquam dictum. Quisque eu quam ac arcu sodales lobortis. Aliquam lectus odio, accumsan eget tincidunt et, placerat in risus. Ut nibh erat, placerat et sodales eu, auctor vel quam. Cras sed diam lorem, eget semper risus. Quisque eu lorem dui. - -Mauris urna justo, tristique vehicula porta sed, feugiat at ligula. Phasellus diam elit, lacinia a posuere in, tincidunt nec diam. Cras vehicula sagittis diam, quis ultricies erat vehicula id. Integer sollicitudin euismod nunc a faucibus. Maecenas sed justo nulla. Aliquam vitae dolor at risus blandit eleifend et ut risus. Aenean lacinia augue eget dolor pulvinar interdum. Nunc enim est, sollicitudin pellentesque volutpat non, fermentum a enim. Nam placerat diam sit amet ante facilisis eu dictum augue dictum. Cras consectetur metus et nulla sollicitudin aliquam non sed eros. - -Sed porttitor leo sed justo porttitor tempus. Donec vehicula ullamcorper mauris, id luctus justo egestas ut. Aliquam id velit nisi. Sed ornare, velit a cursus rhoncus, dui nunc commodo enim, at iaculis orci orci non nulla. Donec nec mi odio. Aenean elit turpis, tempor et placerat vel, aliquam in nibh. Phasellus varius scelerisque sapien commodo laoreet. Quisque sed dolor eu mi adipiscing dictum. Mauris tempor bibendum ullamcorper. Proin pretium dolor mauris. Donec neque tellus, vestibulum id convallis vel, vehicula eget lacus. Aliquam sit amet velit lacus, eget venenatis ligula. - -In molestie felis magna, ac mattis dolor. Nulla in leo libero, vel pulvinar purus. Vestibulum ut nulla sit amet lectus scelerisque adipiscing. Nulla non sem quis lectus vestibulum interdum. Suspendisse blandit hendrerit nibh et tempus. Vivamus vestibulum metus sollicitudin velit rhoncus dictum. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse ligula nibh, dictum ac bibendum eu, mattis vitae erat. Sed porttitor elit a ante ornare pharetra porta risus eleifend. - -Ut commodo ornare congue. Maecenas ac odio sit amet nulla varius congue. Morbi vitae elit a ipsum molestie elementum. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Donec luctus varius neque, non hendrerit felis luctus sit amet. Etiam non lacus sapien. Ut pellentesque lectus quis nunc suscipit blandit. Nam lacinia mauris sit amet tortor tincidunt at dapibus dolor sagittis. Mauris blandit convallis ligula eu posuere. Cras odio erat, auctor eu tincidunt eu, sodales convallis erat. Cras ante mi, consequat eget interdum scelerisque, lacinia non ligula. Vestibulum et elit magna, ut consequat turpis. Nulla id viverra sapien. Etiam vitae tortor magna. diff --git a/packages/c.tmbundle b/packages/c.tmbundle deleted file mode 160000 index 4a87a16..0000000 --- a/packages/c.tmbundle +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 4a87a16e5b809a8d01a345d52483d3d5aa1a3de7 diff --git a/packages/cmake.tmbundle b/packages/cmake.tmbundle deleted file mode 160000 index 926867a..0000000 --- a/packages/cmake.tmbundle +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 926867a414c1125abefa38161d82d71756f591a2 diff --git a/packages/css.tmbundle b/packages/css.tmbundle deleted file mode 160000 index bef87ff..0000000 --- a/packages/css.tmbundle +++ /dev/null @@ -1 +0,0 @@ -Subproject commit bef87ff98730f62cee3bb470f63bd2eb3fb2e4f9 diff --git a/packages/d.tmbundle b/packages/d.tmbundle deleted file mode 160000 index e57b860..0000000 --- a/packages/d.tmbundle +++ /dev/null @@ -1 +0,0 @@ -Subproject commit e57b860c5109756bc80e4d0e66ad54df3e381c3f diff --git a/packages/go.tmbundle b/packages/go.tmbundle deleted file mode 160000 index 0bdec37..0000000 --- a/packages/go.tmbundle +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 0bdec37eded22e8416d046fe28e50d2c5c666798 diff --git a/packages/haskell.tmbundle b/packages/haskell.tmbundle deleted file mode 160000 index 30fa1e2..0000000 --- a/packages/haskell.tmbundle +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 30fa1e283244960e520694d8db6189d9b2bde9f5 diff --git a/packages/html.tmbundle b/packages/html.tmbundle deleted file mode 160000 index 4831b07..0000000 --- a/packages/html.tmbundle +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 4831b07b7211d34ab5570bbf877690cf4fefc9ef diff --git a/packages/ini.tmbundle b/packages/ini.tmbundle deleted file mode 160000 index 7d8c7b5..0000000 --- a/packages/ini.tmbundle +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 7d8c7b5544c48069a246fd2f43e965f06d03d3da diff --git a/packages/java.tmbundle b/packages/java.tmbundle deleted file mode 160000 index a74cb83..0000000 --- a/packages/java.tmbundle +++ /dev/null @@ -1 +0,0 @@ -Subproject commit a74cb835b821e9a3498d1810d546cb49881df73e diff --git a/packages/javascript.tmbundle b/packages/javascript.tmbundle deleted file mode 160000 index ed7a26d..0000000 --- a/packages/javascript.tmbundle +++ /dev/null @@ -1 +0,0 @@ -Subproject commit ed7a26d380eba0bd45af5047ff2dce80da79aac1 diff --git a/packages/json.tmbundle b/packages/json.tmbundle deleted file mode 160000 index 4100e5b..0000000 --- a/packages/json.tmbundle +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 4100e5b0162b3df7984b3b5532529b8ea78cbaa0 diff --git a/packages/lua.tmbundle b/packages/lua.tmbundle deleted file mode 160000 index 6cac188..0000000 --- a/packages/lua.tmbundle +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 6cac1887dc6955a7601af2efec32f1c5ae2e4f73 diff --git a/packages/make.tmbundle b/packages/make.tmbundle deleted file mode 160000 index 371a9e8..0000000 --- a/packages/make.tmbundle +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 371a9e8a56ec02289f129bb2172cb0bdc7ee6b44 diff --git a/packages/markdown.tmbundle b/packages/markdown.tmbundle deleted file mode 160000 index 88f2661..0000000 --- a/packages/markdown.tmbundle +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 88f2661fc12a58880351a3fb5ebb20ac0e7156c1 diff --git a/packages/monokai.tmbundle b/packages/monokai.tmbundle deleted file mode 160000 index 899e4aa..0000000 --- a/packages/monokai.tmbundle +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 899e4aac53f60c58d6017f1d6bbd39a17313a289 diff --git a/packages/perl.tmbundle b/packages/perl.tmbundle deleted file mode 160000 index 8f62f3c..0000000 --- a/packages/perl.tmbundle +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 8f62f3c458cacba3152bfedcc971735a0a5d61b1 diff --git a/packages/php.tmbundle b/packages/php.tmbundle deleted file mode 160000 index d24593d..0000000 --- a/packages/php.tmbundle +++ /dev/null @@ -1 +0,0 @@ -Subproject commit d24593d75c3c5f01b4b0705a9e6db132c0cfd55b diff --git a/packages/property-list.tmbundle b/packages/property-list.tmbundle deleted file mode 160000 index 59a8e6d..0000000 --- a/packages/property-list.tmbundle +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 59a8e6d93d3a095ad001c109e62971b310fb67ed diff --git a/packages/python.tmbundle b/packages/python.tmbundle deleted file mode 160000 index 2567262..0000000 --- a/packages/python.tmbundle +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 2567262452b389f7042ef3026e0443f6336d1735 diff --git a/packages/ruby.tmbundle b/packages/ruby.tmbundle deleted file mode 160000 index 3d4213e..0000000 --- a/packages/ruby.tmbundle +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 3d4213e5e0a437de5b75bf6d2ba625ca14e0c309 diff --git a/packages/shellscript.tmbundle b/packages/shellscript.tmbundle deleted file mode 160000 index 98ded12..0000000 --- a/packages/shellscript.tmbundle +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 98ded122986ad131f7a61e0e7d5479e90f746204 diff --git a/packages/sql.tmbundle b/packages/sql.tmbundle deleted file mode 160000 index 0e80dd0..0000000 --- a/packages/sql.tmbundle +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 0e80dd0c7d72e539213703f5e70615e6afa62cff diff --git a/packages/themes/TextMate-Themes b/packages/themes/TextMate-Themes deleted file mode 160000 index b2efc7c..0000000 --- a/packages/themes/TextMate-Themes +++ /dev/null @@ -1 +0,0 @@ -Subproject commit b2efc7cfee1d5664e7829660de247c71f4a38558 diff --git a/packages/themes/soda b/packages/themes/soda deleted file mode 160000 index d47df56..0000000 --- a/packages/themes/soda +++ /dev/null @@ -1 +0,0 @@ -Subproject commit d47df56b20741eda7ada4d1ed7e730bc4203b0d3 diff --git a/packages/xml.tmbundle b/packages/xml.tmbundle deleted file mode 160000 index ff0d3e5..0000000 --- a/packages/xml.tmbundle +++ /dev/null @@ -1 +0,0 @@ -Subproject commit ff0d3e51d42f046f2dc6a1322d21a60eca2038b9 diff --git a/packages/yaml.tmbundle b/packages/yaml.tmbundle deleted file mode 160000 index e0e6ff0..0000000 --- a/packages/yaml.tmbundle +++ /dev/null @@ -1 +0,0 @@ -Subproject commit e0e6ff0b7f10f618a3a4b2f09c58d7ad67c695cd diff --git a/tasks/build/fix.go b/tasks/build/fix.go deleted file mode 100644 index 006164e..0000000 --- a/tasks/build/fix.go +++ /dev/null @@ -1,72 +0,0 @@ -// Copyright 2013 The lime Authors. -// Use of this source code is governed by a 2-clause -// BSD-style license that can be found in the LICENSE file. - -package main - -import ( - "bytes" - "go/format" - "io/ioutil" - "log" - "os" - "path/filepath" - "strconv" - "time" -) - -var year = strconv.FormatInt(int64(time.Now().Year()), 10) -var licenseheader = []byte(`// Copyright ` + year + ` The lime Authors. -// Use of this source code is governed by a 2-clause -// BSD-style license that can be found in the LICENSE file. -`) - -func patch(path string, fi os.FileInfo, err error) error { - if fi.IsDir() { - switch filepath.Base(path) { - case "testdata", "build2", "packages": - return filepath.SkipDir - } - return nil - } - - switch filepath.Ext(path) { - case ".go", ".c", ".cpp": - default: - return nil - } - - changed := false - cmp, err := ioutil.ReadFile(path) - if err != nil { - return err - } - lhn := append(licenseheader, '\n') - if !bytes.Equal([]byte("// Copyright"), cmp[:12]) { - cmp = append(lhn, cmp...) - log.Println("Added license to", path) - changed = true - } - - fmt, err := format.Source(cmp) - if err != nil { - return err - } - - if !bytes.Equal(cmp, fmt) { - log.Println("Formatted", path) - changed = true - } - - if changed { - return ioutil.WriteFile(path, fmt, fi.Mode().Perm()) - } - - return nil -} - -func main() { - if err := filepath.Walk("./", patch); err != nil { - log.Println("done: ", err) - } -} diff --git a/tasks/build/gen_loaders.go b/tasks/build/gen_loaders.go deleted file mode 100644 index 1d2ce1d..0000000 --- a/tasks/build/gen_loaders.go +++ /dev/null @@ -1,71 +0,0 @@ -// Copyright 2014 The lime Authors. -// Use of this source code is governed by a 2-clause -// BSD-style license that can be found in the LICENSE file. - -package main - -import ( - "log" - "os" - "os/exec" -) - -func getPegparser() { - cmd := exec.Command("go", "get", "github.com/quarnster/parser/pegparser") - out, err := cmd.CombinedOutput() - if err != nil { - log.Println(err) - } - if s := string(out); s != "" { - log.Println(s) - } -} - -func main() { - getPegparser() - header := "// This file was generated by tasks/build/gen_loaders.go and shouldn't be manually modified\n" - - loaders := [][]string{ - { - "./backend/loaders/json/json.peg", - "./backend/loaders/json", - "json_generated", - "JsonFile,Values,Value,Null,Dictionary,Array,KeyValuePairs,KeyValuePair,QuotedText,Text,Integer,Float,Boolean,Spacing,Comment", - "testdata/Default (OSX).sublime-keymap", - }, - { - "./backend/loaders/plist/plist.peg", - "./backend/loaders/plist", - "plist_generated", - "Spacing,KeyValuePair,KeyTag,StringTag,Value,Values,PlistFile,Plist", - "testdata/C.plist", - }, - } - - for _, loader := range loaders { - log.Println("Generating from " + loader[0]) - cmd := exec.Command( - os.ExpandEnv("$GOPATH/bin/pegparser"), - "-peg="+loader[0], - "-outpath="+loader[1], - "-outfile="+loader[2], - "-ignore="+loader[3], - "-testfile="+loader[4], - "-header="+header, - "-notest", - ) - if err := cmd.Run(); err != nil { - log.Println(err.Error()) - } - } - - log.Println("Running ./tasks/build/fix.go") - cmd := exec.Command( - "go", - "run", - "./tasks/build/fix.go", - ) - out, _ := cmd.CombinedOutput() - log.SetFlags(0) - log.Println(string(out)) -} diff --git a/tasks/build/gen_python_api.go b/tasks/build/gen_python_api.go deleted file mode 100644 index 35f0f69..0000000 --- a/tasks/build/gen_python_api.go +++ /dev/null @@ -1,481 +0,0 @@ -// Copyright 2013 The lime Authors. -// Use of this source code is governed by a 2-clause -// BSD-style license that can be found in the LICENSE file. - -// This file generates python bindings for the backend api. -// Similar code would need to be written to generate bindings for other -// scripting languages, though much code is likely shared. - -package main - -import ( - "fmt" - "github.com/limetext/lime/backend" - "github.com/limetext/text" - "io/ioutil" - "os" - "os/exec" - "path/filepath" - "reflect" - "regexp" - "strconv" - "strings" - "time" -) - -var re = regexp.MustCompile(`\p{Lu}`) - -func pyname(in string) string { - switch in { - case "RowCol": - return "_rowcol" - case "String": - return "Str" - case "Len": - return "SeqLen" - case "Get": - return "SeqGet" - } - return re.ReplaceAllStringFunc(in, func(a string) string { return "_" + strings.ToLower(a) }) -} - -func pyretvar(name string, ot reflect.Type) (string, error) { - return fmt.Sprintf("\npy%s, err = toPython(%s)", name, name), nil -} - -func pyret(ot reflect.Type) (string, error) { - v, err := pyretvar("ret", ot) - if err != nil { - return "", err - } - return fmt.Sprintf(` - var pyret py.Object - var err error - %s - return pyret, err - `, v), nil -} - -func typename(t reflect.Type) string { - switch t.Kind() { - case reflect.Slice: - return "[]" + typename(t.Elem()) - case reflect.Ptr: - return "*" + typename(t.Elem()) - default: - return t.String() - } -} -func pytogoconv(in, set, name string, returnsValue bool, t reflect.Type) (string, error) { - r := "" - if returnsValue { - r = "nil, " - } - ty := typename(t) - return fmt.Sprintf(` - if v3, err2 := fromPython(%s); err2 != nil { - return %serr2 - } else { - if v2, ok := v3.(%s); !ok { - return %sfmt.Errorf("Expected type %s for %s, not %%s", %s.Type()) - } else { - %s = v2 - } - }`, in, r, ty, r, ty, name, in, set), nil -} - -func generatemethod(m reflect.Method, t2 reflect.Type, callobject, name string) (ret string, err error) { - var ( - args string - rv string - in = m.Type.NumIn() - 1 - out = m.Type.NumOut() - call string - ) - - if in > 0 { - args = "tu *py.Tuple" - } - if m.Name == "Get" && in == 1 && m.Type.In(1).Kind() == reflect.Int && out == 1 { - args = "arg0 int64" - } - if m.Name == "String" { - rv = "string" - } else if m.Name == "Len" { - rv = "int64" - } else { - rv = "(py.Object, error)" - } - - ret += fmt.Sprintf("\nfunc %s (%s) %s {", name, args, rv) - - if m.Name == "Get" && in == 1 && m.Type.In(1).Kind() == reflect.Int && out == 1 { - ret += `var ( - pyret0 py.Object - err error - ) - if l := ` + callobject + `Len(); int(arg0) >= l || arg0 < 0 { - return nil, py.NewError(py.IndexError, "%d >= %d || %d < 0", arg0, l, arg0) - } - ` - ret += "\nret0 := " + callobject + m.Name + "(int(arg0))" - if r, err := pyretvar("ret0", m.Type.Out(0)); err != nil { - return "", err - } else { - ret += r - ret += ` - if err != nil { - // TODO: do the py objs need to be freed? - return nil, err - } - ` - } - ret += "return pyret0, err\n}\n" - return ret, nil - } else if m.Name == "Len" { - return ret + "return int64(" + callobject + m.Name + "())\n}\n", nil - } - if in > 0 { - ret += "\n\tvar (" - for j := 1; j <= in; j++ { - ret += fmt.Sprintf("\n\t\targ%d %s", j, m.Type.In(j)) - } - r := "" - if m.Name != "String" { - r = "nil, " - } - ret += "\n\t)" - - for j := 1; j <= in; j++ { - t := m.Type.In(j) - name := fmt.Sprintf("arg%d", j) - msg := fmt.Sprintf("%s.%s() %s", t2, m.Name, name) - pygo, err := pytogoconv("v", name, msg, m.Name != "String", t) - if err != nil { - return "", err - } - if t.Kind() == reflect.Map && t.Key().Kind() == reflect.String { - ret += fmt.Sprintf(` - %s = make(%s) - if v, err := tu.GetItem(%d); err == nil {%s}`, name, t, j-1, pygo) - } else { - ret += fmt.Sprintf(` - if v, err := tu.GetItem(%d); err != nil { - return %serr - } else {%s}`, j-1, r, pygo) - } - } - } - - if in > 0 { - call = callobject + m.Name + "(" - for j := 1; j <= in; j++ { - if j > 1 { - call += ", " - } - call += fmt.Sprintf("arg%d", j) - } - call += ")" - } else { - call = callobject + m.Name + "()" - } - if m.Name == "String" { - ret += "\n\treturn " + call - } else if out == 1 && m.Type.Out(0).Name() == "error" { - ret += fmt.Sprintf(` - if err := %s; err != nil { - return nil, err - } else { - return toPython(nil) - }`, call) - } else if out > 0 { - ret += "\n\t" - for j := 0; j < out; j++ { - if j > 0 { - ret += ", " - } - ret += fmt.Sprintf("ret%d", j) - } - ret += " := " + call - ret += "\nvar err error" - for j := 0; j < out; j++ { - ret += fmt.Sprintf("\nvar pyret%d py.Object\n", j) - if r, err := pyretvar(fmt.Sprintf("ret%d", j), m.Type.Out(j)); err != nil { - return "", err - } else { - ret += r - ret += "\nif err != nil {" - for k := 0; k < j; k++ { - ret += fmt.Sprintf("\npyret%d.Decref()", k) - } - ret += "\nreturn nil, err\n}" - } - } - if out == 1 { - ret += "\n\treturn pyret0, err" - } else { - // TODO: does PackTuple take ownership of the objects? - ret += "\n\treturn py.PackTuple(" - for j := 0; j < out; j++ { - if j > 0 { - ret += ", " - } - ret += fmt.Sprintf("pyret%d", j) - } - ret += ")" - } - } else { - ret += "\n\t" + call + "\n\treturn toPython(nil)" - } - ret += "\n}\n" - return -} - -func generatemethodsEx(t reflect.Type, ignorefunc func(name string) bool, callobject string, name func(t reflect.Type, m reflect.Method) string) (methods string) { - t2 := t - if t.Kind() == reflect.Ptr { - t2 = t.Elem() - } - - for i := 0; i < t.NumMethod(); i++ { - var ( - m = t.Method(i) - reason string - ) - - if m.Name[0] != strings.ToUpper(m.Name[:1])[0] { - reason = "unexported" - goto skip - } - if ignorefunc != nil && ignorefunc(m.Name) { - reason = "in skip list" - goto skip - } - - if m, err := generatemethod(m, t2, callobject, name(t2, m)); err != nil { - reason = err.Error() - goto skip - } else { - methods += m - } - - continue - skip: - fmt.Printf("Skipping method %s.%s: %s\n", t2, m.Name, reason) - } - return - -} - -func generatemethods(t reflect.Type, ignorefunc func(name string) bool) (methods string) { - return generatemethodsEx(t, ignorefunc, "o.data.", func(t2 reflect.Type, m reflect.Method) string { - return fmt.Sprintf("\n(o *%s) Py%s", t2.Name(), pyname(m.Name)) - }) -} - -func generateWrapper(ptr reflect.Type, canCreate bool, ignorefunc func(name string) bool) (ret string) { - t := ptr - if t.Kind() == reflect.Ptr { - t = ptr.Elem() - } - if t.Kind() != reflect.Struct { - panic(t.Kind()) - } - it := t.String() - if !canCreate { - it = "*" + it - } - ret += fmt.Sprintf(` - var %sClass = py.Class{ - Name: "sublime.%s", - Pointer: (*%s)(nil), - } - - type %s struct { - py.BaseObject - data %s - } - `, pyname(t.Name()), t.Name(), t.Name(), t.Name(), it) - - cons := "" - if canCreate { - cons = fmt.Sprintf(` - func (o *%s) PyInit(args *py.Tuple, kwds *py.Dict) error { - if args.Size() > %d { - return fmt.Errorf("Expected at most %d arguments") - } - `, t.Name(), t.NumField(), t.NumField()) - ok := true - for i := 0; i < t.NumField(); i++ { - f := t.Field(i) - pygo, err := pytogoconv("v", "o.data."+f.Name, t.Name()+"."+f.Name, false, f.Type) - if err != nil { - ok = false - break - } - cons += fmt.Sprintf(` - if args.Size() > %d { - if v, err := args.GetItem(%d); err != nil { - return err - } else {%s - } - } - `, i, i, pygo) - } - if !ok { - cons = "" - } else { - cons += "\n\treturn nil\n}" - } - } - if cons == "" { - ret += fmt.Sprintf(` - func (o *%s) PyInit(args *py.Tuple, kwds *py.Dict) error { - return fmt.Errorf("Can't initialize type %s") - }`, t.Name(), t.Name()) - } - ret += cons - ret += generatemethods(ptr, ignorefunc) - for i := 0; i < t.NumField(); i++ { - f := t.Field(i) - if !f.Anonymous && f.Name[0] == strings.ToUpper(f.Name[:1])[0] { - if ignorefunc != nil && ignorefunc(f.Name) { - goto skip - } - - if r, err := pyret(f.Type); err != nil { - fmt.Printf("Skipping field %s.%s: %s\n", t.Name(), f.Name, err) - } else if pygo, err := pytogoconv("v", "o.data."+f.Name, t.Name()+"."+f.Name, false, f.Type); err != nil { - fmt.Printf("Skipping field %s.%s: %s\n", t.Name(), f.Name, err) - } else { - ret += fmt.Sprintf(` - func (o *%s) PyGet%s() (py.Object, error) { - ret := o.data.%s%s - } - - func (o *%s) PySet%s(v py.Object) error {%s - return nil - } - - `, t.Name(), pyname(f.Name), f.Name, r, - t.Name(), pyname(f.Name), pygo, - ) - } - skip: - } - } - - return -} - -const path = "./backend/sublime" - -var keep = regexp.MustCompile(`^(.+(_test|_manual)\.go|.+\.py)|(doc\.go)$`) - -func cleanup() { - f, err := os.Open(path) - if err != nil { - panic(err) - } - defer f.Close() - if fi, err := f.Readdir(0); err != nil { - panic(err) - } else { - for _, f := range fi { - if !f.IsDir() && !keep.MatchString(f.Name()) { - fn := filepath.Join(path, f.Name()) - fmt.Println("removing", fn) - os.Remove(fn) - } - } - } -} - -func main() { - cleanup() - var sublime_methods = "" - sn := func(t reflect.Type, m reflect.Method) string { - sn := "sublime_" + m.Name - sublime_methods += fmt.Sprintf("{Name: \"%s\", Func: %s},\n", pyname(m.Name)[1:], sn) - return sn - } - data := [][]string{ - {"./backend/sublime/region_generated.go", generateWrapper(reflect.TypeOf(text.Region{}), true, regexp.MustCompile("Cut").MatchString)}, - {"./backend/sublime/regionset_generated.go", generateWrapper(reflect.TypeOf(&text.RegionSet{}), false, regexp.MustCompile("Less|Swap|Adjust|Has|Cut").MatchString)}, - {"./backend/sublime/edit_generated.go", generateWrapper(reflect.TypeOf(&backend.Edit{}), false, regexp.MustCompile("Apply|Undo").MatchString)}, - {"./backend/sublime/view_generated.go", generateWrapper(reflect.TypeOf(&backend.View{}), false, regexp.MustCompile("Buffer|Syntax|CommandHistory|Show|AddRegions|UndoStack|Transform|Reload|Save|Close|ExpandByClass|Erased|FileChanged|Inserted|Find$|^Status").MatchString)}, - {"./backend/sublime/window_generated.go", generateWrapper(reflect.TypeOf(&backend.Window{}), false, regexp.MustCompile("OpenFile|SetActiveView|Close").MatchString)}, - {"./backend/sublime/settings_generated.go", generateWrapper(reflect.TypeOf(&text.Settings{}), false, regexp.MustCompile("Parent|Set|Get|UnmarshalJSON|MarshalJSON").MatchString)}, - {"./backend/sublime/view_buffer_generated.go", generatemethodsEx( - reflect.TypeOf(backend.GetEditor().Console().Buffer()), - regexp.MustCompile("Erase|Insert|Substr|SetFile|AddCallback|AddObserver|RemoveObserver|Data|Runes|Settings|Index|Close|Unlock|Lock").MatchString, - "o.data.Buffer().", - func(t reflect.Type, m reflect.Method) string { - mn := "" - switch m.Name { - case "Line", "LineR", "FullLine", "FullLineR", "WordR", "Word": - mn = strings.ToLower(m.Name) - case "Id": - mn = "Py_buffer_id" - default: - mn = "Py" + pyname(m.Name) - } - return "(o *View) " + mn - })}, - {"./backend/sublime/commands_generated.go", generatemethodsEx(reflect.TypeOf(backend.GetEditor().CommandHandler()), - regexp.MustCompile("RunWindowCommand|RunTextCommand|RunApplicationCommand|RegisterWithDefault").MatchString, - "backend.GetEditor().CommandHandler().", - sn), - }, - {"./backend/sublime/frontend_generated.go", generatemethodsEx(reflect.TypeOf(backend.GetEditor().Frontend()), - regexp.MustCompile("Show|VisibleRegion|DefaultAction").MatchString, - "backend.GetEditor().Frontend().", - sn), - }, - {"./backend/sublime/sublime_api_generated.go", generatemethodsEx(reflect.TypeOf(backend.GetEditor()), - regexp.MustCompile("Info|HandleInput|CommandHandler|Frontend|Console|SetActiveWindow|Init|Watch|Observe|SetClipboardFuncs|KeyBindings").MatchString, - "backend.GetEditor().", - sn), - }, - } - data[len(data)-1][1] += fmt.Sprintf(`var sublime_methods = []py.Method{ - %s - }`, sublime_methods) - var year = strconv.FormatInt(int64(time.Now().Year()), 10) - - for _, gen := range data { - if gen[0] == "" { - continue - } - wr := `// Copyright ` + year + ` The lime Authors. - // Use of this source code is governed by a 2-clause - // BSD-style license that can be found in the LICENSE file. - - // This file was generated by tasks/build/gen_python_api.go and shouldn't be manually modified - - package sublime - - import ( - "fmt" - "github.com/limetext/gopy/lib" - "github.com/limetext/lime/backend" - "github.com/limetext/text" - ) - var ( - _ = backend.View{} - _ = text.Region{} - _ = fmt.Errorf - ) - ` + gen[1] - if err := ioutil.WriteFile(gen[0], []byte(wr), 0644); err != nil { - panic(err) - } else { - c := exec.Command("go", "fmt", gen[0]) - if o, err := c.CombinedOutput(); err != nil { - panic(fmt.Errorf("%s, %s", o, err)) - } else { - fmt.Printf("%s", string(o)) - } - } - } -} diff --git a/tasks/ci/build_frontends.sh b/tasks/ci/build_frontends.sh deleted file mode 100755 index b961dfb..0000000 --- a/tasks/ci/build_frontends.sh +++ /dev/null @@ -1,39 +0,0 @@ -#!/usr/bin/env bash - -source "$(dirname -- "$0")/setup.sh" - -function build { - pushd "$1" - go build - build_result=$? - echo -ne "${YELLOW}=>${RESET} build $1 - " - if [ "$build_result" == "0" ]; then - echo -e "${GREEN}SUCCEEDED${RESET}" - else - echo -e "${RED}FAILED${RESET}" - fi - popd -} - -fold_start "get.frontends" "get frontends" -go get github.com/limetext/lime/frontend/... -fold_end "get.frontends" - -ret=0 - -fold_start "build.termbox" "build termbox frontend" -build "frontend/termbox" -let ret=$ret+$build_result -fold_end "build.termbox" - -fold_start "build.html" "build html frontend" -build "frontend/html" -let ret=$ret+$build_result -fold_end "build.html" - -fold_start "build.qml" "build qml frontend" -build "frontend/qml" -let ret=$ret+$build_result -fold_end "build.qml" - -exit $ret diff --git a/tasks/ci/check_fmt.sh b/tasks/ci/check_fmt.sh deleted file mode 100755 index d80e81c..0000000 --- a/tasks/ci/check_fmt.sh +++ /dev/null @@ -1,13 +0,0 @@ -#!/usr/bin/env bash - -source "$(dirname -- "$0")/warn.sh" -source "$(dirname -- "$0")/setup.sh" - -ret=0 - -fold_start "fmt" "check formatting" -diff_test "go run tasks/build/fix.go" -let ret=$ret+$test_result -fold_end "fmt" - -exit $ret diff --git a/tasks/ci/check_gen.sh b/tasks/ci/check_gen.sh deleted file mode 100755 index 64435c2..0000000 --- a/tasks/ci/check_gen.sh +++ /dev/null @@ -1,18 +0,0 @@ -#!/usr/bin/env bash - -source "$(dirname -- "$0")/warn.sh" -source "$(dirname -- "$0")/setup.sh" - -ret=0 - -fold_start "gen.python" "check python api" -diff_test "go run tasks/build/gen_python_api.go" -let ret=$ret+$test_result -fold_end "gen.python" - -fold_start "gen.loaders" "check loaders" -diff_test "go run tasks/build/gen_loaders.go" -let ret=$ret+$test_result -fold_end "gen.loaders" - -exit $ret diff --git a/tasks/ci/install.sh b/tasks/ci/install.sh deleted file mode 100755 index 4130c8f..0000000 --- a/tasks/ci/install.sh +++ /dev/null @@ -1,33 +0,0 @@ -#!/usr/bin/env bash - -if [ "$TRAVIS_OS_NAME" == "linux" ]; then - - # make sure we're up to date - sudo apt-get update -qq - - # install go get dependencies - sudo apt-get install -qq mercurial - - # install backend dependencies - sudo add-apt-repository -y ppa:fkrull/deadsnakes - sudo apt-get update -qq - sudo apt-get install -qq libonig-dev python3.4 python3.4-dev - - # install qml frontend dependencies - sudo add-apt-repository -y ppa:ubuntu-sdk-team/ppa - sudo apt-get update -qq - sudo apt-get install -qq qtbase5-private-dev qtdeclarative5-private-dev - -elif [ "$TRAVIS_OS_NAME" == "osx" ]; then - - brew update - brew install oniguruma python3 qt5 - brew link --force qt5 - ln -s "$(brew --prefix python3)/Frameworks/Python.framework/Versions/3.4/lib/pkgconfig/"* "$(brew --prefix)/lib/pkgconfig" - -else - - echo "BUILD NOT CONFIGURED: $TRAVIS_OS_NAME" - exit 1 - -fi diff --git a/tasks/ci/run_tests.sh b/tasks/ci/run_tests.sh deleted file mode 100755 index c48a25f..0000000 --- a/tasks/ci/run_tests.sh +++ /dev/null @@ -1,65 +0,0 @@ -#!/usr/bin/env bash - -source "$(dirname -- "$0")/setup.sh" - -function run_tests { - go test "$1" -covermode=count -coverprofile=tmp.cov - test_result=$? - # Can't do race tests at the same time as coverage as it'll report - # lots of false positives - go test -race "$1" - let test_result=$test_result+$? - echo -ne "${YELLOW}=>${RESET} test $1 - " - if [ "$test_result" == "0" ]; then - echo -e "${GREEN}SUCCEEDED${RESET}" - else - echo -e "${RED}FAILED${RESET}" - fi -} - -function test_all { - let a=0 - for pkg in $(go list "./$1/..."); do - run_tests "$pkg" - let a=$a+$test_result - if [ "$test_result" == "0" ]; then - sed 1d tmp.cov >> coverage.cov - fi - rm tmp.cov - done - test_result=$a -} - -fold_start "get.cov" "get coverage tools" -go get golang.org/x/tools/cmd/cover -go get github.com/mattn/goveralls -go get github.com/axw/gocov/gocov -fold_end "get.cov" - -fold_start "get.termbox" "get termbox" -go get github.com/limetext/lime/frontend/termbox -fold_end "get.termbox" - -echo "mode: count" > coverage.cov - -ret=0 - -fold_start "test.backend" "test backend" -test_all "backend" -let ret=$ret+$test_result -fold_end "test.backend" - -fold_start "test.termbox" "test termbox" -test_all "frontend/termbox" -let ret=$ret+$test_result -fold_end "test.termbox" - -if [ "$ret" == "0" ] && [ "$TRAVIS_OS_NAME" == "linux" ]; then - fold_start "coveralls" "post to coveralls" - "$(go env GOPATH | awk 'BEGIN{FS=":"} {print $1}')/bin/goveralls" -coverprofile=coverage.cov -service=travis-ci - fold_end "coveralls" -fi - -rm coverage.cov - -exit $ret diff --git a/tasks/ci/setup.sh b/tasks/ci/setup.sh deleted file mode 100644 index 5cb04d0..0000000 --- a/tasks/ci/setup.sh +++ /dev/null @@ -1,42 +0,0 @@ -#!/usr/bin/env bash - -# Just so that our oniguruma.pc is found if -# the user doesn't have an oniguruma.pc. -export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:$PWD/../../../github.com/limetext/rubex - -# Colors. -export RED="\e[31m" -export GREEN="\e[32m" -export YELLOW="\e[33m" -export RESET="\e[0m" - -function fold_start { - if [ "$TRAVIS" == "true" ]; then - echo -en "travis_fold:start:$1\r" - echo "\$ $2" - fi -} - -function fold_end { - if [ "$TRAVIS" == "true" ]; then - echo -en "travis_fold:end:$1\r" - fi -} - -function diff_test { - # WARNING: This function is dangerous! - $1 - changed=$(git status --porcelain) - test_result=0 - if [ "$changed" != "" ]; then - echo "\"$1\" hasn't been run!" - echo "Changed files:" - echo "$changed" - test_result=1 - git checkout -- . - fi -} - -export -f fold_start -export -f fold_end -export -f diff_test diff --git a/tasks/ci/warn.sh b/tasks/ci/warn.sh deleted file mode 100644 index a830d82..0000000 --- a/tasks/ci/warn.sh +++ /dev/null @@ -1,20 +0,0 @@ -#!/usr/bin/env bash - -while [ $# != 0 ]; do - arg="$1" - case "$arg" in - -f|--force) - force=true - ;; - esac - shift -done - -if [ "$TRAVIS" != "true" ] && [ "$force" != "true" ]; then - echo "WARNING: This script will destroy any unstaged changes." - echo "Do you want to continue? [Y/n]" - read cont - if [ "$cont" != "" ] && [ "$cont" != "y" ] && [ "$cont" != "Y" ]; then - exit 1 - fi -fi