在vim中打开文件之前,在文件上运行脚本

时间:2013-12-20 10:05:11

标签: vim emacs editor sublimetext cscope

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

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

将此视为CSS,但适用于您的编辑器和代码。使用vim可以实现这样的设置吗?我在linux机器上使用gvim,但我准备切换到任何vim变种+插件。

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

2 个答案:

答案 0 :(得分:2)

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

:%!lindent
:setlocal nomodified

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

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

答案 1 :(得分:1)

在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 ++源自动运行此命令 但那可能很烦人。密钥绑定更好。

UPD

根据@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)))