文字列から移動するために使用するキーボードショートカット


9

次のように、私がlooooong文字列の真ん中にいるとき

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

"ショートカットで最初の(Emacs-betaの後の)直前にスキップできますか?


実際には答えではありませんC-r " C-b
名前

回答:


12

Emacs 25以降

C-M-uコマンドを実行する必要がありますbackward-up-list

括弧の1レベル外に戻ります。 このコマンドは、現在の言語モードで定義されている他の括弧のような式でも機能します。

ESCAPE-STRINGSが(対話的に)非nilの場合、囲んでいる文字列からも移動します。


あなたはそれが25だけであることを言及する必要があります。
abo-abo 2015

@ abo-aboそうではありません。私は24.5.1でテストしました。それが追加されたとき、私はわからないんだけど、誰かが見つけることができれば、私はそれを編集します。
乳母

@ abo-aboおっと、ごめんなさい、あなたは正しいです。
ナニー

私はEmacs-24.5 -Q文字列を使っていますが、CMuを使っています:up-list: Scan error: "Unbalanced parentheses"
Dieter.Wilhelm 2015

1
@ Dieter.Wilhelm右:私のコメントと編集からわかるように、私は間違っていました。Emacs 25以降でのみ動作します。
ナニー

3

次のように実行できます。

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

Lispyのモード、押しは [任意の文字列を終了し、含むリストの先頭にあなたをもたらすでしょう。リストの先頭になったら、他の部分に簡単にアクセスできます。たとえば、Emacs-betaプレスの最後に移動でき2mます。


1

これは実際には非常に興味深い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でテストしました


これは右端に行き、OPは左端の前の点に尋ねました。LISPモードがアクティブになっていない場合はどうなりますか?
名前

(後藤・エッジ・バイ・比較-フォントフェイス-1)左端に移動、backward-charまたはforward-charあなたは、エッジの側からカーソルを移動した場合。
チェンビン2015

OK、いい考えですが、テキストモードがアクティブなときに実行すると、ポイントはの後になり)ます。したがって、モードに応じて、コードの動作は異なります。
名前

flyspellと同じアルゴリズムを使用します。それはサポートしてすべての主要なモードがサポートフライスペル(flyspell)
陳ビン

0

ここでは、バラエティのためだけにもう1つの方法(私はより多く使用する傾向があります)を示します。ソリューションは文字列に固有ではありませんが、この使用例でも機能します。

  • インストールiy-go-to-char(Melpaでも利用可能)。
  • バインドiy-go-to-char-backwardiy-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"もう一度押すと次の"文字の発生に移動します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.