Emacs'ta bitişik olmayan bölgeler nasıl seçilir?


31

Geçerli tamponda zaten bir metin seçtiğimi varsayalım. Önceki seçimi (vb.) Tutarken başka bir metin dizisi seçmek mümkün müdür?

Eklendi : Bu işlevsellik için bir motivasyon aşağıdaki gibidir: Buna benzeyen bir metnim olduğunu varsayalım:

paragraph 1 ...

paragraph 2 ...

paragraph 3 ...

paragraph 4 ...

paragraph 5 ...

Bazı paragrafları (örneğin 2, 4 ve 6) kaldırmak ve paragraf 1'den önce eklemek istiyorum.


1
Bir var ikincil seçim .
wasamasa,

2
Multiselect bir paket var: skamphausen.de/cgi-bin/ska/multiselect Biraz hızlı kesmek gibi gözüküyor.
Tobias

Seçtiğinizin boyutuna ve nedenine bağlı olarak, multiple-cursorssize bir çözüm verebilir.
Jordon Biondo

@ wasamasa Verdiğiniz bağlantıda verilen talimatı takip ettim. İlk seçimden sonra Meta tuşunu basılı tutarak ikinci bölgeyi seçtim. Seçildi, ancak iki sorun var: (1) ikinci seçim, kopyalama veya silme çalışmadığı için gerçek bir seçim gibi görünmüyor. (2) Bu şekilde üçüncü bir seçim yapmak mümkün değildir.
Adı

1
Emacs Wiki'nin ikincil seçim hakkında iyi bir bölümü var . Örneğin çeşitli geliştirmeler, klavyeden daha kullanışlı olmasını sağlar.
Drew,

Yanıtlar:


43

Sen kullanabilirsiniz append-next-kill(bağlı C-M-wyukarıdaki eklemek istediğiniz metni biriktirmeye varsayılan) paragraph 1:

  1. paragraph 2Normalde yaptığınız gibi öldürün .

  2. Mark paragraph 4ve basın C-M-wbunu öldürmeden önce. Bu adımı daha önce taşımak istediğiniz tüm paragraflar için tekrarlayın paragraph 1.

İşiniz bittiğinde, birikmiş metni daha önce ekleyebilirsiniz paragraph 1.


5
Temel şeylerle bile, daima öğrenilecek yeni şeyler vardır! Bu oldukça kullanışlıdır, çünkü bunu yapmam gerektiğinde, öldürme halkasını dolaştırarak çok fazla tuşa basardım. Keşke bunu biraz daha fazla oylayabilseydim ...
Anlamlı kullanıcı adı

9

Markalama halkası ile birlikte kayıtları kullanabilirsiniz. Mevcut işaretleri itin C-<SPC> C-<SPC>, daha sonra onları kurtarmak C-u C-<SPC>veya bir kayıt, diyelim kaydedebilirsiniz byoluyla, C-x r <SPC> bve daha sonra geri atlama C-x r j b.

Şimdi başka bir bölgeyi işaretleyin. C-u C-x r s aişaretlenmiş bölgeyi kopyalamak ave metni silmek için kopyalar . Ardından bir sonraki bölgeyi işaretleyin ve C-u C-x r + abu sicile başka bir seçim ekleyin ave silin.

İçeriği daha sonra ile ekleyebilirsiniz C-x r i a.

Emacs kılavuzunun "Kayıtlardaki Metni Kaydetme" bölümüne bakın.


5

Aslında kişiye Emacs'ın-24.4 yeni dikdörtgen bölge destek, bu işlev için gerekli alt (büyük bir kısmı) [Sonuçta, bir dikdörtgen olan bitişik olmayan bir bölge].

Bu nedenle, şimdi yalnızca istediğiniz işlevselliği sağlayan "bölünmüş bölge" paketini uygulamak mümkün olmalıdır.

Kuşkusuz, birçok Emac komutu hala yeni altyapıyı kullanmaya uyarlanmadı (örneğin, bölge büyüklüğü veya bölgedeki geri alma, sorgu değiştirme, ... gibi komutlar) ve bu nedenle henüz dikdörtgenler üzerinde düzgün çalışmıyor (bu yüzden ya "bölünmüş bir bölge" de düzgün çalışmazlardı), ama bunlar zaman içinde düzelmesi gereken böceklerdir.


4

Browse-kill-ring.el'i yükle

tüm ilgilenilen bölgeleri kopyala ve öldür.

Yeniden yerleştirmenin başlayacağı yeri göstermeli.

M-x browse-kill-ring RET bir tampon açacak ve imleci içine yerleştirecektir.

Tip nseyahat parçalar için.

RET öbek parçasını orijinal / diğer tampondaki noktaya yerleştirir.


3

Değiştirmek istediğiniz çizgiler bir regex eşleşmesiyle ayırt edilebilirse, bunları yeni bir pencerede görüntülemek için oluşma modunu kullanabilirsiniz . Daha sonra kullanabilirsiniz meydana düzenleme-mode sen Meydana tamponu içinde yapmak değişiklikleri yansıtan orijinal tampon ile, düzenleme onları.

Bu, örneğin, çok imleçler-mod ile birlikte harika bir şekilde çalışıyor : Orijinal tamponda ne kadar uzakta olduklarına bakılmaksızın, Oluşum arabelleğinde görünmeyi seçtiğiniz çizgiler, bitişik olarak görüntülendiklerinden hepsini işaretleyebilirsiniz. Bir altküme ve ardından mc/edit-lineshepsini bir kerede etkinleştirin ve düzenleyin. (Evet, çoklu göstericilerin bunu kendi başlarına yapabileceğini biliyorum mc/mark-all-like-this, ancak seçeneklerin olması güzel.)

Yalnızca üzerinde çalışmak istediğiniz satırları, örneğin karmaşık bir regex araması yapma ve değiştirme veya sırayla bir tamponun her satırında çalıştırılması gereken bir makro görüyorsanız, daha kolay yapılacak başka bir düzenleme işlemi, bu şekilde de yapılabilir.


3

Bu, genel sorunuza cevap verir, ancak özellikle bahsettiğiniz kullanım durumuna (kodun etrafını dolaşmak gibi) değil.

Emacs şu anda sorduğun seçim türü olan bitişik olmayan bir bölge olarak adlandırıyor . Vanilya Emacs, dikdörtgen olması dışında bitişik olmayan bir bölge oluşturmak için özel bir yol sağlamaz . Ancak kütüphane bölgeleri yapar.

Kütüphane Alanları , arabellekte birden çok bölge tanımlamanıza izin verir . Bir bölgelerin listesi bitişik olmayan bir bölgedir . Onu nasıl kullanmak istediğinize bağlı olarak, birden fazla bölge olarak da düşünebilirsiniz . İstediğiniz zaman tanımlanmış, her biri farklı bir bölge değişkenine atanmış birden fazla bölge listesine sahip olabilir ve bunlar arasında geçiş yapabilirsiniz.

Ayrıca Bookmark + kütüphanesini kullanırsanız , bölgelerin listelerini kalıcı olarak kaydedebilir ve Emacs oturumlarında daha sonra geri yükleyebilirsiniz. Yer imi + ayrıca bir yer imine rasgele etiketler atamanıza izin verir. Bu, bölgelerin listesini etiketleyebileceğiniz anlamına gelir.

Belirli bir bölge listesindeki bölgeler genellikle aynı arabellektedir, ancak olmaları gerekmez. Bu, bir bölge listesi bitişik olmayan bir bölgeden daha geneldir. Ayrıca, her bölgenin sadece bölge sınırlarının yanı sıra ek bilgiler içerebilmesi ve bir tanımlayıcısına sahip olması daha geneldir.

Bir bölge oluşturmanın birkaç yolu vardır. En kolaylarından biri kullanımıdır C-x n a: aktif bölgeden bir bölge tanımlar ve onu geçerli bölge kümesine ekler. ( C-x n n( narrow-to-region) daralmanın yanı sıra bunu da yapar.)

Bunlar bir bölge kümesinde (listesinde) yapabileceğiniz şeylerden bazıları:

  • Onları sırala.
  • Bitişik veya çakışan bölgeleri (birleştirme) birleştirmek (birleştirmek).
  • Onlarla kesiş.
  • Tamponu listedeki bir bölgeye daraltın. Daralmalar arasında döngü. Bkz. Birden Fazla Daralma .
  • Listeden aktif bölge olarak bir bölge seçin. Bölgeler arasında geçiş yapın.
  • Onları arayın (önce otomatik olarak birleştirilirler). Bunun için Kütüphane Isearch + 'a ihtiyacınız var .
  • Onları sorgula değiştir.
  • Onları vurgulayın ve vurgulayın. (Bunun için kütüphaneye Highlight veya kütüphaneye ihtiyacınız var facemenu+.el.

Ayrıca , belirli bir tamponun klonları olan ve farklı bölümlerine daralmış olan dolaylı tamponlar oluşturmanıza izin veren Narrow Indirect'e de bakın .


2

Başka bir seçenek: Paragrafların çevrilmesi

Bütünlük uğruna, işaretli bölgelerle (sırayla) paragrafları yeniden sıralamayı başarabilirsiniz ve M-0 M-x transpose-paragraph(sıfır argüman, tra-parnokta ve işaretin bulunduğu paragrafları değiştirir, yani bölge başlar ve biter)!

Bu arada, bu tüm transpose-.*komutlar için çalışır (-words, -sexp, -sentences, ...) ve birçok durumda son derece kullanışlıdır.


2

İtiraz edilen paketi kullanmak başka bir yol (yazarım). Herhangi bir metin nesnesini m, nokta geçerli türdeki bir sonraki nesneye otomatik olarak taşınırken işaretleyebilirsiniz. Herhangi bir nesnenin üzerine giderek işaretini kaldırın ve tekrar m tuşuna basın. İşte bir örnek screencast (işaretleme çizgilerini gösterir, ancak paragraflar, eksikler ... gibi diğer nesneler için de çalışır):

görüntü tanımını buraya girin


Bu paketi Melpa'dan yüklemeye çalıştığımda hata alıyorum package-install-from-archive: http://melpa.milkbox.net/packages/objed-20181201.1346.tar: Not found.
Ad

@ İsim Bu paket listesini güncellemeniz gerekiyor gibi geliyor. Dene M-x package-refresh-contentsve sonra M-x package-install.
clemera

@ İsim şimdi çalışıyor mu? Başka sorularınız varsa bana bildirin.
clemera,

Paketi yükleyebildim. İyi çalışıyor gibi görünüyor, tüm özelliklerini test etmedim. Teşekkür ederim.
Adı
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.