vim操作总结
(TODO: B站上有个叫TheCW的,他的vim配置教程非常好,以后有空可以看看,现在先别折腾vim了,赶紧把预学习阶段过了吧)
一、同一个文件的复制
1.:1,100y复制第一行到第100行的内容
2.:200定位到第200行
3. p将复制的内容贴至201行
二、vi编辑器从一个文件复制到另一个文件
1.先打开这两个文件:vi a1.log a2.log
2.:set number 显示行号
3.:100,200y(复制100行~200行的内容)
4.:n 切换到第二个文件
5.:N 切换到上一个文件
6. p (粘贴即可),将光标移到需要复制的地方,按下P按钮即可。或者:600(切换到第600行),再按下p进行粘贴。
跳到行首: gg
跳到最后一行: S-g
I (大写I):在行首进入insert模式
set nonu:关闭行号
C-O:回到上一次编辑的地方(类似于vscode中的ctrl-alt-'-') NOTE:C-o 也可以
链接:https://www.jianshu.com/p/1ddbcc6aee7a
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
类似的还有 q/ 可以进入搜索历史编辑。
Vim的设计以大多数时间都花在阅读、浏览和进行少量编辑改动为基础,因此它具有多种操作模式:
- 正常模式:在文件中四处移动光标进行修改
- 插入模式:插入文本
- 替换模式:替换文本
- 可视化(一般,行,块)模式:选中文本块
- 命令模式:用于执行命令
x: 删除一个字符
R:进入替换模式
r + <ch>:替换一个字符
v:进入Visual模式
V:进入Visual Line模式
C-v:进入Visual Block模式
tabnew:打开一个新tab
. : 重复之前的编辑
n: 下一个文件
N: 上一个文件
w: 以单词为单位前进
b: 到这个单词(或上一个单词)的词初
e:到词尾
A:到行尾并进入insert模式
0(零):行初
^: 第一个非空格字符
$: 行尾
H,M,L对应屏幕上、中、下部
C-u:上翻
C-d:下翻
C-a:在这一行上找到一个数字,然后给它加1 (NOTE:可以在前面加[count],改变增加的数字)
C-x:在这一行上找到一个数字,然后给它减一 (NOTE:同上)
u: undo
C-r: redo
{行数}G 跳转到{行数}行
%(找到配对,比如找到括号的配对,或者找到/**/的配对)
- 查找:
f{字符}
,t{字符}
,F{字符}
,T{字符}
- 查找/到 向前/向后 在本行的{字符}
,
/;
用于导航匹配
搜索: /{正则表达式}
, n
/ N
用于导航匹配
NOTE:使用?也可以搜索,不过是往反方向搜索
:ls 显示打开的缓存
:sp 分屏(一个缓存可以在多个窗口打开)
编辑
所有你需要用鼠标做的事, 你现在都可以用键盘:采用编辑命令和移动命令的组合来完成。 这就是 Vim 的界面开始看起来像一个程序语言的时候。Vim 的编辑命令也被称为 “动词”, 因为动词可以施动于名词。
i
进入插入模式- 但是对于操纵/编辑文本,不单想用退格键完成
O
/o
在之上/之下插入行d{移动命令}
删除 {移动命令}- 例如,
dw
删除词,d$
删除到行尾,d0
删除到行头。
- 例如,
c{移动命令}
改变 {移动命令}- 例如,
cw
改变词 - 比如
d{移动命令}
再i
- 例如,
x
删除字符(等同于dl
)s
替换字符(等同于xi
)- 可视化模式 + 操作
- 选中文字,
d
删除 或者c
改变
- 选中文字,
u
撤销,<C-r>
重做y
复制 / “yank” (其他一些命令比如d
也会复制)p
粘贴- 更多值得学习的: 比如
~
改变字符的大小写
计数
你可以用一个计数来结合“名词”和“动词”,这会执行指定操作若干次。
3w
向前移动三个词5j
向下移动5行7dw
删除7个词
修饰语
你可以用修饰语改变“名词”的意义。修饰语有 i
,表示“内部”或者“在内“,和 a
, 表示”周围“。
ci(
改变当前括号内的内容ci[
改变当前方括号内的内容da'
删除一个单引号字符串, 包括周围的单引号
自定义 Vim
Vim 由一个位于 ~/.vimrc
的文本配置文件(包含 Vim 脚本命令)。 你可能会启用很多基本 设置。
我们提供一个文档详细的基本设置,你可以用它当作你的初始设置。我们推荐使用这个设置因为 它修复了一些 Vim 默认设置奇怪行为。 在这儿 下载我们的设置,然后将它保存成 ~/.vimrc
.
Vim 能够被重度自定义,花时间探索自定义选项是值得的。你可以参考其他人的在GitHub 上共享的设置文件,比如,你的授课人的 Vim 设置 (Anish, Jon (uses neovim), Jose)。 有很多好的博客文章也聊到了这个话题。尽量不要复制粘贴别人的整个设置文件, 而是阅读和理解它,然后采用对你有用的部分。
扩展 Vim
Vim 有很多扩展插件。跟很多互联网上已经过时的建议相反,你_不_需要在 Vim 使用一个插件 管理器(从 Vim 8.0 开始)。你可以使用内置的插件管理系统。只需要创建一个 ~/.vim/pack/vendor/start/
的文件夹,然后把插件放到这里(比如通过 git clone
)。
以下是一些我们最爱的插件:
- ctrlp.vim: 模糊文件查找
- ack.vim: 代码搜索
- nerdtree: 文件浏览器
- vim-easymotion: 魔术操作
我们尽量避免在这里提供一份冗长的插件列表。你可以查看讲师们的开源的配置文件 (Anish, Jon, Jose) 来看看我们使用的其他插件。 浏览 Vim Awesome 来了解一些很棒的插件。 这个话题也有很多博客文章:搜索 “best Vim plugins”。
安装ACK后,打开vim依然无法使用,一个可行的解决方案是把下面这一行放进.vimrc之中,该方案来源:https://github.com/mileszs/ack.vim/issues/156
let g:ackprg = "(就是path-to-ack)/bin/ack -s -H --nocolor --nogroup --column"
在代码中变量跳转的ctags
【生成tags文件】
安装成功后,要为源码文件生成tags文件,才可享受ctags为阅读代码带来的便利。
$ ctags -R
递归的为当前目录及子目录下的所有代码文件生成tags文件
为某些源码生成tags文件,使用如下命令
$ ctags filename.c filename1.c file.h
或
$ ctags *.c *.h
为了使得字段补全有效,在生成tags时需要一些额外的参数,推荐的c++参数主要是:
ctags -R --c++-kinds=+px --fields=+iaS --extra=+q
其中:
选项c++-kinds 用于指定C++语言的 tags记录类型, --c-kinds用于指定c语言的, 通用格式是 --{language}-kinds
选项 fileds 用于指定每条标记的扩展字段域
extra 选项用于增加额外的条目: f表示为每个文件增加一个条目, q为每个类增加一个条目
【使用方法】
在vim打开源码时,指定tags文件,才可正常使用,通常手动指定,在vim命令行输入:
:set tags=./tags(当前路径下的tags文件)
若要引用多个不同目录的tags文件,可以用逗号隔开
或者,设置 ~/.vimrc,加入一行,则不用手动设置tags路径:
set tags=~/path/tags
若要加入系统函数或全局变量的tag标签,则需执行:
ctags -I __THROW –file-scope=yes –langmap=c:+.h –languages=c,c++ –links=yes –c-kinds=+p --fields=+S -R -f ~/.vim/systags /usr/include /usr/local/include
并且在~/.vimrc中添加(亦可用上面描述的手动加入的方式):
set tags+=~/.vim/systags
这样,便可以享受系统库函数名补全、原型预览等功能了。
如果经常在不同工程里查阅代码,那么可以在~/.vimrc中添加:
set tags=tags;
set autochdir
设置好了tags文件,在定位变量/函数的定义时,最常用的快捷键是:
Ctrl + ]
跳转到变量或函数的定义处,或者用命令
:ta name
而使用快捷组合键
Ctrl + o/t
返回到跳转前的位置。
另外,ctags不会生成局部变量的索引,不过可以使用gd组合键(对光标所在处的word进行快捷查找定位)来定位,也是相当快捷的。
还有很多其它的使用方法,详情参考下面的链接
使用ctags的方法来源:https://blog.csdn.net/hunter___/article/details/81806453
其他程序的 Vim 模式
很多工具提供了 Vim 模式。这些 Vim 模式的质量参差不齐;取决于具体工具, 有的提供了 很多酷炫的 Vim 功能,但是大多数对基本功能支持的很好。
Shell
如果你是一个 Bash 用户,用 set -o vi
。如果你用 Zsh:bindkey -v
。Fish 用 fish_vi_key_bindings
。另外,不管利用什么 shell,你可以 export EDITOR=vim
。 这是一个用来决定当一个程序需要启动编辑时启动哪个的环境变量。 例如,git
会使用这个编辑器来编辑 commit 信息。
Readline
很多程序使用 GNU Readline 库来作为 它们的命令控制行界面。Readline 也支持基本的 Vim 模式, 可以通过在 ~/.inputrc
添加如下行开启:
set editing-mode vi
比如,在这个设置下,Python REPL 会支持 Vim 快捷键。
Vim进阶就不放在这里了,链接在这:https://missing-semester-cn.github.io/2020/editors/
一些我自己总结的vim进阶操作
1. 替换命令
:s/<be replaced>/<replace with> <ENTER> :把光标当前行的第一个<be replaced>替换成<replace with>
:s/<be replaced>/<replace with>/g <ENTER> :把光标当前行的所有<be replaced>替换成<replace with>
:#,#s/old/new/g #,#是行号,表示替换要发挥效用的范围
:%s/old/new/g 替换会在全文件发挥
:%s/old/new/gc 找到全文件里所有出现old的地方,接着会有一个prompt来问你是否去替换这个old为new
2. 外部命令
:!<外部命令> 冒号+感叹号+<外部命令> 可以执行shell命令(一般不会影响到文本内容)
3. 文件操作
: w <另一个文件文件名> 把当前文件的所有文本存到另一个文件里 (还可以配合visual mode,只存一部分内容到另一个文件)
: r <另一个文件名> 把另一个文件的内容复制进当前文本,在光标下。
: r !<外部命令> (可以使用 r !ls 这样的组合,把外部命令的返回结果放进当前文本里)
4. 设置(感觉像是不在.vimrc中的临时设置)
set ic(ignore case):开启在搜索时忽略大小写
set noic:关掉ic
set hls:会把文本中所有匹配表达式的字符串高亮
set incsearch:会展示一个被搜索的词条的部分匹配
/<被搜索的词条>\c 这一次搜索忽略大小写
5. vim窗口操作
C-w, [h,j,k,l] 可以切换到对应的窗口
C-w, [+,-] 加号和减号分别调整窗口高度
C-w, [<,>] 调整窗口宽度
也可以用:resize,:resize 默认会把窗口调到最大 (res是缩写)
vertical resize 可以调节窗口宽度,默认调节到最大
6. help系统里的一些查询方式
command-line editing c_ 这个主要用于查询(shell,不一定启动了vim)命令行环境下的类似vim的行为指令,比如在shell窗口下,使用ctrl-U可以删掉光标之前的所有内容,可以在vim help手册里查到这个快捷键(事实上,也可以在vim的命令行中做同样的事情,而且,在vim的命令行中可以做更多的事情,即,有些手册上提到的东西在shell命令行中不一定存在)
7. 命令行中的快捷键
C-d 显示能够自动补全的单词的列表
8. 标签页tab
对于vim这个 ide来说, 单纯的用 多子窗口 来操作, 感觉还是不够的, 还要结合标签页tab pages来,才能更好的操作.
- 所有关于标签 的 命令行 命令都是 以 :tab开始的, 可以用tab键来查看提示
- 直接的再 普通模式下的 切换标签页 的命令是 gt, gT: go tab
:tabnew 新建标签
vim -p * 为当前目录下所有文件建立标签
在编辑的时候想增加一个标签就可以:tabnew filename (为标签命名)
:tabc 关闭标签, :tabo 关闭其他所有标签 tab other closed
关于切换
:tabfirst 切换到第一个标签
:tablast 切换到最后一个标签
:tabp = tab previous
:tabn = tab next
tabNext {count} 往前切换count个标签
tabnext {count} 切换到第count个标签
tabfind <标签名> 切换到相应标签
查看标签
:tabs tab show, 或者 tab的复数: tabs
:tabe: tab edit : 在标签页中 打开 文件.
来源:https://www.cnblogs.com/bkylee/p/6195396.html
一些小trick
y(复制)后面可以加motion(比如w, e),比如 yw 意思是复制一个单词,y3w意思是复制三个单词
>> 给一行增加缩进 << 给一行减少缩进 前面可以加数字,比如 5>> 意思是给下面5行加缩进
Vim扩展资料
vimtutor
是一个 Vim 安装时自带的教程- Vim Adventures 是一个学习使用 Vim 的游戏
- Vim Tips Wiki
- Vim Advent Calendar 有很多 Vim 小技巧
- Vim Golf 是用 Vim 的用户界面作为程序语言的 code golf
- Vi/Vim Stack Exchange
- Vim Screencasts
- Practical Vim(书籍)
=====================关于.vimrc的一些配置写在下面=======================
1. wrapscan:if set, 当搜索字符串到达文件底,会从文件开头重新搜索
2. 支持鼠标复制粘贴
两种方法
1,set mouse-=a,即可以在vim中用鼠标右键复制粘贴,但只能粘贴在光标的位置,而且光标不能随鼠标移动,有点不方便
来源:https://blog.csdn.net/weixin_40612082/article/details/81283272
2,set mouse+=a,sudo apt-get install vim-gtk3,随后就可以在vim中用鼠标中键复制粘贴,并且光标会随鼠标移动,但是不能从vim复制东西到外面
来源:https://zhuanlan.zhihu.com/p/35771306:
3. 我自己的方法:sudo apt-get install vim-gtk3,随后设置set mouse+=i,此时光标在插入模式时会随着鼠标移动,而在其它模式下,鼠标可以复制内容到外面
4. 来自第四期“一生一芯”的设置:
setlocal noswapfile " 不要生成swap文件
set bufhidden=hide " 当buffer被丢弃的时候隐藏它
colorscheme evening " 设定配色方案
set number " 显示行号
set cursorline " 突出显示当前行
set ruler " 打开状态栏标尺
set shiftwidth=4 " 设定 << 和 >> 命令移动时的宽度为 4
set softtabstop=4 " 使得按退格键时可以一次删掉 4 个空格
set tabstop=4 " 设定 tab 长度为 4
set nobackup " 覆盖文件时不备份
set autochdir " 自动切换当前目录为当前文件所在的目录
set backupcopy=yes " 设置备份时的行为为覆盖
set hlsearch " 搜索时高亮显示被找到的文本
set noerrorbells " 关闭错误信息响铃
set novisualbell " 关闭使用可视响铃代替呼叫
set t_vb= " 置空错误铃声的终端代码
set matchtime=2 " 短暂跳转到匹配括号的时间
set magic " 设置魔术
set smartindent " 开启新行时使用智能自动缩进
set backspace=indent,eol,start " 不设定在插入状态无法用退格键和 Delete 键删除回车符
set cmdheight=1 " 设定命令行的行数为 1
set laststatus=2 " 显示状态栏 (默认值为 1, 无法显示状态栏)
set statusline=\ %<%F[%1*%M%*%n%R%H]%=\ %y\ %0(%{&fileformat}\ %{&encoding}\ Ln\ %l,\ Col\ %c/%L%) " 设置在状态行显示的信息
set foldenable " 开始折叠
set foldmethod=syntax " 设置语法折叠
set foldcolumn=0 " 设置折叠区域的宽度
setlocal foldlevel=1 " 设置折叠层数为 1
nnoremap <space> @=((foldclosed(line('.')) < 0) ? 'zc' : 'zo')<CR> " 用空格键来开关折叠
+set background=dark
+filetype plugin indent on
+set showmatch " Show matching brackets.
+set ignorecase " Do case insensitive matching
+set smartcase " Do smart case matching
+set incsearch " Incremental search
+set hidden " Hide buffers when they are abandoned
==================一些前辈走过的弯路==================================
1. 关于 vim C-] (代码跳转(不一定reliable)) https://blog.51cto.com/ibeyond/922426
2. vim 退格键不能用
两个步骤:
1.去掉讨厌的有关vi一致性模式,避免以前版本的一些bug和局限
set nocompatible
2.backspace有几种工作方式,默认是vi兼容的。对新手来说很不习惯。对老vi 不那么熟悉的人也都挺困扰的。可以用
set backspace=indent,eol,start
来解决。
indent: 如果用了:set indent,:set ai 等自动缩进,想用退格键将字段缩进的删掉,必须设置这个选项。否则不响应。
eol:如果插入模式下在行开头,想通过退格键合并两行,需要设置eol。
start:要想删除此次插入前的输入,需设置这个。
将以上两个命令加到vim的系统配置文件里就可以了。通过vim命令:ver可以看到系统配置文件的位置,一般在/etc/vimrc
参考资料:https://blog.csdn.net/nobody001z/article/details/54407617