使用 vim,如何将一段文本移动到新文件?目前,我这样做:
- 选择文本
- 使用
:w new_file
- 再次选择文本
- 删除文本
有没有更有效的方法来做到这一点?
前
文本文件
sometext
some other text
some other other text
end
后
文本文件
sometext
end
文本文件
some other text
some other other text
答案1
这些自定义命令怎么样:
:command! -bang -range -nargs=1 -complete=file MoveWrite <line1>,<line2>write<bang> <args> | <line1>,<line2>delete _
:command! -bang -range -nargs=1 -complete=file MoveAppend <line1>,<line2>write<bang> >> <args> | <line1>,<line2>delete _
答案2
通过“将一段文本移动到新文件”,我假设您的意思是从当前文件中剪切该段文本并创建一个仅包含该文本的新文件。
各种例子:
:1,1 w new_file
创建一个仅包含第 1 行文本的新文件:5,50 w newfile
创建一个包含第 5 行至第 50 行文本的新文件:'a,'b w newfile
创建一个包含从标记a
到标记的文本的新文件b
- 使用ma并mb在任何你喜欢的地方设置你的标记
上述操作仅复制文本并创建包含该文本的新文件。之后您需要将其删除。
这可以使用相同的范围和d
命令来完成:
:5,50 d
删除第 5 行至第 50 行的文本:'a,'b d
a
删除从一个标记到另一个标记的文本b
或者使用dd单行情况。
如果您使用可视模式选择文本,然后:
在选择文本时点击,您将在命令行上看到以下内容:
:'<,'>
表示选定的文本。然后您可以将命令扩展为:
:'<,'>w >> old_file
这将附加将文本复制到现有文件。然后按上述方法删除。
一句话:
:2,3 d | new +put! "
细分:
:2,3 d
- 删除第 2 至第 3 行|
- 从技术上讲,这会将第一个命令的输出重定向到第二个命令,但由于第一个命令不输出任何内容,我们只是将命令链接在一起new
- 打开一个新的缓冲区+put! "
- 将未命名寄存器的内容("
)放入缓冲区- 标记 (
!
) 是为了放置内容前当前行。这会导致文件末尾出现一个空行。如果没有它,文件顶部就会出现一个空行。
- 标记 (
答案3
根据@embedded.kyle的回答和此问答,我最终用这行代码将选定内容追加到文件并从当前文件中删除。使用 选择几行后Shift+V
,点击:
并运行:
'<,'>w >> test | normal gvd
第一部分附加选定的行。第二条命令进入正常模式并运行gvd
以选择最后一个选择,然后删除。
答案4
选择这些行后,以下内容对我有用
:'<,'>w b.txt | '<,'>d