2009-09-20 10 views
6

Son zamanlarda emaclara girmeye çalışıyorum ve doğru olması gereken şeylerden biri de girinti.Vim'in yumuşak toplarını Emacs'te nasıl taklit ederim?

Örnek 1:

sub foo { 
    my $bar = 'quux'; 
    | 

Örnek 2:

sub foo { 
    my $bar = 'quux';  |# foo 

Yukarıdaki örneklerde boru karakter imleç pozisyonunu gösterir düşünün. Şimdi, her girinti seviyesi için (4) boşluk kullanıyorum (sekme yok) ve kodumu otomatik olarak akılda tutmak için emacs kurulumunu kullanıyorum. Orada sorun yok. Ancak, yukarıdaki örneklerde, belirtilen imleç pozisyonlarında geri adım atmak zorunda kalırsam, bir sonraki girinti seviyesine kadar geri dönüş yapmak için emacs istiyorum (sütun/4). Yani, önceki boşlukları sekmelerden yapılmış gibi ele almasını istiyorum. Bunun yerine, her zaman sadece bir boşluk karakterini siler.

Vim'de, sekmeler yerine boşluk eklenmesi için 'expandtab' özelliğini ve 'softtabstop' özelliğini açarak, (diğer şeylerin yanı sıra) yukarıda açıklandığı gibi bir sonraki "yumuşak tabstop" a dönüştürür.

Ne bilmek istiyorum
if indent-tabs-mode is nil 
    if the cursor position is preceded by whitespace 
     calculate the position of the previous "soft tabstop" 
     if there's enough whitespace 
      backspace all the way to that point 
     else 
      backspace by one character 

, orada bir daha basittir: böyle bir şey yapar bir işleve bağlama backspace (I emacs/elisp daha iyi bilse) Emacs'te

, şu yapabilirdim herhalde Bunu yapmanın yolu, ve/veya mevcut bir çözümü bilen var mı?

+0

Bu Perl yazıyoruz gibi görünüyor ve cperl-mod (Emacs için en iyi Perl modu) zaten cperl 'için geriye doğru silme bağlar gerçeğiyle karmaşıklaşır -elektro-backspace'. (Her ne kadar bu fonksiyon kritik bir şey yapmasa da, sağladıkları davranışlar olmadan bunu başarabilirsiniz.) – cjm

+0

Bir küçük güncelleme: Bir şey yanlış. Vim bir sonraki yumuşak sekme durağına geri dönemezse, mümkün olduğunca fazla boşluk (örneğin 1 ila 3) siler, sadece 1 değil. – Hinrik

+0

Çözümü olabildiğince fazla boşluk bırakmak üzere güncellendi (sekme durağına kadar) –

cevap

7

Bu, benim için 'tab-width'un sütunların genişliği olarak kullanıldığı yerlerde çalışır. Uygun keymaps anahtarı ... Set

(local-set-key (kbd "DEL") 'backward-delete-whitespace-to-column) 
(defun backward-delete-whitespace-to-column() 
    "delete back to the previous column of whitespace, or as much whitespace as possible, 
or just one char if that's not possible" 
    (interactive) 
    (if indent-tabs-mode 
     (call-interactively 'backward-delete-char-untabify) 
    (let ((movement (% (current-column) tab-width)) 
      (p (point))) 
     (when (= movement 0) (setq movement tab-width)) 
     (save-match-data 
     (if (string-match "\\w*\\(\\s-+\\)$" (buffer-substring-no-properties (- p movement) p)) 
      (backward-delete-char-untabify (- (match-end 1) (match-beginning 1))) 
     (call-interactively 'backward-delete-char-untabify)))))) 
+0

Bkz .: https://www.emacswiki.org/emacs/BackspaceWhitespaceToTabStop (bir * geliştirilmiş * sürümü vardır). – ideasman42

+0

Güzel, ama geriye doğru-sil-char-untabify'ı oldukça rahatsız edici buldu, bazı kullanıcılar bunu 'backward-delete-char' ile değiştirmek isteyebilir. – ideasman42