В обычном режиме: ( <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 переведет их внутренне))
чтобы получить значение переменной vim (например, sessionoptions): <C-R>=&sessionoptions- он даже выполняет wildmode tab-complete!
Джастин М. Кейс
2
: put = strftime ('% c') <CM>
brunch875
В режиме вставки использование команды <c-r>=медленно для команды, которая может иметь много выходных данных, а также может нарушить отступ, так что выводимый текст будет нечитаемым. Например, <c-r>=execute('nmap')вывод будет записан построчно, что очень медленно.
dateявляется внешней командой и !вызывает внешние команды, в то время как OP запрашивает команды vim.
Двенадцать
@eelvex нет, он не сделал. и то! это vim, а vi - команда. Это канонический метод. Работает и для многих других вещей.
Кит
5
@Keith: yes !- это команда vi (m), которая вызывает внешние команды. Вы можете быть правым оператором, который не хочет выводить только команды vim, но если он (а) это сделает, !то не будет.
Двенадцать
11
Эти команды вставят выходные данные strftime("%c")прямо там, где находится ваш курсор:
:exe ":normal i" . strftime("%c")
а также
:call feedkeys("i". strftime("%c"))
Есть и другие способы сделать то, что вы хотите (например, те, которые есть в ответе Микеля ).
Изменить : еще лучше, для вставки на месте, используйте =регистр, как описывает Крис Джонсен
Если вы хотите , чтобы вставить вывод в VIM команды (в отличие от возвращаемого значения вызова функции ), вы должны захватить его. Это выполняется с помощью :redirкоманды, которая позволяет перенаправить эквивалент стандартного вывода vim в переменную, файл, регистр или другую цель.
:redirявляется болезненно неудобным для использования; Я бы написал функцию для инкапсуляции ее функциональности более удобным способом, что-то вроде
После того как вы объявили такую функцию, вы можете использовать регистр выражений (как объяснил Крис Джонсен), чтобы вставить вывод команды в позицию курсора. Итак, в обычном режиме нажмите, i^R=Exec('ls')чтобы вставить список текущих буферов vim.
Имейте в виду, что команда будет выполняться в пространстве имен функции, поэтому, если вы используете глобальную переменную, вам придется явно указать пространство имен, поставив перед ней префикс g:. Также обратите внимание, что Exec(), как написано выше, добавляется завершающий символ новой строки даже к выводу одной строки. Возможно, вы захотите добавить вызов substitute()в функцию, чтобы избежать этого.
Это прекрасно работает. Я добавил set pasteкоманду перед возвратом вывода и set nopasteпосле, чтобы избежать отступа лестницы, когда строки начинаются с пробелов. На самом деле я хотел сохранить значение текущей опции вставки и вернуть его, но я не смог этого сделать.
Хуан Ланус
1
@JuanLanus После set nopasteне должно работать return output, потому что оператор return является точкой выхода из функции. Я поставил свое решение этой проблемы как отдельный ответ на этой странице.
Евгений Сергеев
4
:call append(line('.'), strftime("%c"))
Поместите его на следующую строку, затем вы можете нажать J( Shift+ J), чтобы присоединить его к текущей позиции.
Или, если вам нужно все это в одной команде, вы можете сделать
Улучшение @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куда угодно.
Вот как я это делаю. Он ставит его сразу после курсора, потому что он использует 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
Ответы:
Вы можете использовать регистр выражений
"=
, сp
(илиP
) в обычном режиме или<C-R>
в режиме вставки:В обычном режиме:
(
<C-M>
здесь означает Control+ M, или просто нажмите Enter/ Return)В режиме вставки:
(
<C-M>
имеет то же значение, что и выше,<C-R>
означает Control+ R)Если вы хотите вставить результат одного и того же выражения много раз, то вам может потребоваться сопоставить их с ключами в вашем
.vimrc
:(здесь
<C-M>
и<C-R>
следует печатать буквально (последовательность из пяти печатных символов - Vim переведет их внутренне))источник
"=
Регистр. : - /<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")
прямо там, где находится ваш курсор:а также
Есть и другие способы сделать то, что вы хотите (например, те, которые есть в ответе Микеля ).
Изменить : еще лучше, для вставки на месте, используйте
=
регистр, как описывает Крис Джонсенисточник
Если вы хотите , чтобы вставить вывод в VIM команды (в отличие от возвращаемого значения вызова функции ), вы должны захватить его. Это выполняется с помощью
:redir
команды, которая позволяет перенаправить эквивалент стандартного вывода vim в переменную, файл, регистр или другую цель.:redir
является болезненно неудобным для использования; Я бы написал функцию для инкапсуляции ее функциональности более удобным способом, что-то вродеПосле того как вы объявили такую функцию, вы можете использовать регистр выражений (как объяснил Крис Джонсен), чтобы вставить вывод команды в позицию курсора. Итак, в обычном режиме нажмите,
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 является точкой выхода из функции. Я поставил свое решение этой проблемы как отдельный ответ на этой странице.Поместите его на следующую строку, затем вы можете нажать
J
( Shift+ J), чтобы присоединить его к текущей позиции.Или, если вам нужно все это в одной команде, вы можете сделать
или
в зависимости от того, хотите ли вы вставить пробел до даты или нет.
источник
Улучшение @intuited ответа, чтобы избежать проблемы с пробелами и растущим отступом:
Это будет просто вставить в текущем месте в файле, когда вы
:call Exec('command')
из нормального режима. Как отмечено в комментарии , оригинальный=Exec('command')
подход ( Ctrl + R) в режиме вставки сExec(..)
возвратом строки может быть частично исправлен с помощьюset paste
, но не дает возможности поместитьset nopaste
куда угодно.let @o = output
Синтаксис устанавливает регистрo
на содержимое переменнойoutput
, как описано здесь: https://stackoverflow.com/a/22738310/1143274return ''
Линии так , что значение по умолчанию возврата0
не вставляются в буфер.источник
Вот как я это делаю. Он ставит его сразу после курсора, потому что он использует
p
.источник