我必须在一个非常古老(几十年)的大型C代码库中工作并且遭受多作者综合症。不同的编码样式(空格与制表符;新行上的花括号,同一行,新行缩进等)都存在于代码库中。由于非技术原因,我将无法重新缩进和提交源文件。
有没有一种方法可以在打开任何.C文件之前在打开之前在文件上运行Lindent(linux内核缩进脚本)?这样,我将能够以我想要的方式查看文件。文件关闭不应保存缩进更改。我也不应该提示文件更改的消息。在每次打开时都不能使用临时文件,因为像cscope这样的东西会破坏这种方式。
将此视为CSS,但适用于您的编辑器和代码。使用vim可以实现这样的设置吗?我在linux机器上使用gvim,但我准备切换到任何vim变种+插件。
此外,显而易见的是,设置还应该允许我以缩进方式打开文件。这个复杂的要求是否有一线希望?如果可以在任何其他编辑器中完成,我可以将编辑器切换到(监听emacs,sublimetext人员)。
答案 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 ++源自动运行此命令 但那可能很烦人。密钥绑定更好。
根据@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)))