NeoVim cơ bản
Back HomeDownload NeoVim tại : NeoVim
Cấu hình init.vim
"python with virtualenv support
py << EOF
import os
import sys
if 'VIRTUAL_ENV' in os.environ:
project_base_dir = os.environ['VIRTUAL_ENV']
activate_this = os.path.join(project_base_dir, 'bin/activate_this.py')
execfile(activate_this, dict(__file__=activate_this))
EOF
function! DoRemote(arg)
UpdateRemotePlugins
endfunction
call plug#begin('~/.vim/plugged')
" python
Plugin 'tmhedberg/SimpylFold'
Plugin 'vim-scripts/indentpython.vim'
Plugin 'davidhalter/jedi-vim'
Plugin 'scrooloose/syntastic'
Plugin 'nvie/vim-flake8'
Plugin 'jistr/vim-nerdtree-tabs'
" Fix
Plug 'tpope/vim-fugitive'
" looking
Plug 'mhinz/vim-startify'
Plug 'Yggdroot/indentLine'
Plug 'ryanoasis/vim-devicons'
Plug 'myusuf3/numbers.vim'
Plug 'vim-airline/vim-airline'
Plug 'vim-airline/vim-airline-themes'
Plug 'sickill/vim-monokai'
Plug 'airblade/vim-gitgutter'
Plug 'altercation/vim-colors-solarized'
" completion/templating
Plug 'Shougo/deoplete.nvim', { 'do': function('DoRemote') }
Plug 'jiangmiao/auto-pairs'
Plug 'ervandew/supertab'
Plug 'tpope/vim-endwise'
Plug 'preservim/nerdcommenter'
Plug 'SirVer/ultisnips'
Plug 'honza/vim-snippets'
" command extention
Plug 'easymotion/vim-easymotion'
Plug 'wellle/targets.vim'
Plug 'tpope/vim-surround'
Plug 'junegunn/vim-easy-align'
Plug 'wellle/targets.vim'
Plug 'terryma/vim-multiple-cursors'
Plug 'repeat.vim'
" utils
Plug 'neomake/neomake'
Plug 'kassio/neoterm'
Plug 'sjl/gundo.vim'
Plug 'chrisbra/NrrwRgn'
Plug 'Mark--Karkat'
" misc
Plug 'asins/vimcdoc'
Plug 'ccvext.vim'
Plug 'CodeFalling/fcitx-vim-osx'
"Plug 'lilydjwg/fcitx.vim'
Plug 'junegunn/vim-github-dashboard'
" documentation
Plug 'rhysd/nyaovim-markdown-preview'
Plug 'xolox/vim-notes'
Plug 'xolox/vim-misc'
Plug 'itchyny/calendar.vim'
Plug 'junegunn/vim-journal'
" navigation
Plug 'scrooloose/nerdtree'
Plug 'ctrlpvim/ctrlp.vim'
Plug 'wesleyche/SrcExpl'
Plug 'majutsushi/tagbar'
Plug 'taglist.vim'
Plug 'rizzatti/dash.vim'
Plug 'eugen0329/vim-esearch'
" c/c++
" java
Plug 'artur-shaik/vim-javacomplete2'
"Plug 'vhakulinen/neovim-intellij-complete-deoplete'
" python
Plug 'zchee/deoplete-jedi'
" html/css/javascript
Plug 'mattn/emmet-vim'
" scala
Plug 'ensime/ensime-vim', { 'do': function('DoRemote') }
Plug 'derekwyatt/vim-scala'
" Plug 'ktvoelker/sbt-vim'
" Plug 'megaannum/vimside'
call plug#end()
" Fundamental settings
set encoding=utf-8
set fileencoding=utf-8
set fileencodings=ucs-bom,utf-8,gbk,cp936,latin-1
set fileformat=unix
set fileformats=unix,dos,mac
filetype on
filetype plugin on
filetype plugin indent on
syntax on
" Some useful settings
set smartindent
set expandtab "tab to spaces
set tabstop=2 "the width of a tab
set shiftwidth=2 "the width for indent
set foldenable
set foldmethod=indent "folding by indent
set foldlevel=99
set ignorecase "ignore the case when search texts
set smartcase "if searching text contains uppercase case will not be ignored
" Lookings
set number "line number
set cursorline "hilight the line of the cursor
set cursorcolumn "hilight the column of the cursor
set nowrap "no line wrapping
colorscheme monokai
"au BufWinEnter * let w:m2=matchadd('Underlined', '\%>' . 80 . 'v.', -1)
let $NVIM_TUI_ENABLE_TRUE_COLOR=1
" Shortcuts
" \ => go to command mode
imap <leader><leader> <esc>:
" go => go to anywhere
nmap go <Plug>(easymotion-jumptoanywhere)
" <c-v> => for pasting
imap <c-v> <esc>"+pa
" <c-h/j/k/l> => hjkl in normal mode (but there is a bug mapping <c-h>)
imap <c-h> <left>
imap <c-j> <down>
imap <c-k> <up>
imap <c-l> <right>
" \cl => redraw the screen
nmap <leader>l <c-l><c-l>
imap <leader>l <esc><leader>la
" <space> => fold/unfold current code
" tips: zR => unfold all; zM => fold all
nnoremap <space> @=((foldclosed(line('.')) < 0) ? 'zc' : 'zo')<CR>
" \o => open current file by system apps (only available in osx)
nmap <leader>o :!open "%"<cr>
imap <leader>o <esc><leader>o
" ,, => escape to normal mode
imap ,, <Esc>
tmap ,, <Esc>
" <esc> => go back to normal mode (in terminal mode)
tnoremap <Esc> <C-\><C-n>
" <F4> => popup the file tree navigation)
nmap <F4> :NERDTreeToggle<CR>
" use t{h,j,k,l} to switch between different windows
noremap tk <c-w>k
noremap tj <c-w>j
noremap th <c-w>h
noremap tl <c-w>l
nmap twj :resize +5<cr>
nmap twk :resize -5<cr>
nmap twh :vertical resize -5<cr>
nmap twl :vertical resize +5<cr>
" t[number] => switch to the file showed in the top tabs
" t[ t] => prev tab/next tab
nmap t1 <Plug>AirlineSelectTab1
nmap t2 <Plug>AirlineSelectTab2
nmap t3 <Plug>AirlineSelectTab3
nmap t4 <Plug>AirlineSelectTab4
nmap t5 <Plug>AirlineSelectTab5
nmap t6 <Plug>AirlineSelectTab6
nmap t7 <Plug>AirlineSelectTab7
nmap t8 <Plug>AirlineSelectTab8
nmap t9 <Plug>AirlineSelectTab9
nmap t[ <Plug>AirlineSelectPrevTab
nmap t] <Plug>AirlineSelectNextTab
" ts => toggle the srcExpl (for source code exploring)
nnoremap ts :SrcExplToggle<CR>
" tg => toogle the gundo
nnoremap tg :GundoToggle<CR>
" tb => open the tagbar
nmap tb :TlistClose<CR>:TagbarToggle<CR>
" ti => taglist
nmap ti :TagbarClose<CR>:Tlist<CR>
" <s-enter> => toggle the terminal
if exists('nyaovim_version')
nnoremap <silent> <s-cr> :Ttoggle<cr>
else " in terminal use t<enter>
nmap t<CR> :Ttoggle<CR>
endif
" tt => type the command for the terminal
nnoremap tt :T<space>
" te => send current line/selected lines to the terminal
nnoremap <silent> te :TREPLSend<CR>
xnoremap <silent> te :TREPLSend<CR>
" tE => send the thole current file to the terminal
nnoremap <silent> tE :TREPLSendFile<CR>
" \t => goto normal mode and press t (e.g. \t<enter> to toggle the terminal)
imap <leader>t <esc>t
" tm => toggle the markdown preview
let g:markdown_preview_on = 0
au! BufWinEnter *.md,*.markdown,*.mdown let g:markdown_preview_on = g:markdown_preview_auto || g:markdown_preview_on
au! BufWinLeave *.md,*.markdown,*.mdown let g:markdown_preview_on = !g:markdown_preview_auto && g:markdown_preview_on
nmap tm @=(g:markdown_preview_on ? ':Stop' : ':Start')<CR>MarkdownPreview<CR>:let g:markdown_preview_on = 1 - g:markdown_preview_on<CR>
" \g => scroll to bottom in markdown preview (insert mode)
imap <leader>g <esc><leader>Ga
" \jd => GoTo the definition
"nnoremap <leader>jd :YcmCompleter GoTo<CR>
" \e => edit only current/selected line(s) in normal/visual mode
" z + [fFtTwWbBeE(ge)(gE)jknNs] => easy motion
map zf <Leader><Leader>f
map zF <Leader><Leader>F
map zt <Leader><Leader>t
map zT <Leader><Leader>T
map zw <Leader><Leader>w
map zW <Leader><Leader>W
map zb <Leader><Leader>b
map zB <Leader><Leader>B
map ze <Leader><Leader>e
map zE <Leader><Leader>E
map zge <Leader><Leader>ge
map zgE <Leader><Leader>gE
map zj <Leader><Leader>j
map zk <Leader><Leader>k
map zn <Leader><Leader>n
map zN <Leader><Leader>N
map zs <Leader><Leader>s
" zn => NrrwRgn in normal/visual mode
nmap zn :NR<CR>
xmap zn :NR<CR>
" zm => multipleCursor by regular expression
nnoremap zm :MultipleCursorsFind<space>
xnoremap zm :MultipleCursorsFind<space>
xmap zI zm^<cr>I
xmap zA zm$<cr>A
" Plugin settings
" Airline
let g:airline#extensions#tabline#enabled = 1
let g:airline#extensions#tabline#buffer_idx_mode = 1
let g:airline_powerline_fonts = 1
if !exists('g:airline_symbols')
let g:airline_symbols = {}
endif
" EasyAlign
xmap ga <Plug>(LiveEasyAlign)
nmap ga <Plug>(LiveEasyAlign)
" EasyMotion
hi EasyMotionTarget ctermfg=9 guifg=red
hi EasyMotionTarget2First ctermfg=9 guifg=red
hi EasyMotionTarget2Second ctermfg=9 guifg=lightred
hi link EasyMotionShade Comment
" Emmet
let g:user_emmet_leader_key = ',z'
" ESearch
let g:esearch = {
\ 'adapter': 'ack',
\ 'backend': 'nvim',
\ 'out': 'win',
\ 'batch_size': 1000,
\ 'use': ['visual', 'hlsearch', 'last'],
\}
" IndentLine
let g:indentLine_color_gui = "#504945"
" Markdown_preview (a plugin in nyaovim)
let g:markdown_preview_eager = 1
let g:markdown_preview_auto = 1
" Multi_cursor
let g:multi_cursor_use_default_mapping=0
let g:multi_cursor_start_key='<c-n>'
let g:multi_cursor_next_key='<tab>'
let g:multi_cursor_prev_key='b'
let g:multi_cursor_skip_key='x'
let g:multi_cursor_quit_key='q'
" Neomake
let g:neomake_cpp_enabled_makers = ['clang']
let g:neomake_cpp_clang_args = ['-Wall', '-Wextra', '-std=c++11', '-o', '%:p:r']
let g:neomake_cpp_gcc_args = ['-Wall', '-Wextra', '-std=c++11', '-o', '%:p:r']
let g:neomake_scala_enabled_markers = ['fsc', 'scalastyle']
let g:neomake_scala_scalac_args = ['-Ystop-after:parser', '-Xexperimental']
" Neoterm
let g:neoterm_size=20
let g:neoterm_repl_command= 'zsh'
let g:neoterm_position = 'horizontal'
" toogle the terminal
" kills the current job (send a <c-c>)
nnoremap <silent> tc :call neoterm#kill()<cr>
" Notes
let g:notes_directories = ['~/Dev/notes-in-vim']
" Startify
command! -nargs=1 CD cd <args> | Startify
autocmd User Startified setlocal cursorline
let g:startify_enable_special = 0
let g:startify_files_number = 8
let g:startify_relative_path = 1
let g:startify_change_to_dir = 1
let g:startify_update_oldfiles = 1
let g:startify_session_autoload = 1
let g:startify_session_persistence = 1
let g:startify_session_delete_buffers = 1
let g:startify_list_order = [
\ [' LRU within this dir:'],
\ 'dir',
\ [' LRU:'],
\ 'files',
\ [' Sessions:'],
\ 'sessions',
\ [' Bookmarks:'],
\ 'bookmarks',
\ ]
let g:startify_skiplist = [
\ 'COMMIT_EDITMSG',
\ 'plugged/.*/doc',
\ '/data/repo/neovim/runtime/doc',
\ '.vimrc',
\ 'nyaovimrc.html',
\ ]
let g:startify_bookmarks = [
\ { 'c': '~/.vimrc' },
\ { 'y': '~/.config/nyaovim/nyaovimrc.html' },
\ ]
let g:startify_custom_footer =
\ ['', " I like it!", '']
highlight StartifyFooter ctermfg=240
" Supertab
let g:SuperTabMappingForward = '<s-tab>'
let g:SuperTabMappingBackward = '<tab>'
" Tagbar
let g:tagbar_width=30
" Taglist
let Tlist_Show_One_File=1
let Tlist_Exit_OnlyWindow=1
let Tlist_File_Fold_Auto_Close=1
let Tlist_WinWidth=30
let Tlist_Use_Right_Window=1
" UltiSnip
" <tab> => expand the snippets
let g:UltiSnipsExpandTrigger = '<tab>'
" <ctrl-d> => list available snippets start with the chars before the cursor
let g:UltiSnipsListSnippets = '<c-d>'
" <enter> => go to the next placeholder
let g:UltiSnipsJumpForwardTrigger = '<enter>'
" <shift-enter> => go to the previous placeholder
if exists('g:nyaovim_version')
let g:UltiSnipsJumpBackwardTrigger = '<s-enter>'
else "as <shift-enter> can't be handled in terminal, use <ctrl-k> instead
let g:UltiSnipsJumpBackwardTrigger = '<c-k>'
endif
" Automatics
function! ToStartify()
if winnr("$") == 1 && buffer_name(winbufnr(winnr())) != ""
vs
Startify
exec "normal \<c-w>w"
endif
endfunction
au! QuitPre * call ToStartify()
au BufReadPost * if line("'\"") > 1 && line("'\"") <= line("$") | exe "normal! g'\"" | endif
autocmd BufWritePost *.scala :EnTypeCheck
cd $HOME
au BufRead,BufNewFile,BufEnter \@!(term://)* cd %:p:h
au! BufWritePost * Neomake
autocmd FileType json set nocursorcolumn
" Python configuration
au BufNewFile,BufRead *.py set
\ tabstop=4
\ softtabstop=4
\ shiftwidth=4
\ textwidth=79
\ expandtab
\ autoindent
\ fileformat=unix
au BufRead,BufNewFile *.py,*.pyw,*.c,*.h match BadWhitespace /\s$/
map <leader>y :let g:ycm_auto_trigger=0<CR>
map <leader>y :let g:ycm_auto_trigger=1<CR>
let python_highlight_all=1
call togglebg#map("<F5>")
let NERDTreeIgnore=['\.pyc$', '\~$'] "ignore files in NERDTree
set keymap=vietnamese-telex
File coc-settings.json
{
"coc.preferences.formatOnSaveFiletypes": ["javascript", "typescript", "typescriptreact", "json", "javascriptreact", "typescript.tsx"],
"eslint.filetypes": ["javascript", "typescript", "typescriptreact", "javascriptreact", "typescript.tsx"],
"coc.preferences.diagnostic.virtualText": true,
}
Sử dụng
-
Vim có hai chế độ
-
insert
mode (để chèn) : ấni
để chuyển qua chế độ insert -
normal
mode (để di chuyển và điều khiển trong văn bản) : ấnEsc
để chuyển qua chế độ normal
-
-
Vim chuyển cơ bản
- Di chuyển sang trái <- hoặc sang phải -> trong văn bản : ấn
h
sang trái, ấnl
sang phải - Di chuyển lên xuống từng dòng : ấn
j
đi xuống, ấnk
đi lên
- Di chuyển sang trái <- hoặc sang phải -> trong văn bản : ấn
-
Di chuyển theo từ
- Để di chuyển đến từ tiếp theo :
w
đến đầu từ,e
đến cuối từ - Để di chuyển đến từ phía trước :
b
di chuyển đến đầu từ
- Để di chuyển đến từ tiếp theo :
-
Di chuyển sử dụng số
- Sử dụng số trước các phím di chuyển (
w
,e
,b
) để đi đến số từ mong muốn
Ví dụ :
3w
để di chuyển đến vị trí đầu tiên sau 3 từ tiếp theo- Sử dụng số trước
l
để di chuyển đến ký tự (letter) lần
Ví dụ :
3l
di chuyển đến 3 ký tự tiếp theo - Sử dụng số trước các phím di chuyển (
-
Chèn nhiều lần trong chế độ
norrmal
mode- Để chèn các kỹ tự lặp lại nhiều lần, ta sử dụng
[number]i[character]
rồiEsc
Ví dụ
30iabc
Esc
sẽ sinh raabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcab
- Để chèn các kỹ tự lặp lại nhiều lần, ta sử dụng
-
Tìm kiếm một ký tự
- Để tìm kiếm một ký tự :
f[character]
- Để tìm kiếm nhiều ký tự :
[number]f[character]
- Để tìm kiếm một ký tự :
-
Đi đến vị trí cặp dấu ngoặc (
[
,{
,(
) trùng :Shift + 5 = %
-
Di chuyển đến
- Đầu dòng
0
- Cuối dòng
Shift + 4 = $
- Đầu dòng
-
Di chuyển đến từ giống với từ ở ngay vị trí con trỏ
- Tiếp theo
*
- Quay lại
#
- Tiếp theo
-
Di chuyển đến
- Đầu văn bản
gg
- Cuối văn bản
G
- Đến dòng thứ number :
[number]G
- Đầu văn bản
-
Tìm kiếm một từ
- Nhấn
/[word]
để tìm kiếm - Nhấn
Enter
n
để di chuyển đến từ tiếp theo
- Nhấn
-
Để chèn một dòng mới
- Trước dòng hoặc sau dòng hiện tại
o
hoặcO
- Trước dòng hoặc sau dòng hiện tại
-
Để xóa một ký tự
-
x
xóa các ký tự trước -
X
xóa ký tự phía sau
-
-
Thay thế ký tự ở vị trí con trỏ :
r[character]
-
Để xóa một chữ
-
d[number]w
xóa number chữ và khoảng trắng -
d[number]e
xóa number chữ
-
-
Để lặp lại quá trình đã xóa ở trên nhấn
.
-
Chế độ visual mode :
-
v
visual mode : Chọn theo cột -
V
visual mode line : Chọn theo hàng
Ví du để chọn một từ sau con trỏ đang xét nhấn
vw
-
-
Các câu lệnh thường gặp
-
:w
Lưu văn bản -
:wq
Lưu và thoát văn bản :q
-