Posso definir uma codificação personalizada para o vim?

9

Eu freqüentemente uso quebra-cabeças de programação e código-golfe . Muitos usuários por aí escreveram idiomas personalizados exclusivamente para jogar golfe. Estou trabalhando sozinho agora. Muitas dessas linguagens têm suas próprias codificações personalizadas, para que possam espremer mais comandos em um único byte. Por exemplo, sério , geléia e 05AB1E .

Posso configurar o vim para usar minha própria codificação personalizada? Eu gostaria de configurar um mapeamento de bytes para pontos de código unicode. Por exemplo:

0x01 == "¢"

Então, quando eu digito <C-v><C-a>, ele exibe um ¢caractere e quando eu escrevo, ele salva o byte 0x01.

Isso é possível remotamente? E também, isso funcionaria bem com a área de transferência do sistema? (por exemplo, posso copiar e colar do meu navegador para vim e vice-versa)

James
fonte
2
Você provavelmente precisaria escrever seu próprio script de sintaxe e usá-lo :help conceal.
Romainl 7/16
Ao olhar para a ajuda Vim para encodinge charconvertvi que ele tenta internamente para utilizar a iconvfunção de primeiro converter conjuntos de caracteres. iconvpode lidar com a conversão entre diferentes conjuntos de caracteres. Uma resposta sobre como adicionar um conjunto de caracteres iconvpode ser encontrada aqui (parece que você precisa enviar um email ao mantenedor). Talvez isso ajude você. :)
Erwin Rooijakkers

Respostas:

7

Como sugerido pela romainl, você pode conseguir isso com o concealrecurso do vim.

Aqui está um exemplo de script que pode ser usado:

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 você pode ver, levei alguns dos mapeamentos a sério e seu ^Aexemplo. Cuidado se você deseja copiar / colar este código, é ^Anecessário digitar <C-v> <C-A>.

O que esse código faz é definir para cada value/ displaypar uma correspondência de sintaxe.

por exemplo

syntax match vartest /08/ conceal cchar=◘

Combina todas as 08seqüências e os arquivos e os oculta com o personagem.

Você verá , mas o texto real no arquivo é 08.


Você pode levar uma lista de regras e (com uma macro sofisticada, ou seja:): 0i\ ['^[f s', '^[lxf)s'],^[ld$transformar cada linha em uma matriz de vim utilizável.

Além disso, se você quiser digitar literal unicode com o vim, poderá usar este fluxo de trabalho:

<C-V> u XXXX

Onde XXXXestá o valor unicode, portanto, a digitação <C-V>u0001será inserida ^Aconforme desejado.


Se você deseja verificar o conteúdo do arquivo, eu recomendo usar um dump hexadecimal do arquivo, que você pode ter com o xxd .

por exemplo

$ vim

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

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

Você pode ver aqui seu ^Acomo 01e seu ^Bcomo 02. ( 0arepresenta a nova linha no final do arquivo)

nobe4
fonte