Vim'de golf oynamak için ipuçları


32

Geçenlerde golf için, özellikle de için ne kadar iyi çalıştığını anladım . Ayrıca, meta vim'e göre, en azından bu sitenin kapsamı için kabul edilebilir bir 'programlama dilidir'.

Vim'de golf oynamak için hangi genel ipuçlarınız var? Kod-golf problemlerine uygulanabilecek ve en azından biraz da Vim'e özgü olan fikirler arıyorum (örneğin, "yorumları kaldır" bir cevap değildir).

Lütfen cevap başına bir ipucu gönderin.


4
Bu özellikle yararlı bir ipucu sorusudur çünkü "Vim'de golf oynamak için ipuçları" ve "Vim'i bir metin editörü olarak verimli kullanmak için ipuçları" temelde aynı.
DLosc

Yanıtlar:


15

Yaygın komutların büyük değişkenlerinin farkında olun. Bu, pek çok bağlamda bir tuş vuruşunu önemsiz şekilde koruyabilir. Örneğin:

A = $a
C = c$
D = d$
I = ^i
S = cc
X = dh
Y = yy

Bir diğeri Gyerine kullanmak gg, ancak sadece bir sayı kullanıyorsanız! Örneğin, bir sayı olmadan gg, başlangıcına ve Gsonuna kadar hareket eder. Bununla birlikte, bir sayıyla her ikisi de belirttiğiniz satıra taşınır, yani 5Geşdeğerden kısadır 5gg .

Bir diğeri, kullanmaktır Hyerine gg, ancak herhangi bir giriş satırları varsayılan numara (bu 24 olduğuna inanıyoruz, ama bu değişebilir) daha fazla sürmez garanti edemez eğer bu sadece çalıştığını not etmek önemlidir.


1
Özellikle bir meydan okuma editör golf (ve bu nedenle genellikle tuş ile attı) bir büyük harf ve iki tuş vuruşlarını ise (böyledir $yüzden en azından olsa Cve Dbir şeyler kaydetmek olacaktır).
Martin Ender,

1
Tuş vuruşlarında puanlama yaparken bilmediğim bir şey, üst karakter tuşunu gerektiren ardışık harflerin üst karakter tuşunu yalnızca grup başına bir kez sayıp saymadığıdır, çünkü (en azından pratik amaçlar için) diğer tuşlara basarken basılı tutabilirsiniz.
Alex A.

6
@AlexA. Kişisel olarak, değiştiricilerin sayılmaması gerektiğini düşünüyorum. Belki de bu konuda meta bir yazıya ihtiyacımız var ...
DJMcMayhem

Gve ggeşdeğer değildir. İlki tamponun sonuna gider ve ikincisi başlangıcına gider.
Ürdün

@Jordan Bu iyi bir nokta. Bir sayı verildiğinde aynı olduklarını kastettim, örneğin 5Geşdeğerdir 5gg. Bu nokta hakkında biraz daha detay ekleyeceğim.
DJMcMayhem

11

Bir komut başarısız olduğunda, mevcut makroyu iptal edecek olan bir ding gürültüsü oluşacaktır. Ham bir döngü şekli oluşturmak için bunu (ab) kullanabilirsiniz. Örneğin, <foobar>tamponunuz içinde 3 satırdan az olana kadar tuş vuruşlarını tekrarlamak istiyorsanız . Yapabilirsin

qq<foobar>3G``@qq

bunun anlamı:

qq                 'Start recording in register q
  <foobar>         'Keystrokes
          3G       'Go to line 3. If line 3 doesn't exist, this is effectively a "break" statement.
            ``     'Jump back to previous cursor location
              @q   'Call macro q
                q  'Stop recording

Bunu bir vim oturumunda test ediyorsanız @q, makrolar yüklendiğinden istenmeyen yan etkilerin olabileceğini unutmayın .vim_profile. Bunu birkaç farklı yoldan alabilirsin. Muhtemelen en iyi geçici çözüm vim ile başlatmaktır.

vim -i NONE

Ayrıca silebilirsiniz .viminfo.

Zaten vim başlattıysanız, yazabilirsiniz

qqq

başında makroyu sıfırlamak.

3G'yi değiştirebileceğiniz diğer koşullar

f<char>    'Jump to first occurence of <char>. Also see F, t and T

veya

<number>|  'Go to the <number>'th character on the current line.

8

Düşündüğünüz eski komutların daha kısaltılmış versiyonları var. Örneğin, muhtemelen :globalbunun kısaltılabileceğini zaten biliyordunuz :g, ancak bunun :nnoremapeşdeğer olduğunu biliyor muydunuz :nn?

Daha :h :fookısa bir sürüm olup olmadığını görmek için cevabınızda kullandığınız tüm eski komutları çalıştırmak iyi bir fikirdir .


6
:%s/\n//g

her zaman eşittir

:%s/\n//

aynı zamanda eşdeğer olur

:%s/\n

şaşırtıcı derecede yeterli. (Genel olarak, herhangi bir bayrak olmadan, bir :sifadedeki son eğik çizgi asla gerekli değildir.)


2
Bu, yeni satır için çalışır, ancak satırda birden fazla kez görünebilecek herhangi bir karakter için çalışmaz. Örneğin , x'in her oluşumunu, her satırdaki ilkini :%s/xsilmez .
DJMcMayhem

1
:&&Bir ikame komutunu ve bayraklarını tekrarlamak için de kullanabilirsiniz .
DJMcMayhem

6

Diyelim ki ekleme modundasınız ve tek bir normal mod komutu yapmak istiyorsunuz. Bunu şöyle yazabilirsin:

isome_text<esc><foobar>gisome_more_text

Böyle yapma. Bunun yerine, <C-o>tek bir normal komut yürüten kullanımı kullanın ve ardından derhal ekleme moduna döner.

isome_text<C-o><foobar>some_more_text

Bu alanların da gerekli olduğunu sanmıyorum
Fon Monica'nın Davası

@QPaysTaxes Haklısın, değiller. Daha okunaklı olacağını düşündüm. Bunu düzenleyeceğim.
DJMcMayhem

Bir gerekmez <CR>sonra <foobar>komutu göndermek için?
Fon Monica'nın Davası

@QPaysTaxes Yalnızca bu bir eski komut veya arama ise. (Örneğin bir komut ile başlayan :, /veya ?)
DJMcMayhem

Ah benim hatam. Komuta ve normal modları karıştırdım. Havalı: D
Fonu Monica'nın Davası

5

Üç "değişiklik durumu" operatörü vardır,

gu    "Convert to lowercase
gU    "Convert to uppercase
g~    "Toggle case

Bunlar işleçler oldukları için harekete geçerler, böylece geçerli karakteri kullanacağınız küçük harfe dönüştürürsünüz.

gul

İşte eğlenceli numara burada. :) Tek bir karakterin durumunu veya şu anki satırı değiştirmek istiyorsanız, görsel modda bir bayt daha kısa. Örneğin guleşdeğerdir

vu

Ve gu_(_ geçerli satırdır) şuna eşittir

Vu

Bu hile yapar değil çünkü toggle için çalışma v?tetikleyicileri bir geriye (tıpkı görsel modunda aramak v/ama ters yönde hareket eden) böylece gerekmez vg?yerine. Ancak, ~operatörü daha fazla bayttan tasarruf etmek için kullanabileceğiniz yer burada ! (Buna dikkat çektiğiniz için teşekkürler @Doorknob)

Bu numarayı burada benim vim cevabım ve ve de ve yazıdaki eşdeğer V cevabında görebilirsiniz.


1
Unutmayın ~, hangi imleç altındaki karakterin durumunu değiştirir ve bir tane sağa doğru hareket eder!
Doorknob

5

10 tuş vuruşunda alfabe

Bu tekniğin tüm kredisi, bu cevabı ilk defa kullanan Lynn'e gidiyor . Buraya gelecek nesiller için yazıyorum.

Küçük harfli alfabeyi işaretlemek için aşağıdaki on tuşa basın:

:h<_␍jjYZZ

( Bir satır başı nerede , yani Enter tuşu.)

açıklama

:h<_␍v_b_<_examplemetni içeren yardım bölümünü açar (görsel engelleme seçiminin bir örneği) abcdefghijklmnopqrstuvwyxz. jjYo çizgiye doğru ilerler ve onu çekiştirir, sonra ZZyardım penceresini kapatır.


4

Kayıtlarınızı bilin

Daha "aYsonra kullanmak için metni belirli bir sicile (örn. ) Batırmak veya silmek her zaman gerekli değildir. Vim'de çeşitli komutların konuları ile otomatik olarak doldurulmuş birkaç kayıt vardır. Tip :help registershepsini görmek için, ama burada özellikle dikkat bunlardan birkaçı:

  • Adsız sicil: ""- Yanmış veya silinmiş son metin.

  • Numaralı kayıt "0- En son çıkan metin.

  • Numaralı kayıtlar "1- "9- Bir satırdan az olmadığı sürece silinen son metin. Her seferinde "1doldurulur, önceki içerikler"2 vb. .

  • Küçük silme kaydı: "-- Silinen bir satırdan kısa olan son metin.

  • Son eklenen metin: ".

Özellikle, "-ve "1kayıtları örneğin bazı metni silmek için sağlayarak, kullanışlı buluşmanızı olabilir ddiçine "1ile diğer bazı metinleri kayıt ve silme Diçine"- (elbette, semantik aynı değil, ama çoğu zaman onlar için gerekmez ).

Tüm kayıtların takip edilmesi biraz zor olabilir, ancak yazarak tüm kayıtlarınızın içeriğini istediğiniz zaman görebilirsiniz :registers.


3

Bu daha önce sohbette ortaya çıktı , bu yüzden tam bir ipucu olarak gönderebilirim diye düşündüm.

<C-a>ve <C-x>satırdaki bir sonraki sayıyı artırma ve azaltma. Bu, bazı basit matematik için son derece yararlı bir özelliktir, ancak aynı zamanda temiz küçük bir kesmek için izin verir.

Bir sonraki sayıya geçmeniz gerektiğini varsayalım. Örneğin, değişmemiz gerek

I need 2 spell better

için

I need to spell better

Bariz yol 2'ye atlamak, sonra yapmak:

sto                "Synonymous with 'clto'

Bu daha kısa olduğundan

:s/2/to<cr>

2'ye atlamanın birçok farklı yolu vardır. Örneğin,

/2<cr>
ww 
2w
ee
2e
8|
f2

Diğer birçok yolun yanı sıra.

Bunların hepsi 2 (veya daha fazla) tuş vuruşudur. Ancak bu yana <C-a>ve <C-x>sadece arttırma / azaltma numaraları, aynı zamanda bir sonraki numaraya atlamak, biz birlikte kapalı bayt alabilir

<C-a>sto

3

Golfçü hareketleri

Sık sık bir metin bloğu ile çalışıyorsanız (özellikle eski zorluklarında), arabellekteki ilk veya son karaktere gitmeniz gerekir. Gve ggoldukça iyi, ama bazı can sıkıcı şeyler var. Örneğin, son karakteri almak için, önde gelen boşluklar varsa sizi ilk sütuna koymanız gerekir G$ve gggerekmeyecektir. İşte bazı güzel hareketler, ancak metninizin ortasında boş satırlar yoksa işe yaradıklarını unutmayın:

  • Tamponun ilk karakteri: ' {den daha iyidir gg0. Metnin ortasında boş satırlar varsa, sizi gotampondaki ilk karaktere getiren ne olursa olsun kullanabilirsiniz.

  • Tamponun Son karakter: }daha iyidirG$

Bunlar aynı zamanda bir operatöre argüman olarak da çalışırlar, ancak satır-satır hareketi değil karakter-karakterli hareketler olduklarına dikkat edin!


Hdaha golfçügg
Kritixi Lithos 20:16

@KritixiLithos bunun dışında Hgüvenilir değil. Davranışı, görünen pencerenin boyutuna ve tamponun neresinde olduğunuza bağlıdır. (Bu kargaşayı önlemek için V’de yeniden düzenlenmiştir)
DJMcMayhem

2

İfade kaydı ile hesaplamaları yapın

Hesaplamaları hem normal modda hem de ekle modunda yapabilirsiniz.

Normal mod

Normal modda, yazarsanız @= imlecinizi yazarsanız, herhangi bir ifadeyi girebileceğiniz komut satırına gidersiniz. Enter tuşuna bastığınızda, ifadenin sonucu normal mod komutları olarak yürütülür.

Örneğin, geçerli satırın orta sütununa gitmek istediğinizi varsayalım. İşlev çağrısı col('$')satırdaki sütun sayısını döndürür, böylece aşağıdakileri yazarak ne yapabiliriz:

@=col('$')/2<CR>|

Enter tuşuna bastığınızda, imleç ara belleğe geri döner ve vim |bir numara girmiş gibi bir operatör (gibi ) bekler . Alternatif olarak, bu girmiş olabilirsiniz:

@=col('$')/2.'|'

... ama tabii ki daha fazla bayt.

Mod ekle

Sen basarak da ekleme modunda ifade kayıt kullanabilirsiniz <Ctrl-r>=yerine @=. Normal modda aynı şekilde çalışır, girdiğiniz ifadenin sonucu ekleme modunda yürütülecektir. Örneğin, yazdıysanız<Ctrl-r>=col('$')<CR> , geçerli satırdaki sütun sayısı, yazdığınız gibi imlecin içine eklenir.

İfade kaydı hakkında daha fazla bilgi için yazın :help "=.

İfadeleri yeniden kullanma

En son kullandığınız ifade, ifade kaydında saklanır "=. Yazma @=<CR>normal modda veya <Ctrl-r>=<CR>ekleme modunda Makrolarda gibi çok onları kullanmak için izin yeniden ifadeyi değerlendirir.

İkamelerde hesaplamalar yapar

Düzenli ifade değişimleri yaparken ifadeleri de değerlendirebilirsiniz. Tek yapmanız gereken ikame işleminize başlamak \=. Örneğin, bu dosyadaki satırları numaralandırmak istediğinizi varsayalım:

foo
bar
baz

İşlev çağrısı line('.')geçerli satır numarasını döndürür, böylece iş kolaydır. Bunu girerek:

:s/^/\=line('.').' '/g<CR>

... istenen sonucu verir:

1 foo
2 bar
3 baz

Kullanabileceğiniz böyle bir ifadenin yakalanan grupları kullanmak için submatch()örneğin işlevi, submatch(0)eşdeğerdir \0sıradan bir yerine, submatch(1)eşdeğer \1maalesef vb tuşa basarak bir sürü kadar bu yediği.

İfade değiştirme hakkında daha fazla bilgi için yazın :help sub-replace-expression.


Son örneğiniz için daha kısa yollar var. Örneğin i1 <esc>bqqywjPb<C-a>@qq@q, 5 bayt daha kısa olan saf bir normal mod çözümüdür. Eğer unix kullanıyorsanız, bile yapabilirsiniz :%!nl. Yine de iyi ipuçları!
DJMcMayhem

1
Amacım, en az tuş vuruşlarında satırların nasıl numaralandırılacağını değil, özelliği nasıl kullanacağınızı göstermekti.
Ürdün

1

Makro bir metni, kıvrılmış koşulludan önemli ölçüde kısa olabilen doğrudan değiştirebilirsiniz. Örneğin, bir şey yapıştırmak istediğiniz diyelim n defa, n kullanıcı girişidir. İlk önce bunu yapmaya çalıştım:

qq/[1-9]<enter><c-x>``p@qq@q

Açıklama:

qq                             #Start Recording
  /[1-9]<enter>                #Search for a number that isn't 0.
                <c-x>          #Decrement that number
                     ``p       #jump back to your previous location and paste.
                        @q     #Recursive call to macro 'q'
                          q@q  #Stop recording, and run the macro

Bu 18 tuş vuruşudur ve bunu yapmak için gerçekten çirkin bir yoldur. Bunun yerine, bu numaranın konumuna gidin ve şunu yapın:

Ap<esc>"qdd@q

Açıklama:

Ap<esc>                 #Append a 'p' to the end of the current line.
       "qdd             #Delete the current line into register q
           @q           #Run macro q.

Bu 9 tuş vuruşudur, çok büyük bir gelişme.

Düzenle:

Daha da kısa olanı, numaranızın makrosunu çalıştırmak ve sonra komutunuzu yazmaktır. Örneğin:

"qdd@qp

Açıklama:

"qdd         #Delete the current line into register q
    @q       #Run register q
      p      #Paste

7 tuş vuruşları.


1
1. Kullanın D, kullanmayın dd. 2. Eğer komut kayıtları içermiyorsa, daha da kısaltabilirsiniz. Örneğin, karakteri ximlecin altındaki sayı kadar tekrarlamak istiyorsanız , yerine "qD@qix<esc>kullanın D@"ix<esc>.
Doorknob
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.