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 
原文地址:https://www.cnblogs.com/zhang-pengcheng/p/4114702.html