vim达人们, 如果vim提供的缩进无法满足需求时, 一般怎么对付?

Vim、Emacs配置和使用
回复
头像
潇洒走一回
帖子: 735
注册时间: 2009-05-20 21:43

vim达人们, 如果vim提供的缩进无法满足需求时, 一般怎么对付?

#1

帖子 潇洒走一回 » 2010-11-14 21:52

我发现vim的 cindent 对付不了一些特殊的C++语法. 比如构造函数的初始化式, 自动缩进的就不行.

如下是使用 Boost Format 库 的C++代码, 我自己手动缩进如下:

代码: 全选

// To compile:
// $ g++ -lboost_filesystem path.cc
//
// 该示例程序演示 Boost.Filesystem 中提供的
// path对象的常用操作.
//
// 同时, 我还使用了Boost Format 库完成格式化输出.
//
#include "boost/filesystem.hpp"
#include <boost/format.hpp>
#include <iostream>
#include <cstdio>

using namespace std;
namespace bfs = boost::filesystem;

int main(int argc, char** argv) {
    //boost::progress_timer t( std::clog );

    if(argc <= 1)
        exit(1);
    bfs::path p(argv[1]);

    //p.clear();
    
    cout << boost::format (
            "path=                      '%||'\n"
            "complete:                  '%||'\n"
            "\n"
            "path.filename():           '%||'\n"
            "path.parent_path():        '%||'\n"
            "path.string():             '%||'\n"
            "path.file_string():        '%||'\n"
            "path.directory_string():   '%||'\n"
            "path.root_name()           '%||'\n"
            "path.root_directory()      '%||'\n"
            ) 
            % p
            % bfs::system_complete(p)
            % p.filename()
            % p.parent_path()
            % p.string()
            % p.file_string()
            % p.directory_string()
            % p.root_name()
            % p.root_directory()
            ;
    
    // 因为 path 具有从 const char* 进行构造的构造函数, 所以:
    //cout << bfs::system_complete("a/b/c.py") << "\n";
}
gg=G 后的缩进如下:

代码: 全选

// To compile:
// $ g++ -lboost_filesystem path.cc
//
// 该示例程序演示 Boost.Filesystem 中提供的
// path对象的常用操作.
//
// 同时, 我还使用了Boost Format 库完成格式化输出.
//
#include "boost/filesystem.hpp"
#include <boost/format.hpp>
#include <iostream>
#include <cstdio>

using namespace std;
namespace bfs = boost::filesystem;

int main(int argc, char** argv) {
    //boost::progress_timer t( std::clog );

    if(argc <= 1)
        exit(1);
    bfs::path p(argv[1]);

    //p.clear();

    cout << boost::format (
            "path=                      '%||'\n"
            "complete:                  '%||'\n"
            "\n"
            "path.filename():           '%||'\n"
            "path.parent_path():        '%||'\n"
            "path.string():             '%||'\n"
            "path.file_string():        '%||'\n"
            "path.directory_string():   '%||'\n"
            "path.root_name()           '%||'\n"
            "path.root_directory()      '%||'\n"
            ) 
              % p
                 % bfs::system_complete(p)
                                          % p.filename()
                                              % p.parent_path()
                                              % p.string()
                                              % p.file_string()
                                              % p.directory_string()
                                              % p.root_name()
                                              % p.root_directory()
                                              ;

    // 因为 path 具有从 const char* 进行构造的构造函数, 所以:
    //cout << bfs::system_complete("a/b/c.py") << "\n";
}
可以看见重排后的效果很糟.
我想请教一下, 对于Vim无法应付的情况, 如果处理呢?
不要以为这不重要, 其实无法正确缩进很让人抓狂的, 比如在上面的代码中, 我输入了一行 %***, 换行之后预期应和上行对齐的, 但是却漂移了很远, 我不得连续按退格键手动对齐.
谢谢!!!
头像
xhy
帖子: 3916
注册时间: 2005-12-28 1:16
系统: Ubuntu 12.10 X64
来自: 火星

Re: vim达人们, 如果vim提供的缩进无法满足需求时, 一般怎么对付?

#2

帖子 xhy » 2010-11-14 22:32

用astyle代替默认缩进
目前负债150多万
头像
潇洒走一回
帖子: 735
注册时间: 2009-05-20 21:43

Re: vim达人们, 如果vim提供的缩进无法满足需求时, 一般怎么对付?

#3

帖子 潇洒走一回 » 2010-11-14 22:52

xhy 写了:用astyle代替默认缩进
谢谢! 我去看看.
头像
潇洒走一回
帖子: 735
注册时间: 2009-05-20 21:43

Re: vim达人们, 如果vim提供的缩进无法满足需求时, 一般怎么对付?

#4

帖子 潇洒走一回 » 2010-11-15 17:55

潇洒走一回 写了:
xhy 写了:用astyle代替默认缩进
谢谢! 我去看看.
非常感谢达人推荐的 astyle, 测试了一些文件, 默认情况居然和我的口味一模一样! :em11
头像
潇洒走一回
帖子: 735
注册时间: 2009-05-20 21:43

Re: vim达人们, 如果vim提供的缩进无法满足需求时, 一般怎么对付?

#5

帖子 潇洒走一回 » 2010-11-16 16:57

我先前在仓库里安装的, 不能使用一些最新版本的选项. 于是下载了最新的源码编译.

astyle的源码让我很震惊, 挺复杂的一个程序, 居然除了标准库, 什么都没有依赖.
特别是解析命令行的部分用了大量代码, 真不如用 Boost.program_options .
回复