【问题标题】:emacs: visual-line-mode and fill-paragraphemacs:视觉线模式和填充段落
【发布时间】:2009-09-12 21:21:28
【问题描述】:

我现在使用 Emacs 23 并关闭了可视行模式来进行文本编辑,但出于习惯一直按 M-q (因此添加了硬包装行结尾......)。我想知道是否有一种方法可以添加一个条件来禁用填充段落(或删除与 M-q 的绑定),以用于打开视觉线模式的模式,但为那些我仍在的模式重新启用它使用自动填充模式?谢谢!

【问题讨论】:

    标签: emacs elisp


    【解决方案1】:
    (defun maybe-fill-paragraph (&optional justify region)
      "Fill paragraph at or after point (see `fill-paragraph').
    
    Does nothing if `visual-line-mode' is on."
      (interactive (progn
             (barf-if-buffer-read-only)
             (list (if current-prefix-arg 'full) t)))
      (or visual-line-mode
          (fill-paragraph justify region)))
    
    ;; Replace M-q with new binding:
    (global-set-key "\M-q" 'maybe-fill-paragraph)
    

    除了使用global-set-key,您还可以仅在特定模式下重新绑定M-q。 (或者,您可以更改全局绑定,然后在特定模式下将M-q 绑定回fill-paragraph。)请注意,许多模式是自动加载的,因此在激活模式之前可能不会定义它们的键映射。要设置特定于模式的绑定,我通常使用这样的函数:

    (add-hook 'text-mode-hook
      (defun cjm-fix-text-mode ()
        (define-key text-mode-map "\M-q" 'maybe-fill-paragraph)
        (remove-hook 'text-mode-hook 'cjm-fix-text-mode)))
    

    remove-hook 不是绝对必要的,但该函数只需要运行一次。)

    【讨论】:

    • 全局设置M-q 是邪恶的,因为它会影响所有模式。如果必须这样做,请使用substitute-key-definition(或改用 defadvice 或 fset)
    • 但这就是重点。 M-q 已经是一个全局绑定。他希望它反弹到检查视觉线模式的功能。
    • 嗯...也是一个不错的选择... M-q 的全局设置可能很危险,但函数足够简单(且优雅)以至于其后果是可预测的?
    • 好吧,你赢了。我以为 is 只绑定在类似文本的模式下,但我注意到它到处都是绑定的,它是 fill-paragraph-function 在其他模式下发挥了魔力......
    • 感谢您的帖子和编辑! [所以我在这方面相对较新,但不会 (add-hook 'text-mode-hook '(lambda () (define-key text-mode-map "\M-q" 'maybe-fill-paragraph)))做吗?]
    【解决方案2】:

    您可以为此提出建议。

    对于您的 .emacs:

    (defadvice fill-paragraph (around disable-for-visual-line-mode activate)
      (unless visual-line-mode
        ad-do-it))
    

    这将在可视行模式打开时将填充段落更改为不执行任何操作。如果您愿意,也可以添加错误。

    【讨论】:

    • 请注意,当 visual-line-mode 开启时,这将完全禁用 fill-paragraph,即使它是从 elisp 函数调用的。你可能不想那么激烈。
    • 我同意,非常漂亮......但 cjm 有一点......虽然我不知道从 elisp 函数中调用填充段落的频率。
    • (我喜欢 defadvice,因为你也可以在不重启 emacs 的情况下关闭它)
    • 使用说明:建议对于改变对现有函数的现有调用的行为很有用。如果您想要新调用或键绑定的新行为,您应该定义一个使用现有函数的新函数(或新命令)。 (gnu.org/software/emacs/manual/html_node/elisp/…)
    • 回复:“(我喜欢 defadvice,因为您也可以在不重新启动 emacs 的情况下将其关闭)”您还可以将 M-q 绑定回填充段落(全局或特定模式)而无需重新启动 Emacs .
    【解决方案3】:

    visual-line-mode 有自己的键盘映射:visual-line-mode-map。我建议仅在该键盘映射中重新绑定 M-q。

    地图被定义为启动的一部分,所以你不需要 eval-after-load。只需在该模式下禁用绑定:

    (define-key visual-line-mode-map [remap fill-paragraph] 'ignore)
    

    【讨论】:

    • ignore 是规范的“接受任何参数并且什么都不做”命令。
    • 太棒了!谢谢@phils,我已经编辑了我的答案。 (Ed:以前我是在定义自己的 noop 函数而不是 'ignore。)
    猜你喜欢
    • 1970-01-01
    • 2011-04-10
    • 2014-11-13
    • 1970-01-01
    • 1970-01-01
    • 2010-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多