GNU/Emacs - Comandos básicos I

3 de November de 2006, a las 20:45  

GNU/Emacs No hay comentarios »

Los comandos que pongo aquí son de la forma C-x, M-x, esto quiere decir, en el caso de C-x que debemos pulsar la tecla CONTROL y a la vez la tecla x. En el caso de M-x debemos pulsar la tecla META (ALT ó ESC) y a la vez la tecla x. Bueno, una vez aclarado esto paso a listar un resumen de los comandos básicos.

Nota: Entre paréntesis pondré el nombre largo del comando por ejemplo find-file, que se corresponde con el atajo C-x C-f, con lo cual podremos ejecutar este comando o bien mediante el atajo o bien haciendo M-x find-file RETURN.

Abrir, insertar y guardar ficheros

  • C-x C-f (find-file): Abre un fichero existente o si no abre uno nuevo.
  • C-x C-v (find-alternate-file): Carga un fichero diferente en ese mismo buffer, nos sirve si por ejemplo queriamos abrir un fichero y nos hemos equivocado al escribir el nombre.
  • C-x i (insert-file): Inserta el contenido de un fichero dentro del buffer actual (en la posición del cursor).
  • C-x C-s (save-buffer): Guarda el contenido del buffer en el fichero asociado (y si no lo tiene pregunta el nombre de fichero con el que guardarlo).
  • C-x C-w (write-file): Guarda el contenido del buffer preguntando el nombre del fichero en el que guardar.
  • C-x C-c : Sale de emacs, preguntando si guardar los cambios o no en caso de que hayan buffers modificados sin guardar.

Ayuda

  • C-h ? (help): Muestra las opciones de ayuda de Emacs.
  • C-h t (help-with-tutorial): Inicia un tutorial de introducción a Emacs.
  • C-h k (describe-key): Muestra información sobre una combinación de teclas. Por ejemplo C-h k C-x i muestra una descripción del comando insert-file.
  • C-h f (describe-function): Muestra información sobre un comando. La información mostrada es la misma que en el anterior pero en lugar de pasarle una combinación de teclas le pasamos el comando directamente.

Moviéndonos por los ficheros

  • C-f (forward-char): Mueve el cursor un carácter hacia adelante.
  • C-b (backward-char): Mueve el cursor un carácter hacia atrás.
  • C-p (previous-line): Mueve el cursor a la línea anterior.
  • C-n (next-line): Mueve el cursor a la línea siguiente.
  • M-f (forward-word): Mueve el cursor una palabra hacia adelante.
  • M-b (backward-word): Mueve el cursor una palabra hacia atrás.
  • C-a (beginning-of-line): Mueve el cursor al principio de la línea.
  • C-e (end-of-line): Mueve el cursor al final de la línea.
  • M-a (backward-sentece): Mueve el cursor una frase hacia atrás.
  • M-e (forward-sentece): Mueve el cursor una frase hacia adelante.
  • M-{ (backward-paragraph): Mueve el cursor un párrafo hacia atrás.
  • M-} (forward-paragraph): Mueve el cursor un párrafo hacia adelante.
  • C-x [ (backward-page): Mueve el cursor una página hacia atrás.
  • C-x ] (forward-page): Mueve el cursor una página hacia adelante.

    Nota: Emacs se mueve entre páginas usando un delimitador de página (que se define mediante la variable page-delimiter). En el modo texto el delimitador de página (no imprimible) se puede insertar mediante C-q C-l (L minúscula), que insertará ^L que aunque parezcan dos carácteres es uno solo.

  • C-v (scroll-up): Avanza una pantalla hacia adelante, mostrando dos líneas de la pantalla anterior.
  • M-v (scroll-down): Avanza una pantalla hacia atrás
  • M-> (end-of-buffer): Lleva el cursor al final del fichero.
  • M-< (beginning-of-buffer): Lleva el cursor al principio del fichero.
  • M-x goto-line n RETURN: Mueve el cursor a la línea n del fichero.
  • M-x goto-char n RETURN: Mueve el cursor al carácter n del fichero.

Repetir comandos

  • M n (digit-argument): Repite el comando escrito a continuación n veces.
  • C-u n (universal-argument): Hace exactamente lo mismo que la anterior.
  • C-u: Este comando sin argumentos repite el comando escrito a continuación 4 veces. Si hacemos C-u C-u lo repetiría 16 veces, C-u C-u C-u 64 veces, etc.

Redibujar la pantalla

  • C-l (recenter): Redibuja la pantalla, poniendo la línea actual en el centro.

    Este comando es útil cuando por ejemplo estamos editando en consola y el kernel nos tira mensajes, con este comando emacs redibuja la pantalla con la información del buffer. También nos es útil si estamos editando una porción de texto que nos aparece al final del display, usamos este comando y nos centra la línea actual, así vemos lo que tenemos por encima y por debajo.

Haciendo amigos en C++

3 de November de 2006, a las 15:25  

C++, Programación 1 comentario »

Mediante el uso de la palabra clave friend podemos permitir el acceso a miembros privados o protegidos de una clase a funciones que no pertenecen a esa clase o a permitir el acceso a otras clases. Veremos dos casos ejemplo, declarando una función como friend dentro de la interfaz pública de una clase y declarando una clase como amiga.

Funciones friend

Cuando declaramos una función como friend en una clase estamos indicando que esa función tendrá acceso a los miembros privados de la clase, pero la función en cuestión no forma parte del ámbito de la clase. Veamos un ejemplo:

Supongamos que tenemos una clase que representa un número racional como un par de números enteros. Queremos que este tipo nuevo se pueda usar de igual forma que int, double,... así:

 
Racional r(2,3);
cout &lt;&lt; r &lt;&lt; endl;
 

Para poder hacer esto necesitamos sobrecargar el operador de inserción binario operator<<:

 
class Racional
{
     friend ostream &amp;operator&lt;&lt;(ostream &amp;out, const Racional &amp;r);
     public:
 
     Racional(int numerador, int denominador);
     ~Racional();
     // ...
};
 

De esta manera la función friend obtiene acceso completo a los miembros de Racional. La implementación de esta función se haría, fijándonos en que no pertenece al ámbito de la clase:

 
ostream &amp;operator&lt;&lt;(ostream &amp;out, const Racional &amp;r)
{
     // Acceso a los miembros privados de Racional para mostrar r.
     // ...
 
     return out;
}
 

Podríamos haber declarado la función como no friend, entonces tendríamos que usar métodos públicos get(), set() para obtener los valores, usando friend podemos acceder directamente a los miembros, y además la función forma parte de la interfaz pública de la clase Racional.

Clases friend

Además de declarar una función no miembro como friend, podemos declarar funciones miembro de otras clases como friend, así como otras clases como clases amigas.

Las clases amigas se usan en casos donde una clase está íntimamente ligada a otra. Por ejemplo supongamos que tenemos una clase Punto que representa una coordenada, y una clase ColeccionPunto que guarda una lista de puntos. Como la colección quizá necesite manipular objetos Punto, podemos declarar ColeccionPunto como amiga de la clase Punto:

 
// Clase Punto
class Punto
{
     friend ColeccionPunto;
 
     public:
     Punto(double x, double y) :
     m_x(x),
     m_y(y)
     {
     }
 
     ~Punto();
     // ...
 
     private:
     double m_x;
     double m_y;
};
 

Como la clase ColeccionPunto esta declarada como friend, puede acceder a los datos internos de cualquier objeto Punto. Una cosa importante es que esta amistad no es mútua, aunque ColeccionPunto puede acceder a Punto no se da el caso inverso. Además la amistad no es heredable, las clases que deriven de ColeccionPunto no podrán acceder a Punto. El principio detrás de esto es que la amistad no se concede de forma implícita sino que cada clase debe especificar de forma explícita sus amigos.

RSS entradas RSS Comentarios Log in