İle olan sorun Vim sen grok kalmamasıdır vi .
Kesimden bahsediyorsunuz yy
ve 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, yy
anonim 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 y
fiil bir fiildir. Bu ifade yy
, eşanlamlıdır y_
. y
Bö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 . y
Ve 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." m
Komut 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 `z
doğ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`a
kesmek veya y`a
kopyalamak 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 `x
komutları 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/foo
kesiyorum 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/g
kü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).
:... g
Ve :... v
onlar 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/d
kadar 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ı, :p
komut 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 :.,+25p
veya bazılarını kullanarak ).
Not olduğunu :% g/.../d
ya da (kendi Ters / conVerse muadili: :% v/.../d
En yaygın kullanım alışkanlıkları vardır Ancak diğer çift vardır. ex
Hatırlatmakta fayda vardır komutları:
Biz kullanabilirsiniz m
satı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 grep
ve 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) g
ve 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/g
yalnı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
, s
ve 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 :r
baş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
( G
olduğ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
0i:r
(geçerli satırı geçerli bir r komutuna dönüştürmek için ),
"cdd
(satırı "c" kaydına silmek için) ve
@c
bu komutu yürütün.
Bu sadece 10 tuş vuruşudur (ve ifade "cdd
@c
benim 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 .