İstenen yerde birden çok imleç


14

Ben kullanıyorum vim-birden-imleçleri eklentisi.

İmleçleri tam olarak istediğim yere koymak istiyorum. Örneğin ( [x]imleç konumlarıdır):

Lorem ipsum dolor sit amet[1], consectetur adipiscing elit, 
sed do eiusmod tempor incididunt ut labore et dolore magna[2]
aliqua.

In Sublime Text normalde sonra, ilk imleci koyardı ok tuşları ile bir sonraki pozisyona gidip ikinci bir koymak.

VIM'de benzer bir şey var mı? Bu eklentiyle veya başka biriyle.

DÜZENLE

Bir yorumun ardından
\section[My first section in this book]{My first section in this book}
, bir .texdosyaya yazmaya çalışırken bunu yapmaya olan ilgim ortaya çıktı . İlk tepkim \section[]{}aynı şeyi []ve içine yazmak için iki imleç yazmak ve koymaktı {}.

Başka bir örnek, _someStuffbirkaç farklı değişken adından sonra eklemek olacaktır . Örneğin, şunu çevirin:

variable1 = 2
my_variable2 = 12
var3 = 14

bunun içine:

variable1_someStuff = 2
my_variable2_someStuff = 12
var3_someStuff = 14

Birden çok imleç ile bir sütun imleci seçip sonra sözcüğün sonuna gidip, vb yapabilirim. Ama sanırım tam olarak imleçlerin olmasını istediğim yeri seçmek kolay olurdu.



1
Bence sorulması gereken önemli bir soru neden bunu yapmak istiyorsun? Ne yapmaya çalışıyorsun? Birden çok imleç kullanmak gerçekten "Vim yolunu izlemez", yerleşik özellikleri kullanarak, en azından ne kadar verimli olursa olsun istediğinizi yapmanın muhtemelen farklı bir yolu vardır.
statox

@statox. Bkz. Düzenleme. Aklıma gelen iki örnek verdim. İkincisi vim-multip-imleçler eklentisi ile başarabilirim, ancak ilki, en azından kolay bir şekilde yapamıyorum.
tomasyany

Nobe4 @. Teşekkürler, ikinci senaryo bunu başardı.
tomasyany

Yanıtlar:


30

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 ive yazın My first section in this bookve 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 $aayı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
  • ndü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 variable1ve 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@qaş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 @qve 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 imageshiç components?

Iyi üzerinde imleci koyabilirsiniz iait imagesve 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 2jtüm örneklerini seçmek için yazabilirsiniz .

Bundan sonra ckelimeyi 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,5temsil 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 echoifadeleri 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 globalolarak kısaltılır gve deleteolarak 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, normalkomutun 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?"

globalkomutun [pattern] parametresiyle eşleşmeyen satırlara uygulanması dışında tam olarak çalışan vglobalkısaltılmış bir komuta sahiptir . Bu şekilde başvurursakvglobal

:v/echo/d

Önceki örneğimizde:

echo "List instantiated"
    echo i . " added to the list"
echo "end of for loop"

deleteKomut 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.


Çok eksiksiz bir cevap. Aslında tüm bu komutları biliyordum, ama onları böyle kullanmayı hiç düşünmemiştim ... Sanırım daha fazla uygulamaya ihtiyacım var. Bununla birlikte, bazen 'vim-way' nin sadece bazı eklentileri kullanmaktan daha uzun sürdüğünü söylemeliyim (örneğin, CSS örneğiniz bahsettiğim eklenti ile çok daha hızlı yapılabilir) ve bazen çok daha kısa sürer (aslında, engin vim çoğu kez düzgün kullanılırsa herhangi bir metin düzenleyicisinden daha hızlıdır).
tomasyany

Btw, bence cevabın çoktan tamamlandı. Kabul edeceğim, ancak daha fazla ayrıntı eklemek istiyorsanız, lütfen yapın ve bunları okumaktan memnuniyet duyarız.
tomasyany

1
@tomasyany: Aslında bazen "vim yolunu" kullanmak daha uzun görünebilir (bir çalışma makrosu oluşturmak için kaç kez daha fazla zaman harcadığımı sayıp manuel olarak yapmamdan daha fazla zaman harcayacağımı sayamıyorum), ancak uygulama ile sonunda daha hızlı hale gelir. Vim'i sadece bir yıldır kullanıyorum ve uzman olmaktan çok uzaktayım ama pratik yaparken düzenlememin sürekli geliştiğini hissediyorum.
statox

1
Muhtemelen gnmetin nesnesinden de bahsetmeliyiz . Çoklu imleçlerin bazı kullanım durumlarını ele alır. İle arama yapın /, sonra dgnveya cgnile tekrarlayın ..
Justin M. Keyes

@ Justin gerçekten aşina değilim gnbir deneyeceğim ve sonra ekleyeceğim. Başınız için teşekkürler!
statox

5

Bana verilen kullanım durumlarınız, .tuş komutunu bilmek istiyor gibi geliyor (son Düzenleme komutunu tekrarlayın)

  • İlk sıraya gidin, tuşuna basın i, metninizi ekleyin,<ESC>
  • 2. konuma gidin, .(Dot) ==> Özdeş Metin eklendi'ye basın
  • Burada bir satır aşağı gitmek ve tekrar eklemek için (art arda satırlara eklerken), <ALT>-j.

Benim için tex örneğiniz şu şekilde çözülür:

I\section[]{}<ESC>hhiMy first Sec...<ESC>lll.


Oldukça hoş bir çözüm. .Anahtar komutu mükemmel bir şekilde biliyordum , ama asla bu şekilde kullanmayı düşünmedim. Güzel bir yol olduğuna katılıyorum. Ama cevabınız gerçek soruya değinmiyor, bu yüzden bunu kabul etmek uygun olmaz sanırım.
tomasyany

1
Sorunuz (istenen kullanım durumlarını ekledikten sonra) bana "Makasımı gerçekten seviyorum ve onlarla bir vidayı sıkmak istiyorum. Nasıl olduğunu söyle" hatırlattı. Ve ben bir tornavida için şık bir kullanım işaret;) (Bir cevap olarak ekledim, çünkü bilmiyorum, yorumlarda biçimlendirme nasıl yapılır)
Alex Stragies

4

Daha fazla Vim yolu.

İlk görev:

\section[foobar baz]{foobar baz}

İş Akışı:

\section[]{}
hh
ifoobar baz<Esc>
$.

İkinci görev:

variable1 = 2
my_variable2 = 12
var3 = 14

Komut:

3:norm ea_somestuff

Sonuç:

variable1_somestuff = 2
my_variable2_somestuff = 12
var3_somestuff = 14
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.