Chciałbym po prostu usunąć jakiś tekst, aby zamiast niego wyszarpnąć inny tekst . Jak mogę to zrobić? Cw wycina zaznaczony tekst, aby zabić pierścień, i kończy się bez tekstu, który chciałem szarpnąć.
Czy można też bezpośrednio szarpać tekst zamiast jakiegoś tekstu bez naciskania przycisków, aby go zabić?
Odpowiedzi:
Piszę
M-x delete-region
dość często, ale można to powiązać z klawiszem.Dzięki trybowi usuwania zaznaczenia w nowszych wersjach Emacsa nie musisz wpisywać polecenia, po prostu zacznij pisać:
źródło
delete-region
się z klawiszem, ponieważ Backspace robi to teraz. Backspace usuwa wybrany region zamiast go zabijać, innymi słowy, Backspace usuwa zaznaczony tekst bez zapisywania / wypychania go do pierścienia zabijania. Dzieje się tak, ponieważ wartośćdelete-active-region
jest równa,t
chyba że dostosujesz ją do innej wartości.Możesz użyć
M-y
after,C-y
aby wstawić poprzedni przedmiot z pierścienia zabijania lub użyć pakietu Browse-kill-ring .Jeśli chodzi o drugie pytanie, zobacz DeleteSelectionMode .
źródło
Miałem ten sam problem. Najbliższą rzeczą, jaką udało mi się do tej pory, jest po prostu utworzenie małej funkcji, która zasadniczo:
(defun ruthlessly-kill-line () "Deletes a line, but does not put it in the kill-ring. (kinda)" (interactive) (move-beginning-of-line 1) (kill-line 1) (setq kill-ring (cdr kill-ring)))
źródło
Zaczerpnięte z EmacsWiki :
źródło
MX eval-expression (setq kill-ring (cdr kill-ring)) - usuwa ostatni przedmiot z kill-ring
źródło
Jeśli chodzi o twoje drugie pytanie, alternatywnie do DeleteSelectionMode możesz włączyć tryb CUA, który dodatkowo daje ci ładny tryb wyboru prostokąta włączony przez C-Return. Tryb CUA jest częścią emacsa od 22.1.
źródło
Znalazłem odpowiedź na to.
Opublikowałem go jako pierwszy tutaj .
;; Ctrl-K with no kill (defun delete-line-no-kill () (interactive) (delete-region (point) (save-excursion (move-end-of-line 1) (point))) (delete-char 1) ) (global-set-key (kbd "C-k") 'delete-line-no-kill)
źródło
Większość funkcji zabijania używa
kill-region
do wykonywania rzeczywistej pracy zabijania tekstu. Używam makra lisp do tworzenia funkcji usuwania z funkcji kill.(defmacro jpk/delete-instead-of-kill (&rest body) "Replaces `kill-region' with `delete-region' in BODY." `(cl-letf (((symbol-function 'kill-region) (lambda (beg end &optional yank-handler) (delete-region beg end)))) ,@body)) (defun jpk/delete-word (arg) "Like `kill-word', but does not save to the `kill-ring'." (interactive "*p") (jpk/delete-instead-of-kill (kill-word arg)))
źródło
cl-letf
może tworzyć lokalne powiązanie funkcji z zakresem dynamicznym. Oznacza to, że obowiązuje tylko dla kodu wewnątrzcl-letf
, ale odnosi się do całego drzewa wywołań (np.kill-region
Nie pojawia się bezpośrednio wbody
, alekill-word
wywołujekill-region
i jest zastępowane przezdelete-region
).cl-letf
.cl-letf
działa tak jaklet*
w tym sensie.Technicznie rzecz biorąc, inne odpowiedzi są błędne w pierwszej części.
Oto moja realizacja i motywacja:
(defun delete-word (arg) "Delete characters backward until encountering the beginning of a word. With argument ARG, do this that many times." (interactive "p") (delete-region (point) (progn (backward-word arg) (point))))
Zaadaptowałem tutaj kod z „
kill-word
” wsimple.el
. Przeszedłemkill-region
zdelete-region
iforward-word
dobackward-word
. W ten sposób PRAWDZIWIE nie wpływa to nakill-ring
, w przeciwieństwie do innych sytuacji, w których poza emacsem zauważyłem, żekill-ring
był pod wpływem.źródło
(defun copy-to-register-z (p1 p2) "Copy text selection to register named “z”." (interactive "r") (copy-to-register ?z p1 p2)) (defun replace-register-content-z (p1 p2) "Replace register named “z”'s content." (interactive "r") (delete-region p1 p2) (insert-register ?z)) (global-set-key (kbd "C-c c") 'copy-to-register-z) (global-set-key (kbd "C-c v") 'replace-register-content-z)
źródło
Dodaj odpowiednik usuwania kluczy regionu zabicia i linii zabicia Cw i Ck w następujący sposób. Związany z klawiszami Cv i Cz.
źródło
Moja odpowiedź na pierwsze pytanie: zaznacz tekst w emacs (używając myszki lub set mark
C-SPC
) i naciśnij przycisk "<- Backspace" na klawiaturze zamiastC-w
. W ten sposób nadal możesz wkleić tekst w schowku systemowym, bez obawy, że schowek został zastąpiony przez tekst zabity przezC-w
Tło dla tej odpowiedzi: czasami, gdy otrzymałem tekst poza emacsem, którego chcę użyć do zastąpienia regionu w emacsie, często popełniałem błąd, najpierw kopiując ten tekst do schowka systemowego (np. W systemie Windows
Ctrl + C
), a następnie robiącC-w
w emacsie „ usuń "region tekstu, który chcę zastąpić, z nadzieją, że później będzieM-w
mógł odzyskać mój tekst w schowku z zabójczego pierścienia. Niestety schowek zostałby po prostu zastąpiony tekstem zabitym przezC-w
, a oryginalna wiadomość w schowku nigdy nie byłaby wyświetlana w pierścieniu zabijania.Drugie pytanie brzmi: tak, zawsze możesz najpierw zaznaczyć tekst w emacsie, a potem bezpośrednio
C-y
źródło
Oto wersja
kill-region
, która nie wymusza wartości w pierścieniu zabijania.(defun kill-or-delete-region (beg end prefix) "Delete the region, storing it in the kill-ring. If a prefix argument is given, don't change the kill-ring." (interactive "r\nP") (if prefix (delete-region beg end) (kill-region beg end))) (global-set-key (kbd "C-w") 'kill-or-delete-region)
Dzięki temu możesz zrobić to
C-w
jak poprzednio, aleC-u C-w
teraz usuwa tekst bez zmiany pierścienia zabijania.źródło
delete-region
funkcja usunie wybrany obszar bez dodawania go do ringu killMyślę, że pytasz, jak zastąpić tekst w wybranym regionie czymś, co już umieściłeś na pierścieniu zabijania.
Ustawienie
(delete-selection-mode 1)
pozwoli ci na szarpanie / wklejanie w wybranym regionie. Pozwala również na wpisanie i zastąpienie wybranego regionu.W wersji 25.1.1 na OS XI również musiałem dodać,
(setq select-enable-primary nil)
aby zapobiec kopiowaniu wybranego regionu do pierścienia zabijaniaźródło
Jako uzupełnienie wszystkich odpowiedzi. Jeśli napiszesz kod elisp do usunięcia, możesz wywoływać funkcje, które zabijają, o ile używasz lokalnego obiektu pierścienia zabijania, takiego jak ten:
(defun delete-something() "Delete something without storing in kill ring." (let (kill-ring) (kill-something)))
Użyj dowolnej funkcji, która coś zabije zamiast zabicia czegoś. Funkcja zostanie usunięta i nic nie zostanie zapamiętane w prawdziwym pierścieniu zabijania.
źródło