Quando estou no meio de uma sequência looooong, como o seguinte
(setq Emacs-beta "Which keyboard shortcut to use for navigating out of a string")
Posso pular o arquivo antes do primeiro "
(após o Emacs-beta) com um atalho?
Quando estou no meio de uma sequência looooong, como o seguinte
(setq Emacs-beta "Which keyboard shortcut to use for navigating out of a string")
Posso pular o arquivo antes do primeiro "
(após o Emacs-beta) com um atalho?
Respostas:
Você quer C-M-u
qual executa o comando backward-up-list
.
Mover para trás fora de um nível de parênteses. Este comando também funcionará em outras expressões parênteses definidas pelo modo de idioma atual.
Se ESCAPE-STRINGS for nulo (como é interativamente), saia também das seqüências anexas.
Emacs-24.5 -Q
uma string, mas estou usando o CMu up-list: Scan error: "Unbalanced parentheses"
:?
É factível assim:
(defun exit-string-backwards ()
(interactive)
(goto-char (nth 8 (syntax-ppss))))
No modo lispy , pressionar pressiona
[levará você ao início da lista que contém, saindo de qualquer sequência. Quando estiver no início da lista, você poderá acessar outras partes facilmente, por exemplo, para chegar ao fim da Emacs-beta
impressão 2m.
Esta é realmente uma questão de programação muito interessante do Emacs Lisp. Podemos manter char para frente ou char para trás até encontrarmos o caractere sob o cursor não fazer parte da string.
Você pode usar a face da fonte para decidir se o caractere está dentro da string. Esse é um ótimo truque que aprendi com o flyspell. Em teoria, não é perfeito, mas no mundo real funciona com quase todos os principais modos de linguagem de programação no Emacs23, Emacs24, Emacs25 .
Aqui está o código 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)
vá para a borda direita, (goto-edge-by-comparing-font-face -1)
vá para a borda esquerdabackward-up-list
não é muito confiável do ponto de vista do usuário porque foi projetado como um comando genérico baseado em scan-sexps
. Por exemplo, para o código if (true) { return 'hello world'; }
no modo js2, ele moverá o foco para o {
caractere em vez do primeiro caractere de aspas simples. Para código printf("hello world")
no modo c ++, não funcionará. Eu testei com Emacs 24.5
backward-char
ou forward-char
se você mover o cursor para o lado da borda.
)
. Portanto, dependendo dos modos, seu código tem comportamentos diferentes.
Aqui está mais uma maneira (que eu costumo usar mais) apenas pela variedade. A solução não é específica para cadeias, mas também funciona para este caso de uso.
iy-go-to-char
(também disponível no Melpa).iy-go-to-char-backward
e iy-go-to-char
às ligações preferidas. Para fins de explicação, digamos que você esteja vinculado iy-go-to-char-backward
a C-c C-,
e iy-go-to-char
para C-c C-.
.Agora, se você estiver dentro da string, você chamaria iy-go-to-char-backward
e digitaria "
.
Seria assim C-c C-, "
. Se você iy-go-to-char-continue-when-repeating
definiu como t
(padrão), pressionar "
mais uma vez levará você a uma "
ocorrência de char antes disso e assim por diante.
Se você estiver dentro da string e agora quiser ir para o final da string, você chamaria iy-go-to-char
e digitaria "
.
Seria assim C-c C-. "
. Se você iy-go-to-char-continue-when-repeating
definiu como t
(padrão), pressionar "
mais uma vez o levará à próxima "
ocorrência de char.
C-r " C-b
.