Bir komutun sonucunu vim'deki metne nasıl ekleyebilirim?


42

Örneğin :echo strftime(%c), geçerli saati en altta gösterecek, ancak bu zaman dizesini metne nasıl ekleyeceksiniz (imlecin hemen ardından)?


1
OP’nin “Vim ifadesinin sonucunu metne nasıl ekleyebilirim?” Anlamına geldiğine inanıyorum.
Alastair Irvine

Bunun statik bir metin bloğu eklemek için vim işlevi yazmakla aynı soru olmadığını söylemeye değer , ancak bazı cevaplar hala geçerli.
Alastair Irvine

Örnekiniz tam anlamıyla benim kullanım davam ve sizi bunun için selamlıyorum.
Joe,

Ayrıca kayıt defterine yönlendirmeye de bakın: stackoverflow.com/questions/2573021/…
NeilG

Yanıtlar:


49

Sen kullanabilirsiniz , ifade kayıt "=, ile p(ya da P) normal modda veya <C-R>ekleme modunda:

Normal modda:
( <C-M>burada Control+ anlamına gelir Mveya sadece Enter/ tuşuna basın Return)

"=strftime('%c')<C-M>p

Ekleme modunda:
( <C-M>yukarıdakiyle aynı anlama sahiptir, + <C-R>anlamına gelir )ControlR

<C-R>=strftime('%c')<C-M>

Aynı ifadenin sonucunu birçok kez eklemek isterseniz, bunları anahtarınızdaki anahtarlarla eşlemek isteyebilirsiniz .vimrc:
(burada <C-M>ve <C-R>kelimenin tam anlamıyla yazılmalıdır (beş basılabilir karakter dizisi — Vim bunları dahili olarak çevirir))

:nmap <F2> "=strftime('%c')<C-M>p
:imap <F2> <C-R>=strftime('%c')<C-M>

2
+1 Ders dışı! "=Kayıt. : - /
Eelvex

2
Bir vim değişkeninin değerini elde etmek için (örneğin, <C-R>=&sessionoptionssessionoptions ): - wildmode tab işlemi tamamlandı bile!
Justin M. Keyes,

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

Ekleme kipinde, <c-r>=çok fazla çıktısı olan ve çıktı metninin okunamadığı şekilde girintiyi kırabilecek komut için kullanımı yavaştır. Örneğin <c-r>=execute('nmap'), çıktı çok yavaş olan satır satır yazılır.
jdhao

22

:r!date +\%c

görmek :help :r!


1
dateharici bir komuttur ve !harici komutları çağırırken OP vim komutlarını ister.
Eelvex

@ eelvex hayır o yapmadı. ve ! bir vim ve vi komutudur. Bu kanonik yöntemdir. Diğer birçok şey için de çalışır.
Keith,

5
@Keith: yes !, harici komutları çağıran vi (m) komutudur . OP olabilirsiniz, sadece vim komutları vermek istemezsiniz, ancak yaparsa, !yapmaz.
Eelvex


10

Bir vim komutunun çıktısını eklemek istiyorsanız ( işlev çağrısının dönüş değerinin aksine ), onu yakalamanız gerekir. Bu, :redirvim'in standart çıktının eşdeğerini bir değişkene, dosyaya, sicile veya başka bir hedefe yönlendirmenize izin veren komutla gerçekleştirilir .

:redirAcı vermesi sakıncalıdır; İşlevselliğini daha elverişli bir şekilde kapsüllemek için bir işlev yazardım.

funct! Exec(command)
    redir =>output
    silent exec a:command
    redir END
    return output
endfunct!

Böyle bir işlevi bildirdikten sonra, imleç konumuna bir komutun çıktısını eklemek için ifade yazmacını (Chris Johnsen tarafından açıklandığı gibi) kullanabilirsiniz. Normal moddan, i^R=Exec('ls')vim'in o anki tamponlarının listesini eklemek için tıklayın.

Komutun fonksiyon isim alanında çalışacağını unutmayın, bu nedenle global bir değişken kullanıyorsanız, önek ekleyerek açıkça isim alanını doldurmanız gerekir g:. Ayrıca Exec(), yukarıda belirtildiği gibi, tek satırlık bir çıktıya sonlandırıcı bir yeni satır ekleyeceğini unutmayın . Bunu substitute()önlemek için işleve bir çağrı eklemek isteyebilirsiniz .

Ayrıca , hakkında daha fazla bilgi edinmek için https://stackoverflow.com/questions/2573021/vim-how-to-redirect-ex-command-output-into-current-buffer-or-file/2573054#2573054 adresine bakınız redir. ilgili bir komut.


2
Bu harika çalışıyor. Satır boşluğu ile başladığında merdiven girintisini önlemek için set pasteçıktıyı ve set nopastesonrasını döndürmeden önce bir komut ekledim . Aslında, mevcut yapıştırma seçeneğinin değerini kaydetmek ve geri vermek istedim ancak bunu yapamadım.
Juan Lanus,

1
@JuanLanus Bunun set nopasteardından çalışmamalısınız return outputçünkü return ifadesi işlev dışı bir çıkış noktasıdır. Çözümümü bu soruna bu sayfada ayrı bir cevap olarak verdim.
Evgeni Sergeev

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

Bir sonraki satıra koyacaktır, daha sonra geçerli pozisyona katılmak için J( Shift+ J) tuşuna basabilirsiniz .

Ya da hepsine tek bir komutla ihtiyacınız olursa,

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

veya

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

Tarihten önce bir boşluk eklemek isteyip istemediğinize bağlı olarak.


4

Önde gelen beyaz boşluk ve artan girintiyle ilgili sorunu önlemek için bilinçli yanıtın iyileştirilmesi:

"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')Normal moddan bu sadece dosyadaki geçerli konuma ekleyecektir . Belirtildiği üzere yorumun orijinal (insert modu) Ctrl + R =Exec('command')ile yaklaşım Exec(..)bir dize dönen kısmen kullanılarak düzeltilmiş olabilir set paste, ama koymak için bir fırsat sunmaz set nopastehiçbir yerinde.

let @o = outputSözdizimi kaydını ayarlar odeğişkenin içeriğine outputburada açıklandığı gibi,: https://stackoverflow.com/a/22738310/1143274

return ''Varsayılan dönüş değeri böylece çizgi 0tamponuna yerleştirilir almaz.


2

Ben böyle yapıyorum. Kullandığı için imlecin hemen arkasına yerleştirir 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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.