emacs ide development-environment slime

Usando Emacs como un IDE



emacs slime (16)

De acuerdo, todos aquí están dando consejos perfectos para hacer que emacs sea un gran IDE.

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.), su emacs se cargará muy, muy lento para un editor.

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

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

emacs --daemon

Esto creará un servidor emacs, luego puede conectarlo desde la terminal o desde la interfaz gráfica de usuario. 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 forma, emacs se disparará incluso más rápido que gedit, promesa.

El único problema posible 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 a la raíz; use tramp lugar. Simplemente ejecute su cliente de emacs con su usuario normal y abra archivos como este;

C-x C-f /sudo:root@localhost/some/file/that/has/root/access/permissions # on some linux distro it might be `/su:root@...`

Esto hizo mi vida más fácil, puedo abrir mi pesado IDE Python personalizado 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.

Se puede encontrar más información sobre el cliente emacs daemon y emacs en wiki;

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

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

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. Específicamente, la mayoría de los IDE generalmente cumplen estas funciones de una forma u otra:

  • Editor de código fuente
  • Compilador
  • Depuración
  • Búsqueda de documentación
  • Control de versiones
  • OO funciones como búsqueda de clases e inspector de objetos

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 ++.

Editar: 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)?


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

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


En el estilo de Windows de 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 usar mejoras. Pero también podría utilizar a las personas que trabajan en él para mejorarlo.

Descargo de responsabilidad: trabajo en realgud


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

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

Para elisp mismo, use Ch 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 envoltorio alrededor de emacsclient -e "(w3m-goto-url-new-session /"$@/")" (en * nix), en caso de que algo pueda abrir un navegador y desee que se abra dentro de emacs.


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

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

  • Salta a la definición
  • Autocompletar
  • Resaltado de sintaxis sobre la marcha
  • Buscar archivo en proyecto

Las diapositivas se pueden encontrar here .


En lugar de ejecutar un comando make en la ventana del shell, ¿ha intentado compilar Mx? 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 Mx). Y, si aún no lo ha hecho, aprenda cómo usar tablas de etiquetas para navegar su código.


Estoy de acuerdo en que debes aprender acerca de la compilación de Mx (vincula eso y el siguiente error de Mx con una breve secuencia de teclas).

Obtenga información acerca de los enlaces para el control de versiones (por ejemplo, vc-diff, vc-next-action, etc.)

Mire en los registros. No solo puede recordar ubicaciones en búferes sino configuraciones de ventana completas (Cx rw - configuración de ventana para registrar).


Hay rincones de emacs que una vez descubiertos te hacen más productivo de una forma 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.

Usar 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.

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

Escribí una página sobre IDE como cosas que puedes hacer con emacs

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

Learning elisp es otra excelente forma de responder por ti mismo qué más puede hacer emacs más allá de lo que un IDE típico puede hacer.

Por ejemplo, escribí en un blog sobre la escritura de funciones de ayuda de Perforce como culpa (escribir tus propios medios significa que puedes hacer que se comporte exactamente como quieras) ...

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

También escribí un código que crea dinámicamente comentarios para una función en el punto, que coincide con los estándares de codificación con los que estoy trabajando.

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


Hay un TFS.el para la integración de emacs en Microsoft TFS . Funciona con cualquier TFS, incluido el TFS que ejecuta Codeplex.com.

Pasos básicos para la configuración:

  1. Coloque tfs.el en su ruta de carga.

  2. En su archivo .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 su archivo .emacs, establezca enlaces de teclas locales o globales para los comandos tfs. al igual que:

    (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)


Para el control de versiones, hay varias cosas que puede usar, dependiendo del sistema de control de versiones que use. 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 archivos. 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 Cx vv (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 los cambios, vc.el también vuelve a enlazar Cx Cq para registrar y eliminar archivos si está utilizando un sistema que lo necesita (como RCS).

Otros comandos muy útiles son Cx vl y Cx v = que le muestran el registro y la diferencia actual para el archivo que está utilizando.

Pero para una productividad real, debe evitar usar los comandos vc.el de un solo archivo 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.

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


Puede encontrar una descripción detallada de emacs y la integración del control de versiones en mi sitio . 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.


También puede tabbar útil tabbar . 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.

Lamentablemente, 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.


Tendrás que ser específico en cuanto a lo que quieres decir con "el resto". A excepción del inspector de objetos (que yo conozco), emacs hace todo lo anterior con bastante facilidad:

  • editor (obvio)
  • compilador: simplemente ejecute Mx compile e ingrese su comando de compilación. A partir de ahí, puede simplemente Mx compile y usar Mx compile defecto. Emacs capturará los errores del compilador C / C ++ (funciona mejor con GCC) y lo ayudará a navegar a líneas con advertencias o errores.
  • Depuración: del mismo modo, cuando desee depurar, escriba Mx gdb y creará un búfer gdb con enlaces especiales
  • Búsqueda de documentación: emacs tiene excelentes enlaces de CScope para 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 muchos enlaces Emacs para varios backends VCS (CVS, SCCS, RCS, SVN, GIT todos vienen a la mente)

Editar: me doy cuenta de que mi respuesta sobre la búsqueda de documentación realmente se refería a la navegación por código. Aquí hay más información al momento:

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

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


Un punto de partida (que puede no ser obvio) para explorar las características de VC de Emacs es Mx 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 toma un tiempo acostumbrarme, pero me parece muy útil.

La combinación de teclas predeterminada es Cx vv


Yo 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. Es posible usar "Variables de archivo" para especificar compile-command , pero 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 debe usar para avisar al usuario al ejecutar la 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 uso se ve así:

(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 "consejo previo" para la función de compilación pero no pude hacer que funcionara satisfactoriamente. 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á.


compilar, next-error y previous-error 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 tenga que hacerlo.