diff --git a/tools/cmd/diff/main.go b/tools/cmd/diff/main.go index 4282ce9c4..31e4a3058 100644 --- a/tools/cmd/diff/main.go +++ b/tools/cmd/diff/main.go @@ -6,11 +6,61 @@ import ( "fmt" "kitty/tools/cli" + "kitty/tools/config" + "kitty/tools/tui/loop" ) var _ = fmt.Print -func main(_ *cli.Command, opts *Options, args []string) (rc int, err error) { +func load_config(opts *Options) (ans *Config, err error) { + ans = NewConfig() + p := config.ConfigParser{LineHandler: ans.Parse} + err = p.LoadConfig("diff.conf", opts.Config, opts.Override) + if err != nil { + return nil, err + } + return ans, nil +} + +var conf *Config +var opts *Options +var lp *loop.Loop + +func main(_ *cli.Command, opts_ *Options, args []string) (rc int, err error) { + opts = opts_ + conf, err = load_config(opts) + if err != nil { + return 1, err + } + if len(args) != 2 { + return 1, fmt.Errorf("You must specify exactly two files/directories to compare") + } + left, right := args[0], args[1] + lp, err = loop.New() + if err != nil { + return 1, err + } + lp.OnInitialize = func() (string, error) { + lp.SetCursorVisible(false) + lp.AllowLineWrapping(false) + lp.SetWindowTitle(fmt.Sprintf("%s vs. %s", left, right)) + return "", nil + } + lp.OnFinalize = func() string { + lp.SetCursorVisible(true) + return "" + } + err = lp.Run() + if err != nil { + return 1, err + } + ds := lp.DeathSignalName() + if ds != "" { + fmt.Println("Killed by signal: ", ds) + lp.KillIfSignalled() + return 1, nil + } + return } diff --git a/tools/cmd/ssh/config.go b/tools/cmd/ssh/config.go index 47926dd4c..7db7f9f47 100644 --- a/tools/cmd/ssh/config.go +++ b/tools/cmd/ssh/config.go @@ -391,19 +391,9 @@ func (self *ConfigSet) line_handler(key, val string) error { func load_config(hostname_to_match string, username_to_match string, overrides []string, paths ...string) (*Config, []config.ConfigLine, error) { ans := &ConfigSet{all_configs: []*Config{NewConfig()}} p := config.ConfigParser{LineHandler: ans.line_handler} - if len(paths) == 0 { - paths = []string{filepath.Join(utils.ConfigDir(), "ssh.conf")} - } - paths = utils.Filter(paths, func(x string) bool { return x != "" }) - err := p.ParseFiles(paths...) - if err != nil && !errors.Is(err, fs.ErrNotExist) { + err := p.LoadConfig("ssh.conf", paths, overrides) + if err != nil { return nil, nil, err } - if len(overrides) > 0 { - err = p.ParseOverrides(overrides...) - if err != nil { - return nil, nil, err - } - } return config_for_hostname(hostname_to_match, username_to_match, ans), p.BadLines(), nil } diff --git a/tools/config/api.go b/tools/config/api.go index 89ecb7545..f8f9c29d5 100644 --- a/tools/config/api.go +++ b/tools/config/api.go @@ -168,6 +168,38 @@ func (self *ConfigParser) ParseFiles(paths ...string) error { return nil } +func (self *ConfigParser) LoadConfig(name string, paths []string, overrides []string) (err error) { + const SYSTEM_CONF = "/etc/xdg/kitty" + system_conf := filepath.Join(SYSTEM_CONF, name) + add_if_exists := func(q string) { + err = self.ParseFiles(q) + if err != nil && errors.Is(err, fs.ErrNotExist) { + err = nil + } + } + if add_if_exists(system_conf); err != nil { + return err + } + if len(paths) > 0 { + for _, path := range paths { + if add_if_exists(path); err != nil { + return err + } + } + } else { + if add_if_exists(filepath.Join(utils.ConfigDirForName(name), name)); err != nil { + return err + } + } + if len(overrides) > 0 { + err = self.ParseOverrides(overrides...) + if err != nil { + return err + } + } + return +} + type LinesScanner struct { lines []string } diff --git a/tools/utils/paths.go b/tools/utils/paths.go index 7281359dd..b7a834110 100644 --- a/tools/utils/paths.go +++ b/tools/utils/paths.go @@ -73,7 +73,7 @@ var KittyExe = (&Once[string]{Run: func() string { return os.Getenv("KITTY_PATH_TO_KITTY_EXE") }}).Get -var ConfigDir = (&Once[string]{Run: func() (config_dir string) { +func ConfigDirForName(name string) (config_dir string) { if kcd := os.Getenv("KITTY_CONFIG_DIRECTORY"); kcd != "" { return Abspath(Expanduser(kcd)) } @@ -101,7 +101,7 @@ var ConfigDir = (&Once[string]{Run: func() (config_dir string) { for _, loc := range locations { if loc != "" { q := filepath.Join(loc, "kitty") - if _, err := os.Stat(filepath.Join(q, "kitty.conf")); err == nil { + if _, err := os.Stat(filepath.Join(q, name)); err == nil { config_dir = q return } @@ -113,6 +113,10 @@ var ConfigDir = (&Once[string]{Run: func() (config_dir string) { } config_dir = filepath.Join(Expanduser(config_dir), "kitty") return +} + +var ConfigDir = (&Once[string]{Run: func() (config_dir string) { + return ConfigDirForName("kitty.conf") }}).Get var CacheDir = (&Once[string]{Run: func() (cache_dir string) {