Например, :echo strftime(%c)покажет текущее время внизу, но как вставить эту строку времени в текст (сразу после курсора)?
Например, :echo strftime(%c)покажет текущее время внизу, но как вставить эту строку времени в текст (сразу после курсора)?
Ответы:
Вы можете использовать регистр выражений "=, с p(или P) в обычном режиме или <C-R>в режиме вставки:
В обычном режиме:
( <C-M>здесь означает Control+ M, или просто нажмите Enter/ Return)
"=strftime('%c')<C-M>p
В режиме вставки:
( <C-M>имеет то же значение, что и выше, <C-R>означает Control+ R)
<C-R>=strftime('%c')<C-M>
Если вы хотите вставить результат одного и того же выражения много раз, то вам может потребоваться сопоставить их с ключами в вашем .vimrc:
(здесь <C-M>и <C-R>следует печатать буквально (последовательность из пяти печатных символов - Vim переведет их внутренне))
:nmap <F2> "=strftime('%c')<C-M>p
:imap <F2> <C-R>=strftime('%c')<C-M>
"=Регистр. : - /
<C-R>=&sessionoptions- он даже выполняет wildmode tab-complete!
<c-r>=медленно для команды, которая может иметь много выходных данных, а также может нарушить отступ, так что выводимый текст будет нечитаемым. Например, <c-r>=execute('nmap')вывод будет записан построчно, что очень медленно.
:r!date +\%c
видеть :help :r!
dateявляется внешней командой и !вызывает внешние команды, в то время как OP запрашивает команды vim.
!- это команда vi (m), которая вызывает внешние команды. Вы можете быть правым оператором, который не хочет выводить только команды vim, но если он (а) это сделает, !то не будет.
Эти команды вставят выходные данные strftime("%c")прямо там, где находится ваш курсор:
:exe ":normal i" . strftime("%c")
а также
:call feedkeys("i". strftime("%c"))
Есть и другие способы сделать то, что вы хотите (например, те, которые есть в ответе Микеля ).
Изменить : еще лучше, для вставки на месте, используйте =регистр, как описывает Крис Джонсен
Если вы хотите , чтобы вставить вывод в VIM команды (в отличие от возвращаемого значения вызова функции ), вы должны захватить его. Это выполняется с помощью :redirкоманды, которая позволяет перенаправить эквивалент стандартного вывода vim в переменную, файл, регистр или другую цель.
:redirявляется болезненно неудобным для использования; Я бы написал функцию для инкапсуляции ее функциональности более удобным способом, что-то вроде
funct! Exec(command)
redir =>output
silent exec a:command
redir END
return output
endfunct!
После того как вы объявили такую функцию, вы можете использовать регистр выражений (как объяснил Крис Джонсен), чтобы вставить вывод команды в позицию курсора. Итак, в обычном режиме нажмите, i^R=Exec('ls')чтобы вставить список текущих буферов vim.
Имейте в виду, что команда будет выполняться в пространстве имен функции, поэтому, если вы используете глобальную переменную, вам придется явно указать пространство имен, поставив перед ней префикс g:. Также обратите внимание, что Exec(), как написано выше, добавляется завершающий символ новой строки даже к выводу одной строки. Возможно, вы захотите добавить вызов substitute()в функцию, чтобы избежать этого.
Также см. Https://stackoverflow.com/questions/2573021/vim-how-to-redirect-ex-command-output-into-current-buffer-or-file/2573054#2573054 для получения дополнительной информации о программе redirи ссылки на связанная команда.
set pasteкоманду перед возвратом вывода и set nopasteпосле, чтобы избежать отступа лестницы, когда строки начинаются с пробелов. На самом деле я хотел сохранить значение текущей опции вставки и вернуть его, но я не смог этого сделать.
set nopasteне должно работать return output, потому что оператор return является точкой выхода из функции. Я поставил свое решение этой проблемы как отдельный ответ на этой странице.
:call append(line('.'), strftime("%c"))
Поместите его на следующую строку, затем вы можете нажать J( Shift+ J), чтобы присоединить его к текущей позиции.
Или, если вам нужно все это в одной команде, вы можете сделать
:call setline(line('.'), getline(line('.')) . strftime("%c"))
или
:call setline(line('.'), getline(line('.')) . " " . strftime("%c"))
в зависимости от того, хотите ли вы вставить пробел до даты или нет.
Улучшение @intuited ответа, чтобы избежать проблемы с пробелами и растущим отступом:
"Examples:
":call Exec('buffers')
"This will include the output of :buffers into the current buffer.
"
"Also try:
":call Exec('ls')
":call Exec('autocmd')
"
funct! Exec(command)
redir =>output
silent exec a:command
redir END
let @o = output
execute "put o"
return ''
endfunct!
Это будет просто вставить в текущем месте в файле, когда вы :call Exec('command')из нормального режима. Как отмечено в комментарии , оригинальный =Exec('command')подход ( Ctrl + R) в режиме вставки с Exec(..)возвратом строки может быть частично исправлен с помощью set paste, но не дает возможности поместить set nopasteкуда угодно.
let @o = outputСинтаксис устанавливает регистр oна содержимое переменной output, как описано здесь: https://stackoverflow.com/a/22738310/1143274
return ''Линии так , что значение по умолчанию возврата 0не вставляются в буфер.
Вот как я это делаю. Он ставит его сразу после курсора, потому что он использует p.
" save previous yank
let reg_save = @@
" save your text to the '@' register
let @@ = strftime('%c')
" paste it after the cursor
exec "normal! p"
" restore previous yank
let @@ = reg_save