在Vim中内联读取文件或命令的输出

时间:2018-12-27 17:45:25

标签: vim

可以说我在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

2 个答案:

答案 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>