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.