2008-09-15 13 views
156

Actualmente mi flujo de trabajo con Emacs cuando estoy codificando en C o C++ involucra tres ventanas. El más grande a la derecha contiene el archivo con el que estoy trabajando. La izquierda está dividida en dos, la inferior es un intérprete de comandos que utilizo para escribir o hacer comandos, y la parte superior suele ser algún tipo de documentación o archivo README que quiero consultar mientras estoy trabajando. Ahora sé que hay algunos usuarios de Emacs bastante expertos, y me interesa saber qué otros funcionalidades de Emacs son útiles si se pretende utilizarlo como un IDE completo. En concreto, la mayoría de los entornos de desarrollo por lo general cumplen estas funciones es una forma u otra:Usando Emacs como un IDE

  • editor de código fuente
  • Compilador
  • Depuración
  • de búsqueda de documentación
  • de control de versiones
  • características OO como consulta de clase y objeto inspector

Para algunos de estos, es bastante obvio cómo Emacs puede adaptarse a estas funciones, pero ¿qué pasa con el resto? Además, si se debe enfocar un lenguaje específico, diría que debería ser C++.

Edit: Un usuario señaló que debería haber sido más específico cuando dije '¿qué pasa con el resto'. Mayormente tenía curiosidad sobre el control de versión eficiente, así como la búsqueda de documentación. Por ejemplo, en SLIME es bastante fácil hacer una búsqueda rápida de hiperespec en una función Lisp. ¿Hay alguna manera rápida de buscar algo en la documentación C++ STL (si olvidé la sintaxis exacta de hash_map, por ejemplo)?

+5

Las preguntas y todas las respuestas están perdiendo totalmente el punto IDE principal. Pero primero no me malinterpreten: creo que no hay ni un solo IDE (además de algunos raros Lisp/Scheme) que se acercan a lo que Emacs puede ofrecer. ** SIN EMBARGO ** IDE modernos hacen cosas como esta: resaltado instantáneo de probables errores de codificación (incluso en AST parciales no compilables). IntelliJ IDEA lo hace: si usa, digamos, * @ NotNull *, le avisará, en tiempo real, sobre posibles violaciones. Luego está toda la * "codificación por intención" *: simplemente no funciona (todavía) bajo Emacs. – SyntaxT3rr0r

+18

Otra área donde el IDE bueno realmente puede brillar: la finalización del código contextual (una vez más, incluso en archivos fuente no compilables e imparciales). La terminación de código contextual completa * hippie-expand * cualquier día como si no fuera gracioso: simplemente avergüenza a Emacs. Una vez más, estoy muy triste de que los "editores de texto" de IDE sean baratos, patéticos, estúpidos y patéticos cuando se comparan con Emacs. Pero los IDEs buenos brillan en una gran área (como la refactorización, la finalización del código contextual, las advertencias en tiempo real, etc.) donde Emacs básicamente no está en ninguna parte. Dame Emacs en el medio de mi IDE que decía. Estoy deseando ese día. – SyntaxT3rr0r

+0

¿Qué pasa con el colapso del código? – AlwaysLearning

Respuesta

70

Tendrás que ser específico en cuanto a lo que quieres decir con "el resto". Excepto por el inspector de objetos (que yo "estoy consciente de), emacs hace todo lo anterior con bastante facilidad:.

  • editor (obvio)
  • compilador - basta con ejecutar M-x compile e introduzca su mandato de compilación A partir de ahí, puede simplemente M-x compile y usar el valor predeterminado. Emacs capturará errores del compilador C/C++ (funciona mejor con GCC) y lo ayudará a navegar a líneas con advertencias o errores.
  • Depuración: similarmente, cuando desee depurar, escriba M-x gdb y creará un búfer gdb con enlaces especiales
  • Búsqueda de documentación - emacs tiene excelente CSc enlaces operativos para la navegación de código. Para otra documentación: Emacs también tiene un lector de páginas, y para todo lo demás, está la web y los libros.
  • control de versiones - hay un montón de enlaces de Emacs para varios motores de control de versiones (CVS, SCCS, RCS, SVN, GIT todos vienen a la mente)

Editar: Me doy cuenta de que mi respuesta acerca de las operaciones de búsqueda de documentación en realidad se refería a código navegación.Aquí hay más información, al grano:

La búsqueda en Google sin dudas revelará más ejemplos.

Como muestra el segundo enlace, se pueden buscar funciones (y otras) en otra documentación, incluso si no se admiten de fábrica.

+3

¿no debería ser eso "compilación M-x"? – Svante

+0

Sí, M-x es correcto. A eso me refería. –

+1

Creo que GNU global es superior a CScope en estos días: http://www.gnu.org/software/global/ –

19

En lugar de ejecutar un comando make en la ventana del shell, ¿ha intentado compilar M-x? Ejecutará el comando make, mostrará los errores y, en muchos casos, hará que sea muy fácil saltar a la línea de código que provocó el error si el resultado incluye nombres de archivos y números de línea.

Si eres fanático de los IDEs, también deberías consultar el paquete de la barra de velocidad de emacs (barra de velocidad M-x). Y, si aún no lo ha hecho, aprenda cómo usar tablas de etiquetas para navegar su código.

7

Estoy de acuerdo en que debe aprender acerca de M-x compile (vincular eso y M-x next-error con una breve secuencia de teclas).

Más información sobre los los enlaces para el control de versiones (por ejemplo vc-diff, vc-junto-acción, etc.)

mirada en los registros. No solo puede recordar ubicaciones en búferes sino configuraciones de ventanas enteras (C-x r w - configuración de ventana para registrar).

29

Tengo que recomendar Emacs Code Browser como un entorno de estilo IDE más "tradicional" para emacs.

EDIT: También recomiendo Magit altamente sobre la interfaz VCS estándar en emacs.

+0

Debería poder editar la publicación, parece que tiene suficiente reputación. – baudtack

3

compilar, el siguiente error y el error anterior son todos comandos bastante importantes para el desarrollo de C++ en Emacs (funciona muy bien en la salida de grep también). Etags, visit-tags-table y find-tag también son importantes. completion.el es uno de los grandes hacks no reconocidos del siglo XX, y puede acelerar tu piratería en C++ en un orden de magnitud. Ah, y no olvidemos ediff.

Todavía tengo que aprender a usar el control de versiones sin visitar un shell, pero ahora que estoy ejecutando commits mucho más frecuentemente (con git) probablemente tendré que hacerlo.

6

Un punto de partida (que puede no ser obvio) para explorar las características de VC de Emacs es M-x vc-next-action.

Realiza la "siguiente operación de control de versión lógica" en el archivo actual, según el estado del archivo y el backend de VC. Entonces, si el archivo no está bajo control de versión, lo registra, si el archivo ha sido cambiado, los cambios son enviados, etc.

Me lleva un tiempo acostumbrarme, pero me parece muy útil.

combinación de teclas por defecto es C-x v v

8

Para el control de versiones, hay varias cosas que se pueden utilizar, dependiendo del sistema de control de versiones que utilice. Pero parte de la funcionalidad es común a todos ellos.

vc.el es la forma integrada para manejar el control de versiones a nivel de archivo. Tiene backends para la mayoría de los sistemas de control de versiones. Por ejemplo, el backend de Subversion viene con Emacs, y hay backends git y otros disponibles de otras fuentes.

El comando más útil es C-x v v (vc-next-action) que realiza la siguiente acción apropiada para el archivo que está visitando. Esto puede significar la actualización desde el repositorio o la confirmación de sus cambios, vc.el también vuelve a enlazar C-x C-q para registrar y eliminar archivos si está utilizando un sistema que lo necesita (como RCS).

Otros comandos son muy útiles C-x v l y C-x v = que le muestre el registro y diff actual para el archivo que está utilizando.

Pero para la productividad real, debe evitar usar los comandos de un solo archivo vc.el que no sean para cosas simples. Hay varios paquetes que pueden darle una visión general del estado de su árbol completo, y darle más poder, y sin mencionar la capacidad de crear compromisos coherentes que abarcan varios archivos.

mayoría de estos están muy influenciados o basado en el original pcl-cvs/PCVs para CVS. Incluso hay dos de ellos que vienen con subversión, psvn.el y dsvn.el. Hay paquetes para git, etc.

10

Puede encontrar una descripción detallada de emacs & integración de control de versión en my site. También estoy trabajando en un artículo sobre el uso de Emacs como entorno de desarrollo para muchos idiomas: C/C++, Java, Perl, Lisp/Scheme, Erlang, etc ...

15

Hay esquinas de emacs que una vez descubiertas te hacen más productivo en formas que nunca pensaste. Como han mencionado otros, el uso de etiquetas es una forma fantástica y rápida de ampliar el código fuente y, a través de M-/(dabbrev-expand), a menudo se hace exactamente lo que se espera al completar un nombre de variable.

El uso de ocurrir es útil para obtener un búfer con todas las ocurrencias de una expresión regular en un búfer. Eso es realmente útil cuando se refactura el código y se buscan fragmentos de código o usos de variables, o si se usan marcadores TODO en los archivos fuente y se desean visitar todos.

flush-lines, sort-numeric-fields, replace-regexp y funciones rectangulares pueden ser realmente útiles para tomar un volcado de alguna herramienta y convertirla en datos útiles como un programa elisp o una hoja de cálculo delimitada por comas.

me escribió una página sobre IDE como las cosas que puede hacer con emacs

http://justinsboringpage.blogspot.com/2007/09/11-visual-studio-tricks-in-emacs.html

Aprender elisp es una otra gran manera de responder por sí mismo lo que emacs más puede hacer más allá de lo que es un IDE típico puede hacer.

Por ejemplo he escrito en su blog acerca de Perforce funciones de ayuda al igual que la culpa (la escritura de su propia significa que puede hacer que se comporte exactamente como usted quiere) ...

http://justinsboringpage.blogspot.com/2009/01/who-changed-line-your-working-on-last.html

también he código escrito que crea dinámicamente comentarios para una función en el punto, que coincida con los estándares de codificación con los que estoy trabajando.

Ninguno de mi código elisp es particularmente bueno, y la mayor parte ya existe en las bibliotecas, pero es realmente útil para hacer que emacs haga cosas personalizadas que surgen durante un día laboral.

2

En búsqueda de documentación: eso depende de su (s) lenguaje (s) de programación.

Las bibliotecas de C y las llamadas al sistema generalmente se documentan en las páginas man.Para eso puedes usar M-x man. Algunas cosas se pueden documentar mejor en las páginas de información; use M-x info.

Para elisp en sí, use C-h f. Para Python, use >>> help(<function, class, module>) en el intérprete.

Encuentro que la mayoría de los otros idiomas ofrecen documentación en formato html. Para eso, intente con un navegador integrado (uso w3m). Establezca su variable de entorno BROWSER en un script de contenedor alrededor de emacsclient -e "(w3m-goto-url-new-session \"[email protected]\")" (en * nix), en caso de que algo pueda abrir un navegador y desee que se abra dentro de emacs.

3

También puede encontrar tabbar útil. Emula el único comportamiento que perdí al pasar de Eclipse a Emacs. Vinculado a "," y "." para pasar a la barra de pestañas anterior y siguiente, lo revive de cambiar el búfer por Ctrl-x b todo el tiempo.

Desafortunadamente, la página web mencionada no proporciona la versión correcta para descargar. La mayoría de las versiones de Ubuntu, sin embargo, lo entregan en sus paquetes de emacs-goodies.

+1

Genial, estaba buscando una forma de obtener una versión más nueva de tabbar. Para aquellos que no están en Ubuntu, puedes encontrarlo aquí. http://packages.ubuntu.com/karmic/emacs-goodies-el – Ibrahim

4

Hay un TFS.el for emacs integration into Microsoft TFS. Funciona con cualquier TFS, incluido el TFS que ejecuta Codeplex.com.

pasos básicos para la instalación:

  1. Lugar tfs.el en su load-path.

  2. En el fichero .emacs:

    (require 'tfs) 
    (setq tfs/tf-exe "c:\\vs2008\\common7\\ide\\tf.exe") 
    (setq tfs/login "/login:domain\\userid,password") 
         -or- 
    (setq tfs/login (getenv "TFSLOGIN")) ;; if you have this set 
    
  3. también en el fichero .emacs, establecer asociaciones de teclas locales o globales para los comandos de TFS. de este modo:

    (global-set-key "\C-xvo" 'tfs/checkout) 
    (global-set-key "\C-xvi" 'tfs/checkin) 
    (global-set-key "\C-xvp" 'tfs/properties) 
    (global-set-key "\C-xvr" 'tfs/rename) 
    (global-set-key "\C-xvg" 'tfs/get) 
    (global-set-key "\C-xvh" 'tfs/history) 
    (global-set-key "\C-xvu" 'tfs/undo) 
    (global-set-key "\C-xvd" 'tfs/diff) 
    (global-set-key "\C-xv-" 'tfs/delete) 
    (global-set-key "\C-xv+" 'tfs/add) 
    (global-set-key "\C-xvs" 'tfs/status) 
    (global-set-key "\C-xva" 'tfs/annotate) 
    (global-set-key "\C-xvw" 'tfs/workitem) 
    
+0

Um ... ¿esto es una defensa seria al poner su contraseña en texto plano en su archivo .emacs? –

+0

@ T.E.D. - no, solo una ilustración. Los secretos deben almacenarse en otro lugar y leer de elisp. – Cheeso

3

uso emacs en Windows. el módulo de compilación es agradable, pero quería compilar para ser más inteligente sobre la línea de comandos de compilación que sugiere. It's possible to use "File Variables" to specify compile-command, pero yo quería algo un poco más inteligente que eso. Entonces escribí una pequeña función para ayudar. Adivina el comando de compilación que se utilizará para avisarle al usuario cuando ejecute compile.

La función de adivinar busca un archivo vbproj o csproj o sln, y si se encuentra, sugiere msbuild. Luego mira el nombre del archivo de almacenamiento intermedio y, dependiendo de eso, sugiere cosas diferentes. Un archivo .wxs significa que es un proyecto WIX, y es probable que desee construir un MSI, por lo que la lógica de adivinación sugiere un comando nmake para el MSI. Si se trata de un módulo Javascript, la sugerencia es ejecutar jslint-for-wsh.js para eliminar el archivo .js. Como una alternativa, sugiere nmake.

El código que utilizo tiene el siguiente aspecto:

(defun cheeso-guess-compile-command() 
    "set `compile-command' intelligently depending on the 
current buffer, or the contents of the current directory." 
    (interactive) 
    (set (make-local-variable 'compile-command) 
     (cond 
     ((or (file-expand-wildcards "*.csproj" t) 
      (file-expand-wildcards "*.vcproj" t) 
      (file-expand-wildcards "*.vbproj" t) 
      (file-expand-wildcards "*.shfbproj" t) 
      (file-expand-wildcards "*.sln" t)) 
     "msbuild ") 

     ;; sometimes, not sure why, the buffer-file-name is 
     ;; not set. Can use it only if set. 
     (buffer-file-name 
     (let ((filename (file-name-nondirectory buffer-file-name))) 
      (cond 

      ;; editing a .wxs (WIX Soluition) file 
      ((string-equal (substring buffer-file-name -4) ".wxs") 
      (concat "nmake " 
        ;; (substring buffer-file-name 0 -4) ;; includes full path 
        (file-name-sans-extension filename) 
        ".msi")) 

      ;; a javascript file - run jslint 
      ((string-equal (substring buffer-file-name -3) ".js") 
      (concat (getenv "windir") 
        "\\system32\\cscript.exe c:\\users\\cheeso\\bin\\jslint-for-wsh.js " 
        filename)) 

      ;; something else - do a typical .exe build 
      (t 
      (concat "nmake " 
        (file-name-sans-extension filename) 
        ".exe"))))) 
     (t 
     "nmake ")))) 


(defun cheeso-invoke-compile-interactively() 
    "fn to wrap the `compile' function. This simply 
checks to see if `compile-command' has been previously set, and 
if not, invokes `cheeso-guess-compile-command' to set the value. 
Then it invokes the `compile' function, interactively." 
    (interactive) 
    (cond 
    ((not (boundp 'cheeso-local-compile-command-has-been-set)) 
    (cheeso-guess-compile-command) 
    (set (make-local-variable 'cheeso-local-compile-command-has-been-set) t))) 
    ;; local compile command has now been set 
    (call-interactively 'compile)) 

;; in lieu of binding to `compile', bind to my monkeypatched function 
(global-set-key "\C-x\C-e" 'cheeso-invoke-compile-interactively) 

Intenté hacer esto como "antes de consejos" para la función de compilación, pero no pudo conseguir que funcione de manera satisfactoria. Así que definí una nueva función y la até a la misma combinación de teclas que he estado usando para compile.


EDITAR ahora hay "smarter-compile.el", que lleva esta idea un paso más allá.

7

Bien, todos aquí están dando pistas perfectas para hacer que emacs sea un IDE excelente.

Pero cualquiera debe tener en cuenta que, cuando personaliza sus emacs con mucha extensión (especialmente con los de comprobación de tipos sobre la marcha, búsquedas de definición de funciones, etc.) sus emacs se cargarán muy, muy lentamente para una editor.

Para solucionar este problema, recomendaría usar emacs en server mode.

Es bastante simple de usar, no necesita personalizar su archivo init. Solo necesita iniciar emacs en modo daemon;

emacs --daemon 

Esto creará un servidor de emacs, a continuación, se puede conectar ya sea desde el terminal, o desde la GUI. También recomendaría crear algunos alias para que sea más fácil llamar.

alias ec="emacsclient -t" 
alias ecc="emacsclient -c &" 
# some people also prefer this but no need to fight here; 
alias vi="emacsclient -t" 

De esta manera, emacs se disparará incluso más rápido que gedit, lo prometo.

El posible problema aquí, si está ejecutando el daemon de emacs de su usuario ocasional, probablemente no pueda conectar el servidor de emacs como root.

Por lo tanto, si necesita abrir un archivo que tenga acceso de administrador; use tramp en su lugar. Simplemente ejecute su cliente de emacs con su usuario normal y abra archivos como este;

C-x C-f 
/sudo:[email protected]/some/file/that/has/root/access/permissions 
# on some linux distro it might be `/su:[email protected]` 

Este hecho mi vida más fácil, no puedo abrir mi entorno de programación Python personalizado pesada en milisegundos de esta manera. También puede agregar emacs --daemon al inicio de su sistema, o crear un archivo de escritorio para emacsclient. Eso depende de usted.

Más sobre el cliente emacs daemon y emacs se puede encontrar en wiki;

http://www.emacswiki.org/emacs/EmacsAsDaemon

http://www.emacswiki.org/emacs/EmacsClient

+0

Sé que esto es cinco años después, pero también lo estaba usando en ese momento: si configura 'EDITOR =" emacsclient -t "VISUAL =" emacsclient -c "' puede hacer una edición basada en sudo con 'sudo- e' o 'sudoedit', que a veces es preferible al uso de TRAMP (generalmente por razones de auditoría). También puede invocar emacsclient con '--alternate-editor =' (* necesita * el espacio al final) y se iniciará el daemon si no se está ejecutando, lo que elimina la necesidad de poner al daemon en el inicio del sistema si ' Estoy dispuesto a esperar la * primera * vez que ejecuta el editor en cada arranque. – Darael

1

En los últimos años, Clang convirtió en una parte importante del apoyo del Emacs C++. Atila Neves tuvo una charla sobre CppCon 2015: "Emacs as a C++ IDE"

Es una charla 16 minutos, donde se muestra soluciones para los siguientes temas:

  • Saltar a la definición
  • Auto-realización
  • En resaltado de sintaxis
  • Buscar archivo en el proyecto -la marcha

Sli des se puede encontrar here.

0

En el estilo de Windows Unix o X, no sé si hay un IDE integrado que funcione para todo.

Para interactuar con los depuradores, solo un componente de un IDE, considere realgud.Otra cosa que me parece útil son los analizadores de mensajes de ubicación, por lo que si tiene un seguimiento de pila de llamadas y desea editar en un lugar determinado de la pila de llamadas, esta interfaz de front-end podrá hacerlo.

De lejos, este programa podría mejorar. Pero también podría utilizar a las personas que trabajan en él para mejorarlo.

responsabilidad: yo trabajo en realgud