VIM kan vara väldigt komplicerat för nya användare, men när man väl behärskar de grundläggande kommandona är det ett mycket kraftfullt verktyg. Det finns en mycket enklare textredigerare som heter nano. Båda textredigerarna är mycket bra.
Installera och konfigurera
sudo apt install vim fonts-powerline python3-powerline vim-airline
mkdir -p ~/.vim ~/.vim/autoload ~/.vim/backup ~/.vim/colors ~/.vim/plugged
touch ~/.vimrc
curl -fLo ~/.vim/autoload/plug.vim --create-dirs \
https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim
Ändra standardinställningarna i vimrc sudo vim /etc/vim/vimrc
runtime! debian.vim
syntax on
set background=dark
au BufReadPost * if line("'\"") > 1 && line("'\"") <= line("$") | exe "normal! g'\"" | endif
filetype plugin indent on
set encoding=utf-8
set nobackup
set nowritebackup
set showcmd
set updatetime=300
set showmatch
set ignorecase
set smartcase
set incsearch
set tabstop=2
set softtabstop=2
set shiftwidth=2
set expandtab
if filereadable("/etc/vim/vimrc.local")
source /etc/vim/vimrc.local
endif
Och konfigurera din personliga vimrc-fil vim ~/.vimrc
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
"
" ██╗ ██╗██╗███╗ ███╗██████╗ ██████╗
" ██║ ██║██║████╗ ████║██╔══██╗██╔════╝
" ██║ ██║██║██╔████╔██║██████╔╝██║
" ╚██╗ ██╔╝██║██║╚██╔╝██║██╔══██╗██║
" ╚████╔╝ ██║██║ ╚═╝ ██║██║ ██║╚██████╗
" ╚═══╝ ╚═╝╚═╝ ╚═╝╚═╝ ╚═╝ ╚═════╝
"
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
set mouse=
set nocompatible
set cursorline
set nocursorcolumn
set nowrap
set showmode
set hlsearch
set wildmenu
set wildmode=list:longest
set wildignore=*.docx,*.jpg,*.png,*.gif,*.pdf,*.pyc,*.exe,*.flv,*.img,*.xlsx
" PLUGINS ---------------------------------------------------------------- {{{
call plug#begin('~/.vim/plugged')
Plug 'dense-analysis/ale'
Plug 'preservim/nerdtree'
Plug 'nelsyeung/twig.vim'
Plug 'pangloss/vim-javascript'
Plug 'neoclide/coc.nvim', {'branch': 'release'}
call plug#end()
" }}}
" COC -------------------------------------------------------------------- {{{
" Use tab for trigger completion with characters ahead and navigate
" NOTE: There's always complete item selected by default, you may want to enable
" no select by `"suggest.noselect": true` in your configuration file
" NOTE: Use command ':verbose imap <tab>' to make sure tab is not mapped by
" other plugin before putting this into your config
inoremap <silent><expr> <TAB>
\ coc#pum#visible() ? coc#pum#next(1) :
\ CheckBackspace() ? "\<Tab>" :
\ coc#refresh()
inoremap <expr><S-TAB> coc#pum#visible() ? coc#pum#prev(1) : "\<C-h>"
" Make <CR> to accept selected completion item or notify coc.nvim to format
" <C-g>u breaks current undo, please make your own choice
inoremap <silent><expr> <CR> coc#pum#visible() ? coc#pum#confirm()
\: "\<C-g>u\<CR>\<c-r>=coc#on_enter()\<CR>"
function! CheckBackspace() abort
let col = col('.') - 1
return !col || getline('.')[col - 1] =~# '\s'
endfunction
" Use <c-space> to trigger completion
if has('nvim')
inoremap <silent><expr> <c-space> coc#refresh()
else
inoremap <silent><expr> <c-@> coc#refresh()
endif
" Use `[g` and `]g` to navigate diagnostics
" Use `:CocDiagnostics` to get all diagnostics of current buffer in location list
nmap <silent> [g <Plug>(coc-diagnostic-prev)
nmap <silent> ]g <Plug>(coc-diagnostic-next)
" GoTo code navigation
nmap <silent> gd <Plug>(coc-definition)
nmap <silent> gy <Plug>(coc-type-definition)
nmap <silent> gi <Plug>(coc-implementation)
nmap <silent> gr <Plug>(coc-references)
" Use K to show documentation in preview window
nnoremap <silent> K :call ShowDocumentation()<CR>
function! ShowDocumentation()
if CocAction('hasProvider', 'hover')
call CocActionAsync('doHover')
else
call feedkeys('K', 'in')
endif
endfunction
" Highlight the symbol and its references when holding the cursor
autocmd CursorHold * silent call CocActionAsync('highlight')
" Symbol renaming
nmap <leader>rn <Plug>(coc-rename)
" Formatting selected code
xmap <leader>f <Plug>(coc-format-selected)
nmap <leader>f <Plug>(coc-format-selected)
augroup mygroup
autocmd!
" Setup formatexpr specified filetype(s)
autocmd FileType typescript,json setl formatexpr=CocAction('formatSelected')
" Update signature help on jump placeholder
autocmd User CocJumpPlaceholder call CocActionAsync('showSignatureHelp')
augroup end
" Applying code actions to the selected code block
" Example: `<leader>aap` for current paragraph
xmap <leader>a <Plug>(coc-codeaction-selected)
nmap <leader>a <Plug>(coc-codeaction-selected)
" Remap keys for applying code actions at the cursor position
nmap <leader>ac <Plug>(coc-codeaction-cursor)
" Remap keys for apply code actions affect whole buffer
nmap <leader>as <Plug>(coc-codeaction-source)
" Apply the most preferred quickfix action to fix diagnostic on the current line
nmap <leader>qf <Plug>(coc-fix-current)
" Remap keys for applying refactor code actions
nmap <silent> <leader>re <Plug>(coc-codeaction-refactor)
xmap <silent> <leader>r <Plug>(coc-codeaction-refactor-selected)
nmap <silent> <leader>r <Plug>(coc-codeaction-refactor-selected)
" Run the Code Lens action on the current line
nmap <leader>cl <Plug>(coc-codelens-action)
" Map function and class text objects
" NOTE: Requires 'textDocument.documentSymbol' support from the language server
xmap if <Plug>(coc-funcobj-i)
omap if <Plug>(coc-funcobj-i)
xmap af <Plug>(coc-funcobj-a)
omap af <Plug>(coc-funcobj-a)
xmap ic <Plug>(coc-classobj-i)
omap ic <Plug>(coc-classobj-i)
xmap ac <Plug>(coc-classobj-a)
omap ac <Plug>(coc-classobj-a)
" Remap <C-f> and <C-b> to scroll float windows/popups
if has('nvim-0.4.0') || has('patch-8.2.0750')
nnoremap <silent><nowait><expr> <C-f> coc#float#has_scroll() ? coc#float#scroll(1) : "\<C-f>"
nnoremap <silent><nowait><expr> <C-b> coc#float#has_scroll() ? coc#float#scroll(0) : "\<C-b>"
inoremap <silent><nowait><expr> <C-f> coc#float#has_scroll() ? "\<c-r>=coc#float#scroll(1)\<cr>" : "\<Right>"
inoremap <silent><nowait><expr> <C-b> coc#float#has_scroll() ? "\<c-r>=coc#float#scroll(0)\<cr>" : "\<Left>"
vnoremap <silent><nowait><expr> <C-f> coc#float#has_scroll() ? coc#float#scroll(1) : "\<C-f>"
vnoremap <silent><nowait><expr> <C-b> coc#float#has_scroll() ? coc#float#scroll(0) : "\<C-b>"
endif
" Use CTRL-S for selections ranges
" Requires 'textDocument/selectionRange' support of language server
nmap <silent> <C-s> <Plug>(coc-range-select)
xmap <silent> <C-s> <Plug>(coc-range-select)
" Add `:Format` command to format current buffer
command! -nargs=0 Format :call CocActionAsync('format')
" Add `:Fold` command to fold current buffer
command! -nargs=? Fold :call CocAction('fold', <f-args>)
" Add `:OR` command for organize imports of the current buffer
command! -nargs=0 OR :call CocActionAsync('runCommand', 'editor.action.organizeImport')
" Add (Neo)Vim's native statusline support
" NOTE: Please see `:h coc-status` for integrations with external plugins that
" provide custom statusline: lightline.vim, vim-airline
set statusline^=%{coc#status()}%{get(b:,'coc_current_function','')}
" Mappings for CoCList
" Show all diagnostics
nnoremap <silent><nowait> <space>a :<C-u>CocList diagnostics<cr>
" Manage extensions
nnoremap <silent><nowait> <space>e :<C-u>CocList extensions<cr>
" Show commands
nnoremap <silent><nowait> <space>c :<C-u>CocList commands<cr>
" Find symbol of current document
nnoremap <silent><nowait> <space>o :<C-u>CocList outline<cr>
" Search workspace symbols
nnoremap <silent><nowait> <space>s :<C-u>CocList -I symbols<cr>
" Do default action for next item
nnoremap <silent><nowait> <space>j :<C-u>CocNext<CR>
" Do default action for previous item
nnoremap <silent><nowait> <space>k :<C-u>CocPrev<CR>
" Resume latest coc list
nnoremap <silent><nowait> <space>p :<C-u>CocListResume<CR>
" }}}
" MAPPINGS --------------------------------------------------------------- {{{
inoremap <silent><expr> <TAB>
\ coc#pum#visible() ? coc#pum#next(1) :
\ CheckBackspace() ? "\<Tab>" :
\ coc#refresh()
inoremap <expr><S-TAB> coc#pum#visible() ? coc#pum#prev(1) : "\<C-h>"
" Press \\ to jump back to the last cursor position.
nnoremap <leader>\ ``
" Press \p to print the current file to the default printer from a Linux
" operating system.
" View available printers: lpstat -v
" Set default printer: lpoptions -d <printer_name>
" <silent> means do not display output.
nnoremap <silent> <leader>p :%w !lp<CR>
" Type jj to exit insert mode quickly.
inoremap jj <Esc>
" Press the space bar to type the : character in command mode.
nnoremap <space> :
" Pressing the letter o will open a new line below the current one.
" Exit insert mode after creating a new line above or below the current line.
nnoremap o o<esc>
nnoremap O O<esc>
" Center the cursor vertically when moving to the next word during a search.
nnoremap n nzz
nnoremap N Nzz
" Yank from cursor to the end of line.
nnoremap Y y$
" Map the F5 key to run a Python script inside Vim.
" We map F5 to a chain of commands here.
" :w saves the file.
" <CR> (carriage return) is like pressing the enter key.
" !clear runs the external clear screen command.
" !python3 % executes the current file with Python.
nnoremap <f5> :w <CR>:!clear <CR>:!python3 % <CR>
" You can split the window in Vim by typing :split or :vsplit.
" Navigate the split view easier by pressing CTRL+j, CTRL+k, CTRL+h, or CTRL+l.
nnoremap <c-j> <c-w>j
nnoremap <c-k> <c-w>k
nnoremap <c-h> <c-w>h
nnoremap <c-l> <c-w>l
" Resize split windows using arrow keys by pressing:
" CTRL+UP, CTRL+DOWN, CTRL+LEFT, or CTRL+RIGHT.
noremap <c-up> <c-w>+
noremap <c-down> <c-w>-
noremap <c-left> <c-w>>
noremap <c-right> <c-w><
" NERDTree specific mappings.
" Map the F3 key to toggle NERDTree open and close.
nnoremap <F3> :NERDTreeToggle<cr>
" Have nerdtree ignore certain files and directories.
let NERDTreeIgnore=['\.git$', '\.jpg$', '\.mp4$', '\.ogg$', '\.iso$', '\.pdf$', '\.pyc$', '\.odt$', '\.png$', '\.gif$', '\.db$']
" }}}
" VIMSCRIPT -------------------------------------------------------------- {{{
" Enable the marker method of folding.
augroup filetype_vim
autocmd!
autocmd FileType vim setlocal foldmethod=marker
augroup END
" If the current file type is HTML, set indentation to 2 spaces.
autocmd Filetype html setlocal tabstop=2 shiftwidth=2 expandtab
" If Vim version is equal to or greater than 7.3 enable undofile.
" This allows you to undo changes to a file even after saving it.
if version >= 703
set undodir=~/.vim/backup
set undofile
set undoreload=10000
endif
" You can split a window into sections by typing `:split` or `:vsplit`.
" Display cursorline and cursorcolumn ONLY in active window.
augroup cursor_off
autocmd!
autocmd WinLeave * set nocursorline nocursorcolumn
autocmd WinEnter * set cursorline cursorcolumn
augroup END
" If GUI version of Vim is running set these options.
if has('gui_running')
" Set the background tone.
set background=dark
" Set the color scheme.
colorscheme molokai
" Set a custom font you have installed on your computer.
" Syntax: <font_name>\ <weight>\ <size>
set guifont=Monospace\ Regular\ 12
" Display more of the file by default.
" Hide the toolbar.
set guioptions-=T
" Hide the the left-side scroll bar.
set guioptions-=L
" Hide the the left-side scroll bar.
set guioptions-=r
" Hide the the menu bar.
set guioptions-=m
" Hide the the bottom scroll bar.
set guioptions-=b
" Map the F4 key to toggle the menu, toolbar, and scroll bar.
" <Bar> is the pipe character.
" <CR> is the enter key.
nnoremap <F4> :if &guioptions=~#'mTr'<Bar>
\set guioptions-=mTr<Bar>
\else<Bar>
\set guioptions+=mTr<Bar>
\endif<CR>
endif
" }}}
" STATUS LINE ------------------------------------------------------------ {{{
" Clear status line when vimrc is reloaded.
set statusline=
" Status line left side.
set statusline+=\ %F\ %M\ %Y\ %R
" Use a divider to separate the left side from the right side.
set statusline+=%=
" Status line right side.
"set statusline+=\ ascii:\ %b\ hex:\ 0x%B\ row:\ %l\ col:\ %c\ percent:\ %p%%
" Show the status on the second to last line.
set laststatus=2
" Add (Neo)Vim's native statusline support
" NOTE: Please see `:h coc-status` for integrations with external plugins that
" provide custom statusline: lightline.vim, vim-airline
set statusline^=%{coc#status()}%{get(b:,'coc_current_function','')}
" }}}
Efterkonfiguration
vim ~/.vimrc
:PlugInstall
:source ~/.vimrc
:CocInstall @yaegassy/coc-tailwindcss3
:CocInstall coc-html
:CocInstall coc-json
:CocInstall coc-java
Ställ in VIM som standardredigerare
Välj en redigerare. Om du vill ändra valet senare kör du select-editor.
- /bin/nano <---- enklast
- /usr/bin/vim.basic
- /usr/bin/vim.tiny
Klipp ut, kopiera och klistra in
Kopiera angivet innehåll
När du har markerat en text eller ett innehåll har du två alternativ. Du kan kopiera eller klippa ut. Om du vill kopiera innehållet bör du använda yy. Y-tangenten står för yank i vi/vim och används för att kopiera det markerade innehållet. Du kan använda följande tangenter för att kopiera. Denna åtgärd kallas även vim yanking eller vim yank.
| Kommando | Beskrivning |
|---|---|
| yy | Kopiera den aktuella raden |
| y$ | Kopiera från den aktuella positionen till slutet av den aktuella raden |
| yiw | Kopiera det aktuella ordet |
| yaw | Kopiera det aktuella ordet inklusive inledande och avslutande mellanslag |
Ta bort angivet innehåll
Den andra funktionen är klippfunktionen, som skiljer sig från kopieringsfunktionen. Klippfunktionen kallas ”delete” i vi/vim och utförs med tangenterna dd. Klippfunktionen raderar först det markerade innehållet och klistrar sedan in det raderade innehållet på den angivna positionen. Du kan använda följande tabell för att klippa.
| Kommando | Beskrivning |
|---|---|
| dd | Klipp ut den aktuella raden |
| 3dd | Klipp ut 3 rader med start från den aktuella raden |
| d$ | Klipp ut från den aktuella markörpositionen till slutet av filen |
| dw | Klipp ut det aktuella ordet |
Klistra in bild
Det kopierade eller klippta innehållet kan klistras in på den aktuella markörpositionen med p-tangenten. p-tangenten klistrar in de utklippta raderna på den aktuella platsen, vilket avslutar kopierings- och klistrings- eller klipp- och klistringsoperationen. Denna klistringstangent fungerar på samma sätt som i GUI-baserade textredigerare eller när man högerklickar och väljer ”Klistra in från urklipp” i Windows, eftersom innehållet klistras in från minnet som fungerar som ett urklipp. Men tänk på att detta inte klistrar in från skrivbordet i Linux-operativsystemet. Du bör använda kortkommandot för att klistra in i terminalen efter att ha växlat Vim/Vi till infogningsläge. Kortkommandona för att klistra in i terminalen är vanligtvis CTRL+SHIFT+v.
Eftersom Vim och Vi är textredigerare som körs via kommandoraden och bygger på kommandon finns det ingen funktion för att högerklicka och klistra in. Alla insättningsåtgärder utförs via kommandon och tangentkommandon. GVIM är dock ett undantag; det är den grafiska varianten av Vim och erbjuder vissa GUI-verktyg samt möjligheten att använda musklick för att klistra in kopierat eller klippt innehåll.
Kopiera aktuell rad
Om du vill kopiera den aktuella raden där markören befinner sig med hjälp av enkla tangenttryckningar använder du följande ESC+yy+p tangenter.
Systemets urklipp
Skriv följande i konsolen:
vim --version | grep clipboard
Om du ser +clipboard eller +xterm_clipboard är allt klart. Om det står -clipboard och -xterm_clipboard måste du leta efter en version av Vim som har kompilerats med stöd för urklipp. På Debian och Ubuntu installerar du paketen vim-gtk eller vim-gnome för att få stöd för urklipp.
Klipp ut och kopiera
# Yank the selected text into the unnamed(default) register
y
# Yank into register a
"ay
# Yank into the system clipboard
"+y
Klistra in
# paste from the unnamed register
p
# paste from register a
"ap
# Paste from the system clipboard
"+p
Sök och ersätt
Om du till exempel vill söka efter det första förekomsten av strängen ”foo” i den aktuella raden och ersätta den med ”bar”, använder du följande:
:s/foo/bar/
För att ersätta alla förekomster av sökmönstret i den aktuella raden lägger du till flaggan g:
:s/foo/bar/g
Om du vill söka efter och ersätta mönstret i hela filen använder du procenttecknet % som intervall. Detta tecken anger ett intervall från den första till den sista raden i filen:
:%s/foo/bar/g
Om delen {string} utelämnas betraktas den som en tom sträng, och det matchade mönstret raderas. Följande kommando raderar alla förekomster av strängen ”foo” i den aktuella raden:
:s/foo//g
I stället för snedstrecket (/) kan du använda vilket annat icke-alfanumeriskt enkelbyte-tecken som helst, förutsatt att det inte används som avgränsare. Det här alternativet är användbart när tecknet ”/” förekommer i sökmönstret eller ersättningssträngen.
Om du till exempel vill ersätta alla förekomster av ”foo” med ”bar” i alla rader från rad 3 till rad 10 skulle du använda följande:
:3,10s/foo/bar/g
Ångra ändringar i Vim/Vi
Vim håller reda på alla ändringar du har gjort under den aktuella sessionen. Kommandot ”undo” ångrar en eller flera ändringar i den ordning de gjordes.
För att ångra ändringar i Vim och Vi använder du kommandona u, :u eller :undo:
Om du befinner dig i infogningsläget eller något annat läge, tryck på Esc tryck på tangenten för att återgå till normalläget, som även kallas kommandoläge.
Skriv u för att ångra den senaste ändringen. I Vim kan kommandot u även användas med kvantifierare. Om du till exempel vill ångra de fyra senaste ändringarna skriver du 4u.
Se till att du skriver det lilla ”u”, inte det stora ”U”, som ångrar alla senaste ändringar på en rad. Om du av misstag skriver ”U” kan du ångra ändringen med ”u”.
Återställ ändringar i Vim/Vi
Funktionen ”Gör om” återställer åtgärden som utfördes med ”Ångra”.
För att ångra en ändring i Vim och Vi använder du kommandot Ctrl-R eller :redo:
Tryck på Esc tryck på tangenten för att återgå till normalt läge.
Användning Ctrl-R (håll ned Ctrl och tryck på r) för att återföra den senaste ändringen. I Vim kan du också använda kvantifierare. Om du till exempel vill återföra de fyra senaste ändringarna skriver du 4Ctrl-R.
Varje ångra-kommando kan upphävas med ett gör om-kommando.