众所周知,我们可以通过:source
:so %
当前缓冲区。
但有时我想:source
只是缓冲区的一部分,而不是整个缓冲区。说,我刚刚在我的.vimrc
添加了一些内容,并希望获取该部分内容,但我不想重新提供所有其他内容。
我尝试了选择文字和:so
(实际上是:'<,'>so
),但它报告说不允许使用范围。那么,怎么办呢?
当然,我可以将所需的部分保存到临时文件并获取它,但它显然很烦人。
答案 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>