¿Puedo definir una codificación personalizada para vim?

9

Frecuentemente uso rompecabezas de programación y golf de código . Muchos usuarios de allí han escrito idiomas personalizados exclusivamente para jugar al golf. Incluso estoy trabajando solo ahora mismo. Muchos de estos idiomas tienen sus propias codificaciones personalizadas para que puedan aplastar más comandos en un solo byte. Por ejemplo, en serio , gelatina y 05AB1E .

¿Puedo configurar vim para usar mi propia codificación personalizada? Me gustaría configurar una asignación de bytes a puntos de código unicode. Por ejemplo:

0x01 == "¢"

Luego, cuando escribo, <C-v><C-a>mostraría un ¢carácter, y cuando escribiera, guardaría el byte 0x01.

¿Es esto incluso remotamente posible? Y también, ¿funcionaría bien con el portapapeles del sistema? (por ejemplo, puedo copiar y pegar desde mi navegador a vim y viceversa)

James
fuente
2
Probablemente necesite escribir su propio script de sintaxis y usarlo :help conceal.
romainl
Al mirar la ayuda de Vim encodingy charconvertvi que internamente intenta usar la iconvfunción primero para convertir conjuntos de caracteres. iconvpuede manejar la conversión entre diferentes conjuntos de caracteres. Aquíiconv puede encontrar una respuesta sobre cómo agregar un conjunto de caracteres (parece que tiene que enviarle un correo electrónico al mantenedor). Quizás esto te ayude. :)
Erwin Rooijakkers

Respuestas:

7

Como sugirió romainl, puede lograrlo con la concealfunción de vim.

Aquí hay un ejemplo de script que se puede usar:

let rules = [
      \ ['01' , '☺'],
      \ ['02' , '☻'],
      \ ['03' , '♥'],
      \ ['04' , '♦'],
      \ ['05' , '♣'],
      \ ['06' , '♣'],
      \ ['07' , '•'],
      \ ['08' , '◘'],
      \ ['^A' , '¢'],
      \ ]

for [value, display] in rules
  execute "syntax match vartest /".value."/ conceal cchar=".display
endfor

" Ensure the character is concealed
set conceallevel=2
set concealcursor=nvc

Como puede ver, tomé en serio algunos de los mapas y su ^Aejemplo. Tenga cuidado si desea copiar / pegar este código, ^Adebe teclearlo <C-v> <C-A>.

Lo que hace este código es definir para cada value/ displaypar una coincidencia de sintaxis.

p.ej

syntax match vartest /08/ conceal cchar=◘

Unirá cada 08secuencia y el archivo y los ocultará con el personaje.

Se le ve , pero el texto real en el archivo es 08.


Luego puede tomar una lista de reglas y (con una macro elegante, es decir, en serio:) 0i\ ['^[f s', '^[lxf)s'],^[ld$transformar cada línea en una matriz vim utilizable.

Además, si desea escribir unicode literal con vim, puede usar este flujo de trabajo:

<C-V> u XXXX

Dónde XXXXestá el valor Unicode, por lo que escribir <C-V>u0001se insertará ^Acomo se desee.


Si desea verificar el contenido del archivo, le recomiendo usar un volcado hexadecimal del archivo, que puede tener con xxd .

p.ej

$ vim

<C-V><C-A><C-V><C-B>
:x a.txt

$ xxd a.txt
0000000: 0102 0a                                  ...

Puedes ver aquí tu ^Aas 01y tu ^Bas 02. ( 0arepresenta la nueva línea al final del archivo)

nobe4
fuente