Допустим, у меня есть текстовый файл, открытый в Vim, который выглядит так
this is an inline insertion
и я хочу добавить слово «тест» между «встроенным» и «вставленным».
Я мог бы просто написать это, но это метафорический пример, поэтому я перейду к :read !printf "test " с курсором в столбце 18. Вот что я получаю:
this is an inline insertion
test
Вот что я хочу получить:
this is an inline test insertion
Есть ли способ создать функцию vim или есть ли существующая команда, которую я могу использовать для получения такого поведения? Я знаю, что могу выполнить чтение, затем выполнить Dk, затем поместить курсор, затем 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





Вы можете сделать это вручную, объединив несколько других функций:
: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))
Без какой-либо настройки (как в ответе @melpomene) вы можете напрямую вставить внешний вывод команды через :help c_CTRL-R, регистр выражения (:help quote=) и :help system() в режиме вставки:
<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>