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?
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?
Risposte:
Volete C-M-u
quale 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.
Emacs-24.5 -Q
in una stringa, ma sto ottenendo con CMU: up-list: Scan error: "Unbalanced parentheses"
?
È 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-beta
stampa 2m.
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 sinistrobackward-up-list
non è 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
backward-char
o forward-char
se sposti il cursore fuori dal bordo.
)
. Quindi, a seconda delle modalità, il tuo codice ha comportamenti diversi.
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.
iy-go-to-char
(disponibile anche su Melpa).iy-go-to-char-backward
e iy-go-to-char
ai tuoi attacchi preferiti. Per il bene di questa spiegazione, diciamo che si tenuti iy-go-to-char-backward
a C-c C-,
e iy-go-to-char
a C-c C-.
.Ora se ti trovi all'interno della stringa, chiameresti iy-go-to-char-backward
e digiterai "
.
Sembrerebbe C-c C-, "
. Se è stato iy-go-to-char-continue-when-repeating
impostato 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-char
e digiterai "
.
Sembrerebbe C-c C-. "
. Se è stato iy-go-to-char-continue-when-repeating
impostato su t
(impostazione predefinita), premere di "
nuovo per passare alla "
ricorrenza successiva del carattere.
C-r " C-b
.