可以说我在Vim中打开了一个文本文件,看起来像这样
this is an inline insertion
我想在“内联”和“插入”之间添加“测试”一词。
我可以只写它,但这是一个比喻的例子,所以我将光标移到第18列上的:read !printf "test "
,这是我得到的:
this is an inline insertion
test
这就是我想要得到的:
this is an inline test insertion
有什么方法可以创建vim函数,或者是否可以使用现有命令来实现此功能?我知道我可以进行读取,然后执行D
k
,然后放置光标,然后再放置P
,但是我希望一步找到一个方法,将光标提前。
由于@melpomene的回答,我现在在~/.vimrc
文件中有了此功能:
fu! InlineRead(command)
let colnum = col('.')
let line = getline('.')
call setline('.', strpart(line, 0, colnum) . system(a:command) . strpart(line, colnum))
endfu
答案 0 :(得分:3)
您可以通过结合其他一些功能来手动完成此操作:
:call setline('.', strpart(getline('.'), 0, col('.')) . system('printf "test "') . strpart(getline('.'), col('.')))
当然,您可以通过分配例如col('.')
和getline('.')
变量,删除多余的计算:
let c = col('.')
let line = getline('.')
call setline('.', strpart(line, 0, c) . system('printf "test "') . strpart(line, c))
答案 1 :(得分:0)
无需任何设置(如@melpomene的答案),您可以直接通过:help c_CTRL-R
,表达式寄存器(:help quote=
)和{{3 }}处于插入模式:
<C-R>=system('printf "test "')<CR>
另一种实现方式是以下针对插入和命令行模式的<C-R>`
映射:
" i_CTRL-R_` Insert the output of an external command.
" c_CTRL-R_`
function! s:QueryExternalCommand( newlineReplacement )
call inputsave()
let l:command = input('$ ', '', 'shellcmd')
call inputrestore()
return (empty(l:command) ?
\ '' :
\ substitute(substitute(l:command, '\n\+$', '', ''), '\n', a:newlineReplacement, 'g')
\)
endfunction
inoremap <C-r>` <C-g>u<C-r>=<SID>QueryExternalCommand('\r')<CR>
cnoremap <C-r>` <C-r>=<SID>QueryExternalCommand('\\n')<CR>