autocmd BufEnter * if &diff | let g:blamer_enabled=0 | endif " ╮ disable git blame in diff mode
autocmd BufEnter * if ! empty(&key) | let g:blamer_enabled=0 | endif " ╯ and encrypt mode
" setup cursor shape to block in diff mode
function! CursorShapeInDiffMode()
if &diff
if $TERM_PROGRAM =~ "iTerm"
let &t_SI = "\<Esc>]50;CursorShape=1\x7"
let &t_SR = "\<Esc>]50;CursorShape=2\x7"
let &t_EI = "\<Esc>]50;CursorShape=2\x7"
else
let &t_SI = "\e[1 q"
let &t_SR = "\e[2 q"
let &t_EI = "\e[2 q"
endif
endif
endfunction
autocmd BufRead,BufEnter,BufNewFile * :call CursorShapeInDiffMode()
autocmd WinEnter * if &diff | set nocursorline | endif
" or
au OptionSet diff let &cul=!v:option_new
" or
augroup CursorLine
au!
au FilterWritePost * if &diff | let &cul=0 |endif
au BufEnter * if !&diff | let &cul=1 |endif
augroup end
terminal mode
[!NOTE|label:references:]
<empty> : normal buffer
acwrite : buffer will always be written with BufWriteCmds
help : help buffer (do not set this manually)
nofile : buffer is not related to a file, will not be written
nowrite : buffer will not be written
quickfix : list of errors :cwindow or locations :lwindow
terminal : terminal-emulator buffer
prompt : buffer where only the last line can be edited, meant to be used by a plugin, see |prompt-buffer|
:echo &buftype
terminal
autocmd
autocmd! TermOpen,TermEnter * :IndentLinesDisable
autocmd! TermOpen * setlocal nonumber norelativenumber modifiable nospell
" others
autocmd! BufEnter * if &buftype ==# 'terminal' | setlocal ma | endif
autocmd! TermOpen,BufEnter term://* :IndentLinesDisable
autocmd TermClose * echom 'Terminal exited with status '..v:event.status
more
[!NOTE|label:more:]
" go back to insert mode when entering the terminal window
autocmd BufEnter * if &buftype == 'terminal' | :startinsert | endif
function! NeovimTermOpen()
:split
:terminal
:startinsert
endfunction
cabbrev ter call NeovimTermOpen()
autocmd BufWinEnter,WinEnter term://* startinsert
autocmd BufLeave term://* stopinsert
# or https://vi.stackexchange.com/q/25577/7389
autocmd TermOpen * startinsert
au BufEnter * if &buftype == 'terminal' | :startinsert | endif
# or https://vi.stackexchange.com/a/25579/7389
autocmd TerminalOpen * nnoremap <buffer> <c-p> :bdelete!<CR>
" in cursor position"
:.! <command>
" read!
:r! <command>
" in new buffer"
:new | 0read ! <command>
[!NOTE|label:reference:]
CMD
ignorecase
smartcase
MATCHES
foo
off
-
foo
foo
on
-
foo Foo FOO
foo
on
on
foo Foo FOO
Foo
on
on
Foo
Foo
on
-
foo Foo FOO
\cfoo
-
-
foo Foo FOO
foo\C
-
-
foo
:set ignorecase
:set smartcase
/example " Case insensitive
/Example " Case sensitive
/example\C " Case sensitive
/Example\c " Case insensitive
search with \V
pattern
result
/a.k.a<CR>
backward
a.k.a
/a\.k\.a<CR>
backward
a.k.a
/Va.k.a<CR>
backward
a.k.a
search in visual mode
[!NOTE]
v go to visual mode
/KEYWORDS search next KEYWORDS | ?KEYWORDS search previous KEYWORDS
enter
[!NOTE|label:references:]
sort
:{range}sort
" or
:sort n
" reverse sort
:sort nr
sort and unique
:{range}sort u
:echo getcompletion('', 'filetype')
or
:echo getcompletion('c', 'filetype')
function! GetFiletypes()
" Get a list of all the runtime directories by taking the value of that
" option and splitting it using a comma as the separator.
let rtps = split(&runtimepath, ",")
" This will be the list of filetypes that the function returns
let filetypes = []
" Loop through each individual item in the list of runtime paths
for rtp in rtps
let syntax_dir = rtp . "/syntax"
" Check to see if there is a syntax directory in this runtimepath.
if (isdirectory(syntax_dir))
" Loop through each vimscript file in the syntax directory
for syntax_file in split(glob(syntax_dir . "/*.vim"), "\n")
" Add this file to the filetypes list with its everything
" except its name removed.
call add(filetypes, fnamemodify(syntax_file, ":t:r"))
endfor
endif
endfor
" This removes any duplicates and returns the resulting list.
" NOTE: This might not be the best way to do this, suggestions are welcome.
return uniq(sort(filetypes))
endfunction
reference:
- [Vim documentation: pattern](http://vimdoc.sourceforge.net/htmldoc/pattern.html#/%5Cr) : - `\n` matches an end of line (newline) - `\r` matches a carriage return (more precisely it’s treated as the input `CR`))
redirect cmd
[!NOTE|label:references:]
redir to file
:redir > ~/Desktop/debug.txt
:silent highlight
:redir END
" support unicode
function! AppendFullCode() range
for lnum in range(a:firstline, a:lastline)
let char = getline(lnum)[0]
let code = char2nr(char)
let hex = code > 0xffff ? printf("Hex %06x", code) : printf("Hex %04x", code)
let oct = printf("Octal %o", code)
call setline( lnum, printf("%s: %d, %s, %s", char, code, hex, oct) )
endfor
endfunction
" usage
:%call AppendFullCode()
" full version
function! AppendFullAscii() range
for lnum in range(a:firstline, a:lastline)
let char = getline(lnum)[0]
let code = char2nr(char)
" get code
let dec = code
let hex = code > 0xffff ? printf("%08x", code) : printf("%04x", code)
let oct = printf("%o", code)
" UTF-8 coding
let utf8_bytes = []
let n = code
while n > 0
call insert(utf8_bytes, n % 0x100)
let n = n / 0x100
endwhile
" get final string
let result = printf("%s : DEC %d | HEX %s | OCT %o | UTF-8 %s",
\ char, dec, hex, oct, join(map(utf8_bytes, 'printf("%02x", v:val)'), ''))
call setline(lnum, result)
endfor
endfunction
" usage
:%call AppendAscii()
" using `:ascii` command and redirect
function! AppendAscii() range
let save = @a
for lnum in range(a:firstline, a:lastline)
let char = getline(lnum)[0]
" go to first column
execute lnum . 'normal! 0'
" capture ascii result
redir @a
silent! ascii
redir END
" format output
let output = substitute(@a, '\n', '', 'g')
" remove <x>
let output = substitute(output, '^<.*>\s*', '', '')
let output = substitute(output, ',\s*Hex\s*', ', Hex ', '')
let output = substitute(output, ',\s*Octal\s*', ', Octal ', '')
" join string
call setline(lnum, printf("%s: %s", char, output))
endfor
let @a = save
endfunction
" usage
:%call AppendAscii()
format json in vim
[!NOTE|label:references:]
:%!jq .
" or
:%!python -m json.tool
multiple repalce in silent mode
:silent! %s/old/new/g | %s/old2/new2/g
related commands:
:argdo : all files in argument list
:bufdo : all buffers
:tabdo : all tabs
:windo : all windows
reference:
:bufdo <command>
replace
# regular
:%s/<str>/<str_new>/ge
# for all buffers
:bufdo %s/<str>/<str_new>/ge | update
force the bufdo to continue without saving files via :bufdo!
:as
" or
:ascii
" or shortcut `ga` : https://til.hashrocket.com/posts/lsqojsbmmn-get-character-without-diacritical-mark-in-vim
open vim with specific line Number
[!NOTE|label:reference]
# last line
$ vim + /path/to/file
# specific line
$ vim +123 /path/to/file
" or https://til.hashrocket.com/posts/joyovn3pau-go-to-file-with-line-number
$ vim /path/to/file:123
N|
" i.e.: go to 15th column of current line
15|
jumplist
[!TIP|label:tips:]
:help ''
`:help ```
" check jump list
:jumps
" clear jump list
:clearjumps
" jump back https://til.hashrocket.com/posts/ue7f2hf8x2-jump-back-
''
" jump previous
``
relative path: ctrl + g or
:file
:echo @%
print full path
:echo expand('%:p')
:%s/></>\r</g
gg=G
encryption with Vim
set cryptmethod=blowfish2
encrypt
$ vim -x file.txt
:w!
# or
:set key=<password>
:wa!
decrypt
$ vim -X file.txt
" or in vim
:set key=
:wa!
config
get platform
[!NOTE|label:references:]
" to avoid `system('uname')` issue in powershell/gvim/cmd
" previous solution: https://stackoverflow.com/a/57015339/2940319
" let uname = substitute(system('uname'),'\n','','')
" if uname == 'Linux'
" to avoid `Can't open file /proc/version` in MacOS using:
" - `has('linux')` instead of `has('unix')`
" - `has('unix') && !has('macunix')` if `has('linux')` not supported
function! IsWSL()
if has( 'linux' )
let lines = readfile( '/proc/version' )
if lines[0] =~ 'Microsoft'
return 1
endif
endif
return 0
endfunction
function! IsWindows()
return ( has('win32') || has('win64') )
endfunction
function! IsLinux()
return has('unix') && has('linux') && !has('macunix')
endfunction
function! IsMac()
return has('macunix')
endfunction
disable vim beep
# ~/.vimrc
set noerrorbells novisualbell visualbell " ┐ turn off
set t_vb= " ┘ error/normal beep/flash
pastetoggle
[!NOTE|label:references:]
:set paste
:set nopaste
:set pastetoggle=<F2>
details
set iskeyword-=_
nnoremap <leader>e :set iskeyword-=_<cr>diw:set iskeyword+=_<cr>i
run vim commands in terminal
[!NOTE|label:manual:]
$ man vim
...
OPTIONS
+{command}
-c {command}
{command} will be executed after the first file has been read. {command} is interpreted
as an Ex command. If the {command} contains spaces it must be enclosed in double quotes
(this depends on the shell that is used). Example: Vim "+set si" main.c
Note: You can use up to 10 "+" or "-c" commands.
--cmd {command}
Like using "-c", but the command is executed just before processing any vimrc file. You
can use up to 10 of these commands, independently from "-c" commands.
$ vim -es -c "set ff? | q"
fileformat=unix
$ vim +commandHere filename
# or
$ vim +linenumber filename
" DrChip's additional man.vim stuff
syn match manSectionHeading "^\s\+[0-9]\+\.[0-9.]*\s\+[A-Z].*$" contains=manSectionNumber
syn match manSectionNumber "^\s\+[0-9]\+\.[0-9]*" contained
syn region manDQString start='[^a-zA-Z"]"[^", )]'lc=1 end='"' contains=manSQString
syn region manSQString start="[ \t]'[^', )]"lc=1 end="'"
syn region manSQString start="^'[^', )]"lc=1 end="'"
syn region manBQString start="[^a-zA-Z`]`[^`, )]"lc=1 end="[`']"
syn region manBQSQString start="``[^),']" end="''"
syn match manBulletZone transparent "^\s\+o\s" contains=manBullet
syn case match
syn keyword manBullet contained o
syn match manBullet contained "\[+*]"
syn match manSubSectionStart "^\*" skipwhite nextgroup=manSubSection
syn match manSubSection ".*$" contained
hi link manSectionNumber Number
hi link manDQString String
hi link manSQString String
hi link manBQString String
hi link manBQSQString String
hi link manBullet Special
hi manSubSectionStart term=NONE cterm=NONE gui=NONE ctermfg=black ctermbg=black guifg=navyblue guibg=navyblue
hi manSubSection term=underline cterm=underline gui=underline ctermfg=green guifg=green
NOTICE: after using \v the = should using \= instead
characters
[!NOTE|label:references:]
first
char
mode
max nr of chars
max value
(none)
decimal
3
255
-
o or O
octal
3
377
(255)
x or X
hexadecimal
2
ff
(255)
u
hexadecimal
4
ffff
(65535)
U
hexadecimal
8
7fffffff
(2147483647)
show all digraphs
[!NOTE|label:references:]
:redir @a | silent digraph | redir END | new +setl\ buftype=nofile\ bufhidden=wipe | put! a
: or
:redir @a | silent digraph | redir END | new +setl\ buftype=nofile\ bufhidden=wipe | put! a | on
:let a=line('.')
<....> " do micro
:if line('.')==a | exec 'normal @q' | endif
" |
" v
" micro name
others
[!NOTE|label:references:]
[!NOTE|label:references:]
binary on
textwidth 0
modeline off
expandtab off
:mksession! <filename>
or
$ vim -S <filename>
comments
[!NOTE|label:references:]
statueline
[!NOTE|label:references:]
sample
if has('statusline')
set laststatus=2
set statusline=%#User2#%m%r%*\ %F\ %y,%{&fileformat}
" set statusline+=\ %{FugitiveStatusline()} " set statusline+=\ %{fugitive#statusline()}
set statusline+=%=\ %-{strftime(\"%H:%M\ %d/%m/%Y\")}\ %b[A],0x%B\ %c%V,%l/%L\ %1*--%n%%--%*\ %p%%\ |
endif