Vim – selektory
W poprzednim artykule opisałem jak można poruszać się po edytorze. Teraz chciałbym opisać podstawowe selektory.
Selektor jest obiektem tekstowym, z którym chcemy coś zrobić. Np. w artykule o poruszaniu się poznaliśmy obiekt tekstowy wyraz. Teraz nauczymy się jeszcze kilka innych.
Vim rozpoznaje dwa sposoby zaznaczania : wewnętrzne (inner) i całościowe (a-word). Kolejno odpowiadają one literką i oraz a. Działają one różne od rodzaju zaznaczenia, np. w przypadku wyrazów a-word dodaje białe znaki następujące po wyrazie, natomiast w przypadku zaznaczania nawiasów dodaje także nawiasy (wersja inner zaznacza tylko zawartość nawiasów.
Selektory wykorzystuje się podczas edycji tekstu, którego jeszcze nie poznaliśmy, ale już teraz warto je poznać. Stosuje się jako modyfikator innych komend, np. jeżeli wiemy, że selektor wyrazu to iw to wydanie komendy viw spowoduje wejście w tryb wizualny i zaznaczenie całego wyrazu.
Selektory:
iw – zaznaczenie wyrazu,
iW – zaznaczenie wyrazu ignorując znaki przestankowe
aw – zaznaczenie wyrazu dodając białe znaki aż do początku kolejnego wyrazu
aW – zaznaczenie wyrazu dodając białe znaki aż do początku kolejnego wyrazu ignorując znaki przestankowe
is – zaznaczenie zdania (zdanie to kilka wyrazów zakończonych kropką)
as – zaznaczenie zdania wraz z białymi znakami do początku kolejnego zdania
ip – zaznaczenie paragrafu (kilka zdań otoczonych pustymi linijkami lub znakami początku/końca pliku.)
aP – zaznaczenie paragrafu wraz z białymi znakami aż do początku kolejnego paragrafu.
Należy to zwrócić uwagę, że w przypadku gdy zaznaczamy ostatni wyraz/zdanie/paragraf, który nie ma za sobą białych znaków to zaznaczane są białe znaki PRZED tym wyrazem/zdaniem/paragrafem.
i( lub i) – zaznaczenie zawartości nawiasu
a( lub a) – zaznaczenie zawartości nawiasu wraz ze znakami nawiasu
analogicznie do powyższego:
i< lub i>
a< lub a>
i{ lub i}
a{ lub a}
i"
a"
i'
a'
kilka przykładów:



Proszę sobie dla utrwalenia potrenować trochę bo wiedza o selektorach będzie potrzebna w kolejnych rozdziałach.
Vim – poruszanie się
W poprzednim artykule opisałem najważniejsze podstawy edycji w programie Vim. Dzisiaj zajmiemy się poruszaniem.
Zacznijmy jednak od tego jak Vim rozpoznaje obiekty tekstowe. Najprostrzym takim obiektem jest słowo. Jest to ciąg znaków alfanumerycznych otoczony znakami białymi lub znakami przestankowymi. Jak zobaczymy za chwilkę, możliwe jest aby słowo zaznaczać na dwa sposoby: same znaki alfanumeryczne lub znaki alfanumeryczne i przestankowe.
Kolejne obiekty to zdanie (wyrazy kończące się kropką) i paragraf(zdania kończące się znakiem nowej linii lub pustą linijką.)
Posiadając tą podstawową wiedzę przejdźmy do poruszania się.
W niektórych edytorach najprostrze poruszanie się odbywa się za pośrednictwem kursorów. Natywnie jednak Vim potrzebuje do tego innych klawiszy; h, j, k i l.
h – przesunięcie kursora w lewo
l – przesunięcie kursora w prawo
j – przesunięcie kursora w górę
k – przesunięcie kursora w dół.
Przemieszczanie się wewnątrz linijki:
0 – przesuwa kursor na początek linii,
^ – przesuwa kursor przed pierwszy niebiały znak w linijce,
$ – przesuwa kursor na koniec linijki.
![[No Name] + - VIM [No Name] + - VIM](http://marioosh.5dots.pl/wp-content/uploads/No-Name-+-VIM.jpg)
Przemieszczanie się po całych wyrazach:
w – przesunięcie kursora na początek następnego wyrazu
e – przesunięcie kursora na koniec obecnego wyrazu
b – cofnięcie kursora do początku wyrazu
Te same komendy wpisane dużymi literami przesuwają kursor tak samo, lecz uznają wyraz wraz ze znakami przestankowymi.
W – przesunięcie kursora na początek następnego wyrazu ignorując znaki przestankowe
E – przesunięcie kursora na koniec obecnego wyrazu ignorując znaki przestankowe
B – przesunięcie kursora na początek wyrazu ignorując znaki przestankowe
![[No Name] + - VIM-1 [No Name] + - VIM-1](http://marioosh.5dots.pl/wp-content/uploads/No-Name-+-VIM-1.jpg)
Jeszcze kilka:
ge – przesunięcie na koniec poprzedniego wyrazu,
gE – przesunięcie na koniec poprzedniego wyrazu ignorując znaki przestankowe,
g_ – przesunięcie kursora na ostatni nie biały znak w tej linijce.
Nawiasy okrągłe i zakręcone.
Vim sprawnie rozpoznaje nawiasy i potrafi dopasować je w pary. Jeżeli mamy kursor umieszczony na jednym z nich to możemy się przenieść na drugi pasujący za pośrednictwem komendy %.
% – przeniesienie kursora na pasujący nawias.
[{ lub [( - przeniesienie kursora na nawias otwierający (zakręcony lub okrągły)
]} lub ]) – przeniesienie kursora na nawias zamykający
![[No Name] + - VIM-2 [No Name] + - VIM-2](http://marioosh.5dots.pl/wp-content/uploads/No-Name-+-VIM-2.jpg)
Pamiętajmy, że powyższe komendy przenoszą nas do najbliższego OTACZAJĄCEGO nas nawiasu a nie pierwszego napotkanego.
![[No Name] + - VIM-3 [No Name] + - VIM-3](http://marioosh.5dots.pl/wp-content/uploads/No-Name-+-VIM-3.jpg)
Przesuwanie w obszarze roboczym.
Wiadomo, że czasem plik ma więcej treści niż jest w stanie pokazać w okienku. Pokaże teraz kilka komend, które pozwalają tekstem w obszarze roboczym.
Przesuwanie kursora w obszarze roboczym:
H – przesunięcie kursora do pierwszej linijki okienka,
M – przesunięcie kursora do środkowej linijki okienka,
L – przesunięcie kursora do ostatniej linijki okienka.
gg – przesunięcie kursora do pierwszej linijki tekstu
G – przesunięcie kursora do ostatniej linijki tekstu
Ctrl-e – przesunięcie tekstu jedną linijkę w górę
Ctrl-d – przesunięcie tekstu w górę o pół obszaru roboczego
Ctrl-f – przesunięcie tekstu w górę o cały obszar roboczy
Ctrl-y – przesunięcie tekstu o jedną linijkę w dół
Ctrl-u – przesunięcie tekstu o pół obszaru roboczego w dół
Ctrl-b – przesunięcie tekstu o cały obszar roboczy w dół
To podstawowe komendy do poruszania się. Warto nauczyć się chociaż kilku, z czasem zdobędziemy pełną wiedzę.
W następnym artykule selektory.
Ruby 1.9.2 już jest
Yuki (Yugui) Sonoda zapowiedział, że właśnie pojawiła się wersja stabilna ruby 1.9.2. Wersja ta przechodzi testy w 98% i mimo, że zwiększenie wydajności w porównaniu do 1.9.1 jest nieznaczna, to różnica do linii 1.8 jest już spora.
Jeżeli chcemy zainstalować to najprościej skorzystać z RVM:
rvm update --head && rvm reload && rvm install 1.9.2 && rvm 1.9.2 --default
Vim początek
Vim jest prawie tak stary jak ja. Urodził się w 1976 roku czyli raptem rok po mnie. Mimo, że nie jest jedynym edytorem, którego wykorzystujemy w konsoli – przyzwyczaiłem się do niego. Polecam zate z korzystania, każdego kto mnie o ten temat spyta.
Nauka vima jednak nie jest prosta, z biegiem czasu zauważymy schematyczność działania i nauczymy się instynktownie z niego korzystać jednak pierwsze wrażenie może być wstrząsające. Zwłaszcza dla miłośników okienek, przcisków i menu – tutaj tego nie znajdziecie. W vimie wszystkie komendy się wpisuje.
Znane jest nawet powiedzienie: “Jak wygenerować losowy ciąg znaków? Dać użytkownikowi Windowsa Vima i kazać mu z niego wyjść”
Zaczynamy.
Początek, czyli zamykanie Vima
Jak otworzyć to chyba każdy wie, wystarczy wpisać “vim” w konsoli i po sprawie. Gorzej jest zamknąć edytor. Do zamykania służą poniższe komendy:
:q – wyjście z vima
:q! – wyjście z vima bez zapisu
:w – zapisanie
:wq – zapis i wyjście
:w NAZWA – zapisanie pliku jako NAZWA
:e NAZWA – edycja pliku NAZWA
Może trochę dziwi, że tego typu komendy poznajemy na początku, ale z doświadczenia wiem, że czasem najlepiej jest wyjść i zacząć od nowa. Zwłaszcza podczas nauki tego edytora.
Trzy tryby Vima
W Vim’ie są trzy tryby pracy:
1. Tryb komend (zwany także trybem normalnym) – służy do wprowadzania komend,
2. Tryb wprowadzania – wszystko co wpiszemy zostaje wprowadzone do edytowanego pliku,
3. Tryb wizualny – tryb ten służy do zaznaczania fragmentów tekstu – można go traktować jako podtryb trybu komend.
Przechodzenie pomiędzy trybami
Przejście do trybu komend z obu pozostałych następuje po naciśnięciu klawisza ESC.
ESC – przejście do trybu komend.
Tryb wprowadzania:
Najbardziej popularne sposoby wejścia do trybu wprowadzania:
i – wejście w tryb wprowadzania przed obecną pozycją kursora
a – wejście w tryb wprowadzania za obecną pozycją kursora
I – przejście do pierwszego niebiałego znaku w tej linijce i uruchomienie trybu wprowadzania
A – przejście do ostatniego znaku w tej linijce i uruchomienie trybu wprowadzania
o – dodanie pustej linijki powyżej bieżącego wiersza i przejście do niej w trybie wprowadzania
O – dodanie pustej linijki poniżej bieżącego wiersza i przejście do niej w trybie wprowadzania
Przejście do trybu wizualnego:
v – przejście do trybu wizualnego (zaznaczanie znakowe)
V – przejście do trybu wizualnego (zaznaczanie linijkowe)
Ctrl+v – przejście do trybu wizualnego (zaznaczanie blokowe)
Capture model w Pickle
Używam Machinist i Pickle jako wspaniałe dodatki do Cucumbera uzupełniające jego możliwości. Wczoraj jednak natrafiłem na dziwny problem: jeden ze stepów wykonywał się w jednym teście a w drugim nie. Nie rozpoznawało modelu, który wygenerowałem – tylko jednego, wszystkie inne rozpoznawało.
Problemem był Pickle. Okazuje się, że capture_model rozpoznaje modele po zdefiniowanych fabrykach lub blueprintach a nie po bazie danych, czy schemie. Po stworzeniu blueprinta dla mojego modelu wszystko zaczęło działać ponownie.
Bash completion for RVM
Jeżeli korzystacie z RVM to warto zapoznać się z gemem RVM-Completion. Podpowiada on nam zansstalowane wersje interpretatora lub gemsety.
Szczegóły można poznać na stronie projektu.
Logi gita i kolorowe głowice
Tips & Tricks
Routing w Rails 3, nowości
Jednym z ważniejszych plików konfiguracyjnych aplikacji napisanej w Ruby on Rails jest plik routes.rb. Plik zawiera mapowania do wszystkich zasobów aplikacji, aby były (lub nie były) dostępne przez URL. W rails 3 wprowadzono sporo zmian w tej kwestii, chciałbym po krótce opisać chociaż najważniejsze z nich.
Po pierwsze zniknęło słowo map, dobrze znane z poprzedniej wersji frameworka. Uprościło to trochę zapis. Np. w poprzedniej wersji taki zapis:
map.resources :posts do map.resource :comments end
można teraz zapisać jako:
resources :posts do resources :comments end
Routing podstawowy i nazwany
map.connect został zastąpiony w rails 3 metodą match. Dodatkowo w routingach nie podaje się już oddzielnie nazwy kontrolera i akcji. Zamiast tego oddziela się je znakiemm #. Dla przykładu routing z poprzedniej wersji frameworka wyglądający w ten sposób:
map.connect 'posts/:id', :controller => "posts", :action => "view"
przyjmie taką postać:
match 'posts/:id', :to => 'posts#view'
Jak widać zapis jest o wiele czytelniejszy. Pojawił się także nowy paramert :to, który został wprowadzony po połączeniu :action i :controller.
Metoda match została także użyta przy nazwanych routingach.
Routingi nazwane są to takie, które tworzą automagicznie helpery do wyświetlania odpowiednich adresów URL. Dla przykładu zapis:
map.logout '/logout', :controller => 'sessions', :action => 'destroy'
będzie wyglądał teraz tak:
match 'logout', :to => 'sessions#destroy', :as => 'logout'
Parametr :as oznacza nazwę, która zostanie użyta podczas tworzenia helperów. W powyższym przypadku: logout_path i logout_url.
Inny przykład użycia :as:
match 'users/show/:id', :as => 'profile' # zapis w kontrolerze: profile_path(current_user.id)
Drugim parametrem, którego można użyć wraz z match jest :via. Parametrem tym, określamy, które metody żądania HTTP są dostępne dla danego routingu.
match 'account/setup', :via => [:post, :get]
.
W przypadku, gdy ograniczamy wejście tylko do jednej metody, możemy użyć jej nazwy zamiast match
match 'account/setup', :via => :get #jest jednoznaczne z: get 'account/setup'
Rails 3 wprowadził także kilka skrótów, które możemy wykorzystać w jednoznacznych sytuacjach. Dla przykładu, możemy pominąć wspomniany wyżej parametr :to zamieniając oba parametry w mapę.
match 'logout', :to => 'sessions#destroy' match 'logout' => 'sessions#destroy'
Oba powyższe przypadki są jednoznaczne.
Jeszcze większy skrót jest gdy mapowany url jest analogiczny do nazwy kontrolera i akcji, wtedy wogóle nie musimy określać punktu docelowego.
match 'sessions/destroy', :to => 'sessions#destroy' match 'sessions/destroy' => 'sessions#destroy' match 'sessions/destroy'
Wszystkie powyższe zapisy są analogiczne. Kierują wejście na ’sessions/destroy’ do kontrolera SessionsController i akcji destroy.
Route domyślny i segmenty opcjonalne
Ciekawostką wprowadzoną w Rails 3 są opcjonalne segmenty w routingu. Są to takie fragmenty adresu URL, które mogą wystąpić lecz nie muszą. Opcjonalne fragmenty są w zapisie umieszczone w nawiasach.
Najlepszym przykładem ich użycia jest route domyślny, który zmienił postać z:
map.connect ':controller/:action/:id' map.connect ':controller/:action/:id.:format'
na:
match ':controller(/:action(/:id(.:format)))'Jak widać powyżej parametry :action, :id i :format są opcjonalne.
Dodatkową przydatną informacją na temat domyślnego routingu jest fakt, że został on domyślnie wyłączony w Rails 3. Jeżeli chcemy użyć tego domyślnego mapowania musimy je odkomentować jednak nie jest to zalecane.
Routing główny
Routing główny jest często określany także pustym. Jest to mapowanie, które jest wyświetlane po wpisaniu w przeglądarce samej nazwy domeny, bez żadnych parametrów.
W rails 2 takie mapowanie jest określane za pomocą metody map.root. W obecnej wersji, pominięto map, więc wystarczy użycie metody root.
Stary zapis:
map.root :controller => "posts", :action => "index"
można w nowej wersji przedstawić w ten sposób:
root :to => 'posts#index'
Ponownie widać uproszczenie zapisu.
Zagnieżdżone zasoby
Niektóre modele w tworzonej aplikacji posiadają referencje do innych, referencje te są zdefiniowane poprzez użycie has_many lub has_one w definicji modelu. Na przykład:
class Post < ActiveRecord::Base has_many :comments end class Comment < ActiveRecord::Base belongs_to :post end
Zagnieżdżony routing pozwala na dostęp do “niższych” zasbów bezpośrednio z URL’a, na przykład: /posts/2/comments/3 dostarczy komentarz o ID=3, który należy do postu o id = 2.
Aby taki routing był możliwy musimy go zdefiniować. Robimy t w ten sposób:
resources :posts do resources :comments end
Po takiej deklaracji zostaną także utworzone odpowiednie helpery, np.:post_comments_path, edit_post_comment_path.
W przypadku jednak gdy helpery te są za długie, lub nie chcemy korzystać z modelu nadrzędnego możemy użyć opcji shallow, która pozwoli nam na bezpośredni dostęp do zagnieżdżonych zasobów.
resources :posts do shallow do resources :comments end end
Od tej pory możemy używać /comments/2 zamiast /posts/2/comments/2.
Dla przypomnienia w rails 2 z tej opcji korzystało się w ten sposób:
map.resources :posts, :shallow => true do |post| post.resources :comments end
Zasoby
Od czasów wprowadzenia definicji resources do routes, zaleca się z korzystania z tej metody. Tworzy ona helpery oraz zarządza odpowiednimi RESTowymi połączeniami z zasobami.
Aplikacja mapuje odpowiednio wszystkie CRUD’owe metody dla takiego zasobu(index, new, create, delete, update, show, edit).
W rails 3 możemy zrezygnować z niektórych (except), lub wskazać tylko te z których chcemy skorzystać (only):
resources :comments, :except => [:index] resources :sessions, :only => [:new, :create, :destroy]
Więcej niż REST
Czasem wprowadzamy do naszych kontrolerów inne akcje, do których chcielibyśmy mieć dostęp z zewnątrz. Dodatkowe akcje definiujemy za pomocą metod collections i member zależnie czy chcemy manipulować zbiorem obiektów czy jedną sztuką.
W rails 2 pisaliśmy coś takiego:
map.resources :orders, :collection => { :only_new => :get, :accepted => :get }, :member => { :change_status => :put }
teraz możemy pisać tak:
resources :posts do collection do get :only_new, :accepted end member do put :change_status end end
lub tak:
resources :posts do get :only_new, :on => :collection get :accepted, :on => :collection put :change_status, :on => :member end
Zmiana nazwy parametru żądania
W niektórych przypadkach, zwłaszcza w aplikacjach nieanglojęzycznych przydatna jest opcja zmiany nazwy akcji. Np. Chcielibyśmy ze względu na SEO aby w URL było używane “aktualizuj” zamiast “edit”. Możemy tego dokonać za pośrednictwem opcji path_names
resources :users, :path_names => {:edit => 'aktualizuj'}
Przekierowanie żądania
W rails 3 jest możliwe przekierowanie wejścia z jednego żądania na inne
match '/profile', :to => redirect('/users/show') #albo match '/profile/:username' => redirect('/users/show/%{username})
Ograniczenia
W routes.rb jest możliwość wprowadzenia ograniczeń co do żądania, np. ID może składać się tylko z pięciu cyfr lub podobne.
resources :users, :constraints => { :id => /\d{5}/ } #lub w przypadku gdy takie ograniczenia są wspólne dla kilku zasobów: constraints(:id => /\d{5}/) do resources :users resources :posts end
To nie wszystkie nowości, które zostały wprowadzone w Rails 3, pozostały do opisania np. uruchamianie aplikacji bezpośrednio na racku lub inne perełki. Mam nadzieję jednak, że da to ogólny wgląd w nadchodzące zmiany.
