缘由:
今天在整理/编辑自己的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
参考链接:
- http://vim.wikia.com/wiki/Mapping_keys_in_Vim_-_Tutorial_(Part_1)
- http://stackoverflow.com/questions/3776117/what-is-the-difference-between-the-remap-noremap-nnoremap-and-vnoremap-mapping #Nice!
- http://learnvimscriptthehardway.stevelosh.com/chapters/03.html
- http://vimdoc.sourceforge.net/htmldoc/map.html
- =
- http://stackoverflow.com/questions/3446320/in-vim-how-to-map-save-to-ctrl-s
- http://unix.stackexchange.com/questions/84534/vim-map-not-working
- http://unix.stackexchange.com/questions/78505/vim-command-mapping-help
- http://www.frankhq.io/blog/2011/10/08/the-difference-between-map-and-noremap-in-vim/
- =
- VIM键盘映射 (Map)
- Vim按键映射
参考解答:
There are six sets of mappings
- For Normal mode: When typing commands.
- For Visual mode: When typing commands while the Visual area is highlighted.
- For Select mode: like Visual mode but typing text replaces the selection.
- For Operator-pending mode: When an operator is pending (after “d”, “y”, “c”, etc.). See below: |omap-info|.
- For Insert mode. These are also used in Replace mode.
- For Command-line mode: When entering a “:” or “/” command.
Vim有6种映射集合,但只要了解最基本的3种,基本上就可以满足日常应用了。
-
Normal mode (常态模式)
运行Vim后进入的就是Normal模式,在这种模式下可以移动鼠标、寻找、替换、编辑指令,但不能输入文字——这与其它编辑器有很大的差别。
-
Insert mode (插入模式)
在Insert 模式下,可以像在其它编辑器中一样输入文字。此时左下角状态列会有“-INSERT-”(-插入-)字样。在Normal模式按下下面的键可以进入Insert 模式:i (在当前字符的前面插入);a (在当前字符的后面插入);o (在当前行的后面添加新的一行);O (在当前行的上面添加新的一行)。
-
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 条评论
学 Vim 时希望早点知道的建议
http://blog.jobbole.com/103343/
`
“这两个命令行一起,使 Vim 对当前行显示绝对行号,而对其它行显示相对行号。
set number
set relativenumber
`
史上最全Vim快捷键键位图 — 入门到进阶
http://cenalulu.github.io/linux/all-vim-cheatsheat/
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
`
为什么vim 映射 不出来,在windows 上面没问题,centos7 上面就有问题 (vim8.0)