Discussion:
Emacs Rectangle Funktionen - wo ist kopieren?
(zu alt für eine Antwort)
Heino Tiedemann
2011-09-08 10:04:09 UTC
Permalink
Hallo,

betrifft GNU emacs 23.3.1

Ich bin gerade etwas verwirrt.

Für einfache regions gibt es CUT und COPY:

die Tastenkombi C-w für kill-region:

"Kill ("cut") text between point and mark."

Und es gibt M-w für kill-ring-save:

"Save the region as if killed, but don't kill it."

Prima.

Im Umgang mit rectangles finde ich nur das einfache CUT (kill-
rectangle), das einfache COPY (kill-rectangle-save??) jedoch nicht.

Wenn ich also ein Rechteck einfach nur kopieren möchte muss ich es
immer gleich löschen oder mit Registern arbeiten.

Frage: Gibt’s diese funktion - ich finde Sie nur nicht -
Zum Bsp hier http://www.delorie.com/gnu/docs/emacs/emacs_68.html

...oder ist das wirklich so inkonsequent?


Heino
Andreas Röhler
2011-09-08 14:13:04 UTC
Permalink
Post by Heino Tiedemann
Hallo,
betrifft GNU emacs 23.3.1
Ich bin gerade etwas verwirrt.
"Kill ("cut") text between point and mark."
"Save the region as if killed, but don't kill it."
Prima.
Im Umgang mit rectangles finde ich nur das einfache CUT (kill-
rectangle), das einfache COPY (kill-rectangle-save??) jedoch nicht.
Wenn ich also ein Rechteck einfach nur kopieren möchte muss ich es
immer gleich löschen oder mit Registern arbeiten.
Frage: Gibt’s diese funktion - ich finde Sie nur nicht -
Zum Bsp hier http://www.delorie.com/gnu/docs/emacs/emacs_68.html
...oder ist das wirklich so inkonsequent?
Heino
sehe es auf den ersten Blick auch nicht. Früher gab es Rechteckiges zB
in cua-mode dateien, wo es niemand vermuten würde.

So ist es halt.

Hier ein Ansatz, wie sich eventuell weiterkommen ließe:

(defun toscana-fraction-copies-rectangle (start end)
"Return the contents of the rectangle with corners at START and END.
Return it as a list of strings, one for each line of the rectangle."
(interactive "r")
(let ((lines (list nil))
erg)
(apply-on-rectangle 'extract-rectangle-line start end lines)
(setq erg (nreverse (cdr lines)))
(message "%s" erg)))


Grüße

Andreas

--
https://launchpad.net/python-mode
https://launchpad.net/s-x-emacs-werkstatt/
Heino Tiedemann
2011-09-08 16:44:51 UTC
Permalink
Post by Andreas Röhler
So ist es halt.
(defun toscana-fraction-copies-rectangle (start end)
"Return the contents of the rectangle with corners at START and END.
Return it as a list of strings, one for each line of the rectangle."
(interactive "r")
(let ((lines (list nil))
erg)
(apply-on-rectangle 'extract-rectangle-line start end lines)
(setq erg (nreverse (cdr lines)))
(message "%s" erg)))
Als hinweis: die Arbeit mit Registern geht ja als Alternative auch.

ich wollte es einfach nur mal wissen.

Und - ich habe mich auch geirrt.

Macht man ein kill-rectangle (also ein Ausschnieden), so hat man
mitnichten das Rechteck im Ringbuffer!


Man hat es zwar sauber ausgeschnitten, aber wenn man dann ein yank
macht, bekommt man was ganz anders, nämlich alles was rundum das
Rechteck war und zwar Zeilenweise.

Diese Funktion ist also wohl tatsächlich nur zum löschen.
Frage mich, das dann die funktion delete-rectangle soll...

Heino
Olaf Meltzer
2011-09-08 17:52:03 UTC
Permalink
Post by Heino Tiedemann
Macht man ein kill-rectangle (also ein Ausschnieden), so hat man
mitnichten das Rechteck im Ringbuffer!
Man hat es zwar sauber ausgeschnitten, aber wenn man dann ein yank
macht, bekommt man was ganz anders, nämlich alles was rundum das
Rechteck war und zwar Zeilenweise.
yank-rectangle fügt doch das ausgeschnittene Rechteck ein.

Vor langer Zeit habe ich mir mal die Funktionstasten F2 bis F4 -- für
rechteckige Bereiche modifiziert Shift-F2 und Shift-F4 -- eingerichtet.
Aber das von Dir gesuchte copy-rectangle für Shift-F3 fehlte mir auch
schon ewig. Dank dem von Andreas R. geposteten Ansatz konnte ich das
jetzt ergänzen, indem ich lediglich toscana-fraction-copies-rectangle
durch das intuitivere copy-rectangle ersetzte:

;; Funktion copy-rectangle definieren

(defun copy-rectangle (start end)
"Return the contents of the rectangle with corners at START and END.
Return it as a list of strings, one for each line of the rectangle."
(interactive "r")
(let ((lines (list nil))
erg)
(apply-on-rectangle 'extract-rectangle-line start end lines)
(setq erg (nreverse (cdr lines)))
(message "%s" erg)))

;; Markierten Bereich bearbeiten:

(global-set-key [f1] 'undo) ;; Undo
(global-set-key [f2] 'kill-region) ;; Cut
(global-set-key [f3] 'copy-region-as-kill) ;; Copy
(global-set-key [f4] 'yank) ;; Paste

;; Rechteckigen Bereich bearbeiten:

(global-set-key [S-f2] 'kill-rectangle) ;; Cut Rectangle
(global-set-key [S-f3] 'copy-rectangle) ;; Copy Rectangle
(global-set-key [S-f4] 'yank-rectangle) ;; Paste Rectangle

Gruß -- Olaf Meltzer
--
openSUSE 11.4 (i586) mit Kernel 2.6.37.6-0.7-desktop
KDE: 4.6.00 (4.6.0) "release 6"
Ralf Döblitz
2011-09-08 17:51:12 UTC
Permalink
Heino Tiedemann <***@gmx.de> schrieb:
[...]
Post by Heino Tiedemann
Und - ich habe mich auch geirrt.
Macht man ein kill-rectangle (also ein Ausschnieden), so hat man
mitnichten das Rechteck im Ringbuffer!
Man hat das Rechteck in einem anderen Buffer, von dem aus man es mit
yank-rectangle einfügen kann. Deshalb nehme ich auch immer nur
kill-rectangle gefolgt von undo um ein copy-rectangle zu emulieren.
Alternativ vor und nach dem kill-rectangle das read-only-Flag toggeln,
dann wird auch nur kopiert und nicht gelöscht.

Wenn du aber unbedingt willst, dann kannst du dir auch einfach den
Sourcecode von kill-rectangle aus rect.el schnappen und für ein
copy-rectangle so umbasteln, daß immer nur die extract-rectangle nimmt
als ob der Buffer read-only wäre.

[...]
Post by Heino Tiedemann
Diese Funktion ist also wohl tatsächlich nur zum löschen.
Frage mich, das dann die funktion delete-rectangle soll...
Die löscht ohne den Inhalt für späteres Einfügen zu speichern.

BTW: mit "describe-key" oder "apropos" kannst du dir diese Dokumentation
auch beqeum im Emacs anzeigen lassen ... ;-)

Ralf
--
"de.alt.comp.kde Die Kommunistische Desktop Erweiterung."
  – Sven Paulus in <67hu21$43r$***@imperator.oops.sub.de>
Heino Tiedemann
2011-09-09 07:22:36 UTC
Permalink
Post by Ralf Döblitz
Post by Heino Tiedemann
Macht man ein kill-rectangle (also ein Ausschnieden), so hat man
mitnichten das Rechteck im Ringbuffer!
Man hat das Rechteck in einem anderen Buffer, von dem aus man es mit
yank-rectangle einfügen kann.
Ich doof! ihr habt ja beide recht.
Post by Ralf Döblitz
Deshalb nehme ich auch immer nur
kill-rectangle gefolgt von undo um ein copy-rectangle zu emulieren.
Gute Idee - ist wohl das beste.
Post by Ralf Döblitz
Wenn du aber unbedingt willst, dann kannst du dir auch einfach den
Sourcecode von kill-rectangle aus rect.el schnappen und für ein
copy-rectangle so umbasteln, daß immer nur die extract-rectangle nimmt
als ob der Buffer read-only wäre.
Was man mir so zutraut ist schmeichelhaft :)
Post by Ralf Döblitz
BTW: mit "describe-key" oder "apropos" kannst du dir diese Dokumentation
auch beqeum im Emacs anzeigen lassen ... ;-)
Ich weiß.

bequem finde ich das Web aber auch :)
Und es lässt sich so gut un newsbeiträgen verlinken

ich denke mit der Methode

1) kill
2) undo

Komme ich wohl klar.

aber interessant ist der Fall schon..

Heino

Stefan Reuther
2011-09-08 16:30:44 UTC
Permalink
Post by Heino Tiedemann
Ich bin gerade etwas verwirrt.
[...]
Post by Heino Tiedemann
Im Umgang mit rectangles finde ich nur das einfache CUT (kill-
rectangle), das einfache COPY (kill-rectangle-save??) jedoch nicht.
Ich hab die Kopierfunktion bisher auch nicht gefunden. Aber man kann ja
ausschneiden und danach mit Undo den Text wiederherstellen.


Stefan
Loading...