{"id":2968,"date":"2020-08-31T10:35:26","date_gmt":"2020-08-31T08:35:26","guid":{"rendered":"https:\/\/fodina.de\/?p=2968"},"modified":"2023-01-03T21:46:28","modified_gmt":"2023-01-03T20:46:28","slug":"atom-and-vim","status":"publish","type":"post","link":"https:\/\/2022.fodina.de\/en\/atom-and-vim\/","title":{"rendered":"Atom and vi(m): a dream comes true"},"content":{"rendered":"\n<div class=\"wp-block-image\"><figure class=\"alignleft size-large is-resized\"><a href=\"https:\/\/2022.fodina.de\/wp-content\/uploads\/2020\/08\/atom-1024x1024.png\" data-fancybox=\"\"><img decoding=\"async\" loading=\"lazy\" src=\"https:\/\/2022.fodina.de\/wp-content\/uploads\/2020\/08\/atom-1024x1024.png\" alt=\"\" class=\"wp-image-2892\" width=\"85\" height=\"85\" srcset=\"https:\/\/2022.fodina.de\/wp-content\/uploads\/2020\/08\/atom.png 1024w, https:\/\/2022.fodina.de\/wp-content\/uploads\/2020\/08\/atom-300x300.png 300w, https:\/\/2022.fodina.de\/wp-content\/uploads\/2020\/08\/atom-150x150.png 150w, https:\/\/2022.fodina.de\/wp-content\/uploads\/2020\/08\/atom-768x768.png 768w\" sizes=\"(max-width: 85px) 100vw, 85px\" \/><\/a><\/figure><\/div>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"alignright size-large is-resized\"><a href=\"https:\/\/2022.fodina.de\/wp-content\/uploads\/2020\/08\/vim-logo-240x240-1.png\" data-fancybox=\"\"><img decoding=\"async\" loading=\"lazy\" src=\"https:\/\/2022.fodina.de\/wp-content\/uploads\/2020\/08\/vim-logo-240x240-1.png\" alt=\"\" class=\"wp-image-2991\" width=\"85\" height=\"85\" srcset=\"https:\/\/2022.fodina.de\/wp-content\/uploads\/2020\/08\/vim-logo-240x240-1.png 240w, https:\/\/2022.fodina.de\/wp-content\/uploads\/2020\/08\/vim-logo-240x240-1-150x150.png 150w\" sizes=\"(max-width: 85px) 100vw, 85px\" \/><\/a><\/figure><\/div>\n\n\n\n<p>Ich liebe den <strong>vi<\/strong>(<strong><em>m<\/em><\/strong>), insbesondere wenn ich in einem Repository arbeite. Es ist so leicht, schnell mal eben eine Datei per Konsole zu \u00e4ndern, so einfach alle <em>Trumps<\/em> durch <em>Biden<\/em> zu ersetzen: <code>:1,$ s\/[Tt]rump\/Biden\/g<\/code>. Aber am Desktop habe auch ich bisher nat\u00fcrlich GUI basierte Editoren genutzt, <em>Gedit<\/em> z.B. Oder &#8211; seit einigen Monaten &#8211; <em>Atom<\/em>. Daher rutschten mir manchmal <em>vi-Befehle<\/em> wie <code>xi<\/code> in meine Texte &#8211; weil ich vergessen hatte, dass ich einen Desktop-Editor benutzte. Aber jetzt ist ein Traum wahr geworden:<!--more--><\/p>\n\n\n\n<p>Das Plugin <a href=\"https:\/\/github.com\/t9md\/atom-vim-mode-plus\">atom-vim-mode-plus<\/a> &#8211; zu installieren mit dem Shell-Kommando <code>apm install vim-mode-plus<\/code> &#8211; erlaubt uns, die <em>vi(m)<\/em>-Befehle im <em>Atom<\/em> zu nutzen!<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Zu erst ein kleiner Vorbehalt \u2026<\/h2>\n\n\n\n<p>Hat man das Package <em>vim-mode-plus<\/em> in <em>Atom<\/em> installiert, kann man nicht mehr direkt mit dem Tippen loslegen. Man muss vorher ein wenig mit den <em>vi-modes<\/em> vertraut werden: L\u00e4dt man eine Datei oder legt, eine neu an startet <em>Atom<\/em> im <em>visual-mode<\/em>. Das ist ein <em>vi(m)-<\/em>Modus, der Kommandos akzeptiert und auf den angezeigten Text anwendet. <code>i<\/code> ist einer dieser Befehle. Er st\u00f6\u00dft den Wechsel in den <em>insert-mode<\/em> an und erlaubt uns, Text einzugeben. Um dann Befehle auf den gerade eingegebenen Text anzuwenden, m\u00fcssen wir allerdings per <code>esc<\/code> in den <em>visual mode<\/em> zur\u00fcckkehren.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u2026 dann einige beruhigende Worte \u2026<\/h2>\n\n\n\n<p><em>Atom<\/em> bietet von sich aus schon Optionen, seinen Text zu bearbeiten: Man kann Passagen selektieren, ausschneiden, kopieren und wieder einf\u00fcgen, ganze Zeilen verschieben, W\u00f6rter in Gro\u00dfbuchstaben verwandeln u.\u00c4.m. All diese M\u00f6glichkeiten k\u00f6nnen auch mit installiertem <em>vim-mode-plus<\/em> genutzt werden, und zwar unabh\u00e4ngig davon, ob man im <em>visual mode<\/em> or in the <em>insert mode<\/em> arbeitet. Selbst das <em>Atom<\/em> eigene &#8216;Suchen-und-Ersetzen&#8217; funktioniert wie erwartet. Das <em>vim-mode-plus<\/em>-Plugin erweitert also die M\u00f6glichkeiten unseres Editors &#8216;nur&#8217;, es ver\u00e4ndert sie nicht &#8211; au\u00dfer dass man eben bei der Eingabe von Text den aktuellen Arbeitsmodus im Hinterkopf haben muss.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u2026 und schlie\u00dflich eine Liste neuer M\u00f6glichkeiten:<\/h2>\n\n\n\n<p>Der Nachteil der reinen <em>Atom<\/em>-F\u00e4higkeiten ist, dass man die Maus benutzen muss. Das bremst. <em>vi(m)<\/em> bietet dagegen den Vorteil, alles \u00fcber die Tastatur machen zu k\u00f6nnen. Das erh\u00f6ht die Arbeitsgeschwindigkeit &#8211; selbst wenn man nur mit einem 3-Fingersystem tippt. Hier ein paar zentrale Eigenschaften vom <em>vi(m)<\/em>, die jetzt auch im <em>Atom<\/em> nutzbar sind:<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Den Cursor platzieren:<\/h3>\n\n\n\n<p>Die vertrauten Pfeiltasten funktionieren wie erwartet, im <em>visual-mode<\/em> und im <em>insert-mode<\/em>). Die anderen Kommandos wirken dagegen nur im <em>visual-mode<\/em>:<\/p>\n\n\n\n<ul><li>Mit den <em>vim<\/em>-&#8216;Pfeilersatztasten&#8217; <code>h<\/code>, <code>j<\/code> , <code>k<\/code>, <code>l<\/code> kann man den Cursor ebenso <strong>nach links<\/strong>, <strong>nach unten<\/strong>, <strong>nach oben<\/strong> und <strong>nach rechts<\/strong> bewegen. Legt man den Zeigefinger auf einer QWERTZ-Tastatur aufs <em>h<\/em> und die restlichen drei daneben, merkt man, wie organisch das funktioniert. Wenn man allerdings mit den Pfeiltasten so vertraut ist wie ich, wird man diese Option trotzdem eher selten benutzen.<\/li><\/ul>\n\n\n\n<p>N\u00fctzlicher sind da schon die Tasten<\/p>\n\n\n\n<ul><li><code>w<\/code> := ein Wort vorw\u00e4rts<\/li><li><code>b<\/code> := ein Wort zur\u00fcck<\/li><li><code>e<\/code> := zum Ende des Wortes, auf dem der Cursor steht<\/li><li><code>(<\/code> := zum Anfang des n\u00e4chsten Satzes<\/li><li><code>)<\/code> := zum Anfang des aktuellen Satzes<\/li><\/ul>\n\n\n\n<p>Je gr\u00f6\u00dfer die Distanz ist, die so ein Sprungbefehl zur\u00fccklegt, um so st\u00e4rker die Arbeitsersparnis: Wenn man lange Zeilen mit weichem &#8216;Word-Wrapping&#8217; als Quasi-Paragraphen verwendet, um dem Nutzer die Zeilen in einer zur gew\u00e4hlten Fensterbreite passenden L\u00e4nge anzeigen zu lassen &#8211; wie es heutzutage oft bei <em>md<\/em>-Dateien oder in Mails geschieht &#8211; dann wird man es begr\u00fc\u00dfen, nicht mittels der Pfeiltasten Buchstabe f\u00fcr Buchstabe in einer Zeile vor oder zur\u00fcck navigieren zu m\u00fcssen. Die folgenden Tasten biete andere gro\u00dfe Spr\u00fcnge:<\/p>\n\n\n\n<ul><li><code>0<\/code> := zur\u00fcck zum Zeilenanfang<\/li><li><code>$<\/code> := vorw\u00e4rts zum Zeilenende<\/li><li><code>H<\/code> := zur\u00fcck zur ersten im Fenster sichtbaren Zeile<\/li><li><code>M<\/code> := in die Zeile in der Mitte des Fenster<\/li><li><code>L<\/code> := vorw\u00e4rts in die letzte sichtbare Zeile<\/li><\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Text einf\u00fcgen und \u00e4ndern<\/h3>\n\n\n\n<ul><li><code>i<\/code> := <strong>unter dem Cursor<\/strong> Text <em>einf\u00fcgen<\/em><\/li><li><code>a<\/code> := <strong>nach dem Cursor<\/strong> Text <em>einf\u00fcgen<\/em><\/li><li><code>r<\/code> := das Zeichen <strong>unter dem Cursor<\/strong> <em>ersetzen<\/em><\/li><li><code>cw<\/code> := das Wort <strong>unter dem Cursor<\/strong> <em>ersetzen<\/em><\/li><li><code>cc<\/code> := die Zeile <strong>unter dem Cursor<\/strong> <em>ersetzen<\/em><\/li><li><code>R<\/code> := der Reihe nach alle Zeichen <strong>unter dem Cursor<\/strong> <em>ersetzen<\/em> bis man mit <code>esc<\/code> wieder in den <em>visual-mode<\/em> wechselt<\/li><\/ul>\n\n\n\n<p>Mit den Kommandos <em>i<\/em>, <em>a<\/em>, <em>cw<\/em>, and <em>cc<\/em> geht ein Wechsel in den <em>insert-mode<\/em> einher.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Text l\u00f6schen<\/h3>\n\n\n\n<ul><li><code>x<\/code> := <em>l\u00f6scht<\/em> das Zeichen <strong>unter dem Cursor<\/strong><\/li><li><code>dw<\/code> := <em>l\u00f6scht<\/em> das Wort <strong>unter dem Cursor<\/strong><\/li><li><code>dd<\/code> := <em>l\u00f6scht<\/em> die Zeile <strong>unter dem Cursor<\/strong><\/li><li><code>D<\/code> := <em>l\u00f6scht<\/em> den Rest der Zeile <strong>vom Cursor bis zu ihrem Ende<\/strong><\/li><\/ul>\n\n\n\n<p>Der Vorteile der Befehle <em>dw<\/em> und <em>dd<\/em> ist, dass sie die gel\u00f6schten Teile in einen Puffer kopieren, von wo aus sie mittels <em>p<\/em> oder <em>P<\/em> auch an anderer Stelle wieder eingef\u00fcgt werden k\u00f6nnen.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Kopieren und Einf\u00fcgen<\/h3>\n\n\n\n<ul><li><code>yw<\/code> := <em>kopiert<\/em> das Wort <strong>unter dem Cursor<\/strong> in den Puffer<\/li><li><code>yy<\/code> := <em>kopiert<\/em> die Zeile <strong>unter dem Cursor<\/strong> in den Puffer<\/li><li><code>p<\/code> := <em>f\u00fcgt<\/em> den Puffer <strong>nach dem Cursor<\/strong> ein<\/li><li><code>P<\/code> := <em>f\u00fcgt<\/em> den Puffer <strong>vor dem Cursor<\/strong> ein<\/li><\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">R\u00fcckg\u00e4ngig machen<\/h3>\n\n\n\n<ul><li><code>u<\/code> := <strong>die letzte(n) Ver\u00e4nderung(en)<\/strong> <em>r\u00fcckg\u00e4ngig machen<\/em><\/li><li><code>U<\/code> := <strong>die Zeile unter dem Cursor<\/strong> <em>wieder herstellen<\/em><\/li><\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Suchen<\/h3>\n\n\n\n<ul><li><code>\/ XYZ<\/code> := nach dem String <em>XYZ<\/em> <em>suchen<\/em><\/li><\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Regex basierte Ersetzungen<\/h3>\n\n\n\n<p>Der <em>vi(m)<\/em> bietet zus\u00e4tzlichen einen <em>executing-mode<\/em>. Dr\u00fcckt man die Taste <code>:<\/code> und gibt eine Zeilennummer samt Befehl ein, dann wird dieser Befehl auf den Text an der angegebenen Stelle angewendet. So w\u00fcrde z.B. der Befehl <code>: 1,$ s\/[Tt]rump\/Biden\/g<\/code> alle Vorkommen von <em>Trump<\/em> oder <em>trump<\/em> durch <em>Biden<\/em> ersetzen (<em>s<\/em>), und zwar von der ersten (<em>1<\/em>) bis zur letzten Zeile (<em>$<\/em>).<\/p>\n\n\n\n<p>Solche Ersetzungen ausf\u00fchren zu k\u00f6nnen, ist oft hilfreich. Ungl\u00fccklicherweise kann <em>vim-mode-plus<\/em> selbst mit dieser Art von Kommandos nichts anfangen. Und sein Autor <a href=\"https:\/\/github.com\/t9md\/atom-vim-mode-plus\/issues\/52\">hat Vorbehalte, den <em>ex-mode<\/em> zu implementieren<\/a>. Stattdessen empfiehlt er, zus\u00e4tzlich das <a href=\"https:\/\/atom.io\/packages\/ex-mode\">Plugin \/ Package <em>ex-mode<\/em> <\/a>per <code>apm install ex-mode<\/code> zu installieren.<\/p>\n\n\n\n<p>Und tats\u00e4chlich funktioniert das bestens.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Fazit:<\/h2>\n\n\n\n<p>Die Plugins <em>vim-mode-plus<\/em> und <em>ex-mode<\/em> in <em>Atom<\/em> zu installieren, bietet uns wirklich die M\u00f6glichkeit, die F\u00e4higkeiten eines graphischen Editors wie <em>Atom<\/em> und die <em>vi(m)<\/em>-Eigenschaften kombiniert zu nutzen. Mit anderen Worten: ein Traum ist wahr geworden.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Ich liebe den vi(m), insbesondere wenn ich in einem Repository arbeite. Es ist so leicht, schnell mal eben eine Datei per Konsole zu \u00e4ndern, so einfach alle Trumps durch Biden zu ersetzen: :1,$ s\/[Tt]rump\/Biden\/g. Aber am Desktop habe auch ich bisher nat\u00fcrlich GUI basierte Editoren genutzt, Gedit z.B. Oder &#8211; seit einigen Monaten &#8211; Atom. [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[23],"tags":[35,40],"translation":{"provider":"WPGlobus","version":"2.12.2","language":"en","enabled_languages":["de","en"],"languages":{"de":{"title":true,"content":true,"excerpt":false},"en":{"title":true,"content":true,"excerpt":false}}},"_links":{"self":[{"href":"https:\/\/2022.fodina.de\/en\/wp-json\/wp\/v2\/posts\/2968"}],"collection":[{"href":"https:\/\/2022.fodina.de\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/2022.fodina.de\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/2022.fodina.de\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/2022.fodina.de\/en\/wp-json\/wp\/v2\/comments?post=2968"}],"version-history":[{"count":30,"href":"https:\/\/2022.fodina.de\/en\/wp-json\/wp\/v2\/posts\/2968\/revisions"}],"predecessor-version":[{"id":4369,"href":"https:\/\/2022.fodina.de\/en\/wp-json\/wp\/v2\/posts\/2968\/revisions\/4369"}],"wp:attachment":[{"href":"https:\/\/2022.fodina.de\/en\/wp-json\/wp\/v2\/media?parent=2968"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/2022.fodina.de\/en\/wp-json\/wp\/v2\/categories?post=2968"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/2022.fodina.de\/en\/wp-json\/wp\/v2\/tags?post=2968"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}