将Vim中的行删除并重定向到另一个文件

时间:2011-10-11 01:35:40

标签: vim scripting vi

我想删除说最后10行并将其移动到另一个文件。

我目前所做的是:

  • 以可视模式选择最后10行,
  • 将这些行:'<,'>w写入其他文件
  • 然后删除选定的行。

有没有更有效的方法可以做到这一点?

4 个答案:

答案 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 '>)。