Wiem, że mogę łączyć linie w Vimie z J
kilkoma ich wariantami ( gJ
itp.); J
spowoduje „Usunięcie wcięcia i wstawienie maksymalnie dwóch spacji” .
Ale czy istnieje również prosty sposób wstawienia innej postaci zamiast dwóch spacji? Na przykład przecinek ( ,
) czy przecinek i spacja ( ,
)?
Dany:
8
9
10
32
Chciałbym skończyć z:
8, 9, 10, 32
lub:
8,9,10,32
line-breaks
Martin Tournoij
źródło
źródło
Odpowiedzi:
Napisałem wtyczkę Join, mogę robić, co chcesz i wiele więcej.
więcej szczegółów i zrzuty ekranu:
https://github.com/sk1418/Join
źródło
Prosty sposób jest następujący: po prostu wybierz swoje linie (wszystkie oprócz ostatniego) - lub użyj
%
- i uruchom:lub
(gdzie oczywiście
'<,'>
część została już wstawiona:
przez Vima, aby celować w wybór)(2.) Aktualizacja:
Opierając się na powyższym (i komentarzu Sato Katsury ), oto możliwa implementacja „interaktywnego łączenia” z liczeniem i opcjonalną obsługą powtarzania:
I rzeczywiste mapowanie:
Jest to trochę (*)
J
, ale interaktywne - będzie monitować o ciąg separatora. Domyślnym ciągiem jest spacja - na przykład, aby połączyć linie bez separatora, nacisnąćBackspace
po wyświetleniu monitu, aby usunąć domyślny znak spacji iEnter
zaakceptować (teraz) pusty separator. Policz np.3J
Też działa. Jeślitpope/vim-repeat
wtyczka jest zainstalowana, powtarzanie za pomocą „.” będzie również działać, ponownie wykorzystując ostatni separator i (jeśli nie zostanie zmieniony - np.10.
) ostatnią liczbę lub zakres linii wizualnej.(*) Nie jest to jednak dokładnie tak
J
: chociaż usunie wcięcia, nie będzie sprawdzać.!?
(końca frazy) wstawienia 2 spacji zamiast jednego lub wstawiania spacji tylko wtedy, gdy jej brakuje (ciężko jest zrobić coś takiego to, ponieważ ciąg separatora może być teraz dowolny). Usunie także końcowe spacje (ma to większy sens).Myślę, że może to być dobry sposób na przeciążenie ograniczonej przestrzeni na litery operatorów :)
Cóż, technicznie rzecz biorąc,
J
nie jest operatorem, ale zbliżonym do jednego - na przykład nie możesz tego zrobićJaw
, aby dołączyć do „słowa”.(sugestie są mile widziane)
źródło
:'<,'>-1s/\n/, /
dla zaznaczonych linii lub:1,$-1s/\n/, /
dla całego pliku.-1
?'<,'>-s/\n/, /
lub1,$-s/\n/, /
tak-
samo jak-1
.l:sep
jest&
, to zamiennik będzie działał niepoprawnie, ponieważ&
ma magię w zastępstwie. Być może lepiej będzie użyć\=
literału, aby użyć literałulet l:subst = 's/\n\+/\=' . "'" . l:sep . "'/"
- zamiast próbować obsługiwać ucieczkę.Oto przykład użycia zewnętrznego polecenia:
gdzie
%!
zastępuje bieżący bufor (zawartość pliku) poleceniem:paste -sd,
(parametry-s
służą do łączenia wielu linii i-d
ustawia znak separatora na,
).źródło
Na wypadek, gdyby ktoś nie lubił wpisywać Regex i zapamiętywać więcej poleceń Ex wtyczki:
Dołącz blok wizualny
Visual-block Append jest dostępny w trybie Visual Block (
<C-v>
) i może wykonać blok A ppend (i blok I nsert dla prepend). (zob .::help v_b_A
,:help v_b_I
)A jeśli ostatnim ruchem w trybie blokowym jest
$
, dołączanie zostanie wykonane na końcu wszystkich wyborów; w przeciwnym razie spacje zostaną wstawione przed dodanym tekstem (wyobraź sobie wyrównanie zamykania)
na końcu kilku wywołań metod w kodzie).Z przykładowym tekstem poniżej i kursorem na
8
:<C-v>}$A,<C-c>
. Po powrocie do trybu normalnego możemy zobaczyć, że,
jest dołączany do wszystkich wybranych linii. (Spróbuj bez$
)Następnie zrób,
gv
aby ponownie wybrać obszar iJ
lubgJ
. Mamy problem,
:8,9,10,12,
i$x
gotowe.Użyj Wstaw dla braku spływu
,
Cofnijmy nasz tekst (
uu..u
czy to fantazyjny:ea 1d<cr>:lat 1
) i wypróbuj Visual Insert:j<C-v>}I, <C-c>
a następnie możemy połączyć liniegJ
bez spacji.Czekaj czekaj czekaj, czegoś brakuje. Jak ponownie wybrać całą „tablicę”? Tym razem nie wybraliśmy pierwszej linii ... więc
gv
to nie pomaga.- Lub może pomóc,
gvok
to ponownie wybrać (gv
),o
pposite rogu i dok
góry.PS My Pinky nie jest wystarczająco szybkie i dokładne wpisywanie
/\
do/\n
, więc lubię połączenie Vim wbudowany w operacjach i ruchów, aby uniknąć przy użyciu regex. Jednak jeśli robię to wystarczająco często, używając mapowania - być może takie, które mapują na wtyczki powinny być lepsze.źródło
Znacznie prostszy sposób bez wtyczek i zewnętrznych poleceń do zmiany mapowania join (
J
) ze spacji na dowolny znak, który lubisz. Na przykład, aby dołączyć przecinek i spację:Aby wstawić nowy znak specjalny na końcu (
^M
), naciśnij,Ctrl-V
a następnie Return / Enter. To samo dzieje się, jeśli chcesz zastąpić tabulatorem (^I
), wpiszCtrl-I
wtedyTab
.Działa to poprzez zastąpienie nowej linii tabulatorem w bieżącym wierszu i ponowne przypisanie tego zachowania do znaku J.
Działa to również z kombinacjami, jak w
4J
celu dołączenia kolejnych 4 linii.źródło
Możesz nagrać makro, aby połączyć linie przecinkiem. Jest to przydatne, jeśli jest to rzadkie lub jednorazowe zadanie i nie pamiętasz, jak napisać polecenie zastępcze i wyrażenie regularne w celu wykonania zadania, ale pamiętasz, jak nagrać i uruchomić makro.
Aby połączyć linie przecinkiem, wpisz, qjgJi,Escqaby zarejestrować makro w rejestrze
j
. Następnie możesz uruchomić makro za pomocą @j. Możesz ponownie uruchomić makro za pomocą @@, co pozwala zaoszczędzić na pisaniu podczas wielokrotnego uruchamiania go z rzędu - możesz nawet przytrzymać, @aż zbliżysz się do końca linii, do której chcesz dołączyć. Możesz także użyć prefiksu numerycznego na @jlub @@powtórzyć go określoną liczbę razy. Pozostawia to nienaruszone początkowe i końcowe spacje, więc przed lub po przecinku będą spacje, jeśli w oryginalnym tekście były spacje.Aby połączyć przecinkiem i spacją, wstaw znak Spacemiędzy ,i Escpodczas rejestrowania makra.
Możesz także użyć Jzamiast gJpodczas nagrywania makra, które zwykle łączy linie przecinkiem i spacją. Jeśli jednak bieżąca linia ma końcowe białe znaki, przecinek pojawi się za białymi literami bez spacji. Ponadto, nie obejmuje miejsca, jeśli następny wiersz zaczyna się
)
, a to stawia dwa miejsca po przecinku, jeślijoinspaces
jest ustawiona, a obecne końce linii z.
,!
lub?
. Te zastrzeżenia zostały opisane poniżej:help J
.źródło