Vim'deki en üretken kısayolunuz nedir?


1126

Hem artıları hem de eksileri olan Vim hakkında çok şey duydum . Gerçekten (geliştirici olarak) Vim ile diğer tüm editörlerden daha hızlı olmalısınız. Bazı temel şeyler yapmak için Vim kullanıyorum ve Vim ile en iyi 10 kat daha az üretkenim.

Hız hakkında konuşurken dikkat etmeniz gereken sadece iki şey (bunlar hakkında yeterince umursamayabilirsiniz, ancak yapmanız gerekir):

  1. Alternatif olarak sol ve sağ elleri kullanmak, klavyeyi kullanmanın en hızlı yoludur.
  2. Asla fareye dokunmak mümkün olduğunca hızlı olmanın ikinci yoludur. Elinizi hareket ettirmeniz, fareyi tutmanız, hareket ettirmeniz ve klavyeye geri getirmeniz uzun sürüyor (ve elinizi doğru yere doğru döndürdüğünüzden emin olmak için genellikle klavyeye bakmanız gerekir)

Vim ile neden daha az üretken olduğumu gösteren iki örnek.

Kopyala / Kes ve yapıştır. Onu her zaman yaparım. Tüm çağdaş editörlerle Shift sol elinizle basarsınız ve metin seçmek için imleci sağ elinizle hareket ettirirsiniz. Ardından Ctrl+ Ckopyalar, imleci ve Ctrl+ Vmacunları hareket ettirirsiniz .

Vim ile korkunç:

  • yy bir satırı kopyalamak (neredeyse hiçbir zaman tüm satırı istemezsiniz!)
  • [number xx]yyxxsatırları arabelleğe kopyalamak için. Ama ne istediğini tam olarak seçip seçmediğini asla bilemezsin. Sık sık yapmak zorunda [number xx]ddsonra ugeri alma için!

Başka bir örnek? Ara ve değiştir.

  • In PSPad : Ctrl+ fo zaman o zaman basına, aramak istediğiniz şeyi yazın Enter.
  • Vim: /alanına aramak istediğiniz şeyi yazın, ardından her özel karakterden \önce bazı özel karakterler varsa , tuşuna basın .Enter

Ve Vim ile olan her şey şöyle: doğru şekilde nasıl kullanacağımı bilmiyorum.

Not: Vim kopya sayfasını zaten okudum :)

Sorum şu:

Çağdaş bir editörden daha üretken olmanızı sağlayan Vim'i nasıl kullanıyorsunuz?


"Alternatif olarak sol ve sağ elleri kullanmak, klavyeyi kullanmanın en hızlı yoludur." Benim için değil, garip bir şekilde. Tek elle bir kelime yazabildiğimde çok daha hızlı olduğumu fark ettim.
Ben Mordecai

Yanıtlar:


2860

İle olan sorun Vim sen grok kalmamasıdır vi .

Kesimden bahsediyorsunuz yyve neredeyse hiçbir zaman tüm çizgileri kesmek istemediğinizden şikayet ediyorsunuz. Aslında programcılar, kaynak kodunu düzenlemek, genellikle tüm satırlarda, satır aralıklarında ve kod bloklarında çalışmak ister. Ancak, yyanonim kopya arabelleğine metin (ya da vi olarak adlandırıldığı gibi "kayıt") içine almak için birçok yolu sadece biridir .

Arasında "Zen" vi Bir dil konuşan olduğunu. İlk yfiil bir fiildir. Bu ifade yy, eşanlamlıdır y_. yBöyle bir ortak operasyon olduğundan daha kolay, yazın yapmak için yukarı iki katına çıkarıldı.

Bu, dd P(geçerli satırı sil ve bir kopyasını tekrar yerine yapıştır; anonim kayıtta bir kopyayı yan etki olarak bırakarak) olarak da ifade edilebilir . yVe d"fiiller" onların herhangi bir hareket olarak "konu". Böylece yW"buradan (imleç) geçerli / sonraki (büyük) kelimenin sonuna kadar y'açekilir " ve "buradan" a " adlı işareti içeren çizgiye çekilir .

Yalnızca temel yukarı, aşağı, sol ve sağ imleç hareketlerini anlarsanız , vi sizin için "not defteri" nin bir kopyasından daha verimli olmayacaktır. (Tamam, hala sözdizimi vurgulama ve bir piddling ~ 45KB veya daha büyük dosyaları işleme yeteneğine sahip olacaksınız; ancak burada benimle çalışın).

vi'da 26 "işaret" ve 26 "kayıt vardır." mKomut kullanılarak herhangi bir imleç konumuna bir işaret konur. Her işaret tek bir küçük harfle belirtilir. Böylece ma' a ' işaretini geçerli konuma ve mz' z ' işaretini ayarlar . '(Tek tırnak) komutunu kullanarak işaret içeren satıra geçebilirsiniz . Böylece 'a' a ' işaretini içeren çizginin başına gider . `(Backquote) komutunu kullanarak herhangi bir işaretin tam konumuna hareket edebilirsiniz . Böylece `zdoğrudan ' z ' işaretinin tam konumuna hareket edecektir .

Bunlar "hareketler" olduğu için diğer "ifadeler" için özne olarak da kullanılabilirler.

Yani, metnin keyfi bir seçim kesmek için bir yol işareti (genellikle 'damla olacaktır bir '' benim "ilk" işareti z , sonraki işareti olarak' ' b , bir diğerine göre' ve ' e ' olarak yine başka bir ( vi kullanarak 15 yıl içinde etkileşimli olarak dörtten fazla not kullandığımı hatırlamıyorum ; biri, etkileşimli içeriği rahatsız etmeyen makrolar tarafından işaretlerin ve kayıtların nasıl kullanıldığına dair kendi sözleşmelerini oluşturur). İstediğimiz metnin diğer ucuna; her iki uçtan da başlayabiliriz, önemli değil. Daha sonra sadece d`akesmek veya y`akopyalamak için kullanabiliriz. "modu ve gerekliEsckomut modu). Biz kesilen veya sonra kopyalanan sonra bir yapıştırarak bir kopyasını tek bir tuş vuruşu: p.

Bunun metni kesmenin veya kopyalamanın bir yolu olduğunu söylüyorum. Ancak, birçok kişiden sadece bir tanesidir. Sıklıkla imlecimizi hareket ettirmeden ve bir işaret bırakmadan metin aralığını daha açık bir şekilde tanımlayabiliriz. Mesela ben kullanabilirsiniz metin paragrafı yaşıyorum, {ve }sırasıyla paragrafın başına veya sonuna hareketler. Bu nedenle, bir metin paragrafını taşımak için { d}(3 tuş vuruşunu) kullanarak kesiyorum . (Paragrafın ilk veya son satırında olursam, sırasıyla d}veya öğesini kullanabilirim d{.

"Paragraf" kavramı genellikle sezgisel olarak makul olan bir şeydir. Bu yüzden sık sık nesir gibi kod için de çalışır.

Sıklıkla ilgilendiğimiz metnin bir ucunu veya diğerini işaretleyen bazı kalıplar (normal ifade) biliyoruz. İleri veya geri arama vi . Bu nedenle "ifadelerimizde" de "özne" olarak kullanılabilirler. Bu nedenle d/foo, geçerli satırdan "foo" dizesini içeren bir sonraki satıra kesmek ve geçerli satırdan y?bar"bar" içeren en son (önceki) satıra kopyalamak için kullanabilirim. Tüm satırları istemiyorsam hala arama hareketlerini (kendi ifadeleri olarak) kullanabilir, işaretlerimi bırakabilir ve `xkomutları daha önce açıklandığı gibi kullanabilirim .

"Fiiller" ve "özneler" e ek olarak vi da "nesneler" e sahiptir (terimin gramer anlamında). Şimdiye kadar sadece anonim kaydın kullanımını anlattım. Ancak, "nesne" başvurusu (çift tırnak değiştirici) önekini ekleyerek 26 "adlı" kayıt herhangi birini kullanabilirsiniz ". Bu yüzden eğer kullanırsam "add, mevcut satırı ' a ' kaydına "by/fookesiyorum ve eğer kullanırsam , metnin bir kopyasını buradan ' b ' kaydına "foo" içeren bir sonraki satıra soruyorum . Bir kayıttan yapıştırmak için, sadece aynı değiştirici sekansa yapıştırmanın önekini ekliyorum: "ap' a ' register ' kopyasını yapıştırır"bP" b " den geçerli satırın önüne bir kopya yapıştırır .

Bu "önekler" kavramı, metin manipülasyon "dilimize" dilbilgisel "sıfatlar" ve "zarflar" analoglarını da ekler. Çoğu komut (fiil) ve hareket (bağlama göre fiiller veya nesneler) sayısal önekler de alabilir. 3J"sonraki üç satıra katıl" ve d5}"mevcut satırdan beşinci paragrafın sonuna kadar buradan sil " anlamına gelir.

Bunların hepsi orta seviye vi . Hiçbiri Vim'e özgü değildir ve onları öğrenmeye hazırsanız vi'da çok daha gelişmiş hileler vardır . Sadece bu ara kavramlara hakim olsaydınız, muhtemelen metin manipülasyon dili, editörün "doğal" dilini kullanarak çoğu şeyi kolayca yapmak için yeterince özlü ve etkileyici olduğu için nadiren herhangi bir makro yazmanız gerektiğini görürsünüz.


Daha gelişmiş numaralardan bir örnek:

Bir takım :komutlar, özellikle de :% s/foo/bar/gküresel ikame tekniği var. (Bu gelişmiş değil ancak diğer :komutlar da olabilir). Bütün :komutlar kümesi tarihsel tarafından miras kalan vi olarak sitesindeki önceki incarnations ed (düzenleyicide) ve daha sonra eski (genişletilmiş hat editör) programları. Aslında vi böyle adlandırılır çünkü ex için görsel arayüzdür .

:komutları normalde metin satırları üzerinde çalışır. ed ve ex , terminal ekranları nadir olduğunda ve birçok terminal "teletype" (TTY) cihazları olduğu bir dönemde yazılmıştır. Bu nedenle, son derece kısa bir arayüz üzerinden komutları kullanarak metnin basılı kopyalarından çalışmak yaygındı (ortak bağlantı hızları 110 baud veya kabaca saniyede 11 karakterdi - ki bu hızlı bir daktilodan daha yavaştı; gecikmeler yaygındı çok kullanıcılı etkileşimli oturumlar; ayrıca, kağıdı korumak için genellikle bazı motivasyonlar vardı).

Bu yüzden çoğu :komutun sözdizimi , bir adres veya adres aralığı (satır numarası) ve ardından bir komut içerir. Doğal olarak, gerçek satır sayıları kullanılabilir: :127,215 s/foo/bar"foo" nun ilk oluşumunu 127 ve 215 arasındaki her satırda "bar" olarak değiştirmek için. Geçerli ve son satırlar için .veya $sırasıyla bazı kısaltmalar da kullanılabilir . Göreceli önekler de kullanılabilir +ve -sırasıyla, çizgisel çizgiden önce veya sonra ofsetleri ifade edebilir. Böylece: :.,$j"mevcut satırdan son satıra, hepsini tek bir satıra birleştir". :%ile eşanlamlıdır :1,$(tüm satırlar).

:... gVe :... vonlar inanılmaz güçlü oldukları gibi komutlar ayı biraz açıklama. :... g"global" için, bir kalıpla eşleşen tüm satırlara (normal ifade) bir sonraki komutu uygulamak için bir önek ise :... v, verilen kalıpla eşleşmeyen tüm satırlara ("conVerse" den "v" ) böyle bir komut uygular. Diğer ex komutlarında olduğu gibi , bunların önüne adresleme / aralık referansları eklenebilir. Böylece :.,+21g/foo/d"" foo "dizesini içeren satırları mevcut satırdan sonraki 21 satıra :.,$v/bar/dkadar sil" anlamına gelir "burada" dosyanın sonuna kadar, "bar" dizesini içermeyen satırları sil anlamına gelir.

Ortak Unix komut grep'in aslında bu ex komutundan esinlenilmesi ilginçtir (ve belgenin belgelendiği yoldan sonra adlandırılır). Ex komutu :g/re/p(grep) "küresel" "normal ifadeyle" (yeniden) "Bir içeren satırları" nasıl yazdırılacağını belgelenen yoluydu. Ne zaman ed ve eski kullanıldı, :pkomut herkes öğrenmiş ve herhangi bir dosyayı düzenlerken sıklıkla birincisi kullanılan ilk biriydi. Geçerli içerikleri nasıl yazdırdığınızdır (genellikle bir seferde yalnızca bir sayfa dolu :.,+25pveya bazılarını kullanarak ).

Not olduğunu :% g/.../dya da (kendi Ters / conVerse muadili: :% v/.../dEn yaygın kullanım alışkanlıkları vardır Ancak diğer çift vardır. exHatırlatmakta fayda vardır komutları:

Biz kullanabilirsiniz msatırları hareket etmek ve jçizgileri katılmak. Örneğin, bir listeniz varsa ve eşleşen tüm öğeleri silmeden ayırmak istiyorsanız (veya bazı desenlerle eşleşmiyorsa), şöyle bir şey kullanabilirsiniz: :% g/foo/m$... ve tüm "foo" satırları dosyanın sonu. (Dosyanızın ucunu sıfırlama alanı olarak kullanma hakkındaki diğer ipucuna dikkat edin). Bu, listenin geri kalanından çıkarılırken tüm "foo" hatlarının göreli sırasını koruyacaktır. (Bu, şuna benzer bir şey yapmaya eşdeğerdir: 1G!GGmap!Ggrep foo<ENTER>1G:1,'a g/foo'/d(dosyayı kendi kuyruğuna kopyalayın, kuyruğu filtreleyin grepve kafasından tüm öğeleri silin).

Hatları birleştirmek için genellikle selefine eklenmesi gereken tüm hatlar için bir desen bulabilirim (örneğin, bazı madde listelerinde "^ *" yerine "^" ile başlayan tüm hatlar). Bu durumda şunu kullanırdım: :% g/^ /-1j(eşleşen her satır için bir satır yukarı çık ve onlara katıl). (BTW: mermi çizgilerini aramaya ve bir sonrakine katılmaya çalışan mermi listeleri için birkaç nedenden dolayı işe yaramaz ... bir mermi hattına diğerine katılabilir ve hepsine herhangi bir mermi hattına katılmayacaktır . devam ediyor; maçlarda sadece çift çalışır).

Eski dostumuzu s(yedek) gve v(global / converse-global) komutlarıyla kullanabileceğinizden bahsetmeye gerek yok . Genellikle bunu yapmanız gerekmez. Ancak, yalnızca başka bir düzenle eşleşen satırlarda bir değişiklik yapmak istediğiniz bazı durumları göz önünde bulundurun. Genellikle yakalamalarla karmaşık bir desen kullanabilir ve değiştirmek istemediğiniz satırların bölümlerini korumak için geri referansları kullanabilirsiniz. Ancak, maçı yerine koymadan ayırmak daha kolay olacaktır: :% g/foo/s/bar/zzz/g- "foo" içeren her satır için "bar" yerine "zzz" koyun. (Gibi bir şey:% s/\(.*foo.*\)bar\(.*\)/\1zzz\2/gyalnızca aynı çizgide "foo" tarafından ALINAN "bar" örnekleri için çalışır; zaten yeterince hantal ve "bar" öncesinde "foo" tüm durumlarda yakalamak için daha fazla karıştırılması gerekir)

Nokta sadece daha olmasıdır p, sve dçizgilerex komut seti.

:Adresleri de işaretleri başvurabilir. Böylece: :'a,'bg/foo/j' a ' ve ' b ' işaretleri arasındaki çizgiler arasındaysa, foo dizesini içeren herhangi bir satırı sonraki çizgisine birleştirmek için kullanabilirsiniz . (Evet, önceki tümex komut örneklerinin bu tür adresleme ifadeleri ön ekiyle dosya satırlarının alt kümeleriyle sınırlandırılabilir).

Bu oldukça belirsiz (son 15 yılda sadece birkaç kez böyle bir şey kullandım). Bununla birlikte, doğru büyüyü düşünmek için zaman ayırsaydım, muhtemelen daha verimli bir şekilde yapılabilecek yinelemeli ve etkileşimli şeyler yaptığımı özgürce kabul edeceğim.

Bir başka çok kullanışlı vi veya ex komutu :rbaşka bir dosyanın içeriğini okumaktır. Böylece: :r foo"foo" adlı dosyanın içeriğini geçerli satıra ekler.

Daha güçlü :r!komut. Bu bir komutun sonuçlarını okur. Bu, vi oturumunun askıya alınması, bir komutun çalıştırılması, çıktısının geçici bir dosyaya yönlendirilmesi, vi oturumunuzun devam ettirilmesi ve geçici içeriklerin okunması ile aynıdır . dosya.

Daha da güçlü olanları !(bang) ve :... !( ex bang) komutlarıdır. Bunlar ayrıca harici komutları yürütür ve sonuçları geçerli metne okur. Ancak, komutumuz aracılığıyla metnimizin seçimlerini de filtrelerler! Bu işlem, kullandığımız bizim dosyadaki tüm satırları sıralayabilir 1G!Gsort( Golduğu vi ; dosyasının son satırına giderek üzere varsayılan olarak, ancak bu tür 1, ilk satır olarak, bir satır sayısına göre öneki "git" komutu). Bu eski varyant ile eşdeğerdir :1,$!sort. Yazarlar genellikle metin seçimlerini yeniden düzenlemek veya "sözcük kaydırma" için !Unix fmt veya fold yardımcı programlarıyla birlikte kullanırlar . Çok yaygın bir makro{!}fmt(geçerli paragrafı yeniden biçimlendirir). Programcılar bazen kodunu veya sadece bazı kısımlarını girinti veya diğer kod yeniden biçimlendirme araçları.

:r!Ve !komutlarının kullanılması, herhangi bir harici yardımcı programın veya filtrenin editörümüzün bir uzantısı olarak değerlendirilebileceği anlamına gelir. Zaman zaman bunları bir veritabanından veri çeken komut dosyalarıyla veya bir web sitesinden veri çeken wget veya lynx komutlarıyla veya uzak sistemlerden veri çeken ssh komutlarıyla kullandım.

Başka bir yararlı ex komutu :so(kısaltması :source). Bu, bir dosyanın içeriğini bir dizi komut olarak okur. Vi'yi normal olarak başlattığınızda , dolaylı olarak, bir dosya :sourceüzerinde gerçekleştirir ~/.exinitrc(ve Vim genellikle bunu yapar ~/.vimrc, doğal olarak yeterlidir). Bunun kullanımı, yeni bir makro, kısaltma ve editör ayarlarından yararlanarak editör profilinizi anında değiştirebilmenizdir. Sinsi iseniz , talep üzerine dosyalara uygulamak için eski düzenleme komutlarının dizilerini saklamak için bir hile olarak bile kullanabilirsiniz .

Örneğin, wc aracılığıyla bir dosyayı çalıştıran ve bu kelime sayımı verilerini içeren dosyanın üst kısmına C stili bir yorum ekleyen yedi satırlı bir dosyam (36 karakter) var . Bu "makro" gibi bir komut kullanarak bir dosyaya uygulayabilirsiniz:vim +'so mymacro.ex' ./mytarget

( Vi ve Vim+ komut satırı seçeneği normalde belirli bir satır numarasında düzenleme oturumunu başlatmak için kullanılır. Ancak , "kaynak" komutu gibi geçerli herhangi bir eski komut / ifade ile Burada yaptım; basit bir örnek için çağıran komut dosyaları var: bir dizi sunucu yeniden görüntülerken etkileşimli olmayan SSH bilinen ana bilgisayar dosyamdan bir girişi kaldırmak için).+vi +'/foo/d|wq!' ~/.ssh/known_hosts

Genellikle Perl, AWK, sed kullanarak bu tür "makroları" yazmak çok daha kolaydır (aslında, grep , ed komutundan esinlenen bir yardımcı program gibi ).

@Komut muhtemelen en karanlık olduğu vi komutu. Arada bir on yıla yakın bir süredir gelişmiş sistem yönetimi dersleri verirken, bunu kullanan çok az insanla tanıştım. vi veya ex komutu @gibi bir kaydın içeriğini yürütür . Örnek: Sistemimdeki bazı dosyaları bulmak ve adını belgeme okumak için sık sık: kullanıyorum . Oradan, sadece ilgilendiğim dosyanın tam yolunu bırakarak herhangi bir yabancı isabet silerim. Yolun her bir bileşenini zahmetli bir şekilde kullanmak yerine (veya Tab tamamlama desteği olmayan bir makineye takılırsam daha da kötüsü) vi kopyasında ) sadece kullanıyorum:
:r!locate ...Tab

  1. 0i:r(geçerli satırı geçerli bir r komutuna dönüştürmek için ),
  2. "cdd (satırı "c" kaydına silmek için) ve
  3. @c bu komutu yürütün.

Bu sadece 10 tuş vuruşudur (ve ifade "cdd @cbenim için etkili bir şekilde bir parmak makrosudur, bu yüzden neredeyse altı harfli herhangi bir kelime kadar hızlı yazabilirim).


Ayıltıcı bir düşünce

Ben sadece vi gücünün yüzeyine kaşıdım ve burada tarif ettiğim şeylerin hiçbiri, vim adı verilen "iyileştirmelerin" bir parçası bile değil ! Burada tarif ettiğim tüm 20 veya 30 yıl önceki vi herhangi eski bir kopya üzerinde çalışması gerekir .

Vi'nın gücünü benden çok daha fazla kullanan insanlar var .


440
Kutsal kod maymunları, .. bu derinlemesine bir cevap. Harika olan, muhtemelen yaklaşık 10 tuş vuruşuyla vim'de yazmış olmanızdır.
EightyOne Unite

48
@Wahnfieden - grok tam olarak kastettiğim şey: en.wikipedia.org/wiki/Grok (Görünüşe göre OED'de bile --- anglofonların en yakın kanonik bir sözlüğe sahip olması). Bir editör "grok" için, komutlarını akıcı bir şekilde kullanarak ... doğal dilinizmiş gibi bulmaktır.
Jim Dennis

22
vay, çok iyi yazılmış bir cevap! Ben @komut çok kullanmak rağmen daha kabul edemedim (ile birlikte q: kayıt makro)
knittl

63
Gerçekten korkunç bir soruyu tamamen kullanan mükemmel cevap. Bu sorunun cevabını vereceğim, normalde aşağıya vuracağım, böylece bu cevabın bulunması kolaylaşacak. (Ve ben bir Emacs erkeğiyim! Ama bu şekilde vi güç kullanıcılarının vi hakkında neleri eğlenceli bulduğunu iyi bir şekilde açıklamak isteyen yeni insanlara işaret edecek bir yerim olacak. Sonra onlara Emacs'tan bahsedeceğim ve karar verebilirler.)
Brandon Rhodes

8
Bir web sitesi yapabilir ve bu öğreticiyi oraya koyabilir misiniz, bu yüzden burada stackoverflow'a gömülmez. Daha sonra vi için daha iyi bir giriş okumadım.
Marko

504

Metin seçme ve kopyalama hakkında konuşuyorsunuz, sanırım Vim Görsel Moduna bir göz atmalısınız .

Görsel modda, Vim komutlarını kullanarak metin seçebilir, ardından seçim ile istediğinizi yapabilirsiniz.

Aşağıdaki yaygın senaryoları göz önünde bulundurun:

Bir sonraki eşleşen parantezleri seçmeniz gerekir.

Şunları yapabilirsiniz:

  • v% imleç başlangıç ​​/ bitiş parantezinin üzerindeyse
  • vib imleç parantez bloğunun içindeyse

Alıntılar arasında metin seçmek istiyorsunuz:

  • vi" çift ​​tırnak işaretleri için
  • vi ' tek tırnak için

Kıvırcık parantez bloğu seçmek istiyorsunuz (C stili dillerde çok yaygındır):

  • viB
  • vi{

Dosyanın tamamını seçmek istiyorsunuz:

  • ggVG

Görsel blok seçimi gerçekten kullanışlı bir başka özelliktir, dikdörtgen bir metin alanı seçmenize izin verir, sadece Ctrl- tuşuna basmanız Vve istediğiniz metin bloğunu seçmeniz ve yank, delete, yapıştırma, düzenleme, vb . Sütuna yönelik metni düzenlemek harika .


2
Her editör böyle bir şeye sahiptir, vim'e özgü değildir.
finnw

22
Evet, ancak posterin belirli bir şikayeti vardı. Görsel mod, Vim'in doğrudan metin seçimi ve manipülasyonu için en iyi yöntemidir. Ve vim'in tampon geçiş yöntemleri mükemmel olduğundan, vim'deki metin seçimini oldukça keyifli buluyorum.
silahlar

9
Ben de bir blok seçmek için Ctrl-V bahsetmeye değer olduğunu düşünüyorum - yani keyfi bir metin dikdörtgen. İhtiyacınız olduğunda bu bir cankurtaran.
Hamish Downer

6
@viksit: Camtasia kullanıyorum, ancak birçok alternatif var: codinghorror.com/blog/2006/11/screencasting-for-windows.html
CMS

3
Ayrıca, görsel bir seçiminiz varsa ve ayarlamak istiyorsanız, odiğer uca atlayacaksınız. Böylece seçimin hem başlangıcını hem de sonunu istediğiniz kadar hareket ettirebilirsiniz.
Nathan Long

207

Bazı verimlilik ipuçları:

Akıllı hareketler

  • *ve #imlecin altındaki sözcüğü ileri / geri arar.
  • w sonraki kelimeye
  • W boşlukla ayrılmış bir sonraki kelimeye
  • b/ egeçerli sözcüğün başlangıcına / sonuna kadar. ( B/ Eyalnızca ayrılan alan için)
  • gg/ Gdosyanın başına / sonuna atla.
  • % eşleşen {..} veya (..) vb.
  • {/ }sonraki paragrafa atlar.
  • '. en son düzenlenen satıra geri atla.
  • g; son düzenlenen konuma geri atla.

Hızlı düzenleme komutları

  • I başında yerleştirin.
  • A sonuna ekle.
  • o/ Oakımdan sonra / akımdan önce yeni bir satır açar.
  • v/ V/ Ctrl+Vgörsel mod (metin seçmek için!)
  • Shift+R metni değiştir
  • C satırın kalan kısmını değiştir.

Komutları birleştirme

Çoğu komut bir miktarı ve yönü kabul eder, örneğin:

  • cW = kelimenin sonuna kadar değiş
  • 3cW = 3 kelimeyi değiştir
  • BcW = tam kelimenin başlangıcı, tam kelimeyi değiştir
  • ciW = iç kelimeyi değiştir.
  • ci" = iç kısmı ".." arasında değiştir
  • ci( = metni (..) arasında değiştir
  • ci<= <..> arasındaki metni değiştir ( set matchpairs+=<:>vimrc'deki ihtiyaçlar )
  • 4dd = 4 satırı sil
  • 3x = 3 karakteri sil.
  • 3s = yedek 3 karakter.

Yararlı programcı komutları

  • rbir karakteri değiştir (örneğin rd, geçerli karakteri değiştirir d).
  • ~ büyük / küçük harf değişimi yapar.
  • J iki hatta katılır
  • Ctrl + A / Ctrl + X bir sayıyı artırır / azaltır.
  • . son komutu tekrarla (basit bir makro)
  • == satır girintisini düzelt
  • > girinti bloğu (görsel modda)
  • < girintisiz blok (görsel modda)

Makro kaydı

  • Kayda q[ key ]başlamak için tuşuna basın .
  • Sonra qkaydı durdurmak için tuşuna basın.
  • Makro ile oynatılabilir @[ key ].

Çok özel komutlar ve hareketler kullanarak VIM, sonraki satırlar için bu kesin eylemleri tekrarlayabilir. (örn. uçtan uca eklemek için b/ e, imleci sırasıyla bir sözcüğün başına veya sonuna taşımak için)

İyi yapılmış ayarlara örnek

# reset to vim-defaults
if &compatible          # only if not set before:
  set nocompatible      # use vim-defaults instead of vi-defaults (easier, more user friendly)
endif

# display settings
set background=dark     # enable for dark terminals
set nowrap              # dont wrap lines
set scrolloff=2         # 2 lines above/below cursor when scrolling
set number              # show line numbers
set showmatch           # show matching bracket (briefly jump)
set showmode            # show mode in status bar (insert/replace/...)
set showcmd             # show typed command in status bar
set ruler               # show cursor position in status bar
set title               # show file in titlebar
set wildmenu            # completion with menu
set wildignore=*.o,*.obj,*.bak,*.exe,*.py[co],*.swp,*~,*.pyc,.svn
set laststatus=2        # use 2 lines for the status bar
set matchtime=2         # show matching bracket for 0.2 seconds
set matchpairs+=<:>     # specially for html

# editor settings
set esckeys             # map missed escape sequences (enables keypad keys)
set ignorecase          # case insensitive searching
set smartcase           # but become case sensitive if you type uppercase characters
set smartindent         # smart auto indenting
set smarttab            # smart tab handling for indenting
set magic               # change the way backslashes are used in search patterns
set bs=indent,eol,start # Allow backspacing over everything in insert mode

set tabstop=4           # number of spaces a tab counts for
set shiftwidth=4        # spaces for autoindents
#set expandtab           # turn a tabs into spaces

set fileformat=unix     # file mode is unix
#set fileformats=unix,dos    # only detect unix file format, displays that ^M with dos files

# system settings
set lazyredraw          # no redraws in macros
set confirm             # get a dialog when :q, :w, or :wq fails
set nobackup            # no backup~ files.
set viminfo='20,\"500   # remember copy registers after quitting in the .viminfo file -- 20 jump links, regs up to 500 lines'
set hidden              # remember undo after quitting
set history=50          # keep 50 lines of command history
set mouse=v             # use mouse in visual mode (not normal,insert,command,help mode


# color settings (if terminal/gui supports it)
if &t_Co > 2 || has("gui_running")
  syntax on          # enable colors
  set hlsearch       # highlight search (very useful!)
  set incsearch      # search incremently (search while typing)
endif

# paste mode toggle (needed when using autoindent/smartindent)
map <F10> :set paste<CR>
map <F11> :set nopaste<CR>
imap <F10> <C-O>:set paste<CR>
imap <F11> <nop>
set pastetoggle=<F11>

# Use of the filetype plugins, auto completion and indentation support
filetype plugin indent on

# file type specific settings
if has("autocmd")
  # For debugging
  #set verbose=9

  # if bash is sh.
  let bash_is_sh=1

  # change to directory of current file automatically
  autocmd BufEnter * lcd %:p:h

  # Put these in an autocmd group, so that we can delete them easily.
  augroup mysettings
    au FileType xslt,xml,css,html,xhtml,javascript,sh,config,c,cpp,docbook set smartindent shiftwidth=2 softtabstop=2 expandtab
    au FileType tex set wrap shiftwidth=2 softtabstop=2 expandtab

    # Confirm to PEP8
    au FileType python set tabstop=4 softtabstop=4 expandtab shiftwidth=4 cinwords=if,elif,else,for,while,try,except,finally,def,class
  augroup END

  augroup perl
    # reset (disable previous 'augroup perl' settings)
    au!  

    au BufReadPre,BufNewFile
    \ *.pl,*.pm
    \ set formatoptions=croq smartindent shiftwidth=2 softtabstop=2 cindent cinkeys='0{,0},!^F,o,O,e' " tags=./tags,tags,~/devel/tags,~/devel/C
    # formatoption:
    #   t - wrap text using textwidth
    #   c - wrap comments using textwidth (and auto insert comment leader)
    #   r - auto insert comment leader when pressing <return> in insert mode
    #   o - auto insert comment leader when pressing 'o' or 'O'.
    #   q - allow formatting of comments with "gq"
    #   a - auto formatting for paragraphs
    #   n - auto wrap numbered lists
    #   
  augroup END


  # Always jump to the last known cursor position. 
  # Don't do it when the position is invalid or when inside
  # an event handler (happens when dropping a file on gvim). 
  autocmd BufReadPost * 
    \ if line("'\"") > 0 && line("'\"") <= line("$") | 
    \   exe "normal g`\"" | 
    \ endif 

endif # has("autocmd")

Ayarlar aşağıdakiler kullanılarak dosyada saklanabilir ~/.vimrcveya sistem genelinde /etc/vimrc.localve daha sonra /etc/vimrcdosyadan okunabilir :

source /etc/vimrc.local

( VIM'de çalışması için #yorum karakterini değiştirmelisiniz, "burada uygun sözdizimi vurgulaması yapmak istedim).

Burada listelediğim komutlar oldukça basit ve şimdiye kadar kullandığım komutlar. Tüm fantezi şeyleri bilmeden beni çok daha üretken yapıyorlar.


4
Daha iyi '.DİR g;üzerinden geri atlar, changelist. Son düzenlenmiş satır yerine son düzenlenmiş konuma
gider

98

Control+ RMekanizması çok yararlıdır :-) olarak, ya modunda sokma ya da komut modunda (ilgili yani :, numaralandırılmış bir veya adlandırılan kayıt devam yazarak komutlar doğrultusunda):

  • a- zadlandırılmış kayıtlar
  • " son silme veya yank metnini içeren adsız kayıt
  • % geçerli dosya adı
  • # alternatif dosya adı
  • * panonun içindekiler (X11: birincil seçim)
  • + pano içeriği
  • / son arama modeli
  • : son komut satırı
  • . son eklenen metin
  • - son küçük (satırdan az) silme
  • =5*5 metne 25 ekleme (mini hesap makinesi)

Daha fazla ayrıntı için :help i_CTRL-Rve bölümüne bakın ve :help c_CTRL-Rdaha fazla CTRL-R iyiliği için yakınınızda dolaşın.


10
Bilginize, bu ekleme modunda Ctrl + R anlamına gelir . Normal modda, Ctrl + R yeniden yapılır.
vdboor

2
Geçerli / alternatif dosya adı için +1. Control-Aayrıca son eklenen metin için ekleme modunda çalışır ve Control-@hem son eklenen metni ekler hem de hemen normal moda geçer.
Aryeh Leib Taurog

91

Vim Eklentileri

Burada birçok iyi cevap var ve vi'nun zeniyle ilgili şaşırtıcı bir tane var. Bahsetmediğim bir şey, vim eklentileri ile son derece genişletilebilir olmasıdır. Orijinal yazarın hiç düşünmediği her türlü çılgın şeyi yapmasını sağlayan komut dosyaları ve eklentiler vardır. İşte inanılmaz kullanışlı vim eklentilerine birkaç örnek:

rails.vim

Rails.vim, tpope tarafından yazılmış bir eklentidir. Ray geliştirme yapan insanlar için inanılmaz bir araçtır. Bir denetleyicideki bir yöntemden ilişkili görünüme, bir modele ve o model için birim testlerine kolayca atlamanıza izin veren büyülü bağlama duyarlı şeyler yapar. Ray geliştiricisi olarak yüzlerce saat olmasalar bile düzinelerce tasarruf sağladı.

gist.vim

Bu eklenti, görsel modda bir metin bölgesi seçmenizi ve gist.github.com'a göndermek için hızlı bir komut yazmanızı sağlar . Bu, IRC veya IM üzerinden biriyle işbirliği yapıyorsanız inanılmaz derecede kullanışlı olan kolay macun erişimi sağlar.

space.vim

Bu eklenti boşluk çubuğuna özel işlevsellik sağlar. Boşluk çubuğunu döneme benzer bir şeye dönüştürür, ancak eylemleri tekrarlamak yerine hareketleri tekrarlar. Bu, bir dosyada anında tanımladığınız şekilde hızlı bir şekilde hareket etmek için çok kullanışlı olabilir.

surround.vim

Bu eklenti, size bir şekilde sınırlandırılmış metinlerle çalışma imkanı verir. Size parenlerin içindeki şeyleri, tırnak içindeki şeyleri vb. Gösteren nesneler verir. Sınırlı metni değiştirmek için kullanışlı olabilir.

supertab.vim

Bu komut dosyası, vim'e süslü sekme tamamlama işlevselliği getirir. Otomatik tamamlama öğeleri zaten vim'in çekirdeğinde var, ancak bu onu birden çok farklı çoklu kısayol yerine hızlı bir sekmeye getiriyor. Çok kullanışlı ve kullanımı inanılmaz eğlenceli. VS'nin zekası olmasa da, büyük bir adımdır ve bir sekme tamamlama aracından beklemek istediğiniz işlevselliği büyük ölçüde getirir.

syntastic.vim

Bu araç harici sözdizimi kontrol komutlarını vim'e getirir. Ben şahsen kullanmadım, ama bu konuda harika şeyler duydum ve bu kavramın yenilmesi zor. Sözdizimini manuel olarak yapmak zorunda kalmadan kontrol etmek büyük bir zaman tasarrufu sağlar ve sözdizimsel hataları, sonunda test etmeyi bıraktığınız zaman yerine tanıttıkça yakalamanıza yardımcı olabilir.

fugitive.vim

Vim'in içinden git'e doğrudan erişim. Yine, bu eklentiyi kullanmadım, ancak yardımcı programı görebiliyorum. Ne yazık ki svn "yeni" olarak kabul edilen bir kültürdeyim, bu yüzden git işte oldukça uzun bir süre görmeyeceğim.

nerdtree.vim

Vim için bir ağaç tarayıcı. Son zamanlarda kullanmaya başladım ve gerçekten kullanışlı. Bir treeview'ı dikey bir bölmeye koymanızı ve dosyaları kolayca açmanızı sağlar. Bu, sık sık atladığınız birçok kaynak dosyası içeren bir proje için mükemmeldir.

FuzzyFinderTextmate.vim

Bu, korunmayan bir eklentidir, ancak yine de inanılmaz derecede yararlıdır. "Bulanık" açıklayıcı bir sözdizimi kullanarak dosyaları açma yeteneği sağlar. Bu, seyrek bir dosya ağacında, ilgilendiğiniz dosyaları serinin geri kalanından ayırmak için sadece yeterli karakter yazmanız gerektiği anlamına gelir.

Sonuç

Vim için birçok inanılmaz araç var. Eminim sadece yüzeyi çizdim ve alanınız için uygun araçları aramaya değer. Geleneksel vi'nin güçlü araç setinin, vim'in üzerindeki geliştirmelerin ve vimi daha da genişleten eklentilerin kombinasyonu, şimdiye kadar tasarlanan metni düzenlemenin en güçlü yollarından biridir. Vim emacs, eclipse, visual studio ve textmate kadar güçlüdür.

Teşekkürler

Duwanis'e , çok şey öğrendiğim ve burada listelenen eklentilerin çoğunu ödünç aldığım vim yapılandırmaları için teşekkürler .


Rails.vim'deki sınıfa ait sihirli testler navigasyonu, Vim'in TextMate'in tüm diller üzerinde kesinlikle çivi olmasını dilediğim daha genel şeylerden biri: Person.scala üzerinde çalışıyorsam ve Cmd + T yapsam, genellikle ilk şey listede PersonTest.scala.
Tom Morris

5
Sanırım zamanı geldi FuzzyFinderTextmate, github.com/wincent/Command-T
Gavin Gilmour

2
Sözdizimi için +1. Bu, JSLint ile birlikte, Javascript'imi daha az hataya eğilimli hale getirdi. JSLint'in Syntastic ile çalışacak şekilde nasıl ayarlanacağı hakkında superuser.com/questions/247012/… adresine bakın.
Nathan Long

1
@Benson Harika bir liste! Ben de snipMate'e fırlattım . Ortak kodlama malzemelerinin çok yararlı otomasyonu. eğer <tab> blok ise anında, vb.
AlG

2
Bence nerdcommenter da iyi bir eklenti: burada . Adından da anlaşılacağı gibi, kodunuzu yorumlamak içindir.
Stephan

53

. Son metin değiştirme komutunu tekrarla

Bununla çok zaman kazanıyorum.

Görsel mod daha önce bahsedilmişti, ancak blok görsel mod metin dosyasında sabit boyutlu sütunları düzenlerken bana çok zaman kazandırdı. (Ctrl-V ile erişilir).


3
Ayrıca, metni düzenlemek için özlü bir komut kullanırsanız (örneğin, sonuna ekleme için A), vim, tuşuna bastığınız bir sonraki satır için aynı işlemi tekrarlayabilir ..
vdboor

48

gi

Son düzenlenen konuma git (biraz arama yaptıysanız ve düzenlemek için geri dönmek istiyorsanız çok kullanışlıdır)

^ P ve ^ N

Önceki (^ P) veya sonraki (^ N) metni tamamlayın.

^ O ve ^ I

Önceki ( ^O- "O"eski için) konuma veya sonraki ( ^I- "I"sadece yakınına "O") git. Arama yaptığınızda, dosyaları düzenlediğinizde, bu "atlamalarda" ileri ve geri gezinebilirsiniz.


4
@Kungi `. sizi son düzenlemeye götürecek `` sizi son 'atlamadan önce bulunduğunuz konuma geri götürecek - ki bu da son düzenlemenin konumu olabilir / olabilir / olabilir.
Grant McLean


42

CTRL+A üzerinde durduğunuz sayıyı artırır.


19
... ve CTRL-X azalmaları.
innaM

9
Temiz bir kısayol ama şimdiye kadar bunun için herhangi bir kullanım bulmadım.
SolutionYogi

8
Ekranda vim çalıştırır ve bunun neden çalışmadığını merak ederseniz - ctrl + A, A
matja

13
@SolutionYogi: Her satırın başına satır numarası eklemek istediğinizi düşünün. Çözüm: ggI1 <boşluk> <esc> 0qqyawjP0 <ca> 0q9999 @ q
hcs42

10
URL'deki son sayıyı arttırdığı (veya azalttığı, Ctrl-X) Vimperator ile son derece kullanışlıdır. Resim galerileri vb.
İle

38

Hepsi Normal modda:

f <char> geçerli satırdaki belirli bir karakterin bir sonraki örneğine geçmek için ; tekrarlamak için.

Geçerli satırdaki belirli bir karakterin önceki örneğine gitmek için F <char> ve ;tekrarlamak için.

Akıllıca kullanılırsa, yukarıdaki ikisi sizi bir çizgide katil hızlı hareket ettirebilir.

* bir sonraki örneği aramak için kelimeye.

# kelimesi üzerinde önceki örneği aramak için.


6
Vay, * ve # (imlecin altındaki kelimeyi ileri / geri ara) bağlama hakkında bilmiyordum. Bu biraz havalı. F / F ve t / T ve; komutları, geçerli satırdaki karakterlere hızlı bir şekilde atlar. f / F imleci belirtilen karakterin üzerine getirir, t / T ise karakteri "" karakterine (seçilen yöne göre hemen önceki veya sonraki karaktere) getirir; en yeni f / F / t / T karakterini tekrarlar atlama (aynı yönde)
Jim Dennis

10
:) vim.org adresindeki ipuçları sayfasının üstündeki kısa açıklama: "Yalnızca" * "komutunu zamanında bilseydim kaç tane tuş vuruşunun kaydedilebileceğini hayal edebiliyor musunuz?" - Juergen Salk, 1/19/2001 "
Yewge

1
Jim'in de belirttiği gibi, "t / T" kombinasyonu genellikle daha iyi değilse, örneğin ct(kelimeyi silecek ve sizi ekleme moduna sokacak, ancak parantezleri koruyacak!
puk

34

Oturum, toplantı, celse

a. Oturumu kaydet

: mks oturum adı

b. oturumu kaydetmeye zorla

: mks! SessionName

c. oturumu yükle

gvim veya vim -S oturum adı


Toplama ve Çıkarma

a. Toplama ve Çıkarma

CTRL-A; İmleçteki veya sonrasındaki sayıya veya alfabetik karaktere [sayım] ekleyin. {Vi'da değil

CTRL-X; İmleçteki veya sonrasındaki sayıdan veya alfabetik karakterden [sayım] çıkarın. {Vi'da değil}

b. Pencere tuşunun eşleştirmesinin kaldırılması

Pencerede, Ctrl-A zaten tüm dosya seçimi için eşlenmiş rc dosya eşlemesini gerekir. mswin.vim CTRL-A eşleme bölümünü yorum olarak işaretle veya rc dosyanızı unmap ile ekle

c. Makro ile

CTRL-A komutu bir makroda çok kullanışlıdır. Örnek: Numaralandırılmış bir liste yapmak için aşağıdaki adımları kullanın.

  1. İlk liste girişini oluşturun, bir numarayla başladığından emin olun.
  2. qa - 'a' ara belleğine kaydetmeye başla
  3. Y - girişi çeker
  4. p - girişin bir kopyasını birincinin altına koy
  5. CTRL-A - sayıyı artırır
  6. q - kaydı durdur
  7. @a - yank, koy ve artış sürelerini tekrarla

1
Windows'da kısayolların ne olduğu hakkında bir fikriniz var mı?
Don Reba

32

Geçen hafta işyerinde projemiz birçok Python kodunu başka bir projeden miras aldı. Ne yazık ki kod mevcut mimarimize uymadı - hepsi çok iş parçacıklı bir ortamda çalışmayan küresel değişkenler ve işlevlerle yapıldı.

Nesneye yönelik olarak yeniden çalışılması gereken ~ 80 dosyamız vardı - tüm fonksiyonlar sınıflara taşındı, parametreler değişti, içe aktarma ifadeleri eklendi, vb. Her dosyaya yapılması gereken yaklaşık 20 tür düzeltme listesi vardı. Bir kişinin elle yapmanın günde 2-4 belki yapabileceğini tahmin ediyorum.

Bu yüzden ilkini elle yaptım ve değişiklikleri otomatikleştirmek için bir vim betiği yazdım. Çoğu, vim komutlarının bir listesiydi.

" delete an un-needed function "
g/someFunction(/ d

" add wibble parameter to function foo "
%s/foo(/foo( wibble,/

" convert all function calls bar(thing) into method calls thing.bar() "
g/bar(/ normal nmaf(ldi(`aPa.

Sonuncusu biraz açıklamayı hak ediyor:

g/bar(/  executes the following command on every line that contains "bar("
normal   execute the following text as if it was typed in in normal mode
n        goes to the next match of "bar(" (since the :g command leaves the cursor position at the start of the line)
ma       saves the cursor position in mark a
f(       moves forward to the next opening bracket
l        moves right one character, so the cursor is now inside the brackets
di(      delete all the text inside the brackets
`a       go back to the position saved as mark a (i.e. the first character of "bar")
P        paste the deleted text before the current cursor position
a.       go into insert mode and add a "." 

Tüm ithalat ifadelerini oluşturmak gibi daha karmaşık dönüşümler için vim betiğine bazı pythonları yerleştirdim.

Üzerinde birkaç saat çalıştıktan sonra dönüşümün en az% 95'ini yapacak bir senaryom vardı. Ben sadece vim bir dosya açmak sonra çalıştırın :source fixit.vimve dosya göz açıp kapayıncaya dönüştürülür.

Hala otomatikleştirmeye ve sonuçları test etmeye değmeyen kalan% 5'i değiştirme çalışmalarımız var, ancak bu senaryoyu yazarak bir gün geçirerek haftalarca iş tasarrufu yaptığımızı tahmin ediyorum.

Elbette bunu Python veya Ruby gibi bir komut dosyası dili ile otomatikleştirmek mümkün olurdu, ancak yazmak çok daha uzun sürecek ve daha az esnek olacaktı - son örnek zor olurdu çünkü regex tek başına işlemeyemezdi İç içe parantez, örneğin dönüştürmek bar(foo(xxx))için foo(xxx).bar(). Vim görev için mükemmeldi.


1
"Kullanışlı ve klasik olmayan" makrolardan öğrenmek gerçekten güzel paylaşım için teşekkürler.
Olivier Pons

%s/\(bar\)(\(.\+\))/\2.\1()/bunu da yapardı. (Kaçışlar ile uyumludur :set magic.) Sadece kayıt için. :)
Ipsquiggle

1
Eğer vim tarzı kaçışları sevmiyorsanız, Very Magic'i açmak için \ v kullanın:%s/\v(bar)\((.+)\)/\2.\1()/
Ipsquiggle

@lpsquiggle: öneriniz birden fazla köşeli parantez içeren karmaşık ifadeleri işlemez. örneğin tamamen yanlış olan if bar(foo(xxx)) or wibble(xxx): olur if foo(xxx)) or wibble(xxx.bar():.
Dave Kirby

28

Yerleşik dosya gezgini kullanın! Komuttur :Exploreve bunu çok çok hızlı kaynak kodunu gezinmek için izin verir. Bu eşleme var benim .vimrc:

map <silent> <F8>   :Explore<CR>
map <silent> <S-F8> :sp +Explore<CR>

Gezgin de dosya değişiklikleri yapmanıza izin verir. Favori anahtarlarımdan bazılarını <F1>göndereceğim , tuşuna basmak size tam listeyi verecektir:

  • - : En faydalı: Üst dizine geç ( cd ..)
  • mf : Bir dosyayı işaretleme
  • D : İşaretli dosyaları veya işaretli değilse imlecin üzerinde bulunduğu dosyayı silin.
  • R, : İmlecin üzerinde bulunduğu dosyayı yeniden adlandırın.
  • d : Geçerli dizinde yeni bir dizin oluşturun
  • % : Geçerli dizinde yeni bir dosya oluştur

1
Her zaman tarama için varsayılan yöntemlerin çoğu şeyler için emdi düşündüm. Nereye gitmek istediğinizi biliyorsanız, sadece göz atmak yavaştır. Vim.org'un senaryo bölümündeki LustyExplorer çok gerekli bir gelişmedir.
Svend

İkinci eşlemeniz daha basit olabilir: <silent> <S-F8> haritası: Sexplore <CR>
Toros Olson

8
Yerleşik gezgin yerine NERDtree'yi öneririm. Projelerde vim kullanma şeklim değişti ve beni daha üretken hale getirdi. Bunun için google.
kprobst

Ben sadece kullanmak, kaynak ağacını keşfetmek için ihtiyacı hissediyor asla :find, :tagve çeşitli ilgili tuş vuruşlarını etrafında atlamak için. (Belki de bunun nedeni, üzerinde çalıştığım kaynak ağaçların büyük ve yaptığımdan farklı bir şekilde organize edilmiş olması mı? :))
dash-tom-bang

25

Amerikan Şifreleme Derneği üyesiyim. İki ayda bir çıkan dergi, çeşitli türlerde 100'den fazla kriptogram içerir. Bunlardan kabaca 15 tanesi "kriptaritm" dir - rakamlar için değiştirilen harflerle ilgili çeşitli aritmetik problemler. Bunların iki veya üçü sayılar yerine harfler hariç sudokustur. Izgara tamamlandığında, dokuz farklı harf kılavuzun herhangi bir yerinde bir satırda, diyagonal, spiral vb.

Kalemle çalışmak veya sorunları elle yazmak yerine, web sitelerinin üye alanından sorunları indiriyorum.

Bu sudokusla çalışırken vi'yi kullanıyorum, çünkü vi'nın birkaç editöründe sahip olduğu tesisleri kullanıyorum. Çoğunlukla harfli ızgarayı numaralı bir ızgaraya dönüştürürken, çözmeyi daha kolay buluyorum ve sonra tamamlanmış numaralı ızgarayı çözüm sözcüğünü veya kelimelerini bulmak için tekrar harfli ızgaraya dönüştürüyorum.

Sorun dokuz harfli dokuz grup olarak biçimlendirilir. - s boşlukları temsil eder ve iki satır halinde yazılır. İlk adım, bunları dokuz karakterden oluşan dokuz satır halinde biçimlendirmektir. Bununla ilgili özel bir şey yok, sadece uygun yerlere sekiz satır aralığı ekliyor.

Sonuç şöyle görünecektir:

T-O-----C
-E-----S-
--AT--N-L
---NASO--
---E-T---
--SPCL---
E-T--OS--
-A-----P-
S-----C-T

Yani, bunu sayılara dönüştürmenin ilk adımı farklı harflerin bir listesini yapmaktır. İlk olarak, bloğun bir kopyasını yapıyorum. İmleci bloğun üstüne konumlandırıyorum ve yazıyorum :y}}p. :beni komut moduna sokuyor y, bir sonraki hareket komutunu istiyor. Yana }sonraki paragrafın sonuna bir harekettir, y}paragraf kopyalar. }sonra imleci paragrafın sonuna taşır ve imleçten phemen sonra çektiğimiz şeyi yapıştırır. Yaniy}}p bir sonraki paragrafın bir kopyasını oluşturur ve iki kopya arasındaki imleçle biter.

Sonra, bu kopyalardan birini ayrı harfler listesine dönüştüreceğim. Bu komut biraz daha karmaşık:

:!}tr -cd A-Z | sed 's/\(.\)/\1\n/g' | sort -u | tr -d '\n'

:beni tekrar komut kipine sokuyor. !, bir sonraki kodun içeriğinin bir komut satırı üzerinden iletilmesi gerektiğini belirtir. }Bir sonraki paragraf verilirse ve komut satırı sonra kullanır tr, büyük harfler hariç her şeyi dışarı atmak için komutu sedkomut tek bir satırda her harfi ve yazdırmak için sort, çiftleri kaldırarak bu satırları sıralamak için komutu ve ardından trçıkarır yeni satırlar, dokuz ayrı harfi tek bir satırda bırakarak, paragrafı orijinal olarak oluşturan dokuz satırın yerini aldı. Bu durumda, harfler şunlardır: ACELNOPST.

Bir sonraki adım, ızgaranın başka bir kopyasını oluşturmaktır. Sonra sadece basit 1'den 9'a kadar bir rakam ile bu harflerin her yerine tespit ettik harfleri kullanmak: :!}tr ACELNOPST 0-9. Sonuç:

8-5-----1
-2-----7-
--08--4-3
---4075--
---2-8---
--7613---
2-8--57--
-0-----6-
7-----1-8

Bu daha sonra normal şekilde çözülebilir veya tercih edebileceğiniz herhangi bir sudoku çözücüsüne girilebilir. Tamamlanan çözelti daha sonra tekrar harflere dönüştürülebilir.:!}tr 1-9 ACELNOPST .

Vi'de çok az kişi tarafından eşleştirilen bir güç var. En büyük sorun, vi eğitim kitaplarının, web sitelerinin, yardım dosyalarının vb. Çok azının mümkün olanın yüzeyine zar zor dokunmaktan daha fazlasını yapmasıdır.


ve bir tahriş ubuntu gibi bazı dağıtımların "vi" kelimesinden "vim" kelimesine takma adları olmasıdır, böylece insanlar gerçekten vi görmezler. Mükemmel bir örnek, denemek zorunda ... +1
hhh

1
Vim, doğru 'modda' görünmesi için başlatıldığı adı kontrol etmiyor mu?
dash-tom-bang

3
Bu tekrarlanan hatadan şaşkına döndüm: :komut moduna girmeniz gerektiğini söylüyorsunuz , ancak her zaman komut modundan çalışamayan normal mod komutlarını (gibi y}}p) belirtiyor musunuz ?!
sehe

Eşsiz karakter meydan okumasını ele alacağım: :se tw=1 fo=(hazırlık) VG:s/./& /g(boşluklar ekleyin), gvgq(ayrı satırlara bölünmüş), V{:sort u(kopyaları sıralayın ve kaldırın)
12'de 20

23

Toplu metin manipülasyonları!

Makrolar aracılığıyla:

  • Kayıt ile başlayın: qq
  • Şeyler yapmak
  • Kaydetmeyi bırak: q
  • Tekrarlayın: @q(ilk kez), @@bundan sonra.
  • 20 kez tekrarlayın: 20@@

Veya düzenli ifadelerle:

  • Eşyaları değiştirin: :%s/[fo]+/bar/g

(Ancak uyarın: ikincisini yaparsanız, 2 sorununuz olacak :).)


5
Jamie Zawinski referansı için +1 . (Hatta bağlantı kuramadığı için hiçbir puan geri alınmaz). :)
Jim Dennis

1
@Jim Jamie Zawinski'nin bir alıntı olduğunu bile bilmiyordum :). Bundan sonra hatırlamaya çalışacağım.
jqno

Aşağıdaki hileyi giderek daha kullanışlı buluyorum ... bazı desenleri önceki çizgiyle eşleştiren (veya eşleşmeyen) çizgileri birleştirmek istediğiniz durumlar için: :% g/foo/-1jveya :'a,'z v/bar/-1j(eski dizinin "tüm çizgiler ve desenle eşleştiği" durumlarda) ikincisi "a işaretiyle z işareti arasında çizgilerle uyuşmayan çizgiler"). A gveya vex komutundaki pıtırtıdan sonraki parça başka herhangi bir eski commmand olabilir, -1j sadece göreli bir çizgi hareketi ve birleştirme komutudur.
Jim Dennis

Tabii ki, makronuza '2' adını verirseniz, onu kullanma zamanı geldiğinde, parmağınızı '@' tuşundan 'q' tuşuna taşımanız bile gerekmez. Muhtemelen orada her seferinde 50 ila 100 milisaniye tasarruf eder. = P
JustJeff

@JustJeff Tamamen klavye düzeninize bağlı olarak, @ tuşum 2 tuşumdan klavyenin diğer tarafındadır.
Simon Steele

23

Geçenlerde keşfettim q:. "Komut penceresini" açar ve en son eski mod (komut modu) komutlarınızı gösterir. Pencerede her zamanki gibi hareket edebilirsiniz ve düğmesine basmak <CR>komutu yürütür. Siz de düzenleyebilirsiniz. Bazı karmaşık komut veya regex ile uğraşıyorsanız ve her şeyi yeniden yazmak istemiyorsanız veya yapmak istediğiniz karmaşık şeyin 3 komut geri dönmesi paha biçilemez. Neredeyse bash gibi set -o vi, ama vim kendisi için (heh!).

:help q:İleri geri gitmek için daha ilginç bitler için bakın .


22

Geçen gün Vim'in omnicompletion'unu keşfettim ve ne yaptığına biraz puslu olduğumu itiraf ederken , ekleme modunda sadece Ctrl+ x Ctrl+ uveya Ctrl+ n/ Ctrl+ 'yı ezerek şaşırtıcı derecede iyi sonuçlar aldım p. Tam olarak IntelliSense değil , ama hala öğreniyorum.

Denemek! :help ins-completion


20

Bunlar kısayol değildir, ancak aşağıdakilerle ilgilidir:

  1. Capslock'u ek bir ESC (veya Ctrl) yapın
  2. şu komutla "," (virgül) ile eşleştirin: let mapleader = ","

Verimliliğimi arttırıyorlar.


Hey "\" hakkında güzel bir ipucu! "\" Yazmak, "\" yazmaktan çok daha iyi.
Olivier Pons

2
Caps Lock'u Windows'ta ek bir Esc yapmak için (bir kapak kilidi anahtarı nedir? Bir "herhangi bir anahtar" mı?), Şunu
Martinho Fernandes

Mac'te PCKeyboardHack'e ihtiyacınız var - superuser.com/questions/34223/…
Tom Morris

1
Windows'ta AutoHotKey'iCapslock::Escape
Jeromy Anglim

19

Sık kullandığım başka bir yararlı vi "kısayol" 'xp'. Bu, imlecin altındaki karakteri bir sonraki karakterle değiştirir.


3
Xpbaşka yöne gitmek
tester

5
Windows xp çıktığında, bunun sadece iyi bir kullanım olduğunu şaka yapardım.
kguest

18

Ekranı dikey olarak bölmek için <Ctrl> + W, V
<Ctrl> + W, W pencereler arasında geçiş yapmak için

! python% [args] Bu pencerede düzenlediğim komut dosyasını çalıştırmak için

Görsel modda rastgele çizgiler katlamak için ZF


2
<Ctrl> + W ve j / k kesinlikle gezinmenizi sağlar (normal vimde olduğu gibi j yukarı, k aşağı). 3+ böler varsa bu harika.
Andrew Scagnelli

1
Görsel modda zf için +1, kod katlamayı seviyorum, ama bunu bilmiyordum.
coder_tim

2
klavyemi daldırdıktan sonra <C-w>nveya <C-w>syeni yatay pencere, <C-w>bsağ alt pencere <C-w>cveya <C-w>qpencereyi kapat, <C-w>xartır ve sonra pencere genişliğini azalt (??), <C-w>pson pencere, <C-w>backspacesola (ish) pencere
puk

:help ctrl-wFTW ... kendinize bir iyilik yapın ve bunları en az 15 dakika denemeye zorlayın!
sjas

18

Görsel Mod

Diğer birçok kişinin söylediği gibi, görsel mod kopyalama / kesme ve yapıştırma probleminizin cevabıdır. Vim size 'v', 'V' ve Cv. Vim'deki küçük harf 'v' aslında not defterindeki shift tuşuyla aynıdır. Güzel olan, onu basılı tutmak zorunda olmamanız. Seçiminizin başlangıç ​​(veya bitiş) noktasına verimli bir şekilde gitmek için herhangi bir hareket tekniğini kullanabilirsiniz. Ardından 'v' tuşuna basın ve seçiminizin diğer ucuna gitmek için tekrar etkili hareket tekniklerini kullanın. Ardından 'd' veya 'y' bu seçimi kesmenizi veya kopyalamanızı sağlar.

Vim'in görsel modunun Jim Dennis'in vi'deki kesme / kopyalama / yapıştırma açıklaması yerine konumu tam olarak doğru bulmanız gerekmiyor. Bazen, gitmek istediğiniz yerin genel çevresine ulaşmak için hızlı bir hareket kullanmak ve daha sonra sizi tam olarak gitmek istediğiniz yere götüren daha karmaşık bir tek hareket komutunu düşünmekten daha başka hareketlerle daha da iyileştirmek daha etkilidir.

Görsel modu bu şekilde yaygın olarak kullanmanın dezavantajı, her zaman daha etkili bir şekilde yapmanıza izin verebilecek yeni vi (m) komutları öğrenmenizi engelleyen bir koltuk değneği haline gelebilmesidir. Bununla birlikte, vi (m) 'nin yeni yönlerini öğrenme konusunda çok proaktifseniz, bu muhtemelen sizi çok fazla etkilemez.

Ayrıca, görsel çizgi ve görsel blok modlarının aynı tema üzerinde size çok güçlü olabilecek varyasyonlar verdiğini yeniden vurgulayacağım ... özellikle görsel blok modu.

Klavyenin Verimli Kullanımı Hakkında

Ayrıca, alternatif ellerin klavyeyi kullanmanın en hızlı yolu olduğu iddiasına katılmıyorum. İçinde bir gerçeklik unsuru var. Çok genel olarak konuşmak gerekirse, aynı şeyi tekrar tekrar kullanmak yavaştır. Bu ilkenin en önemli örneği, aynı parmakla yazılan ardışık tuş vuruşlarının çok yavaş olmasıdır. İddianız muhtemelen bu desende s / parmak / el / dönüşümü kullanma doğal eğiliminden kaynaklanmaktadır. Bir dereceye kadar doğrudur, ancak verimlilik spektrumunun son derece yüksek ucunda yanlıştır.

Herhangi bir piyaniste sor. Onlara sırayla birkaç elin arka arkaya çalmasını veya sırayla tek bir elin ardışık parmaklarını kullanmanın daha hızlı olup olmadığını sorun. 4 tuş vuruşunu yazmanın en hızlı yolu elleri değiştirmek değil, aynı elden 4 parmakla artan veya azalan sırayla yazmaktır (buna "koşma" deyin). Bu olasılığı düşündüğünüzde, bu açık bir şekilde görülmelidir.

Daha zor olan problem bunun için optimize etmektir. Klavyede mutlak mesafe için optimize etmek oldukça kolaydır. Vim bunu yapar. "Çalıştırma" düzeyinde optimizasyon yapmak çok daha zor, ancak modsal düzenleme ile vi (m) bunu yapabilmeniz için şimdiye kadar yapabileceğiniz herhangi bir mod dışı yaklaşımdan (ahem, emacs) daha iyi bir şans verir.

Emacs hakkında

Emacs zealotları bu son parantez yorumu nedeniyle tüm yazımı tamamen dikkate almazsa, emacs ve vim dinleri arasındaki farkın kökünü tanımlamam gerektiğini hissediyorum. Editör savaşlarında hiç konuşmadım ve muhtemelen bir daha yapmayacağım, ama hiç kimsenin farklılıkları bu şekilde tarif ettiğini duymadım, işte gidiyor. Fark şu ödünleşmedir:

Vim size eşsiz ham metin düzenleme verimliliği sağlar Emacs, editörü özelleştirmek ve programlamak için eşsiz bir yetenek sunar

Kör vim zealotları, vim'in bir komut dosyası diline sahip olduğunu iddia edecektir. Ancak editöre hizmet etmek için tasarlanmış, belirsiz ve geçici bir dildir. Emacs'ın Lisp'i var! Yeterince söylendi. Eğer bu son iki cümlenin önemini bilmiyorsanız veya bu programlamayı geliştirmek için fonksiyonel programlama ve Lisp hakkında yeterli bilgi edinmek istiyorsanız, o zaman vim kullanmalısınız.

Emacs zealotları emacs'ın engerek moduna sahip olduğunu iddia edecektir ve bu yüzden bir vim süper kümesidir. Ancak engerek modu standart değildir. Anladığım kadarıyla engerek modu emacs kullanıcılarının çoğunluğu tarafından kullanılmıyor. Varsayılan olmadığı için, çoğu emacs kullanıcısı muhtemelen mod paradigmasının yararları için gerçek bir takdir geliştirmez.

Bence bu farklılıklar dikeydir. Vim ve emacs'ın her ikisinin de geçerli olduğunu belirttiğim gibi faydalarının olduğuna inanıyorum. Bu, nihai düzenleyicinin henüz mevcut olmadığı anlamına gelir. Emacs'ın, nihai editörü dayandırabileceği en kolay platform olacağı doğrudur. Ancak kalıcı düzenleme emacs zihniyetine yerleşmez. Emacs topluluğu gelecekte bu şekilde hareket edebilir, ancak bu pek olası görünmüyor.

Ham düzenleme verimliliği istiyorsanız, vim kullanın. Komut dosyası oluşturmak ve programlamak için en iyi ortamı istiyorsanız editörünüz emacs kullanın. Her ikisinin de programlanabilirliğe vurgu yapan bazılarını istiyorsanız, engerek modlu emacs kullanın (veya kendi modunuzu programlayın). Her iki dünyanın en iyisini istiyorsanız, şimdilik şansınız kalmadı.


17

Vim eğitimini yaparak 30 dakika geçirin (terminalde vim yerine vimtutor'ı çalıştırın). Temel hareketleri ve bazı tuş vuruşlarını öğreneceksiniz, bu sizi en azından daha önce kullandığınız metin editörü kadar vim ile üretken hale getirecektir. Bundan sonra Jim Dennis'in cevabını tekrar okuyun :)


1
OP'yi okurken ilk düşündüğüm şey bu. Posterin bunu hiç yapmadığı açıktır; İki yıl önce ilk vim öğrenirken bunu başardım ve zihnimde Vim'in kullandığım diğer editörlerden herhangi birine üstünlüğünü sağlamlaştırdı (benim için Emacs dahil, anahtar kombinasyonlar bir Mac'te kullanmak can sıkıcıdır) .
dash-tom-bang

16

Çağdaş bir editörden daha üretken olmanızı sağlayan Vim'i nasıl kullanıyorsunuz?

Çok az sayıda tuşa basarak (genellikle makroları kullanarak ) karmaşık, tekrarlayan düzenlemeleri yürütebilmek . Vim'in gücüne şahit olmak için VimGolf'a bir göz atın !

On yıldan fazla neredeyse günlük kullanımdan sonra, başka bir editör kullandığınızı hayal etmek zor.


16

Büyük / \cküçük harf kullanımını yoksaymak için aramada herhangi bir yerde kullanın (yok sayma veya akıllı kılıf ayarlarınızı geçersiz kılma). Örneğin /\cfooveya /foo\cmaç olacak foo, Foo, fOO, FOO, vb

Büyük / \Cküçük harf eşleştirmeyi zorlamak için aramada herhangi bir yerde kullanın . Örneğin /\Cfooveya /foo\Csadece foo ile eşleşir.


16

Kimsenin thareketten bahsetmediğine şaşırdım . Sıklıkla dt,veyayt,


2
veya dfx, dFx, dtx, ytx vb. burada x bir karakterdir, +1
hhh

Evet! Ve unutmayın ct (değiştir).
markle976

16

Garip kimseden bahsetmedi ctags. "Coşkulu ctags" indirin ve arama yolunuzda zaten yüklü crappy sürümün önüne koyun. Cd üzerinde çalıştığınız her şeyin köküne; örneğin Android çekirdek dağıtımı. "Ctags -R" yazın. "tags" adlı bir dosyada bu dizinin altında herhangi bir yerde kaynak dosyalarının bir dizinini oluşturmak için Bu, tüm etiketleri içerir, dili veya dizinin neresinde olduğunu tek bir dosyada içerir, bu nedenle çapraz dil çalışması kolaydır.

Sonra o klasördeki vim dosyasını açın ve bazı komutlar için yardım ctags'ı okuyun. Birkaç sık kullanıyorum:

  • İmleci bir yöntem çağrısının üzerine getirin ve yöntem tanımına gitmek için CTRL-] yazın.

  • Ad tanımına gitmek için ta name yazın.


14

Otomatik girinti:

gg(belgenin başına git)
=(girinti zamanı!)
shift-g(belgenin sonuna git)

.vimrcDosyanızda 'filetype plugin indent on ' ifadesine ve muhtemelen uygun 'shiftwidth' ve 'expandtab' ayarlarına ihtiyacınız olacak.


4
Ya da sadece başlangıçtan beri vi'da bulunan ": set ai" (otomatik girinti) özelliğini kullanın.
xcramps

14

Verimli kısayollar istediniz, ama bence asıl sorunuz şu: Vim buna değer mi? Bu yığın akışı sorusunun cevabı -> "Evet"

İki şeyi fark etmiş olmalısınız. Vim güçlüdür ve vim öğrenmek zordur. Gücünün çoğu, genişletilebilirliği ve sonsuz komut kombinasyonunda yatmaktadır. Bunalmış hissetme. Yavaş gitmek. Her seferinde bir komut, bir eklenti. Fazla abartma.

Vim'e yaptığınız tüm yatırımlar bin kat geri ödeyecek. Ölmeden önce saatlerce metin editörünün içinde olacaksın. Vim senin arkadaşın olacak.


13

Birden çok arabellek ve özellikle iki dosyayı :bpve ile karşılaştırmak için aralarında hızlı atlama :bn(tek bir Shift+ pveya Shift+ ' ya uygun şekilde yeniden eşleştirildi n)

vimdiff modu (farklılıkları göstermek için renklerle iki dikey tamponda böler)

Ctrl+ İle alan kopyasıv

Ve son olarak, tanımlayıcıların sekme tamamlanması ("mosh_tab_or_complete" ifadesini arayın). Bu bir hayat değiştirici.


12

En iyi afişi kabul etti - the : r! komut çok faydalıdır.

Çoğu zaman bir şeyi "yapıştırmak" için kullanırım:

:r!cat
**Ctrl-V to paste from the OS clipboard**
^D

Bu şekilde uğraşmak zorunda değilim :set paste.


3
Sistem panosunu varsayılan olarak kullanmak için clipboardseçeneği unnamed( set clipboard=unnamed.vimrc dosyasında) olarak ayarlamak muhtemelen daha iyidir . Hala sistem isimsiz kasadan ayırmak panoya istiyorsanız Veya, uygun adlı pano kayıt kullanın: "*p.
R. Martinho Fernandes

2
Sevdim! Web'den kod örnekleri yapıştırarak bıkkın ve ben sadece vim yetkin hissetmeye başladım. Yerinde hayal ettiğim komut buydu. Vim beni tamamen bağladığında.
kevpie

Mac, Command + C ve Command + V'de sistem panosunu kullanarak kopyalayıp yapıştırıyorsanız, yeniden eşleme gerekmez.
Ben Mordecai

Yalnızca GVIm ile… Konsoldan, autoindent :set pasteetkinleştirilirse yapıştırma işlemi çok iyi çalışmaz.
David Wolever
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.