Sublime Text – Sebastians Blog https://sgaul.de Neues aus den Softwareminen Mon, 17 Jun 2019 08:32:14 +0000 de-DE hourly 1 https://wordpress.org/?v=6.1.1 https://sgaul.de/wp-content/uploads/2019/02/cropped-sgaul-2-1-32x32.jpg Sublime Text – Sebastians Blog https://sgaul.de 32 32 Code-Zeile in VSCode duplizieren https://sgaul.de/2019/06/17/code-zeile-in-vscode-duplizieren/ Mon, 17 Jun 2019 12:24:05 +0000 https://sgaul.de/?p=2948 Code-Zeile in VSCode duplizieren weiterlesen]]> Bei der Umstellung von Sublime auf Virtual Studio Code hatte ich lange Probleme mit dem duplizieren der aktuellen Zeile, vor allem weil einige offizielle Shortcuts mit Gnome kollidieren.

Während ich geneigt war Sublimes Strg+Shift+d zu konfigurieren, fiel mir ein interessantes Feature beim Standard-Copy-and-Paste auf: Ist der Cursor ohne Markierung in der Zeile, wird eben diese vollständig in die Zwischenablage kopiert. Fügt man diese nun wieder ein, wir diese sauer darunter eingefügt. Ein sehr eleganter Ansatz mit Standardmitteln, an den ich mich sicher schnell gewöhnen werde.

]]>
Guard erkennt keine Sublime-3-Änderungen https://sgaul.de/2014/03/27/guard-erkennt-keine-sublime-3-aenderungen/ Thu, 27 Mar 2014 15:30:36 +0000 https://sgaul.de/?p=2583 Sublime Text 3 hat das Speichern von Dateien umgestellt, so dass Guard dieses nicht mehr als Änderung registriert. Abhilfe schafft hier eine Rückkehr zum alten Ansatz. Hierfür unter „Preferences“ > „Settings — User“ die folgende Option setzen:

{
  ...
  "atomic_save": false,
  ...
}
]]>
Vim Surround, Zeilennummern, Coffeescript und Probleme mit dem Mausmodus https://sgaul.de/2013/11/08/vim-surround-zeilennummern-coffeescript-und-probleme-mit-dem-mausmodus/ Fri, 08 Nov 2013 14:15:33 +0000 https://sgaul.de/?p=2411 Vim Surround, Zeilennummern, Coffeescript und Probleme mit dem Mausmodus weiterlesen]]> Teil 3 meiner Erfahrungen vom Umstieg von Sublime zu Vim.

vim.surround

cd ~/.vim/bundle
git clone git://github.com/tpope/vim-surround.git

Dieses Plugin erlaubt es (unter anderem), bestimmte umschließende Zeichen der aktuellen Position zu ersetzen. So lassen sich die umschließenden doppelten Anführungszeichen mittels cs"' („change surrounding double quotes to single quotes“) ersetzen. Surround unterstützt Anführungszeichen, Klammern und auch HTML.

Leerzeichen statt Tabs

Selbst kein Verfechter dieser Konvention, muss ich oft Leerzeichen zum Einrücken verwenden. Ich hatte dies bereits in einem vorigen Artikel angesprochen, der korrigierte aber fälschlicherweise nur die Darstellung. Mittels expandtab werden die Tabs auch beim Speichern ersetzt:

" Tab width to 2 spaces
autocmd FileType html setlocal shiftwidth=2 tabstop=2 expandtab
autocmd FileType ruby setlocal shiftwidth=2 tabstop=2 expandtab
autocmd FileType javascript setlocal shiftwidth=2 tabstop=2 expandtab
autocmd FileType coffee setlocal shiftwidth=2 tabstop=2 expandtab
autocmd FileType css setlocal shiftwidth=2 tabstop=2 expandtab
autocmd FileType sass setlocal shiftwidth=2 tabstop=2 expandtab
autocmd FileType scss setlocal shiftwidth=2 tabstop=2 expandtab
autocmd FileType haml setlocal shiftwidth=2 tabstop=2 expandtab
autocmd FileType erb setlocal shiftwidth=2 tabstop=2 expandtab
autocmd FileType yaml setlocal shiftwidth=2 tabstop=2 expandtab

Zeilennummern anzeigen

" Set line numbers
set number

Texte aus Vim kopieren

Seit ich den Mouse-Mode aktiviert habe, kann ich keinen Text aus Vim mehr kopieren, indem ich ihn mit der Maus markieren und mittels Rechtsklick kopieren wähle. Dies lässt sich recht einfach beheben, indem man während des Vorgangs die Taste Shift gedrückt hält.

Shift + Mausaktionen
Vim verhält sich, als wäre der Mouse-Mode nicht aktiv

Coffeescript-Unterstützung

Syntax-Highlighting und Einrückungsunterstützung für Coffeescript:

git clone https://github.com/kchmck/vim-coffee-script.git ~/.vim/bundle/vim-coffee-script
]]>
:s/sublime/vim/ – Mäuse, Speichern, Zeilenschieben und mehr https://sgaul.de/2013/10/20/ssublimevim-maeuse-speichern-zeilenschieben-und-mehr/ Sun, 20 Oct 2013 11:55:49 +0000 https://sgaul.de/?p=2399 :s/sublime/vim/ – Mäuse, Speichern, Zeilenschieben und mehr weiterlesen]]> Nach den kosmetischen Details des ersten Artikels geht es heute um einige Standardaktionen, die mich als Entwickler begleiten.

vim-wombat-airline

Maussteuerung

Ja, einer der Vorteile von Vim ist, dass man nicht ständig zur Maus greifen muss. Die Umkehrung kann man aber nicht von der Hand weisen: Ist man gerade mit der Maus unterwegs, ist sie ein recht geeignetes Werkzeug um Cursor zu positionieren oder Textstellen zu markieren. Dies muss lediglich in der .vimrc aktiviert werden:

set mouse=a

Vim verhält sich hier wie die meisten grafischen Editoren: Ein Klick setzt den Cursor, ein Doppelklick markiert ein Wort, ein Dreifachklick markiert eine Zeile. Markierungen kann man dann mit y kopieren oder mit s oder c überschreiben.

ESC und der Normal-Mode

Vor allem in Anbetracht der Finger-Wegeoptimierung von Vim hat mich von Anfang an die allgegenwärtige Taste ESC genervt. Die Taste erfordert (jedenfalls bei mir) nicht nur Finger-, sondern eine ganze Handbewegung. Das kann doch nicht im Sinne des Erfinders sein. Vim bietet daher auch von Haus aus eine sinnvolle Alternative:

Strg+c
In den Normal-Mode wechseln

Speichern in der Kommandozeile

Als Sublime-Nutzer fällt vor allem auf, wie beschwerlich das Speichern ist. In aller Regel will man dies aus dem Insert-Mode, so dass der Vorgang sehr umständlich ist: In den Normal-Mode wechseln, :w und Enter – das ist für einen Vorgang den ich täglich hundert mal mache sicher keine Lösung. Lediglich zum Speichern und Schließen des aktuellen Buffers konnte ich mit ZZ einen Shortcut für den Normal-Mode finden. Schließen will ich in aller Regel aber nicht und auch hier müsste man erst den Modus wechseln. Strg+s hat sich bewährt, warum nicht erstmal übernehmen?

:nmap <c-s> :w<CR>
:imap <c-s> <Esc>:w<CR>a
:imap <c-s> <Esc><c-s>

Die letzte Zeile sorgt dafür, dass man aus dem Insert-Mode auch gleich wieder in den Normal-Mode wechselt. Diese kann wenn gewünscht weggelassen werden.

Im Terminal kann der Shortcut für Probleme sorgen, da er auch zur Flusskontrolle verwendet wird. In KDEs Konsole lässt sich diese in den Profileinstellungen unter Erweitert deaktivieren.

Zeilen und Blöcke verschieben

Oft verschiebe ich einzelne Code-Zeilen oder ganze Blöcke. In Sublime markiere ich diese und schiebe sie mit Strg+Shift+/ hoch bzw. runter. Vim kann das im Endeffekt genauso, hierfür ist aber etwas Konfiguration und ein Plugin erforderlich:

nmap <C-Up> [e
nmap <C-Down> ]e
vmap <C-Up> [egv
vmap <C-Down> ]egv
git clone git://github.com/tpope/vim-unimpaired.git ~/.vim/bundle/vim-unimpaired

Nun kann man mit V in den zeilenbasierten Visual-Mode wechseln, den Bereich markieren und ihn mit Strg+/ nach oben bzw. unter verschieben.

Klammer- und Anführungszeicheninhalte ändern

Zum Abschluss noch ein nettes, von Haus aus eingebautes Feature: Vim erlaubt es, den kompletten Inhalt zwischen zwei logischen Gruppierungszeichen zu editieren. Ein Beispiel:

def distance(a, b)

Um a und b in x und y umzubenennen, muss man lediglich den Cursor auf oder innerhalb der Klammern positionieren. Nun kann man mit ci) den Inhalt der Klammern löschen, in den Insert-Mode wechseln und den neuen Inhalt eingeben. Statt der schließenden kann man auch die öffnende Klammer nutzen. Statt normalen lassen sich auch eckige und geschweifte Klammern oder auch Anführungszeichen adressieren:

  • ci)
  • ci}
  • ci]
  • ci"
  • ci'
]]>
Von Sublime zu Vim? Ein Um- und Einstiegsversuch https://sgaul.de/2013/10/17/von-sublime-zu-vim-ein-um-und-einstiegsversuch/ https://sgaul.de/2013/10/17/von-sublime-zu-vim-ein-um-und-einstiegsversuch/#comments Thu, 17 Oct 2013 17:42:37 +0000 https://sgaul.de/?p=2364 Von Sublime zu Vim? Ein Um- und Einstiegsversuch weiterlesen]]> Vim ist so einiges, aber sicher nicht einsteigerfreundlich. Dennoch bin ich immer wieder fasziniert, wie sich erfahrene Anwender durch ihren Code navigieren und in der kleinen Kommandozeile Aktionen auslösen, für die die meisten erstmal ein anderes Programm starten müssen. Zudem ist alles frei konfigurierbar und vor allem freie Software.

Mal sehen, wie ich meinen auf Sublime aufbauenden Entwickleralltag übertragen kann.

Vim zurücksetzen

Wer, wie ich, wirklich von vorne beginnen will:

rm -rf .vimrc .vim

Fuzzy-Search mit Crtlp

Terminal auf, ins Projektverzeichnis wechseln, vim tippen. Wie nun die gewünschte Datei öffnen? In Sublime suche ich „fuzzy“ danach, indem ich Strg+p drücke. Super, genau dieser Workflow hat es in ein Vim-Plugin namens ctrlp.vim geschafft.

mkdir ~/.vim && cd ~/.vim && git clone https://github.com/kien/ctrlp.vim.git bundle/ctrlp.vim && echo "set runtimepath^=~/.vim/bundle/ctrlp.vim" >> ~/.vimrc

In Vim:

:helptags ~/.vim/bundle/ctrlp.vim/doc
:q

Beim nächsten Öffnen von Vim sollte man im Projekt sublimisch navigieren können.

<c-p>
Mit Fuzzy-Search suchen
<c-j>/<c-k>
Durch Suchergebnisse navigieren

ctrlp.vim
ctrlp.vim

Plugin-Verwaltung: Pathogen

Apropos Plugins: Das ist in Sublime schön zentral durch ein Plugin gelöst. Das kann Vim auch: Pathogen. Nach der Installation kann man Plugins direkt als Git-Repo in das Verzeichnis ~/.vim klonen.

mkdir -p ~/.vim/autoload ~/.vim/bundle; curl -Sso ~/.vim/autoload/pathogen.vim https://raw.github.com/tpope/vim-pathogen/master/autoload/pathogen.vim

Nun noch an den Anfang der ~/.vimrc:

execute pathogen#infect()

Grundlegende Formatierung

Bei den ersten Gehversuchen fällt schnell auf, dass Vim zumindest für Ruby unübliche Tab-Einstellungen nutzt und, welch ein Graus, bei der Einrückung nicht mitdenkt: Man beginnt nach einem Druck auf Enter immer ganz vorne in der Zeile.

Tab-Größe nach Dateitypen einstellen

Erstmal wieder in die .vimrc, aufgeräumt wird später:

echo "autocmd FileType html setlocal shiftwidth=2 tabstop=2" >> ~/.vimrc
echo "autocmd FileType ruby setlocal shiftwidth=2 tabstop=2" >> ~/.vimrc
echo "autocmd FileType javascript setlocal shiftwidth=2 tabstop=2" >> ~/.vimrc
echo "autocmd FileType coffee setlocal shiftwidth=2 tabstop=2" >> ~/.vimrc
echo "autocmd FileType css setlocal shiftwidth=2 tabstop=2" >> ~/.vimrc
echo "autocmd FileType sass setlocal shiftwidth=2 tabstop=2" >> ~/.vimrc
echo "autocmd FileType scss setlocal shiftwidth=2 tabstop=2" >> ~/.vimrc
echo "autocmd FileType haml setlocal shiftwidth=2 tabstop=2" >> ~/.vimrc
echo "autocmd FileType erb setlocal shiftwidth=2 tabstop=2" >> ~/.vimrc
echo "autocmd FileType yaml setlocal shiftwidth=2 tabstop=2" >> ~/.vimrc

Automatische Einrückung

.vimrc:

set nocompatible
set smartindent
set autoindent
filetype indent on

Eine Statuszeile: Airline

Nicht wirklich aus Sublime, aber aus einigen Vim-Eindrücken weiß ich um schicke Statusleisten, die den aktuellen Modus farbig hervorheben, den Git-Status zeigen und auch sonst viel Zeug können. Das meiste Zeug ist sicher sinnlos, genau das will ich also auch.

Mal googeln: Da gibt es Powerline, die Super-Allzweckwaffe getarnt als Statusanzeiger. Ist laut eigener Aussage aber etwas komplizierter zu installieren. Wer es einfach will, möge stattdessen Airline nehmen. Machen wir das doch, das kann unser neuer Paketmanager wenigstens ohne Hilfe:

git clone https://github.com/bling/vim-airline ~/.vim/bundle/vim-airline

Vim neustarten, nichts zu sehen. Super. Im Projektwiki dann bisschen was zusammengesucht und ab in die .vimrc:

set laststatus=2
let g:airline_theme = 'powerlineish'
if !exists('g:airline_powerline_fonts')
    " Use the default set of separators with a few customizations
    let g:airline_left_sep=' ›'  " Slightly fancier than '>'
    let g:airline_right_sep='‹ ' " Slightly fancier than '<'
endif

Keine Ahnung was die erste Zeile bedeutet, aber es hilft. Dennoch sieht alles nicht sehr schick aus.

Color-Schemes

Hier musste ich eine Weile experimentieren, mein Terminal hat die von mir gewählten Farbschemata immer wieder überschrieben. Grund dafür ist, dass ich Vim im Terminal nutze und nicht als Standalone-GUI. Daher muss man auf 256-Farb-Schemen zurückgreifen und Vim ensprechend konfigurieren:

cd ~/.vim/colors
wget https://raw.github.com/vim-scripts/wombat256.vim/master/colors/wombat256mod.vim

Und wieder in die .vimrc:

set t_Co=256
color wombat256mod

Das sieht schick aus. Aber vor einem Screenshot noch die...

Git-Unterstützung

In der Statusbar soll der aktuelle Branch angezeigt werden. Hierfür wird das (auch außerhalb der Statuszeile überaus mächtige) Plugin fugitive.vim verwendet.

cd ~/.vim/bundle && git clone git://github.com/tpope/vim-fugitive.git

Nun das Plugin mit Airline verknüpfen (natürlich in der .vimrc):

let g:airline#extensions#branch#enabled = 1

Ersteindruck

Ich bin von meiner ersten Konfiguration recht angetan. Pragmatismus hin oder her, um sich einer Entwicklungsumgebung wohlzufühlen muss das Ganze auch nach etwas aussehen. Ich denke nicht, dass sich Vim vor Sublime verstecken braucht.

Vim mit Wombat-Theme und Airline-Statusleiste
Vim mit Wombat-Theme und Airline-Statusleiste

Dennoch bleibt der Einstieg hart. Ich habe Vim in den letzten Jahren immer mal wieder für Konfigurationen genutzt und bin mit der HJKL-Navigation recht gut vertraut. Dennoch ist Code-Schreiben noch sehr ungewohnt. Der ständige Modiwechsel verwirrt, wirkt sperrig und überhaupt muss man vor fast jeder Aktion nachdenken. Das wird mit etwas Übung sicher leichter, dennoch werde ich mich demnächst mal umsehen, wie man einige bekannte Verhaltensmuster aus Sublime und Co. übernehmen kann.

]]>
https://sgaul.de/2013/10/17/von-sublime-zu-vim-ein-um-und-einstiegsversuch/feed/ 8
SublimeSpecCreator: Command-Palette nutzen https://sgaul.de/2013/09/08/sublimespeccreator-command-palette-nutzen/ Sun, 08 Sep 2013 10:58:24 +0000 https://sgaul.de/?p=2341 SublimeSpecCreator: Command-Palette nutzen weiterlesen]]> Gerade bei unregelmäßig genutzten Funktionen vergisst man gern das zugewiesene Tastenkürzel. Hier hilft Sublimes sogenannte Command Palette. Eine Spezifikation für eine Methode kann man nun auch auf folgende Weise generieren:

  • Zu testende Methode markieren
  • Strg+Shift+P
  • createspec (oder Teile davon) tippen, bis Befehl erscheint
  • Enter

sublime-commands

Kommandos für ein Sublime-Plugin einrichten

Um die Kommandos eines Plugins in der Palette zu zeigen, legt man es als eigenständiges Verzeichnis Packages/SublimeCreateSpec an. Neben der Python-Datei erstellt man eine Default.sublime-commands, in der man Kommandos als JSON-Array notiert:

[
  {
    "caption": "CreateSpec: Create spec for selected method",
    "command": "create_spec"
  },
  {
    "caption": "CreateSpec: Create model spec for selected method",
    "command": "create_spec",
    "args": { "type": "model" }
  },
  ...
]
]]>
SublimeSpecCreator: Specs per Knopfdruck https://sgaul.de/2013/09/07/sublimespeccreator-specs-per-knopfdruck/ Sat, 07 Sep 2013 16:35:05 +0000 https://sgaul.de/?p=2313 SublimeSpecCreator: Specs per Knopfdruck weiterlesen]]> class User < ActiveRecord::Base def logged_in? # ... end end

+ Super+Alt+S =

require 'spec_helper'

describe User do

  describe '#logged_in?' do
    |
  end

end

Alles klar, für diese Logged-In-Methode fehlt der Test. Okay, für das Model gibt es noch keine Specs. Also Strg+n, Spec-Snipplet reinkopieren, den Namen setzen, Strg+s, Spec-Verzeichnis suchen, Dateinamen eingeben, OK, … Was wollte ich doch gleich?

Spec-Erstellung nervt, dabei lässt sie sich prima automatisieren. Macht man das als Sublime-Text-Plugin, kann man dabei noch Python lernen.

Mein erster funktionierender Entwurf für Rails- und RSpec-Projekte ist ab sofort auf Github zu finden. Er funktioniert wie oben skizziert: Methodennamen markieren, konfiguriertes Tastenkürzel drücken und das Plugin ergänzt einen Describe-Block im passenden Spec-File. Existiert dieses noch nicht, wird es im entsprechenden Verzeichnis angelegt.

Einschränkungen

Ganz zufrieden bin ich mit dem bisherigen Ansatz noch nicht. Erstens können noch keine Specs für Views erzeugt werden, zweitens kann ich den Cursor nach dem Öffnen der Spec-Datei nicht an der neu eingefügten Stelle platzieren.

Punkt eins ist für mich wenig kritisch, da Views in aller Regel samt Specs generiert werden.

Den Cursor in das neue Describe zu setzen ist schwierig, da ich den Block hinter Sublimes Rücken mittels Dateioperationen einfüge. Hier müsste man den Sublime-hat-die-Änderung-bemerkt-und-die-Datei-neu-geladen-Event abfangen, den ich in der Doku leider nicht finden kann. Ein Editieren mit Sublime-Bordmitteln wollte ich im Sinne der Wiederverwendbarkeit eigentlich verhindern, es scheint aber so gesehen einige Vorteile zu bieten. Zudem könnte man dann auf Sprachparser zurückgreifen und müsste den Describe-Block nicht durch Textersetzung positionieren.

Installation und Konfiguration

Die Einrichtung läuft derzeit vollständig manuell als User-Skript. Mit dem Packen von Sublime-Plugins und dem Eintragen in Package Control habe ich keine Erfahrungen, vielleicht kann ich das bei Gelegenheit nachholen. Aber auch so sind es nur zwei Schritte, die auf meinem hiesigen Ubunturechner folgendermaßen ablaufen:

Python-Datei ins Verzeichnis Packages/User von Sublime:

wget https://raw.github.com/SebastianG86/SublimeSpecCreator/master/create_spec.py ~/.config/sublime-text-2/Packages/User/

In Sublime unter „Preferences“ > „Key Bindings – User“ einen beliebigen Shortcut eintragen:

{ "keys": ["super+alt+s"], "command": "create_spec" }

Ich hoffe, dass es dem einen oder anderen Testgetriebenen da draußen hilft.

sublime-spec-creator

]]>