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 也可以

Tab/C-I:到一个更新的编辑的地方(类似于vscode中的ctrl-shift-'-')  NOTE:C-i 也可以
C-G:获得光标在当前文件的位置,以及当前文件的状态
C-g:功能和C-G一样
 
作者:ccccxxxxcccc
链接:https://www.jianshu.com/p/1ddbcc6aee7a
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
 
 
查看vim命令行输入过的历史命令
q: 进入命令历史编辑。
类似的还有 q/ 可以进入搜索历史编辑。
来源:https://zhidao.baidu.com/question/1667179229427642867.html
 
========================以下内容来自 第三堂课================================
 

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 设置 (AnishJon (uses neovim), Jose)。 有很多好的博客文章也聊到了这个话题。尽量不要复制粘贴别人的整个设置文件, 而是阅读和理解它,然后采用对你有用的部分。

 

扩展 Vim

Vim 有很多扩展插件。跟很多互联网上已经过时的建议相反,你_不_需要在 Vim 使用一个插件 管理器(从 Vim 8.0 开始)。你可以使用内置的插件管理系统。只需要创建一个 ~/.vim/pack/vendor/start/ 的文件夹,然后把插件放到这里(比如通过 git clone)。

以下是一些我们最爱的插件:

我们尽量避免在这里提供一份冗长的插件列表。你可以查看讲师们的开源的配置文件 (AnishJonJose) 来看看我们使用的其他插件。 浏览 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来,才能更好的操作.

  1. 所有关于标签 的 命令行 命令都是 以 :tab开始的, 可以用tab键来查看提示
  2. 直接的再 普通模式下的 切换标签页 的命令是 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扩展资料

 

 

=====================关于.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

 

 

 

 

 

 

 

 

 

 

 

 

posted @ 2022-02-22 00:53  yinhuachen  阅读(421)  评论(0编辑  收藏  举报