Emacs vs. Vi vs. Eclipse vs. anyIDE

Kill-Ring

C-k - kill to end of line
C-w - kill region
M-w - copy region to kill ring
C-y + yank last kill item
M-y + (directly after a C-y) replace inserted kill item by previous kill item
C-u - M-y + replace inserted kill item by next kill item

Undo

  • The Emacs undo semantics is lossless.
  • Vi has a lossless (and persistent) undo tree and so does Emacs (Emacs: Undo Tree package)

Standard Undo Function

The standard undo semantics of adding edits, undo some and – with the next edit – loose everything that was undone is just silly.

Step Action Description
Edit 4 chunks added a, b, c, d
Undo 2 chunks removed d, c
Edit 2 chunks added e, f
Undo 2 chunks removed f, e
  Undo 1 chunk removed b

digraph graph0 { subgraph cluster_graph0 { n0 [label="1",shape=circle;fontsize=10,widht=0.4,height=0.4;fixedsize=true]; a0 [label="a"]; b0 [label="b"]; c0 [label="c"]; d0 [label="d"]; edge [style=solid,dir=forward,color=green]; a0 -> b0 -> c0 -> d0; } subgraph cluster_graph1 { n1 [label="2",shape=circle;fontsize=10,widht=0.4,height=0.4;fixedsize=true]; a1 [label="a"]; b1 [label="b"]; c1 [label="c"]; d1 [label="d"]; edge [style=dashed,dir=none,color=green]; a1 -> b1 -> c1 -> d1; edge [style=solid,dir=forward,color=red]; d1 -> c1 -> b1; } subgraph cluster_graph2 { n2 [label="3",shape=circle;fontsize=10,widht=0.4,height=0.4;fixedsize=true]; a2 [label="a"]; b2 [label="b"]; c2 [label="c",style=invis]; d2 [label="d",style=invis]; e2 [label="e"]; f2 [label="f"]; edge [style=dashed,dir=none,color=green]; a2 -> b2; edge [style=invis,dir=none,color=red]; b2 -> c2 -> d2 -> c2 -> b2; edge [style=solid,dir=forward,color=green]; b2 -> e2 -> f2; } subgraph cluster_graph3 { n3 [label="4",shape=circle;fontsize=10,widht=0.4,height=0.4;fixedsize=true]; a3 [label="a"]; b3 [label="b"]; c3 [label="c",style=invis]; d3 [label="d",style=invis]; e3 [label="e"]; f3 [label="f"]; edge [style=dashed,dir=none,color=green]; a3 -> b3; edge [style=invis,dir=none,color=red]; b3 -> c3 -> d3 -> c3 -> b3; edge [style=dashed,dir=none,color=green]; b3 -> e3 -> f3; edge [style=solid,dir=forward,color=red]; f3 -> e3 -> b3 -> a3; } }

Emacs Undo Function

For Emacs an undo that removes a previous edit is just another action that can be undone later.

Step Action Description
Edit 4 chunks added a, b, c, d
Undo 2 chunks removed d, c
Edit 2 chunks added e, f
Undo 2 chunks removed f, e
  Undo 2 chunks added c, d

digraph graph0 { subgraph cluster_graph0 { n0 [label="1",shape=circle;fontsize=10,widht=0.4,height=0.4;fixedsize=true]; a0 [label="a"]; b0 [label="b"]; c0 [label="c"]; d0 [label="d"]; // edge [style=invis]; // n0 -> a0; edge [style=solid,dir=forward,color=green]; a0 -> b0 -> c0 -> d0; } subgraph cluster_graph1 { n1 [label="2",shape=circle;fontsize=10,widht=0.4,height=0.4;fixedsize=true]; a1 [label="a"]; b1 [label="b"]; c1 [label="c"]; d1 [label="d"]; edge [style=dashed,dir=none,color=green]; a1 -> b1 -> c1 -> d1; edge [style=solid,dir=forward,color=red]; d1 -> c1 -> b1; } subgraph cluster_graph2 { n2 [label="3",shape=circle;fontsize=10,widht=0.4,height=0.4;fixedsize=true]; a2 [label="a"]; b2 [label="b"]; c2 [label="c"]; d2 [label="d"]; e2 [label="e"]; f2 [label="f"]; edge [style=dashed,dir=none,color=green]; a2 -> b2 -> c2 -> d2; edge [style=dashed,dir=none,color=red]; d2 -> c2 -> b2; edge [style=solid,dir=forward,color=green]; b2 -> e2 -> f2; } subgraph cluster_graph3 { n3 [label="4",shape=circle;fontsize=10,widht=0.4,height=0.4;fixedsize=true]; a3 [label="a"]; b3 [label="b"]; c3 [label="c"]; d3 [label="d"]; e3 [label="e"]; f3 [label="f"]; edge [style=dashed,dir=none,color=green]; a3 -> b3 -> c3 -> d3; edge [style=dashed,dir=none,color=red]; d3 -> c3 -> b3; edge [style=dashed,dir=none,color=green]; b3 -> e3 -> f3; edge [style=solid,dir=forward,color=red]; f3 -> e3 -> b3; edge [style=solid,dir=forward,color=green]; b3 -> c3 -> d3; } }

Emacs Undo Tree

The Emacs: Undo Tree package realizes the previously described tree structure removing the recursion from branches. It offers a visual interface (C-x u) for easy navigation and fancy display of diffs .

C-/ undo-tree-undo
C-_ undo-tree-undo
C-? undo-tree-redo
C-x u undo-tree-visualize

Dynamic Abbreviation Expansion

M-/ = Alt+Shift+7

Start typing a word, e.g. dy, then press M-/ repeatedly. All open buffers (not just project files) are searched for a matching expansion:

dynamic
dylan
dyl
dylan-console
dylan-repl
dylanlid
dylan-lid
dy

This is extremely useful for using long identifiers in programs:

VERY_LONG_IDENTIFIERS_WHICH_NOBODY_WANTS_TO_TYPE = "value"

...

VE RY_LONG_IDENTIFIERS_WHICH_NOBODY_WANTS_TO_TYPE

Eclipse only has a very limited functionality for mainly strongly typed, object oriented languages:

object. <popup>

Key Sequences

Not sure about Vi.

It seems possible to define key sequences in Eclipse: Eclipse - Bindings.

Extensions

Vi has a macro language.

Eclipse extensions are realized via Java plugins. The extension points can then be assigned to key sequences. In order to create a plugin, an entire Eclipse Java package must to be created and all kinds of non-evident manual actions have to be executed. EASE makes it better with Rhino (Javascript) and Jython integration. Python is supposedly fully integrated since 2017 (not verfied, not investigated). See also section Integrated Development Environment.

The equivalent of a “package” in Emacs is just a simple file (conventionally with the extension .el (but not necessarily)).

Let’s put it in ~/.emacs.d as ~/.emacs.d/my-file.el. The file contains an interactive function, suitable for assignment to a key sequence:

(defun my-func (arg)
 "Help".
 (interactive "sText: ")
 (insert (concat "//" arg "//"))
 )

To “install” this “package”, add the following code to your .emacs file:

(load-file "~/.emacs.d/my-file.el")

To assign the function my-func() to a key sequence, add the following to your .emacs file:

(global-set-key "C-c uet" 'my-func)

You can also put this in my-file.el for auto-installation of the key sequence shortcut :).

That’s it folks!

Useful packages

Table editing

Emacs comes with table.el, which allows editing ASCII tables in a WYSIWYG manner.

To recognize tables in a document, enter M-x table-recognize RET. Besides the Table menu there are shortcuts accessible inside table cells with the prefix C-c C-c. C-c C-c C-h inside a table cell show the key bindings.

|:todo:| vi: tables ?? |:todo:| eclipse: tables ??

Symbol tags

vi supports colon-delimited tags: :tag: (I just don’t know how)

For emacs a generalized tagging, tag navigation and tag search package is available.

M-h set here tag to here.

C-h m shows mode help. In help buffer move to section about symbol-tag minor-mode.

C-h k M-<down> shows help for key bound to next-symbol-tag()

C-h b shows current key bindings. M-x occur RET -symbol-tag RET in buffer *Help* shows keys for symbol tag movement.