Soru Emacs: işaretli bölge içinde 2 basamaktan oluşan her sayıya 1 ekleme


Emacs altında açılan bir metin dosyasında aşağıdakileri görüyorsun:

some    34
word    30
another 38
thing   59
to      39
say     10
here    47

ve buna girmek istiyorum, 2 rakamdan oluşan her sayıya 1 ekleyin:

some    35
word    31
another 39
thing   60
to      40
say     11
here    48

(Bu kısa bir örnek, benim asıl ihtiyacım çok daha büyük bir listede, benim aramam değil)

Bunu Emacs'ten nasıl yapabilirim?

Çağrı doğrudan Emacs'ten yapıldığı ve sadece istediğim işaretli bölgede çalıştığı sürece, bazı harici Perl / sed / ne olursa olsun sihir aramaktan çekinmem.

Bunu Emacs'den nasıl otomatikleştireceksin?

Düşündüğüm cevap aramayı içeriyor Kabuk-komut açma bölgesi ve bölgeyi çıktıya göre değiştirin ... Ama bunu nasıl somut olarak yapacağımdan emin değilim.


23
2018-04-21 21:12


Menşei


Bir yorum olarak, bunu nasıl yapacağım konusunda hassas olduğumu kesin Emacs veya bazı komut satırı sihrini çağırarak Emacs : IDE 'x' veya 'y' bunu yapabilir mi umrumda değil, bilmek istediğim bunu Emacs'ten nasıl yapacağını. - SyntaxT3rr0r
herkese lanet olsun, bugün tüm mod puanlarımı kullandım, hepsini alamıyorum :( Yarın tekrar kazanacağım: - / - SyntaxT3rr0r
Lütfen açıklayın: işlemek gerekiyor mu 00-08 (e dönüşmek 01-09? ya da 0 doldurma tamam mı?) ve 99 (olmalı 100 (üç basamak, böylece bir dahaki sefere atlanacaktı) 00)? - Chris Johnsen
@Chris Johnsen: anlatmayı unuttum: sayılar asla 70'den daha yükseğe çıkmazlar ya da öylesine 99 bir sorun olmaz: - / - SyntaxT3rr0r


Cevaplar:


Bu komut kullanılarak çözülebilir Sorgu-yerine-regexp (bağlı olmak SANTİMETRE-%):

SANTİMETRE-% \b[0-9][0-9]\b dönüş \,(1+ \#&)

İzleyen ifade \, Bunun yerine, sonuç dizisi olarak kullanılan bir Lisp ifadesi olarak değerlendirilebilir. Lisp ifadesinde, \#& bir sayı olarak yorumlanmış eşleşen dizeyle değiştirilir.

Varsayılan olarak, bu, imleçten başlayarak tüm belgede çalışır. Bölgede bu çalışmalara sahip olmak için çeşitli olasılıklar var:

  1. Eğer Geçici işareti modu açık, sadece bölgeyi normal olarak seçmeniz gerekiyor (nokta ve işaret kullanarak);
  2. Eğer bir sebepten hoşlanmıyorsan Geçici işareti modu, kullanabilirsin dar için bölge Değişiklikleri belirli bir bölgeyle sınırlamak için: nokta ve işaret kullanarak bir bölge seçin, C-x n n daraltmak Sorgu-yerine-regexp yukarıda açıklandığı gibi, ve sonunda C-x n genişletmek. (Bu ipucu için Justin Smith'e teşekkürler.)
  3. Bölgeyi seçmek için fareyi kullanın.

Bölümüne bakın Regexp Değiştirme Daha fazla bilgi için Emacs Kılavuzunun.


40
2018-04-21 21:32



çok güzel, şimdi ne yapacağını görmeliyim ... Seni modifiye edemem: artık oy yok (Ben de farklı yaptım, ama senin versiyonunu tercih ediyorum, kendi cevabımı görüyorum). - SyntaxT3rr0r
@WizardOfOdds: Benim için çalışıyor. :] Hangi Emacs sürümünü kullanıyorsunuz? Eko alan / minibuffer'da herhangi bir hata mesajı var mı? @Justin Smith: Az önce denedim, ve bir bölge aktif olduğu sürece (seçiliyor), o zaman imlecin sonunda olup olmadığı önemli değil. Ancak, hiçbir bölge seçilmediğinde, değiştirmelerin sadece imleç ile tamponun sonu arasında gerçekleşeceği konusunda haklısınız. - huaiyuan
huaiyuan bağlantısından cevabının alt kısmında yer aldı: "Yedek dizgenin parçalarını hesaplamak için Lisp ifadelerini kullanabilirsiniz. Bunu yapmak için, string \" yazın ve ardından yedek dizede ifade yazın. " Başka bir deyişle, herhangi bir geçerli lisp ifadesini bir regexp yerine koyabilirsiniz ve değeri ile değiştirilir. - Justin Smith
bölge sorusuyla ilgili olarak: Eğer bölgeyi fareyle özdeşleştirirsem doğru olanı yapar - tahminimce farenizle vurgulama arasındaki farkı bulmak ve sadece işareti kullanmak ve bölgeyi tanımlamak için işaret etmek gerekir. Cevap sadece bölgeyi önce fare ile seçmek zorunda. - Justin Smith
Sadece düşündüğüm başka bir seçenek: M-x dar bölgeden bölgeye dışarıdan her şeyi düzenleme için sınırları dışına çıkarır. M-x genişlemesi, daralmayı çözer - anahtarlıklar C-x n n ve C-x n w - Justin Smith


Emacs' sütun düzenleme modu ihtiyacın olan şey.

  • Yazmayı etkinleştir M-x cua modu.

  • Dikdörtgenin başına git (imleci karakterde bırak 3) ve bas Cı-RET.

  • Dikdörtgenin sonuna git (imleci karakterde bırak 7). Vurgulanan bölgede çalışacaksınız.

  • Şimdi basın Mi Bölgedeki tüm değerleri arttırır.

Sen bittin.! Ölü ImageShack bağlantılarını kaldır


11
2018-04-22 07:41



Vaov! cua modu bu tür görevler için çok güçlü görünüyor. - Ashutosh Mehra
Bu şekilde nasıl azalırsın? - nicolas
@nicolas Negatif bir önekle, ör. C-- M-i veya C-u -10 M-i. - jpkotta


99 -> 100'e karşı koruma sağlamaz.

(defun add-1-to-2-digits (b e)
  "add 1 to every 2 digit number in the region"
  (interactive "r")
  (goto-char b)
  (while (re-search-forward "\\b[0-9][0-9]\\b" e t)
    (replace-match (number-to-string (+ 1 (string-to-int (match-string 0)))))))

Oh, ve bölge üzerinde çalışıyor. Dosyanın tamamını istiyorsan, değiştirirsin b ve e ile (point-min) ve nil.


6
2018-04-21 21:26





Orta derecede test edildi; kullanım M-: ve aşağıdaki komutu verin:

(while (re-search-forward "\\<[0-9][0-9]\\>" nil t) (let ((x (match-string 0))) (delete-backward-char 2) (insert (format "%d" (1+ (string-to-int x))))))

0
2018-04-21 21:20





Aşağıdakileri kullanarak farklı bir şekilde çalışmayı başardım (benim awk-fu güçlü değil bu yüzden muhtemelen daha basit bir şekilde yapılabilir):

C-u M-x shell-command-on-region RET awk '$2>=0&&$2<=99 {$2++} {print}' RET

ama süreçteki girintimi kaybettim:)

Tüm bu cevapları görünce, yardım edemem ama Emacs için çok saygım var ...


0
2018-04-21 21:47