VIM

VIM

用来几天vim发现自己喜欢上了vim的模式,把所有ide能用vim插件的都改用vim了 总体来说vsc体验最好 jet全家桶ideavim还可以,vs2022 vim体验并不好,可能以后换Clion了,但是感觉clion的调试功能没有vs2022好,淦,这种东西自己舒服才是最重要的

VSCODE vim

nomal模式

a在光标后插入 A在行尾插入 这样我们可以用A;很方便的在行尾加分号

i在光标前插入 I在行首插入

o下行插入 O上行插入

f {char}跳到下一个char位置 F{char} 上一个

; 重复上次字符查找 ,反向查找上次查找 .可以重复上一次命令

d 删除(剪切) c修改 y复制 p粘贴 u撤销

x删除光标处,r修改光标处

==自动缩进

“ Ctrl-u 向上移动半屏

“ Ctrl-d 向下移动半屏

“ Ctrl-b 向上移动一屏

“ Ctrl-f 向下移动一屏

“ gg 到文档开头

“ G 到文档结尾

“ H 到屏幕顶部 head

“ M 到屏幕中间 middle

“ L 到屏幕底部 last

“ayy 复制当前行到a寄存器中

“Ayy 追加当前当到a寄存器.

“ap 粘贴a寄存器中的值

j和 k跳转相对num行

光标移动

image-20230430152911270

w 下一个单词开头

b 本单词或者上一个单词开头(back)

e 本单词或下一个单词结尾(end)

0 绝对行首 ^行首 $行尾

gg 第一行 G最后一行

组合

a是around i是inner 标识符:() <> {} 等

c/d/y iw操作一个的单词

c/d/y i标识符 操作被符号包裹着的单词

c/d/y a标示符 连同符号一起操作

对于大括号{}里的语句还可以用c/d/y iB或c/d/y aB来操作

对于小括号()里的语句可以用c/d/y ib或c/d/y ab来操作

dd yy cc操作一行 前面加数字就可以操作n行

c/d/y f {char}一直操作到char

c/d/y i或a e操作整个文件

上面的还可以自由搭配比如de什么的

VISUAL模式

大同小异

其他

gd 转到函数定义 (goto defination)

gh 查看参数提示等 (hover悬停)

"vim.highlightedyank.enable": true,
"vim.showMarksInGutter": true,
"vim.sneakReplacesF": true,
"vim.easymotion": true,
"vim.incsearch": true,
"vim.useSystemClipboard": true,
"vim.useCtrlKeys": true,
"vim.hlsearch": true,
"vim.sneak": true,
"vim.insertModeKeyBindings": [
{
"before": [
"j",
"k"
],
"after": [
"<Esc>"
]
}
],
"vim.normalModeKeyBindingsNonRecursive": [
{
"before": [
"<leader>",
"d"
],
"after": [
"d",
"d"
]
},
{
"before": [
"<C-n>"
],
"commands": [
":nohl"
]
},
{
"before": [
"K"
],
"commands": [
"lineBreakInsert"
],
"silent": true
},
{
"before": [
"<S-L>"
],
"commands": [
":tabnext"
]
},
{
"before": [
"<S-H>"
],
"commands": [
":tabprevious"
]
},
{
"before": [
"<S-Q>"
],
"commands": [
":q!"
]
},
{
"before": [
"g",
"r"
],
"commands": [
"editor.action.goToReferences"
],
},
{
"before": [
"<leader>",
"b"
],
"commands": [
"editor.debug.action.toggleBreakpoint"
],
},
{
"before": [
"<leader>",
"f"
],
"commands": [
"editor.action.formatDocument"
],
}
],
"vim.leader": "<space>",
"vim.handleKeys": {
"<C-a>": false,
"<C-f>": false,
"<C-z>": false,
"<C-v>": false,
"<C-c>": false,
"<C-x>": false,
"<C-n>": false,
"<C-w>": false,
"<C-p>": false,
"<C-b>": false,
"<C-t>": false,
"<C-j>": false,
},

ctrl o回到光标的上次,ctrl + i下次光标位置、

gcc给当前行添加注释 gc3j包括当前行4行添加注释 gciB gcaB等可以自己搭配

y s <motion> <desired> Add desired surround around text defined by <motion>
d s <existing> Delete existing surround
c s <existing> <desired> Change existing surround to desired
S <desired> Surround when in visual modes (surrounds full selection)
这样就可以用vaw方便的 S引号 方便的给一个单词加上引号

然后我把这个插件”vim.sneak”: true打开了 s可以向前跳到char char

S可以向后跳到char char分号跳到下一个 原本的s是删除一个字符并修改我用不到,可以用r修改,单词平常都是b cw或ciw来删除并修改

https://github.com/VSCodeVim/Vim 里还有好多有用的

VIM

~/.vimrc

https://vimawesome.com/

curl -fLo ~/.vim/autoload/plug.vim --create-dirs \
https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim

cocnvim https://github.com/neoclide/coc.nvim

nodejs >= 14.14
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.0/install.sh | bash
使用的是 zsh 或 fish,需要将安装脚本中的 bash 替换为 zsh 或 fish
nvm install 16
nvm use 16

各语言支持 https://github.com/neoclide/coc.nvim/wiki/Using-coc-extensions

sudo apt install clangd
sudo apt install clang-format
:CocInstall coc-clangd
:CocInstall coc-pyright
"高亮搜索结果
set hlsearch
"智能推测搜索,搜索set时大小写敏感,set不敏感
set smartcase
"滚动上下缓存5行
set scrolloff=5
set clipboard=unnamedplus
set t_Co=256
if has("termguicolors")
" fix bug for vim
set t_8f=[38;2;%lu;%lu;%lum " 这里^[[38中的^[需要替换,使用ctrol+v然后按esc
set t_8b=[48;2;%lu;%lu;%lum " 这里^[[38中的^[需要替换,使用ctrol+v然后按esc
" enable true color
set termguicolors
endif
set hlsearch
"插入模式显示绝对行号
"其他模式显示相对行号
set cursorline
set number " Enable line numbering
" augroup numbertoggle " Toggles relativenumber on and off based on mode
" autocmd!
" autocmd BufEnter,FocusGained,InsertLeave * set relativenumber
" autocmd BufLeave,FocusLost,InsertEnter * set norelativenumber
" augroup END
set mouse=a
" add tab space
set ts=2
set softtabstop=2
set shiftwidth=2
set expandtab
set cindent
set autoindent
inoremap jk <ESC>
nnoremap <s-k> gt
nnoremap <s-J> gT
nnoremap <S-q> :q!<CR>
set incsearch

call plug#begin()
Plug 'voldikss/vim-floaterm'
let g:floaterm_keymap_toggle = 'jt'
let g:floaterm_keymap_new = '<F7>'
let g:floaterm_keymap_prev = '<F8>'
let g:floaterm_keymap_next = '<F9>'
Plug 'mg979/vim-visual-multi', {'branch': 'master'}
let g:VM_maps = {}
let g:VM_maps['Find Under'] = '<C-j>'
let g:VM_maps['Find Subword Under'] = '<C-j>'
"最近打开文件
Plug 'mhinz/vim-startify'
"任务栏美化
Plug 'vim-airline/vim-airline'
"自动括号
Plug 'jiangmiao/auto-pairs'
"彩虹括号
Plug 'luochen1990/rainbow'
let g:rainbow_active = 1
Plug 'preservim/nerdtree'
map <C-n> :NERDTreeToggle<CR>
"vim-sneak
Plug 'justinmk/vim-sneak'
let g:sneak#label = 1
"vim-surround
Plug 'tpope/vim-surround'

"vim-commentary
Plug 'tpope/vim-commentary'

"theme
Plug 'joshdick/onedark.vim'
Plug 'sainnhe/edge'
Plug 'rakr/vim-one'

"coc.nvim
Plug 'neoclide/coc.nvim', {'branch': 'release'}

Plug 'easymotion/vim-easymotion'
" 代码格式化 nvim需要单独安装python
Plug 'vim-autoformat/vim-autoformat'
Plug 'vim-scripts/argtextobj.vim'
call plug#end()

"不知道为什么全局的配置用不了,只能牺牲一点点性能
" clang-format -style=google -dump-config > .clang-format 把谷歌风格生成到文件里
" 自动拷贝根目录下的 .clang-format 文件到当前目录
"
" augroup copy_clang_format
" autocmd!
" autocmd BufNewFile,BufRead *.c,*.cpp execute 'silent! !cp /home/grxer/.clang-format ' . expand('%:p:h') . '/.clang-format'
" augroup END

"把格式换该行绑定到f4
noremap <F4> :AutoformatLine<CR>

" 设置主体

if has("termguicolors")
set termguicolors
endif
" 晚上10点到早上7点用黑色
" if strftime("%H") >= 23 || strftime("%H") <= 7
let g:current_colorscheme = "onedark"
" let g:onedark_terminal_italics=1
let g:oedark_hide_endofbuffer=1
let g:onedark_termcolors=1
set background=dark
colorscheme onedark
"else
" if (empty($TMUX))
" if (has("nvim"))
" "For Neovim 0.1.3 and 0.1.4 < https://github.com/neovim/neovim/pull/2198 >
" let $NVIM_TUI_ENABLE_TRUE_COLOR=1
" endif
" "For Neovim > 0.1.5 and Vim > patch 7.4.1799 < https://github.com/vim/vim/commit/61be73bb0f965a895bfb064ea3e55476ac175162 >
" "Based on Vim patch 7.4.1770 (`guicolors` option) < https://github.com/vim/vim/commit/8a633e3427b47286869aa4b96f2bfc1fe65b25cd >
" " < https://github.com/neovim/neovim/wiki/Following-HEAD#20160511 >
" if (has("termguicolors"))
" set termguicolors
" endif
" endif
" let g:current_colorscheme = "one"
" set background=light
" let g:one_allow_italics = 1
" colorscheme one
"endif

" 切换主题函数
function! ToggleColorscheme()
if g:current_colorscheme == "onedark"
let g:current_colorscheme = "one"
set background=light
let g:one_allow_italics = 1
"Credit joshdick
"Use 24-bit (true-color) mode in Vim/Neovim when outside tmux.
"If you're using tmux version 2.2 or later, you can remove the outermost $TMUX check and use tmux's 24-bit color support
"(see < http://sunaku.github.io/tmux-24bit-color.html#usage > for more information.)
if (empty($TMUX))
if (has("nvim"))
"For Neovim 0.1.3 and 0.1.4 < https://github.com/neovim/neovim/pull/2198 >
let $NVIM_TUI_ENABLE_TRUE_COLOR=1
endif
"For Neovim > 0.1.5 and Vim > patch 7.4.1799 < https://github.com/vim/vim/commit/61be73bb0f965a895bfb064ea3e55476ac175162 >
"Based on Vim patch 7.4.1770 (`guicolors` option) < https://github.com/vim/vim/commit/8a633e3427b47286869aa4b96f2bfc1fe65b25cd >
" < https://github.com/neovim/neovim/wiki/Following-HEAD#20160511 >
if (has("termguicolors"))
set termguicolors
endif
endif
colorscheme one
else
let g:current_colorscheme = "onedark"
let g:onedark_terminal_italics=1
let g:oedark_hide_endofbuffer=1
let g:onedark_termcolors=1
set background=dark
"Use 24-bit (true-color) mode in Vim/Neovim when outside tmux.
"If you're using tmux version 2.2 or later, you can remove the outermost $TMUX check and use tmux's 24-bit color support
"(see < http://sunaku.github.io/tmux-24bit-color.html#usage > for more information.)
if (empty($TMUX))
if (has("nvim"))
"For Neovim 0.1.3 and 0.1.4 < https://github.com/neovim/neovim/pull/2198 >
let $NVIM_TUI_ENABLE_TRUE_COLOR=1
endif
"For Neovim > 0.1.5 and Vim > patch 7.4.1799 < https://github.com/vim/vim/commit/61be73bb0f965a895bfb064ea3e55476ac175162 >
"Based on Vim patch 7.4.1770 (`guicolors` option) < https://github.com/vim/vim/commit/8a633e3427b47286869aa4b96f2bfc1fe65b25cd >
" < https://github.com/neovim/neovim/wiki/Following-HEAD#20160511 >
if (has("termguicolors"))
set termguicolors
endif
endif
colorscheme onedark
endif
endfunction

" 设置快捷键切换主题
nnoremap <C-F6> :call ToggleColorscheme()<CR>

" "cocnvim配置

"用tab和shitft tab来切换提示,回车补全
" 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

"将选择下一个提示改为tab
" inoremap <silent><expr> <TAB>
" \ coc#pum#visible() ? coc#pum#next(1) :
" \ CheckBackspace() ? "\<Tab>" :
" \ coc#refresh()

"将shift tab改为上一个补全
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>"
"tab补全修改为 ctrl j和ctrl k左右移动参数
inoremap <silent><expr> <TAB>
\ pumvisible() ? "\<C-y>" :
\ CheckBackspace() ? "\<Tab>" :
\ "\<TAB>"

function! CheckBackspace() abort
let col = col('.') - 1
return !col || getline('.')[col - 1] =~# '\s'
endfunction


"cocnvim config

" Having longer updatetime (default is 4000 ms = 4s) leads to noticeable
" delays and poor user experience
" 使用提示更快
set updatetime=200
" Always show the signcolumn, otherwise it would shift the text each time
" diagnostics appear/become resolved
set signcolumn=yes

"ctrl o 提示补全
inoremap <silent><expr> <c-o> coc#refresh()


"用空格+和空格-查找代码报错
nmap <silent> <space>- <Plug>(coc-diagnostic-prev)
nmap <silent> <space>= <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)

"g+h显示函数等的帮助文档
nnoremap <silent> gh :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')

"重命名变量 leader默认是\ 把他改为了空格
" Symbol renaming
let mapleader=" "
nmap <leader>rn <Plug>(coc-rename)

"空格f空格 格式化化代码,不过tab缩进是2 不知道怎么改
" Formatting selected code
" xmap <leader>f <Plug>(coc-format-selected)
" nmap <leader>f <Plug>(coc-format-selected)

" 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)

"快速选中函数里的或类类的东西,a和i的区别就是选中和不选中函数或类名字
" 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)

PlugInstall

Ubuntu16安装cocnvim

先添加源升级vim8

sudo add-apt-repository ppa:jonathonf/vim
sudo apt-get update
sudo apt-get install vim

clangd添加源安装

vim  /etc/apt/sources.list添加下面的源
deb http://apt.llvm.org/xenial/ llvm-toolchain-xenial main
deb-src http://apt.llvm.org/xenial/ llvm-toolchain-xenial main
如果签名错误 W: GPG error: https://apt.llvm.org/xenial llvm-toolchain-xenial InRelease: The following signatures couldn't be verified because the public key is not available: NO_PUBKEY 15CF4D18AF4F7421
执行
wget -O - https://apt.llvm.org/llvm-snapshot.gpg.key|sudo apt-key add -
sudo apt-get update
sudo apt-get install clangd

卸载

sudo apt install ppa-purge && sudo ppa-purge ppa:jonathonf/vim

vs2022

inoremap jk <ESC>
nmap <C-O> :vsc View.NavigateBackward<CR>
nmap <C-I> :vsc View.NavigateForward<CR>
nmap gd :vsc Edit.GoToDefinition<CR>
nmap gh :vsc Edit.QuickInfo<CR>
nnoremap <s-k> gt
nnoremap <s-J> gT
nnoremap <S-q> :q!<CR>

ideavim

inoremap jk <ESC>
set sneak
set surround
set commentary
set argtextobj
set hlsearch
set smartcase
set scrolloff=5
set cursorline
set expandtab
set cindent
set autoindento
let mapleader=" "
Plug 'preservim/nerdtree'
Plug 'vim-easymotion'
map <C-n> :NERDTreeToggle<CR>
set clipboard+=unnamed
set incsearch
map <Leader> <Plug>(easymotion-prefix)
map <leader>rn <Action>(RenameElement)
map gp <Action>(ParameterInfo)
map gh <Action>(ShowErrorDescription)
map gi <Action>(QuickImplementations)
map gm <Action>(QuickJavaDoc)
set noerrorbells
set visualbell
set showmode
nnoremap <s-k> gt
nnoremap <s-J> gT
nnoremap <S-q> :q!<CR>
nnoremap == :<C-u>action ReformatCode<CR>

vim–>neovim

9.0

sudo snap install nvim  --classic

https://neovim.io/doc/user/nvim.html#nvim-from-vim

sudo apt install neovim
mkdir -p ~/.config/nvim/
touch init.vim
nvim init.vim
:exe 'edit '.stdpath('config').'/init.vim'
:write ++p

复制到init.vim

set runtimepath^=~/.vim runtimepath+=~/.vim/after
let &packpath = &runtimepath
source ~/.vimrc
cd ~/.local/share/nvim
ln -s ~/.vim/plugged/ ./plugged

创建个符号链接vi启动nvim

cd /usr/bin
sudo rm vi
sudo ln -s nvim vi