Ejecutar en cmd.exe desde Sublime Text

Uno de los pocos puntos negativos de este excelente editor de código es que si compilamos y ejecutamos nuestros programas en Java, C++, etcétera con algún Build Sytem, nuestro programa se compilará y ejecutará mostrando el resultado satisfactoriamente si este NO requiere interacción con el usuario. En cambio, si nuestro programa debe leer algún dato, como por ejemplo (std::cin >> entrada;) en el caso de C++, nuestro programa no se ejecutará como es debido y la ejecución terminará con fallos.


Para solventar esto, y después de múltiples intentos de solucionarlo mediante Build System, es necesario modificar un archivo de configuración de Sublime Text llamado exec.py, para conseguir que al ejecutar nuestro Build System, la ejecución de nuestro programa se haga en el cmd.exe, donde no tendremos ningún problema en introducir datos para nuestros programas.

Dicho todo esto, tan solo necesitamos añadir una linea al archivo exec.py de Sublime Text que se encuentra en la ruta:
C:\Users\tu_usuario\AppData\Roaming\Sublime Text 2\Packages\Default\exec.py

NOTA
Debes cambiar "tu_usuario" por el nombre de tu usuario. Además el directorio AppData está oculto por defecto, así que deberás configurar visibles los archivos y directorios ocultos para poder verlo. Esto se hace en:
Inicio > Panel de control > Opciones de carpeta > Ver > Mostrar archivos, 
carpetas y unidades ocultos

Aplican los cambios y click en aceptar, ahora si, si miras tu capeta de usuario, donde están "Mis documentos", "Mi musica" y demás, aparecerán unas carpetas nuevas, entre ellas la que nosotros necesitamos, AppData.
Carpeta AppData
Cuando os encontréis en la carpeta Default, debéis abrir el archivo exec.py, así que os aconsejo que lo hagáis con Sublime Text por ejemplo ya que necesitaremos tener las líneas numeradas para hacer los cambios.

Para ello hacéis doble click sobre el archivo, saldrá una ventanita donde deberemos elegir la segunda opción.
Abrir archivo con otro programa
En la nueva ventana buscáis Sublime Text entre todos los programas que aparecerán, si no está, hacéis click en Examinar..., y en la carpeta Archivos de programa, entráis en Sublime Text 2 y seleccionáis el .exe llamado sublime_text.exe, luego pincháis en aceptar y listo.

sublime_text.exe

Hecho esto ya con doble click podréis abrir el archivo exec.py, así que ahora toca ir a la línea 154, donde debéis comentarla colocando una almohadilla delante y añadir la siguiente línea a continuación, dejándolo todo así:
# self.proc = AsyncProcess(cmd, merged_env, self, **kwargs)
os.system("cmd /C " + " ".join(cmd) + " & echo. & echo [Programa finalizado] & pause")
Archivo exec.py modificado
Archivo exec.py modificado
Hecho esto guardamos y listo, tan solo reinicia Sublime Text, y la próxima vez que quieras ejecutar tu Build System, se abrirá un cmd.exe donde se ejecutará tu aplicación directamente.

Comentarios

  1. Sos grande, muchas gracias!...

    ResponderEliminar
  2. Hola! Oye, una pregunta: ¿Esto también funciona para linux? (en especifico linux mint 14).

    ResponderEliminar
    Respuestas
    1. Pues esta solución es solamente para cmd.exe de Windows, pero acabo de hacer una entrada para poder hacer esto mismo en Linux, es una solución un tanto extraña pero sirve.
      http://ayudasprogramacionweb.blogspot.com/2013/01/ejecutar-en-terminal-linux-sublime-text.html

      Este es el enlace, saludos!.

      Eliminar
  3. Muchas gracias, voy a probar con C

    ResponderEliminar
  4. Muchas gracias, voy a probar con C

    ResponderEliminar
  5. hola, no hay algun video tutorial por ahi que tengas donde se explica todo esto?

    ResponderEliminar
  6. ize todo lo que dice desde esto que ice primero http://ayudasprogramacionweb.blogspot.com.es/2012/12/compilar-y-ejecutar-cpp-desde-sublime-text.html y luego ice ese http://ayudasprogramacionweb.blogspot.com.es/2012/12/ejecutar-en-cmdexe-desde-sublime-text.html pero no me funciona, te doy una imagen que me aparece por un lapso de tiempo muy corto http://i45.tinypic.com/rhv9uh.jpg me sale eso y se desaparece al instante

    ResponderEliminar
    Respuestas
    1. Me pasa lo mismo que a ti! sabes como se puede solucionar el problema??

      Eliminar
    2. Saludos, si el CMD.exe se cierra muy rápido, quiere decir que ha habido algún error (obvio xD).

      Así que lo único que se me ocurre es que compruebes abriendo un CMD.exe si tu compilador es visible, es decir que cuando en el cmd pones javac o g++ o cualquier otro compilador, estos programas respondan, sino debes añadir la ruta de la carpeta donde se encuentran en la variable de entorno PATH en el siguiente enlace explico como hacerlo para java, sería igual con cualquier otro compilador.

      http://ayudasprogramacionweb.blogspot.com/2012/11/compilar-y-ejecutar-java-en-cmd-windows.html

      Otro posible problema puede ser que te hayas equivocado creando el Sublime Build, compruébalo ejecutándolo sin la modificación del cmd, a ver si anda bien, o modificando el archivo exec.py.

      No se me ocurren más cosas, espero que tengáis suerte. =)

      Eliminar
    3. No a habido ningun error, ya que lo compilo y ejecuto con el devc++ y me corre perfectamente el programa que en realidad lo probé con un simple "hola mundo" no se que es lo que hice mal, ya que segui todas las instrucciones al pie de la letra pero se cierra apenas lo ejecuto...

      Eliminar
    4. Este comentario ha sido eliminado por el autor.

      Eliminar
    5. Men si vas a este link y haces todo exactamente como lo dice:

      http://ayudasprogramacionweb.blogspot.com/2012/12/compilar-y-ejecutar-java-desde-sublime-text.html

      y luego vas a este que es en el cual estamos:

      http://ayudasprogramacionweb.blogspot.com/2012/12/ejecutar-en-cmdexe-desde-sublime-text.html

      NOTA: Cabe destacar que esto lo hice con el subleme text 2

      Veras como la vida es mas sencilla y todo te funciona excelentemente bien ami me funciono a la perfección te lo recomiendo que lo hagas así. Saludos Cordiales

      Eliminar
  7. Me pasa lo mismo que "Ad_gs", como puedo evitar que se cierre enseguida la ventana cmd.exe? traté con un "system("PAUSE");" pero no me funcionó. Ayuda please, me gusta mucho este ide

    ResponderEliminar
  8. prueba con un getchar ();
    y si no te funciona usa un scanf("%d");

    ResponderEliminar
  9. Alguien ya encontró la solución sobre el cierre precipitado del cmd?

    ResponderEliminar
  10. Al parecer esto sucede cuando guardas tu archivo con palabras separadas por ejemplo si guardamos como "hola" si funciona y no se cierra la venta, pero si guardamos como "hola mundo" esta se cierra. Me acabo de dar cuenta de ese error, pero no se como solucionarlo.

    ResponderEliminar
  11. A mi tambien se me cierra, pero solo cuando aparece un error, y me gustaría saber como evitarlo porque asi se podría ver el error. Muchisimas gracias por estos posts!

    ResponderEliminar
    Respuestas
    1. Saludos, he estado repasando la función que debemos modificar, os.system() y lo he solucionado con un pequeño cambio, ahora cuando aparece un error el cmd no se cierra y deja ver el error.

      La entrada ya está corregida así que copiar de nuevo la linea del método os.system() en vuestro archivo exec.py y todo debería ir genial.

      Eliminar
    2. cual es ese cambio amigo porfavor comenta

      Eliminar
    3. copia esto y pega en la linea 155: os.system("cmd /C " + " ".join(cmd) + " & echo. & echo [Programa finalizado] & pause") El problema se soluciona quitando un "&" al metodo os.system().

      Eliminar
  12. amigo Dios te bendiga llevo dias tratando de hacer eso
    de verdad muchas gracias funciono

    ResponderEliminar
  13. Saludos Erik Ordóñez, por algún extraño motivo se borró tu comentario. Lo que te podría decir es que repasaras el sublime-build, tengo algunas entradas donde lo explico, además intenta que las rutas que utilizas en él no contengan espacios en blanco, puede que de algún error por eso.

    Saludos

    ResponderEliminar
  14. T la reventaste!! Gracias

    ResponderEliminar
  15. me sale "cmd" no se reconoce como un comando interno o externo.

    ResponderEliminar
  16. Hola que tal. saben porque me sale este error.
    "g++" no se reconoce como un comando interno o externo,
    programa o archivo por lotes ejecutable.
    [Finished in 1.0s with exit code 1]
    [shell_cmd: g++ "C:\Users\Solange\Documents\CodeBLOCKS\basico02.cpp" -o "C:\Users\Solange\Documents\CodeBLOCKS/basico02" && "C:\Users\Solange\Documents\CodeBLOCKS/basico02"]
    [dir: C:\Users\Solange\Documents\CodeBLOCKS]
    [path: C:\ProgramData\Oracle\Java\javapath;C:\Program Files (x86)\Intel\iCLS Client\;C:\Program Files\Intel\iCLS Client\;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\Program Files\Intel\Intel(R) Management Engine Components\DAL;C:\Program Files\Intel\Intel(R) Management Engine Components\IPT;C:\Program Files (x86)\Intel\Intel(R) Management Engine Components\DAL;C:\Program Files (x86)\Intel\Intel(R) Management Engine Components\IPT;C:\Program Files (x86)\ATI Technologies\ATI.ACE\Core-Static;c:\Program Files (x86)\Microsoft SQL Server\100\Tools\Binn\;c:\Program Files\Microsoft SQL Server\100\Tools\Binn\;c:\Program Files\Microsoft SQL Server\100\DTS\bin;]

    ResponderEliminar
  17. Tengo windows 8.1 y descargue sublime text 3. :)

    ResponderEliminar
  18. Si es que eres MiCHI

    ResponderEliminar
  19. Hola amigo primero que todo te doy mis felicitaciones por todas tus entradas del blog,son de gran aporte a la comunidad que le gusta el Sublime. Mi pregunta es con Sublime text 3 donde busco el exec.py y no existe o por lo menos no, en la ruta de arriba. Que se haría en tal caso? y gracias de antemano!

    ResponderEliminar
    Respuestas
    1. a mi me ocurre lo mismo si alguien tiene la solución. es de agradecer. Gracias

      Eliminar
    2. creo que ya tengo la solución

      Un poco de un truco, pero los siguientes trabajó para mí. Resulta que se puede reemplazar el código en algunos de los paquetes por defecto, incluyendo el código responsable de la salida de vía de acceso:

      Vaya a C: \ Archivos de programa \ Sublime Text 3 \ Paquetes
      Extraer Default.sublime-paquete (en realidad es un archivo zip) y obtener el exec.py archivo (no dejar la carpeta extraída dando vueltas en el directorio)
      Cree el directorio por defecto en C: \ Users \ usuario \ AppData \ Roaming \ Sublime Text 3 \ Packages, y lugar exec.py en ella
      Abrir exec.py y comente (lugar # al principio de la línea) la siguiente línea, en la línea 245 para mí

      self.append_string (proc, self.debug_text)

      Reiniciar Sublime Text


      Eliminar
    3. Este comentario ha sido eliminado por el autor.

      Eliminar
    4. Gracias por tu aporte, yo también estoy usando Sublime Text 3 y no encontraba el archivo. Solo una corrección, la línea que tienes que editar es la 199 (Si tienes ST3) ahí verás la misma que en el post y luego lo editas, quedando así:

      199 self.proc = AsyncProcess(cmd, shell_cmd, merged_env, self, **kwargs)
      200 os.system("cmd /C " + " ".join(cmd) + " & echo. & echo [Programa finalizado] & pause")

      Eliminar
  20. Gracias, al fin logre hacerlo funcionar en Sublime Text 3.

    ResponderEliminar
    Respuestas
    1. Como lo hiciste funcionar en el Sublime Text 3? a mi no me sale.

      Eliminar
    2. http://superuser.com/questions/617511/sublime-text-do-not-print-path-of-build-command/654815#654815

      Eliminar
  21. Muchas gracias de antemano amigo me fue de gran ayuda.

    ResponderEliminar
  22. Este comentario ha sido eliminado por el autor.

    ResponderEliminar
  23. Yo también estoy buscando el exec.py en sublime text 3. :/

    ResponderEliminar
  24. Default.sublime-paquete este archivo no esta en sublime text 3. Como le hacemos??

    Cuando intento compilar un programa en sublime me da error con el main y system("pause").
    Errores:

    con el main: In function 'int main()':
    con el systema: error: 'system' was not declared in this scope system("PAUSE");

    Alguna sugerencia.

    ResponderEliminar
    Respuestas
    1. Haz esto: incluye las siguientes librerias:
      #include < conio.h >
      #include < stdlib.h >

      Reemplaza la instrucción System("PAUSE");
      por esta otra instrucción: getch();
      esto hará que tomes un caracter cualquiera, lo mejor de esto es que puedes combinarlo con un mensaje
      cout<<" -----Programa Finalizado presione cualquier tecla para salir-----"; getch();
      return 0;
      también puedes usar system("cls"); para limpiar la consola

      Eliminar
  25. en sublime text 3 (la vercion portable):
    1)copien el archivo "Default.sublime-package" de la carpeta Packages de su instalacion de sublime.
    2) descomprimanlo en alguna carpeta de su escritorio
    3) busquen el exec.py y hagan los cambios que dice el post
    4) peguen el archivo en "Sublime Text 3\Data\Packages\Default\exec.py" (si no existe la carpeta ,la crean)

    ResponderEliminar
    Respuestas
    1. otra manera de hacerlo ,sin tocar los archivos de sublimetext, puede ser usando el comando start de batch. un ejemplito para python :

      {
      "cmd": ["start", "python", "-i", "-u", "$file" ],
      "file_regex": "^[ ]*File \"(...*?)\", line ([0-9]*)",
      "selector": "source.python",
      "shell": true
      }

      Eliminar
    2. en caso quiero que compile en la misma consola de sublime text , no que me llame a la consola de cmd...

      Eliminar
  26. ¿Buenos días Alguien puede ayudarme con esta consulta?
    he instalado el Package Control en Sublime tex 2. Pero no encuentro la opción para instalar Emmet. Gracisa

    ResponderEliminar
  27. como se puede hacer con subime text 3 correctamente para compilar c#

    ResponderEliminar
  28. Lo he intentado y efectivamente me sale el cmd de windows, pero me dice que javac no se rerconose como un comando interno. Nota: al ejecutar y compilar directamente desde el cmd, todo funciona bien.

    ResponderEliminar
    Respuestas
    1. Ya he agregado las variables de entorno por regedit, ya que por el metodo normal no me lo guardaba. AL ejecutar desde consola me funciona ok, pero con sublime text, sigue sin funcionar, dice javac no se reconoce como un comando...

      Eliminar

Publicar un comentario

Si tenéis alguna duda o sugerencia, no dudéis en comentar. ;)

Entradas populares de este blog

Calcular factorial de un numero en JAVA

Ordenar cualquier array con SORT en JAVA

Modificadores de acceso (public, protected y private) JAVA