Kann ich eine benutzerdefinierte Codierung für vim definieren?

9

Ich benutze häufig Programmierpuzzles und Code-Golf . Viele Benutzer dort haben benutzerdefinierte Sprachen nur zum Golfen geschrieben. Ich arbeite gerade alleine. Viele dieser Sprachen haben ihre eigenen benutzerdefinierten Codierungen, sodass sie mehr Befehle in ein einzelnes Byte zerlegen können. Zum Beispiel im Ernst , Gelee und 05AB1E .

Kann ich vim so konfigurieren, dass meine eigene benutzerdefinierte Codierung verwendet wird? Ich möchte eine Zuordnung von Bytes zu Unicode-Codepunkten konfigurieren. Zum Beispiel:

0x01 == "¢"

Wenn ich dann tippe <C-v><C-a>, wird ein ¢Zeichen angezeigt , und wenn ich schreibe, wird das Byte gespeichert 0x01.

Ist das überhaupt aus der Ferne möglich? Und würde dies auch gut mit der System-Zwischenablage funktionieren? (zB kann ich von meinem Browser nach vim kopieren und einfügen und umgekehrt)

James
quelle
2
Sie müssten wahrscheinlich Ihr eigenes Syntax-Skript schreiben und verwenden :help conceal.
Romainl
Beim Betrachten der Vim-Hilfe für encodingund charconvertich sah, dass es intern versucht, die iconvFunktion zuerst zum Konvertieren von Zeichensätzen zu verwenden. iconvkann die Konvertierung zwischen verschiedenen Zeichensätzen verarbeiten. Eine Antwort zum Hinzufügen eines Zeichensatzes iconvfinden Sie hier (anscheinend müssen Sie dem Betreuer eine E-Mail senden). Vielleicht hilft dir das. :)
Erwin Rooijakkers

Antworten:

7

Wie von romainl vorgeschlagen, können Sie dies mit der concealFunktion von vim erreichen.

Hier ist ein Skriptbeispiel, das verwendet werden kann:

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

Wie Sie sehen können, habe ich einige der Kartierungen und Ihr ^ABeispiel ernst genommen . Vorsicht, wenn Sie diesen Code kopieren / einfügen möchten, ^Amuss der eingegeben werden <C-v> <C-A>.

Dieser Code definiert für jedes value/ displayPaar eine Syntaxübereinstimmung.

z.B

syntax match vartest /08/ conceal cchar=◘

Stimmt mit jeder 08Sequenz und der Datei überein und verbirgt sie mit dem Charakter.

Sie werden sehen , aber der eigentliche Text in der Datei ist 08.


Sie können dann eine Liste von Regeln nehmen und (mit einem ausgefallenen Makro, dh für ernst 0i\ ['^[f s', '^[lxf)s'],^[ld$:) jede Zeile in ein verwendbares vim-Array umwandeln.

Wenn Sie Literal-Unicode mit vim eingeben möchten, können Sie diesen Workflow verwenden:

<C-V> u XXXX

Wo XXXXist der Unicode - Wert, so Typisierung <C-V>u0001fügt ^Anach Wunsch.


Wenn Sie den Inhalt der Datei überprüfen möchten, empfehle ich die Verwendung eines Hex-Dumps der Datei, den Sie mit xxd haben können .

z.B

$ vim

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

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

Sie können hier Ihr ^AAs 01und Ihr ^BAs sehen 02. ( 0arepräsentiert die neue Zeile am Ende der Datei)

nobe4
quelle