Załóżmy, że wybrałem już tekst w bieżącym buforze. Czy można wybrać inny odcinek tekstu, zachowując poprzedni wybór (i tak dalej)?
Dodano : Jedna motywacja dla tej funkcjonalności jest następująca: Załóżmy, że mam tekst, który wygląda tak:
paragraph 1 ...
paragraph 2 ...
paragraph 3 ...
paragraph 4 ...
paragraph 5 ...
Chciałbym usunąć niektóre akapity (np. 2, 4 i 6) i wstawić je przed akapitem 1.
multiple-cursors
może dać rozwiązanie.Odpowiedzi:
Możesz użyć
append-next-kill
(C-M-w
domyślnie ograniczone), aby zgromadzić tekst, który chcesz wstawić powyżejparagraph 1
:Zabij
paragraph 2
jak zwykle.Zaznacz
paragraph 4
i naciśnijC-M-w
przed zabiciem. Powtórz ten krok dla wszystkich akapitów, które chcesz przenieść wcześniejparagraph 1
.Kiedy skończysz, możesz wcześniej szarpać zgromadzony tekst
paragraph 1
.źródło
Można używać rejestrów połączonych z pierścieniem znaku. Popchnij bieżące znaki za pomocą
C-<SPC> C-<SPC>
, odzyskaj je później za pomocąC-u C-<SPC>
lub zapisz je w rejestrze, powiedzmyb
przezC-x r <SPC> b
, i wróć później za pomocąC-x r j b
.Teraz zaznacz inny region.
C-u C-x r s a
skopiuje zaznaczony region, aby zarejestrowaća
i usunąć tekst. Następnie zaznacz następny region iC-u C-x r + a
dołączy kolejny wybór do tego rejestrua
i usunie go.Następnie możesz wstawić zawartość za pomocą
C-x r i a
.Zobacz sekcję „Zapisywanie tekstu w rejestrach” podręcznika Emacsa.
źródło
Nowa obsługa regionu prostokąta w Emacs-24.4 faktycznie wprowadziła (dużą część) infrastrukturę potrzebną do tej funkcji [w końcu region prostokątny to niesąsiadujący region].
Dlatego powinno być możliwe wdrożenie pakietu „podzielonego regionu”, który zapewnia tylko żądaną funkcjonalność.
Trzeba przyznać, że wiele poleceń Emacsa wciąż nie zostało przystosowanych do korzystania z nowej infrastruktury (np. Polecenia upcase-region lub cofnij w regionie, zamień zapytanie, ...), a zatem nie działają jeszcze poprawnie na prostokątach (więc nie będą działać poprawnie na „podzielonym regionie”), ale są to błędy, które, mam nadzieję, powinny zostać z czasem naprawione.
źródło
Zainstaluj Browse-kill-ring.el
kopiuj i zabijaj wszystkie interesujące regiony.
Muszę wskazać, gdzie należy rozpocząć ponowne wstawianie.
M-x
browse-kill-ring
RET otworzy bufor i umieści w nim kursor.Wpisz, naby podróżować.
RET wstawi fragment w punkcie w oryginalnym / innym buforze.
źródło
Jeśli linie, którymi chcesz manipulować, można rozróżnić poprzez dopasowanie wyrażenia regularnego, możesz użyć trybu wystąpienia, aby wyświetlić je w nowym oknie. Następnie można użyć trybu edycji-zdarzenia, aby je edytować, przy czym oryginalny bufor odzwierciedla zmiany dokonane w buforze Występowania.
Działa to wspaniale, na przykład w połączeniu z trybem wielu kursorów : ponieważ linie, które wybrałeś do pojawienia się w buforze Occur, są wyświetlane w sposób ciągły, niezależnie od tego, jak daleko znajdują się w oryginalnym buforze, możesz zaznaczyć je wszystkie lub podzbiór, a następnie aktywuj
mc/edit-lines
i edytuj je wszystkie naraz. (Tak, wiem, że wiele kursorów może zrobić to wszystko samomc/mark-all-like-this
, ale fajnie jest mieć opcje).Wszelkie inne operacje edytowania, które byłyby łatwiejsze do wykonania, gdyby były widoczne tylko te wiersze, nad którymi chciałbyś pracować, takie jak konfigurowanie skomplikowanego wyszukiwania wyrażeń regularnych i zamiany lub makro, które musi uruchamiać się kolejno w każdym wierszu bufora, można również zrobić w ten sposób.
źródło
Odpowiada to na twoje ogólne pytanie, ale nie szczególnie na wspomniany przypadek użycia (przenoszenie fragmentów kodu).
Emacs ma teraz tak zwany region niesąsiadujący , o który pytasz. Vanilla Emacs nie zapewnia żadnego specjalnego sposobu tworzenia niesąsiadującego regionu, chyba że jest to prostokąt . Ale biblioteki Zones tak.
Library Zones pozwala zdefiniować wiele stref w buforze. Lista stref jest regionem nieciągła . Możesz również myśleć o tym jak o wielu regionach, w zależności od tego, jak chcesz z niego skorzystać. W dowolnym momencie możesz zdefiniować wiele list stref, z których każda jest przypisana do innej zmiennej stref, i możesz przełączać się między nimi.
Jeśli używasz również biblioteki Bookmark + , możesz trwale zapisywać listy stref i przywracać je w późniejszych sesjach Emacsa. Zakładka + pozwala także przypisywać dowolne tagi do zakładki. Oznacza to, że możesz otagować listę stref.
Strefy na danej liście stref są zwykle w tym samym buforze, ale nie muszą. W tym przypadku lista stref jest bardziej ogólna niż region niesąsiadujący. Jest to również bardziej ogólne, że każda strefa może zawierać dodatkowe informacje, poza granicami stref, i może mieć identyfikator.
Istnieje kilka sposobów utworzenia strefy. Jednym z najłatwiejszych w użyciu jest
C-x n a
: definiuje strefę z aktywnego regionu i dodaje ją do bieżącego zestawu stref. (C-x n n
(narrow-to-region
) również to robi, oprócz zwężania).Oto niektóre rzeczy, które możesz zrobić z zestawem (listą) stref:
facemenu+.el
.Zobacz także Narrow Indirect , który pozwala tworzyć bufory pośrednie, które są klonami danego bufora i które są zawężone do różnych jego części.
źródło
Inna opcja: transpozycja akapitów
Dla zapewnienia kompletności możesz uzyskać kolejność akapitów (sekwencyjnie) z zaznaczonymi regionami i
M-0 M-x transpose-paragraph
(argument zero powodujetra-par
zamianę akapitów, w których znajdują się punkt i znak, tj. Region zaczyna się i kończy)!Nawiasem mówiąc, działa to dla wszystkich
transpose-.*
poleceń (-słów, -sexp, -sentencji, ...) i jest niezwykle przydatne w wielu sytuacjach.źródło
Innym sposobem jest użycie pakietu objed (jestem autorem). Możesz zaznaczyć dowolny obiekt tekstowy, a
m
punkt zostanie automatycznie przeniesiony do następnego obiektu bieżącego typu. Odznacz dowolny obiekt, przechodząc do niego i ponownie naciśnij m. Oto przykładowy zrzut ekranu (pokazuje zaznaczanie linii, ale działa również na inne obiekty, takie jak akapity, odrzuca ...):źródło
package-install-from-archive: http://melpa.milkbox.net/packages/objed-20181201.1346.tar: Not found
.M-x package-refresh-contents
i wtedyM-x package-install
.