Edytor Vim potrafi korzystać z powłoki systemowej za pomocą polecenia :r !
czy
też !.
Polecenie r!
pozwala odczytać standardowe wyjście polecenia
i wstawić je do bufora. Polecenie ! po prostu wykonuje polecenie systemowe.
Wstawienie wyjścia polecenia systemowego do bufora
Polecenie ls -alh
, wyświetlające wszystkie pliki w bieżącym katalogu,
jednocześnie ustawia cztery kolumny w odpowiedniej kolejności: nazwa, rozmiar,
data, godzina.
:r!ls -alh | awk '{ print " ", $8, " ", $5, " ", $6, " ", $7}' | column -t . 4,0K 06-29 14:30 .. 4,0K 06-29 13:21 _config.yml 1,6K 06-29 13:35 db.json 280K 06-29 19:42 drafts 12K 07-03 15:07 .git 4,0K 07-03 17:45 .gitignore 65 06-29 10:07 .gitlab-ci.yml 194 06-29 10:07 node_modules 44K 06-29 10:07 package.json 484 06-29 10:07 package-lock.json 134K 06-29 10:07 public 4,0K 06-29 14:45 README.md 2,8K 06-29 10:07 scaffolds 4,0K 06-29 10:07 source 4,0K 06-29 10:21 themes 4,0K 06-29 10:47
Podobne polecenie jak wyżej z tą różnicą, że listuje on plik, który właśnie
edytuję. Jest on wskazany za pomocą znaku %
.
:r!ls -l % | awk '{ print " ", $8, " ", $5, " ", $6, " ", $7}' | column -t source/_posts/Vim_praca_z_powloka_systemowa.md 929 07-03 18:00
Teraz użyjemy formatowania za pomocą awk
:r!ls -alh | awk {'printf ("\%20s\t\%6s\%8s\%8s\n", $8, $5, $6, $7)'} . 4,0K 06-29 14:30 .. 4,0K 06-29 13:21 _config.yml 1,6K 06-29 13:35 db.json 280K 06-29 19:42 drafts 12K 07-03 15:07 .git 4,0K 07-03 17:45 .gitignore 65 06-29 10:07 .gitlab-ci.yml 194 06-29 10:07 node_modules 44K 06-29 10:07 package.json 484 06-29 10:07 package-lock.json 134K 06-29 10:07 public 4,0K 06-29 14:45 README.md 2,8K 06-29 10:07 scaffolds 4,0K 06-29 10:07 source 4,0K 06-29 10:21 themes 4,0K 06-29 10:47
W ramach ćwiczeń z awk
jeszcze jedno rozwiązanie
:r!ls -alh | awk -v OFS='\t' '{ print $8, $5, $6, $7 }' | column -t . 4,0K 06-29 14:30 .. 4,0K 06-29 13:21 _config.yml 1,6K 06-29 13:35 db.json 280K 06-29 19:42 drafts 12K 07-03 15:07 .git 4,0K 07-03 17:45 .gitignore 65 06-29 10:07 .gitlab-ci.yml 194 06-29 10:07 node_modules 44K 06-29 10:07 package.json 484 06-29 10:07 package-lock.json 134K 06-29 10:07 public 4,0K 06-29 14:45 README.md 2,8K 06-29 10:07 scaffolds 4,0K 06-29 10:07 source 4,0K 06-29 10:21 themes 4,0K 06-29 10:47
Kolejne polecenie z użyciem znaków specjalnych takich jak %
. W przypadku kiedy
trzeba będzie użyć znaku %
należy go poprzedzić znakiem \
:r!date +\%F_\%T 2018-07-03_18:14:15
Sprawdźmy ile wierszy ma nasz plik
:r!wc -l % | cut -f 1 -d ' ' 95
Pobranie treści strony, używając w3m
, przeważnie strona będzie zawierała
różnego rodzaju niepotrzebne informacje i trzeba będzie je usunąć.
:r!w3m https://sdym.gitlab.io/2018/07/03/Vim_uruchomienie_polecenia_z_bufora/ -dump Vim uruchomienie polecenia z bufora Notes 2018-07-03 vim ...
Możemy też pracować na tekście, który znajduje się w buforze i przekazać go do zewnętrznego polecenia. Użyjemy do wyznaczenia linii lub zakresu. Jest to przydatne przy szyfrowaniu czy obliczeniu sumy kontrolnej.
Tutaj zaszyfrujemy tekst z linii 117 za pomocą gpg
i hasła tajnehaslo
Tekst niezaszyfrowany w linii 117 ``` ``` :117 ! gpg -a -c - -----BEGIN PGP MESSAGE----- jA0EBwMC8MJMzMCMn+Lp0lcBi6dx1AYRx9OE/xXZSHWTpbi2Zy9Rt5AVw2IIjyYS n3hobFW418P8IDXL0swMT7ljaZBFujd/axC18CaGXixXfBgosIW4QcVoVhyOublG 2r4YGqJ0Ip8= =Dlnx -----END PGP MESSAGE-----
Spróbujmy to odszyfrować, tekst odszyfrowany pojawi się w miejscu zaszyfrowanego.
:121,127 ! gpg -d - gpg: dane zaszyfrowano za pomocą AES gpg: zaszyfrowane jednym hasłem Tekst niezaszyfrowany w linii 117
Zaszyfrowanie całego pliku, efektem tego polecenia będzie plik o tej samej
nazwie z rozszrzeniem asc
.
:!gpg -a -c %
Oczywiście możemy go zaszyfrować i wstawić w tym pliku
:r!gpg -a -c -o- % -----BEGIN PGP MESSAGE----- jA0EBwMCmYkAj1CGFMHp0uoBolAcFPD74Z4Qys7dxDbMrZcoOr1Z3ZBF/+w7LJrS rWMOMER02Wz38ih9S0OR3mjwrtU//u9LHrHhVtEH9jnhvuOOM6lbNK7G7bF2wTSw sNsotFws4wlnaXfHrHymN4HXdHI3LH4KSBOcLmbLWs8rDhYZvjEEF65dmuH+pA1t ... djhK0ksMfjOe/FS8N3yy4zOPEwhZEbn+F6GvysHELdpfBICkamN3a6cF4xbt8aOy NLS5j4KP7rXMHy1tmaZ8tG1C2vX0MKm79QwFpYfiPyeRcpSR5nLDYggzISPMeg== =Ad2e -----END PGP MESSAGE-----
Teraz spróbujmy zaszyfrować inny plik i wstawić go w to miejsce
:r!gpg -a -c -o- /etc/i3/config -----BEGIN PGP MESSAGE----- jA0EBwMCExkKVsCLc1Lp0usBCPZMKh0ifLBSJ7SFC9jQPOk+03IyJasyZJauhP4U 8+PBaaVnbk7J9V+5Ig8gtKLKYMwd53LHgKdOKqMUcC6ou1mR/Bjc0JtHSO0hFpV5 9jtMhibT/FNRUv+6iANlCTahDZBtOpR4Gx4ZTJKJQbmKjlRBRs+jPzfihCTA70/C ... LBtyCuv0E2b3pWISP8qRo0+QLkecP1sofGnQu9ZUlszCaeL/VBpf8Sz6dm6Vecuh DzEKXmBsQ1Dw =ipfY -----END PGP MESSAGE-----
Istnieje jeszcze inna możliwość uruchomienia polecenia i wstawienia wyniku do
bufora jest to skrót !!
efektem czego będzie przejście do trybu komend z już
wstawioną komendą :.!
, po której możemy wstawić swoje polecenie.
Na przykła d !!
, :.!ls -alh
czego efektem będzie wstawienie wyniku
polecenia ls -alh
do bufora.
Kolejnym ciekawym rozwiązaniem jest uruchomienie polecenia znajdującego się w treści pliku.
Powiedzmy, że mamy plik o treści:
du -sh /home/$USER
Przechodzimy do linii gdzie znajduje się polecenie du
i tak jak poprzednio
wciskamy !!
pojawia się nam :.!
teraz możemy użyć zmiennej $SHELL
do
wykonania komendy lub innej powłoki systemowej np sh
, całość powinna wyglądać
tak:
:.!$SHELL ``` lub ``` :.!sh
Można sobie zmapować skrót, ja używam <leader>e:
nnoremap <leader>e !!sh<cr>
Uruchamianie poleceń z edytora Vim
Sprawdzenie bieżącego katalogu
:!pwd /home/user/
Konwersja pliku Markdown do HTML za pomocą pandoc
:!pandoc % -t html -o %.html
Date: 2020-10-21T21:22:56+02:00 |