Vim:如何:获取缓冲区的一部分

时间:2013-11-28 09:42:01

标签: vim

众所周知,我们可以通过:source :so %当前缓冲区。

但有时我想:source只是缓冲区的一部分,而不是整个缓冲区。说,我刚刚在我的.vimrc添加了一些内容,并希望获取该部分内容,但我不想重新提供所有其他内容。

我尝试了选择文字和:so(实际上是:'<,'>so),但它报告说不允许使用范围。那么,怎么办呢?

当然,我可以将所需的部分保存到临时文件并获取它,但它显然很烦人。

4 个答案:

答案 0 :(得分:7)

为什么没有以下映射来获取文件(或范围):

" source the current file
nmap <leader>vs :source %<CR>
" source a visual range
vmap <leader>vs y:@"<CR>

现在,您可以按,vs(如果您的邮件是,),并且选择的范围将被采购,否则,在正常模式下,将获取当前文件。

答案 1 :(得分:5)

您可以定义以下命令,该命令在当前行或传递范围上运行:

":[range]Execute    Execute text lines as ex commands.
"           Handles |line-continuation|.
command! -bar -range Execute silent <line1>,<line2>yank z | let @z = substitute(@z, '\n\s*\\', '', 'g') | @z

答案 2 :(得分:2)

感谢Ingo Karkat,我已经采纳了他的主旨并对其进行了改进。我想改进的地方:

  • 我们必须使用额外的用户指定的命令:Execute而不是标准的:so(好吧,我们可以命名用户指定的命令:So,无论如何,使用新的大写版本是烦人的命令)
  • 副作用很小:执行命令后寄存器@z已损坏。

使用下面的脚本,我们可以像以前一样使用:so {file}命令,我们也可以使用范围::'<,'>so(实际扩展为:'<,'>Source


下面:

" This script provides :Source command, a drop-in replacement for
" built-in :source command, but this one also can take range and execute just
" a part of the buffer.
"


" Sources given range of the buffer
function! <SID>SourcePart(line1, line2)
   let tmp = @z
   silent exec a:line1.",".a:line2."yank z"
   let @z = substitute(@z, '\n\s*\\', '', 'g')
   @z
   let @z = tmp
endfunction



" if some argument is given, this command calls built-in command :source with
" given arguments; otherwise calls function <SID>SourcePart() which sources
" visually selected lines of the buffer.
command! -nargs=? -bar -range Source if empty("<args>") | call <SID>SourcePart(<line1>, <line2>) | else | exec "so <args>" | endif



" in order to achieve _real_ drop-in replacement, I like to abbreviate
" existing :so[urce] command to the new one.
"
" So, we can call :so %  just as before, and we are also call  '<,'>so

cnoreabbr so     Source
cnoreabbr sou    Source
cnoreabbr sour   Source
cnoreabbr sourc  Source
cnoreabbr source Source

答案 3 :(得分:1)

如果您只选择了一行,则以下情况有效:

yq:p<enter>

这也有效:

y:<control-r>"<enter>