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