Jak wybrać niesąsiadujące regiony w Emacsie?


31

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.


1
Istnieje drugi wybór .
wasamasa

2
Istnieje pakiet multiselect: skamphausen.de/cgi-bin/ska/multiselect Wygląda to trochę jak szybki hack.
Tobias

W zależności od rozmiaru wybieranego i dlaczego, multiple-cursorsmoże dać rozwiązanie.
Jordon Biondo

@wasamasa Postępowałem zgodnie z instrukcjami podanymi w podanym linku. Po pierwszej selekcji wybrałem drugi region, zachowując klucz Meta. Został on wybrany, ale istnieją dwa problemy: (1) drugi wybór wydaje się nie być rzeczywistym wyborem, ponieważ kopiowanie lub usuwanie nie działa. (2) w ten sposób nie można wybrać trzeciego wyboru.
Imię, nazwisko,

1
Wiki Emacsa ma dobrą sekcję na temat selekcji wtórnej . Różne ulepszenia sprawiają, że na przykład jest bardziej użyteczny z klawiatury.
Drew

Odpowiedzi:


43

Możesz użyć append-next-kill( C-M-wdomyślnie ograniczone), aby zgromadzić tekst, który chcesz wstawić powyżej paragraph 1:

  1. Zabij paragraph 2jak zwykle.

  2. Zaznacz paragraph 4i naciśnij C-M-wprzed zabiciem. Powtórz ten krok dla wszystkich akapitów, które chcesz przenieść wcześniej paragraph 1.

Kiedy skończysz, możesz wcześniej szarpać zgromadzony tekst paragraph 1.


5
Nawet w przypadku podstawowych rzeczy zawsze można nauczyć się nowych rzeczy! Jest to bardzo przydatne, ponieważ zwykle tracę dużo naciskania klawiszy, podróżując po pierścieniu zabijania, gdy muszę to zrobić. Żałuję, że nie mogę jeszcze głosować ...
użytkownika

9

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, powiedzmy bprzez C-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 askopiuje zaznaczony region, aby zarejestrować ai usunąć tekst. Następnie zaznacz następny region i C-u C-x r + adołączy kolejny wybór do tego rejestru ai usunie go.

Następnie możesz wstawić zawartość za pomocą C-x r i a.

Zobacz sekcję „Zapisywanie tekstu w rejestrach” podręcznika Emacsa.


5

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.


4

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.


3

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-linesi edytuj je wszystkie naraz. (Tak, wiem, że wiele kursorów może zrobić to wszystko samo mc/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.


3

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:

  • Sortuj je.
  • Łącz (przylegaj) strefy przyległe lub zachodzące na siebie (co obejmuje ich sortowanie).
  • Przecinaj je.
  • Zawęź bufor do strefy na liście. Cykl między zawężeniami. Zobacz wiele zwężeń .
  • Wybierz strefę z listy jako aktywny region. Jeździć na rowerze między regionami.
  • Wyszukaj je (najpierw zostaną automatycznie zjednoczone). Do tego potrzebujesz biblioteki Isearch + .
  • Zapytanie-zamień je.
  • Zaznacz je i zaznacz je. (Do tego potrzebujesz podświetlenia biblioteki lub biblioteki 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.


2

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 powoduje tra-parzamianę 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.


2

Innym sposobem jest użycie pakietu objed (jestem autorem). Możesz zaznaczyć dowolny obiekt tekstowy, a mpunkt 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 ...):

wprowadź opis zdjęcia tutaj


Gdy próbuję zainstalować ten pakiet z Melpy, pojawia się błąd package-install-from-archive: http://melpa.milkbox.net/packages/objed-20181201.1346.tar: Not found.
Imię

@Nazwa To brzmi jak potrzeba aktualizacji listy pakietów. Spróbuj M-x package-refresh-contentsi wtedy M-x package-install.
clemera,

@Nazwa Czy to działa teraz? Daj mi znać, jeśli masz dodatkowe pytania.
clemera,

Byłem w stanie zainstalować pakiet. Wydaje się, że działa dobrze, nie przetestowałem wszystkich jego funkcji. Dziękuję Ci.
Nazwisko
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.