簡體   English   中英

在vim中打開文件之前在文件上運行腳本

[英]Run a script on a file before opening a file in vim

我必須在一個很大的C代碼庫中工作,該代碼庫很舊(數十年)並且遭受多作者綜合症。 代碼庫中都存在不同的編碼樣式(空格與制表符;換行,大括號,同一行,新行縮進等)。 由於非技術原因,我將無法重新縮進並提交源文件。

有沒有一種方法,在打開任何.C文件之前,我可以在打開文件之前對文件運行Lindent(Linux內核縮進腳本)? 這樣,我將能夠以自己想要的方式查看該文件。 文件關閉不應保存縮進更改。 文件更改的消息也不會提示我。 每次打開都無法使用臨時文件,因為像cscope這樣的事情會破壞這種方式。

可以將其視為CSS,但適用於您的編輯器和代碼。 vim完全可以進行這樣的設置嗎? 我在Linux機器上使用gvim,但是我准備切換到任何vim變體+插件。

另外,很明顯,安裝程序還應允許我以不縮進的方式打開文件。 對於這個復雜的需求是否有一線希望? 如果可以在其他任何編輯器中完成操作,則可以將編輯器切換為(聽emacs,sublimetext人)。

假設可以像普通過濾器( :%! {cmd} )一樣調用lindent ,以下命令將處理當前緩沖區並重置修改標志(以使文件顯示為不變):

:%!lindent
:setlocal nomodified

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

將這些命令放入~/.vim/after/ftplugin/c.vim (這要求您使用:filetype plugin on ;使用after目錄允許您覆蓋$VIMRUNTIME/ftplugin/c.vim完成的任何默認文件類型設置。)或者,您可以直接定義:autocmd FileType c ...~/.vimrc ,但是一旦您進行了許多自定義,這往往變得很笨拙。

這在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)))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM