.emacs.txt文件可视线模式与muse模式同时使用

.emacs.txt文件可视线模式与muse模式同时使用,emacs,elisp,mode,Emacs,Elisp,Mode,我以“#title”开头,表示我的muse模式文件(通常以.txt后缀命名)为muse模式。要做到这一点,我必须 ;; muse-mode on *.txt files, if a #title or sect. header is on top 4 lines (add-hook 'text-mode-hook (lambda () (unless (or (eq major-mode 'muse-mode)

我以“#title”开头,表示我的muse模式文件(通常以.txt后缀命名)为muse模式。要做到这一点,我必须

;; muse-mode on *.txt files, if a #title or sect. header is on top 4 lines (add-hook 'text-mode-hook (lambda () (unless (or (eq major-mode 'muse-mode) (not (stringp buffer-file-truename))) (when (equal (file-name-extension buffer-file-truename) "txt") (save-excursion (goto-line 5) (if (re-search-backward "\* [A-Z][a-z]+.*\\|#title " 1 t) (muse-mode))))))) ;; 如果是#标题或章节,*.txt文件上的muse模式。标题位于顶部4行 (添加钩子的文本模式钩子) (lambda() (除非(或(eq大调模式‘缪斯模式’) (不是(stringp缓冲区文件truename))) (当(相等(文件扩展名缓冲区文件truename)“txt”) (省去远足 (转到5号线) (如果(向后搜索“\*[A-Z][A-Z]+.\\\\\\|#标题“1 t”) (缪斯模式‘‘‘‘‘‘‘) 如果我也有

(add-to-list 'auto-mode-alist '("\\.txt$" . visual-line-mode)) (添加到列表“自动模式列表”(“\\.txt$”.visual line mode)) 在.emacs中(遵循上面的代码),则muse模式不再工作。虽然如果我在muse文件的emacs中使用Meta-x调用visualline模式,它不会把事情搞砸

理想情况下,我希望所有的.txt文件都能使用可视行模式,但不会弄乱muse。或者,我希望以可视行模式启动所有.txt文件,但muse文件除外。

变量选择主模式

可视线模式
是一种次要模式,通过将其添加到
自动模式列表
中,您可以使其像主要模式一样工作,从而取代您最初使用的
文本模式

相反,将
打开txt中的可视行模式
添加到
文本模式挂钩
,如下所示:

(add-hook `text-mode-hook 'turn-on-visual-line-mode)

(defun turn-on-visual-line-mode-in-txt ()
  (when (and (buffer-file-name)
             (string-match ".txt$" (buffer-file-name)))
    (turn-on-visual-line-mode)))
有关差异的更多信息,请阅读和模式手册。

变量选择主模式

可视线模式
是一种次要模式,通过将其添加到
自动模式列表
中,您可以使其像主要模式一样工作,从而取代您最初使用的
文本模式

相反,将
打开txt中的可视行模式
添加到
文本模式挂钩
,如下所示:

(add-hook `text-mode-hook 'turn-on-visual-line-mode)

(defun turn-on-visual-line-mode-in-txt ()
  (when (and (buffer-file-name)
             (string-match ".txt$" (buffer-file-name)))
    (turn-on-visual-line-mode)))

有关差异的更多信息,请阅读手册中的和模式。

我认为@treyJackson发现了问题,但这里有一些额外的注释:

顺便说一句,您使用
文本模式挂钩
切换到
muse模式
会在各种情况下表现不好(因为您首先切换到文本模式,然后在中途激活muse模式,然后文本模式激活结束)(通常情况下,剩下的事情不多了,但是文本模式钩子上可能还有更多的函数要运行)仍将执行。一种更稳健的方法可能是:

(add-to-list 'auto-mode-alist '("\\.txt\\'" . text-or-muse-mode))

(defun text-or-muse-mode ()
  (if (save-excursion
        (goto-line 5)
        (re-search-backward "\\* [A-Z][a-z]+.*\\|#title " 1 t))
      (muse-mode)
    (text-mode)))

当然,你也可以在第一行使用
-*-muse-*-
,或者改用
魔术模式。

我认为@treyJackson发现了问题,但这里有一些额外的评论:

顺便说一句,您使用
文本模式挂钩
切换到
muse模式
会在各种情况下表现不好(因为您首先切换到文本模式,然后在中途激活muse模式,然后文本模式激活结束)(通常情况下,剩下的事情不多了,但是文本模式钩子上可能还有更多的函数要运行)仍将执行。一种更稳健的方法可能是:

(add-to-list 'auto-mode-alist '("\\.txt\\'" . text-or-muse-mode))

(defun text-or-muse-mode ()
  (if (save-excursion
        (goto-line 5)
        (re-search-backward "\\* [A-Z][a-z]+.*\\|#title " 1 t))
      (muse-mode)
    (text-mode)))

当然,您也可以在第一行使用
-*-muse-*-
,或者使用
魔术模式列表来代替。

很好。但是,我的要求是为所有.txt文件激活可视行模式,而不是所有文本模式文件。也就是说,我不想为.tex文件激活可视行模式,例如,尽管从您的建议.tex文件包含在文本模式钩子中。@ChristopherBarrington Leigh Updated.Lovely。但是,我的请求是为所有.txt文件激活可视行模式,而不是为所有文本模式文件激活可视行模式。也就是说,例如,我不想为.tex文件激活可视行模式,尽管从您的建议产生的行为来看,.tex文件是包含的在文本模式钩子中删除了。@ChristopherBarrington Leigh更新了。非常感谢。这很有用。但是,如果我正确测试了它,这会影响所有缓冲区名称中以.txt结尾的文件,而不是那些以.txt结尾的文件。我不这么认为:
“\\.txt\”
特别匹配文件名末尾的
.txt
(与)相反,TXT $“也可以在名称中间,如果后面是换行符,与<代码> .txt 匹配。非常感谢。这是有用的。如果我已经正确地测试了它,但是,它会以缓冲区名称中的.txt影响所有文件,而不是终止于txt中的所有文件?我不这么认为:<代码> \\txt\'。< /代码>在文件名的结尾(与)相反,具体地匹配<代码> .txt <代码>。txt $“ >,也可以在名称中间,如果代码后面是换行符,则匹配<代码> > txt < /代码>。