【问题标题】:Alternative to forward-word / backward-word to include symbols -- e.g., ***替代前向词/后向词以包含符号 - 例如,***
【发布时间】:2013-09-11 13:58:53
【问题描述】:

我首选的指示文档中需要注意的位置的方法是使用三个星号***。当需要使用shift+right-wordshift+left-word 选择包含三个星号的区域时,这些函数会跳过三个星号并移动到下一个单词。当我窥视bindings.el 内部时,我发现left-wordright-wordforward-wordbackward-word 的改编版,可以追溯到C 源代码中的内置函数。本质上,我正在寻找包含三个星号*** 等符号的left-wordright-word

任何人都可以建议一种方法,使其具有将单词或符号向左跳转,并将单词或符号向右跳转的功能。该函数的行为需要类似于左字和右字,以便在多次按下箭头键时我可以选择多个单词——例如,left-word-or-symbolsright-word-or-symbols


以下是基于以下有用答案的自定义函数:

(defvar lawlist-movement-syntax-table
  (let ((st (make-syntax-table)))
    ;; ` default = punctuation
    ;; ' default = punctuation
    ;; , default = punctuation
    ;; ; default = punctuation
    (modify-syntax-entry ?{ "." st)  ;; { = punctuation
    (modify-syntax-entry ?} "." st)  ;; } = punctuation
    (modify-syntax-entry ?\" "." st) ;; " = punctuation
    (modify-syntax-entry ?\\ "_" st) ;; \ = symbol
    (modify-syntax-entry ?\$ "_" st) ;; $ = symbol
    (modify-syntax-entry ?\% "_" st) ;; % = symbol
    st)
  "Syntax table used while executing custom movement functions.")

(defun lawlist-forward-entity ()
"http://stackoverflow.com/q/18675201/2112489"
(interactive "^")
  (with-syntax-table lawlist-movement-syntax-table
    (cond
      ((eolp)
        (forward-char))
      ((and
          (save-excursion (< 0 (skip-chars-forward " \t")))
          (not (region-active-p)))
        (skip-chars-forward " \t"))
      ((and
          (save-excursion (< 0 (skip-chars-forward " \t")))
          (region-active-p))
        (skip-chars-forward " \t")
        (cond
          ((save-excursion (< 0 (skip-syntax-forward "w")))
            (skip-syntax-forward "w"))
          ((save-excursion (< 0 (skip-syntax-forward ".")))
            (skip-syntax-forward "."))
          ((save-excursion (< 0 (skip-syntax-forward "_()")))
            (skip-syntax-forward "_()"))))
      ((save-excursion (< 0 (skip-syntax-forward "w")))
        (skip-syntax-forward "w")
        (if (and
              (not (region-active-p))
              (save-excursion (< 0 (skip-chars-forward " \t"))))
          (skip-chars-forward " \t")))
      ((save-excursion (< 0 (skip-syntax-forward ".")))
        (skip-syntax-forward ".")
        (if (and
              (not (region-active-p))
              (save-excursion (< 0 (skip-chars-forward " \t"))))
          (skip-chars-forward " \t")))
      ((save-excursion (< 0 (skip-syntax-forward "_()")))
        (skip-syntax-forward "_()")
        (if (and
              (not (region-active-p))
              (save-excursion (< 0 (skip-chars-forward " \t"))))
          (skip-chars-forward " \t"))))))

(defun lawlist-backward-entity ()
"http://stackoverflow.com/q/18675201/2112489"
(interactive "^")
  (with-syntax-table lawlist-movement-syntax-table
    (cond
      ((bolp)
        (backward-char))
      ((save-excursion (> 0 (skip-chars-backward " \t")) (bolp))
        (skip-chars-backward " \t"))
      ((save-excursion (> 0 (skip-chars-backward " \t")) (> 0 (skip-syntax-backward "w")))
        (skip-chars-backward " \t")
        (skip-syntax-backward "w"))
      ((save-excursion (> 0 (skip-syntax-backward "w")))
        (skip-syntax-backward "w"))
      ((save-excursion (> 0 (skip-syntax-backward ".")))
        (skip-syntax-backward "."))
      ((save-excursion (> 0 (skip-chars-backward " \t")) (> 0 (skip-syntax-backward ".")))
        (skip-chars-backward " \t")
        (skip-syntax-backward "."))
      ((save-excursion (> 0 (skip-syntax-backward "_()")))
        (skip-syntax-backward "_()"))
      ((save-excursion (> 0 (skip-chars-backward " \t")) (> 0 (skip-syntax-backward "_()")))
        (skip-chars-backward " \t")
        (skip-syntax-backward "_()")))))

【问题讨论】:

  • 为什么不使用C-sC-r 来查找星号并将其删除?
  • @omouse 自从几个月前我被介绍给 Emacs 以来,我一直在寻求拥有一些多年来我已经习惯的基本文字处理功能 -- right-word /left-word 是一个好的开始,但还不够。 forward-symbol 和它的反面距离更近了,但并非完全如此。 lawlist-forward-entity/lawlist-backward-entity的最新自定义草稿——刚好符合我个人对移动光标的喜好。本质上,我喜欢将符号和标点符号与单词分开处理,并跳过空格。

标签: emacs elisp


【解决方案1】:

您可能会喜欢 Emacs-24.4 的 superword-mode

【讨论】:

【解决方案2】:

添加到模式的模式钩子,你正在编辑文本:

(modify-syntax-entry ?* "w")

阅读here了解更多信息。

请注意,这将使其他函数将星号视为单词组成部分(不过,您可能会想要它,因为您很快就会发现不仅运动命令的行为与您希望它们的行为相反)。

另一种仅重载这些特定命令的方法是使用defadvice 通知它们,并在函数执行期间临时更改语法表。

【讨论】:

  • @lawlist 是的,这是一种方法。
  • 我犯了一个小错误,只是用下划线更正了它,以便它恢复符号组成行为:gnu.org/software/emacs/manual/html_node/elisp/… 对问题的编辑现在可以作为替代解决方案正常工作。
  • @lawlist 您可以使用char-syntax 来获取先前定义的字符语法类,然后将其恢复为之前的任何内容。
  • 谢谢你的建议——我会读一些关于如何实现char-syntax的文章。
猜你喜欢
  • 1970-01-01
  • 2011-03-07
  • 2016-04-10
  • 1970-01-01
  • 1970-01-01
  • 2020-02-16
  • 1970-01-01
  • 2010-12-05
  • 2010-10-22
相关资源
最近更新 更多