Birden çok imleç kullanmak Vimmer değil
Çok imleçler kullanarak bir yorumda söylediğim gibi (bir eklenti ile bile) gerçekten "Vim yolunu takip etmiyor", tamamen Sublime-Text'den gelen biri için cazip olduğunu anlıyorum, ancak en azından Vim yerleşik özellikleri ile verimli.
Tabii ki, bu alternatif çözümleri bulmak her zaman kolay değildir ve bazen zaman alır, ancak Vim deneyiminizle daha kolaylaşır ve zamanla birden çok imlecin sizin için tamamen işe yaramayacağını göreceksiniz.
Bu harika ama alternatif bir yolu nasıl bulabilirim?
Evrensel bir cevap yok çünkü ne yapmaya çalıştığınıza çok bağlı, sadece denemek için ilk şeyler hakkında bazı ipuçları vermeye çalışacağım:
Nokta komutu .
Nokta komutu muhtemelen Vim'deki en güçlü araçlardan biridir, sadece son değişikliği tekrarlamamıza izin verir. Pratik Vim'de Drew Neil'den daha iyi açıklayamadım . Her Vimmer'ın bu kitabı okumayı düşünmesi gerektiğini düşünüyorum.
Bu komutun gücü, son değişikliğin bir karakter, çizgi veya tüm dosya üzerinde çalışan bir eylem olabilmesidir. Örneğin, ekleme moduna girdiğiniz anda ve normal moda geri döndüğünüz andaki değişiklik sınırlandırılabilir.
Bunu akılda tutarak, çok imleç ile yapmak istediğiniz şeyi yapmak kolaydır:
Önce çevremizi kuralım: Önerdiğiniz gibi yazalım
\section[]{}
Sonra tekrarlanabilir bir değişiklik yapın
İmleç şimdi açık }
, karaktere F[
geri dönmek için tuşuna basın [
. Ardından ekleme modunu girin i
ve yazın My first section in this book
ve aşağıdakilerle normal moda geri dönün ESC
:
\section[My first section in this book]{}
Ve işte sihirli kısım geliyor: f{
İmleci {
karakterin üzerine getirip .
son değişikliği tekrarlamak için basalım:
\section[My first section in this book]{My first section in this book}
Nokta komutunun tüm zorluğu, tekrarlanabilir değişikliklerin nasıl yapıldığını öğrenmek: grokking Vim ile gelecek, ancak temel, değişikliğinizi tekrarlanabilir bir şekilde nasıl yapacağınızı anlamaktır.
Örneğin, A;
yerine kullanmak istediğiniz bir satırın sonuna noktalı virgül eklemek için
$a;
. Neden?
Çünkü A;
kullanacağınız zaman öylesine bir atom eylemi yaratır .
başka hat üzerinde, çizgiyi neresinde olursa olsun sonunda noktalı virgül ekleyeceksiniz. Oyunuzu kullanırken $a;
değişikliğinizi iki parçaya $a
ayırın ve ;
eğer kullanmanız halinde .
imlecin geçerli konumuna yarım kolon yerleştirecektir.
NOT Vim'deki sihirli formül n.
. Gerçekten harika bir iş akışı:
- düzenleme yapmak istediğiniz yeri arayın
/pattern
- tekrarlanabilir düzenlemenizi yapın
n
düzenlemek için bir sonraki yere gitmek için kullanın
.
düzenlemeyi tekrarlamak için kullan
- son iki adımı tekrarlayın: Siz dünyanın kralısınız (ya da en azından düzenlemeleriniz)
makrolar
Makrolar, Vim'de son derece önemli bir başka araçtır, çünkü bir dizi tuş vuruşunu kaydetmenize ve tekrar yazmış gibi tekrarlamanıza izin verir.
Örnek olarak ikinci kullanım durumunuzu kullanacağım:
variable1 = 2
my_variable2 = 12
var3 = 14
Bir kez daha önemli olan, makrolarınızı nasıl verimli hale getireceğinizi öğrenmektir (hemen sonra karşı bir örnek vereceğim):
İmlecinizi sözcüğün üzerine getirin variable1
ve makronuzu ile kaydetmeye başlayın
qq
. Bu, "Gelecekteki tüm tuş vuruşlarımı adlı kayıt defterine kaydetmeye başla" anlamına gelir q
.
Düzenleme yazmanızı yapmaya başlayın:
0
çizginin başına gitmek
e
ilk kelimenin sonuna gitmek
a
imlecinin arkasına eklemek
.someStuff
istenen metni eklemek
<Esc>
eklemeyi durdurmak için
j
sonraki satıra gitmek
q
makro kaydını durdurmak için
Alacaksınız:
variable1.someStuff = 2
my_variable2 = 12
var3 = 14
- Artık düzenlemenizi tekrarlamak için makroyu kullanabilirsiniz. Düzenlemek için doğru satırdayken makroyu yürütebilirsiniz
@q
. İki kez yürütmek istediğimiz için 2@q
aşağıdaki sonucu elde edebilirsiniz:
variable1.someStuff = 2
my_variable2.someStuff = 12
var3.someStuff = 14
NOT 1 Fark etmiş olabileceğiniz gibi 0ea
, makronun başında kullanmak gerçekten önemliydi. Gerçekten de, makroyu kaydetmeden ve tekrar çalıştırmadan önce imlecinizi ilk sözcüğün sonuna koysaydınız sonuç şöyle olurdu:
variable1.someStuff = 2
my_variable2 = 12.someStuff
var3 = 14.someStuff
İmleciniz olarak metin, satır değiştirildikten sonra imlecin bulunduğu konuma eklenirdi (yani, bu durumda satırın sonu)
Not 2 - Makrolar son derece güçlüdür ve onlarla rahat olduğunuzda özyinelemeli makrolar bile oluşturabilirsiniz. İşte makronuz şunlar olabilirdi:
`0ea.someStuff<Esc>j@q`
Final @q
, makroyu kullanmak yerine tek başına çağırırdı 2@q
; sadece kullanardınız @q
ve tüm işler yapılırdı.
görsel blok
Burada, kullanım durumunuz için doğrudan geçerli olmayan, ancak aynı anda çok sayıda satırı düzenlemek için gerçekten yararlı olabilecek başka bir numara geliyor. Şimdi bu CSS kodu özetini alalım:
li.one a{ background-image: url('/images/sprite.png'); }
li.two a{ background-image: url('/images/sprite.png'); }
li.three a{ background-image: url('/images/sprite.png'); }
Ne gelen sprite hareket ederse images
hiç components
?
Iyi üzerinde imleci koyabilirsiniz i
ait images
ve basın <C-v>
. Bu, blokların seçilmesine izin veren görsel blok modunu başlatacaktır. Şimdi t/
değiştirmek istediğiniz sözcüğü seçmek ve sözcüğün 2j
tüm örneklerini seçmek için yazabilirsiniz .
Bundan sonra c
kelimeyi değiştirmek için yazmanız ve ardından components
. Ekleme modundan çıktığınızda şunları göreceksiniz:
li.one a{ background-image: url('/components/sprite.png'); }
li.two a{ background-image: url('/components/sprite.png'); }
li.three a{ background-image: url('/components/sprite.png'); }
Global komut
Global komut, bir kalıpla eşleşen satırlara ex mode komutunun uygulanmasına izin veren bir araçtır, bir kez daha aynı değişikliği birden çok imleçe ihtiyaç duymadan farklı bir yere uygulamak için iyi bir yoldur.
Sözdizimi şöyledir:
:[range] g / pattern / command
[range]
Parametre hakkında daha fazla bilgi için lütfen bakınız :h :range
. Burada detaylandırmayacağım, sadece %
tüm dosyayı '<,'>
temsil ettiğini, son seçimi 1,5
temsil ettiğini ve dosyanın 1 ila 5 satırlarını temsil ettiğini hatırlatacağım .
Bu parametre, global komut tarafından ele alınacak hatları tanımlar. Herhangi bir aralık belirtilmezse, global komut %
varsayılan olarak kullanılır.
[Kalıp] bağımsız değişkeni, arama motoruyla birlikte kullandığınız gibi bir arama kalıbıdır. Arama geçmişini entegre ettiği için bu alanı boş bırakabilirsiniz ve global komut daha sonra arama geçmişindeki son arama modelini kullanır.
Son olarak, [command] parametresi alıştığınız gibi bir ex komutudur.
Şimdi küresel komutun davranışı oldukça basit:
- [Range] parametresinde tanımlanan tüm satırlar arasında yineleme
- Geçerli satır tanımlanan kalıpla eşleşiyorsa, komutu uygulayın
[Command] parametresi eski bir komut olduğundan, birçok şey yapabilirsiniz. Oldukça ilginç olmayan ve çok sayıda hata ayıklama iletisine sahip olan aşağıdaki sahte kodu alalım:
var myList = null
var i = 0
myList = new List()
echo "List instantiated"
for (i=0; i<10; i++)
myList.Add(i)
echo i . " added to the list"
echo "end of for loop"
Şimdi bu kodun çalıştığından emin olduğunuzdan ve şu işe yaramaz echo
ifadeleri silmek istediğinizi varsayalım :
Global komutunuzu tüm dosyaya uygulayabilirsiniz, böylece komutun başına %
(veya %
varsayılan aralık olduğu için hiçbir şey olmadan) başlamanız gerekir .
Silmek istediğiniz tüm satırların kalıpla eşleştiğini biliyorsunuz echo
Bu satırları silmek istersiniz, böylece şu :delete
şekilde kısaltılabilen komutu kullanmanız gerekir:d
Yani aşağıdaki işlevi kullanmanız yeterlidir:
:%global/echo/delete
Ayrıca şu şekilde de kısaltılabilir
:g/echo/d
Not %
kayboldu global
olarak kısaltılır g
ve delete
olarak d
. Tahmin edebileceğiniz gibi sonuç:
var myList = null
var i = 0
myList = new List()
for (i=0; i<10; i++)
myList.Add(i)
Not 1 - Fark etmem biraz zaman alan önemli bir nokta,
normal
komutun ex komutu olması, yani global komutla kullanabileceğiniz anlamına geliyor. Bu gerçekten güçlü olabilir: diyelim ki yankı içeren tüm satırları çoğaltmak istiyorum, bir makroya, hatta sihirli formüle ihtiyacım yok n.
. Sadece kullanabilirim
:g/echo/normal YP
Ve işte:
var myList = null
var i = 0
myList = new List()
echo "List instantiated"
echo "List instantiated"
for (i=0; i<10; i++)
myList.Add(i)
echo i . " added to the list"
echo i . " added to the list"
echo "end of for loop"
echo "end of for loop"
NOT 2 "Hey, komutumu belirli bir kalıpla eşleşmeyen satırlarda kullanmak istersem ne olur?"
global
komutun [pattern] parametresiyle eşleşmeyen satırlara uygulanması dışında tam olarak çalışan vglobal
kısaltılmış bir komuta sahiptir . Bu şekilde başvurursakv
global
:v/echo/d
Önceki örneğimizde:
echo "List instantiated"
echo i . " added to the list"
echo "end of for loop"
delete
Komut içeriyordu vermedi hatlarında uygulanmıştır echo
.
Burada umarım bu birkaç ipucu size çoklu imleç eklentinizden nasıl kurtulacağınız ve Vim'i Vim yolunda nasıl kullanacağınız konusunda fikir verecektir ;-)
Tahmin edebileceğiniz gibi bu örnekler oldukça basittir ve sadece Vim yolunu izlediğinizde nadiren birkaç imlece ihtiyacınız olduğunu göstermek için yapılmıştır. Benim tavsiyem, yararlı olacağını düşündüğünüz bir durumla karşılaştığınızda, yazıp daha iyi bir çözüm bulmak için biraz zaman ayırmanızdır. Zamanın% 99'u sonunda bunu yapmanın daha hızlı / daha verimli bir yolunu bulacaksınız.
Ayrıca kendimi bir kez daha tekrarlayacağım ama Drew Neil'in Pratik Vim'i okumanızı gerçekten teşvik ediyorum
çünkü bu kitap "Vim'de böyle ya da bu nasıl yapılır" ile ilgili değil "Vim tarzında düşünmeyi öğrenmek" bu da gelecekteki problemlerinize iyi bir şekilde kendi çözümünüzü oluşturmanızı sağlayacaktır.
PS Special @Alex Stragies'e düzenleme çalışmaları ve bu uzun gönderide yaptığı düzeltmeler için teşekkür eder.