nvim_conf 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (32) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE.txt +21 -0
  3. data/README.md +98 -0
  4. data/bin/nvim_conf +13 -0
  5. data/lib/nvim_conf/compiler_configurations/compiler_configuration.rb +12 -0
  6. data/lib/nvim_conf/compiler_configurations/manager.rb +74 -0
  7. data/lib/nvim_conf/configuration_builder.rb +37 -0
  8. data/lib/nvim_conf/core.rb +56 -0
  9. data/lib/nvim_conf/generators/code/mappings/lua.rb +54 -0
  10. data/lib/nvim_conf/generators/code/mappings/vim.rb +27 -0
  11. data/lib/nvim_conf/generators/code/plugins/packer.rb +76 -0
  12. data/lib/nvim_conf/generators/code/settings/lua.rb +53 -0
  13. data/lib/nvim_conf/generators/code/settings/vim.rb +47 -0
  14. data/lib/nvim_conf/generators/generator.rb +6 -0
  15. data/lib/nvim_conf/manager.rb +6 -0
  16. data/lib/nvim_conf/mappings/manager.rb +58 -0
  17. data/lib/nvim_conf/mappings/mapping.rb +13 -0
  18. data/lib/nvim_conf/plugins/manager.rb +41 -0
  19. data/lib/nvim_conf/plugins/plugin.rb +19 -0
  20. data/lib/nvim_conf/settings/manager.rb +43 -0
  21. data/lib/nvim_conf/settings/setting.rb +14 -0
  22. data/lib/nvim_conf/version.rb +5 -0
  23. data/lib/nvim_conf/writer.rb +87 -0
  24. data/lib/nvim_conf/writers/code/mappings.rb +39 -0
  25. data/lib/nvim_conf/writers/code/orchestrator.rb +55 -0
  26. data/lib/nvim_conf/writers/code/plugins.rb +86 -0
  27. data/lib/nvim_conf/writers/code/settings.rb +38 -0
  28. data/lib/nvim_conf/writers/documentation/mappings.rb +66 -0
  29. data/lib/nvim_conf/writers/documentation/orchestrator.rb +44 -0
  30. data/lib/nvim_conf/writers/documentation/settings.rb +71 -0
  31. data/lib/nvim_conf.rb +33 -0
  32. metadata +77 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: b19da8fe7f4b4cd45d17e7c3d00866a6dbd2fc5d6c690826e3352b69ff227ec3
4
+ data.tar.gz: 13f5ce2072b6a61cf586d660cec6624407e3f6193f61b330fcd3b6779a625132
5
+ SHA512:
6
+ metadata.gz: fdd6c1532042741f60b69f0044d6889b0476c719b471be2c8777f9b20182dc7d7c3c36acdcac33aef109dd433258ed71015f776bac0d9878503b73ceaea0f480
7
+ data.tar.gz: 48580bebf403d43248b5d757a0b14936c376ee3658572da214a5ef967b78a6c68a9da41db028f7de5d4e801837da422689850b1471129e739bd37552732a70e6
data/LICENSE.txt ADDED
@@ -0,0 +1,21 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2021 Liberatys
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in
13
+ all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
+ THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,98 @@
1
+ # NvimConf
2
+
3
+ A configuration manager for neovim that functions as an abstraction between your intentions and your configuration.
4
+ Functions in a way that prevents having to rewrite everything in order to change your plugin manager.
5
+
6
+ ## Usage
7
+
8
+ ```ruby
9
+ NvimConf::Core.define do
10
+ plugins(:packer) do # add some plugins with any available plugin manager
11
+ plug("tpope/vim-fugitive")
12
+ plug("tpope/vim-surround")
13
+ end
14
+
15
+ configuration do # configurate the generation of code and documentation
16
+ output_folder '$HOME/.config/nvim'
17
+ code_output :lua # you want lua? you want vim? NO PROBLEM!
18
+ documented true
19
+ commented
20
+ end
21
+
22
+ settings do # define all your settings
23
+ set "tabstop"
24
+ unset "tabstop"
25
+ end
26
+ end
27
+ ```
28
+
29
+ ### Output
30
+ #### Configuration
31
+
32
+ ```lua
33
+ File: $HOME/.config/nvim/init.lua
34
+
35
+ return require('packer').startup(function()
36
+ use "tpope/vim-fugitive"
37
+ use "tpope/vim-surround"
38
+ end)
39
+
40
+ vim.o.tabstop = true
41
+ vim.o.tabstop = false
42
+ ```
43
+
44
+ #### Documentation
45
+
46
+ ```markdown
47
+ File: $HOME/.config/nvim/Init.md
48
+
49
+ # Configuration Documentation Vim - NvimConf
50
+
51
+
52
+ ## Settings
53
+ - tabstop => true
54
+ - tabstop => false
55
+ ```
56
+ ## Why use NvimConf?
57
+
58
+ Neovim is changing fast! Every other week we can use an new package manager.
59
+
60
+ There is always a better version of your autocomplete plugin.
61
+
62
+ ### **The goals of NvimConf are**
63
+ - Add automatic documentation to your configuration
64
+ - Decouple the configuration from the actual code needed to arrive at the configuration state
65
+ - Don't **version control** the configuration but manage the configuration schema
66
+ - No more file changes due to a change in package manager... just change the one line in your configuration generator
67
+ - Provide reproducible configuration
68
+ - Sharable and copiable configuration that allows everyone to configure their neovim
69
+ - Toolset to embed logic into your compiled configuration.
70
+
71
+ ## Features to come
72
+
73
+ - Generators
74
+ - More plugin managers
75
+ - Auto Completion
76
+ - Linters
77
+ - Configuraton optimization
78
+ - Remove duplicate Plugins
79
+ - Remove overwriting settings
80
+ - Param Checker
81
+ - Validate the settings parameters
82
+ - Check generated settings for functionality
83
+ - Custom embeeded Functions
84
+ - Split Configuraton into multiple files
85
+ - Render optimization by reducing the generation set
86
+ - Comment your configuration automatically
87
+ - Extend documentation generation
88
+ - Add plugin documentation
89
+ - Options for styling / spacing
90
+ - Meta information for your configuration
91
+ - Version
92
+ - Author-Name
93
+ - Generation Date
94
+ - Generation Architecture (Macos / Linux)
95
+
96
+ ## Examples
97
+
98
+ You can find more examples of configurations here: [example folder](./examples)
data/bin/nvim_conf ADDED
@@ -0,0 +1,13 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ require 'bundler/setup'
5
+ require 'nvim_conf'
6
+
7
+ if ARGV[0]
8
+ puts "Running nvim_conf for #{ARGV[0]}"
9
+
10
+ load(Pathname.new(ARGV[0]).expand_path)
11
+ else
12
+ puts 'No file path to run nvim_conf was given'
13
+ end
@@ -0,0 +1,12 @@
1
+ require "dry-initializer"
2
+
3
+ module NvimConf
4
+ module CompilerConfigurations
5
+ class CompilerConfiguration
6
+ extend Dry::Initializer
7
+
8
+ param :name
9
+ param :value
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,74 @@
1
+ require "nvim_conf/compiler_configurations/compiler_configuration"
2
+
3
+ module NvimConf
4
+ module CompilerConfigurations
5
+ class Manager < NvimConf::Manager
6
+ attr_reader :configurations
7
+
8
+ def initialize
9
+ @configurations = []
10
+ end
11
+
12
+ def store?
13
+ @configurations.any?
14
+ end
15
+
16
+ def output_folder(path)
17
+ store_configuration(
18
+ :output_folder,
19
+ path
20
+ )
21
+ end
22
+
23
+ def write(acceptance = true)
24
+ store_configuration(
25
+ :write,
26
+ acceptance
27
+ )
28
+ end
29
+
30
+ def code_output(language)
31
+ store_configuration(
32
+ :code_output,
33
+ language.to_s
34
+ )
35
+ end
36
+
37
+ def mono_file(acceptance = true)
38
+ store_configuration(
39
+ :mono_file,
40
+ acceptance
41
+ )
42
+ end
43
+
44
+ def documented(formats)
45
+ store_configuration(
46
+ :documented,
47
+ formats
48
+ )
49
+ end
50
+
51
+ def commented(acceptance = true)
52
+ store_configuration(
53
+ :commented,
54
+ acceptance
55
+ )
56
+ end
57
+
58
+ private
59
+
60
+ def store_configuration(name, value)
61
+ @configurations << build_configuration(
62
+ name, value
63
+ )
64
+ end
65
+
66
+ def build_configuration(name, value)
67
+ CompilerConfiguration.new(
68
+ name,
69
+ value
70
+ )
71
+ end
72
+ end
73
+ end
74
+ end
@@ -0,0 +1,37 @@
1
+ require "nvim_conf/compiler_configurations/manager"
2
+
3
+ module NvimConf
4
+ class ConfigurationBuilder
5
+ CONFIGURATION_MANAGER = NvimConf::CompilerConfigurations::Manager
6
+
7
+ def initialize(managers)
8
+ @managers = managers
9
+ @configuration = default_configuration
10
+ end
11
+
12
+ def build_configuration
13
+ @managers.select { |manager| manager.instance_of?(CONFIGURATION_MANAGER) }.each do |manager|
14
+ manager.configurations.each do |configuration|
15
+ @configuration[configuration.name] = configuration.value
16
+ end
17
+ end
18
+
19
+ @configuration[:format] ||= @configuration[:schema] == :nvim ? :lua : :vim
20
+ @configuration
21
+ end
22
+
23
+ private
24
+
25
+ def default_configuration
26
+ {
27
+ output_folder: "$HOME/.config/nvim",
28
+ code_output: :lua,
29
+ write: false,
30
+ mono_file: true,
31
+ documented: false,
32
+ commented: true,
33
+ schema: :nvim
34
+ }
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,56 @@
1
+ module NvimConf
2
+ class Core
3
+ def self.define(&block)
4
+ new.instance_eval(&block)
5
+
6
+ NvimConf::Writer.new(
7
+ NvimConf.managers
8
+ ).write
9
+ end
10
+
11
+ def plugins(name, bootstraped: false, &block)
12
+ store_manager(
13
+ evaluate_for_manager(
14
+ Plugins::Manager.new(name, bootstraped: bootstraped),
15
+ &block
16
+ )
17
+ )
18
+ end
19
+
20
+ def settings(&block)
21
+ store_manager(evaluate_for_manager(
22
+ Settings::Manager.new,
23
+ &block
24
+ ))
25
+ end
26
+
27
+ def mappings(namespace = nil, &block)
28
+ store_manager(evaluate_for_manager(
29
+ Mappings::Manager.new(namespace),
30
+ &block
31
+ ))
32
+ end
33
+
34
+ def configuration(&block)
35
+ store_manager(evaluate_for_manager(
36
+ CompilerConfigurations::Manager.new,
37
+ &block
38
+ ))
39
+ end
40
+
41
+ private
42
+
43
+ def evaluate_for_manager(manager, &block)
44
+ manager.instance_eval(&block)
45
+ manager
46
+ end
47
+
48
+ def store_manager(manager)
49
+ return unless manager.store?
50
+
51
+ NvimConf.managers.push(
52
+ manager
53
+ )
54
+ end
55
+ end
56
+ end
@@ -0,0 +1,54 @@
1
+ module NvimConf
2
+ module Generators
3
+ module Mappings
4
+ module Code
5
+ class Lua
6
+ MODE_MAPPING = {
7
+ "map" => "",
8
+ "nmap" => "n",
9
+ "vmap" => "v",
10
+ "smap" => "s",
11
+ "xmap" => "x",
12
+ "omap" => "o",
13
+ "map!" => "!",
14
+ "imap" => "i",
15
+ "lmap" => "l",
16
+ "cmap" => "c",
17
+ "tmap" => "t"
18
+ }
19
+
20
+ BASE_METHOD = "vim.api.nvim_set_keymap"
21
+
22
+ def initialize(mapping)
23
+ @mapping = mapping
24
+ end
25
+
26
+ def generate
27
+ [
28
+ BASE_METHOD,
29
+ "(",
30
+ argument_list,
31
+ ")"
32
+ ].join
33
+ end
34
+
35
+ private
36
+
37
+ def argument_list
38
+ [
39
+ MODE_MAPPING[@mapping.operator.to_s],
40
+ @mapping.binding,
41
+ @mapping.action
42
+ ].map do |value|
43
+ [
44
+ "\'",
45
+ value,
46
+ "\'"
47
+ ].join
48
+ end.join(", ")
49
+ end
50
+ end
51
+ end
52
+ end
53
+ end
54
+ end
@@ -0,0 +1,27 @@
1
+ module NvimConf
2
+ module Generators
3
+ module Mappings
4
+ module Code
5
+ class Vim
6
+ def initialize(mapping)
7
+ @mapping = mapping
8
+ end
9
+
10
+ def generate
11
+ [
12
+ vim_method,
13
+ @mapping.binding,
14
+ @mapping.action
15
+ ].join(" ")
16
+ end
17
+
18
+ private
19
+
20
+ def vim_method
21
+ @mapping.operator.to_s
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,76 @@
1
+ module NvimConf
2
+ module Generators
3
+ module Plugins
4
+ module Code
5
+ class Packer
6
+ COMMAND_PREFIX = :use
7
+
8
+ COMMAND_ALIAS = {
9
+ file_types: :ft
10
+ }
11
+
12
+ def initialize(plugin)
13
+ @plugin = plugin
14
+ end
15
+
16
+ def generate
17
+ generated_call = [
18
+ COMMAND_PREFIX,
19
+ command_call
20
+ ].join(" ")
21
+
22
+ args? ? "{#{generated_call}}" : generated_call
23
+ end
24
+
25
+ private
26
+
27
+ def command_call
28
+ [
29
+ plugin_name,
30
+ *command_arguments
31
+ ].compact.join(", ")
32
+ end
33
+
34
+ def plugin_name
35
+ "'#{@plugin.name}'"
36
+ end
37
+
38
+ def command_arguments
39
+ [
40
+ :as,
41
+ :opt,
42
+ :file_types,
43
+ :branch,
44
+ :run,
45
+ :cmd
46
+ ].map do |argument|
47
+ next if @plugin.send(argument).nil?
48
+
49
+ [
50
+ COMMAND_ALIAS[argument] || argument,
51
+ escape_value(@plugin.send(argument))
52
+ ].join(" = ")
53
+ end.compact
54
+ end
55
+
56
+ def escape_value(value)
57
+ return value unless value.is_a?(String)
58
+
59
+ "'#{value}'"
60
+ end
61
+
62
+ def args?
63
+ [
64
+ @plugin.as,
65
+ @plugin.opt,
66
+ @plugin.branch,
67
+ @plugin.file_types,
68
+ @plugin.cmd,
69
+ @plugin.run
70
+ ].any? { |argument| !argument.nil? }
71
+ end
72
+ end
73
+ end
74
+ end
75
+ end
76
+ end
@@ -0,0 +1,53 @@
1
+ module NvimConf
2
+ module Generators
3
+ module Settings
4
+ module Code
5
+ class Lua
6
+ VIM_PREFIX = :vim
7
+
8
+ SETTING_NAMESPACES = {
9
+ global: "o",
10
+ buffer: "bo"
11
+ }
12
+
13
+ def initialize(setting)
14
+ @setting = setting
15
+ end
16
+
17
+ def generate
18
+ [
19
+ call_signature,
20
+ escaped_value
21
+ ].join(" = ")
22
+ end
23
+
24
+ private
25
+
26
+ def call_signature
27
+ [
28
+ VIM_PREFIX,
29
+ SETTING_NAMESPACES[@setting.scope] || SETTING_NAMESPACES[:global],
30
+ @setting.key
31
+ ].join(".")
32
+ end
33
+
34
+ def escaped_value
35
+ return fallback_to_truthy_on_nil(@setting.value) unless @setting.value.is_a?(String)
36
+
37
+ [
38
+ '"',
39
+ @setting.value,
40
+ '"'
41
+ ].join
42
+ end
43
+
44
+ def fallback_to_truthy_on_nil(value)
45
+ return value unless value.nil?
46
+
47
+ @setting.operation == :set
48
+ end
49
+ end
50
+ end
51
+ end
52
+ end
53
+ end
@@ -0,0 +1,47 @@
1
+ module NvimConf
2
+ module Generators
3
+ module Settings
4
+ module Code
5
+ class Vim
6
+ SET_OPERATION = :set
7
+
8
+ def initialize(setting)
9
+ @setting = setting
10
+ end
11
+
12
+ def generate
13
+ [
14
+ call_identifier,
15
+ escaped_value
16
+ ].compact.join(" = ")
17
+ end
18
+
19
+ private
20
+
21
+ def call_identifier
22
+ [
23
+ SET_OPERATION,
24
+ negated_operator!
25
+ ].join(" ")
26
+ end
27
+
28
+ def negated_operator!
29
+ return @setting.key if @setting.operation == :set
30
+
31
+ "#{@setting.key}!"
32
+ end
33
+
34
+ def escaped_value
35
+ return @setting.value unless @setting.value.is_a?(String)
36
+
37
+ [
38
+ '"',
39
+ @setting.value,
40
+ '"'
41
+ ].join
42
+ end
43
+ end
44
+ end
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,6 @@
1
+ module NvimConf
2
+ module Generators
3
+ class Generator
4
+ end
5
+ end
6
+ end
@@ -0,0 +1,6 @@
1
+ module NvimConf
2
+ class Manager
3
+ def store?
4
+ end
5
+ end
6
+ end
@@ -0,0 +1,58 @@
1
+ require "nvim_conf/mappings/mapping"
2
+ # TODO: Refactor error messages
3
+ module NvimConf
4
+ module Mappings
5
+ class Manager < NvimConf::Manager
6
+ AVAILABLE_METHODS = %w[map map! nmap vmap imap cmap smap xmap omap lmap]
7
+ attr_reader :mappings
8
+
9
+ def initialize(namespace)
10
+ @mappings = []
11
+ @namespace = namespace&.to_s
12
+
13
+ validate!
14
+ end
15
+
16
+ def validate!
17
+ return if @namespace.nil? || @namespace.empty?
18
+
19
+ raise "Invalid namespace given for <mappings>: #{@namespace}" unless AVAILABLE_METHODS.include?(@namespace)
20
+ end
21
+
22
+ def store?
23
+ @mappings.any?
24
+ end
25
+
26
+ AVAILABLE_METHODS.each do |operator|
27
+ define_method(operator) do |binding, action|
28
+ store_mapping(
29
+ operator, binding, action
30
+ )
31
+ end
32
+ end
33
+
34
+ def new(binding, action)
35
+ raise "No namespace was given for <mappings>" unless @namespace
36
+ raise "No namespace was given for <mappings>" if @namespace.empty?
37
+
38
+ store_mapping(
39
+ @namespace, binding, action
40
+ )
41
+ end
42
+
43
+ alias_method :m, :new
44
+
45
+ private
46
+
47
+ def store_mapping(operator, binding, action)
48
+ @mappings << build_mapping(
49
+ operator, binding, action
50
+ )
51
+ end
52
+
53
+ def build_mapping(operator, binding, action)
54
+ Mapping.new(operator, binding, action)
55
+ end
56
+ end
57
+ end
58
+ end
@@ -0,0 +1,13 @@
1
+ require "dry-initializer"
2
+
3
+ module NvimConf
4
+ module Mappings
5
+ class Mapping
6
+ extend Dry::Initializer
7
+
8
+ param :operator
9
+ param :binding
10
+ param :action
11
+ end
12
+ end
13
+ end