Day 13:vim 设定档

+++
title = "Day 13:vim 设定档"
date = "2021-09-13"
tags = [
"cli",
"terminal",
"software development",
"vim",
"tmux",
"zsh"
]
categories = [ "ithelp", "pure-CLI-IDE" ]
+++

vim 在启动时,都会去执行你的设定档,这个档案根据你的 vim 软件不同而改变,如果是一般的 vim,那他会去读 ~/.vimrc,如果是 neovim(nvim),他会去找 ~/.config/nvim/init.vim。在接下来的文章中都以 vimrc 代指。
vimrc 内容是 vimscript,也就是所有的冒号命令去掉冒号之後的内容,例如有个命令是 :set nu,这个命令可以开启行号显示,如果要写在 vimrc 里面,就要写成 set nu

vimrc

通常我们会在 vimrc 中设定关於 vim 的外观行为载入外挂等等,接下来是我用多年的 vimrc 的内容,我会一个一个用注解解说他们的用处(双引号 " 开头是 vimscript 的注解)

" 打开语法突显
syntax on

" load plguin
" install vim-plug:
" sh -c 'curl -fLo "${XDG_DATA_HOME:-$HOME/.local/share}"/nvim/site/autoload/plug.vim --create-dirs \
"        https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim'
" 这个是明天的东西,先注解掉,才不会出错
" so ~/.config/nvim/plugin.vim

" 256 色
set t_Co=256
" 解决和 tmux 冲突,https://vi.stackexchange.com/questions/238/tmux-is-changing-part-of-the-background-in-vim
set t_ut=
" 选一个你喜欢的 colorschema
" available color schema
" blue darkblue default delek desert elflord evening industry koehler
" morning  murphy pablo peachpuff ron shine slate torte zellner
colorscheme koehler

" 杂项设定,详细解说请用 `:help <opeion>`,例如 `:help showcmd`
set showcmd
set nu
set tabstop=4
set shiftwidth=4
set autoindent
set nowrap
set incsearch
set autoindent
set cindent
set smartindent
set cursorline
" make lightline work in single screen
" https://github.com/itchyny/lightline.vim/issues/71#issuecomment-47859569
set laststatus=2
" 开启滑鼠功能,对初学者来说非常好用
set mouse=a

" markdown
" 如果是档案类型是 markdown 或 text,打开文字折叠(超出萤幕宽度会折到下一行)
" au 的语法等等会讲
au FileType markdown set wrap
au FileType text set wrap

" ejs
" 不加这个的话 ejs 的语法突显会很奇怪,顺便附带一个 ft, filetype 的坑
" https://vi.stackexchange.com/questions/16341/what-is-the-difference-between-set-ft-and-setfiletype
au BufNew,BufNewFile,BufRead *.ejs :set filetype=ejs
au FileType ejs set syntax=html

" ts 
" 这只是因为我比较喜欢 vim 对 javascript 的配色,typesript 的我觉得很丑,所以强制 vim 用 javascript 的配色
" au 就是 autocmd 的缩写啦!(vim 几乎每个超过三个字的命令、选项都有缩写,写程序的人都很懒XD)
autocmd BufNewFile,BufRead *.ts set syntax=javascript

" yaml
" yaml 机车的空格限制,这样在写 yaml 档时比较方便
autocmd FileType yaml setlocal ts=2 sts=2 sw=2 expandtab

" hotkey
" 这边是自订快捷键,语法等等会讲,这边只说明用法
" 在命令模式按 <tab> 会把整行字向右移一个 tab。<S-tab> 会移回来
map <tab> :s/^/\t<CR>
map <S-tab> :s/^\t/<CR>
"  如果要从系统剪贴簿贴上多行程序码,建议这样用,才不会被 vim 的自动缩排雷到(你试试就知道是什麽问题,很讨厌)
nmap <F3> :r! cat<CR>
" 切换行号,在复制到系统键贴簿时很好用,这样就不会复制到行号
nmap <F7> :set invnumber<CR>
" 清除搜寻结果的语法突显
nmap cs :noh<CR>

" alias
" 冒号命令的别名,语法等等会讲
" 常用就知道为什麽要设这个(按冒号时要按 <shift>,然後下一个字就很常变大写,简称手残)
command W w
command Q q
command Wq wq
command WQ wq

" fix bg color error in Pmenu
" 这个只是显示问题,有时候背景色和前景色一样你就看不到字了,所以要自己把他换掉,语法等等会讲
" https://vi.stackexchange.com/questions/23328/change-color-of-coc-suggestion-box
hi Pmenu ctermbg=black ctermfg=white
hi Ignore ctermbg=black ctermfg=lightblue

command

我们从最简单的命令别名讲起,这个命令可以缩写成 com
这个命令可以定义 「使用者自订命令」
使用者自订命令一定要是大写开头

列出命令

:verbose com [cmd]
这个可以列出符合 [cmd] 的使用者自订命令,还有最後定义的位置

定义新的使用者自订命令

:commmand {cmd} {rep}
这个会设定 {cmd} 的别名 {rep}

autocmd

autocmd 是在某种类型的档案载入时自动执行命令用的,可以缩写成 au
au 的使用场景通常是某个类型的语法突显会出问题、想要根据档案类型套用不同设定,简单的语法如下
au [条件] [...命令]
条件通常长这样, FileType javascript
命令就是冒号命令除了冒号的部份

map

map 的功能是定义不是冒号开头的命令(像是 dd 这种,在前几篇文章中称为快捷键),map 又根据作用的模式分为 nmapvmapimap 等等非常多种(:help map 会列出所有 map )。其中最常用的是 mapnmapimap,这三个分别代表在「除了编辑模式中作用」、「命令模式( n )作用」、「在编辑模式作用( i )」。
各种 map 用法都一样,差别只在作用模式不同

列出 map

:map
:nmap
:imap

定义 map

map {快捷键} {命令}
{快捷键} 是 vim 的按键组合,其中 imap 用的大多都要加 或是 ,否则会没用
{命令} 是 vim 的命令,注意这里讲的是「广义的命令」,也就是包括冒号和非冒号命令,所以如果是冒号命令你必须加上冒号和 enter 键才会执行
ps: map 给我的感觉有点像「当你按下 {快捷键} 时,vim 会自动帮你打 {命令}

快捷键

快捷键可以是不只一个按键,可以像是以下几个范例

<leader>f
<C-y>k
ggk

如果一个按键可以打出来,像是abc012+=,就不用角括号 <>
如果是控制按键或是和控制按键一起按,就要加上括号,例如 <C-y><leader>,其中是指 是反斜线
更多这种按键的说明可以参考 :help key-notation

命令

这边的命令因为是广义的命令,所以如果你想要帮某个快捷键加上别名也是可以的

nmap copy yy
nmap paste p

嗯......这可能只在快捷键很常出现但是复杂时比较好用
扯远了,回到正题。如果你的命令是冒号命令的话,你必须要加上冒号和 enter,不然你在打完快捷键之後还要自己按 enter,所以记的在命令最後面加上 <CR> ,这个代表的是 enter 键, 也可以


呜呜呜~我昨天忘记发文了,等等我会把所有囤的文章发出来,但是就不会画重点和校稿了,呜呜呜,该去想明年的题目了!
另外文章也会在 我的部落格 一并更新


这篇文不小心断更了,呜呜呜,这里是我新的新开的文章系列 https://ithelp.ithome.com.tw/users/20130473/ironman/4804


<<:  Day 1 [Python ML] 30天内容介绍

>>:  [Day1] 说在前头

[Day28]C# 鸡础观念- 物件导向(oop)~ 继承(Inheritance)

在人类中,基因肯定是世世代代在传承, 下一代除了接收了上一代的基因之外, 可能还会偷偷的进化, C#...

连续 30 天 玩玩看 ProtoPie

做事情都要有个为什麽 人是很奇怪的动物,心中会有很多对某些事情的想像,总是一件又一件的想去做。 决定...

Day 15:vim 外挂大杂烩

看到这里,你可能还是很疑惑,到底 vim 好用在哪?嘿嘿,那是因为强大的外挂还没装啦!网路上会有一些...

[Day29] Bevy 游戏引擎 (Part 3) 收工

好 那今天就是专案的收尾了 我先预告一下明天会把一些我从开始学习 Rust 之後陆续得到的学习资源 ...

Day 22 | Livewire 实作 购物网站(一): 建立商品列表

今天来做第二个实作:购物网站。这也是很容易遇到的专案类型,照原本的做法做一个购物网站都要花费大量的时...