Son kullanıcı arayüzü komutunu tekrarlayabilir miyim?


17

.Son düzenleme komutunu tekrarlamak için kullanabileceğimi biliyorum .

Son UI manipülasyon komutunu tekrarlamanın bir yolu var mı? Örneğin, 10<C-W>-bir pencereyi on satır küçültmek için yazabilirim . ⟨Basına edebilmek için iyi olurdu bazı anahtarla Benim daha çok küçültmek istediğinizde kolayca bu komutu tekrarlamak için⟩.


İlgili: stackoverflow.com/q/6952636/2072269 (daha önce yeniden boyutlandırma yaptıktan sonra kullanılabilecek bir yanıt verilmedi ).
muru

@muru: güzel, ama bu özel durum için. Ne gibi bir şey yaptıysanız fzo zaman ve 10;? Ne olmuş :tabm +1? Bunların hepsi özel kasalı mı olacak?
wchargin

Sanırım beni yanlış anladın. Bağlantılı yazının işe yaramaz cevapları olduğunu söylüyorum (başka biri gelip önermeden önce).
muru

ah! tamam, o zaman aynı sayfadayız muru :)
wchargin

Yanıtlar:


12

Dot komutu .çalışır çünkü Vim arabelleklerin içeriğini değiştiren komutları "takip eder". Çalıştırırsanız :echo b:changedtick, geçerli arabellekteki her değişiklikle birlikte arttığını görürsünüz.

Ancak Vim, düzenleme yapmayan komutları "takip etmez". Böylece, hayır, istediğin şey yapılamaz.


8

Bunu vim'de varsayılan olarak yapmanın bir yolu yoktur, çünkü vim daha önce yürütülen wincmd'in kaydını tutmaz. Bununla birlikte, bunu bazı akıllı eşlemelerle yapmak mümkündür:

function! s:Wincmd(count, key)
    " If count is not zero, use the original count.  If otherwise, don't
    " include a count.
    let if_count = a:count ? a:count : ""
    " This builds a wincmd from the given key, and saves it so
    " it can be repeated.
    let g:last_wincmd = "wincmd " . nr2char(a:key)
    " Execute the built wincmd
    execute if_count . g:last_wincmd
endfunction

function! s:WincmdRepeat(count)
    " If no wincmd has been executed yet, don't do anything
    if !exists('g:last_wincmd') | return | endif
    " If a count is given, repeat the last wincmd that amount of times.
    " If otherwise, just repeat once.
    let if_count = a:count ? a:count : ""
    execute if_count . g:last_wincmd
endfunction

" Overwrite the default <C-w> mapping so that the last wincmd can be kept
" track of.  The getchar function is what captures the key pressed
" directly afterwards.  The <C-u> is to remove any cmdline range that vim
" automatically inserted.
nnoremap <silent> <C-w> :<C-u>call <SID>Wincmd(v:count, getchar())<CR>

" This just calls the function which repeats the previous wincmd.  It
" does accept a count, which is the number of times it should repeat the
" previous wincmd.  You can also replace Q with whatever key you want. 
nnoremap <silent> Q :<C-u> call <SID>WincmdRepeat(v:count)<CR>

Kullandığınız herhangi bir eşlemeniz <C-w>varsa, bunların yalnızca noreçeşitli olmadığında tekrarlanabileceğini unutmayın . Kullanılarak yayınlanan :wincmdhiçbir pencere tekrarlanmayacaktır. Ayrıca, birden fazla karakter içeren herhangi bir wincmds gerçekleştirilemez (örneğin <C-w>gf) .

İlgili Yardım Konuları

  • :help v:count
  • :help getchar()
  • :help nr2char()
  • :help expr1
  • :help :wincmd
  • :help :execute
  • :help :for
  • :help :map-<silent>
  • :help c_CTRL-U
  • :help <SID>

1
Bu harika ve iyi yazılmış VimScript'in mükemmel bir örneği! Bazı küçük (belki de seçici) geri bildirimler: Bu tekrar komutu, yerleşikin .bir sayıyla davrandığından farklı davranacaktır. Bir sayım sağlandığında ., önceki sayım yoksayılır. Yani 2ddtakip 3.2 hatlarını ve ardından 3 satırları silin olur; aksine, senin eşlemeleriyle, 2<C-w>-ardından 3Q6 (= 2x3) çizgilerle sonra 2 çizgilerle pencereyi küçültmek ve olacaktır. Bu davranış iyidir, ancak özel bir komutun nasıl davranması gerektiğini seçerken benzer yerleşik Vim komutlarından çizim yapmak güzeldir.
tommcdo

Teşekkürler! Ayrıca, sayımın nasıl çalıştığı ile ne demek istediğini anlıyorum. Değiştirebilirim, böylece bu şekilde çalışır.
EvergreenTree

4

Alt mod eklentisi bu konuda yardımcı olabilir. Pencereyi yeniden boyutlandırmaya devam etmeyi <C-W>-tanımladığınız -(ve belki de +) yazdığınız bir "alt mod" yazabilirsiniz .


2

İstediğinizi yapabilen repmo.vim ("tekrar hareketleri") adında başka bir eklenti var .

Ancak hangi hareketleri (veya genel olarak eylemleri) tekrarlamak istediğinizi belirtmeniz gerekir . Benimki şu anda yapılandırıldı:

let g:repmo_mapmotions = "j|k h|l zh|zl g;|g, <C-w>w|<C-w>W"
let g:repmo_mapmotions .= " <C-w>+|<C-w>- <C-w>>|<C-w><"
let g:repmo_key = ";" 
let g:repmo_revkey = "," 

Bunu yaptıktan sonra tekrarlamak için 5 CTRL-W +vurabilirim ;.

Eklenti, belirtilen anahtarların her biri için eşlemeler oluşturarak çalışır.

Ne zaman fya da tkullanılırlar, ;ve ,eşleştirmeleri varsayılan davranışı geri temizlenir.

Daha g;önceki bir düzenleme noktasına geri dönmek için eşlemeyi özellikle kullanışlı buluyorum . g; ; ; ;


@albfan Sorunuzu anladığımdan emin değilim, ama benim için acil olarak ,harekete geçiyor ve 5,beklendiği gibi çalışıyor. Eğer belirledik mümkün mü mapleaderTo ,?
joeytwiddle
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.