VSCode Vim使用指北

3,404 阅读4分钟

author: 橘子哥
createTime: 2022-02-10 14:58
modificationDate: 星期四 10日 二月 2022 14:58:17
description: 爱好
category: 程序员
smallClass: 开发工具
key: artitle


前言

学习vim 并不是为了它说宣传的能够提高多高多高的效率. 即使打字速度再慢二分之一 , 工期该延期依旧是要延期. 影响工期的从来都是产品飘忽不定的需求, 或者自己对需求的理解错误, 以及和后台的撕逼.

学习vim 单纯的就是好奇这个名气这么大的编辑方式, 就是想要学习学习, 满足自己的好奇行, 更不用说, 全键盘的操作是那么极客的一种方式.

当然能够熟练使用vim之后,真的能够提高自身编码的效率当然是皆大欢喜的.

虽然我自己已经更换到了neovim,但是一开始接触的人,还是推荐在VSCode或者idea中使用vim的模拟器. 所以下面内容的环境是在VSCode vim中.

B站推荐一个UP主薄涛TV, 推荐理由, 图文解说 + 技术栈也是 js/vue, 前端看着亲切. 相互完全不认识.

一、Vim简单使用教程

1. 基本操作

光标移动

h左移光标
j下移光标
k上移光标
l右移光标
w上一次字符
b下一个字符
$行尾
0行首
H页面顶部
M页面中部
L页面底部
gg文件顶部
G文件尾部
ctrl + e滚动窗口下一行
ctrl + y滚动窗口上一行
ctrl + b滚动窗口上一屏
ctrl + f滚动窗口下一屏
ctrl + d滚动窗口上半屏
ctrl + u滚动窗口下半屏幕

复制、粘贴、剪切

yy复制当前文本行
nyy向下复制n行
dd剪切当前行
ndd向下剪切n行
p粘贴至光标后一个字符
P粘贴至光标位置
x剪切光标后一个字符
dw剪切当前单词
yw复制当前单词

可视化模式

v字符选择可视化
V模式行选择可视化
ctrl + v模式块选择
><=右左自动缩进
v + a + {选择最近的花括号里面内容,包括花括号
v + a + (选择最近的括号里面内容
v + i + {选择最近的花括号里面内容
^ + v进入多光标操作

insert 模式

a当前位置后插入字符
A当前行尾插入字符
o当前行新起一行插入字符
O当前行上上一行新起一行插入字符
i当前位置前插入字符
I当前行首插入字符
s删除当前字符,插入字符
cc删除当前哈狗,插入字符
$c当前位置删除当前行之后的内容插入字符

其他常用操作

代码缩进(Normal模式)

操作作用
shift + >向右缩进
shift + <向左缩进

撤销/取消撤销(Normal模式)

操作作用
u撤销上一步操作
ctrl + r恢复刚刚的撤销

起终操作

命令操作对象作用
c + i'、"、(、[、{、<删除操作对象里面的内容,并将光标放到其中
d + i同上删除操作对象里面的内容
y + i同上复制操作对象里面的内容
v + i同上选中操作对象里面的内容

截屏2022-02-10 21.41.22.png

图示截图自B站薄涛TV的指尖飞舞系列, 不懂他是不是原创,但是我是从这位UP上看到的

2. 解决MAC中英文情况下的情况

第一步,安装im-select:

git地址https://github.com/daipeihust/im-select

curl -Ls https://raw.githubusercontent.com/daipeihust/im-select/master/install_mac.sh | sh

有可能会出现错误:

chmod: /usr/local/bin/im-select: No such file or directory

已经很明显了,你没有权限.

chmod 777 /usr/local/bin

给了读写权限之后,再安装就可以解决问题.

第二步, 配置VSCode中的vim配置

{
	"vim.autoSwitchInputMethod.enable": true,
	"vim.autoSwitchInputMethod.defaultIM": "com.apple.keylayout.ABC",
	"vim.autoSwitchInputMethod.obtainIMCmd": "/usr/local/bin/im-select",
	"vim.autoSwitchInputMethod.switchIMCmd": "/usr/local/bin/im-select {im}"
}

上面的ABC是可以更换啊,看你当前英文输入是什么类型的,有可能是US. 第三方输入法一般ABC就行,国行笔记也是ABC.

截屏2022-02-10 22.12.11.png

3. 我的VSCode 中vim的配置

{
  "editor.tabSize": 2,
  // vim
  "vim.useSystemClipboard": true,
  "vim.foldfix": true,
  "vim.smartRelativeLine": true,
  "vim.showMarksInGutter": true,
  "vim.insertModeKeyBindings": [
    {
      "before": ["j", "k"],
      "after": ["<Esc>"]
    },
    {
      "before": ["<leader>", "f"],
      "commands": ["revealInExplorer"]
    }
  ],
  "vim.leader": "<space>",
  "editor.codeActionsOnSave": {
    "source.organizeImports": true // 在保存的时候,自动调整import语句的相关顺序
  },
  "vim.easymotion": true,
  // 解决vim中英文输入切换的问题
  "vim.autoSwitchInputMethod.enable": true,
  "vim.autoSwitchInputMethod.defaultIM": "com.apple.keylayout.ABC",
  "vim.autoSwitchInputMethod.obtainIMCmd": "/usr/local/bin/im-select",
  "vim.autoSwitchInputMethod.switchIMCmd": "/usr/local/bin/im-select {im}",
}

4. vim easyMotion 使用教程

配置

{
  "vim.easymotion": true,
}

快捷键使用

快捷键名称作用
w当前光标往下移动
b当前光标往上移动
f {chart}当前光标往下移动char 字符
s当前光标上下移动
j当前光标往上移动排
k和上面相反

进入easyMotion 之后, 按 q 来退出

5. vim-surround

普通模式

命令说明 + 示例
ds删除括号
ds ""Hello world!" =>
Hello world!
cs替换括号
cs "("Hello world!" =>
(Hello world!)
cS替换括号,括号内文本做新一行
cS "{"Hello world!" =>
{<br />    Hello world!<br />}
ys添加括号(配合vim光标移动)
ys w [Hello world! =>
[Hello] world!
ys w <em EnterHello world! =>
<em>Hello<em> world!
yS添加括号,括号内文本做新一行
yS w [Hello world! =>
[<br />     Hello<br />] world!
yss整行括起来
yss (Hello world! =>
( Hello world! )
ySS整行括起来,括号内文本做新一行
ySS {Hello world! =>
{<br />   Hello world! <br />}
ySS <div EnterHello world! =>
<div><br />   Hello world! <br /><div>
ySs与ySs功能相同

可视模式

命令说明 + 示例
S选中的括起来
选中world: S(Hello world! =>
Hello (world)!
gS选中的括起来,括号内文本做新一行
选中world: gS{Hello world! =>
Hello {<br />   world<br />}!

二、其他遇到的问题(会一直纪录更新)

2.1 mac VSCode 无法快速移动的问题

终端下执行命令:

defaults write com.microsoft.VSCode ApplePressAndHoldEnabled -bool false

复原:

defaults write com.microsoft.VSCode ApplePressAndHoldEnabled -bool true

2.2 已经可以连续移动了,但是移动得太慢

首先配置系统设置中的键盘 按键重复,和重复前延迟都调整到最高

截屏2022-02-10 22.13.21.png

到此为止很多人已经觉得很快了.但是我个人觉得还是不够.此时可以配置命令行.

defaults write NSGlobalDomain KeyRepeat -int 1

0 太快了, 1感觉还行.

2.3 批量修改字符串

有下面这样的代码,

function pushName() {
  return "蚂蚱升天";
}

pushName();

想要修改pushName函数名为getNmae. 在使用vim之前,很简单,ctrl + f 搜索pushName然后进行替换就可以了.

vim中提供了另外一种可能性.

  1. /pushName , 搜索pushName
  2. cgn, 删除并替换pushName为''
  3. getName, 输入

上面三步是一个一组方法,此时我们在使用 . 逗号, 就可以重复一遍. 一个. 逗号就重复一次.

可以一定程度的替换多光标的操作.