次のように、私がlooooong文字列の真ん中にいるとき
(setq Emacs-beta "Which keyboard shortcut to use for navigating out of a string")
"
ショートカットで最初の(Emacs-betaの後の)直前にスキップできますか?
次のように、私がlooooong文字列の真ん中にいるとき
(setq Emacs-beta "Which keyboard shortcut to use for navigating out of a string")
"
ショートカットで最初の(Emacs-betaの後の)直前にスキップできますか?
回答:
C-M-u
コマンドを実行する必要がありますbackward-up-list
。
括弧の1レベル外に戻ります。 このコマンドは、現在の言語モードで定義されている他の括弧のような式でも機能します。
ESCAPE-STRINGSが(対話的に)非nilの場合、囲んでいる文字列からも移動します。
Emacs-24.5 -Q
文字列を使っていますが、CMuを使っています:up-list: Scan error: "Unbalanced parentheses"
?
これは実際には非常に興味深いEmacs Lispプログラミングの質問です。カーソルの下の文字が文字列の一部ではないことがわかるまで、forward-charまたはback-charを保持できます。
フォントフェイスを使用して、文字が文字列内にあるかどうかを判断できます。これはflyspellから学んだ素晴らしいトリックです。理論的には完璧ではありませんが、実際にはEmacs23、Emacs24、Emacs25のほとんどすべてのプログラミング言語の主要モードで動作します。
完全なコードは次のとおりです。
(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)))
使用法:
(goto-edge-by-comparing-font-face 1)
右端に(goto-edge-by-comparing-font-face -1)
行く、左端に行くbackward-up-list
はに基づく汎用コマンドとして設計されているため、ユーザーの観点からはあまり信頼できませんscan-sexps
。たとえばif (true) { return 'hello world'; }
、js2-modeのコードの場合、フォーカス{
は最初の単一引用符文字ではなく文字に移動します。printf("hello world")
c ++モードのコードの場合、機能しません。Emacs 24.5でテストしました
backward-char
またはforward-char
あなたは、エッジの側からカーソルを移動した場合。
)
ます。したがって、モードに応じて、コードの動作は異なります。
ここでは、バラエティのためだけにもう1つの方法(私はより多く使用する傾向があります)を示します。ソリューションは文字列に固有ではありませんが、この使用例でも機能します。
iy-go-to-char
(Melpaでも利用可能)。iy-go-to-char-backward
とiy-go-to-char
お好みのバインディングへ。この説明のために、とにバインドiy-go-to-char-backward
しているC-c C-,
とiy-go-to-char
しましょうC-c C-.
。文字列の中にいる場合は、を呼び出しiy-go-to-char-backward
て入力し"
ます。
それは次のようになりますC-c C-, "
。(デフォルト)にiy-go-to-char-continue-when-repeating
設定している場合t
、"
もう一度押す"
と、その前のcharオカレンスに移動します。
文字列の内側にいて、文字列の最後に移動したい場合は、を呼び出しiy-go-to-char
て入力し"
ます。
それは次のようになりますC-c C-. "
。(デフォルト)にiy-go-to-char-continue-when-repeating
設定した場合t
、"
もう一度押すと次の"
文字の発生に移動します。
C-r " C-b
。