Vim中的按键映射


缘由:

今天在整理/编辑自己的Vim的配置文件/etc/vimrc时,在网上看到的一些不错的vimrc配置文件中发现了自定义的mapping:

  • nmap
  • imap
  • vmap
  • map
  • nnoremap

之前听说过Vim的按键映射,自己也用过一些,不过一直都没有较为深入的了解过,这次趁着整理vimrc的机会学习一下Vim的map设置。

搜索关键字:
  • Linux vim map nnoremap
  • linux vim 共享剪贴板
  • linux vim 格式化
  • linux vim配置文件
  • Linux vim multi tab
参考链接:
参考解答:

There are six sets of mappings

  1. For Normal mode: When typing commands.
  2. For Visual mode: When typing commands while the Visual area is highlighted.
  3. For Select mode: like Visual mode but typing text replaces the selection.
  4. For Operator-pending mode: When an operator is pending (after “d”, “y”, “c”, etc.).  See below: |omap-info|.
  5. For Insert mode.  These are also used in Replace mode.
  6. For Command-line mode: When entering a “:” or “/” command.

Vim有6种映射集合,但只要了解最基本的3种,基本上就可以满足日常应用了。

  1. Normal mode (常态模式)

运行Vim后进入的就是Normal模式,在这种模式下可以移动鼠标、寻找、替换、编辑指令,但不能输入文字——这与其它编辑器有很大的差别。

  1. Insert mode (插入模式)

在Insert 模式下,可以像在其它编辑器中一样输入文字。此时左下角状态列会有“-INSERT-”(-插入-)字样。在Normal模式按下下面的键可以进入Insert 模式:i (在当前字符的前面插入);a (在当前字符的后面插入);o (在当前行的后面添加新的一行);O (在当前行的上面添加新的一行)。

  1. Visual mode (反白模式)

在Visual 模式下可以把文字反白起来,此时左下角状态栏会有“-VISUAL-”或“-VISUAL LINE-”或“-VISUAL BLOCK-”字样。在Normal模式下按v或V或Ctrl-v(有什么差别呢?按下v是进入字符选取的virtual模式;按下V是进入行选择的virtual line模式;按下Ctrl-v是进入块选择的virtual block模式)可以进入Visual 模式。

不管是在Insert模式或Visual模式或其它的什么模式,按Esc键都可以返回Normal模式。


按键映射

nmap:映射一个Normal模式下的键,只有在Normal模式这个命令才会生效。

imap:映射一个Insert 模式下的键,只有在Insert 模式这个命令才会生效。

vmap:映射一个Visual模式下的键,只有在Visual模式这个命令才会生效。

==

默认情况下Vim的map映射是递归进行的,除非你显示指定noremap:

:map and :noremap are recursive and non-recursive versions of the various mapping commands.

具体解释如下:

:map j gg
:map Q j
:noremap W j

当你按下j时会被映射到gg,按下Q时也会被映射到gg(先映射到j,然后映射到gg),因为Vim在默认情况下map映射是递归进行的;当你按下W时会被映射到j但不会被继续映射到gg,因为这里我们显示指定了noremap非递归映射。

==常用的Vim按键映射==
"共享剪贴板(后面复制/粘贴操作的前提)
set clipboard=unnamed

"将Tab替换为4空格
:nmap tt :%s/\t/    /g<CR>

"全文复制
:map <C-A> ggVG$"+y

"选中状态下 Ctrl+c 复制 / Ctrl-v 粘贴
:map <C-v> "*pa
:imap <C-v> <Esc>"*pa
:vmap <C-c> "+y

"无论是 normal模式 / insert模式,按 Crtl+s 保存文件
:nmap <c-s> :w<CR>
:imap <c-s> <Esc>:w<CR>a

"自动补全括号
:inoremap ( ()<Esc>i
:inoremap { {}<ESC>i
:inoremap [ []<ESC>i

"在插入模式下快速进行行首/行尾跳转
:imap <C-a> <Esc>^
:imap <C-e> <Esc>$


"在 Tab页 之间切换
:map <F2> :tabp<CR>
:map <F3> :tabn<CR>

"去空行
:nnoremap <F4> :g/^\s*$/d<CR>

"在(normal/insert模式下)按F5插入当前时间
:nnoremap <F5> "=strftime("%F %R")<CR>gP
:inoremap <F5> <C-R>=strftime("%F %R")<CR>

"全文格式化
:map <F12> gg=G

=Update below=

后来,有看到了几篇介绍Vim的mapleader的文章,试了试,果然效率大有提升,遂更新vimrc设置如下:

"Set mapleader
let mapleader=","

"Fast reloading of the /etc/vimrc
map <silent> <leader>ss :source /etc/vimrc<cr>
"Fast editing of /etc/vimrc
map <silent> <leader>ee :e /etc/vimrc<cr>
"When /etc/vimrc is edited, reload it
autocmd! bufwritepost /etc/vimrc source /etc/vimrc

"快速新建Tab
nnoremap <leader>n :tabnew<cr>
"快速保存
nnoremap <leader>w :w<cr>
"快速sudo保存
noremap <silent> <leader>ww :w !sudo tee %<cr>
"Disable highlight when <leader><cr> is pressed
map <silent> <leader><cr> :noh<cr>

"Smart way to move between splited windows
map <C-j> <C-W>j
map <C-k> <C-W>k
map <C-h> <C-W>h
map <C-l> <C-W>l

=EOF=

, ,

《 “Vim中的按键映射” 》 有 4 条评论

  1. CVE-2019-12735:Linux Vim/Neovim编辑器任意代码执行漏洞
    https://www.4hou.com/vulnerable/18598.html
    https://github.com/numirias/security/blob/master/doc/2019-06-04_ace-vim-neovim.md
    `
    研究人员发现Vim 8.1.1365之前版本和Neovim 0.3.6都存在任意代码执行漏洞。研究人员分析发现通过打开伪造的文本文件通过modelines功能来执行任意代码。

    补丁
    Vim patch 8.1.1365
    Neovim patch (released in v0.3.6)

    除了补丁以外,研究人员建议在vimrc 中禁用modelines(方法为:set nomodeline)或禁用modelineexpr来禁止modeline中的表达式。

    打开vim输入:set modeline?检查modelines是否启用。如果vim返回nomodeline,就说明不存在漏洞。如果有漏洞,或想要确保该问题的安全性,可以在vimrc中加入以下代码:
    set modelines=0
    set nomodeline
    `

  2. 为什么vim 映射 不出来,在windows 上面没问题,centos7 上面就有问题 (vim8.0)

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注