emacs:visual-line-mode和fill-paragraph

时间:2009-09-12 21:21:29

标签: emacs elisp

我现在正在使用Emacs 23进行文本编辑的视线模式转换,但仍然不习惯M-q(因此添加了硬包装线结尾......)。我想知道是否有一种方法可以添加一个条件来禁用fill-paragraph(或删除绑定到Mq)的模式,其中打开了可视线模式,但是为那些我还在的模式重新启用它使用自动填充模式?谢谢!

3 个答案:

答案 0 :(得分:7)

(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并非绝对必要,但该功能只需运行一次。)

答案 1 :(得分:5)

您可以使用此建议。

对于.emacs:

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

当视线模式打开时,这将更改fill-paragraph不执行任何操作。如果您愿意,也可以添加错误。

答案 2 :(得分:2)

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

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

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