| 
 
 | 
 | 
 
 | 
vim editor
Para ver el archivo de ayuda:
    : help o simplemente el comando :h
    :help motion da ayuda sobre las ordenes de motion (movimiento) etc.
    Ctrl-T o Ctrl-o regresa a la posición previa de la ayuda.
    En general ctrl-o brinca en las posiciones hacia atrás y ctrl-i brinca 
    hacia adelante.
    :help ope Ctrl-d en vez de Enter muestra todos los temas de ayuda que contengan 
    las letras ope., Ej:
    :help ope <Ctrl-d>
    :open cscope 'nocscopetag'
    'open' Cscope cscopeverbose
    operator :cscope cscope-options
    'operatorfunc' +cscope 'cscopeverbose'
    opening-window :scscope cscopetagorder
    :map-operator :lcscope cscopepathcomp
    zOS-open-source :foldopen cscopequickfix
    new-operator-mod 'slowopen' cscope-howtouse
    OS390-open-source 'foldopen' cscope-commands
    visual-operators cscopetag 'cscopequickfix'
    win32-open-with-menu cscopeprg 'cscopepathcomp'
    blockwise-operators 'cscopeprg' 'cscopetagorder'
    new-define-operator 'cscopetag' 'nocscopeverbose'
    Operator-pending cscope-find cscope_connection()
    Operator-pending-mode cscope-info cscope-limitations
    :cope :folddoopen cscope-suggestions
    :lopen cscope-win32
    :copen cscope-intro
    FUNDAMENTOS:
    Forma general de los comandos
    [n] operator [m] object
    n es el número de veces que el operador se ejecuta
    m es el número de objetos
    Si ambos se especifican entonces es m*n
    Comandos son: 
    c (change), d (delete), y (yank), w, b, gg, /, n, Ctrl-G, m etc.
    Algunos son con una sola letra, otros con dos, otros con : y otros con Ctrl.
    La mayoría se hacen en el modo normal, otros estando en el de inserción 
    como
    Ctrl-W(borra palabra), Ctrl-U (borra línea) Ctrl-T inserta indent, 
    Ctrl-d lo borra etc.
Objetos representan un bloque de texto:
    (word, frase, paragrafo o sección)
    Se pueden representar por un comando de movimiento de cursor o un pattern-matching.
    2cw borra las siguientes dos palabras e inicia el modo de inserción
    d} delete hasta el siguiente paragrafo
    La mayoría de los comandos no se ven en la pantalla pero algunos se 
    ven en la
    última línea de la pantalla: / ? : !
Si la línea actual es el object de la operación, el operador 
    es igual al objeto,
    cc, dd, yy etc.
La filosofía de VIM es usar visual mode cuando no se aplique a un 
    objeto conocido.
    Ctrl-Q activa visual block (Ctrl-V e linux) para columnas etc.
    Shift-V o V activa visual line
    v activa el modo visual normal
    ----------------------------------------------------------
Para activar la corrección ortográfica en inglés: (viene 
    por defecto)
    :setlocal spell spelllang=en_us
    :digraphs
    muestra todos los caracteres extras que se pueden obtener pulsando ctrl-K 
    y luego dos teclas
Operaciones de movimiento
    gg Va al inicio del archivo
    G a la ultima linea
    G$ al final del archivo
    $ o end al final de la linea
    '' va a la posición previa (hay mas en la sección de la ayuda 
    sobre marcas)
    Ctrl-o brinca hacia atrás a las posiciones previas, (Flechas en firefox)
    Ctrl-i brinca hacia adelante
    0 o home al inicio
    Para moverse con letras y no con flechas, asociar la j con una flecha
    apuntando hacia abajo.
    % Ubicándose en una { o [ o ( etc., brinca a la pareja.
    En archivos de programación, gd va a la declaración local de 
    una variable
    [{ nos lleva al inicio de un bloque en lenguaje C.
Esc conmuta del modo de entrada al de órdenes.
    a (añade) o i (inserta) o ins llevan del modo de órdenes al 
    de entrada
    La mejor parte de la ayuda es el |howto do common things|
    No todos los comandos son con ":", por ejemplo u va deshaciendo 
    de una (este es el sentido del modo de órdenes), ^R rehace inmediatamente, 
    etc, mas bien aquellos que requieren informacion adicional o parámetros, 
    son los que requieren los :
    Sin embargo para deshacer movidas de bloques o copiados toca :u
    En la ayuda usar ^] (CTRL-]) para seguir los enlaces de los tags, sin necesidad 
    de usar Alt Gr.
    El archivo de configuración de vi es .vimrc y se encuentra en el raíz 
    del 
    usuario.
Para afectar una region de texto se puede hacer de tres maneras:
    1. Con visual mode, dando la orden v, iluminando y luego el operador,
    2. Dando el operador y luego una orden de movimiento
    3. Dando un rango y luego el comando
    Ejs:
    Con visual mode: se da v, se ilumina y luego gU, para poner mayusculas.
    O dando gU y luego una orden para mover, como w, o flecha para abajo, o 
    $ para ir al final de linea etc. entonces hasta donde se mueve queda
    afectado, en este caso con mayúsculas.
    :1,5s/this/that/g
    Executes the substitute command on the lines 1 to 5. Line 5 is included.
    Por ejemplo para reemplazar (substitute) en todo el documento la palabra hola 
    por la palabra asi:
    :%s/hola/asi/g
    /g es un flag que indique que reemplaze todas las palabras en cada línea 
    y no solo la primera
    Con dos flags: el g que ya sabemos y la i para que ignore mayúsculas
    :%s/hola/asi/gi
    Typear :help :substitute para la ayuda completa
Sobre rangos:
The ":substitute" command, and many other : commands, can be applied 
    to a
    selection of lines. This is called a range.
    The simple form of a range is {number},{number}. For example: >
    :1,5s/this/that/g
    Executes the substitute command on the lines 1 to 5. Line 5 is included.
    The range is always placed before the command.
Otras maneras de especificar rangos:
    Todo el archivo: 1,$ o simplemente %
    Con un solo número: :54s/President/Fool/
    Con un punto para indicar la línea actual: 
    :.write otherfile Escribe la linea actual en un archivo.
    to substitute in the lines from the cursor to the end: :.,$s/yes/no/
También se puede rangos indicados por patrones de búsqueda:
    :?^Chapter?,/^Chapter/s=grey=gray=g sustituye grey con gray desde donde se
    encuentre la palabra Chapter hacia atrás hasta la palabra Chapter hacia 
    delante.
    Otro ejemplo:
    :%s/
    //g En todo el buffer sustituye 
    por nada. Sirve para arregla archivos que en vez de tener CR LF tiene CR CR
    En windows toca pegar del clipboard a 
    .
    En linux: :%s/^V^M//g
:/My_Opinion/,$s/Windows/Linux/ 
    Search forward from the current line to the next line containing "My_Opinion", 
    and from that line to the end of file substitute "Linux" for "Windows". 
    The search WILL NOT match any "My_Opinion" on the current line, 
    and instead will match the next downward occurrence of "My_Opinion".
    Algunos operadores: (trabaja con cualquier comando de movimiento)
    gu (texto a lowercase), gU (texto a uppercase), gq, >, < etc.
    gUw pasa a mayuscula la palabra (word). Todos los comandos que no sean con 
    
    los dos puntos se pueden repetir con el comando "."
You can read a file in DOS format and write it in Unix format. This will
    replace all <CR><NL> pairs by <NL> (assuming 'fileformats' 
    includes "dos"): >
    :e file
    :set fileformat=unix
    :w
    If you read a file in Unix format and write with DOS format, all <NL>
    characters will be replaced with <CR><NL> (assuming 'fileformats' 
    includes
    "unix"): >
    :e file
    :set fileformat=dos
    :w
Sobre ctags.exe
    http://ctgas.sourceforge.net
Comandos comunes: (ver pág 98 del Manual de Referencia de Unix)
    Búsquedas:
    / palabra busca palabra
    /\cpalabra hace busqueda insensible a mayusculas
    /Cpalabra hace busqueda forzando sensibilidad a mayusculas (el default)
    / y ENTER repite búsqueda o simplemente # de una
    ? busca hacia atras
    La búsqueda acepta expresiones regulares de una, por ejemplo:
    /^hola busca hola al principio de la línea
    /hola$ busca hola al final de la línea
    /^hola$ busca hola sola en la línea
    /c.m busca c, cualquier caracter y m
    /hola\. busca "hola."
    /\<sum\> busca la palabra exacta sum \< es inicio de palabra \> 
    es fin de la palabra
    Con set se colocan otras opciones, 
    :noh (SIN EL :set) limpia temporalmente el resaltado pero al hacer una nueva 
    búsqueda se activa
    :set nohlsearch para quitar el resaltado de ahí en adelante.
    :set incsearch para búsqueda incremental etc.
    * busca hacia adelante la palabra que está sobre el cursor
    # busca hacia atrás la palabra que está sobre el cursor
    g* y g# igual pero realiza búsquedas parciales
    Toda la información está en VIM reference manual secciones search 
    y subsiguientes
    :options Navegador para colocar opciones tipo set
    :e . Navegador para edit un fichero
    u deshace
    J une dos lineas quitando el ENTER
    . Repite el ultimo comando
    ^R rehace
    20 va a la linea 20
    :20 hace lo mismo
    h ayuda
    wq sale grabando
    x sale grabando 
    :X guarda el fichero encriptado
    q o q! sale 
    To count the words in a file: g<ctrl-g>
    To count the words in a block, select the block and once again g<ctrl-g> 
    
    Para ver todos los comandos que empiezan con tçg, :help g
    Con :help z también hay un montón.
    Para ordenar líneas: definir el bloque con modo visual y luego :!sort
COPIAR Y PEGAR:
    v inicia bloque (visual mode) y luego :
    y (yank) lo lleva buffer para hacer p (paste) en otro lado.
    x para cortar y luego p (paste) para pegar.
    :reg muestra los registros (las memorias de copiado y pegado)
    "0p pega los del registro 0
    "4p lo del registro 4 etc (sin los dos puntos).
    Para pegar en un registro nombrado por uno: "{letra}
    Ej: "a, el siguiente pegado, borrado o yank se hará ahí.
    Ej: Para pegar repetidamente un bloque de texto basta con pulsar paste repeditamente.
    O Se selecciona con visual mode y:
    Se pulsa "1y (yank en el registro 1) (o en cualquier otro registro)
    Se pulsa "1p (paste lo del registro 1)
    gv vuelve a seleccionar la última selección
    Se puede utilizar el modo visual para restringir los efectos de una órden, 
    por ejemplo 
    substitue solo reemplazará en lo seleccionado.
    Ctrl-A selecciona todo
2,4m:6 mueve las lineas desde la 2 a la 4, y las coloca en la 6
    :113898,702486y yank el rango de líneas especificado
    El único método para copiar y pegar bloques es el visual.
Puede tambien hacerse algo como movimiento, yank y luego paste,
    Ej; $y, lo que copiaria desde donde nos movimos hasta el final de la línea.
Marcas:
    marks: Para crearlas, en modo de orden pulsar m(letra) sin los dos puntos. 
    Ej: ma, mb ...
    Para ir a la marca usar 'a 'c etc. que lleva a la línea
    O `a `c etc que lleva al punto exacto. (Recordar que debe
    pulsarse ` luego la barra espaciadora y ahí si la letra
    Marcas predefinidas : [ al inicio del archivo ] al final del archivo
    :marks las lista
daw (delete a word incluyendo el espacio)
    diw lo mismo pero sin incluir el espacio
    D borra hasta el final de la linea
    :r leer fichero a partir de la posicon actual del cursor
    :! ir al shell
En general las opciones de configuracion booleanas son:
    : set opcion, o
    : set noopcion
    : set autoread, si no hay cambios en el fichero y otro programa lo cambio, 
    auto/te lo recarga.
    Para que no pite:
    :set vb t_vb=
    set vb hace que en vez de pitar, flashea
    set novb lo pone otra vez al default.
    :set ignorecase o set ic
    :set noignorecase o set noic
    Se puede especificar también en la propia cadena de búsqueda 
    añadiéndole en cualquier parte \c.
    \C hace lo opuesto: forza "matching case", (set noignorecase)
    Para ver como tenemos las opciones de configuración:
    Tomado de :help set
    :set all me muestra como están todas las opciones en VIM
    :se[t] Show all options that differ from their default value.
    :se[t] all Show all but terminal options.
    :se[t] {option}? Show value of {option}.
    :se[t] {option} Toggle option: set, switch it on.
    Number option: show value.
    String option: show value.
    :se[t] {option}& Reset option to its default value. May depend on the
    current value of 'compatible'. {not in Vi}
    Ejemplos:
    :set fileencoding? Muestra el encoding para el buffer actual (si no está 
    definido es el default)
    :set fileencodings? Muestra los encodings utilizados al tratar de interpretar 
    un archivo.
Para ver como esta configurada la opcion: :set opcion? ej: :set ignorecas?
    :set muestra las cambiadas con respecto al default
    :help set para ayuda
    :options para verlas todas
Tomado de: Guia-Vim.pdf
    set modelines=10 hace que la línea con variables de fichero sea buscada 
    entre las 10 primeras y 10 últimas
La idea es que en vez de utilizar .vimrc para establecer valores de funcionaminto 
    de Vim, se utilizen cierta líneas del propio archivo de texto.
    Estas deben estar al principio o al final del archivo (se cambia con set modelines=)
El formato de estas líneas es el siguiente:
    «[texto] vim:set {opción}={valor} ...: [texto]»
    Donde
    1. «[texto]» representa cualquier texto. Puede ser una marca de 
    comentarios
    para el lenguaje en el que se encuentre el fichero. Por ejemplo
    en programas para C++ habría que colocar al principio de la línea 
    los
    caracteres "//" para que el compilador de C++ la ignore y la trate 
    como
    un comentario. En programas de C habría que colocar, al principio "/*"
    y al final "*/", en ficheros LATEX el carácter "%" 
    y en ficheros de tipo
    make el carácter "#".
    2. El texto «vim:» es el que hace a Vim reconocer a esa línea 
    como conteniendo
    un grupo de variables de fichero. Si la línea no empieza con ese texto, 
    debe haber un espacio en blanco antes de él.
    Ej: « % vim: tw=75 ts=3 sw=3 ai»
    lo que significa que se establece el ancho de línea a 75 caracteres, 
    el tabulador a tres caracteres y los niveles de sangrado a 3 caracteres, al 
    tiempo que se activa la autoindentación.
    Otro ejemplo: la última línea de la ayuda de VIM tiene:
    vim:tw=78:fo=tcq2:isk=!-~,^*,^\|,^\":ts=8:ft=help:norl:
    Por ahora no se que configura...
En modo de ordenes (sin escribir los :))
    yy (sin los dos puntos en modo de ???) yank la linea actual, luego p (paste))
    yw yank la palabra, desde donde este el cursor hacia adelante. Para la palabra
    completa ubicarse al inicio de la misma.
    w avanza una palabra
    b avanza una palabra hacia atras
Si se quiere grabar como otro:
    :w nombreFicheroNuevo
Si se quiere editar otro sin salir de vi:
    :e fichero (:edit fichero)
    :edit . para que muestre un explorador de archivos
    El comando edit tiene varios argumentos, ver en la ayuda, uno de ellos es:
    :e[dit] [++opt] [+cmd]
    [++opt] es para cosas como el formato del archivo, su encoding o si es binario.
    Ej: :w ++enc=latin1 Graba el archivo con el encoding especificado
    La conversión mas breve de DOS a Unix es: :w ++ff=unix
[+cmd] es para dar algún comando al momento de abrir el archivo
    Ejemplo: :edit +set\ dir=c:\\\\temp file
    :e! Revert to the last saved version of the current file.
    Para ver la diferencia entre dos archivos
    :edit main.c
    :vertical diffsplit main.bak
Para editar varios archivos:
    :args *.txt para terminar de editar los ficheros actuales y editar los *.txt
    :hide edit file para editar otro archivo sin dejar el actual
    :args file1 file2 file3 similiar a :args *.txt
    :previous
    :next o :n
    :last
    :first
    :wnext va al siguiente archivo y graba por ahi derecho el actual
    :wprevious 
    :args muestra la lista de files
    :argdo %s/<palabra1\>/palabra2/ge |update
    Reemplaza la palabra1 (complete word) con palabra2. g es global y no solo 
    en la primera
    ocurrencia de la línea, e es para que no aborte si no encuentra en 
    un archivo, | separa dos
    comandos, update graba el archivo si sufrió algún cambio
    :set autowrite para automaticamente grabar al dar next o previous
    :buffers muestra el listado de los buffers abiertos.
    ctrl-^ va cambiando entre los buffers
    :b 1 lleva al bufer 1 etc.
5. EX commands (los de :)
    En general todos los comandos están en REFERENCE MANUAL, index.txt
INTERNACIONALICACION, ENCODING
    Consultar set enc (encode)
    En vimrc es donde se coloca set enc=utf-8 etc.
    Por defecto VIM se acomoda al ambiente donde se instala, en windows el predeterminado 
    es Windows ANSI,
    pero si se abre un archivo que está en UNICODE se adapta y lo trabaja 
    correctamente, salvo si esta en UTF-8,
    caso en el cual no muestra bien tildes y eñes. Se puede verificar grabando 
    con pspad un archivo en ese
    formato y luego intentar abrilo en vim.
    Para solucionar esto en vimrc, colocar:
    set fileencodings=ucs-bom,utf-8,8bits-1252,latin-1
    Este es un listado de los encodings que tratará de usar.
    :help bomb explica bom (byte order mark)
    ucs es Universal character set (está en wikipedia)
    Para insertar caracteres especiales al estilo del DOS, se usa en windows Ctlr-Q 
    pero estando en modo de inserción.
    Ctrl-Q 126 y barra espaciadora pone la ~ etc.
    Si estamos en un caracter y queremos saber su número ASCII pulsamos 
    ga
    Si queremos saber en UTF-8 cual es, pulsamos g8
    You can reload a file using a different encoding if vim wasn't able to detect 
    the correct encoding:
    :e ++enc=<encoding>
    For example, on Windows in western Europe, the default encoding is latin1. 
    However I often use vim to edit batch files they must be encoded using the 
    console codepage which is is usually cp850 or cp437. So I reload the file 
    using this command:
    :e ++enc=cp850 
    See: :h ++enc y :h encoding-values para una lista de los posibles nombres
    set encoding establece el ambiente general para el juego de caracteres.
    set encoding= 8bit-cp1252 (es el mismo ANSI de Windows)
    2byte-cp1252
    utf8
    :e ++enc=latin1 es para que haga caso omiso del encoding actual y cargue el 
    archivo con el especificado.
    En el redhat 8.0 de la ucc y en el ubuntu 6.10 no se podía ni siquiera 
    escribir directamente tildes y eñes en un archivo nuevo, pues salían 
    caracteres raros. Tocó set termencoding=latin1 , aunque en ubuntu el 
    archivo internamente se codifica como utf8.
    Luego lo puse en .vimrc set termencoding=latin1
    Como cosa curiosa antes de descubrir lo anterior, también me funcionó 
    esta secuencia:
    :set encoding=8bit-cp1252
    :e! ++enc=8bit-cp1252
    También funcionó:
    :let &termencoding=&fileencoding (ponga el encoding del archivo actual 
    al term)
FORMATEO DE TEXTO
    Adicional información, en la ayuda en formated text
Las siguientes líneas las añadí a cpp.vim:
    " fvel para que coincida con lo que tengo en C++ Builder
    " Cambiar los tabs por 3 espacios (tabstop=3)
    set ts=3
    " Cambiar el indent > y unindent < también a 3
    set shiftwidth=3
    Para hacerlo 4 veces, pues: 4> o 4<
    <} unindent el párrafo actual
    >{ indenta el párrafo anterior
    Para que no haga wordwrap:
    set nowrap
Para que de Enter automáticamente a cierto ancho:
    set textwidth=30
En la ayuda afirma que otra manera de convertir los tab en spaces es:
    :set expandtab
    :%retab para aplicar el cambio de retab en todo el fichero
    MACROS
    :source {file} lee comandos ex de {file}
    Estando en modo de ordenes, pulsar q1 (1 es el nombre o número de la 
    macro), seguidamente realizar las acciones que deseamos que se repitan y para 
    terminar pulsar q otra vez.
    Para ejecutarla es [count]@1
    :imap <F3> hola
    Hace que en modo insert al pulsar F3 se escriba hola, sirve para reemplazar 
    por ejemplo la invocación
    de las macros que es con @1 etc.
    Ctrl-N autocompleta palabras basándose en las del mismo archivo
En el VIM USER MANUAL el capítulo usr_26.txt, Repeating, explican 
    todo para automatizar tareas repetitivas, inclusive en batch mode, sin abrir 
    los archivos, por ejemplo: para cambiar la palabra person por Jones en varios 
    archivos, sin cargarlos directamente en vim (aunque cargándolos también 
    se puede).
    Grabar estas líneas con comandos en un archivo change.vim
%s/person/Jones/g
    quit
Correr el editor en batch mode, usando este shell script;
for file in *.txt; do
    vim -e -s $file < change.vim
    write tempfile
    done
La variable $file es colocada a un nombre diferente cada vez.
    -e corre vim en ex mode
    -s es silent (batch)
SCRIPTS
    Se puede escribir uno en el propio vim y ejecutarlo con :@"
    Los scripts pueden ser leídos e interpretados mediante el comando :source.
    :script me muestra todos los scripts instalados
Ejemplo:
:let i=1
    :while i<5
    : echo "count is" i
    :let i=i+1
    :endwhile
    Se puede probar con :@" (en la version 6.4 de ubunto 6.06 no funciona 
    pero se puede con :source % donde % indica el archivo actual, ver read only 
    registers)
This looks into lines 1 to 20 (inclusive) and echoes any date found in there.
 :for line in getline(1, 20)
    : if line =~ "Date: "
    : echo matchstr(line, 'Date: \zs.*')
    : endif
    :endfor
--------------------------------------------------------
    Modo de linea de comandos: es cuando se tecla : seguido de una órden
    Modo ex:
    gQ lleva al modo ex, donde se pueden dar órdenes del tipo : pero sin 
    tener que estar dando : tiro por t, donde se pueden dar órdenes del 
    tipo : pero sin tener que estar dando : tiro por tiro (ver :h Q y :h gQ se 
    sale de este modo escriviendo :vi (de visual)
Tomado de: http://en.wikibooks.org/wiki/Learning_the_vi_editor/Vim/Modes
    Ex-mode
The Ex mode is similar to the command line mode as it also allows you to enter Ex commands. Unlike the command-line mode you won't return to normal mode automatically. You can enter an Ex command by typing a Q in normal mode and leave it again with the :visual command. Note that the Ex mode is designed for Batch processing and as such won't support mappings or command-line editing.
For batch processing the Ex-mode is normally started from outside by calling the editor with the "-E" option. Here are real live example form a RPM Package Manager specification:
vim -E -s Makefile <<-EOF
    :%substitute/CFLAGS = -g$/CFLAGS =-fPIC -DPIC -g/
    :%substitute/CFLAGS =$/CFLAGS =-fPIC -DPIC/
    :%substitute/ADAFLAGS =$/ADAFLAGS =-fPIC -DPIC/
    :update
    :quit
    EOF
The RPM uses Bash as script language which make the example a little difficult to understand as two different script languages are mixed in one file.
vim -E -s 
    starts vim in "Ex-Improved" mode which allows for more advanced 
    commands then the vi compatible Ex-mode (which is started with vim -e -s).
    <<-EOF 
    tells bash to copy all lines that follow into the standard input of the external 
    program just started.
    : 
    are lines with Ex commands which vim will execute. The : is optional but helpful 
    when two script languages are mixed in one file
    :update 
    A beginners mistake is to forget to actually save the file after the change 
    - falsely assuming that this happens automatically.
    :quit 
    Last not least: don't forget to actually exit vim again.
    EOF 
    marks the end of the standard input redirection - from now on bash will execute 
    the command itself again.
If your shell does not allow such nifty redirection of standart input then you can always use a more classic approach to I/O redirection using two files:
vim -E -s Makefile <Makefile-Fix1.vim
And if have no standard input redirection available then you can try the -c option in combination with the source command:
vim -E -s -c "source Makefile-Fix1.vim" Makefile
With the Exim-mode many task classically performed by awk or sed can be done with vim and often better so:
 * awk and sed are stream oriented - they only read the file forward from 
    be beginning to the end while vim is buffer oriented - you can move forward 
    and backward in the file as you like.
    * vim's regular expressions are more powerful than awk's and sed's expressions 
    - for example vim can match over several lines and supports zero matches.