Чтение вывода файла или команды, встроенной в vim - PullRequest
0 голосов
/ 27 декабря 2018

Допустим, у меня есть открытый текстовый файл в Vim, который выглядит так

this is an inline insertion

, и я хочу добавить слово «test» между «inline» и «вставкой».

Я мог бы просто написать это, но это метафорический пример, так что я собираюсь :read !printf "test " с курсором в столбце 18. Вот что я получаю:

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 голосов
/ 18 января 2019

Без какой-либо настройки (как в ответе @ melpomene) вы можете напрямую вставить вывод внешней команды через :help c_CTRL-R, регистр выражений (:help quote=) и :help system() в режиме вставки:

<C-R>=system('printf "test "')<CR>

Альтернативной реализацией является следующее отображение <C-R>&#96; для режима вставки и командной строки:

настраиваемое отображение

" 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>
0 голосов
/ 27 декабря 2018

Вы можете сделать это вручную, комбинируя несколько других функций:

: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))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...