diff --git a/README.md b/README.md
index 65d6a7a..961bb1d 100644
--- a/README.md
+++ b/README.md
@@ -58,6 +58,9 @@ use {
 ```
 
 ## Usage and customization
+Lualine can be configured with both lua and vimscript.
+Click [here](#lua-config-example) if you want to see a config example in lua and [here](#vimscript-config-example) if you want to see a config example in vimscript.
+
 Lualine has sections as shown below.
 
 ```
@@ -69,8 +72,6 @@ Lualine has sections as shown below.
 Each sections holds it's components e.g. current vim's mode.
 Colorscheme of sections is mirrored, meaning section `A` will have the same colorscheme as section `Z` etc.
 
-Configuration is currently limited to lua, please use lua block or a separate lua file to configure lualine.
-
 ### Starting lualine
 ```lua
 local lualine = require('lualine')
@@ -265,7 +266,7 @@ lualine.sections.lualine_b = {
     format = function(name)
       -- Capitalize first charecter of filename to capital.
       local path, fname = name:match('(.*/)(.*)')
-				if not path then path = ''; fname = name end
+        if not path then path = ''; fname = name end
         return path .. fname:sub(1, 1):upper() .. fname:sub(2, #fname)
     end
   }
@@ -284,7 +285,7 @@ lualine.extensions = { 'fzf' }
 
 All available extensions are listed in [EXTENSIONS.md](./EXTENSIONS.md)
 
-### Full config example using [packer.nvim](https://github.com/wbthomason/packer.nvim)
+### Lua config example
 
 <details>
 <summary><b>packer config</b></summary>
@@ -294,69 +295,68 @@ All available extensions are listed in [EXTENSIONS.md](./EXTENSIONS.md)
     'hoob3rt/lualine.nvim',
     requires = {'kyazdani42/nvim-web-devicons', opt = true},
     config = function()
-      local lualine = require('lualine')
-      lualine.options = {
-        theme = 'gruvbox',
-        section_separators = {'', ''},
-        component_separators = {'', ''},
-        icons_enabled = true,
+      require('lualine').status{
+        options = {
+          theme = 'gruvbox',
+          section_separators = {'', ''},
+          component_separators = {'', ''},
+          icons_enabled = true,
+        },
+        sections = {
+          lualine_a = { {'mode', upper = true} },
+          lualine_b = { {'branch', icon = ''} },
+          lualine_c = { {'filename', file_status = true} },
+          lualine_x = { 'encoding', 'fileformat', 'filetype' },
+          lualine_y = { 'progress' },
+          lualine_z = { 'location'  },
+        },
+        inactive_sections = {
+          lualine_a = {  },
+          lualine_b = {  },
+          lualine_c = { 'filename' },
+          lualine_x = { 'location' },
+          lualine_y = {  },
+          lualine_z = {   }
+        },
+        extensions = { 'fzf' }
       }
-      lualine.sections = {
-        lualine_a = { 'mode' },
-        lualine_b = { 'branch' },
-        lualine_c = { 'filename' },
-        lualine_x = { 'encoding', 'fileformat', 'filetype' },
-        lualine_y = { 'progress' },
-        lualine_z = { 'location'  },
-      }
-      lualine.inactive_sections = {
-        lualine_a = {  },
-        lualine_b = {  },
-        lualine_c = { 'filename' },
-        lualine_x = { 'location' },
-        lualine_y = {  },
-        lualine_z = {   }
-      }
-      lualine.extensions = { 'fzf' }
-      lualine.status()
     end
   }
 ```
 
 </details>
 
-### Full config example inside `.vimrc`/`init.vim`
+### Vimscript config example
 
 <details>
 <summary><b>vimrc config</b></summary>
 
 ```vim
-lua << EOF
-local lualine = require('lualine')
-    lualine.options = {
-      theme = 'gruvbox',
-      section_separators = {'', ''},
-      component_separators = {'', ''},
-      icons_enabled = true,
-    }
-    lualine.sections = {
-      lualine_a = { 'mode' },
-      lualine_b = { 'branch' },
-      lualine_c = { 'filename' },
-      lualine_x = { 'encoding', 'fileformat', 'filetype' },
-      lualine_y = { 'progress' },
-      lualine_z = { 'location'  },
-    }
-    lualine.inactive_sections = {
-      lualine_a = {  },
-      lualine_b = {  },
-      lualine_c = { 'filename' },
-      lualine_x = { 'location' },
-      lualine_y = {  },
-      lualine_z = {   }
-    }
-    lualine.extensions = { 'fzf' }
-    lualine.status()
-EOF
+let g:lualine = {
+    \'options' : {
+    \  'theme' : 'gruvbox',
+    \  'section_separators' : ['', ''],
+    \  'component_separators' : ['', ''],
+    \  'icons_enabled' : v:true,
+    \},
+    \'sections' : {
+    \  'lualine_a' : [ ['mode', {'upper': v:true,},], ],
+    \  'lualine_b' : [ ['branch', {'icon': '',}, ], ],
+    \  'lualine_c' : [ ['filename', {'file_status': v:true,},], ],
+    \  'lualine_x' : [ 'encoding', 'fileformat', 'filetype' ],
+    \  'lualine_y' : [ 'progress' ],
+    \  'lualine_z' : [ 'location'  ],
+    \},
+    \'inactive_sections' : {
+    \  'lualine_a' : [  ],
+    \  'lualine_b' : [  ],
+    \  'lualine_c' : [ 'filename' ],
+    \  'lualine_x' : [ 'location' ],
+    \  'lualine_y' : [  ],
+    \  'lualine_z' : [  ],
+    \},
+    \'extensions' : [ 'fzf' ],
+    \}
+lua require("lualine").status()
 ```
 </details>
diff --git a/doc/lualine.txt b/doc/lualine.txt
index 5075dab..c615d1b 100644
--- a/doc/lualine.txt
+++ b/doc/lualine.txt
@@ -1,5 +1,5 @@
 *lualine.txt*                A blazing fast and easy to configure statusline
-						      *lualine_nvim*   *lualine*
+                                                      *lualine_nvim*   *lualine*
 
 Author: hoob3rt (https://github.com/hoob3rt)
 License: MIT License
@@ -38,14 +38,14 @@ CONTENTS                                                     *lualine_contents*
         1.3.5. Building Custom components............|lualine_custom_components|
         1.3.6. Custom options...........................|lualine_custom_options|
         1.3.7. Loading plugin extensions.....|lualine_loading_plugin_extensions|
-	1.3.8  Config examples.........................|lualine_config_examples|
-	    1.3.8.1. Packer.nvim......|lualine_config_example_using_packer.nvim|
+        1.3.8  Config examples.........................|lualine_config_examples|
+            1.3.8.1. Packer.nvim......|lualine_config_example_using_packer.nvim|
             1.3.8.2 VIML example.......|lualine_full_config_example_inside_viml|
     1.4. Contributing.....................................|lualine_contributing|
     1.5. Screenshots.......................................|lualine_screenshots|
 
 ================================================================================
-PERFORMANCE COMPARISM	 			 *lualine_performance_comparism*
+PERFORMANCE COMPARISM                            *lualine_performance_comparism*
 
 Unlike other statusline plugins lualine loads only defined components, nothing else.
 
@@ -62,7 +62,7 @@ installed
 --------------------------------------------------------------------------------
 INSTALLATION                                              *lualine_installation*
 
-VIM-PLUG					 	      *lualine_vim-plug*
+VIM-PLUG                                                      *lualine_vim-plug*
 >
     Plug 'hoob3rt/lualine.nvim'
     " If you want to have icons in your statusline choose one of these
@@ -70,7 +70,7 @@ VIM-PLUG					 	      *lualine_vim-plug*
     Plug 'ryanoasis/vim-devicons'
 <
 
-PACKER.NVIM			                           *lualine_packer.nvim*
+PACKER.NVIM                                                *lualine_packer.nvim*
 >
     use {
       'hoob3rt/lualine.nvim',
@@ -111,7 +111,7 @@ All available themes are listed in THEMES.md (./THEMES.md)
 Please create a pr if you managed to port a popular theme before me, here is
 how to do it (./CONTRIBUTING.md).
 
-CHANGING SEPARATOR IN SECTION			    *lualine_changing_separator*
+CHANGING SEPARATOR IN SECTION                       *lualine_changing_separator*
 
 Lualine defines two kinds of seperators. One is for sections and other is
 for components. Default section seperators are '', '' and component
@@ -157,10 +157,10 @@ Lualine defaults~
 Available components~
 
     general~
-	*   branch (git branch)
-	*   diagnostics (diagnostics count from your prefered source)
-	*   encoding (file encoding)
-	*   fileformat (file format)
+        *   branch (git branch)
+        *   diagnostics (diagnostics count from your prefered source)
+        *   encoding (file encoding)
+        *   fileformat (file format)
         *   filename
         *   filetype
         *   location (location in file in line:column format)
@@ -170,7 +170,7 @@ Available components~
 
 
 --------------------------------------------------------------------------------
-BUILDING YOUR COMPONENTS			   *lualine_custom_components*
+BUILDING YOUR COMPONENTS                           *lualine_custom_components*
 
 
 Using custom functions as lualine component~
@@ -301,13 +301,13 @@ List of options are given below.
       changes diagnostic's symbol characters. You can set one or more symbols
       for each level.
       >
-	  {
-	    'diagnostics',
-	    symbols = {
-	      -- set the error symbol and use defaults for warn and info.
-	      error = '!!',
-	    },
-	  }
+          {
+            'diagnostics',
+            symbols = {
+              -- set the error symbol and use defaults for warn and info.
+              error = '!!',
+            },
+          }
 <
 
   • filename~
@@ -371,7 +371,7 @@ Example:~
       format = function(name)
         -- Capitalize first charecter of filename to capital.
         local path, fname = name:match('(.*/)(.*)')
-	if not path then path = ''; fname = name end
+        if not path then path = ''; fname = name end
         return path .. fname:sub(1, 1):upper() .. fname:sub(2, #fname)
       end
     }
@@ -393,7 +393,7 @@ using a plugin which is supported you can load it this way:
 All available extensions are listed in EXTENSIONS.md (./EXTENSIONS.md)
 
 --------------------------------------------------------------------------------
-CONGIG EXAMPLES				   	       *lualine_config_examples*
+CONGIG EXAMPLES                                        *lualine_config_examples*
 
 FULL CONFIG EXAMPLE USING PACKER.NVIM *lualine_config_example_using_packer.nvim*
 
@@ -404,31 +404,31 @@ packer config
         'hoob3rt/lualine.nvim',
         requires = {'kyazdani42/nvim-web-devicons', opt = true},
         config = function()
-          local lualine = require('lualine')
-	  lualine.options = {
-	    theme = 'gruvbox',
-	    section_separators = {'', ''},
-	    component_separators = {'', ''},
-	    icons_enabled = true,
-	  }
-          lualine.sections = {
-            lualine_a = { 'mode' },
-            lualine_b = { 'branch' },
-            lualine_c = { 'filename' },
-            lualine_x = { 'encoding', 'fileformat', 'filetype' },
-            lualine_y = { 'progress' },
-            lualine_z = { 'location'  },
+        require('lualine').status{
+            options = {
+              theme = 'gruvbox',
+              section_separators = {'', ''},
+              component_separators = {'', ''},
+              icons_enabled = true,
+            },
+            sections = {
+              lualine_a = { {'mode', upper = true} },
+              lualine_b = { {'branch', icon = ''} },
+              lualine_c = { {'filename', file_status = true} },
+              lualine_x = { 'encoding', 'fileformat', 'filetype' },
+              lualine_y = { 'progress' },
+              lualine_z = { 'location'  },
+            },
+            inactive_sections = {
+              lualine_a = {  },
+              lualine_b = {  },
+              lualine_c = { 'filename' },
+              lualine_x = { 'location' },
+              lualine_y = {  },
+              lualine_z = {   }
+            },
+            extensions = { 'fzf' }
           }
-          lualine.inactive_sections = {
-            lualine_a = {  },
-            lualine_b = {  },
-            lualine_c = { 'filename' },
-            lualine_x = { 'location' },
-            lualine_y = {  },
-            lualine_z = {   }
-          }
-          lualine.extensions = { 'fzf' }
-          lualine.status()
         end
       }
 <
@@ -440,33 +440,32 @@ FULL CONFIG EXAMPLE INSIDE VIML        *lualine_full_config_example_inside_viml*
 
 vimrc config
 >
-    lua << EOF
-    local lualine = require('lualine')
-        lualine.options = {
-          theme = 'gruvbox',
-	    section_separators = {'', ''},
-	    component_separators = {'', ''},
-	    icons_enabled = true,
-	  }
-        lualine.sections = {
-          lualine_a = { 'mode' },
-          lualine_b = { 'branch' },
-          lualine_c = { 'filename' },
-          lualine_x = { 'encoding', 'fileformat', 'filetype' },
-          lualine_y = { 'progress' },
-          lualine_z = { 'location'  },
-        }
-        lualine.inactive_sections = {
-          lualine_a = {  },
-          lualine_b = {  },
-          lualine_c = { 'filename' },
-          lualine_x = { 'location' },
-          lualine_y = {  },
-          lualine_z = {   }
-        }
-        lualine.extensions = { 'fzf' }
-        lualine.status()
-    EOF
+    let g:lualine = {
+	\'options' : {
+	\  'theme' : 'gruvbox',
+	\  'section_separators' : ['', ''],
+	\  'component_separators' : ['', ''],
+	\  'icons_enabled' : v:true,
+	\},
+	\'sections' : {
+	\  'lualine_a' : [ ['mode', {'upper': v:true,},], ],
+	\  'lualine_b' : [ ['branch', {'icon': '',}, ], ],
+	\  'lualine_c' : [ ['filename', {'file_status': v:true,},], ],
+	\  'lualine_x' : [ 'encoding', 'fileformat', 'filetype' ],
+	\  'lualine_y' : [ 'progress' ],
+	\  'lualine_z' : [ 'location'  ],
+	\},
+	\'inactive_sections' : {
+	\  'lualine_a' : [  ],
+	\  'lualine_b' : [  ],
+	\  'lualine_c' : [ 'filename' ],
+	\  'lualine_x' : [ 'location' ],
+	\  'lualine_y' : [  ],
+	\  'lualine_z' : [  ],
+	\},
+	\'extensions' : [ 'fzf' ],
+	\}
+    lua require("lualine").status()
 <
 
 --------------------------------------------------------------------------------
diff --git a/lua/lualine.lua b/lua/lualine.lua
index dfa4d16..3f73257 100644
--- a/lua/lualine.lua
+++ b/lua/lualine.lua
@@ -35,8 +35,33 @@ M.inactive_sections = {
   lualine_z = {  }
 }
 
-M.extensions = {
-}
+M.extensions = { }
+
+local function apply_configuration(config_table)
+  if not config_table then return end
+  local function parse_sections(section_group_name)
+    if not config_table[section_group_name] then return end
+    for section_name, section in pairs(config_table[section_group_name]) do
+      M[section_group_name][section_name] = config_table[section_group_name][section_name]
+      if type(section) == 'table' then
+        for _, component in pairs(section) do
+          if type(component) == 'table' and type(component[2]) == 'table' then
+            local options = component[2]
+            component[2] = nil
+            for key, val in pairs(options) do
+              component[key] = val
+            end
+          end
+        end
+      end
+    end
+  end
+  parse_sections('options')
+  parse_sections('sections')
+  parse_sections('inactive_sections')
+  if config_table.extensions then M.extensions = config_table.extensions end
+end
+
 
 local function check_single_separator()
   local compoennt_separator = M.options.component_separators
@@ -271,7 +296,9 @@ local function exec_autocommands()
   ]], false)
 end
 
-function M.status()
+function M.status(config)
+  apply_configuration(vim.g.lualine)
+  apply_configuration(config)
   check_single_separator()
   lualine_set_theme()
   exec_autocommands()
diff --git a/lua/lualine/highlight.lua b/lua/lualine/highlight.lua
index b21a1a1..5fa8f91 100644
--- a/lua/lualine/highlight.lua
+++ b/lua/lualine/highlight.lua
@@ -142,7 +142,7 @@ end
 -- @param left_section_data :(string) section before separator
 -- @param right_section_data:(string) section after separator
 -- @param reverse      :(string) Whether it's a left separator or right separator
---		'▶️' and '◀️' needs reverse colors so this parameter needs to be set true.
+--    '▶️' and '◀️' needs reverse colors so this parameter needs to be set true.
 -- @return: (string) formated highlight group name
 function M.get_transitional_highlights(left_section_data, right_section_data, reverse )
   local left_highlight_name, right_highlight_name
@@ -168,16 +168,16 @@ function M.get_transitional_highlights(left_section_data, right_section_data, re
       right_highlight_name = 'lualine_c_normal'
     end
   end
-	-- When both left and right highlights are same nothing to transition to
+  -- When both left and right highlights are same nothing to transition to
   if left_highlight_name == right_highlight_name then return end
 
-	-- construct the name of hightlight group
+  -- construct the name of hightlight group
   local highlight_name
-	if left_highlight_name:find('lualine_') == 1 then
-		highlight_name = left_highlight_name .. '_to_' .. right_highlight_name
-	else
-		highlight_name = 'lualine_' .. left_highlight_name .. '_to_' .. right_highlight_name
-	end
+  if left_highlight_name:find('lualine_') == 1 then
+    highlight_name = left_highlight_name .. '_to_' .. right_highlight_name
+  else
+    highlight_name = 'lualine_' .. left_highlight_name .. '_to_' .. right_highlight_name
+  end
 
   if not utils.highlight_exists(highlight_name) then
     -- Create the highlight_group if needed
@@ -188,12 +188,12 @@ function M.get_transitional_highlights(left_section_data, right_section_data, re
       local bg = utils.extract_highlight_colors(right_highlight_name, 'guibg')
       if not fg then fg = 'none' end
       if not bg then bg = 'none' end
-			-- swap the bg and fg when reverse is true. As in that case highlight will
-			-- be placed before section
-			if reverse then fg, bg = bg, fg end
+      -- swap the bg and fg when reverse is true. As in that case highlight will
+      -- be placed before section
+      if reverse then fg, bg = bg, fg end
       highlight(highlight_name, fg, bg)
     end
-		-- Create highlights and setup to survive colorscheme changes
+    -- Create highlights and setup to survive colorscheme changes
     set_transitional_highlights()
     utils.expand_set_theme(set_transitional_highlights)
   end