Bir arabellekte iki konum arasında nasıl ileri geri geçiş yapılır


38

Bazen kendimi sık sık düzenlemekte olduğum iki işlev arasında birbiriyle bağlantılı olarak değiştiriyorum. Bu gibi durumlarda, C-s <functionname>diğer işleve geçmek için a yapmaya devam etmek ve daha önce düzenlemekte olduğum yeri bulmak çok sıkıcı ve acı vericidir .

İşaretleyicileri nasıl ayarlarım ve sonra kolaylıkla arabellekte iki konum arasında ileri ve geri atlama yapabilir miyim?


3
Yanlış yapıyorsun. Dikey bölünmüş görünüme sahip olmalısınız, böylece her iki işlevi de aynı anda görebilirsiniz.
CaptainCodeman

8
OP’nin “yanlış yapmak” olduğunu kabul etmiyorum. Bölünmüş bir pencere faydalı olurken, OP'nin her iki işlevi de düzenlerken pencereler arasında ileri ve geri atlaması gerekecek. Bunun yanı sıra, soru belirli kullanım durumundan daha geneldir: OP hızlı bir şekilde tampondaki farklı konumlara atlamak istiyor. Aşağıdaki cevapların çoğu, bunu yapmanın bir çok yararlı yolunu göstermektedir.
Dan

@Dan Bu havalı bir adam ve seninle aynı fikirdeyim, ama cevabım problemini çözme amaçlı değil - sadece alternatif bir yol olduğunu belirtmek.
CaptainCodeman

4
@ CaptainCodeman, sorun değil, ancak T. Vernon'un aşağıdaki cevabı bölünmüş pencere alternatifi sağlıyor. Lütfen yorumumu yazılarda proaktif dil için daha genel bir istek olarak kabul edin.
Dan

1
@ CaptainCodeman Kesinlikle haklısın. Emacs'ın dikey bölünmüş bir görünümü desteklediğini bilmiyordum. Bu nedenle, bu dikey bölünmüş görünümlerin kullanımını ayrıntılandıran cevabı kabul ettim.
Vedaad Shakib

Yanıtlar:


20

Emacs pencereleri

C-x 2o anki pencerenin altına aynı pencereye (= çerçeveyi böl) açıp aynı arabelleğe açılacaktır. Diğerini etkilemeden herhangi bir penceredeki noktayı taşıyabilirsiniz.

Bir pencereden diğerine kullanarak hareket edebilirsiniz C-x o. Dahili windmove kütüphanesi, pencereler arasında gezinmeyi kolaylaştıran bazı fonksiyonlar sunar.

Bu yöntem size uygunsa, dolaylı tamponlara da bakmak isteyebilirsiniz .

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


Belki de dolaylı tamponları kullanmakla ilgili birkaç satır daha eklemelisiniz: gerçekten başka bir pencere kullanmaktan daha kullanışlıdır (ve sadece biraz daha karmaşıktır).
ffevotte

@Francesco Şu an ne demek istediğinizi anlıyorum (dolaylı tamponlar hakkındaki diğer yanıtla), bu gerçekten de kullanımı çok kolay bir seçenek. Aklımdaki kullanım bu değildi: dolaylı tamponları kullanmam farklı bir pencere kullanarak yerine geçmiyor, fakat örneğin daraltma ile görünümü değiştirmeye izin veriyor. Zamanı bulduğumda cevaba birkaç kelime ekleyeceğim.
T. Verron

56

Defterler:

C-xrSPCçalışır point-to-register
C-xrjçalışırjump-to-register

İstendiğinde bir kayıt belirtmek için herhangi bir karakter yazın. 1

Yer imleri:

C-xrmçalışır bookmark-set
C-xrbçalışırbookmark-jump

İşaret yüzüğü:

C-SPCC-SPCgeçerli konumu işaret halkasına doğru iter (aktif bırakmadan).
C-uC-SPCişaretleme halkasını çıkar, önceki konumuna atlayarak. Ringin tamamında gezinmek için bunu tekrar tekrar kullanabilirsiniz.

Bazı komutların (özellikle sizi orijinal konumunuzdan bilinmeyen veya keyfi bir mesafeye götürmekle yükümlü olanların), otomatik olarak işaret halkasına iteceğini, böylece C-uC-SPCdaha sonra geri dönmek için kullanabileceğinizi unutmayın . Bu, bir yere gitmek için isearchkullandıktan sonra C-stekrar kolayca geri atlayabildiğinizi de içerir.

Değişim noktası ve işareti:

Ve Tu Do, yorum olarak C-xC-xçalışır exchange-point-and-markiki konum arasındaki atlama için çok yararlıdır. Ayrıca işareti / bölgeyi etkinleştirir, ancak C-SPCvurguyu silmek için kullanabilirsiniz .


1 Eğer elisp içinde kayıt işlevselliği ediyoruz alma avantajı, kullanırsanız olmayan bazı çelişkili, yerine bir char, adı için sembol böylece yapabilirsiniz elbette, sen sürece etkileşimli belirlenmiş kayıtları (değil çatışma istiyor yapmak ) o.


2
Siz de eklemelisiniz C-x C-xçünkü iki pozisyon arasında ileri geri atlayabiliyor. C-u C-SPCişaret halkasını çıkar ve tekrar yürütme noktası başka bir yere taşınır.
Tu

18

Phils'in cevabına ek olarak, daha fazla seçenek var:

  • helm-all-mark-rings : Hem yerel hem de küresel işaret halkalarının içeriğini dostça bir arayüzde görüntülemenizi sağlar, böylece bulunduğunuz yere geri dönebilirsiniz. İle işaretine basabilirsiniz C-SPC C-SPC. Demo:

dümen-all-mark-halkaları

  • helm-semantic-or-imenu : Geçerli dosyadaki tüm tanımları listele. İmleç bir tanımın içindeyse, vurgulayıcıyı etkinleştirirken bu tanımı önceden seçer.

  • sr-speedbar : Tanımlarını her dosyada listeleyen bir dosya tarayıcısı. IDE'deki anahat ağacına benzer.


9

Kayıtlara ve belirteçler (hem ilgili Phil'ler cevabı ve benim diğer, @ bkz yanında Icicles belirteçler hakkında cevap), imleri , özellikle ya autonamed veya geçici imleri, bunun için yararlı olabilir. Bu özel yer imi türleri için kitaplık Bookmark + 'ya ihtiyacınız vardır.

  • Otomatik olarak adlandırılmış bir yer imi , adlandırmanız gerekmeyen addır. Oluşturmak ve silmek kolaydır: sadece bir tuşa basın. Aynı anahtar noktada bir yer imi oluşturur veya siler. (Varsayılan olarak, buna bağlı C-x p RET, ancak elbette herhangi bir tuş kullanabilirsiniz.)

  • Autonamed yer imleri, genel olarak yer imleri gibi kalıcıdır. Ancak isteğe bağlı olarak otomatik olarak silinmelerini sağlayabilirsiniz.

  • Ayrıca geçici yer imleri oluşturabilir veya mevcut yer imlerini geçici olarak yapabilirsiniz. Örneğin, otomatik olarak adlandırılmış yer imlerinin otomatik olarak geçici olmasını seçebilirsiniz.

  • Hızlı bir şekilde can döngüsü imleri kümesi verilen arasındadır. Örneğin, otomatik adlandırılmış yer imleri arasında geçiş yapmak için komutları kullanın bmkp-next-autonamed-bookmark-repeatve bmkp-previous-autonamed-bookmark-repeat(bunları tuşlara bağlama).

  • Sen edebilirsiniz imi konumlarını vurgulamak onları noktaya kolay yüzden, farklı şekillerde.


7

Kabul edilen cevapta belirtilen dolaylı tamponlarla ilgili olarak ...

M-x clone-indirect-buffergeçerli tampon için dolaylı bir tampon yaratacaktır. Yeni tamponun adı kendisine '<2>' eklenmiş olacak (veya eğer daha önce yinelenen tampon isimleri varsa daha büyük bir numara). Yeni tampon yeni bir pencerede açılır. Sen kullanarak tek pencereye geri dönebilirsiniz C-x 0ya C-x 1.

İle M-x winner-modesize kolayca iki konum arasında geçiş yapabilirsiniz. C-c <left>/ M-x winner-undove C-c <right>/ M-x winner-redo, pencere yapılandırmaları arasında geçiş yapar. Bu durumda, konfigürasyonlar bir dosyayı görüntüleyen iki tamponda konumlanacaktır.

Not: winner-undove winner-redoişlevleri bir yapılandırma listesi üzerinde çalışır. Konfigürasyon değiştirilirse, örneğin hareket noktası, o zaman mevcut konfigürasyon listenin başı olur ve winner-redogeçersizdir, bu durumda winner-undoönceki pozisyonu geri getirecektir.

OP'nin durumu için bu, aşağıdaki sürece yol açar;

  1. Kazanan modunu aç M-x winner-mode
  2. Dosyayı ziyaret edin (dosya adı: Dosya1.txt, arabellek adı: Dosya1.txt)
  3. M-x clone-indirect-buffer (yeni dolaylı arabellek adı: File1.txt <2>)
  4. Geçerli pencereyi tek pencere yap C-x 1
  5. İlk düzenleme yerini bulun, değişiklik yapın.
  6. Orijinal tampon ziyaret dosyasına geçin, C-x b(3. adımdan bu yana başka bir tampon belleğe geçiş olmadıkça varsayılan, orijinal tampon olacaktır). Bu, kazananın geri dönmesi için yeni bir yapılandırma oluşturur.
  7. Alternatif düzenleme konumunu bulun, değişiklik yapın.

Önceki düzenleme konumuna geçiş (pencere yapılandırması), pencere yapılandırmasında anahtarlar arasında değişiklik yapılıp yapılmamasına bağlıdır;

  • Bir değişiklik yapılırsa C-c <left>/ tuşunu kullanın M-x winner-undo.
  • Herhangi bir değişiklik kullanılarak anahtarı yapılırsa C-c <left>/ M-x winner-undosırt için ve C-c <right>/ M-x winner-redoileri için.

Bir değişiklik başka dışında bir winner-undoya winner-redo.


3

kullanırsanız evil-mode, vim katmanı, o zaman C-ove C-iaynı şekilde çalışacaktır.

Onlar komutları çalıştırın evil-jump-backward/ forward. C-ootomatik olarak ayarlanan atlama listesindeki eski konumuna atlar (işaretler hareket komutlarında ayarlanır). C-itersine gider. TABBir C-oyerine sonra da kullanabilirsiniz C-i. Bu yüzden her iki işlevi de kullanmak, mevcut tamponunuzda ileri ve geri götürür.

Bu özelliğin çapraz arabellek olmasını istiyorsanız, göz atın evil-jumpers: http://melpa.org/#/evil-jumper

«
Kötü atlamacı, atlama listesinin uygulanmasının yerini Vim'in davranışlarıyla daha yakından taklit edecek şekilde değiştiren bir kötü modu için bir eklentidir. Spesifik olarak, tampon sınırları boyunca atlayacaktır ve gerekirse ölü tamponları canlandıracaktır. Atlama listesi, bir dosyaya kalıcı olarak devam ettirilebilir ve oturumlar arasında geri yüklenebilir. »

Not: Bu wikide öğrendim


Bu soruya bir cevap vermiyor. Bir yazarın açıklamasını eleştirmek veya talep etmek için yazının altına bir yorum bırakın.
Dan

1
Demek ki, ve o otomatik yorumla, aslında cevabın başka bir cevap üzerine yorum olması için tasarlandığı anlamına geliyor . Bunun kendi başına bir cevap olmasını amaçlıyorsanız, neyi C-ove ne C-iyapacağını biraz genişletebilir misiniz ?
Dan

Haklısın ! yapılır.
Ehvince,

2

Buz sarkıtları kullanırsanız , hızlı bir şekilde mark-ringher bir tampondaki işaretleyiciler arasında veya (her bir tamponda global-mark-ringtek bir işaretleyici olan) gezinebilirsiniz .

Bunu çoklu komut C-- C-SPC (tamponlar için mark-ring) veya C-- C-x C-SPC(için ) kullanarak yaparsınız global-mark-ring. Tuşa bir kez vurulduktan sonra, halka işaretçileri arasında hareket etmek için normal Buz sarkıtları bisiklet tuşlarını vb. Kullanırsınız .

(Önek argümanı olmayan aynı tuşlar, ( set-mark-command) işaretini ayarlar ve aynı pop-global-markvanilya Emacs'taki gibi, genel işaretini ( ) açar.)

Her bir işaretçinin satırının metni bir tamamlama adayı olarak kullanılır. Siz yazarken mini tampon girişiniz, adayları eşleşenlere daraltır (örneğin, alt dize veya regexp eşleştirme). Eşleşen işaretleyiciler arasında hızla dolaşabilir veya doğrudan bunlardan herhangi birini ziyaret edebilirsiniz. C-,Bisiklete binme sıralama düzenini ( ) bile değiştirebilirsiniz .


2

Minimal ancak çoğu zaman yararlı bir olasılık - sadece diğer işlevi görmek istediğinizde -

(setq scroll-preserve-screen-position t)

Bu, C-vve arasında geçiş yaparken sizi tam başlangıç ​​imleci konumuna geri getirir M-v.


1

evil-modeVim tarzı işaretleyicileri uygular . İşaretleyicileri ( m, yani evil-set-marker) ile ayarlayabilir ve backtick `( evil-goto-mark) ile işarete veya işaretin çizgisine '( evil-goto-mark-line) geçebilirsiniz .

Bu nedenle, ilk konumda ma"a" işaretini, ikinci konumda "b" işaretini mave ardından 'a"a" 'bişaretine atlamak ve "b" işaretine atlamak için işaret oluşturabilirsiniz.


1

imenu ve altında kod kullanın

(defvar rimenu-position-pair nil "positions before and after imenu jump")
(add-hook 'imenu-after-jump-hook
          (lambda ()
            (let ((start-point (marker-position (car mark-ring)))
                  (end-point (point)))
              (setq rimenu-position-pair (list start-point end-point)))))

(defun rimenu-jump ()
  "jump to the closest before/after position of latest imenu jump"
  (interactive)
  (when rimenu-position-pair
    (let ((p1 (car rimenu-position-pair))
          (p2 (cadr rimenu-position-pair)))

      ;; jump to the far way point of the rimenu-position-pair
      (if (< (abs (- (point) p1))
             (abs (- (point) p2)))
          (goto-char p2)
          (goto-char p1))
      )))

1

Son 20 senedir bu iki taşı kullanıyorum:

(defun ska-point-to-register ()
  "Store cursorposition _fast_ in a register. Use ska-jump-to-register
to jump back to the stored position."
  (interactive)
  (point-to-register 8))

(defun ska-jump-to-register ()
  "Switches between current cursorposition and position
that was stored with ska-point-to-register."
  (interactive)
  (let ((tmp (point-marker)))
    (jump-to-register 8)
    (set-register 8 tmp)))

Onları C'ye bağlarım. ve C- sırasıyla ve artık farkında olmadan bunları sürekli olarak kullanın.

Evet, kayıt defterleri ve işaretleyiciler ve diğerleri çok daha esnek ve güçlüdür, ancak yine de bu, diğer editörlere geçmemi imkansız kılan küçük, hızlı yardımcılardan biridir.


1
Vay, bunu yaşadığımdan daha uzun süredir kullanıyorsun.
Vedaad Shakib

Sanırım bu henüz Node veya Visual Studio Code dünyasında olmayacak, ama kim bilir ... :-) Genç ve akıllı insanların hala Emacs'ı aldıklarını görmekten memnun oldum. Ve, henüz 50 değilim ;-)
Stefan Kamphausen

Bu oldukça harika. Geçici-işaret modu etkinken iki keyfi konum arasında geçiş yapmanın bir yolunu bulmaya çalışıyorum ve bu sorunu gerçekten iyi çözüyor :) Teşekkürler.
PlagueHammer

0

Makrolardan da yararlanabilirsiniz, çünkü bunlar uygun tuşlara hızlı bir şekilde bağlanabilir.

Örneğin, N konumuna kullanarak bir atlama kaydedin <F3> M-g g N <F4>ve bunu F5 tuşuyla kullanın C-x C-k b <F5>. Sonra aynısını M ve F6 pozisyonları ile yapın. Şu andan itibaren, N ve M arasında geçiş yapmak için F5 ve F6'yı değiştirebilirsiniz.

Hatta daha basit, çünkü <F4>yürütür son makro kaydedildi ve <C-u> F4sonuncusu yanında, kullanmakta anahtar bağlama adımı ve sadece alternatif pozisyonları atlayabilirsiniz <F4>ve <C-u> F4.


Başka bir radikal olasılık, başka bir pencerede dolaylı bir tampon oluşturmaktır <C-x> 4 c. Bu tampon aynı içeriğe sahiptir ancak farklı bir nokta pozisyonuna sahip olabilir. Şimdi <C-x> oher zamanki gibi pencereler arasında geçiş yapın .

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.