ฉันจะเปิดไฟล์แบบอ่านอย่างเดียวจากบรรทัดคำสั่งด้วย emacs / vi / vim ได้อย่างไร


76

มีวิธีบอก emacs / vi / vim (จากบรรทัดคำสั่ง) ที่ฉันต้องการดูไฟล์หรือไม่ view-mode หรือ read-only.

ฉันรู้วิธีเปิดไฟล์เป็นการอ่านเฉพาะเมื่อ emacs / vi / vim ทำงานอยู่แล้ว


หมายเหตุ: หากคุณไม่ได้รับอนุญาตให้เขียนไฟล์ Vim จะเปิดไฟล์ในโหมดอ่านอย่างเดียวตามค่าเริ่มต้น ที่จริงแล้วฉันคิดว่าการควบคุมการอนุญาตให้ใช้ไฟล์ง่ายกว่าการจัดเตรียมวิธี "อ่านอย่างเดียว"
Franklin Yu

คำตอบ:


43

สำหรับ emacs:

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

ไม่มีตัวเลือกการเริ่มต้นเพื่อบังคับให้อ่านอย่างเดียว

แก้ไข:
หากคุณใส่ฟังก์ชั่นเล็ก ๆ นี้ไว้ในสคริปต์เริ่มต้นเชลล์ของคุณ (ตัวอย่างเช่น. bashrc) คุณสามารถเปิดไฟล์แบบอ่านอย่างเดียวโดยพิมพ์ ev file_to_view

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

11
ฉันหวังว่าฉันจะลงคะแนน emacs สำหรับสิ่งนี้
Robert Calhoun

145

ชื่อไฟล์ -R


3
ใช้งานได้ดี แต่ฉันยอมรับคำตอบของ Trey เพราะฉันชอบ emac มากกว่าเสียงเรียกเข้า
Nifle

32
และผู้ใช้ที่เป็นกลุ่มทั้งหมดจะแก้แค้นด้วยการ upvoting มากกว่า "คำตอบที่ยอมรับ": D
Xosofox

1
หมายเหตุ: บางช่องดูเหมือนจะมีคำสั่ง 'view' ซึ่งอาจเป็นชื่อแทน 'vi -R'
armyofda12mnkeys

26

ดูชื่อไฟล์

โดยทั่วไปจะเป็นกลุ่มในโหมดอ่านอย่างเดียว Simples!

ตามความเห็นด้วยความคิดเห็นในกรณี view เชื่อมโยงกับธรรมดา vi, นี่ ทุบตี คำสั่งเพื่อตรวจสอบสถานการณ์ก่อนแล้วจึงแก้ไข:

# 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
ไม่มีการเน้นไวยากรณ์
Nifle

7
@Nifle: ไม่ควรมีความแตกต่างในการเน้นไวยากรณ์ ถ้าคุณ vim มีการเน้นไวยากรณ์ แต่ของคุณ view ไม่อาจเป็นของคุณ view เป็นลิงก์ไปยังเวอร์ชันขั้นต่ำของ vim ที่ไม่มีการเน้นไวยากรณ์ที่คอมไพล์แล้วเปรียบเทียบผลลัพธ์ของ :version คำสั่ง
garyjohn

1
เหตุผลที่ทำไม "เพิ่งได้ผล": เสียงเรียกเข้าจะอ่านจริง argv[0] เพื่อตัดสินใจพฤติกรรมของมัน มันเป็นกลอุบายทั่วไป AFAIK บางครั้ง GCC และ Bash ก็ทำได้เช่นกัน
Franklin Yu

10
vim -R <file>

อนุญาตให้เขียนด้วย :w!

vim -c ":set nomodifiable"  <file>

ป้องกันผู้ใช้จากการเปลี่ยนแปลงไฟล์ในบัฟเฟอร์ แต่ผู้ใช้สามารถทำให้บัฟเฟอร์สามารถแก้ไขได้ด้วย :set modifiable

คุณสามารถใช้

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

เพื่อป้องกันไม่ให้ผู้ใช้ปิด "nomodifiable" และอนุญาตให้ผู้ใช้ออกจากการกด q. แต่จากนั้นผู้ใช้จะไม่สามารถเข้าสู่โหมดคำสั่งได้เลยซึ่งอาจเป็นหรือไม่ใช่สิ่งที่คุณต้องการ

คุณสามารถเปิดไฟล์โดยใช้คำสั่ง less:

less <file>

หากต้องการดูไฟล์ในสภาพแวดล้อมที่เหมือนเป็นกลุ่ม แต่ไม่มีความสามารถในการเปลี่ยนไฟล์


+1 สำหรับการใช้งาน lessแม้ว่าในขณะที่ @nxdrvr ชี้ให้เห็นคุณสามารถกด โวลต์ ปุ่มเพื่อเปิดไฟล์ในโหมดที่แก้ไขได้ใน vi
Sheharyar

8

ติดตามคำตอบที่ได้รับการยอมรับเล็กน้อย: คุณสามารถใช้นามแฝงนี้ในเชลล์เพื่อลดคำสั่งเป็นคำสั่งเดียว ตัวอย่างเช่นใน bash คุณสามารถใส่สิ่งต่อไปนี้ใน. bashrc ของคุณ:

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

(กระสุนที่แตกต่างกันจะมีรูปแบบที่แตกต่างกันสำหรับการทำสิ่งนี้ แต่คุณได้รับแนวคิด)

ฉันจะเพิ่มสิ่งนี้เป็นความคิดเห็นเพื่อตอบกลับคำตอบที่ยอมรับ แต่ดูเหมือนจะเป็นไปไม่ได้ที่จะมีบล็อก "รหัส" หลายบรรทัดในความคิดเห็นและ (ในทุบตีอยู่ดี) รหัสข้างต้นไม่จำเป็นต้องเป็นจริง แยก 3 บรรทัด


5

หากต้องการดูไฟล์โดยไม่สามารถแก้ไขได้:

cat <file> | less

ใน less คุณสามารถไปที่ "แก้ไขโหมดไฟล์" โดยกดปุ่ม โวลต์ สำคัญ. แต่คุณไม่สามารถแก้ไขอินพุตมาตรฐานได้ดังนั้นการวางเอาต์พุตของ cat <file> ให้น้อยลงหยุด less จากไปที่โหมด 'แก้ไข' เมื่อกด 'v'

สำหรับเป็นกลุ่มวิธีเดียวกัน

cat <file> | vim -

4
ขอบคุณสำหรับ v ข้อเสนอแนะ ดี
Tshepang

2
+1 แต่ไม่จำเป็น cat. เพียงใช้ <FILENAME less.
Sparhawk

@Sparkhawk, <file> less จะให้ข้อผิดพลาดฉันสมมติว่าคุณหมายถึง less <file>แต่ตามที่อธิบายในคำตอบเมื่อใช้ less โดยตรงผู้ใช้สามารถกด โวลต์ คีย์และเข้าสู่โหมดแก้ไข การเป่า cat ไปยัง less หยุดสิ่งนี้ไม่ให้เกิดขึ้น
Sheharyar

@Sheharyar เขาหมายถึงการเปลี่ยนเส้นทางออก บางทีคุณอาจคุ้นเคยกับ less < FILENAMEซึ่งทำให้คุณ "ไม่สามารถแก้ไขอินพุตมาตรฐาน" เมื่อคุณกด V . ในทำนองเดียวกันกับ Vim: vim - < FILENAME.
Franklin Yu

4

สำหรับ emacs คุณยังสามารถใช้ มุมมองโหมด .

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

หรือทางเลือกภายในอาคารผู้โดยสาร:

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

หรือคุณสามารถใช้ของฉัน สคริปต์ wrapper


1

ใน emacs คุณสามารถทำได้

emacs FILE -f view-mode

ใช้การไฮไลต์ไวยากรณ์ ไม่เพียงแค่เปิดไฟล์เป็นบัฟเฟอร์แบบอ่านอย่างเดียว คำสั่งบางคำเช่น I-search สามารถเข้าถึงได้โดยไม่ต้องมีปุ่มควบคุมในโหมดนี้


0

การส่งไฟล์ไปยัง std out อาจยอมรับได้ตามขนาดของไฟล์

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

0

ฉันจะไม่ทิ้งคำตอบของผู้ใช้ที่นี่ แต่ฉันต้องการที่จะเพิ่มข้อมูลเพิ่มเติมเกี่ยวกับ Read-only Mode ไฟล์. ตามเอกสาร Oreilly โหมดอ่านอย่างเดียว จะมีบางครั้งที่คุณต้องการดูไฟล์ แต่ต้องการปกป้องไฟล์นั้นจากการกดแป้นและการเปลี่ยนแปลงโดยไม่ตั้งใจ (คุณอาจต้องการโทรในไฟล์ที่มีความยาวเพื่อฝึกการเคลื่อนไหวของ vi หรือคุณอาจต้องการเลื่อนดูไฟล์คำสั่งหรือโปรแกรม) คุณสามารถป้อนไฟล์ในโหมดอ่านอย่างเดียวและใช้คำสั่งการเคลื่อนไหว vi ทั้งหมด แต่คุณจะไม่สามารถเปลี่ยนไฟล์ได้

หากต้องการดูไฟล์ในโหมดอ่านอย่างเดียวให้ป้อน:

$ vi -R file

หรือ:

$ view file

(คำสั่ง view เช่นคำสั่ง vi สามารถใช้ตัวเลือกบรรทัดคำสั่งใดก็ได้เพื่อเลื่อนไปยังตำแหน่งที่ระบุในไฟล์) หากคุณตัดสินใจที่จะแก้ไขไฟล์คุณสามารถแทนที่โหมดอ่านอย่างเดียวโดย การเพิ่มเครื่องหมายอัศเจรีย์ในคำสั่ง write:

:w!
or:

:wq!

หากคุณมีปัญหาในการเขียนไฟล์

สำหรับการอ้างอิงต่อไป ที่นี่

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.