Discussion:
[Emacs] Shortcut Zeile kopieren
(zu alt für eine Antwort)
Andreas Kohlbach
2016-08-30 20:52:46 UTC
Permalink
Ich nutze schon seit langem C-k für "kill" (sonst als "cut" oder
"Ausschneiden" im Deutschen bekannt) und kann dann mit C-y für "yank"
("paste" bzw. "Einfügen") einfügen. Wie aber kopiere ich eine Zeile?

Ich hatte diverse Shortcuts, wie M-w probiert. Das z.B. nimmt sich aber
gleich einen vollen Absatz. Ich finde da irgendwie nichts.
--
Andreas
You know you are a redneck if
your checks feature pictures of dogs fighting.
Matthias Wiehl
2016-08-30 23:56:55 UTC
Permalink
Ich nutze schon seit langem C-k für "kill" [...] und kann dann mit
C-y für "yank" [...] einfügen. Wie aber kopiere ich eine Zeile?
Genau so und dann noch mal C-y.
Ich hatte diverse Shortcuts, wie M-w probiert.
Das ist auch eine Möglichkeit. Mehr dazu:
<https://www.emacswiki.org/emacs/CopyingWholeLines>
Das z.B. nimmt sich aber gleich einen vollen Absatz.
Bist du sicher?

In einem serienmäßigen Emacs kopiert M-w (`kill-ring-save') alles
zwischen mark und point, die region, in den kill ring. Wenn du mark am
Zeilenanfang setzt (C-SPC) und dann point in die nächste Zeile
verschiebst (C-n), dann hast du genau eine Zeile in der region.
Andreas Kohlbach
2016-08-31 20:34:21 UTC
Permalink
Post by Matthias Wiehl
Ich nutze schon seit langem C-k für "kill" [...] und kann dann mit
C-y für "yank" [...] einfügen. Wie aber kopiere ich eine Zeile?
Genau so und dann noch mal C-y.
Also ausschneiden, dann auf selber Stelle wieder neu einfügen, dann
dorthin gehen, wo die Kopie eigentlich sein soll? Das scheint mir zu
kompliziert, auch wenn es funktioniert.
Post by Matthias Wiehl
Ich hatte diverse Shortcuts, wie M-w probiert.
<https://www.emacswiki.org/emacs/CopyingWholeLines>
Das Beispiel daraus

| ‘C-a C-SPC C-e M-w’ copies the current line without the newline.

funktioniert. Es sind aber IMO zu viele Tasten nötig zum Kopieren. Und
auch das Beispiel zum Ausschneiden und Einfügen

| ‘C-a C-k C-y’ kills and yanks back the line without newline if
| kill-whole-line is nil

ist IMO zu lang. Denn ein einfaches ‘C-k C-y’ reicht bei auf meiner Kiste.
Post by Matthias Wiehl
Das z.B. nimmt sich aber gleich einen vollen Absatz.
Bist du sicher?
Nein, war Zufall, dass es gerade der Absatz gestern war.

Es nimmt alles bis zu einer bestimmten Position - in diesem Artikel ist
diese über dem Wort "Weiter" nach dem Ansatz unten. Wie er nun genau auf
diese Position kommt (ich habe kein C-SPC benutzt), weiß ich nicht.
Post by Matthias Wiehl
In einem serienmäßigen Emacs kopiert M-w (`kill-ring-save') alles
zwischen mark und point, die region, in den kill ring. Wenn du mark am
Zeilenanfang setzt (C-SPC) und dann point in die nächste Zeile
verschiebst (C-n), dann hast du genau eine Zeile in der region.
Obwohl mir C-SPC (geht wohl auch mit C-@) bekannt war, hatte ich da nicht
dran gedacht. Das scheint zu funktionieren.

Ich hoffte aber auch ohne Markieren von Anfang und Ende einer Zeile, sondern
durch bloßes Positionieren des Cursors auf den Zeilenanfang mit gesuchtem
Shortcut betreffende Zeile in die "Zwischenablage" zu kopieren. So wie
ich auch mit C-k und ohne vorheriges Markieren ausschneiden kann. Geht das?
--
Andreas
You know you are a redneck if
in tough situations you ask yourself, "what would curly do?"
Andreas Kohlbach
2016-08-31 20:41:10 UTC
Permalink
Post by Andreas Kohlbach
| ‘C-a C-k C-y’ kills and yanks back the line without newline if
| kill-whole-line is nil
ist IMO zu lang. Denn ein einfaches ‘C-k C-y’ reicht bei auf meiner Kiste.
Zu spät gesehen. Ich habe u.a

(define-key message-mode-map "\C-cqk" 'boxquote-kill)
(define-key message-mode-map "\C-cqy" 'boxquote-yank)

in meiner .gnus, was mir das offenbar erlaubt. Sorry, ich hätte schon
gestern nach schauen sollen.
--
Andreas
You know you are a redneck if
in tough situations you ask yourself, "what would curly do?"
Matthias Wiehl
2016-08-31 22:53:50 UTC
Permalink
Post by Andreas Kohlbach
Ich hoffte aber auch ohne Markieren von Anfang und Ende einer Zeile, sondern
durch bloßes Positionieren des Cursors auf den Zeilenanfang mit gesuchtem
Shortcut betreffende Zeile in die "Zwischenablage" zu kopieren. So wie
ich auch mit C-k und ohne vorheriges Markieren ausschneiden kann. Geht das?
In Emacs geht (fast) alles.

Du kannst Tasten und Tastenkombinationen beliebig definieren - in
einem bestimmten Puffer, in einem bestimmten major mode oder global.
So lassen sich auch Tastenkombinationen verkürzen. Beispiel:

(global-set-key "\C-cc" "\C-a\C- \C-n\M-w")

Das macht, dass C-c c in allen Puffern dasselbe bewirkt wie C-a C-SPC
C-n M-w, nämlich, dass die aktuelle Zeile in den kill ring kopiert
wird. Nachteile: Verschiebt point an den Anfang der nächsten Zeile und
funktioniert nicht, wenn es am Puffer-Ende ausgeführt wird und das
Puffer-Ende gleichzeitig ein Zeilenanfang ist.

Folgende Funktion erfüllt denselben Zweck, lässt jedoch point
unverändert und funktioniert überall im Puffer.

,----[ Abwandlung von <http://stackoverflow.com/a/3208345/4442714> ]
| (defun mw-copy-line ()
| "Copy the line at point to the kill ring, leaving point intact."
| (interactive "*")
| (save-excursion
| ;; The last line of the buffer cannot be killed if it is empty.
| (if (and (eobp) (bolp))
| (message "Current line begins at end of buffer, nothing killed.")
| ;; Otherwise kill the whole line.
| (let ((kill-read-only-ok t)
| deactivate-mark)
| (toggle-read-only 1)
| (kill-whole-line)
| (toggle-read-only 0)))))
`----

Natürlich lassen sich (interaktive) Funktionen auf eine Taste legen:

(global-set-key (kbd "C-c c") 'mw-copy-line)

Noch eine Möglichkeit: Folgender Code verändert die in Emacs
eingebauten Funktionen `kill-ring-save' und `kill-region' so, dass sie
die aktuelle Zeile kopieren bzw. killen, wenn keine region ausgewählt
ist. Evaluieren und dann M-w oder C-w tippen.

,----[ <http://stackoverflow.com/a/890279/4442714> ]
| (transient-mark-mode t)
| (defadvice kill-ring-save (before slick-copy activate compile)
| "When called interactively with no active region, copy a single line
| instead."
| (interactive
| (if mark-active (list (region-beginning) (region-end))
| (message "Copied line")
| (list (line-beginning-position)
| (line-beginning-position 2)))))
| (defadvice kill-region (before slick-cut activate compile)
| "When called interactively with no active region, kill a single line
| instead."
| (interactive
| (if mark-active (list (region-beginning) (region-end))
| (list (line-beginning-position)
| (line-beginning-position 2)))))
`----
Andreas Kohlbach
2016-09-01 21:36:24 UTC
Permalink
Post by Matthias Wiehl
Post by Andreas Kohlbach
Ich hoffte aber auch ohne Markieren von Anfang und Ende einer Zeile, sondern
durch bloßes Positionieren des Cursors auf den Zeilenanfang mit gesuchtem
Shortcut betreffende Zeile in die "Zwischenablage" zu kopieren. So wie
ich auch mit C-k und ohne vorheriges Markieren ausschneiden kann. Geht das?
In Emacs geht (fast) alles.
Du kannst Tasten und Tastenkombinationen beliebig definieren - in
einem bestimmten Puffer, in einem bestimmten major mode oder global.
(global-set-key "\C-cc" "\C-a\C- \C-n\M-w")
Das macht, dass C-c c in allen Puffern dasselbe bewirkt wie C-a C-SPC
C-n M-w, nämlich, dass die aktuelle Zeile in den kill ring kopiert
wird. Nachteile: Verschiebt point an den Anfang der nächsten Zeile und
funktioniert nicht, wenn es am Puffer-Ende ausgeführt wird und das
Puffer-Ende gleichzeitig ein Zeilenanfang ist.
Das funktioniert aber im Wesentlichen, dass ich die Zeile einfach mal
übernommen habe.

[...]
Post by Matthias Wiehl
(global-set-key (kbd "C-c c") 'mw-copy-line)
Da gab es eine Fehlermeldung "unknown funtion" oder ähnlich. Aber das
oben funktioniert. Danke.

[...]
--
Andreas
You know you are a redneck if
your wife has a beer belly and you find it attractive.
Loading...