我想删除说最后10行并将其移动到另一个文件。
我目前所做的是:
:'<,'>w
写入其他文件有没有更有效的方法可以做到这一点?
答案 0 :(得分:4)
您可以改用ex
命令。 e.g。
:1,10w file.name
写下第一行十行
:$-9,$w file.name
写下最后十行(美元符号表示最后一行)
.vimrc
中的以下代码,您可以使用命令:MoveTo file.name
function! MoveLastLines(f)
exe '$-9,$w ' . a:f "write last ten lines to the passed filename
$-9,$d "delete last ten lines
endfunction
command! -nargs=1 -range MoveTo :call MoveLastLines(<f-args>)
<小时/> 在正常模式下,您提到的步骤(
GV9k:w file.name gvd
)在我看来是最有效的。
答案 1 :(得分:4)
您可以通过执行以下操作删除一个步骤:
:!> newfile.txt
这将使用外部命令将行写入给定文件名,同时删除它们,因为没有从命令输出任何内容。
如果您想要附加到文件而不是覆盖它,请使用>>
代替>
。
答案 2 :(得分:1)
将一系列行写入文件并删除它们的简单方法 之后是运行命令
:$-9,$w path | '[,']d
但是,如果文件名不是常数,则频繁使用会很不方便。
以下是使用相同命令实现命令的函数MoveToFile()
名称。整个事情包含以下两个步骤:写一系列行
然后使用:write
命令(请参阅:help :w_f
,:help :w!
,:help :w_a
)
删除该范围。 1
command! -nargs=* -complete=file -range=% -bang -bar MoveToFile
\ :<line1>,<line2>call MoveToFile(<q-args>, <bang>0)
function! MoveToFile(fname, overwrite) range
let r = a:firstline . ',' . a:lastline
exe r 'w' . ' !'[a:overwrite] . fnameescape(a:fname)
exe r 'd'
endfunction
现在您可以使用上面的命令来涵盖所有常见用例。对于 例如,将视觉选择的行范围移动到文件使用映射
:vnoremap <leader>m :MoveToFile
此映射会触发半完成命令调用:MoveToFile
在可视模式下选择的行范围('<,'>
)。你只需要打字
一个文件名,然后点击 Enter 。
如果您经常对缓冲区的最后十行执行此操作,请创建类似的 映射只适用于这种情况:
:nnoremap <leader>m :$-9,$MoveToFile
1 指定的行被删除到默认寄存器中
覆盖以前的内容。删除行而不影响
寄存器将MoveToFile()
中的最后一个命令更改为
exe r 'd_'
在这种情况下,:delete
使用黑洞寄存器(请参阅:help :d
和:help
"_
)而非默认寄存器。
答案 3 :(得分:1)
使用可视模式选择线条时,只需按三个键即可删除只写下的行:d'>
(参见:help '>
)。