Örneğin :echo strftime(%c)
, geçerli saati en altta gösterecek, ancak bu zaman dizesini metne nasıl ekleyeceksiniz (imlecin hemen ardından)?
Örneğin :echo strftime(%c)
, geçerli saati en altta gösterecek, ancak bu zaman dizesini metne nasıl ekleyeceksiniz (imlecin hemen ardından)?
Yanıtlar:
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>
"=
Kayıt. : - /
<C-R>=&sessionoptions
sessionoptions ): - wildmode tab işlemi tamamlandı bile!
<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.
:r!date +\%c
görmek :help :r!
date
harici bir komuttur ve !
harici komutları çağırırken OP vim komutlarını ister.
!
, harici komutları çağıran vi (m) komutudur . OP olabilirsiniz, sadece vim komutları vermek istemezsiniz, ancak yaparsa, !
yapmaz.
Bu komutlar, strftime("%c")
imlecinizin bulunduğu yerin sağ çıktısını yerleştirir :
:exe ":normal i" . strftime("%c")
ve
:call feedkeys("i". strftime("%c"))
İstediğinizi yapmanın başka yolları da var (örneğin, Mikel'in cevabındakiler gibi ).
Düzenleme : Daha da iyisi, yerinde ekleme için, =
kayıt defterini Chris Johnsen'in tanımladığı şekilde kullanın
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, :redir
vim'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 .
:redir
Acı 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.
set paste
çıktıyı ve set nopaste
sonrası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.
set nopaste
ardı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.
: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.
Ö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 nopaste
hiçbir yerinde.
let @o = output
Sözdizimi kaydını ayarlar o
değişkenin içeriğine output
burada açıklandığı gibi,: https://stackoverflow.com/a/22738310/1143274
return ''
Varsayılan dönüş değeri böylece çizgi 0
tamponuna yerleştirilir almaz.
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