Làm thế nào để tôi biết tôi đang ở trong trình bao từ lệnh vi: sh?


9

Trong vi, tôi có thể nhận được một thiết bị đầu cuối shell với :shlệnh. Và sau này, tôi có thể trở lại vi bằng exitvỏ.

Nhưng, nếu tôi đã sử dụng thiết bị đầu cuối shell trong một thời gian dài, và tôi quên mất liệu exitsẽ đóng bất cứ thứ gì hoặc trả lại cho tôi vi.

Có cách nào để kiểm tra xem tôi sẽ quay lại vi không? jobshoặc fgkhông hoạt động.


3
Tôi đã ngừng sử dụng lệnh: sh từ nhiều năm trước do các vấn đề với lớp vỏ riêng biệt mà Vim bắt đầu và không thể quay lại với nó. Thay vào đó, tôi bắt đầu đặt Vim trong nền (ctrl-z) để trở lại vỏ bình thường. Quay trở lại Vim từ shell thông thường rất dễ dàng bằng cách sử dụng các chức năng kiểm soát công việc bash.
bsnyder

Câu trả lời:


8

Trong một vỏ thông thường:

$ env | grep -i vim
EDITOR=vim

Sau khi sử dụng :shell

$ env | grep -i vim
EDITOR=vim
VIMRUNTIME=/usr/share/vim/vim80
VIM=/usr/share/vim
MYVIMRC=/home/martin/.vim/vimrc

Vì vậy, nó trông giống như Vim đặt VIMRUNTIME, VIMMYVIMRCcác biến môi trường. Trong số đó, VIMcó vẻ đáng tin cậy nhất đối với tôi (bạn có thể không có thời gian chạy vimrc hoặc thậm chí vim).

Bạn cũng có thể đặt các biến môi trường của riêng mình:

:let $HELLO = "test"
:shell
$ echo $HELLO
test

Điều này đặc biệt hữu ích để truyền đạt thông tin về bộ đệm bạn đang chỉnh sửa; ví dụ:

:let $VIM_FILETYPE = &filetype
:let $VIM_FILENAME = expand('%:p')

Sẽ hiển thị như một cái gì đó như:

VIM_FILETYPE=go
VIM_FILENAME=/home/martin/a.go

3

Tôi có dấu nhắc lệnh của mình được thiết lập để thêm biểu tượng "+" màu đỏ cho biết nếu tôi đang ở trong vim ": sh" trái ngược với phiên shell thông thường. Nền tảng của nó là "$$" là mấu chốt của quy trình hiện tại vì vậy:

MY_PPID=$(ps --no-header -o ppid -p $$)          # Gets the pid of the parent
                                                 # process.
MY_PCMDLINE=$(ps --no-header -o cmd -p $MY_PPID) # Gets its command line.
MY_CMDDASH=$(awk '{print $1}' <<<$MY_PCMDLINE)   # Gets the command name, possibly
                                                 # with a preceding hyphen.
MY_CMD=${MY_CMDDASH#-}                           # Get the bare command name.

Khi bạn có thứ này, bạn có thể dễ dàng nội tuyến và tạo một cái gì đó giống như tôi đã mô tả để sử dụng trong ".bashrc" hoặc tương tự.

Lưu ý : Phương thức biến môi trường ($ VIM) được mô tả ở nơi khác có vẻ tốt hơn phương pháp này nhưng tôi sẽ bỏ qua phương thức này để xác định xem bạn có phải là một tiến trình con của bất cứ điều gì (không chỉ vim).


1
Vim đặt ba biến vào môi trường của lớp vỏ mà nó sử dụng :sh: MYVIMRC, VIM và VIMRUNTIME. Tất cả những gì bạn phải làm để biết bạn đang chạy trong lớp vỏ phụ của Vim là để kiểm tra sự hiện diện của bất kỳ thứ nào trong số đó.
garyjohn

2

Thực thi ps, hoặc tốt hơn , ps -fH. Ví dụ:

$ ps -fH
UID        PID  PPID  C STIME TTY          TIME CMD
garyjohn 31140 31139  0 10:26 pts/11   00:00:00 bash
garyjohn 31267 31140  2 10:26 pts/11   00:00:00   vim hello.txt
garyjohn 31271 31267  0 10:26 pts/11   00:00:00     /bin/bash
garyjohn 31332 31271  0 10:26 pts/11   00:00:00       ps -fH

Lợi thế của việc sử dụng ps -fHchỉ pslà nó cho phép bạn xem bạn đang ở trong một vỏ con của vimhoặc nếu bạn đặt vimtrong nền. Trong trường hợp đó, ps -fHsẽ trông như thế này:

$ ps -fH
UID        PID  PPID  C STIME TTY          TIME CMD
garyjohn 31140 31139  0 10:26 pts/11   00:00:00 bash
garyjohn 31267 31140  0 10:26 pts/11   00:00:00   vim hello.txt
garyjohn 31924 31140  0 10:29 pts/11   00:00:00   ps -fH
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.