Skip to content

Latest commit

 

History

History
489 lines (431 loc) · 16.1 KB

基本用法.md

File metadata and controls

489 lines (431 loc) · 16.1 KB
  1. 回到行首
  • ^ 不带 blank 字符,映射 vim.normalmodekeybindings -> h
  • 0 带托字符
  1. 回到行尾
  • g_ 不带 blank 字符,映射 vim.normalmodekeybindings -> l
  • $ 带托字符
  1. 在行首插入:i
  • 在当前光标前插入:i
  1. 在行尾插入:a,就有 blank 字符
  • 在当前光标后插入:a
  1. 在行前插入:o
  • 在行后插入:o
  1. 复制当前行 yy,复制多行:数字 + yy,比如 2yy,复制 2 行

  2. 删除并复制当前行 dd,删除多行,数字 + dd,比如 2dd,删除 2 行

  3. 黏贴 p:在当前字符或行之后黏贴

  4. 移动到单词的开头:w

  • 移动到字串的开头:w,用空格区分
  1. 移动到单词的结尾:e
  • 移动到字串的结尾:e
  1. 移动到上一个单词的开头:b
  • 移动到上一个字串的开头:b
  1. 移动到上一个单词的结尾:ge

  2. 删除当前光标所在的字符:x

  • 删除当前光标前的字符:x
  1. 删除当前光标所在的字符,并进入 insert 模式:s
  • 删除当前光标所在的行,并进入 insert 模式:s
  1. 替换当前光标所在的字符:r
  • 替换当前光标所在的字符,并往后逐个替换:r
  1. 撤销当前块:u(撤销从进入 insert 模式开始,到返回 normal 模式结束,在此期间输入的内容被被当成一次修改。注意在 insert 模式中,方向键算一次修改)
  • 回退撤销:ctrl - r
  1. 可视化模式:
  • 字符:v
  • 行:v,主要用于处理多行文本
  1. 切换可视区的光标位置:o,在可视化模式中使用

  2. 回到上一次选择位置:gv

  3. 滚动

  • 向下滚动一屏:Ctrl - f,光标会动
  • 向上滚动一屏:Ctrl - b,光标会动
  • 向下滚动半屏:Ctrl - d,光标会动
  • 向上滚动半屏:Ctrl - u,光标会动
  • 向下滚动一行:Ctrl - e,光标不会动
  • 向上滚动一行:Ctrl - y,光标不会动
  • 在可视化模式或 normal 模式中配置向上或向下滚动 5 行 vim.visualModeKeyBindings/vim.normalModeKeyBindings {"before": ["J"], "after": ["5", "j"]}, {"before": ["K"], "after": ["5", "k"]}
  • 将当前行置于屏幕中央:zz
  • 将当前行置于屏幕顶部附近:zt
  • 将当前行置于屏幕底部附近:zb
  • 跳到文件首:gg
  • 跳到文件尾:G
  • 跳到指定行:行数 + gg/行数 + G
  1. 搜索
  • 单行:;重复上一次字符查找命令,,反方向查找上一次字符查找命令
    • 正向移动到下一个字符所在之处:f
    • 反向移动到上一个字符所在之处:F
    • 正向移动到下一个字符之前的位置:t
    • 反向移动到上一个字符之后的位置:T
  • 全局,n:查找下一个,N:查找上一个
    • / 当前光标处向下查找,按回车开始查找
    • ? 当前光标处向下查找,按回车开始查找
      • 输入 / 或 ? 之后,用方向键可以查看历史命令
      • 当前光标往后查找
    • 当前光标往前查找

  1. 多文件跳转
  • 定位
    • 单文件
      • 标记:mm
    • 多文件
      • 标记:mM
    • 跳转
      • ':跳转到标记的行
      • `:跳转到标记的行和列
  • 跳转到定义的地方:gd
  • 跳转
    • 任何大于一个单词或超过当前导航的移动都是一次跳转
    • 命令:vim 保留了你移动前的位置,使用 :jumps 查看
      • ':跳转到标记的行
      • `:跳转到标记的行和列
      • gg
      • /:向后搜索
      • ?:向前搜索
      • n:重复上一次搜索,相同方向
      • N:重复上一次搜索,相反方向
      • gd
      • {:跳转上一个段落(空格区分)
      • }:跳转下一个段落(空格区分)
    • 向后跳:Ctrl - i
    • 向前跳:Ctrl - o
  1. 替换
  • :[range]s[ubsitute]/{pattern}/{string}/[flags]
    • 按回车生效,如果不按回车,当回到 normal 模式时,会取消预览
    • range
      • $:到尾部,:10,$s/vim/haha 回车
        • 和 number, number 一样
      • %:全文,:%s/vim/haha 回车
      • number, number,:10,12s/vim/haha 回车
    • pattern:正则
    • flags
      • g:全文匹配,% 只匹配每行的第一个
      • c:用对话框操作
        • y:yes
        • n:no
        • a:all
        • q:quit
        • l:当前(光标所在位置)
    • 可视化模式下,全部替换
      • '<,'>
  1. 多选
  • gb 选中光标附近的一个单词
    • gb gb gb c 多光标操作
  1. 悬浮显示:gh

  2. 大小写切换

  • normal:guiw gUiw
  • 可视化:u U
  • ~:选中字符,如果是大写切换成小写,如果是小写切换成大写
  1. 注释,normal和可视化通用
  • 当行注释
    • gc - l/h 一行
    • gc - j/k 两行
  • 多行注释
    • gC - iw 一个单词
  1. 窗口切换
  • 分屏
    • 水平分屏: - v
    • 垂直分屏: - s
  • 关闭窗口: - c/q
  • 窗口切换:
    • - w
    • - hjkl
  • 只保留当前窗口,关闭其他窗口: - o
  1. 缩进
  • 向右

  • << 向左
  1. % 匹配括号:(), [], {}
  • v%,快速选中最近一个括号内的内容,需要在括号处

操作说明

  1. vim 语法:操作(operator:c,y,d)+ 数字 + 动作(范围,比如 w,b,h,j,k,l...)
  • 按下操作符会进入 pendding 状态,等待输入动作
  • 往前删除或者复制,从当前光标前一个字符(不包含当前光标)
  • 往后删除或者复制,从当前光标处开始(包含当前光标)
  • 在 pendding 状态下按照 h 和 l 生效,需要映射 vim.operatorpendingmodekeybindings
  • 删除:d
  • 删除并进入 insert 模式:c
  • 复制:y
  1. 文本对象语法:
  • 操作(operator:c,y,d)+(内部/外部)+ 文本对象
  • 可视化模式(v,v,ctrl + v)+(内部/外部)+ 文本对象
  • 内部:i
  • 外部:a
  • 对象:
    • w:一个单词
    • ():一对()
    • b:一对()
    • []:一对[]
    • {}:一对{}
    • b:一对{}
    • <>:一对<>
    • t:xml标签
    • ':一对''
    • ":一对""
    • s:句子,vim 中只有 .、?、! 结尾的是句子
    • p:段落,vim 中用空行隔开
  • 重复上一次的修改:离开 insert 模式之前的最后一次修改记录
    • 增加
    • 删除
    • 修改
  • 核心:一键移动,一键操作
    • diw,移动后用 .
  • 开始录制:qa,a 是寄存器的名字
  • 结束录制:q
    • 规范光标位置,光标不对可能会导致后续操作不对
    • 光标移动的时候,使用相对位置,比如:w、e、textObject 的 f、t
  • :reg a,查看录制好的宏
  • @a,使用刚刚录制的宏
    • @@,调用最后一次录制的宏
    • 5@@,会执行5次
    • 安全机制,报错就会停下来,比如,录制一个对 test 修改的命令,修改页面中所有的 test,但是你不知道页面中有多少个 test,可以用一个比较大的数字,如果找不到 test,宏执行的时候就会报错,就不要我们去数有多少个 test。
    • qA,追加,对 a 寄存器追加命令
    • 修改一个寄存器里面的内容
      • 取出来:
        • "aq
        • :put a
      • 修改:在 vscode 中不生效
        • "ayy
        • "ayw

插件

  1. vim-textobj-arguments 默认开启
  • cia/via 不包含空格和逗号,用于修改参数
  • caa/vaa 包含空格和逗号,用于删除参数
  1. vim-textobj-entire
  • cie/vie 不包括空白符,选中所有内容
  • cae/vie 包括空白符,选中所有内容
  1. vim-easymotion 默认是关闭的,需要手动开启: "vim.easymotion": true, vim 中的 <leader> 键是 \,不太好用,需要改键,"vim.leader": "",
  • <leader>``</leader> w 当前光标后首字母搜索
  • <leader>``</leader> e 当前光标后字母尾部搜索
  • <leader>``</leader> b 当前光标前首字母搜索
  • <leader>``</leader> ge 当前光标前字母尾部搜索
  • <leader>``</leader> j 当前光标后首行字母搜索
  • <leader>``</leader> k 当前光标前首行字母搜索
  • <leader>``</leader> h 当前光标前字母搜索
  • <leader>``</leader> l 当前光标后字母搜索
  • <leader>``</leader>``</leader> j 全局字母搜索
  1. vim-sneak 默认是关闭的,需要手动开启,"vim.sneak": true,
  • s + 2个字符 当前光标后字母搜索
  • s + 2个字符 当前光标前字母搜索 原生的 s 和 s 这个键非常好用,使用了 vim-sneak 之后,原生的 s 和 s 键就没有,考虑到原生的 f 和 f 键功能和 vim-sneak 键功能类似,所以需要改建: // f + 字母,s 的功能不变,大写的用法类似 "vim.normalmodekeybindingsnonrecursive": [ {"before": ["f"], "after": ["s"]}, {"before": ["f"], "after": ["s"]}, {"before": ["s"], "after": ["c", "l"]}, {"before": ["s"], "after": ["^", "c"]} ], // vf + 字母,在可视化模式下没有大写 s 的功能 "vim.visualmodekeybindingsnonrecursive": [ {"before": ["f"], "after": ["s"]}, ], // df + 字母 / df + 字母 "vim.operatorpendingmodekeybindingsnonrecursive": [ {"before": ["f"], "after": ["z"]}, {"before": ["f"], "after": ["z"]}, ],
  1. vim-surround 默认开启
  • cs:将现有的改为需要的
  • ys:添加一个文本外添加一个所需要的
  • ds:删除现有的
  • S:在可视化模式中添加一个所需要的
  1. vim-indent-object:基于缩进选中
  • vii,选中函数 body 部分
  • vai,选中整个函数,但是最后的 } 不会选中
  • vaI,选中整个函数,包括最后的 },但不能在函数声明的地方使用

tips

  1. 切换大写:
  • shift - ~
  • guiw
  1. 切换小写
  • guiw
  1. 基于多行同时编辑:
  • 在可视化模式选中多行
    • 按下 a,在行尾同时编辑
    • 按照 i,在行首同时编辑
  1. vaw/caw
  • 如果一个单词后面有空格,会选择后面的空格,没有的话,会选择前面的空格
  1. f/t
  • 移动的时候用 f
  • c/d 配合 t 使用
  1. 更精确的搜索
  • 操作符(d,c,y) + / + 字符
  1. 删除一个函数
  • daI 删除一个函数,基于 vim-indent-object
    • 改键:在可视化和 normal 中将 aI 映射为 ai
  • V$%d
    • 改键:在 normal 中将 V$%d 映射为 df,d 是 delete,f 是 function
      • 如果函数的参数有多个,且换行了,则无法删除

用 vim 调用 vscode 的命令

  1. 格式化文档: - f - d "vim.normalModeKeyBindingsNonRecursive": [ { "before": ["", "f", "d"], "commands": ["editor.action.formatDocument"] } ]
  2. 变量重命名: - r - n "vim.normalModeKeyBindingsNonRecursive": [ { "before": ["", "r", "n"], "commands": ["editor.action.rename"] } ]
  3. 折叠代码: - [,按 j 往下走,会展开代码,所以配置第二个命令,在折叠后跳到最后一个括号 "vim.normalModeKeyBindingsNonRecursive": [ { "before": ["", "["], "commands": [ { "command": "editor.fold" }, { "command": "vim.remap", "args": { "after": ["$", "%"] } } ] } ]
  4. 展开代码: - ] "vim.normalModeKeyBindingsNonRecursive": [ { "before": ["", "]"], "commands": [{ "command": "editor.unfold" }] } ]
  5. 资源管理器和编辑区域切换 { "key": "ctrl+;", "command": "workbench.view.explorer" }
  6. 终端和编辑区域切换 { "key": "ctrl+'", "command": "workbench.action.focusFirstEditorGroup" }
  7. 在资源管理器中新建文件(当前文件目录) { "key": "a", "command": "explorer.newFile", "when": "filesExplorerFocus && !inputFocus" }
  8. 在资源管理器中新建文件夹(当前文件目录) { "key": "shift+a", "command": "explorer.newFolder", "when": "filesExplorerFocus && !inputFocus" }
  9. 在编辑区中新建文件(当前文件目录) "vim.normalModeKeyBindingsNonRecursive": [ { "before": ["", "a"], "commands": ["explorer.newFile"] }, ]
  10. 在编辑区中新建文件夹(当前文件目录) "vim.normalModeKeyBindingsNonRecursive": [ { "before": ["", "A"], "commands": ["explorer.newFolder"] }, ]
  11. 重命名文件或者文件夹(在资源管理器中) { "key": "Enter", "command": "renameFile", "when": "explorerViewletVisible && filesExplorerFocus && !explorerResourceIsRoot && !explorerResourceReadonly && !inputFocus" }
  12. 删除文件或者文件夹(在资源管理器中) { "key": "Backspace", "command": "deleteFile", "when": "explorerViewletVisible && filesExplorerFocus && !explorerResourceReadonly && !inputFocus" }
  13. 新建新窗口:shirt - command - n
  14. 打开新项目:ctrl - r,按 command 点击项目会用新窗口打开项目
  15. 切换窗口:ctrl - w
  16. 全局搜索:command - shift - f
  17. 搜索文件:command - p
  18. 搜索函数或者变量:command - t,符号:#
  19. 在当前文件中搜索:command - shift - o,: 可以排序,符号:@
  20. 搜索命令: command - shift - p,符号:>
  21. 查看函数的参数:command - shift - space
  22. 触发建议:command - i
  23. 行上下移动:option - up/down
  24. 在下面增加一行:command - enter
  • 在上面增加一行:shift - command - enter
  1. 删除前面的单词:option - delete
  • 删除一个单词(驼峰命名):ctrl - option - delete
  1. 跳转到下一个错误的地方(基于整个工作区):F8
  • 跳转到上一个错误的地方:Shift - F8
  1. 选中所有相同的单词(光标所在的单词):command - F2
  2. 显示/隐藏资源管理器:command - b
  3. md 预览:shift - command - v
  4. 打开系统文件夹:command - k - r
  5. 复制当前文件的路径:command - k - p
  6. 打开终端
  • 改键:
    • 搜索:workbench.action.terminal.toggleTerminal
    • 绑定:command - j
  1. 终端分屏:command - \
  • 如果分屏失败,在设置中搜索:Terminal › Integrated: Split Cwd
    • 将 inherited 改为 initial
  • 分屏切换:
    • 改键:
      • 搜索:workbench.action.terminal.focusNextPane/focusPreviousPane
      • 绑定:ctrl - l/h
  • 关闭终端
    • 改键:
      • 搜索:workbench.action.terminal.kill
      • 绑定:command - q
  • 新建终端
    • 搜索:workbench.action.terminal.new
    • 改键:command - n
  1. 在当前路径下打开 iterm
  • shift - command - c
  • 默认打开 mac 自带的终端
    • 修改为 iterm,在 setting.json 中配置:"terminal.external.osxExec": "iTerm.app"

在 vscode 中使用 git

  1. 打开 git 面板:shift - control - g
  • 改键: { "before": ["", "g", "g"], "commands": ["workbench.view.scm"] }
  1. 将当前文件提交到暂存区
  • 改键: { "before": ["", "g", "s"], "commands": ["git.stage"] }
  1. 暂存区 diff 查看
  • 改键: { "before": ["", "g", "d", "f"], "commands": ["git.openChange"] }
  1. 提交
  • 改键: { "before": ["", "g", "c"], "commands": ["git.commit"] }
  1. 将当前文件从暂存区中撤回
  • 改键: { "before": ["", "g", "u"], "commands": ["git.unstage"] }
  1. 将当前文件改动清除
  • 改键: { "before": ["", "g", "c", "l"], "commands": ["git.clean"] }
  1. 插件推荐:edamagit

vscode 插件

  1. javascript es6 code snippets
  • imp:import second from "first"
  • imd:import {} from "first"
  • fn:function name (){}
  • anfn:()=>{}
  • clg/log:console.log()
  1. vscode snippets 自定义
  1. 重构:
  • ctrl - shift - r 更纯粹,只显示重构相关的信息
  • command - . 会有一些其他信息
  1. Abracadabra 重构的一个插件

  2. hocus pocus 变量先是用,在创建

  3. javascript booster

  4. vspacecode(whichkey)

Vimium C