Ketika saya di tengah-tengah string looooong, seperti berikut ini
(setq Emacs-beta "Which keyboard shortcut to use for navigating out of a string")
Bisakah saya melewatkannya, tepat sebelum yang pertama "
(setelah Emacs-beta) dengan pintasan?
Ketika saya di tengah-tengah string looooong, seperti berikut ini
(setq Emacs-beta "Which keyboard shortcut to use for navigating out of a string")
Bisakah saya melewatkannya, tepat sebelum yang pertama "
(setelah Emacs-beta) dengan pintasan?
Jawaban:
Anda ingin C-M-u
yang menjalankan perintah backward-up-list
.
Bergerak mundur dari satu tingkat tanda kurung. Perintah ini juga akan berfungsi pada ekspresi seperti tanda kurung lainnya yang ditentukan oleh mode bahasa saat ini.
Jika ESCAPE-STRING adalah non-nil (seperti itu secara interaktif), keluarlah dari ikatan juga.
Emacs-24.5 -Q
dalam sebuah string, tapi aku mendapatkan dengan CMu: up-list: Scan error: "Unbalanced parentheses"
?
Ini bisa dilakukan seperti ini:
(defun exit-string-backwards ()
(interactive)
(goto-char (nth 8 (syntax-ppss))))
Dalam mode lispy , menekan
[akan membawa Anda ke awal daftar yang berisi, keluar dari string apa pun. Setelah Anda berada di awal daftar, Anda dapat menjangkau bagian lain dengan mudah, misalnya, untuk sampai ke akhir Emacs-beta
pers 2m.
Ini sebenarnya pertanyaan pemrograman Emacs Lisp yang sangat menarik. Kita dapat tetap maju-char atau mundur-char sampai kita menemukan karakter di bawah kursor bukan bagian dari string.
Anda dapat menggunakan wajah font untuk memutuskan apakah karakter di dalam string. Ini adalah trik hebat yang saya pelajari dari flyspell. Secara teori itu tidak sempurna, tetapi di dunia nyata itu bekerja dengan hampir semua mode utama bahasa pemrograman pada Emacs23, Emacs24, Emacs25 .
Ini kode lengkapnya:
(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)))
Pemakaian:
(goto-edge-by-comparing-font-face 1)
pergi ke tepi kanan, (goto-edge-by-comparing-font-face -1)
ke tepi kiribackward-up-list
tidak terlalu dapat diandalkan dari sudut pandang pengguna karena dirancang sebagai perintah generik berdasarkan scan-sexps
. Misalnya, untuk kode if (true) { return 'hello world'; }
dalam mode js2, itu akan memindahkan fokus ke {
karakter daripada karakter kutipan tunggal pertama. Untuk kode printf("hello world")
dalam mode c ++ -, itu tidak akan berfungsi. Saya diuji dengan Emacs 24.5
backward-char
atau forward-char
jika Anda memindahkan kursor keluar dari tepi.
)
. Jadi tergantung pada mode, kode Anda memiliki perilaku yang berbeda.
Inilah satu lagi cara (yang cenderung saya gunakan lebih banyak) hanya untuk variasi. Solusinya tidak spesifik untuk string tetapi juga berfungsi untuk kasus penggunaan ini.
iy-go-to-char
(juga tersedia di Melpa).iy-go-to-char-backward
dan iy-go-to-char
bindings pilihan Anda. Demi penjelasan ini, katakanlah Anda terikat iy-go-to-char-backward
untuk C-c C-,
dan iy-go-to-char
untuk C-c C-.
.Sekarang jika Anda berada di dalam string, Anda akan memanggil iy-go-to-char-backward
dan mengetik "
.
Itu akan terlihat seperti C-c C-, "
. Jika Anda telah iy-go-to-char-continue-when-repeating
mengatur ke t
(default), menekan "
sekali lagi akan membawa Anda ke "
kejadian char sebelum itu, dan seterusnya.
Jika Anda berada di dalam string, dan jika sekarang Anda ingin pergi ke akhir string, Anda akan memanggil iy-go-to-char
dan mengetik "
.
Itu akan terlihat seperti C-c C-. "
. Jika Anda telah iy-go-to-char-continue-when-repeating
menetapkan ke t
(default), menekan "
sekali lagi akan membawa Anda ke "
karakter berikutnya .
C-r " C-b
.