tab się gubi po wklejeniu

0

screenshot-20220203001401.png

Pastes as:
I'd like to share a story of a dev (details I will hide cause he may be reading this).

screenshot-20220203001412.png

bez taba na początku

@TomRiddle:

a po co?

bo wklejałem tekst i od razu chciałem mieć

 asdsad
 asdasdas

(które w ogóle działa od 2 tabów)

1
1a2b3c4d5e napisał(a):

bo wklejałem tekst i od razu chciałem mieć

 asdsad
 asdasdas

(które w ogóle działa od 2 tabów

No dobra, a po co chcesz mieć od razu dwa taby w poście?

1

@TomRiddle:

No dobra, a po co chcesz mieć od razu dwa taby w poście?

No generalnie chciałem coś zacytować i od razu oznaczyć, ale widzę teraz że mogę to po prostu skleić bez wcięć i tutaj w edytorze zaznaczyć i ztabbować

1
1a2b3c4d5e napisał(a):

No generalnie chciałem coś zacytować i od razu oznaczyć, ale widzę teraz że mogę to po prostu skleić bez wcięć i tutaj w edytorze zaznaczyć i ztabbować

Zacytować czy zrobić z tego kod?

To jest cytat

to jest kod

Który efekt Ty chciałeś osiągnąć? Bo nie rozumiem o co chodzi, co to dokładnie znaczy zacytować i od razu oznaczyć?

Mógłbyś napisać treść w poście i zrobić screena zanim go wrzucisz, taki jaki efekt chciałbyś uzyskać poprzez zwykłe wklejnie? Jakoś mi pokazać jaki efekt chciałbyś uzyskać dokładnie?

0

screenshot-20220203003007.png

^ wkleja się jako /

screenshot-20220203003020.png

a następnie robię:
screenshot-20220203003025.png

screenshot-20220203003036.png

screenshot-20220203003043.png

No generalnie tab się ucina :P

Ale w sumie masz rację, docelowo i tak > jest lepsze niż tab bo lepiej się wyświetla

1
1a2b3c4d5e napisał(a):

[...]
^ wkleja się jako /

[...]

a następnie robię:
[...]

[...]
[...]

Czyli dobrze rozumiem że chcesz zrobić kod z tego?

Bo kod na forum możesz zrobić na dwa sposoby:

  • Pierwszy, bardziej zalecany to jest takim zapisem

    ```
    console.log();
    ```
    
  • A drugi, to jest ten który pokazałeś, czyli wciąć treść czterema spacjami. Tu jest opisane jak się dodaje fragmenty kodu. Formatowanie treści i edytor w Serwisie

Fragment kodu możesz też dodać kontrolką screenshot-20220203003437.png albo skrótem Alt+C. Także ja bym Ci proponował użyj skrótu Alt+C, to Ci wstawi kod, i do niego wklej to co masz, i wtedy edytor usunie taby, tak żeby było ładnie.

Sounds good?

0

@1a2b3c4d5e: w zasadzie ja też nie rozumiem, co chcesz osiągnąć. Skąd dokąd wklejasz? Co wklejasz? W którym miejscu tego czegoś jest ile znaków \t przed wklejeniem? W którym miejscu tego czegoś powinny one wszystkie być po wklejeniu?


PS I jak to się wszystko ma do formatowania jako cytat i formatowania jako blokowy fragment kodu?

0

No to teraz zrobione jest tak:

  • Na Macu, edytor robi wcięcia przez Ctrl+[ oraz Ctrl+]
  • Na pozostałych systemach wcięcia można robić Alt+ArrowRight i usuwać Alt+ArrowLeft

Dodatkowo, nadal działają skróty Tab/Shift+Tab, pytanie co z tym fantem zrobić.

Czy dobrym rozwiązaniem byłoby zmienić Tab/Shift+Tab na Ctrl+Tab/Ctrl+Shift+Tab? Wtedy nadal będzie się dało robić wcięcia Tab (tylko że z ctrlem), a Ci którzy chcą edytować focus mogą normalnie. Pomysł z Ctrl+Tab dlatego że mało kto wpadnie na pomysł że wcięcie się robi Alt+ArrowUp, jeśli tego jeszcze nie wie.

2
TomRiddle napisał(a):

Czy dobrym rozwiązaniem byłoby zmienić Tab/Shift+Tab na Ctrl+Tab/Ctrl+Shift+Tab? Wtedy nadal będzie się dało robić wcięcia Tab (tylko że z ctrlem), a Ci którzy chcą edytować focus mogą normalnie. Pomysł z Ctrl+Tab dlatego że mało kto wpadnie na pomysł że wcięcie się robi Alt+ArrowUp, jeśli tego jeszcze nie wie.

Przy decydowaniu pamiętajmy o tym, że Ctrl+Tab może przełączać karty w przeglądarce, a np. w GNOME w ogólności karty w aplikacjach (https://wiki.gnome.org/Design/OS/KeyboardShortcuts).

0
Silv napisał(a):

Przy decydowaniu pamiętajmy o tym, że Ctrl+Tab może przełączać karty w przeglądarce, a np. w GNOME w ogólności karty w aplikacjach (https://wiki.gnome.org/Design/OS/KeyboardShortcuts).

No w sumie racja.

0

@Azarien: A masz jakiś usecase konkretny na to czemu Tab powinien przenosić focus dalej? Bo jeśli chciałbyś submitować formularz to możesz użyć Ctrl+Enter (lub Command+Enter na Macu).

Pytam, bo Tab jest teraz używany zarówno do wcięć kodu jak i do dokańczania autocomplete w podpowiedziach języków i nazw użytkowników, i jeszcze mam plan go dodać do kończenia </kbd>.

2
TomRiddle napisał(a):

@Azarien: A masz jakiś usecase konkretny na to czemu Tab powinien przenosić focus dalej?

Bo tak zawsze było, tak to działa na innych forach (z których korzystam) oraz na YouTube (tam trzeba dać Tab 2x bo pierwszy button to Cancel) oraz do tego jestem przyzwyczajony, a to argument nie do odparcia :)

0
Azarien napisał(a):
TomRiddle napisał(a):

@Azarien: A masz jakiś usecase konkretny na to czemu Tab powinien przenosić focus dalej?

Bo tak zawsze było, tak to działa na innych forach (z których korzystam) oraz na YouTube (tam trzeba dać Tab 2x bo pierwszy button to Cancel) oraz do tego jestem przyzwyczajony, a to argument nie do odparcia :)

No, kumam.

Tylko chciałbym zrozumieć use'case. W sensie co takiego możesz zrobić tym Tab w edytorze czego nie możesz Ctrl+Enter albo Esc?

Bo oprócz tego że teraz Tab wcina kod, i kończy autocomplete, to jeszcze planujemy kolejne integracje. Np żeby wcięcie w liście numerowanej umiało zrobić "podlistę", czy już wspomniane zakończenie </kbd>.

0

Wydaje mi się, że taby (albo 4 spacje pod rząd) na początku wiersza w Markdown oznaczają kod i zawsze tak było, że zjadało ten prefiks. Jak ktoś chce wkleić kod bez zjadania można go rozpocząć i zakończyć wierszem

```

Np.

```
    int a = something()
```

daje

    int a = something()

Dla wcięcia spacjami lub tab

    int a = something()

daje

int a = something()
2

Mam takie coś:

screenshot-20220220084451.png

Kopiuje z notepad++ taki kod (wcięcie jest tabem, a nie spacją)

screenshot-20220220084516.png

wklejam go pomiędzy znaczniki kodu

i gubią się wcięcia

screenshot-20220220084536.png

trochę dziwne, ain't it?

jako obejście - trzeba w notepadzie przygotować kod ze znacznikami

screenshot-20220220084641.png

2

haha, nie mam pojęcia z czego to wynika :D

biorę taki kod z notepada

screenshot-20220220085742.png

i wkleja się sensownie:
screenshot-20220220085806.png

ale taki już nie

screenshot-20220220085456.png

screenshot-20220220085504.png

1

@1a2b3c4d5e: dzieki za zgłoszenie.

To co widzisz, to automatyczne usuwanie wcięć, i faktycznie dodałem feature który usuwa wcięcia z wszystkich linii oprócz pierwszej.

Działa to tak:

  • Edytor liczy wszystkie wcięcia we wklejanym tekście
  • bierze najmniejsze wcięcie
  • i usuwa to wcięcie z każdej linijki

Czyli jak np mamy kod wcięty o 8,12, 8,12,16,8 spacji, to edytor usunie 8 spacji z początku każdej linii.

Problemem tylko było to, że niektórzy jak wklejają kod, zaznaczająca go w taki sposób że zaznaczają go cały od dołu do góry, ale w pierwszej linijce zaznaczają go nie do samej góry, tylko do pierwszego znaku, i wklejają coś takiego

One
            Two
            Three
                Four
            Five
                Six

Po prostu nie kopiują wcięcia pierwszej linii.

Dlatego dodaliśmy poprawkę że edytor nie bierze pod uwagę pierwszej linii podczas liczenia całkowitego wcięcia.

Także już znasz powód czemu to tak działa aktualnie, ale masz rację że trzeba to będzie poprawić dla twojego przypadku jakoś

1
TomRiddle napisał(a):

Także już znasz powód czemu to tak działa aktualnie, ale masz rację że trzeba to będzie poprawić dla twojego przypadku jakoś

W tym przypadku powinieneś napisać „tak że” — osobno. :P

Wystarczy sprawdzić ile wynosi minimalne wcięcie, a następnie z każdej linii usunąć tyle białych znaków. Jeśli pierwsza linijka nie ma wcięcia, a wszystkie pozostałe mają, to algorytm nie powinien nic zmieniać, bo minimum wynosi 0. Lepiej niech post zostanie do późniejszej poprawy (przez autora posta lub moderatora), niż aby edytor był nadgorliwy, bo będzie irytował (i już niestety to robi).

Przy czym trzeba dobrze przemyśleć to w jaki sposób usuwać białe znaki, tak aby działało to dobrze dla wcięć robionych zarówno spacjami, jak i znakami tabulacji. Jeśli jedno i drugie zostanie użyte w snippecie, to algorytm może kompletnie zepsuć wcięcia. Dlatego sugerowałbym najpierw zamieniać każdy tab wcięcia na cztery spacje, a dopiero po tym zabrać się za ich ewentualne usuwanie.

1
furious programming napisał(a):
TomRiddle napisał(a):

Także już znasz powód czemu to tak działa aktualnie, ale masz rację że trzeba to będzie poprawić dla twojego przypadku jakoś

W tym przypadku powinieneś napisać „tak że” — osobno. :P

Wystarczy sprawdzić ile wynosi minimalne wcięcie, a następnie z każdej linii usunąć tyle białych znaków. Jeśli pierwsza linijka nie ma wcięcia, a wszystkie pozostałe mają, to algorytm nie powinien nic zmieniać, bo minimum wynosi 0. Lepiej niech post zostanie do późniejszej poprawy (przez autora posta lub moderatora), niż aby edytor był nadgorliwy, bo będzie irytował (i już niestety to robi).

No tak to działało na początku. Ale jak mówiłem w poprzednim wpisie, ludzie nie kopiowali pierwszych spacji z pierwszej linii, więc wychodziły dziwne formatowania. A pamiętajmy że usuwanie wcięć jest z myślą o tych, którzy nie wiedzą jak działa edytor.

PS: @furious programming: Żeby zobrazować problem, ludzie kopiują kod tak:

screenshot-20220221103819.png

Więc wklejony tekst wyglądałby tak

clipboard(event, text => pasteText(text, shift, runCommand));

      function runCommand(command) {
        command(view);
        event.stopPropagation();
        event.preventDefault();
      }

I dlatego edytor nie bierze pod uwagę spacji w pierwszej linii.

2
TomRiddle napisał(a):

PS: @furious programming: Żeby zobrazować problem, ludzie kopiują kod tak: […]

I właśnie o tym pisałem — o takich przypadkach. I właśnie w takich przypadkach, edytor nie powinien zmieniać wcięć.

0
furious programming napisał(a):
TomRiddle napisał(a):

PS: @furious programming: Żeby zobrazować problem, ludzie kopiują kod tak: […]

I właśnie o tym pisałem — o takich przypadkach. I właśnie w takich przypadkach, edytor nie powinien zmieniać wcięć.

Czyli uważasz że byłoby lepiej żeby edytor wkleił po prostu tak jak jest w schowku, czyli?

clipboard(event, text => pasteText(text, shift, runCommand));

      function runCommand(command) {
        command(view);
        event.stopPropagation();
        event.preventDefault();
      }
0
1a2b3c4d5e napisał(a):

@TomRiddle:

wydaje mi się że ciężko byłoby zrobić to perfekcyjnie - aby edytor poprawiał zły kod początkujących, a nie psuł intencjonalnie sformatowanego w dany sposób

W językach z klamerkami da się.

W takim języku ja python, czasem pyknie, np tutaj:

def a():
  pass

a()

a czasem nie, jakby ktoś wkleił samą metodę.

def a():
pass

Ale to też jest rzadkie, bo najczęściej się wkleja z importami

import sys

def a():
  pass

No ale again, wyszedłem z takiego założenia: Jak ktoś dba o formatowanie, to zaznaczy i kliknie Tab, żeby sobie wciąć. A jak ktoś nie patrzy tylko wkleja jak leci, to lepiej przyciąć chyba?

2
TomRiddle napisał(a):

Czyli uważasz że byłoby lepiej żeby edytor wkleił po prostu tak jak jest w schowku, czyli?

Ma się wkleić to co jest w schowku, bez żadnego dodatkowego przetwarzania.

TomRiddle napisał(a):

No ale again, wyszedłem z takiego założenia: Jak ktoś dba o formatowanie, to zaznaczy i kliknie Tab, żeby sobie wciąć. A jak ktoś nie patrzy tylko wkleja jak leci, to lepiej przyciąć chyba?

Jeśli ktoś dba o formatowanie to sam sobie kod w poście sformatuje. Lepiej żeby użytkownik wysłał post z niesformatowanym kodem, niż aby nie był w stanie go w ogóle napisać i aby musiał się męczyć z nadgorliwością edytora. Ten edytor w założeniu miał pomagać, tymczasem w wielu przypadkach porządnie przeszkadza, a nawet uniemożliwia tworzenie treści. Skandal!

1

@furious programming: Chyba trzeba będzie cofnąć to ignorowanie wcięcia w pierwszej linii.

Widzę że dużo ludzi tak wkleja kod i potem jest

XXX
          YYY
          ZZZ
          AAA
          BBB
          CCC

A problem o którym jest mowa w temacie występuje w zasadzie tylko w jezykach bez domknięć, czyli w sumie tylko Python, i tylko jeśli faktcznie jest akurat tylko pierwsza linia jest wcięta.

Jako rekompensatę możęmy zrobić że wklejanie kodu z Ctrl+Shift+V nie usuwa wcięć, a jedynie Ctrl+V, + możemy zrobić jakiegoś checka, typu jak znajduje się słowo def na początku wklejanego kodu, to wtedy też nie robimy usunięcią wcięć.

0
TomRiddle napisał(a):

@furious programming: Chyba trzeba będzie cofnąć to ignorowanie wcięcia w pierwszej linii.

Przecież to od początku nie miało prawa działać — nie wiem czemu się dziwisz. Nawet zwykłej, pojedynczej instrukcji warunkowej nie mogłem wkleić do znaczników kodu, bo mi usuwało wcięcie i musiałem je sam dorabiać. Ta funkcja w obecnej formie to zło i trzeba się jej jak najszybciej pozbyć. I nie, nie dotyczy on wyłącznie Pythona, bo do znaczników mogę wklejać fragmenty kodu innego języka, które też będa spełniać ten warunek. No i można też wrzucać zawartości plików, a te mogą mieć dowolną strukturę i dowolne wcięcia.

Jak chcesz manipulować wcięciami, to zrób tak jak już pisałem. Najpierw wyznacz liczbę znaków analizując wszstkie linie, a następnie z każdej linii usuń tyle samo znaków. W ten sposób co najmniej jedna linia nie będzie miała wcięcia w ogóle, a reszta pozostanie oryginalnie wyrównana względem tej co najmniej jednej linii.

0
furious programming napisał(a):
TomRiddle napisał(a):

@furious programming: Chyba trzeba będzie cofnąć to ignorowanie wcięcia w pierwszej linii.

Jak chcesz manipulować wcięciami, to zrób tak jak już pisałem. Najpierw wyznacz liczbę znaków analizując wszstkie linie, a następnie z każdej linii usuń tyle samo znaków. W ten sposób co najmniej jedna linia nie będzie miała wcięcia w ogóle, a reszta pozostanie oryginalnie wyrównana względem tej co najmniej jednej linii.

No dokładnie tak jest teraz zrobione.

Tylko to nie bierze pod uwagę tego, że jak ludzie wklejają kod to w pierwszej linii czasem ucinają wcięcia, przez co jest przekłamanie tego "minimalnego wcięcia".

1
TomRiddle napisał(a):

Tylko to nie bierze pod uwagę tego, że jak ludzie wklejają kod to w pierwszej linii czasem ucinają wcięcia, przez co jest przekłamanie tego "minimalnego wcięcia".

Nieważne — masz usunąć zbędne wcięcie, nie formatować komuś kod.

0
furious programming napisał(a):
TomRiddle napisał(a):

Tylko to nie bierze pod uwagę tego, że jak ludzie wklejają kod to w pierwszej linii czasem ucinają wcięcia, przez co jest przekłamanie tego "minimalnego wcięcia".

Nieważne — masz usunąć zbędne wcięcie, nie formatować komuś kod.

No tak. Przecież dokładnie to chcemy zrobić.

Gość kopiuje tak kod:
screenshot-20220305164808.png

A robiąc to Twoją zaproponowaną metodą (aktualnie w edytorze) wychodzi takie coś:

$this->base = $base;
        if ($this->base !== null && ($this->base < 2 || $this->base > 36)) {
            throw new \InvalidArgumentException("Invalid base: $this->base (supported bases 2-36, case-insensitive)");
        }

Bo pierwsza linijka jest uznana za "najmniejszy indent".

Dla mnie to nie jest kod z usuniętymi wcięciami.

0
TomRiddle napisał(a):

Gość kopiuje tak kod:
screenshot-20220305164808.png

A robiąc to Twoją zaproponowaną metodą (aktualnie w edytorze) wychodzi takie coś:

$this->base = $base;
        if ($this->base !== null && ($this->base < 2 || $this->base > 36)) {
            throw new \InvalidArgumentException("Invalid base: $this->base (supported bases 2-36, case-insensitive)");
        }

Bo pierwsza linijka jest uznana za "najmniejszy indent".

No i dobrze — tak skopiował to tak ma, tak to działa wszędzie bo tak to działać powinno. Powtarzam — edytor ma usuwać nadmiarowe wcięcia, nie formatować kod, a w powyższym kodzie nie ma nadmiarowych wcięć, więc nie powinien nic robić.

Ogarnięty użytkownik, któremu będzie zależało na tym, aby kod w jego poście wyglądał dobrze, sam sobie wcięcia poprawi, korzystając z funkcji do ich manipulowania, które są dodane do edytora. Albo zrobi to tuż przed skopiowaniem, w edytorze kodu swojego IDE — albo najpierw zmniejszy wcięcia i wtedy skopiuje kod, albo zaznaczy go blokowo i tak skopiuje:

screenshot-20220305170651.png

I nie będzie problemu z wcięciami:

begin                                                                          
  CursorRect.X := Game.Mouse.ClientX - Game.Textures.CursorSize.X div 2;       
  CursorRect.Y := Game.Mouse.ClientY - Game.Textures.CursorSize.Y div 2;       
  CursorRect.W := Game.Textures.CursorSize.X;                                  
  CursorRect.H := Game.Textures.CursorSize.Y;                                  
                                                                               
  SDL_RenderCopy(Game.Renderer.Global, Game.Textures.Cursor, nil, @CursorRect);
end;                                                                           

Chyba, że używa lodówki do programowania, to niech się męczy.

0
furious programming napisał(a):
TomRiddle napisał(a):

Gość kopiuje tak kod:
screenshot-20220305164808.png

A robiąc to Twoją zaproponowaną metodą (aktualnie w edytorze) wychodzi takie coś:

[...]

Bo pierwsza linijka jest uznana za "najmniejszy indent".

No i dobrze — tak skopiował to tak ma, tak to działa wszędzie bo tak to działać powinno. Powtarzam — edytor ma usuwać nadmiarowe wcięcia, nie formatować kod, a w powyższym kodzie nie ma nadmiarowych wcięć, więc nie powinien nic robić.

No nie no; są nadmiarowe wcięcia. Problem tylko taki że w pierwszej linii ich nie ma.

No tak; ja się zgadzam żę nie ma formatować kodu. To się zgadzam w 100%. Tylko mi chodzi o to, że dobrze byłoby jakoś ogarnąć fakt, że leniwi autorzy jak kopiują kod to nie zaznaczą pierwszej linii do końca i potem usuwanie wcięć jest przekłamane.

Ogarnięty użytkownik, któremu będzie zależało na tym, aby kod w jego poście wyglądał dobrze, sam sobie wcięcia poprawi, korzystając z funkcji do ich manipulowania, które są dodane do edytora. Albo zrobi to tuż przed skopiowaniem, w edytorze kodu swojego IDE — albo najpierw zmniejszy wcięcia i wtedy skopiuje kod, albo zaznaczy go blokowo i tak skopiuje:

[...]

I nie będzie problemu z wcięciami:

[...]

Chyba, że używa lodówki do programowania, to niech się męczy.

No właśnie; tylko od zawsze pomysł z automatycznym usuwaniem wcięć był kierowany w tych co nie edytują kodu sami.

Żeby nie było takich kodów porozrzucanych na forum

                          public function parsed(string $flagString): SubpatternFlags
                          {
                              $posOfLastExtend = \strrpos($flagString, 'x');
                              $hasExtended = $posOfLastExtend > -1;
                              if ($posOfLastExtend > $this->destructionPosition($flagString)) {
                                  return new SubpatternFlags(false);
                              }
                              return new SubpatternFlags($hasExtended || $this->extended);
                          }

@furious programming: Np w tym wątku widać, że autor kopiował bez pierwszej linii: @DeleteMapping - nie działa

1 użytkowników online, w tym zalogowanych: 0, gości: 1