adds full ide

This commit is contained in:
waldek 2021-08-31 20:54:52 +02:00
parent cc67b8b00a
commit ab0fe02c69
2 changed files with 507 additions and 15 deletions

View File

@ -0,0 +1,224 @@
" ----------------------------------------------------------------------------
" vundle essentials
" ----------------------------------------------------------------------------
set nocompatible
filetype off
" set the runtime path to include Vundle and initialize
set rtp+=~/.vim/bundle/Vundle.vim
call vundle#begin()
" let vundle manage vundle...
Plugin 'VundleVim/Vundle.vim'
" Basic plugins
Plugin 'jiangmiao/auto-pairs'
Plugin 'preservim/nerdtree'
Plugin 'jeetsukumaran/vim-buffergator'
" IDE like plugins
Plugin 'prabirshrestha/asyncomplete.vim'
Plugin 'prabirshrestha/vim-lsp'
Plugin 'prabirshrestha/asyncomplete-lsp.vim'
Plugin 'mattn/vim-lsp-settings'
Plugin 'yami-beta/asyncomplete-omni.vim'
Plugin 'prabirshrestha/asyncomplete-file.vim'
" Language autocomplete for English
Plugin 'htlsne/asyncomplete-look'
" an additional colorscheme I like
Plugin 'altercation/vim-colors-solarized'
call vundle#end()
filetype plugin indent on
" ----------------------------------------------------------------------------
" basic essentials
" ----------------------------------------------------------------------------
" don't make vim vi compatible (if not set you miss out on a lot of features!)
" you'll see this option set in most configuration files found online
set nocompatible
" enable filetype recognition plus indent and plugin (pretty much mandatory)
filetype plugin indent on " required
" enable syntax highlighting
syntax on
" backspace can be a tricky thing and this setting make it work a lot better
set backspace=indent,eol,start
" when tab completing on the expert line you don't want to miss out on EDIT vs
" edit or nerdtree vs NERDTree and this setting ignores case completely
set ignorecase
" highlight your search patterns (very handy when building regexes)
set hlsearch
" highlight the search pattern as-you-go (tremendously helpful when
" constructing regexes)
set incsearch
" always show a status line at the bottom of your vim which shows some basic
" information about the file, which line you're at etc
set laststatus=2
" show files in statusbar when opening via expert mode
set wildmenu
" also show all possible expert mode commands in the statusline
set wildmode=full
" reverse numbering (in the sideline) so you don't have to manually count how
" many lines you have to yank
set rnu
" it's also nice to still have your absolute line number in the sideline
set nu
" can do copy paste from the clipboard
set clipboard=unnamedplus
" automatically save buffers
set autowrite
set autowriteall
" spaces not tabs for coding purposes
set sw=4
set ts=4
set sts=4
" mouse usage can be handy, especially when using LspPeekDefinition
set mouse=a
" enable code folding
set foldmethod=indent
" set SPACE to toggle a fold
nnoremap <SPACE> za
" set the leader key for shortcuts (uncomment if you don't want it to be the
" default \ key
"let mapleader=";"
" ----------------------------------------------------------------------------
" plugin configuration
" ----------------------------------------------------------------------------
" NERDTree
" --------
" map a keyboard shortcut to show and hide NERDTree
nnoremap <C-t> :NERDTreeToggle<CR>
" Exit Vim if NERDTree is the only window remaining in the only tab.
autocmd BufEnter * if tabpagenr('$') == 1 && winnr('$') == 1 && exists('b:NERDTree') && b:NERDTree.isTabTree() | quit | endif
" vim-lsp
" -------
" general vim-lsp settings
" ------------------------
" maps quite q few keyboad shortcuts
" this is taken staight off the github page with one added shortcut to peak at
" the definition of a function or class
function! s:on_lsp_buffer_enabled() abort
setlocal omnifunc=lsp#complete
setlocal signcolumn=yes
if exists('+tagfunc') | setlocal tagfunc=lsp#tagfunc | endif
nmap <buffer> gd <plug>(lsp-definition)
nmap <buffer> gpd <plug>(lsp-peek-definition)
nmap <buffer> gs <plug>(lsp-document-symbol-search)
nmap <buffer> gS <plug>(lsp-workspace-symbol-search)
nmap <buffer> gr <plug>(lsp-references)
nmap <buffer> gi <plug>(lsp-implementation)
nmap <buffer> gt <plug>(lsp-type-definition)
nmap <buffer> <leader>rn <plug>(lsp-rename)
nmap <buffer> [g <plug>(lsp-previous-diagnostic)
nmap <buffer> ]g <plug>(lsp-next-diagnostic)
nmap <buffer> K <plug>(lsp-hover)
inoremap <buffer> <expr><c-f> lsp#scroll(+4)
inoremap <buffer> <expr><c-d> lsp#scroll(-4)
let g:lsp_format_sync_timeout = 2000
autocmd! BufWritePre *.rs,*.go call execute('LspDocumentFormatSync')
endfunction
augroup lsp_install
au!
" call s:on_lsp_buffer_enabled only for languages that has the server registered.
autocmd User lsp_buffer_enabled call s:on_lsp_buffer_enabled()
augroup END
" asyncomplete
" ------------
" make tab complete work
inoremap <expr> <Tab> pumvisible() ? "\<C-n>" : "\<Tab>"
inoremap <expr> <S-Tab> pumvisible() ? "\<C-p>" : "\<S-Tab>"
inoremap <expr> <cr> pumvisible() ? asyncomplete#close_popup() : "\<cr>"
" force refresh with CTRL-SPACE
imap <c-@> <Plug>(asyncomplete_force_refresh)
" asyncomplete-file
" -----------------
au User asyncomplete_setup call asyncomplete#register_source(asyncomplete#sources#file#get_source_options({
\ 'name': 'file',
\ 'allowlist': ['*'],
\ 'priority': 10,
\ 'completor': function('asyncomplete#sources#file#completor')
\ }))
" asyncomplete-omni
" -----------------
autocmd User asyncomplete_setup call asyncomplete#register_source(asyncomplete#sources#omni#get_source_options({
\ 'name': 'omni',
\ 'allowlist': ['*'],
\ 'blocklist': ['c', 'cpp', 'html'],
\ 'completor': function('asyncomplete#sources#omni#completor'),
\ 'config': {
\ 'show_source_kind': 1,
\ },
\ }))
" asyncomplete-look
" -----------------
au User asyncomplete_setup call asyncomplete#register_source({
\ 'name': 'look',
\ 'allowlist': ['text', 'markdown'],
\ 'completor': function('asyncomplete#sources#look#completor'),
\ })
" ----------------------------------------------------------------------------
" visual configuration
" ----------------------------------------------------------------------------
" set a colorscheme
colorscheme solarized
set background=dark
" do soft wrap of text but not in the middle of words
set wrap linebreak nolist
" don't do hard wraps in any files
set textwidth=0
" add a color column at the 80 char
set colorcolumn=80
" spelling highlight needs to be done after the colorscheme load
highlight SpellBad term=underline cterm=underline
" enable English spellchecking in markdown files
autocmd FileType markdown setlocal spell
autocmd FileType markdown setlocal spelllang=en

View File

@ -58,7 +58,7 @@ For graphical vim you'll invoke `gvim`.
You'll probably always want to include the following in your vimrc. You'll probably always want to include the following in your vimrc.
You can [download](./assets/vimrc_basic) the file if you want to try it out but do take the time to read the comments. You can [download](./assets/vimrc_basic) the file if you want to try it out but do take the time to read the comments.
``` ```vimscript
" ---------------------------------------------------------------------------- " ----------------------------------------------------------------------------
" basic essentials " basic essentials
" ---------------------------------------------------------------------------- " ----------------------------------------------------------------------------
@ -164,7 +164,7 @@ As for window navigation I add the following to my vimrc but you will probably n
This remaps the arrow keys, which you should **not** be using for navigation text anyway, to window navigation. This remaps the arrow keys, which you should **not** be using for navigation text anyway, to window navigation.
If the `nnoremap` makes no sense try `:help mapping`. If the `nnoremap` makes no sense try `:help mapping`.
``` ```vimscript
" use the arrows for buffer navigation " use the arrows for buffer navigation
nnoremap <down> <C-W><C-J> nnoremap <down> <C-W><C-J>
nnoremap <up> <C-W><C-K> nnoremap <up> <C-W><C-K>
@ -178,7 +178,7 @@ A lot of information about vim online is geared towards programmers and not syst
You have to get comfortable with opening and navigating buffers first so a quick rundown on the basics. You have to get comfortable with opening and navigating buffers first so a quick rundown on the basics.
To do this exercise properly first prepare the following files by executing the commands below. To do this exercise properly first prepare the following files by executing the commands below.
``` ```bash
echo "I am a first file" > ~/first_file.txt echo "I am a first file" > ~/first_file.txt
echo "[unit]\nDescription=looks like a config file\nManual=maybe systemd\n" > ~/test.service echo "[unit]\nDescription=looks like a config file\nManual=maybe systemd\n" > ~/test.service
echo "import datetime\n\nd = datetime.datetime.now()\nprint(d)" >python_test.py echo "import datetime\n\nd = datetime.datetime.now()\nprint(d)" >python_test.py
@ -195,7 +195,7 @@ You have now opened up all three files in one vim but how do you switch from one
They are loaded in memory and are called buffers. They are loaded in memory and are called buffers.
To list all buffers currently opened in vim you type `:buffers` and you should see a list like the one below. To list all buffers currently opened in vim you type `:buffers` and you should see a list like the one below.
``` ```vimscript
:buffers :buffers
1 "first_file.txt" line 1 1 "first_file.txt" line 1
2 # "test.service" line 1 2 # "test.service" line 1
@ -209,7 +209,7 @@ As you are opening and editing files in the same instance of vim you can yank an
Try playing around with this and make some changes to some files. Try playing around with this and make some changes to some files.
At some point you'll be confronted with the following message. At some point you'll be confronted with the following message.
``` ```vimscript
E37: No write since last change (add ! to override) E37: No write since last change (add ! to override)
``` ```
@ -217,7 +217,7 @@ This means you're trying to switch to an other buffer but you have unsaved chang
I like to add the following to my vimrc to automatically save a buffer upon leaving. I like to add the following to my vimrc to automatically save a buffer upon leaving.
Do keep in mind it can be a bit dangerous to overwrite files you're not too certain about. Do keep in mind it can be a bit dangerous to overwrite files you're not too certain about.
``` ```vimscript
" automatically save buffers " automatically save buffers
set autowrite set autowrite
set autowriteall set autowriteall
@ -263,7 +263,7 @@ I personally don't like the documentation jumping up and down on my screen so yo
Now to be able to view the documentation we'll need to install some plugins. Now to be able to view the documentation we'll need to install some plugins.
I have not found a clean way of hiding the preview window *and* adding a shortcut to show documentation. I have not found a clean way of hiding the preview window *and* adding a shortcut to show documentation.
``` ```vimscript
set completeopt-=preview set completeopt-=preview
``` ```
@ -272,7 +272,7 @@ set completeopt-=preview
Vim can do a lot more than just complete python code. Vim can do a lot more than just complete python code.
When you press `<c-x>` you'll see a menu at the bottom along these lines. When you press `<c-x>` you'll see a menu at the bottom along these lines.
``` ```vimscript
-- ^X mode (^]^D^E^F^I^K^L^N^O^Ps^U^V^Y) -- ^X mode (^]^D^E^F^I^K^L^N^O^Ps^U^V^Y)
``` ```
@ -280,7 +280,7 @@ Every `^CHARACTER` is a different mode of autocomplete!
Try out the `^K` one just for fun. Try out the `^K` one just for fun.
It will probably say this the following. It will probably say this the following.
``` ```vimscript
'dictionary' option is empty 'dictionary' option is empty
``` ```
@ -311,7 +311,7 @@ First we'll need to install Vundle itself.
This is done by cloning the repository. This is done by cloning the repository.
Make sure you have `git` and `curl` installed on your machine! Make sure you have `git` and `curl` installed on your machine!
``` ```bash
➜ ~ git:(master) ✗ sudo apt install git curl ➜ ~ git:(master) ✗ sudo apt install git curl
Reading package lists... Done Reading package lists... Done
Building dependency tree... Done Building dependency tree... Done
@ -325,7 +325,7 @@ git is already the newest version (1:2.30.2-1).
If this is the case you can go ahead and clone Vundle! If this is the case you can go ahead and clone Vundle!
This will install Vundle to your home directory in a `~/.vim/bundle` folder. This will install Vundle to your home directory in a `~/.vim/bundle` folder.
``` ```bash
git clone https://github.com/VundleVim/Vundle.vim.git ~/.vim/bundle/Vundle.vim git clone https://github.com/VundleVim/Vundle.vim.git ~/.vim/bundle/Vundle.vim
``` ```
@ -334,7 +334,7 @@ Without this Vundle won't work!
Notice the `" ADD PLUGINS HERE`; this is where we will put links to the github plugins we want to install. Notice the `" ADD PLUGINS HERE`; this is where we will put links to the github plugins we want to install.
Vundle will take care of the installation with the `:VundleInstall` command. Vundle will take care of the installation with the `:VundleInstall` command.
``` ```vimscript
" ---------------------------------------------------------------------------- " ----------------------------------------------------------------------------
" vundle essentials " vundle essentials
" ---------------------------------------------------------------------------- " ----------------------------------------------------------------------------
@ -388,7 +388,7 @@ I tend to have three basic blocks in my vimrc and I would advise you to do the s
So all the way at the bottom of my vimrc I would add the following. So all the way at the bottom of my vimrc I would add the following.
``` ```vimscript
" map a keyboard shortcut to show and hide NERDTree " map a keyboard shortcut to show and hide NERDTree
nnoremap <C-t> :NERDTreeToggle<CR> nnoremap <C-t> :NERDTreeToggle<CR>
``` ```
@ -396,14 +396,14 @@ nnoremap <C-t> :NERDTreeToggle<CR>
It's also nice to automatically close NERDTree when it's the last window left. It's also nice to automatically close NERDTree when it's the last window left.
To do this we add the following (taken from the github documentation). To do this we add the following (taken from the github documentation).
``` ```vimscript
" Exit Vim if NERDTree is the only window remaining in the only tab. " Exit Vim if NERDTree is the only window remaining in the only tab.
autocmd BufEnter * if tabpagenr('$') == 1 && winnr('$') == 1 && exists('b:NERDTree') && b:NERDTree.isTabTree() | quit | endif autocmd BufEnter * if tabpagenr('$') == 1 && winnr('$') == 1 && exists('b:NERDTree') && b:NERDTree.isTabTree() | quit | endif
``` ```
Our full vimrc config now looks like this and can be downloaded [here](./assets/vimrc_vundle). Our full vimrc config now looks like this and can be downloaded [here](./assets/vimrc_vundle).
``` ```vimscript
" ---------------------------------------------------------------------------- " ----------------------------------------------------------------------------
" vundle essentials " vundle essentials
" ---------------------------------------------------------------------------- " ----------------------------------------------------------------------------
@ -494,6 +494,274 @@ nnoremap <C-t> :NERDTreeToggle<CR>
autocmd BufEnter * if tabpagenr('$') == 1 && winnr('$') == 1 && exists('b:NERDTree') && b:NERDTree.isTabTree() | quit | endif autocmd BufEnter * if tabpagenr('$') == 1 && winnr('$') == 1 && exists('b:NERDTree') && b:NERDTree.isTabTree() | quit | endif
``` ```
## Going full power
There is a lot of online debate on which plugins to use, which autocomplete engine is the best, if you even need anything beyond vanilla vim, etc.
From here on out I'll just list my current personal preferences.
I've done quite a bit of tweaking an testing over the years and this list can be a shortcut for you to not having to debug as much.
For me, autocomplete is essential.
I don't really understand *how* you can learn how to code without.
This being said, I use autocomplete for all sorts of things ranging from email to code and configuration files.
The modern way of doing autocomplete is to do it *asynchronous* meaning vim won't freeze when it's waiting on a list of possible candidates.
I'm a pretty big fan of the [Language Server Protocol](https://en.wikipedia.org/wiki/Language_Server_Protocol) and the world seems to agree it's the way to go.
For vim I use the following plugins as a bare minimum.
* [asyncomplete.vim](https://github.com/prabirshrestha/asyncomplete.vim) to offer async completion
* [vim-lsp](https://github.com/prabirshrestha/vim-lsp) which is a LSP client written in vimscript
* [asyncomplete-lsp.vim](https://github.com/prabirshrestha/asyncomplete-lsp.vim)
* [mattn/vim-lsp-settings](https://github.com/mattn/vim-lsp-settings) which makes it *super* easy to install new language servers
* [yami-beta/asyncomplete-omni.vim](https://github.com/yami-beta/asyncomplete-omni.vim) to offer omni complete async
* [prabirshrestha/asyncomplete-file.vim](https://github.com/prabirshrestha/asyncomplete-file.vim) adds file path autocomplete
This might seem like a lot but they are all pretty neat plugins that work super well together.
With this installed vim becomes a language server client and a client is nothing without a server.
You can see a list of suppored servers [here](https://github.com/mattn/vim-lsp-settings) and mattn/vim-lsp-settings makes it super easy to install one.
In order for it all to work, for python and bash, you should do a systemwide installation of python3-pip, python3-venv and npm with the following command.
```bash
sudo apt install -y python3-pip python3-venv npm
```
For python just install the above mentioned plugins and open up a python file.
You'll be prompted to install [pyls](https://github.com/palantir/python-language-server) which is a very good language server.
Type `:LspInstallServer pyls-all`, wait for it to finish and you're good to go!
It might take some time to get everything initialized properly the first time you launch it, but that's quite normal.
For bash you'll need the npm package installed.
If that's the case you just open up a script and you'll be prompted to install the server.
Type `:LspInstallServer bash-language-server`, wait a bit and you're good to go!
The full configuration file can be seen below and downloaded [here](./assets/vimrc_vundle_ide)
```vimscript
" ----------------------------------------------------------------------------
" vundle essentials
" ----------------------------------------------------------------------------
set nocompatible
filetype off
" set the runtime path to include Vundle and initialize
set rtp+=~/.vim/bundle/Vundle.vim
call vundle#begin()
" let vundle manage vundle...
Plugin 'VundleVim/Vundle.vim'
" Basic plugins
Plugin 'jiangmiao/auto-pairs'
Plugin 'preservim/nerdtree'
Plugin 'jeetsukumaran/vim-buffergator'
" IDE like plugins
Plugin 'prabirshrestha/asyncomplete.vim'
Plugin 'prabirshrestha/vim-lsp'
Plugin 'prabirshrestha/asyncomplete-lsp.vim'
Plugin 'mattn/vim-lsp-settings'
Plugin 'yami-beta/asyncomplete-omni.vim'
Plugin 'prabirshrestha/asyncomplete-file.vim'
" Language autocomplete for English
Plugin 'htlsne/asyncomplete-look'
" an additional colorscheme I like
Plugin 'altercation/vim-colors-solarized'
call vundle#end()
filetype plugin indent on
" ----------------------------------------------------------------------------
" basic essentials
" ----------------------------------------------------------------------------
" don't make vim vi compatible (if not set you miss out on a lot of features!)
" you'll see this option set in most configuration files found online
set nocompatible
" enable filetype recognition plus indent and plugin (pretty much mandatory)
filetype plugin indent on " required
" enable syntax highlighting
syntax on
" backspace can be a tricky thing and this setting make it work a lot better
set backspace=indent,eol,start
" when tab completing on the expert line you don't want to miss out on EDIT vs
" edit or nerdtree vs NERDTree and this setting ignores case completely
set ignorecase
" highlight your search patterns (very handy when building regexes)
set hlsearch
" highlight the search pattern as-you-go (tremendously helpful when
" constructing regexes)
set incsearch
" always show a status line at the bottom of your vim which shows some basic
" information about the file, which line you're at etc
set laststatus=2
" show files in statusbar when opening via expert mode
set wildmenu
" also show all possible expert mode commands in the statusline
set wildmode=full
" reverse numbering (in the sideline) so you don't have to manually count how
" many lines you have to yank
set rnu
" it's also nice to still have your absolute line number in the sideline
set nu
" can do copy paste from the clipboard
set clipboard=unnamedplus
" automatically save buffers
set autowrite
set autowriteall
" spaces not tabs for coding purposes
set sw=4
set ts=4
set sts=4
" mouse usage can be handy, especially when using LspPeekDefinition
set mouse=a
" enable code folding
set foldmethod=indent
" set SPACE to toggle a fold
nnoremap <SPACE> za
" set the leader key for shortcuts (uncomment if you don't want it to be the
" default \ key
"let mapleader=";"
" ----------------------------------------------------------------------------
" plugin configuration
" ----------------------------------------------------------------------------
" NERDTree
" --------
" map a keyboard shortcut to show and hide NERDTree
nnoremap <C-t> :NERDTreeToggle<CR>
" Exit Vim if NERDTree is the only window remaining in the only tab.
autocmd BufEnter * if tabpagenr('$') == 1 && winnr('$') == 1 && exists('b:NERDTree') && b:NERDTree.isTabTree() | quit | endif
" vim-lsp
" -------
" general vim-lsp settings
" ------------------------
" maps quite q few keyboad shortcuts
" this is taken staight off the github page with one added shortcut to peak at
" the definition of a function or class
function! s:on_lsp_buffer_enabled() abort
setlocal omnifunc=lsp#complete
setlocal signcolumn=yes
if exists('+tagfunc') | setlocal tagfunc=lsp#tagfunc | endif
nmap <buffer> gd <plug>(lsp-definition)
nmap <buffer> gpd <plug>(lsp-peek-definition)
nmap <buffer> gs <plug>(lsp-document-symbol-search)
nmap <buffer> gS <plug>(lsp-workspace-symbol-search)
nmap <buffer> gr <plug>(lsp-references)
nmap <buffer> gi <plug>(lsp-implementation)
nmap <buffer> gt <plug>(lsp-type-definition)
nmap <buffer> <leader>rn <plug>(lsp-rename)
nmap <buffer> [g <plug>(lsp-previous-diagnostic)
nmap <buffer> ]g <plug>(lsp-next-diagnostic)
nmap <buffer> K <plug>(lsp-hover)
inoremap <buffer> <expr><c-f> lsp#scroll(+4)
inoremap <buffer> <expr><c-d> lsp#scroll(-4)
let g:lsp_format_sync_timeout = 2000
autocmd! BufWritePre *.rs,*.go call execute('LspDocumentFormatSync')
endfunction
augroup lsp_install
au!
" call s:on_lsp_buffer_enabled only for languages that has the server registered.
autocmd User lsp_buffer_enabled call s:on_lsp_buffer_enabled()
augroup END
" asyncomplete
" ------------
" make tab complete work
inoremap <expr> <Tab> pumvisible() ? "\<C-n>" : "\<Tab>"
inoremap <expr> <S-Tab> pumvisible() ? "\<C-p>" : "\<S-Tab>"
inoremap <expr> <cr> pumvisible() ? asyncomplete#close_popup() : "\<cr>"
" force refresh with CTRL-SPACE
imap <c-@> <Plug>(asyncomplete_force_refresh)
" asyncomplete-file
" -----------------
au User asyncomplete_setup call asyncomplete#register_source(asyncomplete#sources#file#get_source_options({
\ 'name': 'file',
\ 'allowlist': ['*'],
\ 'priority': 10,
\ 'completor': function('asyncomplete#sources#file#completor')
\ }))
" asyncomplete-omni
" -----------------
autocmd User asyncomplete_setup call asyncomplete#register_source(asyncomplete#sources#omni#get_source_options({
\ 'name': 'omni',
\ 'allowlist': ['*'],
\ 'blocklist': ['c', 'cpp', 'html'],
\ 'completor': function('asyncomplete#sources#omni#completor'),
\ 'config': {
\ 'show_source_kind': 1,
\ },
\ }))
" asyncomplete-look
" -----------------
au User asyncomplete_setup call asyncomplete#register_source({
\ 'name': 'look',
\ 'allowlist': ['text', 'markdown'],
\ 'completor': function('asyncomplete#sources#look#completor'),
\ })
" ----------------------------------------------------------------------------
" visual configuration
" ----------------------------------------------------------------------------
" set a colorscheme
colorscheme solarized
set background=dark
" do soft wrap of text but not in the middle of words
set wrap linebreak nolist
" don't do hard wraps in any files
set textwidth=0
" add a color column at the 80 char
set colorcolumn=80
" spelling highlight needs to be done after the colorscheme load
highlight SpellBad term=underline cterm=underline
" enable English spellchecking in markdown files
autocmd FileType markdown setlocal spell
autocmd FileType markdown setlocal spelllang=en
```
### Notes ### Notes
`man systemd.unit 2>/dev/null| grep --color -P "^[[:space:]]{2,}[[:<:]][A-Z]\w+[=]{0,1}$" | sed -e 's/[[:space:]]//g'` `man systemd.unit 2>/dev/null| grep --color -P "^[[:space:]]{2,}[[:<:]][A-Z]\w+[=]{0,1}$" | sed -e 's/[[:space:]]//g'`