VIM VSCode

545 阅读4分钟

进入noraml模式

  • q[ 进入Normal
  • Esc
  • :wq 保存并退出
  • :q! 退出不保存

移动游标和屏幕

  • h 左
  • j 下
  • k 上
  • l 右
  • H 行首
  • J 下5行
  • K 上5行
  • L 行尾
  • e 下一个单词尾部(end)
  • ge 上一个单词的尾部
  • w 下一个单词的首部
  • b 上一个单词的首部
  • ctrl + d / f / e 向下移动屏幕 效果依此减弱
  • ctrl + u / b / y 向上移动屏幕 效果依此减弱
  • zz zt zb 将单词置于屏幕中间 、顶部、尾部
  • [number] + gg / G 掉到(number行)、行首、行尾

单游标编辑

  • i 插入至单词首部
  • I 插入至行首
  • a 插入至单词尾部
    • ea 单词尾部插入
  • A 插入至行尾
  • o 插入至下一行
  • O 插入至上一行
  • d 删除保持normal模式
    • dd 删除整行
  • c 删除进入insert模式
    • cw 删除单词
  • x 剪切当前游标字符
  • X 剪切当前游标前一个字符
  • r 替换当前游标
  • R 替换当前游标并且可以连续替换
  • s 删除当前游标并立刻进入insert模式
  • S 删除当前游标前一个字符并立刻进入insert模式
  • y 复制
    • yy 复制整行
  • p 粘贴
  • u 撤销undo
  • Ctrl + r 重做redo

多游标编辑

  • v 进入多选(visual)模式
  • V 行多选
  • Ctrl + v 块多选
  • o 在多选状态下,游标回到进入visual模式时的位置
  • gv 重复上一次多选
  • gh 提示帮助
  • gc/C 单行、多行注释
  • gb 重复使用可以同时选中多个相同的单词,然后一起替换
    • gb + A/I

文本对象

  • 语法
    • operator + range + object
  • 范围
    • i 内
    • a 外
  • 对象
    • b 表示[
    • B 表示{
    • t 表示XML标签
    • w 表示单词
    • s 表示句子
    • p 表示段落
  • 技巧(依赖插件vim-textobj-arguments)
    • daa 删除一个参数
    • cia 修改一个参数

vim-surround

  • c + s + 待删除字符 + 替换字符
  • d + s + 待删除字符
  • y + s + [range] + 命中的字符 + 新增的字符
  • 可视化 + S + 新增的字符

替换字符串

  • 语法
    • :[range]s/oldStr[regex]/str/[flag]
  • range
    • % 全文
    • $ 最后一行
    • number,number
  • flag
    • g 全部
    • c 询问的方式
  • example
    • :6,$s/hello[12]/hi/c

重构

  • leader + fd 格式化文件
  • leader + [ 折叠当前函数
  • leader + vv 定义变量
  • leader + ff 定义函数
  • leader + rn 重命名
  • cmd / ctrl + . 弹出快速修复
  • cmd + i / ctrl + space 弹出修改建议
  • opt / alt + up / down 将当前代码上、下移动
  • opt / alt + backspace 向前删除整个变量
  • opt / alt + ctrl + backspace 向前删除单个单词
  • F8 跳转至错误处
  • cmd / ctrl + F2 选中所有当前选中的单词

User Snippets

搜索查询

  • f / F 移动至下、上一个char
  • t / T 移动至一下、上个char的前一个字符
    • ; 重复搜索向下移动
    • , 重复搜索向上移动
  • / or ? + [up] 向下、上全文搜索 [重复上一次搜索条件]
    • n / N 继续向下、上找
## \?配合正则表达式
# 表示child的字符块
/child\b

# 表示大小敏感
/child\C
    • / # 向下、上查找改单词
  • leader + leader + w / b / e / ge / h / l / k 当前文件emtion模式
  • ctrl + o / i 返回上一次、下一次搜索结果的位置
  • :jumps 查看搜索历史
  • cmd / ctrl + shift + f / j 全局搜索、增加搜索范围
  • cmd / ctrl + p + [>#@:] 所搜文件【命令,函数,成员变量函数,排序】
  • ctrl + tab 切换回最近打开的文件

窗口管理

  • cmd / ctrl + shift + n 打开一个新窗口
  • ctrl + r 打开一个项目
  • cmd / ctrl + shift + w 关闭整个窗口
  • <ctrl-w> + v / s 左右、垂直分屏tab
  • <ctrl-w> + c / o 关闭当前、所有tab
  • <ctrl-w> + hjklw 切换tab
  • shift + 方向键 切换tab

文件管理

  • a / A 新建文件、文件夹,在侧边栏区
  • leader + n + f / d 新建文件、文件夹,在编辑区
  • r 重命名文件
  • d 删除文件

Plugins

重构插件

gui插件

Config

user/settings.json

  "vim.easymotion": true,
  "vim.useSystemClipboard": false,
  "vim.leader": "<Space>",
  "vim.handleKeys": { "<C-c>": false, "<C-x>": false },
  "vim.normalModeKeyBindingsNonRecursive": [
    {
      "before": ["<Leader>", "n", "f"],
      "commands": [
        {
          "command": "explorer.newFile"
        }
      ]
    },
    {
      "before": ["<Leader>", "v", "v"],
      "commands": ["hocusPocus.createVariable"]
    },
    {
      "before": ["<Leader>", "f", "f"],
      "commands": ["hocusPocus.createFunction"]
    },
    {
      "before": ["<Leader>", "n", "d"],
      "commands": ["explorer.newFolder"]
    },
    {
      "before": ["<Leader>", "r", "n"],
      "commands": ["editor.action.rename"]
    },
    {
      "before": ["<Leader>", "]"],
      "commands": [
        {
          "command": "editor.unfold"
        }
      ]
    },
    {
      "before": ["<Leader>", "f", "d"],
      "commands": ["editor.action.formatDocument"]
    },
    {
      "before": ["<Leader>", "["],
      "commands": [
        {
          "command": "editor.fold"
        },
        {
          "command": "vim.remap",
          "args": {
            "after": ["$", "%"]
          }
        }
      ]
    },
    {
      "before": ["<space>", ";"],
      "commands": ["vspacecode.space"]
    }
  ],
  "vim.operatorPendingModeKeyBindings": [
    {
      "before": ["H"],
      "after": ["^"]
    },
    {
      "before": ["L"],
      "after": ["g", "_"]
    }
  ],
  "vim.normalModeKeyBindings": [
    {
      "before": ["H"],
      "after": ["^"]
    },
    {
      "before": ["L"],
      "after": ["g", "_"]
    },
    {
      "before": ["J"],
      "after": ["5", "j"]
    },
    {
      "before": ["K"],
      "after": ["5", "k"]
    }
  ],
  "vim.visualModeKeyBindings": [
    {
      "before": ["H"],
      "after": ["^"]
    },
    {
      "before": ["L"],
      "after": ["g", "_"]
    },
    {
      "before": ["J"],
      "after": ["5", "j"]
    },
    {
      "before": ["K"],
      "after": ["5", "k"]
    }
  ],
  "vim.visualModeKeyBindingsNonRecursive": [
    {
      "before": ["<space>", ";"],
      "commands": ["vspacecode.space"]
    }
  ]

keybindings.json

  {
    "key": "ctrl+shift+u",
    "command": "editor.action.transformToUppercase"
  },
  {
    "key": "shift+alt+u",
    "command": "editor.action.transformToLowercase"
  },
  {
    "key": "ctrl+;",
    "command": "workbench.view.explorer",
    "when": "viewContainer.workbench.view.explorer.enabled"
  },
  {
    "key": "ctrl+'",
    "command": "workbench.action.focusFirstEditorGroup"
  },
  {
    "key": "a",
    "command": "explorer.newFile",
    "when": "filesExplorerFocus && !inputFocus"
  },
  {
    "key": "shift+a",
    "command": "explorer.newFolder",
    "when": "filesExplorerFocus && !inputFocus"
  },
  {
    "key": "r",
    "command": "renameFile",
    "when": "explorerViewletVisible && filesExplorerFocus && !explorerResourceIsRoot && !explorerResourceReadonly && !inputFocus"
  },
  {
    "key": "d",
    "command": "deleteFile",
    "when": "explorerViewletVisible && filesExplorerFocus && !explorerResourceReadonly && !inputFocus"
  },
  {
    "key": "shift+up",
    "command": "vim.remap",
    "when": "vim.mode=='Normal'",
    "args": {
      "after": ["<c-w>", "k"]
    }
  },
  {
    "key": "shift+down",
    "command": "vim.remap",
    "when": "vim.mode=='Normal'",
    "args": {
      "after": ["<c-w>", "j"]
    }
  },
  {
    "key": "shift+left",
    "command": "vim.remap",
    "when": "vim.mode=='Normal'",
    "args": {
      "after": ["<c-w>", "h"]
    }
  },
  {
    "key": "shift+right",
    "command": "vim.remap",
    "when": "vim.mode=='Normal'",
    "args": {
      "after": ["<c-w>", "l"]
    }
  },
  {
    "key": "ctrl+cmd+\\",
    "command": "workbench.action.splitEditorUp"
  }

参考资料