IT'S ALIVE!

master
blallo 2021-09-06 23:34:51 +02:00
commit 56cb5b3c25
Signed by: blallo
GPG Key ID: 0CBE577C9B72DC3F
8 changed files with 554 additions and 0 deletions

20
README.md 100644
View File

@ -0,0 +1,20 @@
# neovim on archlinux
Install neovim and some useful packages
```
pikaur -Sy neovim-bin python-pynvim python-neovim nodejs-neovim
```
Install `packer.nvim`:
```
git clone --depth 1 https://github.com/wbthomason/packer.nvim\
~/.local/share/nvim/site/pack/packer/start/packer.nvim
```
Install language servers:
```
pikaur -Sy community/python-lsp-server
```

155
init.lua 100644
View File

@ -0,0 +1,155 @@
-- Blallo neovim configuration
local g = vim.g
local cmd = vim.cmd
local o, wo, bo = vim.o, vim.wo, vim.bo
local utils = require 'config.utils'
local opt = utils.opt
local autocmd = utils.autocmd
local map = utils.map
local let = utils.let
local tilde = os.getenv('HOME')
-- Copied from https://medium.com/geekculture/neovim-configuration-for-beginners-b2116dbbde84
opt('compatible', false)
opt('showmatch', true)
opt('ignorecase', true)
opt('hlsearch', true)
opt('incsearch', true)
opt('tabstop', 4)
opt('softtabstop', 4)
opt('expandtab', true)
opt('shiftwidth', 4)
opt('textwidth', 0)
opt('autoindent', true)
opt('number', true)
opt('wildmode', 'longest,list')
opt('cc', '88')
cmd [[filetype plugin indent on]]
opt('smartindent', true, buffer)
cmd [[syntax on]]
opt('clipboard', 'unnamedplus')
cmd [[filetype plugin on]]
opt('cursorline', true)
opt('ttyfast', true)
opt('hidden', true)
opt('termguicolors', true)
opt('autoread', true)
-- opt('mouse', v)
-- opt('mouse', a)
-- opt('spell', true)
-- Configure swap
opt('swapfile', true)
opt('directory', tilde .. '/.cache/nvim/swap')
-- Configure backup
opt('backupdir', tilde .. '/.cache/nvim/backup')
-- Configure undo
opt('undofile', true)
opt('undodir', tilde .. '/.cache/nvim/undo')
opt('undolevels', 1000)
opt('undoreload', 100000)
-- cmd([[set listchars=tab:\ ,trail:•,extends:#,nbsp:.•]])
cmd([[
set showbreak=\
set listchars=tab:\ ,eol:,nbsp:,trail:,extends:,precedes:
]])
cmd([[
augroup packer_user_config
autocmd!
autocmd BufWritePost plugins.lua source <afile> | PackerCompile
augroup end
]])
cmd [[command! WhatHighlight :call util#syntax_stack()]]
cmd [[command! PackerInstall packadd packer.nvim | lua require('plugins').install()]]
cmd [[command! PackerUpdate packadd packer.nvim | lua require('plugins').update()]]
cmd [[command! PackerSync packadd packer.nvim | lua require('plugins').sync()]]
cmd [[command! PackerClean packadd packer.nvim | lua require('plugins').clean()]]
cmd [[command! PackerCompile packadd packer.nvim | lua require('plugins').compile()]]
-- Colortheme
require('config.theme')
-- Treesitter configuration
require('config.treesitter')
-- LSP configuration
require('config.lspconfig')
-- Keybinds
let(nil, 'mapleader', ',')
Mapper = require("nvim-mapper")
local map = Mapper.map
-- - Telescope-related
local opts = {noremap = true, silent = true}
map('n', '<Leader>ff', '<cmd>Telescope find_files<cr>', opts, "Telescope", "find_files", "Find files from current position")
map('n', '<Leader>fg', '<cmd>Telescope git_files<cr>', opts, "Telescope", "git_files", "Find git-tracked files")
map('n', '<Leader>fb', '<cmd>Telescope buffers<cr>', opts, "Telescope", "buffers", "Search in current opened buffers")
map('n', '<Leader>fc', '<cmd>Telescope grep_string<cr>', opts, "Telescope", "grep_string", "Search string from current position")
map('n', '<Leader>fr', '<cmd>Telescope live_grep<cr>', opts, "Telescope", "live_grep", "Search string in real time")
map('n', '<Leader>fR', '<cmd>Telescope live_grep grep_open_files=true<cr>', opts, "Telescope", "live_grep_open_buffers", "Search string in real time (only on the open buffers)")
map('n', '<Leader>ft', '<cmd>Telescope treesitter<cr>', opts, "Telescope", "treesitter", "Explore treesitter")
map('n', '<Leader>fC', '<cmd>Telescope git_bcommits<cr>', opts, "Telescope", "git_bcommits", "Show diff of current buffer")
map('n', '<Leader>fh', '<cmd>Telescope builtin<cr>', opts, "Telescope", "builtin", "Show Telescope builtins")
map('n', '<Leader>lr', '<cmd>Telescope lsp_references<cr>', opts, "Telescope", "lsp_references", "Show references using LSP")
map('n', '<Leader>li', '<cmd>Telescope lsp_implementations<cr>', opts, "Telescope", "lsp_implementations", "Show implementations using LSP")
map('n', '<Leader>ld', '<cmd>Telescope lsp_definitions<cr>', opts, "Telescope", "lsp_definitions", "Show definitions using LSP")
map('n', '<Leader>ls', '<cmd>Telescope lsp_document_symbols<cr>', opts, "Telescope", "lsp_document_symbols", "Show symbols in document using LSP")
-- Undo tree
map('n', '<Leader>u', '<cmd>UndotreeToggle<cr><cmd>UndotreeFocus<cr>', {noremap = true}, "UndoTree", "undo_tree_toggle", "Toggle UndoTree browser")
-- Split maximizer
map('n', '<Leader>mm', '<cmd>MaximizerToggle<cr>', opts, "MaximizerToggle", "maximizer_toggle_n", "Toggle maximal view of current split")
map('v', '<Leader>mm', '<cmd>MaximizerToggle<cr>', opts, "MaximizerToggle", "maximizer_toggle_v", "Toggle maximal view of current split")
-- Split movement and management
map('n', '<C-l>', '<C-w>l', opts, "Movement", "move_right_n", "Move to the split to the right")
map('v', '<C-l>', '<C-w>l', opts, "Movement", "move_right_v", "Move to the split to the right")
map('i', '<C-l>', '<C-w>l', opts, "Movement", "move_right_i", "Move to the split to the right")
map('n', '<C-k>', '<C-w>k', opts, "Movement", "move_up_n", "Move to the upper split")
map('v', '<C-k>', '<C-w>k', opts, "Movement", "move_up_v", "Move to the upper split")
map('i', '<C-k>', '<C-w>k', opts, "Movement", "move_up_i", "Move to the upper split")
map('n', '<C-j>', '<C-w>j', opts, "Movement", "move_down_n", "Move to the lower split")
map('v', '<C-j>', '<C-w>j', opts, "Movement", "move_down_v", "Move to the lower split")
map('i', '<C-j>', '<C-w>j', opts, "Movement", "move_down_i", "Move to the lower split")
map('n', '<C-h>', '<C-w>h', opts, "Movement", "move_left_n", "Move to the split to the left")
map('v', '<C-h>', '<C-w>h', opts, "Movement", "move_left_v", "Move to the split to the left")
map('i', '<C-h>', '<C-w>h', opts, "Movement", "move_left_i", "Move to the split to the left")
map('n', '<C-d>', '<cmd>bd<cr>', opts, "Management", "full_close_n", "Close current split and associated buffer")
map('v', '<C-d>', '<cmd>bd<cr>', opts, "Management", "full_close_v", "Close current split and associated buffer")
map('i', '<C-d>', '<cmd>bd<cr>', opts, "Management", "full_close_i", "Close current split and associated buffer")
map('n', '<Leader><Tab>', '<cmd>bnext<cr>', {}, "Movement", "go_to_next_buf", "Switch to the next buffer")
map('n', '<Leader>\\', '<cmd>bprev<cr>', {}, "Movement", "go_to_prev_buf", "Switch to the previous buffer")
-- Move selection around
cmd ([[
nnoremap <silent> <C-Down> :m .+1<CR>==
nnoremap <silent> <C-Up> :m .-2<CR>==
inoremap <silent> <C-Down> <Esc>:m .+1<CR>==gi
inoremap <silent> <C-Up> <Esc>:m .-2<CR>==gi
vnoremap <silent> <C-Down> :m '>+1<CR>gv=gv
vnoremap <silent> <C-Up> :m '<-2<CR>gv=gv
]])
-- map('n', '<C-Down>', '<cmd>m .+1<CR>==', opts, "MoveText", "move_text_up_n", "")
-- map('n', '<C-Up>', '<cmd>m .-2<CR>==', opts, "MoveText", "move_text_down_n", "")
-- map('i', '<C-Down>', '<Esc><cmd>m .+1<CR>==gi', opts, "MoveText", "move_text_up_i", "")
-- map('i', '<C-Up>', '<Esc><cmd>m .-2<CR>==gi', opts, "MoveText", "move_text_down_i", "")
-- map('v', '<C-Down>', "<cmd>m '>+1<CR>gv=gv", opts, "MoveText", "move_text_up_v", "")
-- map('v', '<C-Up>', "<cmd>m '<-2<CR>gv=gv", opst, "MoveText", "move_text_down_v", "")
-- Clean highlight
map('n', '<leader><esc>', '<cmd>nohls<CR><cmd>call clearmatches()<cr>', opts, "CleanHighlights", "clear_all", "Clear all highlights and matches")

View File

@ -0,0 +1,45 @@
local nvim_lsp = require('lspconfig')
local on_attach = function(client, bufrn)
Mapper = require("nvim-mapper")
local function buf_set_keymap(...) Mapper.map_buf(bufrn, ...) end
local function buf_set_option(...) vim.api.nvim_buf_set_option(bufrn, ...) end
buf_set_option('omnifunc', 'v:lua.vim.lsp.omnifunc')
-- Mappings
local opts = { noremap=true, silent=true }
-- See `:help vim.lsp.*` for documentation on any of the below functions
buf_set_keymap('n', 'gD', '<cmd>lua vim.lsp.buf.declaration()<CR>', opts, "LSP", "declaration", "Go to declaration")
buf_set_keymap('n', 'gd', '<cmd>lua vim.lsp.buf.definition()<CR>', opts, "LSP", "definition", "Go to definition")
buf_set_keymap('n', 'K', '<cmd>lua vim.lsp.buf.hover()<CR>', opts, "LSP", "hover", "Hover")
buf_set_keymap('n', 'gi', '<cmd>lua vim.lsp.buf.implementation()<CR>', opts, "LSP", "implementation", "Go to implementation")
buf_set_keymap('n', '<C-k>', '<cmd>lua vim.lsp.buf.signature_help()<CR>', opts, "LSP", "signature_help", "Show signature help")
buf_set_keymap('n', '<space>wa', '<cmd>lua vim.lsp.buf.add_workspace_folder()<CR>', opts, "LSP", "add_workspace_folder", "Add workspace folder")
buf_set_keymap('n', '<space>wr', '<cmd>lua vim.lsp.buf.remove_workspace_folder()<CR>', opts, "LSP", "remove_workspace_folder", "Remove workspace folder")
buf_set_keymap('n', '<space>wl', '<cmd>lua print(vim.inspect(vim.lsp.buf.list_workspace_folders()))<CR>', opts, "LSP", "list_workspace_folders", "List workspace folder")
buf_set_keymap('n', '<space>D', '<cmd>lua vim.lsp.buf.type_definition()<CR>', opts, "LSP", "type_definition", "Show type definition")
buf_set_keymap('n', '<space>rn', '<cmd>lua vim.lsp.buf.rename()<CR>', opts, "LSP", "rename", "Rename")
buf_set_keymap('n', '<space>ca', '<cmd>lua vim.lsp.buf.code_action()<CR>', opts, "LSP", "code_action", "Show code actions")
buf_set_keymap('n', 'gr', '<cmd>lua vim.lsp.buf.references()<CR>', opts, "LSP", "references", "Show references")
buf_set_keymap('n', '<space>e', '<cmd>lua vim.lsp.diagnostic.show_line_diagnostics()<CR>', opts, "LSP", "show_line_diagnostics", "Show line diagnostic")
buf_set_keymap('n', '[d', '<cmd>lua vim.lsp.diagnostic.goto_prev()<CR>', opts, "LSP", "goto_prev", "Go to previous")
buf_set_keymap('n', ']d', '<cmd>lua vim.lsp.diagnostic.goto_next()<CR>', opts, "LSP", "goto_next", "Go to next")
buf_set_keymap('n', '<space>q', '<cmd>lua vim.lsp.diagnostic.set_loclist()<CR>', opts, "LSP", "set_loclist", "Set loclist")
buf_set_keymap('n', '<space>f', '<cmd>lua vim.lsp.buf.formatting()<CR>', opts, "LSP", "formatting", "Format")
end
-- Launch language servers
local servers = { 'pylsp', 'gopls', 'rls', 'tsserver', 'elixirls', 'dartls', 'denols', 'clangd' }
for _, lsp in ipairs(servers) do
nvim_lsp[lsp].setup {
on_attach = on_attach,
flags = {
debounce_text_changes = 150,
}
}
end
-- Format on save
vim.cmd [[autocmd BufWritePre <buffer> lua vim.lsp.buf.formatting_sync()]]

View File

@ -0,0 +1,23 @@
local cmd = vim.cmd
local utils = require 'config.utils'
local let = utils.let
-- Nortia
-- cmd([[
-- color nortia-nvim
-- let g:nortia_bat_light_theme=1
-- let g:nortia_bat_dark_theme=1
-- ]])
-- require('nortia.theme').tint_bg(0, 0.05)
-- require('nortia.theme').tint_bg(190, 0.1)
-- require('nortia.theme').tint_fg(190, 0.1)
-- require('nortia.theme').tint(190, 0.1)
-- Gruvbox
let('g', 'gruvbox_italic', 1)
let('g', 'gruvbox_transparent_bg', 1)
cmd [[colorscheme gruvbox]]
-- Airline
let('g', 'airline_powerline_fonts ', 1)

View File

@ -0,0 +1,26 @@
require('nvim-treesitter.configs').setup {
highlight = {
enable = true,
custom_captures = {
-- Highlight the @foo.bar capture group with the "Identifier" highlight group.
["foo.bar"] = "Identifier",
},
-- Setting this to true will run `:h syntax` and tree-sitter at the same time.
-- Set this to `true` if you depend on 'syntax' being enabled (like for indentation).
-- Using this option may slow down your editor, and you may see some duplicate highlights.
-- Instead of true it can also be a list of languages
additional_vim_regex_highlighting = false,
},
incremental_selection = {
enable = true,
keymaps = {
init_selection = "gnn",
node_incremental = "grn",
scope_incremental = "grc",
node_decremental = "grm",
},
},
indent = {
enable = true
},
}

View File

@ -0,0 +1,42 @@
local cmd = vim.cmd
local o_s = vim.o
local map_key = vim.api.nvim_set_keymap
local set_g = vim.api.nvim_set_var
local function opt(o, v, scopes)
scopes = scopes or {o_s}
for _, s in ipairs(scopes) do s[o] = v end
end
local function autocmd(group, cmds, clear)
clear = clear == nil and false or clear
if type(cmds) == 'string' then cmds = {cmds} end
cmd('augroup ' .. group)
if clear then cmd [[au!]] end
for _, c in ipairs(cmds) do cmd('autocmd ' .. c) end
cmd [[augroup END]]
end
local function map(modes, lhs, rhs, opts)
opts = opts or {}
opts.noremap = opts.noremap == nil and true or opts.noremap
if type(modes) == 'string' then modes = {modes} end
for _, mode in ipairs(modes) do map_key(mode, lhs, rhs, opts) end
end
local function let(mode, name, value)
local assignment = 'let '
if mode == nil then
assignment = assignment .. name .. ' = '
else
assignment = assignment .. mode .. ':' .. name .. ' = '
end
if type(value) == 'string' then
assignment = assignment .. '"' .. value .. '"'
else
assignment = assignment .. value
end
cmd(assignment)
end
return {opt = opt, autocmd = autocmd, map = map, set_g = set_g, let = let}

76
lua/plugins.lua 100644
View File

@ -0,0 +1,76 @@
local packer = nil
local function init()
if packer == nil then
packer = require 'packer'
packer.init { disable_commands = true }
end
local use = packer.use
packer.reset()
-- Packer can manage itself
use 'wbthomason/packer.nvim'
-- nvim-mapper to explore mappings
use {
"lazytanuki/nvim-mapper",
config = function() require("nvim-mapper").setup{} end,
before = "telescope.nvim"
}
-- telescope.nvim
use {
'nvim-telescope/telescope.nvim',
requires = {{'nvim-lua/popup.nvim'}, {'nvim-lua/plenary.nvim'}},
config = function() require("telescope").load_extension("mapper") end
}
-- Highlight
use {
'nvim-treesitter/nvim-treesitter',
requires = {
'nvim-treesitter/nvim-treesitter-refactor',
'nvim-treesitter/nvim-treesitter-textobjects',
},
run = ':TSUpdate',
}
-- Colortheme
use 'rktjmp/lush.nvim'
use 'alaric/nortia.nvim'
use 'morhetz/gruvbox'
use 'vim-airline/vim-airline'
use 'vim-airline/vim-airline-themes'
-- Coc
use {
'neoclide/coc.nvim',
branch = 'master',
run = 'yarn install --frozen-lockfile',
}
-- Wrapping/delimiters
use 'andymass/vim-matchup'
use 'machakann/vim-sandwich'
-- Undo tree
use 'mbbill/undotree'
-- LSP stuff
use 'neovim/nvim-lspconfig'
-- Split maximizer
use 'szw/vim-maximizer'
-- Auto pair
use 'jiangmiao/auto-pairs'
end
local plugins = setmetatable({}, {
__index = function(_, key)
init()
return packer[key]
end,
})
return plugins

View File

@ -0,0 +1,167 @@
-- Automatically generated packer.nvim plugin loader code
if vim.api.nvim_call_function('has', {'nvim-0.5'}) ~= 1 then
vim.api.nvim_command('echohl WarningMsg | echom "Invalid Neovim version for packer.nvim! | echohl None"')
return
end
vim.api.nvim_command('packadd packer.nvim')
local no_errors, error_msg = pcall(function()
local time
local profile_info
local should_profile = false
if should_profile then
local hrtime = vim.loop.hrtime
profile_info = {}
time = function(chunk, start)
if start then
profile_info[chunk] = hrtime()
else
profile_info[chunk] = (hrtime() - profile_info[chunk]) / 1e6
end
end
else
time = function(chunk, start) end
end
local function save_profiles(threshold)
local sorted_times = {}
for chunk_name, time_taken in pairs(profile_info) do
sorted_times[#sorted_times + 1] = {chunk_name, time_taken}
end
table.sort(sorted_times, function(a, b) return a[2] > b[2] end)
local results = {}
for i, elem in ipairs(sorted_times) do
if not threshold or threshold and elem[2] > threshold then
results[i] = elem[1] .. ' took ' .. elem[2] .. 'ms'
end
end
_G._packer = _G._packer or {}
_G._packer.profile_output = results
end
time([[Luarocks path setup]], true)
local package_path_str = "/home/leo/.cache/nvim/packer_hererocks/2.0.5/share/lua/5.1/?.lua;/home/leo/.cache/nvim/packer_hererocks/2.0.5/share/lua/5.1/?/init.lua;/home/leo/.cache/nvim/packer_hererocks/2.0.5/lib/luarocks/rocks-5.1/?.lua;/home/leo/.cache/nvim/packer_hererocks/2.0.5/lib/luarocks/rocks-5.1/?/init.lua"
local install_cpath_pattern = "/home/leo/.cache/nvim/packer_hererocks/2.0.5/lib/lua/5.1/?.so"
if not string.find(package.path, package_path_str, 1, true) then
package.path = package.path .. ';' .. package_path_str
end
if not string.find(package.cpath, install_cpath_pattern, 1, true) then
package.cpath = package.cpath .. ';' .. install_cpath_pattern
end
time([[Luarocks path setup]], false)
time([[try_loadstring definition]], true)
local function try_loadstring(s, component, name)
local success, result = pcall(loadstring(s))
if not success then
vim.schedule(function()
vim.api.nvim_notify('packer.nvim: Error running ' .. component .. ' for ' .. name .. ': ' .. result, vim.log.levels.ERROR, {})
end)
end
return result
end
time([[try_loadstring definition]], false)
time([[Defining packer_plugins]], true)
_G.packer_plugins = {
["coc.nvim"] = {
loaded = true,
path = "/home/leo/.local/share/nvim/site/pack/packer/start/coc.nvim"
},
gruvbox = {
loaded = true,
path = "/home/leo/.local/share/nvim/site/pack/packer/start/gruvbox"
},
["lush.nvim"] = {
loaded = true,
path = "/home/leo/.local/share/nvim/site/pack/packer/start/lush.nvim"
},
["nortia.nvim"] = {
loaded = true,
path = "/home/leo/.local/share/nvim/site/pack/packer/start/nortia.nvim"
},
["nvim-lspconfig"] = {
loaded = true,
path = "/home/leo/.local/share/nvim/site/pack/packer/start/nvim-lspconfig"
},
["nvim-mapper"] = {
config = { "\27LJ\1\2=\0\0\2\0\3\0\a4\0\0\0%\1\1\0>\0\2\0027\0\2\0002\1\0\0>\0\2\1G\0\1\0\nsetup\16nvim-mapper\frequire\0" },
loaded = true,
path = "/home/leo/.local/share/nvim/site/pack/packer/start/nvim-mapper"
},
["nvim-treesitter"] = {
loaded = true,
path = "/home/leo/.local/share/nvim/site/pack/packer/start/nvim-treesitter"
},
["nvim-treesitter-refactor"] = {
loaded = true,
path = "/home/leo/.local/share/nvim/site/pack/packer/start/nvim-treesitter-refactor"
},
["nvim-treesitter-textobjects"] = {
loaded = true,
path = "/home/leo/.local/share/nvim/site/pack/packer/start/nvim-treesitter-textobjects"
},
["packer.nvim"] = {
loaded = true,
path = "/home/leo/.local/share/nvim/site/pack/packer/start/packer.nvim"
},
["plenary.nvim"] = {
loaded = true,
path = "/home/leo/.local/share/nvim/site/pack/packer/start/plenary.nvim"
},
["popup.nvim"] = {
loaded = true,
path = "/home/leo/.local/share/nvim/site/pack/packer/start/popup.nvim"
},
["telescope.nvim"] = {
config = { "\27LJ\1\2K\0\0\2\0\4\0\a4\0\0\0%\1\1\0>\0\2\0027\0\2\0%\1\3\0>\0\2\1G\0\1\0\vmapper\19load_extension\14telescope\frequire\0" },
loaded = true,
path = "/home/leo/.local/share/nvim/site/pack/packer/start/telescope.nvim"
},
undotree = {
loaded = true,
path = "/home/leo/.local/share/nvim/site/pack/packer/start/undotree"
},
["vim-airline"] = {
loaded = true,
path = "/home/leo/.local/share/nvim/site/pack/packer/start/vim-airline"
},
["vim-airline-themes"] = {
loaded = true,
path = "/home/leo/.local/share/nvim/site/pack/packer/start/vim-airline-themes"
},
["vim-matchup"] = {
loaded = true,
path = "/home/leo/.local/share/nvim/site/pack/packer/start/vim-matchup"
},
["vim-maximizer"] = {
loaded = true,
path = "/home/leo/.local/share/nvim/site/pack/packer/start/vim-maximizer"
},
["vim-sandwich"] = {
loaded = true,
path = "/home/leo/.local/share/nvim/site/pack/packer/start/vim-sandwich"
}
}
time([[Defining packer_plugins]], false)
-- Config for: telescope.nvim
time([[Config for telescope.nvim]], true)
try_loadstring("\27LJ\1\2K\0\0\2\0\4\0\a4\0\0\0%\1\1\0>\0\2\0027\0\2\0%\1\3\0>\0\2\1G\0\1\0\vmapper\19load_extension\14telescope\frequire\0", "config", "telescope.nvim")
time([[Config for telescope.nvim]], false)
-- Config for: nvim-mapper
time([[Config for nvim-mapper]], true)
try_loadstring("\27LJ\1\2=\0\0\2\0\3\0\a4\0\0\0%\1\1\0>\0\2\0027\0\2\0002\1\0\0>\0\2\1G\0\1\0\nsetup\16nvim-mapper\frequire\0", "config", "nvim-mapper")
time([[Config for nvim-mapper]], false)
if should_profile then save_profiles() end
end)
if not no_errors then
vim.api.nvim_command('echohl ErrorMsg | echom "Error in packer_compiled: '..error_msg..'" | echom "Please check your config for correctness" | echohl None')
end