Як вставити результат команди в текст vim?


42

Наприклад, :echo strftime(%c)буде показано поточний час у нижній частині, але як вставити цей часовий рядок до тексту (відразу після курсору)?


1
Я вважаю, що ОП означає "Як вставити результат виразу Vim у текст?"
— Аластер Ірвін

Варто також зазначити, що це не те саме питання, як написання функції vim для вставки блоку статичного тексту , проте деякі відповіді все ще застосовуються.
— Аластер Ірвін

Ваш приклад - це буквально мій випадок використання, і я вітаю вас за це.
— Джо

Дивіться також перенаправляти в регістр: stackoverflow.com/questions/2573021 / ...
— NeilG

Відповіді:


49

Ви можете використовувати регістр виразів "=, з 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>

2
+1 Звичайно! "=Регістр. : - /
— Eelvex

2
щоб отримати значення змінної vim (наприклад, sessionoptions): <C-R>=&sessionoptions- це навіть робить завершення вкладки wildmode!
— Джастін М. Кеїс

2
: put = strearch ('% c') <CM>
— brunch875

У режимі вставки використання <c-r>=команди повільно для команди, яка може мати багато результатів, а також може порушити відступ, так що вихідний текст не читається. Наприклад, <c-r>=execute('nmap')вихід буде записуватися рядок за рядком, що відбувається дуже повільно.
— jdhao

22

:r!date +\%c

побачити :help :r!


1
dateє зовнішньою командою і !викликає зовнішні команди, тоді як OP запитує команди vim.
— Ельвакс

@eelvex ні, він цього не зробив. та! - команда vim, і vi. Це канонічний метод. Працює і для багатьох інших речей.
— Кіт

5
@Keith: так !- команда vi (m), яка викликає зовнішні команди. Можливо, ви маєте рацію ОП, не бажаючи виводити лише команди vim, але якщо він це зробив, !він не зробить цього.
— Ельвакс

11

Ці команди вставлятимуть результат strftime("%c")праворуч, де знаходиться ваш курсор:

:exe ":normal i" . strftime("%c")

і

:call feedkeys("i". strftime("%c"))

Є й інші способи робити те, що ти хочеш (як, наприклад, відповідь Мікеля ).

Редагувати : Ще краще, для вставки на місці використовуйте =регістр, як описує Кріс Джонсен


10

Якщо ви хочете , щоб вставити висновок в 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та про посилання на пов'язана команда.


2
Це чудово працює. Я додав set pasteкоманду перед поверненням результатів і set nopasteпісля, щоб уникнути відступу сходів, коли рядки починаються з пробілів. Насправді я хотів зберегти значення поточної опції вставки та повернути її, але мені не вдалося це зробити.
— Хуан Ланус

1
@JuanLanus Після цього set nopasteне слід працювати return output, оскільки оператор return є точкою виходу з функції. Я вирішив цю проблему як окрему відповідь на цій сторінці.
— Євгеній Сергєєв

4
:call append(line('.'), strftime("%c"))

Переведете його на наступний рядок, тоді ви можете натиснути J( Shift+ J), щоб приєднати його до поточного положення.

Або якщо вам все це потрібно в одній команді, ви могли б зробити

:call setline(line('.'), getline(line('.')) . strftime("%c"))

або

:call setline(line('.'), getline(line('.')) . " " . strftime("%c"))

залежно від того, хочете ви вставити пробіл до дати чи ні.


4

Покращення @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не вставляти в буфер.


2

Ось як я це роблю. Він ставить його відразу після курсору, оскільки він використовує 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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.