Як вставити результат команди в текст 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.