📄 map.cnx
字号:
*map.txt* For Vim version 6.3b. 原文最后更新: 2004年3月26日 VIM 参考手册 作者: Bram Moolenaar 翻译: con<con@netease.com> VCD主页:http://vimcdoc.sf.net键映射, 缩写和用户定义的命令.本主题在用户手册 |05.3|, |24.7| 和 |40.1| 中有过介绍.1. 键映射 |key-mapping|2. 缩写 |abbreviations|3. 局部映射和函数 |script-local|4. 用户定义的命令 |user-commands|==============================================================================1. 键映射 *key-mapping* *mapping* *macro*键映射用于改变输入键的含义. 最通常的用途是为一个功能键定义成一系列的命令.比如: :map <F2> a<C-R>=strftime("%c")<CR><Esc>这个映射在光标之后追加当前的日期和时间. (in <> notation |<>|)有很多命令用于定义新的映射, 删除映射和列出当前的映射.可以从 |map-overview| 参考不同的 "映射" 形式和相关的模式.{lhs} 表示左手边 *{lhs}*{rhs} 表示右手边 *{rhs}*:map {lhs} {rhs} *:map*:nm[ap] {lhs} {rhs} *:nm* *:nmap*:vm[ap] {lhs} {rhs} *:vm* *:vmap*:om[ap] {lhs} {rhs} *:om* *:omap*:map! {lhs} {rhs} *:map!*:im[ap] {lhs} {rhs} *:im* *:imap*:lm[ap] {lhs} {rhs} *:lm* *:lmap*:cm[ap] {lhs} {rhs} *:cm* *:cmap* 在映射命令作用的模式中把键系列{lhs}映射为{rhs}. 并 且映射后的{rhs}也被进行映射扫描. 这个特性可以用来进 行映射的嵌套和递归.:no[remap] {lhs} {rhs} *:no* *:noremap*:nn[oremap] {lhs} {rhs} *:nn* *:nnoremap*:vn[oremap] {lhs} {rhs} *:vn* *:vnoremap*:ono[remap] {lhs} {rhs} *:ono* *:onoremap*:no[remap]! {lhs} {rhs} *:no!* *:noremap!*:ino[remap] {lhs} {rhs} *:ino* *:inoremap*:ln[oremap] {lhs} {rhs} *:ln* *:lnoremap*:cno[remap] {lhs} {rhs} *:cno* *:cnoremap* 在映射命令作用的模式中把键序列{lhs}映射为{rhs}. 禁 止对映射后的{rhs}进行映射扫描. 这个特性可以避免映射 的嵌套和递归. 通常用于重定义一个命令. {not in Vi}:unm[ap] {lhs} *:unm* *:unmap*:nun[map] {lhs} *:nun* *:nunmap*:vu[nmap] {lhs} *:vu* *:vunmap*:ou[nmap] {lhs} *:ou* *:ounmap*:unm[ap]! {lhs} *:unm!* *:unmap!*:iu[nmap] {lhs} *:iu* *:iunmap*:lu[nmap] {lhs} *:lu* *:lunmap*:cu[nmap] {lhs} *:cu* *:cunmap* 在映射命令作用的模式中删除 {lhs} 的映射. 该映射可能 会在它作用的其它模式中被保留. Note: {lhs} 包含末尾的空格. 该映射取消操作不会生效: :map @@ foo :unmap @@ | print:mapc[lear] *:mapc* *:mapclear*:nmapc[lear] *:nmapc* *:nmapclear*:vmapc[lear] *:vmapc* *:vmapclear*:omapc[lear] *:omapc* *:omapclear*:mapc[lear]! *:mapc!* *:mapclear!*:imapc[lear] *:imapc* *:imapclear*:lmapc[lear] *:lmapc* *:lmapclear*:cmapc[lear] *:cmapc* *:cmapclear* 在映射命令作用的模式中删除所有的映射. {not in Vi} 警告: 这也会删除缺省的映射.:map:nm[ap]:vm[ap]:om[ap]:map!:im[ap]:lm[ap]:cm[ap] 在映射命令作用的的模式中列出所有的键映射. 注意 ":map" 和":map!"是最常用的, 因为它们包括其它模式.:map {lhs} *:map_l*:nm[ap] {lhs} *:nmap_l*:vm[ap] {lhs} *:vmap_l*:om[ap] {lhs} *:omap_l*:map! {lhs} *:map_l!*:im[ap] {lhs} *:imap_l*:lm[ap] {lhs} *:lmap_l*:cm[ap] {lhs} *:cmap_l* 在映射命令作用的模式中列出以 {lhs} 开头的键映射的键系列. {not in Vi}这些命令用于把一个或一个键系列映射成一个字符串.可以用它来在功能键里放置一系列命令, 把一个键转换成另一个, 等等.如何保存和恢复当前映射可以参考 |:mkexrc| . *:map-local* *:map-<buffer>* *E224* *E225*如果这些命令的第一个参数是 "<buffer>" ,映射将只局限于当前的缓冲內. 例如: > :map <buffer> ,w /[.,;]<CR>然后你可以把 ",w" 在另一个缓冲内作另外的映射: > :map <buffer> ,w /[#&!]<CR>局部缓冲映射在全局映射之前被应用. "<buffer>" 参数也可以用于清除映射: > :unmap <buffer> ,w :mapclear <buffer>当一个缓冲被删除时局部映射也会被清除, 但是在它被卸载时不会. 就象本地选项值. *:map-<silent>* *:map-silent*要在定义一个映射时不在命令行里回显, 可以使用 "<silent>" 作为第一个参数, 例如: > :map <silent> ,h /Header<CR>在使用这个映射时搜索字串将不被回显. 被执行的命令的信息仍然会被显示.要把它也关掉, 可以在执行的命令里加入一个 ":silent" : > :map <silent> ,h :exe ":silent normal /Header\r"<CR>提示仍然会给出, 比如使用 inputdialog() 的时候.在一个缩写上使用 "<silent>" 是可能的, 但将会使重绘命令行失败. *:map-<script>* *:map-script*如果给这些命令的第一个参数是 "<script>" 并且它用于定义一个新的映射或缩写,该映射将仅仅重映射 {rhs} 中使用被一个以 "<SID>" 开头的脚本局部定义的映射中的字符.它可以用于避免来自外部的脚本的干扰 (举例来说, 在 mswin.vim 中 CTRL-V 被重新映射 ),但是又使用该脚本中定义的其它映射.Note: ":map <script>" 和 ":noremap <script>" 做同样的事情."<script>" 否决了该命令名. 更推荐使用 ":noremap <script>" ,因为它更清晰的表示了重映射已被 (大多数时候) 禁止. *:map-<unique>* *E226* *E227*如果这些命令的第一个参数是 "<unique>" 并且它用于定义一个新的映射或缩写时该映射或缩写已经存在, 则该命令会失败. 例如: > :map <unique> ,w /[#&!]<CR>当定义一个局部映射, 同时也会检查是否已存在了一个相同的全局映射.这个例子将失败: > :map ,w /[#&!]<CR> :map <buffer> <unique> ,w /[.,;]<CR>"<buffer>", "<silent>", "<script>" 和 "<unique>" 可以以任意顺序被使用.它们必需出现在命令的右边, 并且在任何其它参数的之前边.映 射 与 运 行 模 式有五种映射存在- 对于普通模式: 当输入命令时.- 对于可视模式: 当输入命令并且 Visual 区域已被设置为高亮时.- 对于 Operator-pending mode: 当一个操作符正在进行中 ("d", "y", "c",等等之后) 例如: ":omap { w" 会使 "y{" 和 "yw" 一样, "d{" 和 "dw"一样.- 对于插入模式: 也被用于替换模式.- 对于命令行模式: 当输入一个 ":" 或 "/" 命令时.没有独立针对选择模式的映射. 和可视模式在 |Select-mode-mapping|中的一样.特殊情况:当在普通模式里为一个命令输入一个数时,对 0 的映射就会禁用。这样在输入一个带有0的数字时不会受到对 0 键映射的干扰。 *map-overview* *map-modes*每个映射命令工作的模式概况: 命令: 模式: ~ 普通 可视 Operator-pending ~:map :noremap :unmap :mapclear yes yes yes:nmap :nnoremap :nunmap :nmapclear yes - -:vmap :vnoremap :vunmap :vmapclear - yes -:omap :onoremap :ounmap :omapclear - - yes 插入 命令行 Lang-Arg ~:map! :noremap! :unmap! :mapclear! yes yes -:imap :inoremap :iunmap :imapclear yes - -:cmap :cnoremap :cunmap :cmapclear - yes -:lmap :lnoremap :lunmap :lmapclear yes* yes* yes*原来的 Vi 没有独立针对普通/可视/Operator-pending 模式和插入/命令行模式的映射. 因此 ":map" 和 ":map!" 命令对不同的模式都起作用。在 Vim 中你可以使用 ":nmap",":vmap", ":omap", ":cmap" 和 ":imap" 命令来对每个不同的模式分别定义输入映射。要为普通和可视模式但不包括 Operator-pending 模式输入一个映射, 首先在所有的三个模式中为它定义, 然后为它在 Operator-pending 模式中取消映射: :map xx something-difficult :ounmap xx对于一个可视和 Operator-pending 模式或 普通和 Operator-pending 模式的映射也一样. *language-mapping*":lmap" 定义一个映射应用于:- 插入模式- 命令行模式- 当输入一个搜索模式- 接受一个文本字符作为参数的命令, 比如 "r" 和 "f"- 对于 input() 行通常: 不论何时被输入的字符是缓冲区文本的一部分, 而非一个 Vim 命令字符."Lang-Arg" 不是真正的另外一个模式, 它在这里仅在这种情况下被使用. 载入一个相关语言映射集合的最简单的方法是通过使用 'keymap' 选项.参考 |45.5|. 在插入模式和命令行模式中可以用 CTRL-^ 命令来禁止映射|i_CTRL-^| |c_CTRL-^|. 当开始输入一个普通命令行 (非搜索模式)时, 映射被禁止直到输入一个 CTRL-^. 上次使用的状态在 Insert 模式和搜索模式中被单独记录.Insert 模式的状态也被用于当输入一个字符作为 "f" 或 "t" 之类命令的参数时. 当加入一个 ":lmap" 映射在Insert 模式和搜索模式中这些映射将被打开. 语言映射永远不能应用于已经映射的字符上. 它们仅用于已经输入的字符上.假设语言映射已经完成当输入映射时. *map-multibyte*可以对多字节字符映射, 但只能是整个字符. 不能仅映射第一个字节.这是为了避免下面场景中的问题: :set encoding=latin1 :imap <M-C> foo :set encoding=utf-8对于 <M-C> 的映射是在 latin1 解码中被定义的, 结果是一个 0xc3 字节.如果你在UTF-8解码中输入 ?(0xea <M-a>) 它是双字节 0xc3 0xa1.这个时候你不希望 0xc3 字节被映射, 否则的话将不能输入 ? 字符了. *map-listing*当列出映射时, 前面两栏的字符表示: CHAR MODE ~ <Space> Normal, Visual 和 Operator-pending n Normal v Visual o Operator-pending ! Insert 和 Command-line i Insert l ":lmap" 为 Insert, Command-line 和 Lang-Arg映射 c Command-line在紧跟 {rhs} 会显示一个特殊字符: * 表示它不可重映射 & 表示仅 script-local 映射可以被重映射 @ 表示一个 buffer-local 映射{lhs} 从以后的第一个非空字符到行的末尾(或 '|') 都被认为是 {rhs} 的一部分.这允许 {rhs} 以一个空格结尾.注意: 在 Visual 模式里使用映射时, 你可以使用 "'<" 标记, 它表示当前缓冲区中最后被选中的 Visual 区域的开始 |'<|. *map_backslash*注意在这里仅有 CTRL-V 被提及作为映射和缩写时的一个特殊字符.当 'cpoptions' 不包含 'B', 一个反斜杠也可如 CTRL-V 一样被使用.而且 <> 符号能被完全可以被使用 |<>|.但你不能使用 "<C-V>" 如 CTRL-V 来转换后面的特殊含义.要映射一个反斜杠, 或者在 {rhs} 中使用一个字面意义的反斜杠, 可以使用特殊字符序列 "<Bslash>" . 这可以避免在使用嵌套映射时需要使用双反斜杠. *map-ambiguous*当两个映射以相同的字符顺序开始,它们是含糊的.例如: > :imap aa foo :imap aaa bar当 Vim 读如 "aa", 它将需要取得另外一个字符才能决定是否是 "aa" 或是 "aaa"应该被映射. 这意味这当输入 "aa" 以后映射还不会展开, Vim还在等待另一个字符.如果你输入一个空格, 那么 "foo" 将被插入, 而不是空格. 如果你输入一个 "a",那么 "bar" 将被插入.{Vi does not allow ambiguous mappings} *map_CTRL_C*在 {lhs} 中不可能使用一个 CTRL-C. 你不能映射 CTRL-C.原因是 CTRL-C 必需总是能够中断一个运行中的命令.例外: 当在MS-Windows上使用 GUI 版本时 CTRL-C 能被映射来允许一个Copy命令到剪裁板. 使用 CTRL-Break 来中断 Vim. *map_space_in_lhs*要在 {lhs} 中包含一个空格, 在前面输入一个 CTRL-V (每个空格输入两个 CTRL-Vs). *map_space_in_rhs*如果你需要 {rhs} 以空格开头, 使用 "<Space>". 要与Vi完全兼容 (但不可读),不要使用 |<>| 符号, 在 {rhs} 前面输入一个单独的 CTRL-V(你必需输入 CTRL-V 两次). *map_empty_rhs*你可以通过在一个单独的 CTRL-V (你必需输入 CTRL-V 两次) 后面什么也不输入来建立一个空的 {rhs}. 不幸的是在一个vimrc文件中你不能使用这种方式. *<Nop>*得到一个什么都不做的映射的更容易的一个方法是在 {rhs} 中使用 "<Nop>".仅当 |<>| 符号被允许时这种方法才生效. 例如确保功能键F8什么事情都不做: :map <F8> <Nop> :map! <F8> <Nop> *<Leader>* *mapleader*要定义一个使用 "mapleader" 变量的映射, 可以使用特殊字串 "<Leader>".它会被 "mapleader" 的字串值所替换. 如果 "mapleader" 未设置或为空,则用反斜杠代替, 例如: :map <Leader>A oanother line<Esc>和下面一样: > :map \A oanother line<Esc>但是当: > :let mapleader = ","和下面一样: > :map ,A oanother line<Esc>注意 "mapleader" 的值仅当定义映射时被使用. 后来改变的 "mapleader" 不会影响已定义的映射. *<LocalLeader>* *maplocalleader*和 <Leader> 类似, 除了它使用 "maplocalleader" 而非 "mapleader".<LocalLeader> 用来针对局部于一个缓冲的映射多所使用, 例如: > :map <LocalLeader>q \DoItNow<在一个全局插件里应该使用 <Leader> 而在一个 filetype 插件里应该使用<LocalLeader>. "mapleader" 和 "maplocalleader" 可以是相同的. 尽管如此, 如果你
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -