vscode Vim 与 终端 Vim 配置

记录我的 ubuntu 终端 vim 与 vscode vim 插件的配置与使用。

终端 vim 效果如下:

vim

我的 vscode vim 配置

以下是我的 vscode vim json 配置文件,修改了退出插入模型、快速换行、 leader 快捷键、窗口跳转等。
自我感觉如下配置的使用体验还是比较丝滑的,通过同时修改 vscode vim 与 vscode 的快捷键映射能够实现 Ctrl + h/j/k/l 在 vscode 编辑窗口,终端窗口,文件导航栏之间的快速切换。

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
{
    "workbench.colorTheme": "Default Dark+",
    "window.restoreWindows": "none",
    "explorer.confirmDelete": false,
    "window.openFoldersInNewWindow": "on",
    "code-runner.runInTerminal": true,
    "workbench.editor.enablePreview": false,
    "security.workspace.trust.untrustedFiles": "open",
    "editor.codeActionsOnSave": {},
    "vim.leader": "<space>",
    "vim.digraphs": {},
    "vim.normalModeKeyBindings": [
        {
            "before": [
                "<leader>",
                "<C-r>"
            ],
            "commands": [
                "workbench.action.openRecent",
            ],
        },
        {
            "before": [
                "<leader>",
                "<C-w>"
            ],
            "commands": [
                "workbench.action.closeActiveEditor",
            ],
        },
        {
            "before": [
                "<leader>",
                "<C-b>"
            ],
            "commands": [
                "workbench.action.toggleSidebarVisibility",
            ],
        },
        {
            "before": [
                "<leader>",
                "<C-'>"
            ],
            "commands": [
                "workbench.action.toggleAuxiliaryBar",
            ],
        },
        {
            "before": [
                "<leader>",
                "<C-f>"
            ],
            "commands": [
                "actions.find",
            ],
        },
        {
            "before": [
                "<leader>",
                "f",
                "f"
            ],
            "commands": [
                "editor.action.formatDocument",
            ],
        },
        {
            "before": [
                "<leader>",
                "f",
                "i"
            ],
            "commands": [
                "python.sortImports",
            ],
        },
                {
            "before": [
                "<leader>",
                "<C-a>"
            ],
            "commands": [
                "editor.action.selectAll"
            ]
        },
        {
            "before": [
                "<leader>",
                "<C-c>"
            ],
            "commands": [
                "editor.action.clipboardCopyAction"
            ]
        },
        // insert mode focus on terminal
        {
            "before": [
                "<C-j>"
            ],
            "commands": [
                "workbench.action.terminal.focus"
            ]
        }
    ],
    "vim.insertModeKeyBindings": [],
    "vim.insertModeKeyBindingsNonRecursive": [
        {
            "before": [
                "j",
                "k"
            ],
            "after": [
                "<ESC>"
            ]
        },
        // insert mode focus on terminal
        {
            "before": [
                "<C-j>"
            ],
            "commands": [
                "workbench.action.terminal.focus"
            ]
        }
    ],
    "vim.normalModeKeyBindingsNonRecursive": [

        {
            "before": [
                "J"
            ],
            "after": [
                "5",
                "j"
            ]
        },
        {
            "before": [
                "K"
            ],
            "after": [
                "5",
                "k"
            ]
        },
        {
            "before": [
                "<Leader>",
                "j"
            ],
            "after": [
                "J"
            ]
        },
                {
            "before": [
                "<Leader>",
                "t",
                "n"
            ],
            "commands": [
                ":tabnext"
            ]
        },
        {
            "before": [
                "<Leader>",
                "t",
                "p"
            ],
            "commands": [
                ":tabprev"
            ]
        },
    ],
}

我的 vscode keyboard.json

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
// 将键绑定放在此文件中以覆盖默认值auto[]
[
    {
        "key": "shift+alt+down",
        "command": "-editor.action.insertCursorBelow",
        "when": "editorTextFocus"
    },
    {
        "key": "shift+alt+down",
        "command": "editor.action.copyLinesDownAction",
        "when": "editorTextFocus && !editorReadonly"
    },
    {
        "key": "ctrl+shift+alt+down",
        "command": "-editor.action.copyLinesDownAction",
        "when": "editorTextFocus && !editorReadonly"
    },
    // my KeyBoard
    {
        "key": "ctrl+h",
        "command": "workbench.action.navigateLeft"
    },
    {
        "key": "ctrl+l",
        "command": "workbench.action.navigateRight"
    },
    {
        "key": "ctrl+k",
        "command": "workbench.action.focusActiveEditorGroup",
        "when": "terminalFocus"
    }
]

如上配置后 vscode 中的窗口切换与 vim 的 hjkl 移动相同。

  • Ctrl + h : 向左聚焦窗口
  • Ctrl + l : 向右聚焦窗口
  • Ctrl + j : 移动到 terminal
  • Ctrl + k : 从 terminal 聚焦到 editor
  • 空格 + tp : 从当前编辑器组中向前聚焦标签页
  • 空格 + tn : 从当前编辑器组中向后聚焦标签页

我的 terminal vim 配置:

以下是我的 .vim/vimrc 配置文件,使用 vundle 管理 vim 插件。
插件仓库名称如下:

  • ‘frazrepo/vim-rainbow’ " 彩虹括号
  • ‘scrooloose/nerdtree’ " 树形目录
  • ‘jistr/vim-nerdtree-tabs’ " 树形目录强化插件
  • ‘jiangmiao/auto-pairs’ " 自动补全对称符
  • ‘itchyny/lightline.vim’ " 下方状态栏主体
  • ‘mkitt/tabline.vim’ " tab标签页
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
" unlet! skip_defaults_vim
" source $VIMRUNTIME/defaults.vim

""""""""""
" Vundle 配置
""""""""""

set nocompatible              " be iMproved, required
filetype off                  " required
" set the runtime path to include Vundle and initialize
set rtp+=~/.vim/bundle/Vundle.vim
call vundle#begin()

" alternatively, pass a path where Vundle should install plugins
"call vundle#begin('~/some/path/here')
	
" let Vundle manage Vundle, required
Plugin 'VundleVim/Vundle.vim'

""""""""""
" Vundle 插件
""""""""""

Plugin 'frazrepo/vim-rainbow' " 彩虹括号
Plugin 'scrooloose/nerdtree' " 樹形目錄
Plugin 'jistr/vim-nerdtree-tabs' " 樹型目錄強化
Plugin 'jiangmiao/auto-pairs' " 自動補全對稱符
Plugin 'itchyny/lightline.vim' " 下方状态栏主体
Plugin 'mkitt/tabline.vim' " tab頁籤


" All of your Plugins must be added before the following line
call vundle#end()            " required
filetype plugin indent on    " required


""""""""""
" 插件配置
""""""""""
syntax on
colorscheme onedark " vim 主題

" --lightline-- 主题
set laststatus=2
if !has('gui_running')
  set t_Co=256
endif

let g:lightline = {
      \ 'colorscheme': 'onedark',
      \ }


let g:rainbow_active = 1 " rainbow 主题

let g:tablineclosebutton=1 " tabline 右上角添加关闭

" --NERDTree-- 配置
nnoremap <C-n> :NERDTree<CR>
autocmd VimEnter * NERDTree | wincmd p
let NERDTreeAutoCenter=1
let NERDTreeShowHidden=1
let NERDTreeWinSize=31
let g:nerdtree_tabs_open_on_console_startup=1
let NERDTreeShowBookmarks=1
" let NERDTreeIgnore=['\.pyc','\~$','\.swp']
let NERDTreeQuitOnOpen=0
let g:NERDTreeChDirMode=2
let NERDTreeMapActivateNode='<space>'
let g:NERDSpaceDelims = 1
let g:NERDDefaultAlign = 'left'
let g:NERDCompactSexyComs = 1

""""""""""
" 基礎配置
""""""""""

syntax on " 支持語法高亮
set laststatus=2 " 永遠開啟狀態列
set encoding=utf-8 " 支持utf8
set termencoding=utf-8
set fillchars+=stl:\ ,stlnc:\
set term=xterm-256color " 支持256色
set t_Co=256
set noautoindent " 關閉自動縮排
set number " 開啟行數
set hlsearch " 高亮搜索
set incsearch " 開啟全域搜索
set ignorecase " 搜索無視大小寫
set cursorline " 高亮所在行
set expandtab " tab 轉為空格
set tabstop=4 " tab 輸出兩個空格
set mouse=a " 支持滑鼠
set wildmenu " 指令提示菜單


" -- 分頁快捷鍵配置 --
" Ctrl + t 開啟分頁
" Ctrl + x 關閉分頁
" Ctrl + hjkl 切換分頁
map  <C-t> :tabnew<CR> 
map  <C-x> :tabclose<CR>
map  <C-k> :tabn<CR>
map  <C-j> :tabp<CR>
map  <C-h> :tabfirst<CR>
map  <C-l> :tablast<CR>

" -- 其他自定义映射 --

" nor模式下
nnoremap J 5j
nnoremap K 5k

" 插入模式下
inoremap jk <ESC>
  • Ctrl w + v 垂直分屏
  • Ctrl w + s 水平分屏
  • Ctrl w + q 退出当前分屏
  • Ctrl w + hjkl 切换分屏

我的作弊码

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
/keyword     //向光标下搜索keyword字符串,keyword可以是正则表达式
?keyword     //向光标上搜索keyword字符串
n            //向下搜索前一个搜素动作
N            //向上搜索前一个搜索动作  

*(#)         //当光标停留在某个单词上时, 输入这条命令表示查找与该单词匹配的下(上)一个单词. 同样, 再输入 n 查找下一个匹配处, 输入 N 反方向查找.
g*(g#)       //此命令与上条命令相似, 只不过它不完全匹配光标所在处的单词, 而是匹配包含该单词的所有字符串.  

:s/old/new           //用new替换行中首次出现的old
:s/old/new/g         //用new替换行中所有的old
:n,m s/old/new/g     //用new替换从n到m行里所有的old
:%s/old/new/g        //用new替换当前文件里所有的old
:%s/\/\/.*$//g       //删除所有注释行末以 // 开头的注释

快速修改数字

normal mode 快速修改数字,插入模式下选中某个数字。
Ctrl a : 加 1
Ctrl x : 减 1

快速大写转换

正常模式下选中单词开头
gUw : 将该单词转换为大写
guw : 转换为小写
gUU : 行转换大写
guu : 行转换小写
~ : 当前字母转换大小写

vim 复制与系统剪切板

vim 复制到系统剪切板的方法:

  1. 选择全文: ggVG
  2. 复制到剪切板: y

vim 从系统剪切板复制到 vim:

  1. 在 norme 模式下
  2. Np

emacs 快捷键

大部分终端编辑器都支持 emacs 快捷键,以下是一些常用的快捷键: 其中 C 表示 Ctrl 键, M 表示 Alt 键, S 表示 Shift 键。

  • ctrl+x ctrl+e 用 编辑器 编辑当前行
  • Ctrl + a 移动光标到行首
  • Ctrl + e 移动光标到行尾
  • Ctrl + u 清除当前行
  • Ctrl + k 删除光标到行尾的所有符
  • Alt + b 移动光标后退一个单词(词首)
  • Alt + f 移动光标前进一个单词(词首)
  • Ctrl + f 光标前进一个字母
  • Ctrl + b 光标后退一个字母
  • Ctrl + xx 当前位置与行首之间光标切换
0%