Jak w Sublime Text 2 mogę zrobić wcięcie do prostej kolumny z wieloma kursorami na nierównej krawędzi?

33

Załóżmy, że mam wiele kursorów wzdłuż kilku linii, takich jak to:

foo|
barr|
foobar|
baz|

Jak mogę automatycznie przesunąć białe znaki na końcu każdej linii do płaskiej krawędzi, tak jak to ?:

foo    |
barr   |
foobar |
baz    |

(W tych przykładach |ma być moim kursorem).

Kiedy właśnie Tablub Spacez początkowej aranżacji, otrzymujesz:

foo    |
barr    |
foobar    |
baz    |

To przydatne, ale nie tego szukam. Szukam jakiegoś skrótu klawiaturowego, który pozwoli mi wciąć od postrzępionej wstawki z wieloma kursorami do prostej kolumny.

GladstoneKeep
źródło
Czy zwykłe wstawienie karty lub dwóch działa?
Darth Android
Nie, ale być może nie rozumiem. Zredagowałem, aby wyjaśnić moje pytanie.
GladstoneKeep
Twoja edycja opisuje, co robi Space, i do pewnego stopnia Tab będzie, jeśli twoje linie różnią się znacznie, ale jeśli wszystkie są dość blisko, to po dwóch tabulatorach wszystkie kursory powinny być na tabstopie. Być może trzeba będzie trochę dopasować, aby uzyskać je wszystkie na tym samym tabstopie, ale będzie to mniej niż próba dostosowania za pomocą spacji.
Darth Android
To dziwne. Naciśnięcie Tabna końcu każdej linii powoduje wcięcie obszarpanej wstawki z wieloma kursorami do prostej kolumny, ale nie można osiągnąć tego samego efektu za pomocą wyrażenia regularnego. Szukałem spacji końcowych: \s*$zastąpiłem je znakiem tabulacji: \t- ale \tnie osiąga tego samego efektu, co naciśnięcie Tabręczne.
amiregelz
1
Do Twojej wiadomości, zamieściłem to jako prośbę o dodanie funkcji na tablicy żądań Sublime Text 2.
GladstoneKeep

Odpowiedzi:

10

Możesz użyć Sublime Alignment wbond

Może to wymagać dodania tego do pliku ustawień (Preferencje> Ustawienia pakietu> Wyrównanie> Ustawienia użytkownika:

// The mid-line characters to align in a multi-line selection, changing
// this to an empty array will disable mid-line alignment
"alignment_chars": ["=", "|"],
// If the following character is matched for alignment, insert a space
// before it in the final alignment
"alignment_space_chars": ["=", "|"]

Zamień „|” z dowolną postacią, którą chcesz wyrównać.

Edycja: Jak się dowiedział mtoast, dodanie "\n"do „alignment_chars” daje pożądany efekt. Dodanie nowego znaku wiersza do „alignment_space_chars” prawdopodobnie nie jest potrzebne i może usunąć tekst. Jednak przy moich ograniczonych testach nie zauważyłem różnicy.

Przytrzymaj controli kliknij na końcu każdej linii. Następnie naciśnij klawisze skrótu wyrównania (w systemie Linux domyślnym ustawieniem jest ctrl+ alt+ a). Przekonasz się, że kursory są ustawione w jednej linii z najdalszą pozycją kursora.

Edycja2: Dodanie nowego wiersza "alignment_space_chars"spowoduje usunięcie tekstu, jeśli podświetlisz blok tekstu, a Sublime Alignment nie może znaleźć czegoś innego do wyrównywania na linii (jak znak równości).

Ponadto, jeśli Sublime Alignment nie może znaleźć czegoś innego do wyrównywania, dodanie nowego wiersza "alignment_chars"spowoduje wypełnienie końca linii spacjami (lub tabulatorami w zależności od ustawień), aby dopasować najdłuższą podświetloną linię.

d_rail
źródło
1
Wow świetne! Zainstalowałem pakiet Sublime Alignment, dodałem "\n"(nowy wiersz) do mojego "alignment_chars"i uzyskałem pożądany wynik. (Uwaga: nie dodałem go "alignment_space_chars", co spowodowało usunięcie wierszy.) Jeśli dodasz tę konkretną sugestię ( "n") do swojej odpowiedzi, zaakceptuję.
GladstoneKeep
Miły! Bardzo przydatny pakiet dla takich perfekcjonistów jak ja :)
amiregelz
3
Istnieje również podobny pakiet: Align Tabular , który jest nieco bardziej elastyczny (możesz wyrównywać wiele znaków).
d_rail
Z AlignTab wspomnianym powyżej przez d_rail, pamiętaj, aby uciec |przed pojedynczym `\ '
użytkownikiem
Nie mogę uwierzyć, że to nie ma miliona głosów.
Charles,
44

Możesz to również zrobić bez zewnętrznego pakietu przy użyciu niewielkiego włamania, przy odrobinie większego wysiłku. Oto jak:

| reprezentuje kursor w tych instrukcjach.

  1. Utwórz kursory we wszystkich pożądanych liniach, używając Ctrl+ Kliknij lub wybierając blok tekstu i naciskając Ctrl+ Shift+ L. ( dokumenty wyboru )

  2. Dodaj dodatkowe spacje na końcu każdego słowa, dopóki każdy kursor nie znajdzie się w miejscu, w którym chcesz kolumnę, lub za nią (nie ma znaczenia, jak daleko minęła):

    foo     |
    barr     |
    foobar     |
    baz     |
    
  3. ( opcjonalnie 1 ) Wpisz dowolny znak, a następnie spację; użyjmy c:

    foo     c |
    barr     c |
    foobar     c |
    baz     c |
    
  4. Naciśnij, Homeaby kursory przechodziły na początek linii:

    |foo     c
    |barr     c
    |foobar     c
    |baz     c
    
  5. Naciskaj, → (right arrow) dopóki kursory nie znajdą się w kolumnie, w której chcesz:

    foo    | c
    barr   |  c
    foobar |    c
    baz    | c
    
  6. Naciśnij Ctrl+ Shift+, aby zaznaczyć wszystkie następujące białe znaki c, a następnie naciśnij Delete:

    foo    |
    barr   |
    foobar |
    baz    |
    
  7. ( opcjonalnie 1 ) Naciśnij Deleteponownie, aby usunąć dodatkowy znak spacji dodany w opcjonalnym kroku.


1 Używamy cznaku, po którym następuje spacja tylko wtedy, gdy w liniach znajduje się dodatkowa treść, którą chcemy zachować. Bez tego Ctrl+ Shift+ wybrałby pierwsze słowo dowolnej dodatkowej zawartości w liniach, co utrudniłoby usunięcie.

kogre
źródło
2
Na początku wygląda to na przekręcone, ale to fajny hack. Dobry do wklejania kolumn z odpowiednim wyrównaniem. Następną kolumnę można wkleić za pomocą wtyczki do ciasta tekstowego.
użytkownik
1
Używam tej techniki przez pewien czas, ale bądź ostrożny , ctrl+shift+rightnie traktuje wszystkich postaci konsekwentnie, więc może skończyć się wyborem więcej niż tylko białych znaków.
SpareBytes
1
Zgadzam się, to naprawdę fajna sztuczka. Ale po prostu wypróbowałem go bez postaci na końcu, użyłem Shift-End Deletei po prostu zadziałało. Czy to działa w niektórych przypadkach, ale w innych nie?
Septagram
Zawsze tak robię :)
Domino,
To nie działa, jeśli cw jednym wierszu jest przed końcem słowa w innym. To jest problem, który mam teraz. Niektóre wiersze nie zawierają wystarczającej liczby znaków, aby przewinąć w prawo, więc gdy to zrobisz, zostanie zawinięty do następnej linii, pozostawiając ten hack jako taki. To jest hack, a nie przydatny zamiennik.
leetNightshade
0

Dla tych, którzy chcą wcięcia na znaki inne niż =i |, byłem w stanie zainstalować pakiet Alignment i zmodyfikować plik, Sublime Text > Preferences > Package Settings > Alignment > Settings - Useraby wyglądał następująco:

{
  "alignment_chars": [
    "{create",
   ]
}

Następnie wybrałem następujący kod:

  let!(:admin_user) {create(:admin_user, :admin)}
  let!(:another_admin_user) {create(:admin_user, :admin)}
  let!(:superadmin_user1) {create(:admin_user, :superadmin)}
  let!(:superadmin_user2) {create(:admin_user, :superadmin)}
  let!(:nonadmin_user) {create(:admin_user)}

i wciśnięty, Command + Ctrl + Aaby wyrównać.

  let!(:admin_user)        {create(:admin_user, :admin)}
  let!(:another_admin_user){create(:admin_user, :admin)}
  let!(:superadmin_user1)  {create(:admin_user, :superadmin)}
  let!(:superadmin_user2)  {create(:admin_user, :superadmin)}
  let!(:nonadmin_user)     {create(:admin_user)}

Wszystko zostało przeniesione do lewej kolumny, w której {createtekst może znajdować się podczas wyrównywania.

Matthew Hinea
źródło