~/yazilar/vi-editor-kullanimi
vi'dan çıkamayanlar için vi
içindekiler
~
~
~
"/etc/ssh/sshd_config" 128L, 3254Bcrontab -e, visudo, git commit ya da başkasının bıraktığı bir EDITOR=vi ayarı. Bir şekilde bu ekrana düşüyorsun, bir şeyler yazmaya çalışıyorsun, ekranda harfler yerine imleç oradan oraya zıplıyor, Ctrl+C işe yaramıyor. Terminali kapatıp yeniden bağlanmak da çözüm değil, çünkü bir sonraki sefer aynı ekran yine gelecek.
vi'ı öğrenmenin bir sistemci için en pratik sebebi şu: neredeyse her yerde var. Kurtarma moduna düşmüş bir sunucuda, bir switch'in Linux tabanlı kabuğunda, Alpine tabanlı bir container'da nano olmayabilir, ama bir vi mutlaka oluyor. Bu yazıda vi'ı sevdirmeye çalışmıyorum. Amacım, bir config dosyasını açıp düzeltip kaydedip çıkabilecek kadarını ve işi hızlandıran birkaç alışkanlığı anlatmak.
vi mi, vim mi
Ubuntu'da vi yazınca açılan program aslında Vim (Vi IMproved). Ubuntu Server'da ya tam vim paketi ya da onun küçük sürümü vim-tiny kurulu geliyor. Alpine'da vi BusyBox'ın içindeki çok daha basit bir uygulama, Red Hat tarafında da vi ile vim ayrı paketler olabiliyor. Buradaki temel komutların hepsi bu sürümlerin hepsinde çalışıyor. Sadece Vim'de olanları ayrıca belirteceğim.
Hangisini kullandığını görmek için:
readlink -f "$(command -v vi)"Modlar: bütün karışıklığın sebebi
vi'da tuşların ne yaptığı, hangi modda olduğuna bağlı. Dosyayı açtığında normal moddasın. Bu modda harfler yazı değil, komut. d silmek, w bir kelime ileri gitmek, u geri almak demek. İlk açtığında yazmaya çalışıp dosyayı dağıtmanın sebebi bu.
Yazı yazmak için ekleme moduna geçmen gerekiyor. En basiti i. Ekranın altında -- INSERT -- yazısı çıkıyor ve artık bastığın tuşlar dosyaya yazılıyor. İşin bitince Esc ile normal moda dönüyorsun.
İki nokta (:) ile de komut satırı moduna geçiliyor. Kaydetme, çıkma, toplu değiştirme gibi işler burada yapılıyor. Komutu yazıp Enter'a basınca çalışıyor ve tekrar normal moda dönüyorsun.
Ne yaptığından emin değilsen Esc'e bas. Bir kez fazla basmanın zararı yok, seni her durumda normal moda getiriyor.
Önce çıkmayı öğren
Hepsi normal moddan, yani önce Esc:
| Komut | Ne yapar |
|---|---|
:q | Çık. Değişiklik varsa çıkmaz, uyarı verir. |
:q! | Değişiklikleri atıp çık. |
:w | Kaydet, dosyada kal. |
:wq | Kaydet ve çık. |
:x | Değişiklik varsa kaydet, sonra çık. |
Kaydetmeden çıkmaya çalışınca gelen uyarı şu:
E37: No write since last change (add ! to override)Mesaj ne yapman gerektiğini zaten söylüyor. Değişikliği istiyorsan :wq, istemiyorsan :q!.
:wq ile :x arasındaki fark küçük ama bazen önemli. :wq dosyayı değiştirmesen bile yeniden yazıyor ve değiştirilme tarihini güncelliyor. :x sadece gerçekten değişiklik varsa yazıyor. Değişiklik tarihine bakan bir script ya da senkronizasyon aracı varsa :x daha temiz.
Dosyanın içinde dolaşmak
Ok tuşları çalışıyor, onlarla da idare edersin. Ama birkaç hareket komutu büyük dosyalarda çok zaman kazandırıyor:
gg dosyanın başı
G dosyanın sonu
42G 42. satır (:42 de aynı işi yapar)
0 satır başı
^ satırdaki ilk boşluk olmayan karakter
$ satır sonu
w / b bir kelime ileri / geri
Ctrl+d yarım sayfa aşağı
Ctrl+u yarım sayfa yukarı
% eşleşen parantezin üstüne atlah, j, k, l de sol, aşağı, yukarı ve sağ ok tuşlarının karşılığı. Klasik vi'da ok tuşları olmayan terminaller için var. Ellerin klavyenin ortasından ayrılmadığı için alışan bırakamıyor, ama başlarken ok tuşlarını kullanmakta bir sakınca yok.
Bir hata mesajı "line 87" diyorsa dosyayı doğrudan o satırda açabilirsin:
vi +87 /etc/nginx/nginx.confYazmaya başlamanın farklı yolları
i imlecin olduğu yerden yazmaya başlatıyor. Ama çoğu zaman başka bir yerden başlamak istiyorsun:
i imlecin önüne yaz
a imlecin arkasına yaz
I satırın başına yaz
A satırın sonuna yaz
o altına yeni satır aç ve yaz
O üstüne yeni satır aç ve yazConfig dosyalarında en çok kullandığım ikisi A ve o. Bir satırın sonuna bir parametre eklemek için satıra gidip A, bir bölümün altına yeni bir ayar eklemek için o.
Silmek, kopyalamak, yapıştırmak
x imlecin altındaki karakteri sil
dd satırı sil
5dd 5 satır sil
yy satırı kopyala
p imlecin altına yapıştır
P imlecin üstüne yapıştır
u geri al
Ctrl+r ileri al (geri almayı geri al)
. son değişikliği tekrarlavi'da "kes" diye ayrı bir şey yok. dd ile silinen satır aynı zamanda panoya (vi'ın deyişiyle register'a) gidiyor, p ile başka bir yere yapıştırabiliyorsun. Bir satırı taşımak dd, gideceği yere git, p.
Asıl işe yarayan şey, bu komutların bir dil gibi birleşmesi. d (sil), c (değiştir) ve y (kopyala) birer fiil, hareket komutları da nesne:
dw kelimenin sonuna kadar sil
d$ satırın sonuna kadar sil
dG buradan dosyanın sonuna kadar sil
cw kelimenin sonuna kadar sil ve yazmaya başla
ciw imlecin üstündeki kelimeyi baştan sona değiştir (Vim)
ci" tırnak içindekini değiştir (Vim)
yG buradan dosyanın sonuna kadar kopyalaci" örneğin bir YAML dosyasında image: "nginx:1.27" satırında tırnağın içinde herhangi bir yerdeyken tırnak içini silip seni yazma moduna sokuyor. Bunu bir kez kullanınca fareyle seçip silmek yavaş gelmeye başlıyor.
. ile tekrarlamayı da küçümseme. On satırın başına # koyacaksan ilk satırda I# ve Esc, sonra j. j. j. diye devam edebilirsin. Daha hızlısı biraz aşağıda.
Arama ve değiştirme
Normal modda / yazıp aradığını yaz, Enter. n bir sonraki eşleşmeye, N bir öncekine gidiyor. ? aynı aramayı yukarı doğru yapıyor. İmlecin üstündeki kelimenin geçtiği diğer yerleri bulmak için * yetiyor.
/PermitRootLoginToplu değiştirme komut satırından:
:%s/eski/yeni/g% bütün dosya, s substitute, sondaki g de satırdaki bütün eşleşmeler demek. g yazmazsan her satırdaki sadece ilk eşleşme değişiyor. Sonuna c eklersen (/gc) her değişiklikten önce soruyor, emin olmadığın toplu değişikliklerde bunu kullanıyorum.
Sadece belirli satırlarda değiştirmek için aralık ver:
:10,20s/8080/8081/gYolları değiştirirken / karakteri ayraçla karışıyor ve her / önüne \ koymak gerekiyor. Ayraç olarak başka bir karakter kullanmak daha okunaklı:
:%s#/var/log/app#/srv/log/app#gArama sonrası eşleşmeler vurgulu kalıyorsa (Vim'de hlsearch açıksa) :noh vurguyu kaldırıyor.
Görsel mod ve blok seçimi
v karakter karakter, V satır satır seçmeye başlatıyor. Seçtikten sonra d ile silebilir, y ile kopyalayabilir, > ve < ile girintiyi değiştirebilirsin. YAML'da yanlış girintilenmiş bir bloğu düzeltmek için V, aşağı ok, > en kısa yol.
Ctrl+v ise sütun seçimi yapıyor ve config dosyalarında en çok işe yarayan özellik bu olabilir. On satırın başına # koymak için:
- İlk satırın başına git (
0). Ctrl+vile blok seçimini başlat,jile aşağı doğru on satır seç.I(büyük i),#yaz.Esc'e bas.
Esc'e basana kadar # sadece ilk satırda görünüyor, basınca hepsine ekleniyor. Yorumu geri almak için aynı şekilde sütunu seçip d.
sudo'suz açtığın dosyayı kaydetmek
/etc altında bir dosyayı sudo'suz açıp beş dakika uğraştıktan sonra :w dediğinde:
E45: 'readonly' option is set (add ! to override)ya da :w! ile zorladığında:
E212: Can't open file for writingDeğişiklikleri kaybetmeden kaydetmenin klasik yolu, içeriği sudo tee ile dosyaya yazdırmak:
:w !sudo tee % > /dev/null% açık dosyanın adı. Vim sudo parolasını soruyor, sonra dosyanın diskte değiştiğini fark edip yeniden yükleyip yüklememeyi soruyor. L (Load) ile yükle, ardından :q ile çık.
Bu bir kurtarma hilesi, alışkanlık yapma. Sistem dosyalarını düzenlemenin doğru yolu sudoedit:
sudoedit /etc/ssh/sshd_configsudoedit dosyanın geçici bir kopyasını senin kullanıcınla açıyor, editörden çıkınca kopyayı yerine yazıyor. Editör root olarak çalışmadığı için Vim eklentileri ya da kendi .vimrc ayarların root yetkisiyle çalışmamış oluyor. Hangi editörün açılacağını SUDO_EDITOR, VISUAL ya da EDITOR değişkenine bakarak seçiyor.
Swap dosyası uyarısı
Bir dosyayı açınca şu ekranla karşılaşabilirsin:
E325: ATTENTION
Found a swap file by the name ".sshd_config.swp"
owned by: yonetici dated: Sun Oct 18 14:02:11 2026
file name: /etc/ssh/sshd_config
modified: no
user name: yonetici host name: srv01
process ID: 2214 (STILL RUNNING)
...
Swap file ".sshd_config.swp" already exists!
[O]pen Read-Only, (E)dit anyway, (R)ecover, (Q)uit, (A)bort:Vim düzenlediğin dosyanın yanında .dosyaadi.swp adlı bir çalışma dosyası tutuyor. Bu mesaj iki durumdan birinde geliyor: ya o dosya şu an başka bir oturumda açık, ya da önceki bir oturum düzgün kapanmamış (SSH bağlantısı koptu, sunucu yeniden başladı).
process ID satırının sonunda STILL RUNNING yazıyorsa dosya gerçekten başka biri tarafından (ya da senin başka bir terminalinde) açık. Burada E ile devam edersen iki kişi aynı dosyayı düzenliyor olursunuz ve son kaydeden diğerinin değişikliğini siler. Q ile çık, o oturumu bul.
Süreç çalışmıyorsa Vim seçeneklere bir de (D)elete it ekliyor. Önceki oturumda kaydedilmemiş bir değişiklik varsa R ile kurtar, dosyaya bak, kaydet. Sonra swap dosyasını sil, yoksa her açılışta aynı soru gelir. Kurtaracak bir şey yoksa doğrudan D.
Birkaç tuzak
Ekran donuyor. Ctrl+S'e alışkanlıkla basmak terminalin çıktısını durduruyor (XOFF), vi'ın kendisiyle ilgisi yok. Ctrl+Q ile devam ediyor.
Yapıştırınca girinti merdiven gibi kayıyor. Eski bir Vim ya da bracketed paste desteklemeyen bir terminalde, ekleme modunda yapıştırılan her satır bir öncekinin girintisini alıp üstüne kendi girintisini ekliyor. YAML'da bu felaket. Yapıştırmadan önce :set paste, sonra :set nopaste. Güncel Vim sürümleri ve çoğu terminal bunu kendisi hallediyor, ama bir gün eski bir sunucuda karşına çıkacak.
Tab mı boşluk mu. Varsayılan ayarlarla Tab tuşu gerçek bir tab karakteri ekliyor. YAML tab kabul etmiyor. Kendi .vimrc dosyanda YAML için ayar yapmak bunu çözüyor, aşağıda var.
Kendi kullanıcın için küçük bir .vimrc
Sunucularda paylaşılan ayarları değiştirmeyi sevmiyorum, ama kendi ev dizinimdeki ~/.vimrc dosyası birkaç satırla hayatı kolaylaştırıyor (bunlar Vim ayarları, BusyBox vi bu dosyayı okumuyor):
syntax on
set number
set hlsearch incsearch
set ignorecase smartcase
autocmd FileType yaml setlocal tabstop=2 softtabstop=2 shiftwidth=2 expandtabnumber satır numaralarını gösteriyor, hata mesajlarındaki satırı bulmak kolaylaşıyor. incsearch yazarken aramaya başlıyor. ignorecase smartcase ikilisi küçük harfle aranınca büyük küçük harf ayırmıyor, aramada bir büyük harf varsa ayırıyor. Son satır da YAML dosyalarında Tab tuşunun iki boşluk eklemesini sağlıyor.
Ubuntu'da crontab -e ve benzeri komutların hangi editörü açacağını değiştirmek istersen:
sudo update-alternatives --config editorya da sadece kendi kullanıcın için ~/.bashrc içine export EDITOR=vim ve export VISUAL=vim. crontab -e ilk çalıştırıldığında editör sorduysa, o seçim select-editor komutuyla değiştiriliyor.
Pratik yapmak
Vim ile birlikte vimtutor diye bir komut geliyor. Yarım saatlik, dosyanın içinde adım adım ilerleyen bir alıştırma. Bu yazıdaki her şey orada da var, ama okumak ile parmakların alışması ayrı şeyler. Ubuntu'da Türkçe çevirisi de var, vimtutor tr ile açılıyor.
Başta i, Esc, :wq ve :q! yetiyor. Gerisi ihtiyaç oldukça geliyor.