Puis-je définir un encodage personnalisé pour vim?

9

J'utilise fréquemment des puzzles de programmation et Code-golf . Beaucoup d'utilisateurs là-bas ont écrit des langues personnalisées uniquement pour le golf. Je travaille même par moi-même en ce moment. Beaucoup de ces langues ont leurs propres encodages personnalisés afin de pouvoir écraser plus de commandes dans un seul octet. Par exemple, sérieusement , gelée et 05AB1E .

Puis-je configurer vim pour utiliser mon propre encodage personnalisé? Je voudrais configurer un mappage d'octets aux points de code unicode. Par exemple:

0x01 == "¢"

Ensuite, lorsque je tape <C-v><C-a>, il affiche un ¢caractère et lorsque j'écris, il enregistre l'octet 0x01.

Est-ce même possible à distance? Et aussi, cela fonctionnerait-il bien avec le presse-papiers du système? (par exemple, je peux copier et coller depuis mon navigateur vers vim et vice-versa)

James
la source
2
Vous auriez probablement besoin d'écrire votre propre script de syntaxe et de l'utiliser :help conceal.
romainl
En regardant l'aide de Vim encodinget charconvertj'ai vu qu'il essaye d'abord en interne d'utiliser la iconvfonction pour convertir les jeux de caractères. iconvpeut gérer la conversion entre différents jeux de caractères. Une réponse sur la façon d'ajouter un jeu de caractères à iconvpeut être trouvée ici (il semble que vous devez envoyer un mail au responsable). Peut-être que cela vous aide. :)
Erwin Rooijakkers

Réponses:

7

Comme l'a suggéré romainl, vous pouvez le faire avec la concealfonctionnalité de vim.

Voici un exemple de script qui peut être utilisé:

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

Comme vous pouvez le voir, j'ai pris au sérieux une partie de la cartographie et de votre ^Aexemple. Attention si vous voulez copier / coller ce code, il ^Afaut le taper <C-v> <C-A>.

Qu'est - ce que ce code est fait, il définit pour chaque value/ displaypaire une correspondance de syntaxe.

par exemple

syntax match vartest /08/ conceal cchar=◘

Correspondra à chaque 08séquence et au fichier et les masquera avec le personnage.

Vous verrez , mais le texte réel dans le fichier est 08.


Vous pouvez ensuite prendre une liste de règles et (avec une macro fantaisie, c'est-à-dire pour sérieusement:) 0i\ ['^[f s', '^[lxf)s'],^[ld$transformer chaque ligne en un tableau vim utilisable.

De plus, si vous souhaitez taper unicode littéral avec vim, vous pouvez utiliser ce flux de travail:

<C-V> u XXXX

XXXXest la valeur unicode, donc la saisie <C-V>u0001insérera ^Acomme vous le souhaitez.


Si vous souhaitez vérifier le contenu du fichier, je vous recommande d'utiliser un vidage hexadécimal du fichier, que vous pouvez avoir avec xxd .

par exemple

$ vim

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

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

Vous pouvez voir ici votre ^Aas 01et votre ^Bas 02. ( 0areprésente la nouvelle ligne à la fin du fichier)

nobe4
la source