Czy mogę zdefiniować niestandardowe kodowanie dla vima?

9

Często używam Programming Puzzle i Code-golfa . Wielu użytkowników tam napisało niestandardowe języki wyłącznie do gry w golfa. Teraz nawet pracuję sam. Wiele z tych języków ma własne niestandardowe kodowania, dzięki czemu mogą wycisnąć więcej poleceń w jednym bajcie. Na przykład poważnie , galaretka i 05AB1E .

Czy mogę skonfigurować vima do używania własnego niestandardowego kodowania? Chciałbym skonfigurować mapowanie bajtów na punkty kodowe Unicode. Na przykład:

0x01 == "¢"

Następnie, gdy piszę <C-v><C-a>, wyświetla ¢znak, a kiedy piszę, zapisuje bajt 0x01.

Czy to w ogóle możliwe? A także, czy to zadziała dobrze ze schowkiem systemowym? (np. mogę kopiować i wklejać z mojej przeglądarki do vim i vice versa)

James
źródło
2
Prawdopodobnie będziesz musiał napisać własny skrypt składniowy i użyć go :help conceal.
romainl
Patrząc na pomoc Vima encodingi charconvertzobaczyłem, że wewnętrznie próbuje iconvnajpierw użyć funkcji do konwersji zestawów znaków. iconvobsługuje konwersję między różnymi zestawami znaków. Odpowiedź na temat dodawania zestawu znaków iconvmożna znaleźć tutaj (wygląda na to, że musisz wysłać opiekunowi pocztą). Może to ci pomoże. :)
Erwin Rooijakkers,

Odpowiedzi:

7

Jak sugeruje romainl, możesz to osiągnąć dzięki concealfunkcji vim.

Oto przykładowy skrypt, którego można użyć:

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

Jak widać, wziąłem poważnie mapowanie i twój ^Aprzykład. Ostrożnie, jeśli chcesz skopiować / wkleić ten kod, musisz ^Ago wpisać <C-v> <C-A>.

Co ten kod robi to, to określenie dla każdego value/ displaypowiązać dopasowanie składni.

na przykład

syntax match vartest /08/ conceal cchar=◘

Dopasuje każdą 08sekwencję i plik i ukryje je ze znakiem.

Będziesz zobaczyć , ale rzeczywisty tekst w pliku jest 08.


Następnie możesz wziąć listę reguł i (z fantazyjnym makrem, tj. Poważnie:) 0i\ ['^[f s', '^[lxf)s'],^[ld$przekształcić każdą linię w użyteczną tablicę vim.

Ponadto, jeśli chcesz wpisać dosłowne Unicode za pomocą vima, możesz użyć tego przepływu pracy:

<C-V> u XXXX

Gdzie XXXXjest wartość Unicode, więc pisanie <C-V>u0001będzie wstawiane ^Azgodnie z potrzebami.


Jeśli chcesz zweryfikować zawartość pliku, zalecam użycie zrzutu heksadecymalnego pliku, który możesz mieć przy pomocy xxd .

na przykład

$ vim

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

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

Można zobaczyć tutaj swoje ^Ajak 01i twój ^Bjak 02. ( 0areprezentuje nowy wiersz na końcu pliku)

nobe4
źródło