Czy istnieje dedykowany sposób scalenia dwóch bloków tekstu przez przeplatanie linii, na przykład przejście z tego:
a1
a2
a3
a4
b1
b2
b3
b4
do tego:
a1
b1
a2
b2
a3
b3
a4
b4
w kilku poleceniach?
EDYCJA : Naprawdę podoba mi się rozwiązanie Sato Katsury , oto jak go wdrożyłem:
function! Interleave()
" retrieve last selected area position and size
let start = line(".")
execute "normal! gvo\<esc>"
let end = line(".")
let [start, end] = sort([start, end], "n")
let size = (end - start + 1) / 2
" and interleave!
for i in range(size - 1)
execute (start + size + i). 'm' .(start + 2 * i)
endfor
endfunction
" Select your two contiguous, same-sized blocks, and use it to Interleave ;)
vnoremap <pickYourMap> <esc>:call Interleave()<CR>
vimscript
formatting
merge
iago-lito
źródło
źródło
scroll-binding
dwóch oknach Vima.b1
, a następnie uderzam,vip
aby zaznaczyć cały fragment, a następnie,,it
który jest<map-I've-Picked>
. Czy to nie działa po twojej stronie?Odpowiedzi:
Nie ma specjalnego sposobu na zrobienie tego (o ile mi wiadomo), ale tak, można to zrobić za pomocą kilku poleceń:
Możesz go uruchomić
:call Interleave(5, 8, 1)
. Pierwszy parametr to pierwszy wiersz do przeniesienia, drugi to ostatni wiersz, a trzeci to, gdzie je przenieść. Prawdopodobnie chcesz włączyć numery linii, aby zobaczyć, co robisz (:set number
).Zakłada się, że bloki się nie pokrywają. Zobacz
:help :move
i:help range()
zrozum, jak działa ta funkcja.Prawdopodobnie są lepsze sposoby na podniesienie dwóch bloków. Wokół unosi się wtyczka, która ma umożliwiać zamianę dwóch bloków. Nie pamiętam nazwy wtyczki, ale autor (być może słynny Dr. Chip?) Poświęcił więcej czasu na znalezienie interfejsu niż ja. :)
źródło
start
isize
. Dzięki funkcji homebrew, która pobiera te wartości z zaznaczenia, będzie to po prostu idealne. Pracuję nad tym. :)Oto kolejna alternatywa:
Najpierw skopiuj linie, które są 4 linie poniżej, za bieżącą linią (
:h :t
), a następnie usuń kolejne linie b (:h :d
)Jeszcze lepsze jest to polecenie:
Co oznacza, że dla każdej linii rozpoczynającej się od znalezienia znajdź następną linię rozpoczynającą się od „b” i przenieś ją poniżej bieżącej linii.
źródło
.+,$d
zamiast tego i to zadziałało (tak jak zrobiłem.+,.+4d
)./^\s*b
na inną:range
. np .: wybierz 1. blok, wykonaj'<,'>g/^/'>+1m.
'>+1
oznacza to początek drugiego bloku.Jeśli chcesz się trochę zabawić z makrami i znakami, możesz spróbować czegoś takiego:
Najpierw postawić znak (tutaj
a
) w wierszu zawierającyma1
zma
Przejdź do wiersza zawierającego
b1
i oznacz gomb
Rozpocznij rejestrowanie makra w żądanym rejestrze (tutaj rejestr
q
)qq
Wstaw następujące elementy do swojego makra:
ddmb'apjma'b
Zatrzymaj rejestrowanie makra za pomocą
q
Zagraj w nią tyle razy, ile potrzeba,
X@q
gdzieX
jest czas na grę.Aby szczegółowo opisać makro:
Edytuj Jak wspomniał o tym lago-lito w komentarzach, metoda ta nadpisze znaki i bufory.
Jeśli chodzi o oceny, nie sądzę, aby to był prawdziwy problem: rzadko używam wszystkich 26 znaków w buforze i myślę, że przez większość czasu można znaleźć 2 darmowe oceny.
W przypadku bufora możliwe jest zapisanie go w zmiennej tymczasowej: Przed zarejestrowaniem makra użyj
:let saveReg=getreg('"')
do zapisania rejestru, a po wykonaniu akcji użyj,:call setreg('"', saveReg)
aby przywrócić rejestr do poprzedniego stanu.W każdym razie muszę przyznać, że to rozwiązanie jest tylko szybkim obejściem i nie jest optymalne: Moim zdaniem odpowiedź Christana jest najlepsza i powinna zostać zaakceptowana, ponieważ nie psuje buforów i znaków, nie zmusza użytkownika do tworzenia funkcja i pokazuje siłę globalnego polecenia.
źródło
getreg()
isetreg()
zapisać bufor. Ale zgadzam się, że nie jest to optymalne rozwiązanie :-)Właśnie widziałem inne podobne pytanie, a rozwiązanie polega na:
Skocz na środek plus jeden:
I biegnij:
źródło