zoukankan      html  css  js  c++  java
  • VIM使用系列: 复制并移动文本

      1 5. 复制并移动文本                   *copy-move*
      2 
      3                             *quote*
      4 "{a-zA-Z0-9.%#:-"}  指定下次的删除、抽出和放置命令使用的寄存器
      5             {a-zA-Z0-9.%#:-"} (大写字符使得删除和抽出命令附加到该
      6             寄存器) ({.%#:} 只能用于放置命令)  7 
      8                             *:reg* *:registers*
      9 :reg[isters]        显示所有编号和命名寄存器的内容。但不列出用于 |:redir|
     10             目的地的寄存器。
     11             {Vi 无此功能}
     12 
     13 :reg[isters] {arg}  显示 {arg} 里提到的编号和命名寄存器的内容。例如: >
     14                 :dis 1a
     15 <           显示寄存器 '1' 和 'a'。{arg} 里可以用空格。
     16             {Vi 无此功能}
     17 
     18                             *:di* *:display*
     19 :di[splay] [arg]    和 :registers 相同。{Vi 无此功能}
     20 
     21                             *y* *yank*
     22 ["x]y{motion}       抽出 {motion} 跨越的文本 [到寄存器 x]。如果没有字符被
     23             抽出 (例如,在第一列执行 "y0") 并且 'cpoptions' 里包括
     24             'E' 标志位,这是一个错误。
     25 
     26                             *yy*
     27 ["x]yy          抽出 [count][到寄存器 x] |linewise| 行动作。
     28 
     29                             *Y*
     30 ["x]Y           抽出 [count][到寄存器 x] (等同于 yy,|linewise| 行
     31             动作)。如果你想要 "Y" 执行从光标到行尾的操作 (更合乎逻
     32             辑,但是与 Vi 不兼容),用 ":map Y y$" 33 
     34                             *v_y*
     35 {Visual}["x]y       抽出高亮文本 [到寄存器 x] (关于 {Visual} 见
     36             |Visual-mode|)。{Vi 无此功能}
     37 
     38                             *v_Y*
     39 {Visual}["x]Y       抽出高亮行 [到寄存器 x] (关于 {Visual} 见
     40             |Visual-mode|)。{Vi 无此功能}
     41 
     42                             *:y* *:yank* *E850*
     43 :[range]y[ank] [x]  抽出 [range] 所指定的行 [到寄存器 x]。仅当包含
     44             |+clipboard| 特性时才可以抽出到 "* 或 "+ 寄存器。
     45 
     46 :[range]y[ank] [x] {count}
     47 [range] 的最后一行开始 (缺省: 当前行
     48             |cmdline-ranges|) 抽出 {count} 行 [到寄存器 x] 49 
     50                             *p* *put* *E353*
     51 ["x]p           放置文本 [从寄存器 x] 在光标之后 [count] 次。{Vi: 没有
     52             计数}
     53 
     54                             *P*
     55 ["x]P           放置文本 [从寄存器 x] 在光标之前 [count] 次。{Vi: 没有
     56             计数}
     57 
     58                             *<MiddleMouse>*
     59 ["x]<MiddleMouse>   从一个寄存器放置文本在光标之前 [count] 次。除非另外指
     60             定,否则用 "* 寄存器。
     61             光标停留在新文本的尾部。
     62             只有在 'mouse' 包含 'n' 或者 'a' 时鼠标才会工作。
     63             {Vi 无此功能}
     64             如果你有滚轮鼠标而且经常不小心粘贴了文本,你可以使用以
     65             下映射来关闭鼠标中键粘贴的功能: >
     66                 :map <MiddleMouse> <Nop>
     67                 :imap <MiddleMouse> <Nop>
     68 <           你也许还想要关闭多键击的功能。参见 |double-click|。
     69 
     70                             *gp*
     71 ["x]gp          如同 "p",但光标停留在新文本之后。{Vi 无此功能}
     72 
     73                             *gP*
     74 ["x]gP          如同 "P",但光标停留在新文本之后。{Vi 无此功能}
     75 
     76                             *:pu* *:put*
     77 :[line]pu[t] [x]    放置文本 [从寄存器 x] 在行号 [line] (缺省为当前行) 78             后。它总是 |linewise| 行动作,因而这个命令可以用来把抽
     79             出的块放置在新行上。
     80             如果未指定寄存器,则取决于 'cb' 选项: 如果 'cb' 包含
     81             "unnamedplus",则从 + 寄存器 |quoteplus| 取出,否则如
     82  'cb' 包含 "unnamed",则从 * 寄存器 |quotestar| 取
     83             出,否则,从无名寄存器 |quote_quote| 取出。
     84             寄存器也可以是 '=',跟随一个可选的表达式。表达式继续到
     85             该命令结束为止。你需要在 '|' 和 '"' 字符前加上反斜杠不
     86             让它们终止你的命令行。例如: >
     87                 :put ='path' . ",/test"
     88 <           如果 '=' 之后没有表达式,Vim 使用前一个表达式。用
     89             ":dis =" 你可以看到它。
     90 
     91 :[line]pu[t]! [x]   放置文本 [从寄存器 x] 在行号 [line] (缺省为当前行) 92             前。
     93 
     94 ["x]]p          或                  *]p* *]<MiddleMouse>*
     95 ["x]]<MiddleMouse>  类似 "p",但调整当前行的缩进。只有在 'mouse' 包含 'n'
     96             或者 'a' 时鼠标才会工作。{Vi 无此功能}
     97 
     98 ["x][P          或                  *[P*
     99 ["x]]P          或                  *]P*
    100 ["x][p          或                  *[p* *[<MiddleMouse>*
    101 ["x][<MiddleMouse>  类似 "P",但调整当前行的缩进。只有在 'mouse' 包含 'n'
    102             或者 'a' 时鼠标才会工作。{Vi 无此功能}
    103 
    104 你可以用这些命令把文本从一个地方复制到另一个地方。首先,把文本用抽出、删除或者
    105 修改命令取到一个寄存器里,然后用放置命令把寄存器的内容插入。你可以用这些命令把
    106 文本从一个文件移动到另一个文件,因为 Vim 在切换缓冲区时保留所有的寄存器
    107 (CTRL-^ 命令可用来快捷地切换文件)108 
    109                 *linewise-register* *characterwise-register*
    110 除了 :put 以外,你可以用 "." 重复放置命令,你也可以撤销它们。如果保存到寄存器
    111 文本的命令是 |linewise| 行动作,Vim 把文本插入在光标所在的行之下 ("p") 或之上
    112 ("P")。不然,Vim 把文本插入在光标的之后 ("p") 或之前 ("P")":put" 命令使得
    113 Vim 总是把文本放在下一行。你可以用命令序列 "xp" 来交换两个字母。你可以用 "ddp"
    114 命令序列来交换两行。你还可以用 "deep" 命令交换两个单词 (光标在第一个单词之前的
    115 空白上)。你更可以在放置命令之后用 "']" 或者 "`]" 命令把光标移动到插入文本之
    116 后,或者用 "'[""`[" 把光标移动到文本的开始处。
    117 
    118                         *put-Visual-mode* *v_p* *v_P*
    119 在可视模式下使用如 |p| 或者 |P| 之类的放置命令时,Vim 试图把选择的文本替换成寄
    120 存器的内容。是否工作如你所愿决定于选择的类型和寄存器里文本的类型。对于列块选择
    121 而言,它也决定于列块的大小,和头尾是否在已存在的字符上。(实现细节: 实际上,它
    122 先把寄存器的内容放到选择区之后,再删除选择区的内容。)
    123 前次选择的文本被放在无名寄存器中。如果希望把相同的文本重复放入可视选择区多次,
    124 请选用其它寄存器。例如,先抽出要复制的文本,再可视化选择要替换的文本,然后使用
    125 "0p。重复任意多次均可,而每次无名寄存器都会被改变。
    126 
    127                             *blockwise-register*
    128 如果你使用面向列块的可视模式命令把文本存到寄存器里,文本列块会被插入在当前和其
    129 后的行的当前列之前 ("P") 或之后 ("p")。Vim 使得整个文本列块从同一列开始。这
    130 样,插入的文本看上去和抽出或删除时看起来一样。为了使之可能,Vim 可能需要把一些
    131 <Tab> 字符替换成空格。不过,如果列块的宽度不是 <Tab> 宽度的整数倍并且插入列块
    132 之后文本里包含 <Tab> 的时候,那些文本可能就不会那么整齐。
    133 
    134 注意 在一个面向字符的抽出命令之后,Vim 把光标停留在最接近缓冲区开头的第一个被
    135 抽出的字符之上。这意味着 "yl" 不会移动光标,但是 "yh" 把光标向左移一格。
    136 逻辑:       在 Vi 里 "y" 命令跟一个反向的动作有时不会把光标移动到第一个被
    137         抽出的字符之上,因为屏幕没有刷新。Vim 符合 Posix 的规范,总是
    138         把光标移动到第一个字符之上。
    139 在一个面向行的抽出命令之后,光标放在第一行上,但是列保持不变,所以不必然在第一
    140 个抽出的字符上。
    141 
    142 共有九种类型的寄存器:                   *registers* *E354*
    143 1. 无名寄存器 ""
    144 2. 10 个编号寄存器 "0 到 "9
    145 3. 行内删除寄存器 "-
    146 4. 26 个命名的寄存器 "a 到 "z 或者 "A 到 "Z
    147 5. 四个只读寄存器 ":、".、"% 和 "#
    148 6. 表达式寄存器 "=
    149 7. 选择和拖放寄存器 "*、"+ 和 "~ 
    150 8. 黑洞寄存器寄存器 "_
    151 9. 最近搜索模式寄存器 "/
    152 
    153 1. 无名寄存器 ""                *quote_quote* *quotequote*
    154 "d""c""s""x" 等命令删除或者用 "y" 等抽出命令复制的文本都被 Vim 用来填
    155 充该寄存器,不管是否用到别的专门寄存器 (例如 "xdd)。这就好像无名寄存器是指向最
    156 近使用的那个寄存器的指针一样。使用大写寄存器进行添加时,无名寄存器包含和命名寄
    157 存器相同的文本。'_' 寄存器是一个特例。"_dd 不把删除的文本存在任何寄存器里。
    158 不指定寄存器的放置命令 (p 或 P) 使用无名寄存器的内容。你也可以用 '"' 作为名字
    159 来访问该寄存器。这意味着要输入两个连续的双引号。写入 "" 寄存器将实际写到寄存器
    160 "0 上。{Vi: 寄存器内容在更换文件时丢失,没有 '"'}
    161 
    162 2. 编号寄存器 "0 到 "9          *quote_number* *quote0* *quote1*
    163                     *quote2* *quote3* *quote4* *quote9*
    164 Vim 把抽出和删除命令的文本保存在这些寄存器里。
    165    编号寄存器 0 包含最近抽出的文本,除非该命令用 ["x] 指定了别的寄存器。
    166    编号寄存器 1 包含了最近删除或者修改的文本,除非该命令用 ["x] 指定了别的寄存
    167 器或者该文本小于一行 (该情况下使用行内删除寄存器)。以下移动命令在应用删除操作
    168 符时例外: |%|、|(|、 |)|、|`|、|/|、|?|、|n|、|N|、|{| 和 |}|。这时,总是使用
    169 寄存器 "1 (为了和 Vi 兼容)。如果文本小于一行,同时使用 "- 寄存器。
    170    每来一次新的删除和修改,Vim 把前一次的寄存器 1 的内容复制到寄存器 2,2 到
    171 3,依此类推。而寄存器 9 的内容就丢失了。
    172 {Vi: 编号寄存器的内容在更换文件时丢失;寄存器 0 不存在}
    173 
    174 3. 行内删除寄存器 "-                    *quote_-* *quote-*
    175 该寄存器保存删除不到一行内容的命令的文本,除非该命令用 ["x] 指定了寄存器。
    176 {Vi 无此功能}
    177 
    178 4. 命名寄存器 "a 到 "z 或者 "A 到 "Z            *quote_alpha* *quotea*
    179 Vim 只有在你指定的时候才使用这些寄存器。指定为小写字母时替换原来的内容,指定为
    180 大写字母时附加到原来的内容。如果 'cpoptions' 里有 '>' 标志位,在附加文本前插入
    181 一个换行符。
    182 
    183 
    184 5. 只读寄存器 ":、".、"% 和 "#
    185 它们是 '%'、'#'、':' 和 '.'。你只能在 "p""P"":put" 命令和 CTRL-R 的时候使
    186 用它们。{Vi 无此功能}
    187                         *quote_.* *quote.* *E29*
    188     ".  包含最近插入的文本 (和插入模式命令 CTRL-A 和 CTRL-@ 插入的一
    189         样)。注意: 它不适用于 CTRL-R 在命令行上的操作。它的工作方式稍
    190         有不同,例如,文本是被插入而不是放置的 ('textwidth' 和其它选项
    191         影响插入的内容)。
    192                             *quote_%* *quote%*
    193     "%  包含当前文件名。
    194                             *quote_#* *quote#*
    195     "#  包含轮换文件名。
    196                         *quote_:* *quote:* *E30*
    197     ":  包含最近执行过的命令行。例如: 用 "@:" 重复上次执行过的命令行命
    198         令。只有当一个命令行中至少一个字符是键入的,该寄存器才会保存命
    199         令行的内容。所以,如果命令行完全来自映射,该寄存器保持不变。
    200         {仅当编译时加入 |+cmdline_hist| 特性才有效}
    201 
    202 6. 表达式寄存器 "=              *quote_=* *quote=* *@=*
    203 其实并没有这么一个寄存器可以储存文本,但是这是用来在使用寄存器的命令中使用表达
    204 式的一个方式。表达式寄存器是只读的,你不能把文本放置其中。在 '=' 之后,光标移
    205 到命令行上,这时你可以输入任何的表达式 (见 |expression|)。所有普通的命令行编辑
    206 命令都可以使用,还有一个表达式专门的历史表。当你按回车结束命令行时,Vim 计算表
    207 达式的结果。如果你用 <Esc> 结束,Vim 终止表达式。如果你不输入表达式,Vim 使用
    208 最近的表达式 (和 "/" 命令的处理相似)209 
    210 表达式的计算结果必须是一个字符串。数值结果会自动转化为字符串。对 "p"":put"
    211 命令而言,浮点数结果也会被转化为字符串。如果结果为列表,每个成员被转成字符串,
    212 然后被单独放在一行上。字典、函数引用类型的结果则产生错误信息 (通过 string()213 化)。
    214 
    215 如果 "= 寄存器被 "p" 命令使用,该字符串会在 <NL> 字符处断开。如果该字符串以
    216 <NL> 结尾,则它被视为一个面向行的寄存器。{Vi 无此功能}
    217 
    218 7. 选择和拖放寄存器 "*、"+ 和 "~ 
    219 用这些寄存器来保存和取得 GUI 界面选择的文本。参见 |quotestar| 和 |quoteplus|。
    220 如果剪贴板不存在或者不工作,使用无名寄存器。Unix 上,仅当 |+xterm_clipboard|
    221 特性存在时剪贴板才可用。{Vi 无此功能}
    222 
    223 注意 "* 和 "+ 在 X11 系统上有分别。关于该差别的解释,参见 |x11-selection|。在
    224 MS-Windows 上,"* 和 "+ 的使用实际上是等价的,可见 |gui-clipboard|。
    225 
    226                         *quote_~* *quote~* *<Drop>*
    227 只读的 "~ 寄存器保存最近一次拖放操作放下的文本。如果有什么东西被放到 Vim 上,
    228 "~ 寄存器被填充,<Drop> 虚拟键被激活。如果你需要,你可以重定义该键的映射;缺省
    229 的动作 (适用于所有模式) 是把 "~ 寄存器的内容插入到当前光标位置。{Vi 无此功能}
    230 {仅当编译时加入 |+dnd| 特性才有效,当前只适用于 GTK GUI 版本}
    231 
    232 注意: "~ 寄存器仅用于在 Vim 上拖放普通文本。拖放 URI 列表在内部处理。
    233 
    234 8. 黑洞寄存器 "_                *quote_*
    235 当写到这个寄存器时,什么都不会发生。这可以用来删除文本,而不影响任何正常的寄存
    236 器。从该寄存器读时,什么都不会返回。{Vi 无此功能}
    237 
    238 9. 最近搜索模式寄存器   "/          *quote_/* *quote/*
    239 含有最近搜索的模式。它被 "n" 'hlsearch' 使用。可以用 `:let` 来修改。你可以
    240 改变它使得 'hlsearch' 不经过实际的搜索直接高亮某些匹配。你不能把抽出或者删除命
    241 令的内容放到该寄存器上。搜索方向则可从 |v:searchforward| 得到。
    242 注意 从函数返回时该值被复原 |function-search-undo|。
    243 {Vi 无此功能}
    244 
    245                             *@/*
    246 你可以用 `:let` 命令写到一个寄存器 |:let-@|。例如: >
    247     :let @/ = "the"
    248 
    249 如果你用放置命令而不指定寄存器,Vim 使用上次填充的寄存器 (这也是无名寄存器的内
    250 容)。如果你弄糊涂了,用 `:dis` 命令看看 Vim 会放置什么内容 (该命令显示所有的有
    251 名和无名的寄存器;无名寄存器被标为 '"')。
    252 
    253 下面三个命令总是针对整行工作。
    254 
    255 :[range]co[py] {address}                *:co* *:copy*
    256 [range] 指定的行复制到 {address} 给出的行之下。
    257 
    258                             *:t*
    259 :t          和 :copy 等价。
    260 
    261 :[range]m[ove] {address}            *:m* *:mo* *:move* *E134*
    262 [range] 指定的行移动到 {address} 给出的行之下。
    263 
  • 相关阅读:
    副业收入是我做程序员的2倍!副业这么有 “钱”景,我要考虑转行吗?
    C语言丨const关键字的用法详解
    C/C++学习笔记:C/C++函数调用的方式,你应该要学会这五种
    软件崩溃了,该如何解决? 解决问题的关键要会对症下药!
    C语言丨深入理解volatile关键字
    C语言丨getch(),getche()和getchar()的区别
    学编程的误区——眼高手低,不重视练习!
    通过编写“猜测数字”游戏来探索Linux中的Bash
    零基础想要更快入门Linux?找对方法,让你少奋斗10年!
    VS/VC 出现闪退怎么办?这4个技巧要知道!
  • 原文地址:https://www.cnblogs.com/zhang-pengcheng/p/4114702.html
Copyright © 2011-2022 走看看