VSCode和Idea快捷键记录

本文记录一下在VSCode和IDEA中所配置的快捷键以便查阅:

编辑

1.Ctrl+Shift+D:选中光标位置所在的单词出现。
2.Ctrl+Shift+L:选中光标位置所在单词的所有出现。此时使用ic/d可以实现多光标编辑(VSCode和IDEA中的Vim插件使用i有点问题,可使用c作为替代)
3.Ctrl+Right/Left定位选中单词的下/上一个出现。(VSCode,IDEA中配置快捷键失效)
4.Ctrl+D/U上下移动整个屏幕。
5.gd跳转到函数/变量定义处。
6.ge/gE跳转到下/上一个error处。
7.gm/gM跳转到下/上一个method处。(IDEA)
8.<leader><leader>w/b快速定位光标前后单词。(通过easymotion实现)
9.s+目标单词的前两个字母快速定位光标所在行的目标单词。(通过sneak实现)
10.Ctrl+;输入字母快速定位文件中该字母的出现位置。(通过ace jump插件实现)。
11.Alt+Left/Right跳转到上/下一个跳转位置。
12.gb选中光标所在单词,再次按gb选中和前面单词的下一个出现。按下c或者i可以进行多光标编辑。(IDEA中不起作用)
13.yL复制光标到该行末尾的内容(L已被映射为$);y^复制光标到该行开头的内容(虽然H已被映射为^,但在VSCode中yH不起作用,在Obsidian中起作用)
14.3yy复制光标所在行以及之后的两行共3行。
15.123G跳转到123行。
16.V+j/k快速选中整行。
17.V/pattern+n快速选中当前行到匹配pattern所在行。
18.gv:重新选择刚才选择的块
19.gb:在当前单词处添加光标,重复gb在当前单词的下一个匹配处添加光标。
20.ctrl-v + j/k:选择当前行光标所在字符,j/k选择上下行该光标对应位置字符。
21.选择代码块后,可通过:s/match/replace将代码块中的match替换为replace
22."0p:粘贴使用yy复制的内容,该内容不会被dd覆盖。见参考资料5。
23.J:将下一行和当前行合并,没有对应的K操作。
24.i/a:在光标前后插入,i对应insert,a对应append。
25.ea:在光标所在单词后插入。
26.gU后选中:将选择的文本转换为大写。
27.gu后选中:将选择的文本转换为小写。
28.gh:展示光标所在位置的变量的tooltip(提示)。
29.><,对选择的代码进行缩进。
30.Alt+Shift+F:对文件进行格式化。
31.Alt+鼠标点击,在指定位置创建多光标。
32.在visual模式下选中单词后,按下gb可以选择下一个该单词的出现,从而实现多光标编辑。

参考资料:

  1. vim - How to copy from current position to the end of line in vi - Stack Overflow
  2. VSCode 快捷键备忘
  3. Vim: faster way to select blocks of text in visual mode - Stack Overflow
  4. vim tips and tricks: text selection
  5. copy paste - How to delete (not cut) in Vim? - Stack Overflow

切换

1.<leader>h<leader>l切换tab页。
2.<leader>n定位explorer,通过j/k等选择、新建、重命名文件。(通过NERDTree插件实现)
3.Ctrl+P根据文件名搜索explorer中的所有文件并通过enter打开。
4.~ + 1定位文件进行编辑,~ + 2定位终端窗口。

其它

1.Ctrl+Shift+F全局搜索。
2.Ctrl+,打开settings。
3.F2搜索commands(VSCode)。
4.Ctrl+Shift+R重载窗口(VSCode)。
5.Ctrl+T打开终端。
6.Ctrl+w或者<leader>q关闭当前文件。
7.Ctrl+K+W关闭所有文件。

文本选择(包括选择、删除、替换、复制、缩进)

选择、删除、替换、复制、缩进分别对应v, d, c, y, >。(visual/delete/change/yank/indent)
首先先根据参考资料1理解text object的概念:
以选择模式(v)为例:

解释:
viw:visual select inner a word
di":delete the content which surrounded by ""
1.viw:选中光标所在单词(不包括单词末尾空格/space)。如下图所示:

2.vaw:选中光标所在单词(包括单词末尾空格/space)。如下图所示:

3.viW/vaW:选中更广义的单词(,;等不会中断识别):

上述viw会被,中断。

使用viW则不会被,中断。
4.vis:选中光标所在句子,句子通过.分隔。vas则会多选中末尾一个空格(对代码来说不太好用,但理解s表示句子的概念对理解Vim-surround中的操作有帮助。没有viS/vaS


5.vip:选中光标所在的段落,段落通过空行分割。vap会多选中末尾空行直至下一个段落。(没有viP/vaP


6.vi{:选中光标所在位置外部的第一个{}内的所有内容,不包括{}本身。(vi(, vi[, vi", vi'同理):

7.va{:选中光标所在位置外部的第一个{}内的所有内容,包括{}本身。(vi(, vi[, vi", vi'同理):

8.vit:选中光标所在的HTML tag中的内容。

9.ci(:可以直接修改修改最近的括号中的内容。(参考:我今天刚意识到的超实用 Vim 小技巧_哔哩哔哩_bilibili

PS:将上述的v替换为c/d/y/>可以实现相同范围的选择。

参考资料:

  1. Vim中的重要概念 Text Object_哔哩哔哩_bilibili

Vim-surround

add/change/delete surrounding for content
add:ys [text object] Mark
change:ds Mark
delete:cs srcMark dstMark
add
1.ysiw":给光标所在单词添加""

2.yss":给光标所在行添加""

3.ysip":给光标所在代码段添加""。(注意此处需要i,上述VSCode中yss不需要i,IDEA中需要写ysis,但根据参考资料5该特性并没有在IDEA中实现)

4.ysiw(:给光标所在单词添加(),额外添加空格。(yss(ysip(同理)

5.ysiw):给光标所在单词添加(),不额外添加空格。(yss)ysip)同理)

6.ysiwt p:给光标所在单词添加HTML tag <p></p>。(ysst pysipt p同理)


change
1.cs"':将光标所在单词最近的""变为''

2.cs"{:将光标所在单词最近的""变为{},并添加额外空格。(cs"}不会添加额外空格)

3.cs"t p:将光标所在单词最近的""变为对应HTML tag <p></p>

delete
1.ds":删除光标所在单词最近的""

2.ds{:删除光标所在单词最近的{},并删除周围空格,如果没有则不删除。(ds}不会删除周围空格)

3.dst:删除光标所在单词最近的HTML tag。

参考资料:

  1. 好用的Vim插件Vim-Surround介绍_哔哩哔哩_bilibili
  2. 指尖飞舞:vscode + vim 高效开发(vim-surround)_哔哩哔哩_bilibili
  3. GitHub - tpope/vim-surround: surround.vim: Delete/change/add parentheses/quotes/XML-tags/much more with ease
  4. https://youtrack.jetbrains.com/issue/VIM-769/inbuilt-vim-surround-support-in-ideavim
  5. https://youtrack.jetbrains.com/issue/VIM-2004/Cannot-surround-full-line-using-yss-command

VSCode插件NERDTree

操作如下:

VSCode光标移动到wrap line末尾

参考资料:

  1. cursor movement - How to go to the end of the line even in on a wrapped line? - Vi and Vim Stack Exchange
  2. editor - How do I move to end of line in Vim? - Stack Overflow

VSCode将redo映射为U

  • 打开VSCode中Vim的Ctrl映射
"vim.useCtrlKeys": true,
  • .vimrc中remap
" remap redo to U
nnoremap U <C-r>

参考资料:

  1. Remapping U to redo, C-r to reverse-search : vim

VSCode配置复制粘贴操作

  • 使用p替换在visual mode下选中的text而不会替换剪切板的内容
    .vimrc中添加如下内容:
" delete without yanking
nnoremap <leader>d "_d
vnoremap <leader>d "_d

" replace currently selected text with default register
" without yanking it
vnoremap <leader>p "_dP

PS:在VSCode中生效,在VSCode Insiders中不生效

参考资料:

  1. How do I replace-paste yanked text in vim without yanking the deleted lines? - Super User

多光标编辑

VSCode原生模式

  1. 鼠标定位到目标行目标编辑位置。
  2. Ctrl+Alt+down/up创建多个光标。
  3. right/down更改光标位置
  4. 便可以直接进行多光标编辑
    Vim模式

替换换行符

参考资料:

  1. Search for newline character (\n) in regex mode · Issue #2097 · microsoft/vscode · GitHub

跳转到代码块 (block) 的开头和末尾

1.[[:跳转到上一个顶层代码块(block)的开头。
2.]]:跳转到下一个顶层代码块(block)的开头。
3.[m:跳转到上一个方法/函数(method/function)的开头。
4.]m:跳转到下一个方法/函数(method/function)的开头。

参考资料:

  1. End of python block motion - Vi and Vim Stack Exchange
  2. perl - Move to the beginning of next code block in Vim - Stack Overflow

VSCode Vim Tips

参考资料:

  1. VSCodeVim Tips | paul shen

VSCode Vim重新映射已有的快捷键

nnoremap gb ]]
nnoremap gB [[
nnoremap gm ]m
nnoremap gM [m

参考资料:

  1. How do you remap brackets in vim : r/vim
  2. key mapping - Disable or remove default vim keybinding - Unix & Linux Stack Exchange
  3. Changing default key bindings in vim - Stack Overflow

VSCode vim d键重新映射

vnoremap p P
vnoremap P p
vnoremap d "_d
vnoremap "_d d

参考资料:
1 How do I replace-paste yanked text in vim without yanking the deleted lines? - Super User
copy paste - How to delete (not cut) in Vim? - Stack Overflow
Vim Visual 模式粘贴小知识_哔哩哔哩_bilibili
replace - In Vim is there a way to delete without putting text in the register? - Stack Overflow
copy paste - How to delete (not cut) in Vim? - Stack Overflow

VSCode定位explorer快捷键(shortcut)

Ctrl+0

参考资料:

  1. Is there a shortcut to move focus to the sidebar in Visual Studio Code? - Stack Overflow