Annenin sana hiç bahsetmediği Vim'in karanlık köşeleri nelerdir? [kapalı]


799

İnsanların ortak hileler hakkında, özellikle " Vim + ctags ipuçları ve püf noktaları " hakkında konuştuğu çok sayıda soru var .

Ancak, Vim'de yeni birinin havalı bulacağı sık kullanılan kısayollardan bahsetmiyorum. % 99'umuzun hiç duymadığımız veya hayal etmediğimiz bir şey bildiğini düşünen deneyimli bir Unix kullanıcısından (geliştirici, yönetici, her ikisi vb.) Bahsediyorum. Sadece işlerini kolaylaştırmakla kalmaz, aynı zamanda SOĞUK ve hackish . Sonuçta, Vim dünyadaki en karanlık köşe açısından zengin işletim sisteminde yaşıyor, bu nedenle sadece birkaç ayrıcalık hakkında bilgi sahibi olmak ve bizimle paylaşmak isteyen karmaşıklıklar olmalı.


10
: Sex Split penceresi ve açık tümleşik dosya gezgini (yatay bölme)
user3218088

2
Bu soru - yeniden oylamaya oy veren oyların sayısına bakarak - oldukça yapıcı gibi görünüyor - belki de daha serin bir cevap geliyor - ki bu da faydalıysa kaldırılabiliyor - dolayısıyla SOF'a daha fazla değer veriyor. Cevapları oylarla sipariş etme Sadece 5 dakika içinde çok güzel şeyler öğrendim ... burada gerçekten değerli şeyler, neden bu değerli şeyi kapatalım? Bu nasıl yapıcı değil?
jhegedus

7
Bu sorunun kapalı olması çok saçma. Yasallık hakkında konuşun.
Lepidopterist

2
Bence bu soru çok yapıcı ama Quora'da daha uygun.
Diogo Melo

2
Bu soruyu silmek için neden 2 (şu andan itibaren) oy var? Ne işe yarar ki?
Akavall

Yanıtlar:


782

Vim kullanıcılarının% 99'unun bilmediği biri olmayabilir, ancak bu her gün kullandığım ve herhangi bir Linux + Vim poweruser'ın bilmesi gereken bir şey.

Temel komut, ama son derece yararlı.

:w !sudo tee %

Üzerinde yazma iznim olmayan bir dosyayı düzenlemeden önce sudo yapmayı unuturum. Bu dosyayı kaydetmeye ve bir izin hatası almaya geldiğimde, dosyayı bir geçici dosyaya kaydetmeye gerek kalmadan kaydetmek ve daha sonra tekrar kopyalamak için bu vim komutunu veriyorum.

Tabii ki sudo yüklü bir sistemde olmalı ve sudo haklarına sahip olmalısınız.


116
Muhtemelen, bu vim'i root olarak çalıştırmaktan bile daha iyi ! Upvoted!
Arafangion

27
Çaylak için tee tam olarak ne yapar? Birisi bu komutu benim için ayrıştırır mı?
AndyL

41
cmap w !! w! sudo tee%
jm666

58
Asla kaçmamalısın sudo vim. Bunun yerine EDITORvim olarak dışa aktarmalı ve çalıştırmalısınız sudoedit.
Gerardo Marset

8
@maximus: vim,% öğesini geçerli arabellek / dosya adıyla değiştirir.
migu

617

Son zamanlarda keşfettiğim bir şeyin çok havalı olduğunu düşündüğüm bir şey:

:earlier 15m

Belgeyi 15 dakika önceki haline geri döndürür. Geri almak istediğiniz süre boyunca çeşitli argümanlar alabilir ve kararlı olmayanlara bağlıdır. Ters komutla tersine çevrilebilir:later


6
@skinp: Geri alınan durumdan geri alır ve sonra başka değişiklikler yaparsanız, bu yineleme geçmişini kaybedersiniz. Bu, artık geri alma yığınında olmayan bir duruma geri dönmenizi sağlar.
ephemient

39
Ayrıca zaman içinde ileri ve geri gitmek için g + ve g- çok kullanışlıdır. Geri alma işleminden sonra bir şey yaptığınızda geçmişi kaybetmediğiniz için bu bir geri alma / yineleme yığınından çok daha güçlüdür.
Etienne PIERRE

9
Bir geri alma işleminden sonra değişiklik yaparsanız yineleme geçmişini kaybetmezsiniz. Kolayca erişilemez. Bunu görselleştirmenize yardımcı olacak eklentiler var, Gundo.vim
Ehtesh Choudhury

559
Vay canına, şimdi yapabilirim :later 8hve bugün için bitti mi? : P
Igor Popov

7
Sizin komut biri en az 15 dakika geçirecek varsayar vim !
e2-e4

411

:! [command] Vim'deyken harici bir komut yürütür.

Ancak, iki nokta üst üste işaretinden sonra bir nokta ekleyin :.! [command]ve komutun çıktısını geçerli pencerenize döker. Yani en: . !

Örneğin:

:.! ls

Yazdığım bir belgeye geçerli tarihi eklemek gibi şeyler için bunu çok kullanıyorum:

:.! date

74
Bu oldukça benzer: r! Anlayabildiğim kadarıyla tek fark şudur: r! yeni bir satır açar,:.! geçerli satırın üzerine yazar.
saffsd

6
Alternatifi :.!date, bir satıra "tarih" yazmak ve ardından çalıştırmaktır !$sh(alternatif olarak komutun ardından boş bir satır ve çalıştırma !jsh). Bu, satırı "sh" kabuğuna bağlar ve komutun çıktısı ile değiştirir.
hlovdal

43
:.!aslında bir komut :{range}!satırından bir satır aralığını (aralık geçerli olduğunda geçerli satır) filtreleyen .ve bu satırları çıktı ile değiştiren özel bir durumdur . :%!Tüm tamponları filtrelemek için yararlı buluyorum .
Nefrubyr

2
@ sundar: sedBenzer yerleşik ed/ exkomutları ne zaman kullanabilirsiniz ? Koşu :.s/old/new/g
çalış

4
Ve ayrıca '!' 'y', 'd', 'c' vb. yani şunları yapabilirsiniz: !!, sayı !!,! motion (örneğin! Gshell_command <cr> geçerli satırdan dosyanın sonuna ('G') değiştirin shell_command çıktısı).
aqn

312

Tam olarak belirsiz değil, ancak son derece yararlı olan birkaç "silme" komutu vardır.

  • diw geçerli kelimeyi silmek için
  • di( geçerli parenler içinde silmek için
  • di" tırnak işaretleri arasındaki metni silmek için

Diğerlerini şu adreste bulabilirsiniz: :help text-objects


8
dab "arounb parantezlerini sil", kıvırcık parantezler için daB, xml tipi etiketler için t, normal komutlarla kombinasyonlar beklendiği gibi cib / yaB / dit / vat etc
sjh 8:09

15
@Masi: yi (va (p sadece parantezleri siler
Don Reba

42
Bu muhtemelen Vim ile kalmamın en büyük sebebidir. Bu ve eşdeğer "değiştirme" komutları: ciw, ci (, ci ", hem de dt <boşluk> ve ct <boşluk>
thomasrutter

4
@thomasrutter: Neden dt <boşluk> yerine dW / cW olmasın?

9
@Masi: Surround eklentisiyle: ds (.

237

de tuşuna basarak kelimenin sonuna kadar her şeyi silin. gönlünüzce olsun.

ci (xyz [Esc] - Bu garip bir örnek. Burada 'i' ekleme modu anlamına gelmiyor, bunun yerine parantez içinde olduğu anlamına geliyor. . "xyz" Aynı zamanda iç kare ve şekil parantez çalışır -.. sadece ci [ya ci {sadece yazarak şey olmadan tüm metni silmek istiyorsanız buna uygun Doğal olarak, (di yapabilirsiniz Ayrıca yapabilirsiniz yapmak ayerine ieğer yalnızca içindeki metinleri değil, parantezleri de silmek istersiniz.

ci " - metni geçerli tırnak işaretleri içinde keser

ciw - geçerli sözcüğü keser. Bu, (bunun yerine bir öncekiyle aynı şekilde çalışır w.

C - hattın geri kalanını kesin ve ekleme moduna geçin.

ZZ - geçerli dosyayı kaydet ve kapat (geçerli sekmeyi kapatmak için Ctrl-F4'ten daha hızlı YOL!)

ddp - geçerli satırı bir satır aşağı taşı

xp - geçerli karakteri bir konum sağa taşır

U - büyük harf, yani viwUkelimeyi yukarı taşır

~ - büyük / küçük harf değişimi yapar, bu nedenle viw~tüm kelimenin gövdesi ters çevrilir

Ctrl + u / Ctrl + d ekranı yarı ekran yukarı veya aşağı kaydırır. Bu, iki ekranın ilişkisini görmeyi kolaylaştırdığı için normal tam ekran sayfalamaya göre daha yararlı gibi görünüyor. Aynı anda tüm ekranı kaydırmak isteyenler için İleri için Ctrl + f ve Geri için Ctrl + b vardır. Ctrl + Y ve Ctrl + E her seferinde bir satır aşağı veya yukarı ilerler.

Çılgın ama çok kullanışlı komut zz - bu çizginin ortada görünmesini sağlamak için ekranı kaydırır. Bu, üzerinde çalıştığınız kodu dikkatinizin merkezine koymak için mükemmeldir. Kardeş komutları - zt ve zb - bu satırı ekranın üstünde veya altında o kadar da kullanışlı olmayan yapar.

% bulur ve eşleşen parantezlere atlar.

de - kelimenin sonuna imlecin silmek (ayrıca yapabilirsiniz dEsonraki boşluğa kadar silmek için)

bde - geçerli sözcüğü, soldan sağa ayırıcıdan sil

df [boşluk] - bir sonraki boşluk dahil edilinceye kadar sil

dt. - bir sonraki noktaya kadar sil

dd - tüm satırı sil

ye (veya yE) - metni kelimenin sonuna kadar çeker

ce - sözcüğün sonuna doğru keser

güle güle - geçerli kelimeyi kopyalar ("merhaba" nın ne yaptığını merak etmemi sağlar!)

yy - geçerli satırı kopyalar

cc - geçerli satırı keser, Sbunun yerine de yapabilirsiniz . Ayrıca smevcut karakteri kesen ve ekleme moduna geçen alt kapak da vardır .

viwy veya viwc . Yank veya geçerli kelimeyi değiştirin. wSonraki sözcükleri seçmeye devam etmek için birden çok kez vurun , bgeri gitmek için kullanın

vi { - şekil ayraçlarındaki tüm metni seç. va {- {} s dahil tüm metni seç

vi (p - () s içindeki her şeyi vurgulayın ve yapıştırılan metinle değiştirin

b ve e, imleci Ctrl + Okların normalde yaptığı gibi, sözcük sözcük hareket ettirir . Yine de, birbirini izleyen birkaç yayıncıya tek kelime muamelesi yapıldığı için kelimenin tanımı biraz farklıdır. Bir sözcüğün ortasından başlarsanız, b tuşuna basmak sizi her zaman geçerli sözcüğün başına götürür ve ardışık her b bir sonraki sözcüğün başına atlar. Benzer şekilde ve hatırlanması kolay e, imleci akımın ve sonraki her kelimenin sonuna götürür.

b/ e, sermayesine benzer Bve Eimleci kelime sınırlayıcı olarak yalnızca beyaz boşlukları kullanarak kelime kelime hareket ettirin.

büyük harf D (derin bir nefes alın) Normal editörlerde Shift + End / Del ile aynı şekilde imlecin sağındaki satırın geri kalanını siler (3 yerine 2 tuş basımı - Shift + D - dikkat edin)


15
zt bir işlev veya sınıf tanımının başında kullanıyorsanız oldukça kullanışlıdır.
Nick Lewis

9
vityve sırasıyla ve vitckısaltılabilir . yitcit
Nathan Fellman

33
"Kes" olarak adlandırdığınız her şey "değişim" dir. örneğin: C, çizginin sonuna kadar değişir. Vim'in "cut" eşdeğeri, d / D ile yapılan "delete" dir. Değişiklik ve silme arasındaki temel fark, silme işleminin sizi normal modda bırakmasıdır ancak değişiklik sizi bir tür ekleme moduna sokar (yine de tüm değişiklik tekrarlanabileceğinden kullanışlı olan değişiklik komutundasınız .).
Laurence Gonsalves

11
Bunun pek çok insanın bilmediği şeylerin bir listesi olduğunu düşündüm. yy çok yaygın, düşünürdüm.
Almo

19
byekelimenin ilk karakterinde olduğunuzda çalışmaz. yiwher zaman yapar.
Andrea Francia

204

Çoğu Vim dersinde nadiren bulduğum, ancak inanılmaz derecede kullanışlı (en azından benim için),

g; and g,

changelist boyunca ilerlemek (ileri, geri).

Nasıl kullandığımı göstereyim. Bazen bir CSS dosyasında bir kod veya dize parçası kopyalayıp yapıştırmam gerekiyor, bu yüzden bir CSS dosyasında bir onaltılık renk kodu söylüyorum, bu yüzden arama yapıyorum, (eşleşmenin olduğu yerde umursamıyorum), kopyalayıp sonra (g;) Sonunda yapıştırmak için kodu düzenliyordum. Marka oluşturmaya gerek yok. Daha basit.

Sadece 2 sentim.


29
benzer şekilde, '.son düzenlenmiş satıra `.gidecek ve son düzenlenmiş konuma gidecek
aehlke

8
Ctrl-O ve Ctrl-I (sekme) benzer şekilde çalışır, ancak aynı şekilde çalışmaz. Yaparak görebileceğiniz "atlama listesinde" ileri ve geri hareket ederler: atlar veya: ju Daha fazla bilgi için şunu yapın: yardım atlama listesi
Kimball Robinson

17
Değişiklik listesini yaparak şunları listeleyebilirsiniz: değişiklikler
Kimball Robinson

Sıcak dang bu yararlı. Bunun için her zaman <C-o>/ kullanıyorum <C-i>- ya da yerimi işaretliyorum.
Wayne Werner

187
:%!xxd

Onaltılık düzenleyiciye vim yapın.

:%!xxd -r

Geri Döndür.

Uyarı: İkili (-b) ile düzenlemezseniz, dosyaya zarar verebilirsiniz. - Josh Lee yorumlarda.


9
Ve onu nasıl geri döndürüyorsun?
Christian

40
:! xxd -r // HEX'ten geri dönmek için
Naga Kiran

21
Aslında :%!xxd -rgeri dönmek olduğunu düşünüyorum
Andreas Grech

@JoshLee: Eğer birisi satırsonlarını geçmemeye dikkat ederse, -b seçeneğini kullanmamak güvenli mi? Soruyorum çünkü bazen onaltılık bir değişiklik yapmak istiyorum, ancak dosyayı kapatmak ve yeniden açmak istemiyorum.
dotancohen

4
@dotancohen: Dosyayı kapatmak / yeniden açmak istemiyorsanız şunları yapabilirsiniz: ikili
Bambu


119

Bazen .vimrc dosyasındaki bir ayar bir eklenti veya otomatik komut tarafından geçersiz kılınır. Bu hata ayıklamak için yararlı bir hile: verbose komutunu: set ile birlikte kullanmaktır. Örneğin, cindent'in nerede ayarlandığını / ayarlandığını bulmak için:

:verbose set cindent?

Bu şöyle bir şey çıkarır:

cindent
    Last set from /usr/share/vim/vim71/indent/c.vim

Bu aynı zamanda haritalar ve vurgularla da çalışır. (Bunu işaret ettiğiniz için teşekkürler joeytwiddle.) Örneğin:

:verbose nmap U
n  U             <C-R>
        Last set from ~/.vimrc

:verbose highlight Normal
Normal         xxx guifg=#dddddd guibg=#111111 font=Inconsolata Medium 14
        Last set from ~/src/vim-holodark/colors/holodark.vim

8
Mükemmel ipucu - tam olarak bugün aradığım şey.
Artem Russakovskii

Mükemmel uç adam! Bu geeky şeylerini nasıl öğrenirsiniz?
Rafid

1
:verbosetuş eşleminin veya açıktonun en son nerede tanımlandığını bulmak için nmap lveya öncesinde kullanılabilir . Hata ayıklama için çok faydalı! highlight NormallNormal
joeytwiddle

@joeytwiddle Teşekkürler! Bu bilgiyi cevaba ekledim.
Laurence Gonsalves

Özel eşlemeler oluşturduğunuzda, bu kıçınızı birçok kez kurtaracaktır, muhtemelen burada en yararlı olanlardan biri (IMO)!
SidOfc


98

Bunun karanlık köşe ish olarak sayıldığından emin değilim, ama sadece öğrendim ...

:g/match/y A

"match" içeren tüm satırları "a/ @aregister'a kopyalar (kopyalar) . ( Önceki kayıt içeriğini değiştirmek yerine Avim ekleme yankings yapar gibi büyük harf kullanımı .) Internet Explorer stil sayfaları yaparken son zamanlarda çok kullandım.


sayar, ben bunu görmedim sayılır :)

Güzel bir. Hiç duymadım ... Yararlı olabilir: P
skinp

5
Şunları kullanabilirsiniz: g! bir desenle eşleşmeyen satırları bulma örn.: g! / set / normal dd (küme içermeyen tüm satırları sil)
tsukimi

3
Bazen tsukimi'nin söylediklerini yapmak ve sadece deseninize uymayan çizgileri filtrelemek daha iyidir. Bu komutun kısaltılmış bir sürümü olsa da: :v/PATTERN/dAçıklama: :vkısaltmasıdır :g!ve :gkomut satırlara ex komutunu uygular. :y[ank]çalışıyor ve öyle :normal, ama burada yapılacak en doğal şey sadece :d[elete].
pandubear

Ayrıca şunları yapabilirsiniz :g/match/normal "Ayy- normalanahtar kelime, normal mod komutlarını (muhtemelen daha tanıdığınız) çalıştırmasını söylemenizi sağlar.
Kimball Robinson

93

Komut geçmişinize bakmak ister misiniz?

q:

Sonra göz atın, düzenleyin ve son olarak komutu çalıştırın.

Hiç iki dosyada benzer değişiklikler yaptınız ve bunlar arasında geçiş yaptınız mı? (Diyelim, kaynak ve başlık dosyaları?)

:set hidden
:map <TAB> :e#<CR>

Ardından bu dosyalar arasında ileri ve geri sekme yapın.


131
Her q:zaman kazara vurdum ...
Josh Lee

11
Alternatif olarak, eski editörden (:), komut geçmişi penceresini açmak için CTRL-f yapabilirsiniz.
Jason Down

6
Beni de @jleedev. Bu komuttan neredeyse nefret ediyorum, çünkü yanlışlıkla yanlışlıkla çok fazla kullandığım için.
bradlis7

9
q / ve q? arama modelleriniz için benzer bir şey yapmak için kullanılabilir.
bpw1621

5
<Cf> tuşuna: veya / (veya komut modundayken) basarsanız aynı geçmiş menüsü görüntülenir. Yani q'yu yeniden eşleştirebilirsiniz: yanlışlıkla çok vurursanız ve yine de bu harika moda erişirseniz.
idbrii

82

Vim bir URL açacak, örneğin

vim http://stackoverflow.com/

Referans için bir sayfanın kaynağını çekmeniz gerektiğinde güzel.


2
Benim için kaynağı açmadı; bunun yerine, işlenmiş sayfayı bir arabelleğe dökmek için elinks kullanmış ve daha sonra bunu açmıştır.
Ivan Vučica

Bu komutu yürüttüğünüzde hata var
Dzung Nguyen

5
Sonunda eğik çizgi ile daha iyi çalışır. Düzgün hile!
Thomas

@Vdt: Hatanızı gönderirseniz yararlı olur. Bu ise: " hata (netrw) ne wget ne de getirme komutu mevcut değil"), bu araçlardan birini PATH ortam değişkeninizden kullanılabilir hale getirmeniz gerekir.
Isaac Nequittepas

Bu, özellikle bir macun servisine bağlantılar gönderdiğinde ve bir sözdizimi vurgulamayı seçtiğinde özellikle yararlı buluyorum, genellikle "& raw" ekledikten sonra bağlantıyı vim'de açmam gerekiyor.
Dedektör

68

Makrolar diğer makroları çağırabilir ve kendisini de çağırabilir.

Örneğin:

qq0dwj@qq@q

... her satırı dosyanın sonuna kadar ilk kelimeyi siler.

Bu oldukça basit bir örnek ama çok güçlü bir vim özelliği gösteriyor


2
Makroların kendilerini tekrarlayabileceklerini bilmiyordum. Güzel. Not: qx, x kaydına kayıt yapmaya başlar (q kaydı için qq kullanır). 0 satırın başına gider. dw bir sözcüğü siler. j bir satır aşağı gider. @q makroyu tekrar çalıştırır (bir döngü tanımlar). Ancak son bir "q" ile kaydı bitirmeyi unutmuş ve daha sonra @q yazarak makroyu çalıştırmışsınızdır.
Kimball Robinson

2
Bence bu kasıtlı, iç içe ve özyinelemeli bir makro.
Yktula

7
qqqqqifuu<Esc>h@qq@q
Gerardo Marset

6
Bunu gerçekleştirmenin bir başka yolu, tek bir satıra bazı dönüşümler yapan bir :normal! @akayıt makamındaki bir makroyu kaydetmektir , daha sonra V ile bir grup satırı vurgulayın ve makronuzu seçiminizdeki her satıra uygulamak için yazın.
Nathan Long

Bu yazıyı googling özyinelemeli VIM makroları buldum. Makroyu durdurmak için VIM işlemini öldürmekten başka bir yol bulamadım.
dotancohen

55

Perl ve / veya Ruby destek olarak derlenmiş, varsayıldığında :rubydove :perldobirlikte, bir dizi (tüm tampon varsayılan) her satırda bir Ruby veya Perl tek astar çalışır $_mevcut hattın metni (eksi yeni satır) bağlanmış. Manipüle $_etmek o satırın metnini değiştirir.

Bunu bir betik dilinde yapmak kolay, ancak Vim yerleşiklerini kullanarak çok açık olmayan bazı şeyler yapmak için kullanabilirsiniz. Örneğin, bir satırdaki kelimelerin sırasını tersine çevirmek için:

:perldo $_ = join ' ', reverse split

Her satırın sonuna rastgele 8 karakterlik (AZ) bir dize eklemek için:

:rubydo $_ += ' ' + (1..8).collect{('A'..'Z').to_a[rand 26]}.join

Her seferinde bir hatta hareket etmekle sınırlısınız ve yeni satır ekleyemezsiniz.


perldo'nun yalnızca belirtilen bir satırda çalışmasını istiyorsam ne olur? veya seçili birkaç satır mı?
Sujoy

5
Diğer komutlar gibi bir aralık verebilirsiniz. Örneğin: 1,5perldo sadece 1-5 satırlarında çalışır.
Brian Carper

$ _ + = '\ NNEWLINE !!!' şu andan sonra yeni bir satır almak için?
Greg

Ne yazık ki, sadece satırın sonuna funky bir kontrol karakteri ekler. Daha sonra tüm bu kontrol karakterlerini gerçek satırlara değiştirmek için bir Vim arama / değiştirme kullanabilirsiniz.
Brian Carper

3
Benzer şekilde, pydove py3dopiton için çalışma gerekli desteği derlemişseniz.
Derecho

54

^ O ve ^ I

Daha eski / daha yeni bir konuma gidin. Dosya içinde hareket ederken (arama yaparak, komutları hareket ettirerek vb.) Vim bu "atlamaları" yeniden düzenleyin, böylece bu atlamaları geriye doğru (eski için ^ O - O) ve ileri (^ I - klavyede I'nin hemen yanında) tekrarlayabilirsiniz. ). Kod yazarken ve çok fazla arama yaparken çok kullanışlı buluyorum.

gi

Ekle modunun son durdurulduğu konuma gidin. Kendimi sık sık bir şeyler düzenleyip aradığını görüyorum. Düzenleme yerine geri dönmek için gi tuşuna basın.

gf

imleci dosya adına getir (ör. başlık dosyasını dahil et), gf tuşuna bastığınızda dosya açılır

gF

gf'ye benzer ancak "[dosya adı]: [satır numarası]" biçimini tanır. GF tuşuna basıldığında [dosya adı] açılır ve imleç [satır numarası] olarak ayarlanır.

^ P ve ^ N

Düzenleme sırasında metni otomatik tamamla (^ P - önceki eşleşme ve ^ N sonraki eşleme)

^ X ^ L

Düzenleme aynı satıra tamamlanırken (programlama için yararlıdır). Kod yazıp dosyada bir yerde aynı kodu olduğunu hatırlarsınız. Sadece ^ X ^ L tuşlarına basın ve tüm satır tamamlandı

^ X ^ F

Tam dosya adları. "/ Etc / pass" yazıyorsunuz Hmm. Dosya adını unuttunuz. Sadece ^ X ^ F tuşlarına bastığınızda dosya adı tamamlanır

^ Z veya: sh

Kabuğa geçici olarak taşıyın. Hızlı bir dayak gerekiyorsa:

  • orijinal kabuğa geri dönmek için ^ Z (vi'yi arka plana koymak için) tuşuna basın ve geri dönmek için fg tuşuna basın
  • tuşuna basın: alt kabuğa gitmek için sh tuşuna basın ve vi geri dönmek için ^ D / exit tuşuna basın

İle ^X^Fbenim evcil huysuzlaştırmak dosya adları şunlardır olmasıdır =birçok kez çürük şeyler (ini dosyaları, makefiles vs) yapmak yapma, işaretler. se isfname-==Bu sıkıntıyı sona erdirmek için kullanıyorum
21'de

3
+1 yerleşik otomatik tamamlama sadece keşfedilmeyi bekleyen orada oturuyor.
joeytwiddle

48
" insert range ip's
"
"          ( O O )
" =======oOO=(_)==OOo======

:for i in range(1,255) | .put='10.0.0.'.i | endfor

2
Bunun ne için iyi olduğunu görmüyorum (şaka yanıtı gibi). Beni başka biri aydınlatabilir mi?
Ryan Edwards

2
vim'i açın ve sonra yapın ": i aralığında (1,255) | .put = '10 .0.0. '. i | endfor"
codygman

2
@RyanEdwards doldurma / vb / ana belki
Ruslan

26
Bu müthiş bir cevap. IP adresleri oluşturma hakkında değil, VIM'in komutlardaki döngüler için kullanabileceğini ima eden bit .
dotancohen

4
Eski mod olmadan:i10.0.0.1<Esc>Y254p$<C-v>}g<C-a>
BlackCap

47

Mevcut dosyayı farklı bir kodlamayla yeniden açmak için güzel bir numara:

:e ++enc=cp1250 %:p

Eski kodlarla çalışmak zorunda olduğunuzda kullanışlıdır. Desteklenen kodlamalar encoding-values(bkz. help encoding-values) Altındaki bir tabloda listelenmiştir . Benzer şey de işe yarıyor ++ff, böylece dosyayı ilk kez yanlış anlarsanız Windows / Unix satır bitmeleriyle yeniden açabilirsiniz (bkz. help ff).


Asla bu tür bir şey kullanmak zorunda kalmadık, ama kesinlikle hileler cephaneme ekleyeceğiz ...

harika bir ipucu, teşekkürler. Bonus puanları için, geçerli geçerli kodlamaların bir listesini ekleyin.
Adriano Varoli Piazza

2
Bugün kullandım, ama sanırım "%: p" belirtmem gerekmedi; sadece dosyayı açmak ve: e ++ enc = cp1250 yeterliydi. I
Ivan Vučica

would: set kodlama = cp1250 aynı etkiye sahip mi?
laz

1
`: E + B%' ikili modda (yeni satır için hiç munging) tekrar açılması için benzer şekilde yararlıdır
intuited

47

== Yazarak yukarıdaki satırda göre geçerli satırının girinti düzeltecektir.

Aslında, bir = işareti ve ardından herhangi bir hareket komutu yapabilirsiniz. = {hareket}

Örneğin, eşleşen kaşlı ayraçlar arasında hareket eden% hareketini kullanabilirsiniz. İmleci aşağıdaki kodda {üzerine getirin:

if (thisA == that) {
//not indented
if (some == other) {
x = y;
}
}

Ve bunu anında almak için =% tuşuna basın :

if (thisA == that) {
    //not indented
    if (some == other) {
        x = y;
    }
}

Alternatif olarak, kendinizi {karakteri üzerine yerleştirmek yerine = a { kod bloğunun içinde yapabilirsiniz .


Hm, girinti hakkında bunu bilmiyordum.
Ehtesh Choudhury

Genellikle tam olarak diş telleri üzerinde olmaya gerek yoktur. Sık sık düşündüm =}ya vaBaB=da daha az bağımlı olduğu için. Ayrıca, v}}:!astyle -bjbenim kod stili daha iyi eşleşir, ama basit bir ile stilinize geri alabilirsiniz%!astyle -aj
sehe

7
gg=Gbir şeye yapıştırırken oldukça düzgün.
kyrias


@kyrias Oh, böyle yapıyordum ggVG=.
Braden Best

42
imap jj <esc>

7
o zaman nasıl jj yazacaksın? : P
hasen

6
Ne kadar sıklıkla jj yazıyorsunuz? En azından İngilizce mi?
ojblass

50
Aksi halde işe yaramaz bir anahtar olduğu için bunun yerine capsc'i esc'ye yeniden eşledim. Haritamın işletim sistemi geniş olmasına rağmen, yanlışlıkla vurma konusunda endişelenmenize gerek kalmadı. Tek dezavantajı İNSANLARDA YARDIM HARDER. :)
Alex

7
@Alex: kesinlikle, capslock ölümdür. "bekle, wtf? oh, bu ZZ? .... saçmalık."
2010'da

5
@ojblass: Emin değilim kaç kişi Hiç doğru matlab Vim kod ancak iive jjçünkü yaygın, sayaç değişkenler için kullanılır ive jkarmaşık sayılar için ayrılmıştır.
brianmearns

37

Bazı küçük IDE editörünün sütun aktarımı yaptığını görelim.

:%s/\(.*\)^I\(.*\)/\2^I\1/

açıklama

\(ve \)nasıl olduğunu hatırlamak regex-arazi şeyler. Ve \1, \2vb hatırlanan şeyler almak nasıl.

>>> \(.*\)^I\(.*\)

Her şeyi ^I(sekme) ve ardından her şeyi hatırlayın .

>>> \2^I\1

Yukarıdaki şeyleri "hatırladığınız 2. şey" ve ardından "hatırladığınız 1. şey" ile değiştirin - esasen bir aktarma yapın.


4
Bir çift sekmeyle ayrılmış sütun (birbirinden ayırıcı keyfi, hepsi normal ifade) arasında geçiş yapar.
chaos

39
Bu sadece bir normal ifade; birçok IDE'de regex arama ve değiştirme özelliği bulunur.
rlbond

7
@rlbond - IDE'deki regex motorunun ne kadar iyi olduğu ortaya çıkıyor. Vim'in ifadeleri oldukça güçlü; diğerleri .. bazen çok fazla değil.
romandas

3
* Açgözlü olacaktır, bu nedenle bu normal ifade sadece iki sütununuz olduğunu varsayar. Gereksiz olmasını istiyorsanız * yerine {-} kullanın (bkz: {} çarpanı hakkında daha fazla bilgi için açgözlü olmayan yardım)
Kimball Robinson

4
Bu aslında oldukça basit bir regex, sadece karmaşık görünmesini sağlayan grup parantezlerinden kaçıyor.
mk12

30

Tam olarak karanlık bir sır değil, ancak aşağıdaki eşlemeyi .vimrc dosyama koymak istiyorum, bu yüzden sadece düzenlediğim dosyaya bitişik dosyaları göstermek için dosya gezgini açmak için her zaman "-" (eksi) tuşuna basabilirim . Dosya gezginde, bir dizin yukarı taşımak için başka bir "-" vurabilir, karmaşık dizin yapıları (günümüzde MVC çerçeveleri tarafından kullanılanlar gibi) kesintisiz tarama sağlar:

map - :Explore<cr>

Bunlar birisi için de yararlı olabilir. Ekranı kaydırmayı ve imleci aynı anda ilerletmeyi seviyorum:

map <c-j> j<c-e>
map <c-k> k<c-y>

Sekme gezinme - Sekmeleri seviyorum ve aralarında kolayca hareket etmem gerekiyor:

map <c-l> :tabnext<enter>
map <c-h> :tabprevious<enter>

Yalnızca Mac OS X'te: Safari benzeri sekme gezinme:

map <S-D-Right> :tabnext<cr>
map <S-D-Left> :tabprevious<cr>

Ayrıca, Vim içindeki dosyalara da göz atabilirsiniz:
Şunları da

Merhaba Roman, tam olarak bu eşlemenin yaptığı şey, ancak bunu bir "kısayol tuşuna" atar. :)
KKovacs

27

'Sudo bash' kullanmayı seviyorum ve sistemadım bundan nefret ediyor. O sadece bir avuç komut (ls, chmod, chown, vi, vb) ile kullanılabilir 'sudo' kilitli, ama yine de bir kök kabuk almak için vim kullanabildi:

bash$ sudo vi +'silent !bash' +q
Password: ******
root#

9
FWIW, sudoedit (veya sudo -e) ayrıcalıklı dosyaları düzenler, ancak düzenleyicinizi normal kullanıcı olarak çalıştırır.
RJHunter

12
evet ... Ben de senden nefret ediyorum;) Kök olarak çok fazla komut çalıştırma alışkanlığınız yoksa, izinlerinizin hepsi bozuk olduğu anlamına gelirse, sadece çok nadiren bir kök kabuğa ihtiyacınız vardır.
Hepimiz Monica

5
Neden sistem yöneticiniz size kök salıyor? : D
d33tah

26

Genellikle, düzenleme sırasında geçerli dizinleri değiştirmeyi seviyorum - bu yüzden yolları daha az belirtmeliyim.

cd %:h

Bu ne yapar? Ve autchdir ile çalışıyor mu?
Leonard

2
Sanırım geçici olarak autochdir'i geçersiz kılardı (siz tekrar tamponları değiştirene kadar). Temel olarak, dizini geçerli dosyanın kök dizinine değiştirir. Bana autochdir'den biraz daha fazla manuel kontrol sağlıyor.
rampion

1
: set autochdir // bu aynı işleve hizmet eder ve geçerli dizini arabellekteki dosyanın dizinine değiştirir
Naga Kiran

25

Bir proje üzerinde çalışırken sık sık birçok pencere kullanıyorum ve bazen bunları yeniden boyutlandırmam gerekiyor. İşte ne kullanıyorum:

map + <C-W>+
map - <C-W>-

Bu eşlemeler, geçerli pencerenin boyutunu artırmaya ve azaltmaya izin verir. Oldukça basit ama hızlı.


16
Ayrıca pencereleri eşit genişlikte yapan Ctrl-W = var.
Bill Lynch

2
Vim'de bir eylemi birden çok kez gerçekleştirmek için sayıların başına ekleyebileceğinizi unutmayın. Mevcut pencere yüksekliğini 8 satır genişletmek için: 8 <CW> +
joeytwiddle

23

Belirsiz bir özellik değil, çok kullanışlı ve zaman tasarrufu.

Açık arabelleklerinizin, sekmelerinizin, işaretçilerinizin ve diğer ayarlarınızın bir oturumunu kaydetmek istiyorsanız, aşağıdakileri yapabilirsiniz:

mksession session.vim

Oturumunuzu aşağıdakileri kullanarak açabilirsiniz:

vim -S session.vim

5
Ayrıca :so session.vimvim içinde de yapabilirsiniz .
TankorSmash

22
:r! <command>

harici bir komutun çıktısını arabelleğe yapıştırır.

Biraz matematik yapın ve sonucu doğrudan metinde alın:

:r! echo $((3 + 5 + 8))

Bir Makefile yazarken derlenecek dosyaların listesini alın:

:r! ls *.c

Vikipedi'de okuduğunuz gerçeğe bakmayın, doğrudan yazdığınız belgeye yapıştırılmasını sağlayın:

:r! lynx -dump http://en.wikipedia.org/wiki/Whatever

14
^ R = ekleme modunda 3 + 5 + 8, ifadenin değerini (3 + 5 + 8) daha az tuşa sahip metne eklemenizi sağlar.
Sudhanshu

Sonucu / çıkışı akımdan farklı bir arabelleğe nasıl alabilirim?
dcn


21

Tamponunuzu hızla ROT13 yapmak için F5'i eşleyin:

map <F5> ggg?G``

Bir patron anahtarı olarak kullanabilirsiniz :).


14
Bilmiyorum neyi yazıyorsun ... Ama o :) beni karmakarışık rot13 yazmak görünce mutlaka, patronum daha meraklı olur
sehe

veya arkadaşlarınızı aldatmak için nmap i ggg?G`` . Ya şeytani: nmap i ggg?G``i!
romeovs

1
@romeovs 2'nci sonsuz döngü, nnoremap kullanın
Amit Gold

19

Bunu bugün NSFAQ aracılığıyla buldum :

Kod bloklarını yorumlayın.

CTRL-V'ye basarak Engelli Görsel moduna girin.

Yorum yapmak istediğiniz bloğu işaretleyin.

I (büyük harf I) üzerine basın ve satırın başına yorum dizenizi girin. (// C ++ için)

ESC tuşuna bastığınızda, seçilen tüm satırlar satırın önüne // eklenir.


Ruby kod kodunu yorumlamak için # ekledim. Nasıl geri alabilirim.
Neeraj Singh

3
Sadece ctrl + v tuşlarına tekrar basabilir, // 'leri işaretleyebilir ve x'i "uncomment" konumuna getirebilirsiniz
nos

6
Bunun için NERDCommenter kullanıyorum.
ZyX

1
Yorumlanmış kod, muhtemelen kodunuza koyabileceğiniz en kötü yorum türlerinden biridir. Müthiş blok eki için daha iyi kullanımlar vardır.
Braden Best

1
@Pie yorumladı kod ölü kod olduğu için . Ölü kod hiçbir işe yaramaz ve dağınıklık yaratır. Daha sonra geri getirmek isteyebileceğiniz kodu koruduğunuzu düşünüyorsunuz , ancak her zaman daha iyi bir yol var. Geri alma geçmişinizi kullanabilir, dosyayı kopyalayabilir veya bu işlevin yerleşik ( git checkout) olduğu git'i kullanabilirsiniz . Blok ekleme için daha iyi kullanımlara gelince, herhangi bir taş set yoktur. Aynı karakter dizisini aynı yere eklemek istediğiniz birden çok satırınız olduğunda kullanabilirsiniz.
Braden Best

17

Vim'i yaptığım herhangi bir metin düzenlemesi için kullanıyorum, bu yüzden sık sık kopyala ve yapıştır kullanıyorum. Sorun, vim'in varsayılan olarak içe aktarılan metni yapıştırma yoluyla sık sık bozmasıdır. Bunu durdurmanın yolu

:set paste

verilerinizi yapıştırmadan önce. Bu onu berbat etmesini engelleyecektir.

:set nopasteOtomatik girintiyi kurtarmak için sorun çıkarmanız gerekeceğini unutmayın . Önceden biçimlendirilmiş metni yapıştırmanın alternatif yolları pano kayıtları ( *ve +) ve :r!cat(yapıştırılan parçayı ^ D ile sonlandırmanız gerekir).

Yüksek kontrastlı bir renk düzenini açmak da bazen yararlı olabilir. Bu ile yapılabilir

:color blue

Kullandığım vim'in tüm sürümlerinde çalışmadığını fark ettim ama en çok işe yarıyor.


10
"Bozulma" gerçekleşiyor, çünkü bir tür otomatik girinti etkin. Seçenek set pasteiçin bir anahtar kullanmak veya belirtmek pastetoggle, bu sorunu çözmek için yaygın bir yoldur, ancak aynı etki elde set mouse=aedilebilir, o zaman Vim, gördüğü metin taşkınının fare tarafından tetiklenen bir macun olduğunu bilir.
jamessan

1
Gvim yüklüyse, sık sık (dağıtımınızın hangi vim ile derlediğine bağlı olarak) X panosunu doğrudan vim'den * kayıt aracılığıyla kullanabilirsiniz. Örneğin "*pX xlipboard'dan yapıştırmak için. (Terminal vim'den de çalışır, sadece
ayrıysa

2
Kayıt için @kyrias *, PRIMARY("orta tıklama") kaydıdır . Pano olduğunu+
Braden İyi
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.