Zdá se, že existují různé přístupy v závislosti na vašem aktuálním problému:
- Pouze pro čtení od vi. Pokud má váš soubor
:set readonly
můžete- Použijte
:w!
vynutit zápis, nebo - Vydání
:set noreadonly
a pak stačí použít normální:w
- Použijte
- Povolení problém (sudo ):neumíš psát, ale máš práva sudo.
- Problém:
:w !sudo tee %
. Tím se vyrovnávací paměť zapíše natee
, příkaz, který přijímá pipe informace a může zapisovat do souborů. A protože je tee spuštěno pomocí sudo powers, tee může soubor upravit.
- Problém:
- Povolení problém (žádné sudo ):nemáte práva k zápisu souboru a nemáte přístup správce.
- Použijte
:w! ~/tempfile.ext
zapsat změny do dočasného souboru a poté provést opatření k přesunutí dočasného souboru do adresáře (odeslání dočasného souboru vlastníkovi/adminovi adresáře).
- Použijte
Více si o tom můžete přečíst zde:
- Ze StackOverflow
- Od Geekyboye
- Z Data Agaric
Zkratka
Jak to často bývá problém č. 2 (povolení problém s sudo ), můžete na svůj /etc/vim/vimrc
(nebo ~/.vimrc
) následující zkratka:
cnoremap w!! execute 'silent! write !sudo tee % >/dev/null' <bar> edit!
Pak stačí napsat :w!!
uložit pomocí sudo pravomoci. Nebudu to zde vysvětlovat, ale výše uvedené odkazy pokrývají mnoho zkratek.
Napadají mě dva způsoby, jak to udělat.
První způsob předpokládá, že soubor vlastníte, ale soubor je POUZE PRO ČTENÍ.
Stačí použít příponu vykřičníku vi k příkazu write (:w!), abyste vynutili přepsání vašeho vlastního souboru pouze pro čtení. To samozřejmě předpokládá, že máte oprávnění zapisovat a spouštět v aktuální složce.
:w!
způsobí, že vi přepíše původní soubor pouze pro čtení.
Druhý způsob předpokládá, že soubor vlastní někdo jiný a vy byste chtěli do tohoto souboru uložit své změny.
Jedním ze způsobů, jak toho dosáhnout, je uložit změny provedené v původním souboru jako skript ed z vi. Tento skript ed lze použít na původní soubor (nebo jiné podobné soubory) později mimo vi pomocí editoru ed line.
Způsob, jak uložit aktuální relaci úprav jako skript ed, je předat původní název souboru a upravenou vyrovnávací paměť vi jako standardní vstup do obslužného programu diff pomocí přepínače příkazového řádku --ed, tj. zobrazit rozdíly jako skript ed.
Takže za předpokladu upraveného vi bufferu proveďte následující
:.,$!diff --ed [original_file] -
Tím se nahradí všechny řádky v aktuální vyrovnávací paměti (.,$!) skriptem ed vygenerovaným rozdílem (diff --ed [originální_soubor] -) nezbytným pro převod původního souboru na obsah aktuální vyrovnávací paměti. Tento ed skript pak chceme uložit na bezpečné místo a použít skript na verzi původního souboru, do kterého můžeme zapisovat. Skript tedy uložte do zapisovatelného umístění, například do vaší přihlašovací složky:
:w ~/my_ed_script
Nyní ukončete vi a použijte tento skript ed k získání upraveného souboru, který nebylo možné uložit. Zde je návod, jak toho dosáhnout z příkazového řádku bash, '$':
$ (cat ~/my_ed_script && echo 'w') | ed - writable_copy_of_original_file
Tato posloupnost příkazů dělá ve slovech řetězení skriptu, který jsme vygenerovali pomocí diff, a ozvěnu příkazu ed write, 'w', do standardního vstupu ed. Ed poté použije tento skript na zapisovatelnou kopii původního souboru a zapíše tyto modifikované změny vyrovnávací paměti zpět do souboru.
Takže toto je způsob, jak uložit práci provedenou ve vi do souboru, který původně vlastnil někdo jiný pomocí vi, diff a ed.