Thiết bị đầu cuối và Vim


7

Tôi mở một thiết bị đầu cuối sau đó tôi mở Vim. Sau đó, tôi làm việc với mã nguồn của mình, nhưng không may là tôi nhấp vào nút đóng của thanh tiêu đề thiết bị đầu cuối và công việc của tôi bị mất. Có thể cấu hình Vim sao cho nó sẽ cho tôi biết khi tôi đang cố gắng đóng thiết bị đầu cuối mà không lưu công việc của mình?

Cảm ơn!


gnome-terminal sẽ cảnh báo nếu có bất kỳ chương trình nào đang chạy trong các cửa sổ terminal, tất nhiên, bao gồm cả vim.
Capi Etheriel

2
Mà "hạn"? Có một chương trình được gọi là trên nhiều hệ điều hành khác nhau và chúng có các cách khác nhau để được cấu hình để đối phó với vấn đề này.
Warren Young

@Warren Young: Đây là một thiết bị đầu cuối xfce4. Theo câu trả lời của Chris Down bên dưới, tôi muốn thay đổi cách thiết bị đầu cuối của tôi xử lý WM_DELETE_WINDOW, nhưng tôi chưa biết cách thực hiện.
Benjamin

Câu trả lời:


15

Không có cách nào vimđể biết trước rằng quy trình của ông bà (thiết bị đầu cuối) cũng bị giết, vì vậy, nó thường bị giết do giết chết các quy trình cha mẹ.

Tuy nhiên, trên hầu hết các thiết lập mặc định vimsẽ tạo một .swptệp được đặt tên sau khi tệp hiện tại được chỉnh sửa; ví dụ MyPrecious.java.swp. Tệp này phải chứa ảnh chụp nhanh của tệp MyPrecious.javangay trước khi vimquá trình bị hủy. Trừ khi bạn đã thiết lập vimđể đặt các .swptệp này vào một số thư mục khác, chúng sẽ nằm trong cùng thư mục với tệp đã chỉnh sửa và bạn có thể dễ dàng khôi phục công việc chỉnh sửa của mình.

Lưu ý rằng một số tệp này bắt đầu bằng dấu chấm .để chúng vô hình trừ khi bạn sử dụng ls -ađể liệt kê các tệp trong thư mục.


4
+1 nhưng bạn nên thêm rằng .swptên tệp bắt đầu bằng một tên .mặc định là 'vô hình'.
Zenon

12

Nhìn vấn đề từ một góc độ khác, screenhoặc tmuxsẽ cho phép bạn giữ vỏ của mình hoạt động độc lập với thiết bị đầu cuối của bạn. Khi bạn đóng thiết bị đầu cuối, bạn có thể mở một thiết bị mới và kết nối lại với vỏ ban đầu. Vim vẫn sẽ chạy.


Tôi sử dụng tmux và nó được nối vào .zloginđể nó luôn khởi động khi tôi đăng nhập vào shell. Không bao giờ mất một cửa sổ kể từ đó.
Matthew Scharley

@MatthewScharley - ifchỉ cần lấy các giá trị trả về - bạn không cần thực hiện phát hành đường vòng của mình tmuxbằng cách kiểm tra $?, chỉ cần kiểm tra tmux.
Chris Xuống

7

vimkhông kiểm soát cách xử lý GUI của thiết bị đầu cuối của bạn WM_DELETE_WINDOW. Thay vào đó, hãy tìm một cài đặt trong thiết bị đầu cuối của bạn để kiểm soát cách thức hoạt động của thiết bị đầu cuối khi được yêu cầu đóng khi có vỏ với trẻ em.


Cảm ơn! Nhưng làm cách nào tôi có thể thay đổi cách thiết bị đầu cuối của mình (xfce4-terminal) xử lý WM_DELETE_WINDOW?
Benjamin

5

một cách để Vim để biết rằng thiết bị đầu cuối đã được khép kín: các SIGHUPtín hiệu.

Khi bạn đóng một thiết bị đầu cuối, SIGHUPtín hiệu được gửi đến quá trình kiểm soát , thường là vỏ của bạn. Vỏ của bạn sau đó sẽ thoát, khiến Vim được gửi SIGHUPtín hiệu . Theo mặc định, các quy trình chỉ đơn giản là chấm dứt khi chúng nhận được SIGHUPtín hiệu .

Tôi không quen thuộc với Vim, nhưng có lẽ nó có thể được cấu hình để lưu tất cả công việc trước khi thoát khi SIGHUPnhận được tín hiệu. Nếu không, có thể bạn có thể đặt một vỏtrap trên SIGHUP, có lẽ kết hợp với chạy Vim với nohup, để thực hiện một lệnh đặc biệt nào đó gây Vim để thoát một cách duyên dáng hơn khi nhà ga được đóng lại.


1

Như những người khác đã tuyên bố, vim không thể phản ứng với một sự kiện như vậy. Nhưng bạn có thể xem xét một trong những cách giải quyết sau:

  • Sử dụng gvimthay vì vim, cũng có thể được gọi từ dòng lệnh. Một bí danh có thể giúp điều chỉnh công tắc (giả sử vỏ tương thích bash) : alias vim=gvim. Nói gvim là trình soạn thảo ưa thích của bạn cũng có thể giúp đỡ : export EDITOR=gvim. Điều này chỉ hoạt động trên một máy cục bộ.
  • Sử dụng một muxer thiết bị đầu cuối (như tmuxhoặc screen) đã được đề cập.
  • Định cấu hình thiết bị đầu cuối của bạn (bất kể đó là gì) để xác nhận rằng bạn muốn đóng nó. Điều này sẽ khiến bạn bất ngờ trong vài lần đầu tiên, điều này sẽ buộc bạn phải suy nghĩ trước khi đóng thiết bị đầu cuối của bạn trong thời gian dài.

1

Điều này đã đến với tôi sau khi tôi đặt câu hỏi trong một diễn đàn khác AskUbfox: vim.desktop - những thay đổi bị mất khi thiết bị đầu cuối thoát ra và rất nhiều *.desktoptệp thử nghiệm chứng minh rằng gnome-terminalsẽ cho phép vimbị giết mà không cần cảnh báo ngay cả khi nó đang chạy trong vỏ & ngay cả khi có là các lệnh khác trước hoặc sau khi nó chạy bashhoặc gnome-terminalchạy.

Một shell "tương tác" bash -inghe có vẻ chắc chắn sẽ gọi cảnh báo Gnome khi đóng cửa sổ, dựa trên thông báo cảnh báo bằng chữ:

Đóng thiết bị đầu cuối này? Vẫn còn một quá trình chạy trong thiết bị đầu cuối này. Đóng thiết bị đầu cuối sẽ giết nó.

nhưng việc thêm -itùy chọn vào bash, khi chạy từ *.desktoptệp, đã ngăn Gnome mở một cửa sổ trong thử nghiệm của tôi (với Ubuntu 16.04 - gnome-terminal3.18.3). Vì vậy, thay vào đó tôi đã thử gọi trình bao tương tác từ tập lệnh trình bao bọc và đó là một giải pháp đầy đủ:

/usr/local/bin/vim-gnome-wrap

#!/bin/bash -f
bash -ic 'vim "$@"' vim "$@"

... Sau đó chỉnh sửa /usr/share/applications/vim.desktophoặc sao chép nó vào một *.desktoptệp mới , với những thay đổi sau:

TryExec=vim-gnome-wrap
# It doesn't open window for interactive shell when GNOME arranges the terminal:
# Terminal=true
# Exec=vim-gnome-wrap %F
# ... yet it does so when gnome-terminal is run explicitly:
Terminal=false
Exec=gnome-terminal -e "vim-gnome-wrap %F"

Điều này cung cấp một cảnh báo khi đóng cửa sổ xem vimbộ đệm có thay đổi chưa lưu hay không và hoạt động trên nhiều tệp. Đặc biệt cảm ơn @muru bên dưới vì đã đề xuất $@cú pháp bảo tồn chính xác các đối số (dấu cách & siêu ký tự).


Trong một kịch bản, tôi sẽ sử dụng bash -ic 'vim "$@"' vim "$@". Điều đó sẽ xử lý tên tập tin với không gian, vv đủ tốt. (Thứ hai vimlà chỉ $0cho lệnh, nó có thể là bất cứ điều gì.)
muru

cảm ơn @muru, đã chỉnh sửa như vậy, nhận thấy vấn đề này và hy vọng sẽ có câu trả lời nhanh như vậy.
rphair
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.