Làm cách nào tôi có thể mở tệp chỉ đọc từ dòng lệnh với emacs / vi / vim


79

Có cách nào để nói với emacs / vi / vim (từ dòng lệnh) rằng tôi muốn xem tệp trong view-modehoặc read-only.

Tôi biết cách mở tệp dưới dạng chỉ đọc nếu emacs / vi / vim đang chạy.


Lưu ý: nếu bạn không có quyền ghi vào tệp, Vim sẽ mặc định mở tệp ở chế độ chỉ đọc. Trên thực tế, tôi nghĩ việc kiểm soát tập tin dễ dàng hơn là cung cấp một cách "chỉ đọc".
Franklin Yu

Câu trả lời:


45

Đối với emacs:

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

Không có tùy chọn khởi động để buộc chỉ đọc.

Chỉnh sửa:
Nếu bạn đặt hàm nhỏ này trong tập lệnh khởi động shell của mình (ví dụ .bashrc), bạn có thể mở tệp chỉ đọc bằng cách nhậpev file_to_view

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

11
Tôi ước tôi có thể downvote emacs cho điều này.
Robert Calhoun

145

tên tệp vim -R


4
Hoạt động tuyệt vời nhưng tôi đã chấp nhận câu trả lời của Trey vì tôi thích emacs hơn vim
Nifle

32
Và tất cả người dùng vim trả thù bằng cách nâng cấp nó lên nhiều hơn "câu trả lời được chấp nhận": D
Xosofox

1
Lưu ý: một số hộp dường như có lệnh 'view' có thể là bí danh cho 'vi -R'.
armyofda12mnkeys

26

xem tên tập tin

Về cơ bản vim ở chế độ chỉ đọc; đơn giản!

Như được gợi ý bởi nhận xét, trong trường hợp viewđược liên kết với đơn giản vi, đây là các lệnh bash để kiểm tra tình huống đầu tiên và sau đó sửa nó:

# 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)

1
Không có cú pháp tô sáng mặc dù.
Nifle

7
@Nifle: Không nên có bất kỳ sự khác biệt nào trong việc tô sáng cú pháp. Nếu bạn vimcó tô sáng cú pháp nhưng viewkhông có, có lẽ bạn viewlà một liên kết đến phiên bản tối thiểu vimkhông có cú pháp tô sáng cú pháp được biên dịch. So sánh kết quả đầu ra của :versionlệnh.
garyjohn

1
Lý do tại sao nó "chỉ hoạt động": Vim thực sự sẽ đọc argv[0]để quyết định hành vi của nó. Đó là một mẹo phổ biến; AFAIK đôi khi GCC và Bash cũng làm điều này.
Franklin Yu

10
vim -R <file>

cho phép viết với :w!

vim -c ":set nomodifiable"  <file>

Ngăn người dùng thực hiện bất kỳ thay đổi nào đối với tệp trong bộ đệm. Nhưng người dùng có thể làm cho bộ đệm có thể sửa đổi với:set modifiable

Bạn đã có thể sử dụng

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

để ngăn người dùng tắt "danh nghĩa" và cho phép người dùng thoát bằng cách nhấn q. Nhưng, sau đó người dùng không thể vào chế độ lệnh, có thể hoặc không thể là những gì bạn muốn.

Bạn cũng có thể mở tệp bằng lệnh less:

less <file>

Để xem tệp trong môi trường giống như vim nhưng không có khả năng thay đổi tệp.


+1 để sử dụng less, mặc dù như @nxdrvr chỉ ra, bạn có thể nhấn phím v để mở tệp ở chế độ có thể chỉnh sửa trongvi
Sheharyar

9

Theo dõi nhỏ cho câu trả lời được chấp nhận: Bạn có thể đặt bí danh này trong trình bao của mình để giảm nó thành một lệnh duy nhất. Ví dụ: trong bash, bạn có thể đặt phần sau vào .bashrc:

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

(các shell khác nhau sẽ có các định dạng khác nhau để thực hiện điều này, nhưng bạn có ý tưởng)

Tôi đã thêm nó dưới dạng một nhận xét để trả lời câu trả lời được chấp nhận, nhưng dường như không thể có một khối "mã" nhiều dòng trong một bình luận, và (dù sao thì bash) mã trên thực sự cần phải có trên 3 dòng riêng biệt.


6

Để chỉ xem tệp mà không có khả năng chỉnh sửa:

cat <file> | less

Trong lessbạn có thể vào "chỉnh sửa chế độ tập tin" bằng cách bấm vphím. Nhưng bạn không thể chỉnh sửa đầu vào tiêu chuẩn, do đó, việc chuyển đầu ra cat <file>thành ít hơn, dừng lesschuyển sang chế độ 'chỉnh sửa' khi nhấn 'v'.

Đối với vim cách tiếp cận tương tự

cat <file> | vim -

4
Cảm ơn vlời đề nghị. Tiện lợi
tshepang

2
+1, nhưng không cần cat. Chỉ cần sử dụng <FILENAME less.
Sparhawk

@Sparkhawk, <file> lesssẽ báo lỗi, tôi cho rằng bạn có ý less <file>, nhưng như đã giải thích trong câu trả lời, khi sử dụng lesstrực tiếp, người dùng có thể nhấn phím v và chuyển sang chế độ chỉnh sửa. Đường ống catđể lessngăn chặn điều này xảy ra.
Sheharyar

@Sheharyar Ông có nghĩa là chuyển hướng đầu ra. Có lẽ bạn đã quen thuộc hơn với less < FILENAME, mang đến cho bạn "không thể chỉnh sửa đầu vào tiêu chuẩn" khi bạn nhấn V . Tương tự với Vim : vim - < FILENAME.
Franklin Yu

4

Đối với emacs, bạn cũng có thể sử dụng chế độ xem .

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

hoặc thay thế bên trong một thiết bị đầu cuối:

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

Hoặc bạn có thể sử dụng tập lệnh bao bọc của tôi


1

Trong emacs bạn có thể làm

emacs FILE -f view-mode

Làm nổi bật cú pháp được áp dụng. Nó không chỉ mở tệp dưới dạng bộ đệm chỉ đọc. Một số lệnh, chẳng hạn như I-search, có thể truy cập mà không cần phím điều khiển trong chế độ này.


0

gửi một tập tin đến std out, có thể được chấp nhận với kích thước của tập tin

cat <file>  # dump whole file to stdout
head <file> # view the first few lines
tail <file> # view the last n lines

0

Tôi sẽ không phản bác bất cứ ai trả lời ở đây, nhưng tôi muốn thêm một số thông tin về Read-only Modetập tin. Theo tài liệu oreilly Chế độ chỉ đọc Sẽ có lúc bạn muốn xem một tệp nhưng muốn bảo vệ tệp đó khỏi các lần nhấn phím và thay đổi. (Bạn có thể muốn gọi trong một tệp dài để thực hành các chuyển động vi hoặc bạn có thể muốn cuộn qua tệp lệnh hoặc chương trình). Bạn có thể nhập tệp ở chế độ chỉ đọc và sử dụng tất cả các lệnh di chuyển vi, nhưng bạn sẽ không thể thay đổi tệp.

Để xem tệp ở chế độ chỉ đọc, hãy nhập một trong hai:

$ vi -R file

hoặc là:

$ view file

(Lệnh view, như lệnh vi, có thể sử dụng bất kỳ tùy chọn dòng lệnh nào để tiến tới một vị trí cụ thể trong tệp.) Nếu bạn quyết định thực hiện một số chỉnh sửa cho tệp, bạn có thể ghi đè chế độ chỉ đọc bằng cách thêm một dấu chấm than vào lệnh write:

:w!
or:

:wq!

Nếu bạn có một vấn đề viết ra các tập tin.

Để biết thêm tại đây

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.