Jak mogę otworzyć plik tylko do odczytu z wiersza poleceń za pomocą emacs / vi / vim

79

Czy istnieje sposób, aby powiedzieć emacs / vi / vim (z wiersza poleceń), że chcę wyświetlić plik w view-modelub read-only.

Wiem, jak otworzyć plik tylko do odczytu, jeśli emacs / vi / vim już działa.

Nifle
źródło
Uwaga: jeśli nie masz uprawnień do zapisu do pliku, Vim domyślnie otworzy go w trybie tylko do odczytu. Właściwie myślę, że łatwiej jest kontrolować uprawnienia do plików niż zapewnić opcję „tylko do odczytu”.
Franklin Yu,

Odpowiedzi:

45

W przypadku emacsa:

emacs FILE --eval '(setq buffer-read-only t)'

Nie ma opcji uruchamiania wymuszającej tylko odczyt.

Edycja:
Jeśli umieścisz tę małą funkcję w skrypcie uruchamiania powłoki (na przykład .bashrc), możesz otworzyć plik tylko do odczytu, wpisującev file_to_view

ev() {
  emacs "$1" --eval '(setq buffer-read-only t)'
}
Trey Jackson
źródło
11
Chciałbym móc za to głosować za emacsa.
Robert Calhoun
145

vim -R nazwa pliku

RedGrittyBrick
źródło
4
Działa świetnie, ale zaakceptowałem odpowiedź Treya, ponieważ wolę emacsa niż vima
Nifle
32
I wszyscy użytkownicy vima mszczą się, poprawiając je na więcej niż „zaakceptowaną odpowiedź”: D
Xosofox
1
Uwaga: niektóre pola wydają się mieć komendę „view”, być może aliasy na „vi -R”.
armyofda12mnkeys
26

wyświetl nazwę pliku

Zasadniczo vim w trybie tylko do odczytu; proste!

Jak wskazano w komentarzu, w przypadku, gdy viewjest on powiązany z zwykłym vi, oto polecenia bash , aby najpierw sprawdzić sytuację, a następnie naprawić:

# non-destructive inspection
which vim
which view
ls -l $(which view)

# overwrite current view with symlink to vim, requires root
ln -sfv $(which vim) $(which view)
mrverrall
źródło
1
Brak podświetlania składni.
Nifle
7
@Nifle: Nie powinno być żadnej różnicy w podświetlaniu składni. Jeśli masz vimpodświetlanie składni, ale viewnie masz , być może viewjest to link do minimalnej wersji vim, która nie ma wkompilowanego podświetlania składni. Porównaj wyniki :versionpolecenia.
garyjohn
1
Powód, dla którego „po prostu działa”: Vim faktycznie przeczyta, argv[0]aby zdecydować o swoim zachowaniu. To powszechna sztuczka; AFAIK czasami GCC i Bash również to robią.
Franklin Yu,
10
vim -R <file>

pozwala pisać z :w!

vim -c ":set nomodifiable"  <file>

Zapobiega wprowadzaniu przez użytkownika jakichkolwiek zmian w pliku w buforze. Ale użytkownik może zmodyfikować bufor za pomocą:set modifiable

Możesz użyć

vim -c ":noremap q :q<cr>" -c ":map : <Esc>" -c ":set nomodifiable" <file>

aby uniemożliwić użytkownikowi wyłączenie opcji „nomodifiable” i pozwolić użytkownikowi wyjść z menu, naciskając q. Ale wtedy użytkownik nie może w ogóle przejść do trybu poleceń, co może być lub nie być tym, czego chcesz.

Możesz także otworzyć plik za pomocą polecenia less:

less <file>

Aby wyświetlić plik w środowisku podobnym do vima, ale bez możliwości zmiany pliku.

Sójka
źródło
+1 za używanie less, chociaż jak wskazuje @nxdrvr, możesz nacisnąć klawisz v , aby otworzyć plik w trybie edytowalnym wvi
Sheharyar
9

Drobne działania następcze w stosunku do zaakceptowanej odpowiedzi: Możesz dokonać aliasu w powłoce, aby zredukować ją do pojedynczego polecenia. Na przykład w bash możesz umieścić następujące .bashrc:

emacsro() {
  emacs $1 --eval '(setq buffer-read-only t)'
}

(różne powłoki będą miały do ​​tego różne formaty, ale masz pomysł)

Dodałbym to jako komentarz w odpowiedzi na zaakceptowaną odpowiedź, ale nie wydaje się możliwe, aby w komentarzu znajdował się wieloliniowy blok „kodu” i (w skrócie) powyższy kod naprawdę musi być na 3 osobnych liniach.

Chirael
źródło
6

Aby wyświetlić plik bez możliwości edycji:

cat <file> | less

W lessmożna przejść do trybu „Edycja pliku” przez naciśnięcie vklawisza. Ale nie możesz edytować standardowego wejścia, więc przesyłanie danych wyjściowych cat <file>do mniej, przestaje lessprzechodzić do trybu edycji po naciśnięciu „v”.

Dla vima to samo podejście

cat <file> | vim -
nxdrvr
źródło
4
Dziękuję za vsugestię. Fajne
tshepang
2
+1, ale nie ma potrzeby cat. Po prostu użyj <FILENAME less.
Sparhawk
@Sparkhawk, <file> lessdałby błąd, zakładam, że miałeś na myśli less <file>, ale jak wyjaśniono w odpowiedzi, przy lessbezpośrednim użyciu użytkownik może nacisnąć klawisz v i przejść do trybu edycji. Rurociągi, cataby lesstemu zapobiec.
Sheharyar
@ Sheharyar Miał na myśli przekierowanie wyjścia. Może jesteś bardziej zaznajomieni z less < FILENAME, co daje „nie można edytować standardowe wejście” po naciśnięciu V . Podobnie z vim: vim - < FILENAME.
Franklin Yu,
4

W przypadku emacsa możesz także użyć trybu widoku .

emacsclient --create-frame --eval '(view-file "/tmp/EXAMPLE")'

lub alternatywnie w terminalu:

emacsclient --nw --eval '(view-file "/tmp/EXAMPLE")'

Lub możesz użyć mojego skryptu opakowania


źródło
1

W emacs możesz to zrobić

emacs FILE -f view-mode

Podświetlanie składni jest stosowane. Nie tylko otwiera plik jako bufor tylko do odczytu. Niektóre polecenia, takie jak I-search, są dostępne bez klawisza sterującego w tym trybie.

jogama
źródło
0

wysyłanie pliku do standardowego wyjścia może być dopuszczalne, biorąc pod uwagę rozmiar pliku

cat <file>  # dump whole file to stdout
head <file> # view the first few lines
tail <file> # view the last n lines
Nathan Feger
źródło
0

Nie zamierzam zdyskredytować żadnej odpowiedzi użytkownika tutaj, ale chciałbym dodać więcej informacji o Read-only Modepliku. Zgodnie z dokumentacją oreilly Tryb tylko do odczytu Będą chwile, kiedy chcesz spojrzeć na plik, ale chcesz zabezpieczyć ten plik przed przypadkowymi naciśnięciami klawiszy i zmianami. (Możesz chcieć wywołać długi plik, aby ćwiczyć ruchy vi, lub możesz przewinąć plik poleceń lub program). Możesz wprowadzić plik w trybie tylko do odczytu i użyć wszystkich poleceń ruchu vi, ale nie będziesz mógł go zmienić.

Aby wyświetlić plik w trybie tylko do odczytu, wprowadź:

$ vi -R file

lub:

$ view file

(Polecenie view, podobnie jak polecenie vi, może korzystać z dowolnej opcji wiersza polecenia, aby przejść do określonego miejsca w pliku). Jeśli zdecydujesz się na edycję pliku, możesz zastąpić tryb tylko do odczytu dodając wykrzyknik do polecenia write:

:w!
or:

:wq!

Jeśli masz problem z zapisaniem pliku.

W celu uzyskania dalszych informacji tutaj

Md Haidar Ali Khan
źródło