Bir dizeden çıkmak için kullanılacak klavye kısayolu


9

Bir looooong dizesinin ortasında olduğumda, aşağıdaki gibi

(setq Emacs-beta "Which keyboard shortcut to use for navigating out of a string")

"Bir kısayol ile ilkinden (Emacs-beta'dan sonra) hemen önce atlayabilir miyim ?


Gerçekten bir cevap değil C-r " C-b.
İsim

Yanıtlar:


12

Emacs 25 veya daha yenisi

C-M-uHangi komutu çalıştırdığınızı istiyorsunuz backward-up-list.

Bir parantez düzeyinden geriye doğru gidin. Bu komut, geçerli dil modu tarafından tanımlanan diğer parantez benzeri ifadelerde de çalışır.

ESCAPE-STRINGS sıfır değilse (etkileşimli olduğu gibi), kapalı dizelerden de çıkın.


Sadece 25 olduğunu söylemelisiniz.
abo-abo

@ abo-abo Değil: Sadece 24.5.1'de test ettim. Ne zaman eklendiğinden emin değilim, ancak birisi öğrenebilirse onu düzenleyeceğim.
dadı

@ abo-abo Hata! Özür dilerim, haklısın.
dadı

Birlikte olduğum Emacs-24.5 -Qbir dizede, ama CMU ile alıyorum: up-list: Scan error: "Unbalanced parentheses"?
Dieter.Wilhelm

1
@ Dieter.Wilhelm Doğru: Yorumuma ve düzenlememe göre gördüğünüz gibi yanılmışım. Sadece Emacs 25 veya daha yeni modellerde çalışır.
dadı

3

Böyle yapılabilir:

(defun exit-string-backwards ()
  (interactive)
  (goto-char (nth 8 (syntax-ppss))))

In lispy-mode , pres [herhangi bir dize çıkarken içeren listenin başlangıcına getirecektir. Listenin başlangıcına girdikten sonra, örneğin Emacs-betabasının sonuna ulaşmak için diğer parçalara kolayca ulaşabilirsiniz 2m.


1

Bu aslında çok ilginç bir Emacs Lisp programlama sorusu. İmlecin altındaki karakterin dizenin parçası olmadığını bulana kadar ileri veya geri karakterini tutabiliriz.

Karakterin dizenin içinde olup olmadığına karar vermek için yazı tipi yüzünü kullanabilirsiniz. Bu, sineklikten öğrendiğim harika bir numara. Teorik olarak mükemmel değildir, ancak gerçek dünyada Emacs23, Emacs24, Emacs25'teki hemen hemen her programlama dilinin ana modlarıyla çalışır .

İşte tam kod:

(defun font-face-is-similar (f1 f2)
  (let (rlt)
    ;; (message "f1=%s f2=%s" f1 f2)
    ;; in emacs-lisp-mode, the '^' from "^abde" has list of faces:
    ;;   (font-lock-negation-char-face font-lock-string-face)
    (if (listp f1) (setq f1 (nth 1 f1)))
    (if (listp f2) (setq f2 (nth 1 f2)))

    (if (eq f1 f2) (setq rlt t)
      ;; C++ comment has different font face for limit and content
      ;; f1 or f2 could be a function object because of rainbow mode
      (if (and (string-match "-comment-" (format "%s" f1)) (string-match "-comment-" (format "%s" f2)))
          (setq rlt t)))
    rlt))

(defun goto-edge-by-comparing-font-face (&optional step)
"Goto either the begin or end of string/comment/whatever.
If step is -1, go backward."
  (interactive "P")
  (let ((cf (get-text-property (point) 'face))
        (p (point))
        rlt
        found
        end)
    (unless step (setq step 1)) ;default value
    (setq end (if (> step 0) (point-max) (point-min)))
    (while (and (not found) (not (= end p)))
      (if (not (font-face-is-similar (get-text-property p 'face) cf))
          (setq found t)
        (setq p (+ p step))))
    (if found (setq rlt (- p step))
      (setq rlt p))
    ;; (message "rlt=%s found=%s" rlt found)
    (goto-char rlt)))

Kullanımı:

  • (goto-edge-by-comparing-font-face 1)sağ kenara (goto-edge-by-comparing-font-face -1)git, sol kenara git
  • belirli bir ana moda bağlı değildir, herhangi bir dilde herhangi bir yerde kullanabilirsiniz

backward-up-list, kullanıcının bakış açısından çok güvenilir değildir, çünkü genel bir komut olarak tasarlanmıştır scan-sexps. Örneğin, if (true) { return 'hello world'; }js2 modundaki kod için , odağı {ilk tek tırnak karakteri yerine karaktere taşır . printf("hello world")C ++ - modundaki kod için çalışmaz. Emacs 24.5 ile test ettim


Bu sağ kenara gider, OP sol kenardan önceki noktaya sordu. Lisp modu etkinleştirilmezse ne olur?
İsim

(kenardan-karşılaştırma-yazı tipi-yüz -1'e gidin) sol kenara gidin backward-charveya forward-charimleci kenarın dışına taşırsanız.
chen bin

Tamam, güzel fikir, ancak metin modu etkinleştirildiğinde çalıştırırsanız, puanlar artar ). Modlara bağlı olarak, kodunuzun farklı davranışları vardır.
İsim

Flyspell ile aynı algoritmayı kullanır. Bu yüzden tüm büyük modları flyspell desteği destekliyor
chen bin

0

İşte sadece çeşitlilik için bir yol daha (ki daha fazla kullanma eğilimindeyim). Çözüm dizelere özgü değildir, ancak bu kullanım durumunda da çalışır.

  • Yükle iy-go-to-char(Melpa'da da mevcuttur).
  • Bağlayın iy-go-to-char-backwardve iy-go-to-chartercih ettiğiniz bağlara bağlayın . Bu açıklama uğruna, diyelim ki bağlı diyelim iy-go-to-char-backwardetmek C-c C-,ve iy-go-to-charkarşı C-c C-..
  • Şimdi dizenin içindeyseniz, arayabilir iy-go-to-char-backwardve yazabilirsiniz ".

    Öyle görünüyor C-c C-, ". Eğer varsa iy-go-to-char-continue-when-repeatingayarlı t(varsayılan), pres "kez daha götürecektir "bundan önce Char meydana vb.

  • Dizenin içindeyseniz ve şimdi dizenin sonuna gitmek istiyorsanız, arar iy-go-to-charve yazarsınız ".

    Öyle görünüyor C-c C-. ". Eğer varsa iy-go-to-char-continue-when-repeatingayarlı t(varsayılan), pres "kez daha sonraki götürecektir "karakter oluşumu.

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.