【问题标题】:Run a script on a file before opening a file in vim在 vim 中打开文件之前对文件运行脚本
【发布时间】:2014-01-09 03:54:57
【问题描述】:

我必须在一个非常古老(几十年)并且患有多作者综合症的大型 C 代码库中工作。代码库中都存在不同的编码风格(空格与制表符;新行、同一行、新行缩进等上的花括号)。由于非技术原因,我将无法重新缩进和提交源文件。

有没有一种方法可以在打开任何 .C 文件之前在打开文件之前对文件运行 Lindent(Linux 内核缩进脚本)?这样,我将能够以我想要的方式查看文件。文件关闭不应保存缩进更改。我也不应该收到文件更改消息的提示。每次打开时都无法使用临时文件,因为像 cscope 这样的东西会破坏这种方式。

把它想象成一个 CSS,但是对于你的编辑器和代码。使用 vim 可以进行这样的设置吗?我在 linux 机器上使用 gvim,但我已准备好切换到任何 vim 变体 + 插件。

此外,很明显,该设置还应该允许我以不缩进的方式打开文件。这个复杂的要求有一线希望吗?如果可以在任何其他编辑器中完成,我可以将编辑器切换到(听 emacs、sublimetext 人)。

【问题讨论】:

    标签: vim emacs editor sublimetext cscope


    【解决方案1】:

    假设lindent 可以像普通过滤器(:%! {cmd})一样被调用,以下命令将处理当前缓冲区并重置修改标志(使文件显示为未更改):

    :%!lindent
    :setlocal nomodified
    

    您可能也想:setlocal nomodifiable,以避免您意外保留重新格式化的文件。

    将这些命令放入~/.vim/after/ftplugin/c.vim。 (这要求您有 :filetype plugin on;使用 after 目录允许您覆盖由 $VIMRUNTIME/ftplugin/c.vim 完成的任何默认文件类型设置。)或者,您可以直接在您的 @ 中定义 :autocmd FileType c ... 987654329@,但是一旦您进行了许多自定义,这往往会变得笨拙。

    【讨论】:

    • 有没有一种方法可以使这些标志(nomodifiable 等)仅在从指定路径(可能来自我的 ~/.vimrc)打开文件时适用?这样,我将能够打开我项目的所有 .C 文件 Lindented 并且其余 .C 文件没有问题。
    • 是的,然后使用:autocmd 的第二种方法,但不是在文件类型上而是在文件全局上,即:autocmd BufRead path/to/project/*.c execute '%!lindent' | setlocal nomodified
    【解决方案2】:

    这在 Emacs 中是微不足道的。这是我有时使用的命令:

    (defun cpp-astyle()
      (interactive)
      (let (beg end)
        (if (region-active-p)
            (setq beg (region-beginning)
                  end (region-end))
          (setq beg (point-min)
                end (point-max)))
        (shell-command-on-region
         beg end "astyle -A3 -U -p -k3" nil t)))
    

    这将在当前文件上运行astyle。您可以将此操作绑定到一个键:

    (global-set-key (kbd "f8") 'cpp-astyle)
    

    也可以为所有 C/C++ 源自动运行此命令 但这可能很烦人。键绑定更好。

    更新

    根据@Tom 的要求:

    (defun cpp-astyle()
      (interactive)
      (let ((buf (get-buffer-create
                  (format "--%s" (buffer-name))))
            (mode major-mode)
            beg end)
        (if (region-active-p)
            (setq beg (region-beginning)
                  end (region-end))
          (setq beg (point-min)
                end (point-max)))
        (shell-command-on-region
         beg end "astyle -A3 -U -p -k3"
         buf)
        (switch-to-buffer buf)
        (funcall mode)))
    

    【讨论】:

    • 他说在保存文件时不应该保留缩进变化。您的解决方案更改了文件的缩进。
    • 我在里面没有看到save-buffer,是吗:)?
    • 他在问题中写道:“文件关闭不应该保存缩进更改。也不应该提示我文件更改的消息。”您的解决方案是否满足后一个条件?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-14
    • 2019-11-19
    • 2017-01-09
    相关资源
    最近更新 更多