sublime text 2、3 配置 c\c++ 开发环境

内容纲要

sublime text 2 配置 c\c++ 开发环境

1.搭建基础配置:

  1. 下载安装 MinGW 下载

  • 配置环境变量 我的电脑 -> 属性 -> 高级系统设置 -> 环境变量

    注意 PATH 中的变量会非常的多,不同变量之间使用; 分隔.

    • 新建环境变量 MinGW_PATH 填写系统 mingw 的实际安装位置,如:D:\Program Files\MinGW

    • 编辑 PATH 在最后添加%MinGW_PATH%\bin;%PATH%;

  • 检查变量设置

    • win+r,输入: cmd ,在命令行中输入:g++ -v,有内容输入证明环境变量配置正确.如果出现'g++' 不是内部或外部命令,也不是可运行的程序或批处理文件。 检查上一步配置.

2.sublime text 2 的初始化配置

  1. 下载安装 sulime text 2 下载

  • 基础插件安装

    • Ctrl+Shift+p 输入: install,回车.输入:Theme - Aqua

    • Ctrl+`调出console粘贴以下代码到底部命令行并回车:

    • 重启Sublime Text 2。如果在Perferences->package settings中看到package control这一项,则安装成功。

    • package control 组件:

      import urllib2,os; pf='Package Control.sublime-package'; ipp=sublime.installed_packages_path(); os.makedirs(ipp) if not os.path.exists(ipp) else None; urllib2.install_opener(urllib2.build_opener(urllib2.ProxyHandler())); open(os.path.join(ipp,pf),'wb').write(urllib2.urlopen('http://sublime.wbond.net/'+pf.replace(' ','%20')).read()); print('Please restart Sublime Text to finish installation')
    • Aqua Theme 主题:(可选)

    • 其他插件:(待更新)

    • 个人配置文档设置 > Sublime Text 2 -> Preferences -> Settings - User // 尽量不要修改其中的Setting - Defunct 文件.

      添加如下代码,使用shift+space呼出自动提示,

      最外面有[]包裹,小项之间使用,分隔:

        { "keys": ["shift+space"], "command": "auto_complete" },
        { "keys": ["shift+space"], "command": "replace_completion_with_auto_complete", "context":
            [   
                { "key": "last_command", "operator": "equal", "operand": "insert_best_completion" },    
                { "key": "auto_complete_visible", "operator": "equal", "operand": false },   
                { "key": "setting.tab_completion", "operator": "equal", "operand": true }
            ]   
        }
      • 我的c++ build 文件

      • 其中的cb_console_runner.exe点此下载 放置c盘根目录下,同样可以将其放置在其他目录,需将其路径放入PATH变量中.

      • 修改快捷键设置,修改Sublime Text 2 -> Preferences -> key Bindings - User添加如下:

      • c++ build 文件windows 下实现一键编译,错误停止,弹终端显示

        {
            "cmd": ["g++", "${file}", "-o", "${file_path}/${file_base_name}","-Wall" ,"&&","start","C:/cb_console_runner.exe","${file_path}/${file_base_name}"],
            "file_regex": "^(..[^:]*):([0-9]+):?([0-9]+)?:? (.*)$",
            "working_dir": "${file_path}",
            "selector": "source.c, source.c++",
            "shell": true,
            "encoding": "cp936",
                "variants":
            [
                {
                    "name": "Run",
                    "cmd": ["start","C:/cb_console_runner.exe","${file_path}/${file_base_name}"]
                }
            ]
        }

        { "keys": ["f5"], "command": "build"}

        实现f5编译运行,出错停止.如下图所示:

      • "font_face":"courier new bold" :设置字体为Courier new, 样式为加粗

      • "font_size": 10.5: 设置字号:10.5

      • "theme": "AppKit.sublime-theme": 使用上面安装的主题.

      • "auto_complete": false:关掉该死的自动提示,还是建议你现在关掉的好,不然在安装完另一个插件之后,只要打字就出现提示,烦死人了鸟.

      • "tab_completion": true:打开tab 补全,直接显示最佳匹配项,多次按键有惊喜.

      • 我喜欢不打扰人的补全,通过使用快捷键呼出补全,这样的话,可以修改一下Sublime Text 2 -> Preferences -> key Bindings - User:

      3.安装并配置sublimeClang 插件

      1. 安装sublimeClang插件:

        • ctrl+shift+p呼出控制面板输入Package Control: Add Repository,输入以下网址:

        • ctrl+shift+p呼出控制面板输入Package Control: Upgrade Package选择升级组件

        • 首先需要升级你的 package contro,不然会出现提示已安装,但是怎么都找不到的问题:

          https://sublime.wbond.net/testing/packages.json

        • 安装sublimeClang: 通过Package Control安装SublimeClang即可.

      • 插件设置

          "options":
        [
            "-m32",
            "-w",
            "-ferror-limit=9",
            "-fgnu-runtime",
            "-fms-extensions",
            "-nostdinc",
            // 此处填写自己pc中的实际位置和版本号.
            "-isystem", "C:\\MinGW\\lib\\gcc\\mingw32\\4.6.2\\include", 
            "-isystem", "C:\\MinGW\\lib\\gcc\\mingw32\\4.6.2\\include\\c++", 
            "-isystem", "C:\\MinGW\\lib\\gcc\\mingw32\\4.6.2\\include\\c++\\mingw32", 
            "-isystem", "C:\\MinGW\\include",
            "-D__GNUC__=4",
            "-D__GNUC_MINOR__=2",
            "-D__GNUC_PATCHLEVEL__=1",
            "-D__GXX_ABI_VERSION__=1002",
            "-Di386=1",
            "-D__i386=1",
            "-D__i386__=1",
            "-DWIN32=1",
            "-D_WIN32=1",
            "-D__WIN32=1",
            "-D__WIN32__=1",
            "-DWINNT=1",
            "-D__WINNT=1",
            "-D__WINNT__=1",
            "-D_X86_=1",
            "-D__MSVCRT__=1",
            "-D__MINGW32__=1",
            "-D__STDC_VERSION__=201112L"
        ],
        • 修改 Sublime Text 2 -> Preferences -> package setting -> SublimeClang -> settings - Default

        1. show_output_panel: true或false,错误输出框,建议关闭掉,太烦人了.

        2. dont_prepend_clang_includes: true或false。这个选项控制是否不包括clang自身的头文件。建议用true取消包括,以防产生冲突。

        3. options。这个是配置的大头。可以注意到这里的形式和clang命令行调用时的编译选项是一样的(只是不包括指明lib的部分)。简单的修改它Default项中头文件目录的选项很可能是没有效果的(尤其在Windows下)。我最常使用MinGW GCC参考SublimeClang某issue里一位用户提供的配置,修改了那几个目录之后工作完全正常。可以看到里面还有很多宏定义的问题。这个必须要参考自身的开发环境。下面是我的配置:

      4.配置插件实现一键保存加编译

      按键配置

           {"keys": ["alt+`"],"command": "saveandbuild"},

      新建插件,写下如下代码

      import sublime, sublime_plugin

      class SaveandbuildCommand(sublime_plugin.TextCommand):  //注意saveandbuild首字母大写了但是命令里要小写

      def run(self, edit):   

      self.view.run_command("save");   

      sublime.active_window().run_command('build');

      保存到user文件夹,文件名saveandbuild.py

      一键保存文件加编译,OK~~

       

      关于那个

      cb_console_runner.exe

      /*
       * This file is part of the Code::Blocks IDE and licensed under the GNU General Public License, version 3
       * http://www.gnu.org/licenses/gpl-3.0.html
       *
       * $Revision: 6159 $
       * $Id: main.cpp 6159 2010-02-15 04:08:57Z biplab $
       * $HeadURL: file:///svnroot/repos/codeblocks/trunk/src/tools/ConsoleRunner/main.cpp $ */#define __WXMSW__  // 单独编译 WXMSW#include <stdio.h>
      #include <stdlib.h>
      #include <time.h>   // VC编译修改了#ifdef __WXMSW__
          #include <windows.h>
          #include <conio.h>    #define wait_key getch#else
          #define wait_key getchar#endif#if defined(__unix__) || defined(__unix)
          #include <sys/wait.h>#endif#include <string.h>
      #ifdef __MINGW32__int _CRT_glob = 0;#endifbool hasSpaces(const char* str)
      {    char last = 0;    while (str && *str)
          {        if ((*str == ' ' || *str == '/t') && last != '//')            return true;
              last = *str++;
          }    return false;
      }int execute_command(char *cmdline)
      {
      #ifdef __WXMSW__    //Windows's system() seems to not be able to handle parentheses in    //the path, so we have to launch the program a different way.
          SetConsoleTitle(cmdline);
          STARTUPINFO si;
          PROCESS_INFORMATION pi;
          ZeroMemory( &si, sizeof(si) );
          si.cb = sizeof(si);
          ZeroMemory( &pi, sizeof(pi) );    // Start the child process.
          CreateProcess( NULL, TEXT(cmdline), NULL, NULL, FALSE, 0,
                         NULL, NULL, &si, &pi );    // Wait until child process exits.
          WaitForSingleObject( pi.hProcess, INFINITE );    // Get the return value of the child process
          DWORD ret;
          GetExitCodeProcess( pi.hProcess, &ret );    // Close process and thread handles.
          CloseHandle( pi.hProcess );
          CloseHandle( pi.hThread );    return ret;#else
          int ret = system(cmdline);    if(WIFEXITED(ret))
          {        return WEXITSTATUS(ret);
          }    else
          {        return -1;
          }#endif}int gettimeofday(struct timeval *tp, void *tzp)   // VC编译修改了,VC没有 gettimeofday() 添加了{
          time_t clock;    struct tm tm;
          SYSTEMTIME wtm;
          GetLocalTime(&wtm);
          tm.tm_year     = wtm.wYear - 1900;
          tm.tm_mon     = wtm.wMonth - 1;
          tm.tm_mday     = wtm.wDay;
          tm.tm_hour     = wtm.wHour;
          tm.tm_min     = wtm.wMinute;
          tm.tm_sec     = wtm.wSecond;
          tm. tm_isdst    = -1;
          clock = mktime(&tm);
          tp->tv_sec = clock;
          tp->tv_usec = wtm.wMilliseconds * 1000;    return (0);
      }int main(int argc, char** argv)
      {    if (argc < 2)
          {
              printf("显示调用的程序的返回参数和执行时间。/n/n");
              printf("Usage: cb_console_runner <filename> <args ...>/n");
              printf("用 法: cb_console_runner <可执行文件> <参数 ...>/n");        return 1;
          }    // count size of arguments    // 参数的计数大小
          size_t fullsize = 0;    for (int i = 1; i < argc; ++i)
          {
              fullsize += strlen(argv[i]);
          }    // add some slack for spaces between args plus quotes around executable    // 添加可执行程序周围一些参数加引号之间的空间懈怠
          fullsize += argc + 32;    char* cmdline = new char[fullsize];
          memset(cmdline, 0, fullsize);    // 1st arg (executable) enclosed in quotes to support filenames with spaces    // 第一个参数(可执行文件),以支持在引号用空格文件名
          bool sp = hasSpaces(argv[1]);    if (sp)
              strcat(cmdline, "/"");
          strcat(cmdline, argv[1]);    if (sp)
              strcat(cmdline, "/"");
          strcat(cmdline, " ");    for (int i = 2; i < argc; ++i)
          {
              sp = hasSpaces(argv[i]);        if (sp)
                  strcat(cmdline, "/"");
              strcat(cmdline, argv[i]);        if (sp)
                  strcat(cmdline, "/"");
              strcat(cmdline, " ");
          }
          timeval tv;
          gettimeofday(&tv, NULL);    double cl = tv.tv_sec + (double)tv.tv_usec / 1000000;    int ret = execute_command(cmdline);
          gettimeofday(&tv, NULL);
          cl = (tv.tv_sec + (double)tv.tv_usec / 1000000) - cl;
          printf("/nProcess returned %d (0x%X)   execution time : %0.3f s", ret, ret, cl);
          printf("/n进程返回 %d (0x%X)   执行时间 : %0.3f 秒", ret, ret, cl);
          printf
          (        "/n请按"#ifdef __WXMSW__        "任意键"#else
              "ENTER"#endif
              "继续.../n"
          );
          wait_key();    // 前面宏定义 #define wait_key getch
          delete[] cmdline;    return ret;
      }

      View Code

       

      /*-
       * Copyright (C) 2008 mymtom (mymtom@hotmail.com)
       * All rights reserved.
       *
       * Redistribution and use in source and binary forms, with or without
       * modification, are permitted provided that the following conditions
       * are met:
       * 1. Redistributions of source code must retain the copyright
       *    notice, this list of conditions and the following disclaimer.
       * 2. Redistributions in binary form must reproduce the above copyright
       *    notice, this list of conditions and the following disclaimer in the
       *    documentation and/or other materials provided with the distribution.
       * 
       * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
       * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
       * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
       * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
       * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
       * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
       * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
       * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
       * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
       * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
       * SUCH DAMAGE.
       * 
       * $Id: src/lib/libtrace/gettimeofday.c,v 1.1 2008/03/28 12:08:44 mymtom Exp $ */#include <time.h>
      #ifdef WIN32
      #   include <windows.h>#else#   include <sys/time.h>#endif#ifdef WIN32intgettimeofday(struct timeval *tp, void *tzp)
      {
          time_t clock;    struct tm tm;
          SYSTEMTIME wtm;
          GetLocalTime(&wtm);
          tm.tm_year     = wtm.wYear - 1900;
          tm.tm_mon     = wtm.wMonth - 1;
          tm.tm_mday     = wtm.wDay;
          tm.tm_hour     = wtm.wHour;
          tm.tm_min     = wtm.wMinute;
          tm.tm_sec     = wtm.wSecond;
          tm. tm_isdst    = -1;
          clock = mktime(&tm);
          tp->tv_sec = clock;
          tp->tv_usec = wtm.wMilliseconds * 1000;    return (0);
      }#endif /* WIN32 */

      View Code