From 8c7ff84d662b3569257981052613c560ca9428fc Mon Sep 17 00:00:00 2001 From: Bryan Phelps Date: Wed, 2 Sep 2020 07:56:24 -0700 Subject: [PATCH 1/2] Vimcompatible: Set defaults for layout tab position / singleTabMode --- src/Core/Config.re | 15 +++++++++++++-- src/Core/Config.rei | 7 +++++-- src/Feature/Layout/Configuration.re | 30 ++++++++++++++++++++++++++++- 3 files changed, 47 insertions(+), 5 deletions(-) diff --git a/src/Core/Config.re b/src/Core/Config.re index d28ec85b63..426afd0f25 100644 --- a/src/Core/Config.re +++ b/src/Core/Config.re @@ -148,8 +148,19 @@ module Schema = { }; }; - let vim = (name, converter: VimSetting.t => 'a, resolver) => { - name |> toVimSettingOpt(resolver) |> Option.map(converter); + let getVimCompatibilitySetting = (resolver, maybeDefault) => { + maybeDefault + |> OptionEx.flatMap((default) => { + switch (toVimSettingOpt(resolver, "vimcompatible")) { + | Some(VimSetting.Int(1)) => maybeDefault + | _ => None + }; + }); + }; + + let vim = (~compatibilityDefault=?, name, converter: VimSetting.t => 'a, resolver) => { + name |> toVimSettingOpt(resolver) |> Option.map(converter) + |> OptionEx.or_(getVimCompatibilitySetting(resolver, compatibilityDefault)) }; let vim2 = diff --git a/src/Core/Config.rei b/src/Core/Config.rei index 46c8e4311b..c04382f151 100644 --- a/src/Core/Config.rei +++ b/src/Core/Config.rei @@ -70,7 +70,10 @@ module Schema: { let custom: (~decode: Json.decoder('a), ~encode: Json.encoder('a)) => codec('a); - let vim: (string, VimSetting.t => 'a) => vimSetting('a); + // [vim(~compatible, settingName, converter)] specifies a vim + // setting. The optional [compatible] value will be used if the + // setting itself is not set, but `set vimcompatible` is active. + let vim: (~compatibilityDefault: 'a=?, string, VimSetting.t => 'a) => vimSetting('a); let vim2: ( string, @@ -90,7 +93,7 @@ module Schema: { let string: codec(string); let list: codec('a) => codec(list('a)); - let vim: (string, VimSetting.t => 'a) => vimSetting('a); + let vim: (~compatibilityDefault: 'a=?, string, VimSetting.t => 'a) => vimSetting('a); let vim2: ( string, diff --git a/src/Feature/Layout/Configuration.re b/src/Feature/Layout/Configuration.re index f2c697015f..9194e36f63 100644 --- a/src/Feature/Layout/Configuration.re +++ b/src/Feature/Layout/Configuration.re @@ -48,14 +48,42 @@ module Codec: { ); }; +module VimSettings = { + open Config.Schema; + open VimSetting.Schema; + + let singleTabMode = + vim( + "__singletabmode", // We don't have a vim setting for this, today. + ~compatibilityDefault=true, + _setting => + false + ); + + let layoutTabPosition = + vim( + "__layouttabposition", // No vim setting for this, either... + ~compatibilityDefault=`top, + _setting => + `top + ); +}; + let showLayoutTabs = setting("oni.layout.showLayoutTabs", Codec.showLayoutTabs, ~default=`smart); let layoutTabPosition = setting( + ~vim=VimSettings.layoutTabPosition, "oni.layout.layoutTabPosition", Codec.layoutTabPosition, ~default=`bottom, ); -let singleTabMode = setting("oni.layout.singleTabMode", bool, ~default=false); +let singleTabMode = + setting( + ~vim=VimSettings.singleTabMode, + "oni.layout.singleTabMode", + bool, + ~default=false, + ); From bb7eeaffe24e15258bd3733d80dea7d8a99f73df Mon Sep 17 00:00:00 2001 From: Bryan Phelps Date: Wed, 2 Sep 2020 08:05:14 -0700 Subject: [PATCH 2/2] Initial implementation of 'set vimcompatible --- src/Core/Config.re | 28 +++++++++++++++-------- src/Core/Config.rei | 8 +++++-- src/Feature/Editor/EditorConfiguration.re | 4 ++-- src/Feature/Layout/Configuration.re | 1 - 4 files changed, 27 insertions(+), 14 deletions(-) diff --git a/src/Core/Config.re b/src/Core/Config.re index 426afd0f25..b9d4dac282 100644 --- a/src/Core/Config.re +++ b/src/Core/Config.re @@ -150,17 +150,27 @@ module Schema = { let getVimCompatibilitySetting = (resolver, maybeDefault) => { maybeDefault - |> OptionEx.flatMap((default) => { - switch (toVimSettingOpt(resolver, "vimcompatible")) { - | Some(VimSetting.Int(1)) => maybeDefault - | _ => None - }; - }); + |> OptionEx.flatMap(default => { + switch (toVimSettingOpt(resolver, "vimcompatible")) { + | Some(VimSetting.Int(1)) => Some(default) + | _ => None + } + }); }; - let vim = (~compatibilityDefault=?, name, converter: VimSetting.t => 'a, resolver) => { - name |> toVimSettingOpt(resolver) |> Option.map(converter) - |> OptionEx.or_(getVimCompatibilitySetting(resolver, compatibilityDefault)) + let vim = + ( + ~compatibilityDefault=?, + name, + converter: VimSetting.t => 'a, + resolver, + ) => { + name + |> toVimSettingOpt(resolver) + |> Option.map(converter) + |> OptionEx.or_( + getVimCompatibilitySetting(resolver, compatibilityDefault), + ); }; let vim2 = diff --git a/src/Core/Config.rei b/src/Core/Config.rei index c04382f151..f761cbeea2 100644 --- a/src/Core/Config.rei +++ b/src/Core/Config.rei @@ -73,7 +73,9 @@ module Schema: { // [vim(~compatible, settingName, converter)] specifies a vim // setting. The optional [compatible] value will be used if the // setting itself is not set, but `set vimcompatible` is active. - let vim: (~compatibilityDefault: 'a=?, string, VimSetting.t => 'a) => vimSetting('a); + let vim: + (~compatibilityDefault: 'a=?, string, VimSetting.t => 'a) => + vimSetting('a); let vim2: ( string, @@ -93,7 +95,9 @@ module Schema: { let string: codec(string); let list: codec('a) => codec(list('a)); - let vim: (~compatibilityDefault: 'a=?, string, VimSetting.t => 'a) => vimSetting('a); + let vim: + (~compatibilityDefault: 'a=?, string, VimSetting.t => 'a) => + vimSetting('a); let vim2: ( string, diff --git a/src/Feature/Editor/EditorConfiguration.re b/src/Feature/Editor/EditorConfiguration.re index fbd864759e..094f6190a1 100644 --- a/src/Feature/Editor/EditorConfiguration.re +++ b/src/Feature/Editor/EditorConfiguration.re @@ -83,14 +83,14 @@ module CustomDecoders: { module VimSettings = { open VimSetting.Schema; let smoothScroll = - vim("smoothscroll", scrollSetting => { + vim("smoothscroll", ~compatibilityDefault=false, scrollSetting => { scrollSetting |> VimSetting.decode_value_opt(bool) |> Option.value(~default=false) }); let minimap = - vim("minimap", scrollSetting => { + vim("minimap", ~compatibilityDefault=false, scrollSetting => { scrollSetting |> VimSetting.decode_value_opt(bool) |> Option.value(~default=false) diff --git a/src/Feature/Layout/Configuration.re b/src/Feature/Layout/Configuration.re index 9194e36f63..483233300a 100644 --- a/src/Feature/Layout/Configuration.re +++ b/src/Feature/Layout/Configuration.re @@ -50,7 +50,6 @@ module Codec: { module VimSettings = { open Config.Schema; - open VimSetting.Schema; let singleTabMode = vim(