Наприклад, :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!
<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