Vim零碎知识点和问题收集

碎点

查看键位映射

执行:
:verbose imap <enter>
可查看在插入模式下Enter键映射的是什么功能

执行
:verbose nmap <enter>
可查看在normal模式下Enter键映射的是什么功能

执行
:verbose vmap <enter>
可查看在可视模式下Enter键映射的是什么功能

<enter> 表示回车键,<c-s> 表示Ctrl+s,<m-s> 表示Alt+s,<F1> 表示F1。

命令行模式下什么符号表示当前文件名、路径等

在命令行模式下:

% 当前完整的文件名
%:h 文件名的头部(header),即文件目录.例如../path/test.c就会为../path
%:t 文件名的尾部(tail).例如../path/test.c就会为test.c
%:r 无扩展名的文件名.例如../path/test就会成为test
%:e 扩展名

. 当前目录,是:pwd查询出来的当前路径,不是当前文件所在的目录

<cword> 当前光标下的单词
<cWORD> 当前关闭下的字串

global命令

global命令的语法是:
:{range}[v]g[lobal][!]/pattern/Ex cmd
{range} 表示范围
[v][!] 表示反义
Ex cmd 表示Ex命令,但是注意的是:a``:i这两个添加和插入的编辑命令无法与global配合。

Tips:Ex cmd可以使用:normal命令接上各种normal命令实现删除、修改、插入、添加、跳转等复杂操作。

terminal

如何进入或退出terminal?
:terminal 或 : ter 进入终端
在终端中输入exit退出终端

如何进入terminal普通模式或插入模式?
CTRL-W N 或 CTRL-\ CTRL-N 进入普通模式
在普通模式下按 i 或 a 进入插入模式

增强插件:https://github.com/skywind3000/vim-terminal-help

二进制编辑

:%!xxd 打开二进制编辑
:%!xxd -r 返回正常编辑

一些有趣的命令

gi 	# 在normal模式下直接进入编辑模式,并定位到上次编辑的位置
ge 	# 移动到上个单词词尾
`. 	# 反引号+句点,移动到上次编辑(包括删除)的位置(定位到某列)
'. 	# 单引号+句点,移动到上次编辑(包括删除)的行
`^ 	# 反引号+^,移动到上次插入(进入插入模式)的位置
'^ 	# 单引号+^,移动到上次插入(进入插入模式)的行
( 	# 向前移动1个句子(句点或空行分隔)
) 	# 向后移动1个句子(句点或空行分隔)
{ 	# 向前移动1个段落(空行分隔)
} 	# 向后移动1个段落(空行分隔)
gk 	# 向上移动1个屏幕行
gj 	# 向下移动1个屏幕行
:registers          # 显示所有寄存器内容
"?yy                # 复制当前行到寄存器 ? ,问号代表 0-9 的寄存器名称
"?d3j               # 删除光标下三行内容,并放到寄存器 ? 
"?p                 # 将寄存器 ? 的内容粘贴到光标后
"?P                 # 将寄存器 ? 的内容粘贴到光标前
:set paste          # 允许粘贴模式,避免粘贴时自动缩进影响格式
:set nopaste        # 禁止粘贴模式
Ex的copy命令, copy 可缩写为 :co 或 :t
:3,5t.              # 把第 3 行到第 5 行的内容复制到当前行下方
:'<,'>t0            # 把高亮选中的行复制到文件开头
ab                  # 操作一个块,从 [( 至 ])(b: block)
aB                  # 操作一个大块,从 [{ 到 ]}(B: Block)
ib                  # 操作内含块,从 [( 到 ])(b: block)
iB                  # 操作内含大块,从 [{ 到 ]} (B: Block)
在normal和插入模式下:
<S+Up>              # 按住 <Shift> 上档键再按 <Up> 方向键,向上翻页
<S+Down>            # 按住 <Shift> 上档键再按 <Down> 方向键,向下翻页
<S+Left>            # 按住 <Shift> 上档键再按 <Left> 方向键,向左移动一个单词
<S+Right>           # 按住 <Shift> 上档键再按 <Right> 方向键,向右移动一个单词
插入模式下:
Ctrl+R 0            # 插入寄存器(内部 0 号剪贴板)内容,Ctrl+R 后可跟寄存器名
Ctrl+R "            # 插入匿名寄存器内容,相当于插入模式下 p 粘贴
Ctrl+R =            # 插入表达式计算结果,等号后面跟表达式
Ctrl+R :            # 插入上一次命令行命令
Ctrl+R /            # 插入上一次搜索的关键字
Ctrl+n              # 插入模式下文字自动补全 
Ctrl+P              # 插入模式下文字自动补全
Ctrl+e              # 有补全列表时,终止这次补全,继续输入
可视模式下:
o                   # 跳转到标记区的另外一端
O                   # 跳转到标记块的另外一端
v                   # 切换到面向字符的可视模式
V                   # 切换到面向行的可视模式
Ctrl+V              # 切换到面向列块的可视模式
gv                  # 重选上次的高亮选区
g Ctrl+G            # 显示所选择区域的统计信息
文件操作:

:e[dit] .           # 打开文件管理器,浏览当前目录下的文件,选中并编辑 
:e[dit]             # 重新载入当前文件  
:E[xplore]          # 打开文件管理器,并显示活动缓冲区所在的目录
:saveas {filename}  # 另存为指定文件
:o {filename}       # 在当前窗口打开另一个文件(o: open)
:on[ly]             # 关闭除光标所在的窗口之外的其他窗口,等效于 Ctrl+W o
:clo[se]            # 关闭光标所在窗口的文件,等效于 Ctrl+W c
:n[ew] {filename}   # 打开一个新的窗口编辑新文件 filename 
:new                # 打开一个新的窗口编辑新文件
:ene[w]             # 在当前窗口创建新文件
:vnew               # 在左右切分的新窗口中编辑新文件
:tabnew             # 在新的标签页中编辑新文件
:fin[d] {file}      # 在 path 当中查找文件 {file} 并编辑之
:f[ile]             # 显示当前文件名及光标位置
:f[ile] {name}      # !重命名当前文件名为 name
:files              # 显示所有的轮换文件名
缓冲区操作:
:bd                 # 删除缓存
:badd {filename}    # 将文件添加到缓存列表
:set hidden         # 设置隐藏模式,未保存的缓存可以被切换走,或者关闭
:set nohidden       # 关闭隐藏模式,未保存的缓存不能被切换走,或者关闭
N Ctrl+^            # 切换缓存,先输入数字的缓存编号,再按 Ctrl+6
书签操作:
:marks              # 显示所有书签
ma                  # 保存当前位置到书签 a ,书签名小写字母为文件内,大写全局
'a                  # 跳转到书签 a 所在的行
`a                  # 跳转到书签 a 所在位置
`.                  # 跳转到上一次编辑的行
'A                  # 跳转到全文书签 A
['                  # 跳转到上一个书签
]'                  # 跳转到下一个书签
'<                  # 跳到上次可视模式选择区域的开始
'>                  # 跳到上次可视模式选择区域的结束
ga                  # 显示光标下字符的 ASCII 码或者 Unicode 编码
K                   # 查询光标下单词的帮助
Ctrl+G              # 显示正在编辑的文件名,文件大小和位置信息
Ctrl+R Ctrl+W       # 命令模式下插入光标下单词
Ctrl+Insert         # 复制到系统剪贴板(GVim)
Shift+Insert        # 粘贴系统剪贴板的内容(GVim)
Ctrl+X Ctrl+E       # 插入模式下向上滚屏
Ctrl+X Ctrl+Y       # 插入模式下向下滚屏
:map                # 来查看当前 Vim 配置的 map 快捷键
:inoremap           # 来查看当前 Vim 配置的 inoremap 快捷键
:nnoremap           # 来查看当前 Vim 配置的 nnoremap 快捷键
:set ff=unix        # 设置换行为 unix
:set ff=dos         # 设置换行为 dos
:set ff?            # 查看换行设置
:set nohl           # 清除搜索高亮
:earlier 15m        # 回退到 15 分钟前的文件内容
:%!xxd              # 开始二进制编辑
:%!xxd -r           # 保存二进制编辑
:g/gladiolli/#      # 搜索单词打印结果,并在结果前加上行号

搜索时光标停留在词尾

/fish/e
搜索 fish,并且光标停留在每个匹配的结尾字符上

/fish/e+1
搜索 fish,并且光标停留在每个匹配的结尾字符的后1个字符上

/fish/e-1
搜索 fish,并且光标停留在每个匹配的结尾字符的前1个字符上

/fish/s-1
搜索 fish,并且光标停留在每个匹配的开头字符的前1个字符上

问题

normal、插入模式的中英文输入法切换

for Linux: fcitx.vim
for macos: smartim
for windows: 'lyokha/vim-xkbswitch'

xkb主要是配合neovim使用,Windows下的Gvim比较智能,在切换模式时能够自动切换中英文输入法

综合参考:https://www.zhihu.com/question/25744174/answer/506519877

如何插入一列递增的数列

先在要插入这样递增数列的地方插入一个全文不会重复出现的字母序列,比如我插入的是zcc,然后输入命令
:let i=0 | g/zcc/s//=i/ | let i=i+1

g命令前也可以添加范围,比如230,234g

Neovim字体设置

  1. terminal中的Neovim使用terminal的字体设置
  2. GUI的Neovim
    GUI_QT: 在ginit.vim中使用GuiFont命令设置字体,示例:GuiFont DejaVu Sans Mono for Powerline:h12
    fvim: 在ginit.vim中使用set guifont=Hack:12命令设置字体

在Win10上使用Neovim_QT,按如上方式设置字体后,启动时报错:“XXX is not a fixed pitch font”
可以使用GuiFont!强制设置字体,忽略报错(如果确认字体是等宽的)

如何将global命令搜索到的行拷贝到寄存器

:g/xx/yank A 将搜索到的行拷贝到寄存器a

这里使用A表示追加到寄存器a,相反地使用a表示覆盖到寄存器a,如果使用a的话,只会保留最后一个匹配的行
可以使用Ex命令:reg a查询寄存器a的内容
使用normal命令qaq或者:let @a=''清空寄存器a

如何查看vim normal等各种模式下的原生快捷键

help index

搜索或替换时如何不适用正则表达式?

使用「 \V 」( very nomagic )开关,设置之后除了「 \ 」依然有转义作用,其他元字符都是符号本义,不再有特殊含义。在使用「 \V 」开关后,你就只按照字面内容搜索字符串,不需要考虑除「 \ 」之外的特殊字符。

/\V.       只能匹配到符号「 . 」,无法匹配任意字符
/\V.*      只能匹配符号组合「 .* 」,无法匹配任意字符任意次

显示Tab和行尾空格等

:set list
现在 TAB 键显示为 ^I,而 $显示在每行的结尾,以便你能找到可能会被你忽略的空白字符在哪里。
这样做的一个缺点是在有很多 TAB 的时候看起来很丑。如果你使用一个有颜色的终端,或者使用GUI 模式,Vim 可以用高亮显示空格和TAB。

使用 ‘listchars’ 选项:
:set listchars=tab:>-,trail:-
现在,TAB会被显示成 ">—" 而行尾多余的空白字符显示成 "-"。看起来好多了,是吧?

Tab 宽度设置

tabstop 1个Tab显示为多少个空格,默认是8;
softtabstop 编辑模式下Tab的宽度,比如按退格键,一次性删除全部Tab宽度的空格等
expandtab/noexpandtab 将Tab展开为空格、不展开
shiftwidth 每一级缩进是多少个空格

autocmd FileType python tabstop=4 shiftwidth=4 expandtab 针对Python文件类型,设置Tab相关选项

如果设置了展开Tab,如果需要输入真正的 tab,则输入 Ctrl+V tab

:[range]retab [new_tabstop] 应用新的 tabstop 值,替换所有的 tab,如果设置了expandtab,还会把文件中 tab 都替换成空格。

:%retab! 替换全文中的原有Tab,!表示不止处理行内第一个Tab

posted @ 2021-03-30 17:06  artlers  阅读(137)  评论(0)    收藏  举报