📄 map.cnx
字号:
把它们设置为不同, 全局插件和filetype插件的映射冲突的机会也是很小的. 例如, 你可以保持把 "mapleader" 设置为缺省的反斜杠, 并且设置 "maplocalleader" 设置为下划线. *map-<SID>*在一个脚本中有一个特殊关键字叫 "<SID>" 能被用来定义一个局部于脚本中的映射.具体细节请参考 |<SID>|. *<Plug>*叫做 "<Plug>" 的特殊关键字可以用于一个内部映射, 它不于任何键顺序匹配.这在插件中有用 |using-<Plug>|. *<Char>* *<Char->*要以一个字符的十进制, 八进制或十六进制数字映射, 可以使用 <Char> 来构造: <Char-123> character 123 <Char-033> character 27 <Char-0x7f> character 127它可以用来在一个 'keymap' 文件里指定一个 (多字节) 字符. 大小写的区别被忽略. *map-comments*在这些命令的后面不可能放置注释, 因为 '"' 字符被认为是 {lhs} 或 {rhs}的一部分. *map_bar*因为字符 '|' 用来分隔映射命令和后面的命令, 所以包括 '|' 的 {rhs} 要做一些特殊的处理, 有三种方法: use works when example ~ <Bar> '<' is not in 'cpoptions' :map _l :!ls <Bar> more^M \| 'b' is not in 'cpoptions' :map _l :!ls \| more^M ^V| always, in Vim and Vi :map _l :!ls ^V| more^M(这里 ^V 表示 CTRL-V; 要输入一个 CTRL-V 你必需按键两次; 在这里不能使用 <> 符号 "<C-V>").当你使用 'cpoptions' 的缺省设置时三种方式都可以正常工作.当 'b' 出现在 'cpoptions' 中时, "\|" 会被认为是一个映射的结束, 后面的是另一个命令. 这是为了和Vi兼容, 但是当和其它命令比较时有点不合逻辑. *map_return*当你的一个映射包含一个 Ex 命令时, 你需要放置一个行终结符在它后面才能让它执行.在这里推荐推荐使用 <CR> (参考 |<>|). 例如: > :map _ls :!ls -l %<CR>:echo "the end"<CR>在Command-line模式中输入时要避免字符被映射, 可以先输入一个 CTRL-V.在Insert模式中如果 'paste' 选项被打开的话, 映射会被禁止.注意当遇到错误时 (会导致一个错误信息或蜂鸣) 剩下的映射将不会被执行.这是为了保持和Vi兼容.注意这些命令 @zZtTfF[]rm'`"v 的第二个字符 (参数) 和 CTRL-X 不被映射.这样做是为了能够使用所有的命名寄存器和标记, 甚至当同样的名字被映射时也是如此. *map-which-keys*如果你要做一些映射, 你得选择在 {lhs} 中要用哪些键. 你应该避免使用 Vim 命令所使用的那些键. 否则你将不再能使用这些命令了. 下面是一些建议:- 功能键 <F2>, <F3>, 等等.. 和Shift加功能键 <S-F1>, <S-F2>, 等等. 注意 <F1> 已经用做了帮助命令.- Meta键 (和 ALT 键一起按下).- 使用 '_' 或 ',' 字符然后加上任何其它的字符. "_" 和 "," 命令在 Vim 中是存在 的 (参考 |_| 和 |,|), 但你也许永远不会用到它们.- 使用一个键作为其它命令的同义字. 例如: CTRL-P 和 CTRL-N. 使用更多的字符做更多的映射.参考文件 "index" 可以知道哪些键没有被使用从而使映射不会覆盖任何内建的功能.也可使用 ":help {key}^D" 来找出是否一个键已经用于某些命令.({key} 用于指定你要寻找的键, ^D 是 CTRL-D). *map-examples*以下是一些例子 (照字面输入它们, 对于 "<CR>" 你输入四个字符;当 '<' 标志不出现在 'cpoptions' 中时它们能正常工作). > :map <F3> o#include :map <M-g> /foo<CR>cwbar<Esc> :map _x d/END/e<CR> :map! qq quadrillion questions< *map-typing*当你输入一个映射键顺序时 Vim 会比较你的输入. 如果还不匹配, 它会等待更多的字符输入直到可以确定是否匹配. 例如: 如果你映射了 map! "qq", 然后你输入的第一个 'q' 将不会显示在屏幕上直到你输入另一个 'q' 或其它字符. 如果打开了'timeout' 选项 (这是缺省选项) Vim 仅会等待一秒钟 (或者等待 'timeoutlen' 所指定的时间). 然后假设 'q' 已经不会再被输入. 如果你的输入很慢, 或者你的系统很慢, 重置 'timeout' 选项. 或者你可能需要设置 'ttimeout' 选项. *map-keys-fails*有一种情况键编码可能不被识别:- Vim 仅能读取部分的键编码. 通常仅仅是第一个字符. 在某些 Unix 版本的 xterm 上有这种情况.- 键编码后面的字符已经被映射. 举例来说, "<F1><F1>" 或 "g<F1>".其结果是在这种情况下键编码不会被识别, 所以映射失败.有两种方法可以避免这种问题:- 从 'cpoptions' 中删除 'K' 标志. 这会使 Vim 等待功能键剩下的部分.- <F1> 到 <F4> 实际产生的键编码与 <xF1> 到 <xF4> 符合. 这是 <xF1> 到 <F1>, <xF2> 到 <F2> 的映射, 等等, 但是这在映射的另一半不会被 识别. 确认从 <F1> 到 <F4> 的键编码是正确的: > :set <F1>=<type CTRL-V><type F1>< 以四个字符输入 <F1>. "=" 号后面的部分必需以实际的字符输入, 而不是字面的文本.另一种解决方法是在映射中为第二个特殊键使用实际的键编码: > :map <F1><Esc>OP :echo "yes"<CR>不要输入一个真正的 <Esc>, 总之 Vim 将识别键编码并把它替换为 <F1>. *recursive_mapping*如果 {rhs} 中包括了 {lhs} 那么就是一个递归映射. 当 {lhs} 被输入,它会被替换成 {rhs}. 当遇到 {rhs} 中包含的 {lhs} 它会被替换成 {rhs},依此类推.这可能会使一个命令被重复无数次. 这种情况唯一的问题是出错是停止它的唯一方法.有一些宏用来解决这种混乱情况, 看下面的例子. 有一个例外: 如果 {rhs} 以 {lhs}开始, 第一个字符不会被再次映射 (这与 Vi 兼容).例如: > :map ab abcd将执行 "a" 命令并且在文本中插入 "bcd". {rhs} 中的 "ab" 不会被再次映射.如果你要交换两个键的含义应该使用 :noremap 命令. 例如: > :noremap k j :noremap j k这会交换光标上移和光标下移命令.如果使用普通 :map 命令, 并且 'remap' 选项被打开, 映射一直进行直到文本不再是{lhs} 的一部分. 例如, 如果你用: > :map x y :map y xVim 将把 x 替换成 y, 并把 y 替换成 x, 等等. 这种情况会发生'maxmapdepth' 次 (缺省为 1000), 然后 Vim 会给出错误信息 "recursive mapping"(递归映射). *:map-undo*如果你在一个被映射的序列中包含了一个 undo 命令, 将会把文本带回宏执行前的状态这和原始的 Vi 是兼容的, 只要被映射的序列仅包含一个 undo 命令 (原始的 Vi 中被映射的序列有两个 undo 命令是无意义的, 在第一个 undo 处你就会回到文本). *:map-special-keys*有三中方法来映射一个特殊键:1. Vi 兼容的方法: 映射键编码. 通常这是一个以 <Esc> 开头的序列. 要输入一个 这样的映射先输入 ":map " 然后再敲入功能键之前得先输入一个 CTRL-V . 注意 这时键的编码是在 termcap (the t_ options) 里, 它会被自动转换到内部编码并it will 变成映射的第二种方法 (除非 'cpoptions' 里包括了 'k' 标志).2. 第二种方法是为功能键使用内部编码. 要输入这样的映射输入 CTRL-K 并敲要映射 的功能键, 或者使用 "#1", "#2", .. "#9", "#0", "<Up>", "<S-Down>", "<S-F7>", 等等的形式.(参考键表 |key-notation|, 所有从 <Up> 开始的键都可以使用) enter such a mapping type CTRL-K and then hit the function key, or use the form "#1", "#2", .. "#9", "#0", "<Up>", "<S-Down>", "<S-F7>", etc. 头十个功能键能以两种方式被定义: 仅用数字, 比如 "#2", 或者使用"<F>", 如 "<F2>". 两种都代表功能键 F2. "#0" 表示功能键 F10, 用选项 't_f10' 定义, 它在某些键盘上可能是F0. <> 的形式在 'cpoptions' 包含 '<' 标志时不能使用.3. 使用 termcap 条目, 以 <t_xx> 的形式, 这里 "xx" 是 termcap 条目的名字. 任何字串条目都可以使用. 例如: > :map <t_F3> G< 把功能键 13 映射成 "G". 当 'cpoptions' 包括 '<' 标志时这种方式不能使用.第二种和第三种方法的优点是不加修改就可以在不同的终端上使用 (功能键会被转换成相同的内部编码或实际的键编码, 而不论使用何种终端. termcap 必需是正确的才能正常工作, 并且必需使用相同的映射).细节: Vim 首先检查是否从键盘输入的序列是否已被映射. 否的话将试图使用终端键编码 (参考 |terminal-options|). 如果一个终端键编码被找到它会被替换成内部编码.然后再次检查一个映射是否已完成 (因此你也能把一个内部编码映射成其它东西).在脚本文件中写入什么东西取决于识别了什么东西. 如果终端键编码被识别为一个映射它本身的键编码会被写入脚本. 如果它被识别为一个终端编码则在脚本中写入内部编码.==============================================================================2. 缩写 *abbreviations* *Abbreviations*缩写在插入, 替换和命令行模式中使用. 如果你输入一个是缩写的单词, 它会被替换成所表示的东西. 这可以在经常输入的长单词时节省键击. 并且能用它来自动更正经常犯的拼写错误. 例如: :iab ms MicroSoft :iab tihs this有三种类型的缩写:full-id "full-id" 类型由所有键盘字符组成 ('iskeyword' 选项里的字母和字符). 这是最普通的缩写. 例如: "foo", "g3", "-1"end-id "end-id" 类型以一个键盘字符结尾, 但所有其它字符都不是键盘字符. 例如: "#i", "..f", "$/7"non-id "non-id" 类型以一个非键盘字符结尾, 其它字符可以是任意类型, 除了空格 和 Tab. {Vi 不支持这种类型} 例如: "def#", "4/7$"不能被缩写的字串例子: "a.b", "#def", "a b", "_$r"仅当你输入一个非键盘字符时缩写才会被识别. 或者用 <Esc> 退出插入模式或用 <CR>结束一个命令. 结束缩写的非键盘字符被插入到缩写的扩展后面. 一个例外是字符 <C-]>,它用来不插入任何附加字符时扩展一个缩写.例如: > :ab hh hello< "hh<Space>" 被扩展为 "hello<Space>" "hh<C-]>" 被扩展为 "hello"光标前的字符必需和缩写匹配. 每种类型都有一个附加规则:full-id 匹配的前面是一个非键盘字符, 或者是在行或插入的开始. 例外: 当缩写仅 有一个字符时, 如果它前面有一个非键盘字符则不会被识别, 除了空格和 <Tab>.end-id 匹配的前面是一个键盘字符, 或者一个空格或 <Tab>, 或者是行或插入的开始.non-id 匹配的前面是一个空格, <Tab> 或者行或插入的开始.例如: ({CURSOR} 是你输入一个非键盘字符的地方) > :ab foo four old otters< " foo{CURSOR}" 被扩展为 " four old otters" " foobar{CURSOR}" 不被扩展 "barfoo{CURSOR}" 不被扩展> :ab #i #include< "#i{CURSOR}" 被扩展为 "#include" ">#i{CURSOR}" 不被扩展> :ab ;; <endofline>"< "test;;" 不被扩展 "test ;;" 被扩展为 "test <endofline>"要避免在插入模式中避免缩写: 输入缩写的一部分, 以 <Esc> 退出插入模式, 再用 'a'进入插入模式并输入剩下的部分. 或者在缩写之后的字符前面输入 CTRL-V.要在命令行模式中避免缩写: 在缩写的某处输入 CTRL-V 两次来避免它被替换. 此外一个普通字符前面的 CTRL-V 通常会被忽略.把光标移动到缩写的后面是可能的: > :iab if if ()<Left>如果 'cpoptions' 里面包含 '<' 标志时不能正常工作. |<>|你甚至可以做更复杂的事情. 例如, 要消灭一个缩写后面输入的空格: func Eatchar(pat) let c = nr2char(getchar()) return (c =~ a:pat) ? '' : c endfunc iabbr <silent> if if ()<Left><C-R>=Eatchar('\s')<CR>没有缺省的缩写.缩写永远不会递归. 你可以设置 ":ab f f-o-o" 而不会有任何问题. 但是缩写能被映射. {不清除原因, 一些版本的Vi支持递归缩写}'paste' 选项打开时, 缩写被禁止. *:abbreviate-local* *:abbreviate-<buffer>*和映射一样, 缩写可以被局部于一个缓冲之内. 这经常被用于一个|filetype-plugin| 文件. 例如一个 C 插件文件: > :abb <buffer> FF for (i = 0; i < ; ++i)< *:ab* *:abbreviate*:ab[breviate] 列出所有的缩写. 第一栏中的字符表示该缩写作用的模式: 'i' 指插入模式, 'c' 指命令行模式, '!' 指两种模式都有. 这和映射的相同,参看 |map-listing| 。:ab[breviate] {lhs} 列出以 {lhs} 开头的缩写:ab[breviate] {lhs} {rhs} 增加一个从 {lhs} 到 {rhs} 的缩写. 如果 {lhs} 已经存在 则它会被替换成新的 {rhs}. {rhs} 可能包含空格. *:una* *:unabbreviate*:una[bbreviate] {lhs} 从列表中删除 {lhs} 的缩写 *:norea* *:noreabbrev*:norea[bbrev] [lhs] [rhs] 与 ":ab" 一样, 但是不为这个 {rhs} 重映射 {not ni Vi} *:ca* *:cabbrev*:ca[bbrev] [lhs] [rhs] 与 ":ab" 一样, 但仅在命令行模式中使用. {not in Vi} *:cuna* *:cunabbrev*:cuna[bbrev] {lhs} 与 ":una" 一样, 但仅在命令行模式中使用. {not in Vi} *:cnorea* *:cnoreabbrev*:cnorea[bbrev] [lhs] [rhs] 与 ":ab" 一样, 但仅在命令行模式中使用并且不为这个 {rhs} 重映射. {Vi 中没有} *:ia* *:iabbrev*:ia[bbrev] [lhs] [rhs] 与 ":ab" 一样, 但仅在插入模式中使用. {not in Vi} *:iuna* *:iunabbrev*:iuna[bbrev] {lhs} 与 ":una" 一样, 但仅在插入模式中使用. {not in Vi} *:inorea* *:inoreabbrev*:inorea[bbrev] [lhs] [rhs] 与 ":ab" 一样, 但仅在插入模式中使用并且 不为这个 {rhs} 重映射. {not in Vi} *:abc* *:abclear*:abc[lear] 删除所有的缩写. {not in Vi} *:iabc* *:iabclear*:iabc[lear] 为插入模式删除所有的缩写. {not in Vi} *:cabc* *:cabclear*:cabc[lear] 为命令行模式删除所有的缩写. {not in Vi} *using_CTRL-V*在一个缩写的 {rhs} 中使用特殊字符是可能的. CTRL-V 可以用来避免多数非打印字符的特殊含义. 需要输入多少个 CTRL-V 取决于你如何输入缩写. 这在映射中也可以应用.这里使用一个例子说明.假设你需要把 "esc" 缩写为输入一个 <Esc> 字符. 当你在 Vim 中输入":ab" 命令, 你必需这样输入: (这里 ^V 是一个 CTRL-V
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -