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