Algorytm obliczania bajtu kontrolnego dla drukarki Posnet Thermal

Algorytm obliczania bajtu kontrolnego dla drukarki Posnet Thermal
ZT
  • Rejestracja:około 11 lat
  • Ostatnio:około 8 lat
  • Postów:18
0

Dzień dobry.
Jestem w posiadaniu drukarki posnet thermal. Aby coś wydrukować należy wysłać po RS-ie odpowiednie dane. Cały problem w tym, że wymagane jest coś takiego jak bajt kontrolny, a ja za nic nie wiem jak go obliczyć. Znalazłem instrukcję programisty w której pisze:

Większość sekwencji jest uzupełniona dwoma znakami ('cc') - cyframi HEX (znaki ze zbioru: '0'..'9', 'A'..'F'), które wyrażają w zapisie heksadecymalnym wartość bajtu kontrolnego liczonego dla całej sekwencji w specjalny sposób:

  1. Na początku podstawiamy wartość bajtu kontrolnego:
    <byte> := 255;

  2. Począwszy od następnego znaku za ESC P obliczamy wartość wyrażenia:
    <byte> := <byte> xor <kod danego="danego" znaku="znaku">;
    aż do ostatniego znaku sekwencji (nie licząc znaków 'cc' i "końcówki" ESC ).

  3. Tak uzyskany bajt kontrolny wyrażamy postaci w cyfr heksadecymalnych i dopisujemy do sekwencji wraz z końcówką 'ESC '.

UWAGA:

Oznaczenie "xor" użyte w procedurze oznacza funkcję logiczną Exclusive Or czyli: ”lub wykluczające”, inaczej zwane "albo". Funkcja ta działa na pojedynczych bitach bajtu. Dla bitów o różnych wartościach wynosi 1, a dla takich samych - 0. Jeśli w użytkowanym przez Państwa języku programowania brakuje funkcji xor, to można ją zdefiniować następująco:

xor (a,b) := (( not a) and b) or (( not b) and a).

Oczywiście użycie nawiasów nie jest tu konieczne ze względu na przestrzeganą chyba we wszystkich językach siłę wiązania poszczególnych funkcji.

Cyfry kontrolne obliczane w ten sposób dają dobre zabezpieczenie przed przekłamaniami transmisji. Przykładowa procedura dopisująca te znaki, napisana w języku PASCAL jest pokazana w rozdziale „Ogólne zasady syntaktyki komend.”

Oraz ten właśnie przykład:

cc - bajt kontrolny, zakodowany jako 2 cyfry HEX (EXOR wszystkich znaków za ESC P do tego bajtu z wartością początkową = #255), dokładnie według następującego algorytmu w języku PASCAL:

Kopiuj
begin
  check := 255;

  for i:= 3 to length(sekwencja)-4 do
    check := check xor byte(sekwencja[i]);
end;

Z powyższego wynika, że do kontroli sekwencji nie bierzemy 2 pierwszych znaków (ESC P) oraz 4-ch ostatnich (2 znaki kodujące bajt kontrolny oraz terminator sekwencji ESC ),

UWAGA :

  1. Obliczoną w powyższej pętli liczbę check stanowiącą wartość bajtu kontrolnego należy przekodować na 2 znaki HEX (znaki ASCII ze zbioru: '0'..'9','A'..'F','a'..'f'), np. korzystając z poniższej funkcji byte_to_hex:
Kopiuj
{ *** konwersja liczby na string 'hex' *** }
function word_to_hex (w: word) : string;
var
  i : integer;
  s : string;
  b : byte;
  c : char;
begin
  s := '';

  for i:= 0 to 3 do
  begin
    b := (hi(w) shr 4) and 15;
    case b of
      0..9 : c := char(b+$30);
      10..15 : c := char(b+$41-10);
    end;
    s := s + c;
    w := w shl 4;
  end;
  word_ to_hex := s;
end;

{***  konwersja bajtu na 2 znaki ***}
function byte_to_hex (b:byte) : string;
begin
  byte_to_hex := copy(word_to_hex(word(b)),3,2);
end;

Niestety mimo pewnych prób nic z tego nie wychodzi. Jestem raczej elektronikiem niż informatykiem, ale musiałem się tego podjąć.
Wiadomo np, że dobrą sekwencją jest:

&1BP1;0$lMoje&0D1&0DA/0.01/0.01/0/E0&1B\
Bajtem kontrolnym jest tu E0

&1B to znak ESC a &0D to Carriage Return (CR). Wiem też również, że liczby 0.01 nie biorą raczej udziału w tym algorytmie, ponieważ gdy je zmieniam to drukarki nie wyrzuca żadnego błędu i drukuje bez problemu.

Ma ktoś może jakiś pomysł jak powinien wyglądać taki algorytm?

edytowany 1x, ostatnio: flowCRANE
bogdans
Moderator
  • Rejestracja:prawie 17 lat
  • Ostatnio:prawie 5 lat
0

Nic nie piszesz o języku. Mam działający kod napisany w Javie. Może być?


To smutne, że głupcy są tak pewni siebie, a ludzie mądrzy - tak pełni wątpliwości. Bertrand Russell
abrakadaber
abrakadaber
  • Rejestracja:ponad 12 lat
  • Ostatnio:7 miesięcy
  • Postów:6610
2

Działający przykład z pascala:
Tworzenie pojedyńćzej komendy:

Kopiuj
Result := #27 + 'P' + Data + CalcCRC(Data) + #27 + '\';

Jak widzisz na początku jest bajt o wartości 27 (1b hex) potem jest duże P wszystko to co występuje po P to dane, z których jest wyliczane CRC i na końcu znowu bajt o wartości 27 i znak \

A tak jest wyliczane CRC

Kopiuj
function CalcCRC(Data: string): string;
var
  CRC: byte;
  i: integer;
begin
  CRC := 255;
  for i := 1 to Length(Data) do
    CRC := CRC xor byte(Data[i]);
  Result := IntToHex(CRC, 2);
end;

Chcesz pomocy - pokaż kod - abrakadabra źle działa z techniką.
ZT
  • Rejestracja:około 11 lat
  • Ostatnio:około 8 lat
  • Postów:18
0
bogdans napisał(a):

Nic nie piszesz o języku. Mam działający kod napisany w Javie. Może być?

Na razie wszystko do drukarki wysyłam ręcznie, docelowy program będę pisał prawdopodobnie w Delphi. Kod napisany w Javie może być, zobaczę jak to realizujesz i spróbuję przenieść na inny język.
Problemem jest dla mnie znak CT (0D), ponieważ jak by nie robił nie wiem jak go poprawnie uwzględnić. Mam napisany prawie działający kod w Pascalu z tym, że jeśli w sekwencji jakieś słowo się powtarza (w tej z pierwszego postu właśnie &0D) to nie wpływa ono na sumę kontrolną. Tak więc program sumę liczy mi poprawnie. Jednak już np. sekwencja kończąca wydruk posiada tylko jedno CR i nie umie mi poprawnie wyliczyć sumy. Jak policzyłem na piechotę na bajtach to wyszła ok (wstawiając 13 za 0D).

Co do postu abrakadaber to nie za bardzo to rozumiem :(

abrakadaber
abrakadaber
  • Rejestracja:ponad 12 lat
  • Ostatnio:7 miesięcy
  • Postów:6610
1

czego nie rozumiesz?
Chcesz wysłać do drukarki polecenie 1;0$lMoje&0D1&0DA/0.01/0.01/0/ - to z Twojego postu
to w tym kodzie
Result := #27 + 'P' + Data + CalcCRC(Data) + #27 + '\';
zamiast Data wstawiasz ten ciąg 1;0$lMoje&0D1&0DA/0.01/0.01/0/ i w Result masz GOTOWY tekst, który należy wysłać do drukarki


Chcesz pomocy - pokaż kod - abrakadabra źle działa z techniką.
ZT
  • Rejestracja:około 11 lat
  • Ostatnio:około 8 lat
  • Postów:18
0

Ten kod nie za bardzo chce mi się kompilować. Musze dodać, że korzystam z czegoś takiego jak kompilator online (http://www.compileonline.com/compile_pascal_online.php). Ale ogólnie Twój kod naprowadził mnie na to, że te nieszczęsne CR muszę podać jako dziesiętne 13, a wtedy suma kontrolna się zgadza.

edytowany 1x, ostatnio: Znawca tematu
abrakadaber
abrakadaber
  • Rejestracja:ponad 12 lat
  • Ostatnio:7 miesięcy
  • Postów:6610
0
  1. chodzi Ci o &0D1&0DA w tym przykładzie 1;0$lMoje&0D1&0DA/0.01/0.01/0/? Jeśli to są znaki CRLF to powinno być 1;0$lMoje' + #13 + '1' + #13 + 'A/0.01/0.01/0/
  2. to moje to nie jest gotowy kod więc nie wiem jak to chcesz kompilować

POPRAWIONA BŁĘDNA INTERPRETACJA MRÓWKÓW NA MONITORZE


Chcesz pomocy - pokaż kod - abrakadabra źle działa z techniką.
edytowany 2x, ostatnio: abrakadaber
olesio
  • Rejestracja:prawie 17 lat
  • Ostatnio:około 3 lata
  • Lokalizacja:Szczecin
  • Postów:4191
0

Że też @abrakadaber doszedł o co chodzi @Znawca tematu. Po pierwsze @Znawca tematu podajemy sensowne tagi. Nic nam nie mówi alogrytm. Ważne jest od razu określenie języka. Poprawiłem to. Natomiast to co napisal @abrakadaber dopiero ma sens. Bo Ty podajesz jako dane coś z &1B.

Także zachodzilem w głowę jakim cudem zliczanie może być od 3ego znaku. A za pewne te dane są jako ASCII. Wtedy by się zgadzało. Na szczęście rozgryzł to @abrakadaber (plus za to), bo ja nie mam żadnego doświadczenia z tymi drukarkami. Zatwierdź więc jego odpowiedź. Poza tym logiczne, że CR = 13. Tutaj Ameryka nie została odkryta.

EDIT: @Znawca tematu zatwierdziłem rozwiązanie @abrakadaber. A Ty masz takiego nicka, że motać się nie masz wręcz prawa. Z czym masz jeszcze problem? Kod z pod Delphi 7 - zwraca E0 jako CRC? Zwraca. No to cytując klasyka "dziękuję, dobranoc" ;)

Kopiuj
program test;

{$APPTYPE CONSOLE}

uses
  SysUtils;

function CalcCRC(Data: string): string;
var
  CRC: byte;
  i: integer;
begin
  CRC := 255;
  for i := 1 to Length(Data) do
    CRC := CRC xor byte(Data[i]);
  Result := IntToHex(CRC, 2);
end;

var
  Data : string;
begin
  Data := '1;0$lMoje&0D1&0DA/0.01/0.01/0/';
  Writeln(#27 + 'P' + Data + CalcCRC(Data) + #27 + '\');
end.

Pozdrawiam.
edytowany 3x, ostatnio: olesio
ZT
  • Rejestracja:około 11 lat
  • Ostatnio:około 8 lat
  • Postów:18
0
abrakadaber napisał(a):
  1. chodzi Ci o &0D1&0DA w tym przykładzie 1;0$lMoje&0D1&0DA/0.01/0.01/0/? Jeśli to są znaki CRLF to powinno być 1;0$lMoje' + #13#10 + '0.01/0.01/0/
  2. to moje to nie jest gotowy kod więc nie wiem jak to chcesz kompilować

ad.1 No właśnie chodzi o to, że &0D1&0DA poprawnie ma być rozpatrzone jako &0D 1 &0D A, a nie jako całość czyli pisząc inaczej:'1;0$lMoje' + #13 + '1' + #13 + 'A/0.01/0.01/0/'
Pozostaje tylko to jakoś "zautomatyzować" żeby nie klepać tego ręcznie z klawiatury zależnie od ilości znaków CR (#13) w sekwencji.
ad.2 Tak, wiem że to nie jest gotowy, dopisywałem resztę, ale jakoś nie szło :(

olesio
  • Rejestracja:prawie 17 lat
  • Ostatnio:około 3 lata
  • Lokalizacja:Szczecin
  • Postów:4191
0

@Znawca tematu: rozwiązanie @abrakadaber, jakie zatwierdziłem po pierwsze działa, po drugie zwraca właściwe CRC dla podanych przez Ciebie danych. Także jak domniemuje problemu nie ma.


Pozdrawiam.
ZT
  • Rejestracja:około 11 lat
  • Ostatnio:około 8 lat
  • Postów:18
0

Gdy zaczynałem pisać poprzednią odpowiedz nie widziałem jeszcze Twojego postu.
@olesio mógłbyś jeszcze sprawdzić co otrzymujesz jeśli sekwencja wynosi 1;0$e21S&0D28.29/28.29/ (bo nim zainstaluje delphi i trochę minie), a to ostatecznie odpowie mi czy działa poprawnie.

olesio
  • Rejestracja:prawie 17 lat
  • Ostatnio:około 3 lata
  • Lokalizacja:Szczecin
  • Postów:4191
0

Pozdrawiam.
edytowany 1x, ostatnio: olesio
ZT
  • Rejestracja:około 11 lat
  • Ostatnio:około 8 lat
  • Postów:18
0

Jak już wspomniałem zajmuję się na co dzień raczej elektroniką niż informatyką. Dziękuję za stron, bo ta na pewno mi się przyda. Mam niestety złą informacje, program nie działa poprawnie. Otrzymuję 86 a poprawnie jest D9. To jest właśnie to o czym wspominałem. Jeśli w sekwencji występuje dwa razy to samo to nie wpływa to na sumę kontrolną (sekwencja z pierwszego postu). Natomiast ta ostatnia sekwencja zawiera tylko jeden znak CR (czyli w hex 0D ASCII) (fakt, na początku namieszałem że nie napisałem dokładnie iż o to mi chodzi, że znaki są z ASCII).

Myślę, że z tym sobie jakoś dam radę . Chyba, że komuś się chce podrzucić pomysł jak to najprościej rozwiązać :)

edytowany 2x, ostatnio: Znawca tematu
abrakadaber
abrakadaber
  • Rejestracja:ponad 12 lat
  • Ostatnio:7 miesięcy
  • Postów:6610
1
protokół Posnet napisał(a)

[LBTREXIT]: Standardowe zatwierdzenie transakcji
3 warianty 'pozytywnego' zatwierdzenia transakcji:
ESC P 1 ; Pr $e <kod> CR WPLATA / TOTAL / <check> ESC
lub :
ESC P 1; Pr; Pn; Pc $e <kod> CR <linia1> CR <linia2> CR <linia3> CR
WPŁATA / TOTAL / <check> ESC
lub:
ESC P 1; Pr; Pn; Pc; Px; Py $e <kod> CR <linia1> CR <linia2> CR <linia3> CR
WPLATA / TOTAL / RABAT / <check> ESC
Gdzie:
Pr = 0...99 : opcjonalny rabat procentowy dla całej transakcji,
Pn = ilość dodatkowych linii umieszczanych w stopce paragonu, za logo
fiskalnym, do których ma dostęp aplikacja = 0..3,
28
Pc = 0 : zachowanie 'dotychczasowe' tzn. zakończenie drukowania, wysunięcie
papieru i zakończenie trybu transakcyjnego,
= 1 : j.w.,
= 2 : wydrukowanie nagłówka nowego paragonu.
Px: rodzaj rabatu (niezależny od parametru Pr)
= 0 brak,
= 1 rabat procentowy,
= 2 narzut procentowy,
= 3 rabat kwotowy,
= 4 narzut kwotowy,
Py= 1 : parametr ignorowany,
<linia1>...<linia3>: string[40] zawartość linii dodatkowych. Między dwoma
raportami dobowymi można przesłać 25 różnych linii. Wszystkie przesłane
linie drukują się po raporcie dobowym. Za pomocą linii dodatkowych może
być przesyłany numer systemowy. Opis w rozdziale 6.1.
<kod>: string[3], kod kasy (1 znak) + kod kasjera (2 znaki), pole jest
ignorowane, jeżeli wcześniej było logowanie kasjera (sekwencja LBLOGIN)
WPŁATA: (przyjmuje wartości takie jak pole CENA w sekwencji $l) kwota wpłacona
przez klienta, jeżeli = 0 to napisy "wpłata / reszta" nie będą drukowane.
TOTAL: łączna należność dla klienta, dla kontroli poprzednich transferów,
RABAT: rabat/narzut procentowy/kwotowy dla całej transakcji, jeżeli parametr
Px<>0. W przypadku rabatu/narzutu kwotowego wpisuje się kwotę o którą
zmieniana jest należność, w przypadku rabatu/narzutu procentowego wpisuje
się procent o jaki zmieniana jest należność.
<check>: bajt kontrolny, jw.

czyli to co tam podajesz to

1;0$e21S&0D28.29/28.29/

1; - stała
0 - Pr = 0...99 : opcjonalny rabat procentowy dla całej transakcji,
$e - stała
21S - <kod>: string[3], kod kasy (1 znak) + kod kasjera (2 znaki)
&0D - powinien być JEDEN znak o kodzie 13 (0D szesnastkowo) a nie TRZY znaki!
28.29 - WPŁATA: (przyjmuje wartości takie jak pole CENA w sekwencji $l) kwota wpłacona przez klienta, jeżeli = 0 to napisy "wpłata / reszta" nie będą drukowane.
/ - stała
28.29 - TOTAL: łączna należność dla klienta, dla kontroli poprzednich transferów,
/ - stała

prawidłowo ten ciąg w Pascalu powinien wyglądać tak:

Kopiuj
s := '1;0$e21S' + #13 + '28.29/28.29/';

i jak tak to wpiszesz to masz prawidłowy wynik: http://ideone.com/tMjhBc czyli CRC=D9


Chcesz pomocy - pokaż kod - abrakadabra źle działa z techniką.
edytowany 1x, ostatnio: abrakadaber
flowCRANE
Plusiki przed i po CR są niepotrzebne - można pisać jednym cięgiem, jeśli nie ma wewnątrz zmiennych - s := '1;0$e21S'#13'28.29/28.29/';
abrakadaber
abrakadaber
wiem, ale chciałem "dobitnie" pokazać co jest nie tak i tak jest wg mnie o wiele czytelniej
flowCRANE
Wiem, wiem - czytelność ;)
ZT
  • Rejestracja:około 11 lat
  • Ostatnio:około 8 lat
  • Postów:18
0
abrakadaber napisał(a):

&0D - powinien być JEDEN znak o kodzie 13 (0D szesnastkowo) a nie TRZY znaki!

I właśnie cały czas próbowałem to przekazać, że ma wysłać jako jeden znak.

abrakadaber napisał(a):

prawidłowo ten ciąg w Pascalu powinien wyglądać tak:

Kopiuj
s := '1;0$e21S' + #13 + '28.29/28.29/';

Tak, wiem że powinien wyglądać tak co już wcześniej pisałem, jednak teraz muszę to jakoś zautomatyzować, ponieważ te sekwencje się cały czas zmieniają, raz występuje w niej dwa razy '&0D' (oczywiście jako jeden znak), a raz dwa razy a nie będę przecież ręcznie wpisywał w każdą '#13'

abrakadaber
abrakadaber
  • Rejestracja:ponad 12 lat
  • Ostatnio:7 miesięcy
  • Postów:6610
0
Kopiuj
s := StringReplace(s, '&0D', #13, [rfReplaceAll]);

co daje np http://ideone.com/tMjhBc
i muszę Ci powiedzieć, że masz problem z przekazaniem tego co chcesz zrobić :). Bo podejrzewam, że dane z których robisz paragon bierzesz z jakiegoś pliku czy czegoś podobnego, prawda?


Chcesz pomocy - pokaż kod - abrakadabra źle działa z techniką.
edytowany 1x, ostatnio: abrakadaber
ZT
  • Rejestracja:około 11 lat
  • Ostatnio:około 8 lat
  • Postów:18
0

Dziękuję Wam za pomoc, programik w delphi do obsługi drukarki już działa.
Pozdrawiam

edytowany 1x, ostatnio: Znawca tematu
NO
  • Rejestracja:ponad 22 lata
  • Ostatnio:ponad 6 lat
  • Postów:654
0

Witam serdecznie,
Udało Ci się zrobić ten programik do wydruku paragonów na posnecie?:)

Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)