求个功能,标记当前光标下的变量(下划线和减号也一起被标记的) 现在有个mark-word的到下划线就停止了

求个功能,标记当前光标下的变量(下划线和减号也一起被标记的) 现在有个mark-word的到下划线就停止了

看了下源码,用的forward-word去标记的,完事这函数还是个c写的,,不知道怎么改一个我需要的出来。。

能举个例子嘛?

image

光标在这里,我想要的函数 能执行一次选中prog-mode-hook 目前看比较相似的功能是mark-word 但是只会往后选中 而且执行一次命令选中mode,第二次才选中hook


ps: 因为我js经常需要选中当前的函数名,然后C-s查找函数的定义位置跳过去,所以用的十分频繁

有一个插件叫:expand-region,可以根据光标的位置逐步拓展选中的区域。第一次选中 mode,第二次选中 prog-mode-hook

开启 superword-mode,再执行 mark-word 就能跨越连字符了。

er/mark-symbol 可以直接选中整个变量了

这个比较烦的是不能向前选中,只能往后追加

(defun mark-whole-word ()
  (interactive)
  (let (restore-p)
    (unwind-protect
        (progn
          (when (not superword-mode)
            (setq restore-p t))
          (superword-mode 1)
          ;; 如果手动开启 superword,保留 let 部分就可以了
          (let ((bounds (bounds-of-thing-at-point 'word)))
            (goto-char (car bounds))
            (set-mark (cdr bounds))))
      (when restore-p
        (superword-mode -1)))))

image image 感谢你的回复。 我尝试了你的函数,有几个问题

  • 这个选中后面选中到空格停了,前面选中到了 左括号 不符合预期,应该左边到aa右边到cc,也就是遇到.停止选中,(针对现在的这个变量aa_bb_cc来说)
  • 我直接执行这个函数时候报错symbol's value as variable is void: superword-mode 我需要M-x执行一次superword-mode(不报错)之后,再执行这个函数不报错(似乎是因为 when not的判断绕过去了)

顺便问一下,刚刚我的另一块代码 ,因为也有这样的错误symbol's function definition is void: yas-reload-all,请你帮忙看下

;; 这块代码是在init.el 中,启动emacs的时候报错的
(use-package yasnippet
  :ensure t
  :defer t
  :init
  (yas-reload-all)  ;;symbol's function definition is void: yas-reload-all
  (defun my-yasnippet-init()
    (push 'company-yasnippet company-backends)
    (yas-minor-mode-on))
  (add-hook 'prog-mode-hook 'my-yasnippet-init))

superword-mode yas-reload-all 这两个都是我写在代码里面报错了,但是M-x执行没问题,很疑惑

  • bounds-of-thing-at-point 我想不到有这样的函数,想问下有哪里 可以查看这些内置函数列表介绍(最好是中文,英文也可以)

顺便贴一下楼上插件的er/mark-symbol的代码

(defun er/mark-symbol ()
  "Mark the entire symbol around or in front of point."
  (interactive)
  (let ((symbol-regexp "\\s_\\|\\sw"))
    (when (or (looking-at symbol-regexp)
              (er/looking-back-on-line symbol-regexp))
      (skip-syntax-forward "_w")
      (set-mark (point))
      (skip-syntax-backward "_w"))))

的确 er/mark-symbol 更符合需求。

superword-modesubword-mode 在同一个文件里,用之前必须 (require 'subword),类似问题同样处理。我不太熟悉 use-package,似乎记得 :init 是在 requie 之前,所以不应该在其中执行 yas 函数,应该放到 :config 里边。

瞎了瞎了。翻出来书签里面一个网站 http://ergoemacs.org/emacs/elisp_examples.html ,教程里面就是这个例子。

;;Select Current Word
;;This code shows you how to set a mark (select text) programmatically.

;; turn on highlight selection
(transient-mark-mode 1)

(defun select-current-word ()
  "Select the word under cursor.
“word” here is considered any alphanumeric sequence with “_” or “-”."
  (interactive)
  (let (pt)
    (skip-chars-backward "-_A-Za-z0-9")
    (setq pt (point))
    (skip-chars-forward "-_A-Za-z0-9")
    (set-mark pt)))