Quale scorciatoia da tastiera usare per navigare fuori da una stringa


9

Quando sono nel mezzo di una corda molto lunga, come la seguente

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

Posso saltarlo fuori, appena prima del primo "(dopo Emacs-beta) con una scorciatoia?


Non proprio una risposta C-r " C-b.
Nome

Risposte:


12

Emacs 25 o successivi

Volete C-M-uquale esegue il comando backward-up-list.

Sposta indietro di un livello tra parentesi. Questo comando funzionerà anche su altre espressioni simili a parentesi definite dalla modalità lingua corrente.

Se ESCAPE-STRINGS è diverso da zero (in quanto è interattivo), anche uscire dalle stringhe racchiuse.


Dovresti dire che sono solo 25.
abo-ABO

@ abo-abo Non è: l'ho appena provato in 24.5.1. Non sono sicuro di quando è stato aggiunto, ma se qualcuno può scoprirlo lo modificherò.
tata

@ abo-abo Oops, mi dispiace, hai ragione.
tata

Sono con Emacs-24.5 -Qin una stringa, ma sto ottenendo con CMU: up-list: Scan error: "Unbalanced parentheses"?
Dieter.Wilhelm,

1
@ Dieter.Wilhelm Giusto: come puoi vedere dal mio commento e modifica, mi sono sbagliato. Funzionerà solo in Emacs 25 o versioni successive.
tata

3

È fattibile in questo modo:

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

In modalità lispy , premendo [si passa all'inizio dell'elenco contenente, uscendo da qualsiasi stringa. Una volta che sei all'inizio dell'elenco, puoi raggiungere facilmente altre parti, ad esempio, per arrivare alla fine della Emacs-betastampa 2m.


1

Questa è in realtà una domanda di programmazione Emacs Lisp molto interessante. Possiamo mantenere forward-char o backward-char fino a quando non troviamo che il carattere sotto il cursore non fa parte della stringa.

È possibile utilizzare la faccia del carattere per decidere se il carattere si trova all'interno della stringa. Questo è un grande trucco che ho imparato da flyspell. In teoria non è perfetto, ma nel mondo reale funziona con quasi tutte le principali modalità del linguaggio di programmazione su Emacs23, Emacs24, Emacs25 .

Ecco il codice completo:

(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)))

Uso:

  • (goto-edge-by-comparing-font-face 1)vai al bordo destro, (goto-edge-by-comparing-font-face -1)vai al bordo sinistro
  • non dipende da nessuna specifica modalità principale, puoi usarla ovunque in qualsiasi lingua

backward-up-listnon è molto affidabile dal punto di vista dell'utente perché è progettato come un comando generico basato su scan-sexps. Ad esempio, per il codice if (true) { return 'hello world'; }in modalità js2, sposta lo stato attivo sul {carattere anziché sul primo carattere a virgoletta singola. Per il codice printf("hello world")in modalità c ++, non funzionerà. Ho provato con Emacs 24.5


Questo va al bordo destro, l'OP ha chiesto al punto prima del bordo sinistro. Cosa succede se la modalità lisp non è attivata?
Nome

(goto-edge-by-comparing-font-face -1) vai al bordo sinistro, backward-charo forward-charse sposti il ​​cursore fuori dal bordo.
chen bin,

Ok, bella idea, ma se lo esegui quando è attivata la modalità testo, i punti seguono ). Quindi, a seconda delle modalità, il tuo codice ha comportamenti diversi.
Nome

Utilizza lo stesso algoritmo di flyspell. Quindi supporta tutte le principali modalità flyspell support
chen bin

0

Ecco un altro modo (che tendo ad usare di più) solo per varietà. La soluzione non è specifica per le stringhe ma funziona anche per questo caso d'uso.

  • Installa iy-go-to-char(disponibile anche su Melpa).
  • Associa iy-go-to-char-backwarde iy-go-to-charai tuoi attacchi preferiti. Per il bene di questa spiegazione, diciamo che si tenuti iy-go-to-char-backwarda C-c C-,e iy-go-to-chara C-c C-..
  • Ora se ti trovi all'interno della stringa, chiameresti iy-go-to-char-backwarde digiterai ".

    Sembrerebbe C-c C-, ". Se è stato iy-go-to-char-continue-when-repeatingimpostato su t(impostazione predefinita), premendo di "nuovo si accederà a un "evento precedente e così via.

  • Se sei all'interno della stringa e se ora vuoi andare alla fine della stringa, chiameresti iy-go-to-chare digiterai ".

    Sembrerebbe C-c C-. ". Se è stato iy-go-to-char-continue-when-repeatingimpostato su t(impostazione predefinita), premere di "nuovo per passare alla "ricorrenza successiva del carattere.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.