ProgramingTip

vim에서 bash의 현재 줄 실행

bestdevel 2020. 12. 10. 20:58
반응형

vim에서 bash의 현재 줄 실행


이 질문은 Vim : 현재 파일을 실행 하시겠습니까? 와 유사 합니다. 하지만 현재 파일을 실행하는 대신 현재 행만 실행하고 싶습니다.

이것이 가능한가?

업데이트 : 이상적으로는 외피에 부작용이있을 수있는 솔루션을 찾고 있습니다. 예를 들어 다음 줄이 가정합니다.

alias foo=bar

정력 명령을 실행에서 한 후로 쉘을 시작 :sh하면 별칭 foo을 사용할 수 있지만 vim사용을 종료 :q하면 별칭을 더 이상 사용할 수 없습니다.


물론 현재 파일의 모든 내용을 다른 프로그램의 표준 입력에 '쓰기'할 수 있습니다.

:.w !bash

여기서 .(w 앞의 부분)은 작성중인 줄의 범위를 넓며 .현재 줄입니다. 그런 다음 !bash해당 줄을 bash에 작성하는 데 사용 합니다.


나는 항상 이런 종류의 일을한다 :

:exec '!'.getline('.')

.vimrc에서 매핑을 생성 할 수도 있습니다.

nmap <F6> :exec '!'.getline('.')

Daan의 답변도 효과가 있습니다.


커서를 해당 줄로 이동하고 일반 모드에서 다음을합니다.

!!bash<cr>

댓글을 달 수있는 권한이 있습니다.

Vim의 현재 버퍼를 외부 명령으로 리디렉션 / 파이프 라인과 관련하여 Daan Bakker의 훌륭한 답변에 영감을 받아 Python 펼쳐 실행에 관한 질문에 대한 답변 ( https://stackoverflow.com/a/40002312/3625404 )을 작성 했다. 현재 버퍼).

전체 버퍼 실행 외에도 외부 명령을 통해 라인 범위를 실행하는 방법에 대해 설명합니다. 시간을 절약하기 위해 아래에 복사합니다.

#####################

vim에서는 현재 버퍼의 모든 범위를 외부 명령 (bash, python 또는 python 펼쳐보기)으로 리디렉션 할 수 있습니다.

# redirect whole buffer to python
:%w !python

현재 버퍼에 나오는 같이 두 줄이 안전하게 가정합니다.

import numpy as np
print np.arange(12).reshape(3,4)

그런 다음 :%w !python저장 여부에 관계없이 실행됩니다. 터미널에 다음에 같이 인쇄합니다.

[[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]]

물론 일부 키맵과 같이 만들 수 있습니다.

nnoremap <F8> :.w !python<CR>
vnoremap <F8> :w !python<CR>

첫 번째는 인터프리터를 통해 현재 줄을 실행하고 두 번째는 선택을 실행합니다.

#!! be careful, in vim ':w!python' and ':.w !python' are very different, the
first write (create or overwrite) a file named 'python' with contents of
current buffer, the second redirect the selected cmdline range (here dot .,
which mean current line) to external command (here 'python').

cmdline 범위에 걸친

:h cmdline-ranges

cmdline 1이 아닌 일반 명령과 관련하여 아래가 아닙니다.

:h command-range

https://stackoverflow.com/a/19883963/3625404에서 영감을 얻었습니다.


이 매핑을 .vimrc 파일에 추가하십시오.

nmap <leader>E yyp:.!csh<CR>

설명 :

  1. yy Yank 현재 라인
  2. p 아래에 잡아 당긴 줄을 붙이십시오 (커서 가이 다음 행으로 이동).
  3. :.!csh<CR>csh새로 추가 할 넣은이 줄을 제자리에 실행 (사용 )합니다. 이 줄의 출력은 현재 줄을 대체하기 실행하기 전에 줄을 잡아 당기고 아래에 넣었습니다.

vi / vim 내의 텍스트 줄에 다음과 같은 명령이있는 경우 "

ls -la

줄의 아무 곳에 나 커서를 놓고 ":. !!" 리턴을 누르십시오.

즉, 콜론 닷 뱅뱅 리턴

그러면 vi / vim 내에서 현재 셸의 해당 줄에있는 텍스트가 실행되고 출력이 텍스트 파일에 삽입됩니다.

나는 그것이 당신이 요구 한 것이라고 생각하고 있습니까? 마법 같아요.


터미널에서 실행되는 다음 명령을 고려하십시오.

seq 0 10 | xargs printf "%02x "

예상 출력은 다음과 같습니다.

00 01 02 03 04 05 06 07 08 09 0a

위의 명령이 파일에 작성되어 있다고 가정하십시오. 이 명령을 실행하려면이 각각의 출력을 해당 파일에 다시 가져 오려면이 매핑을 .vimrc에 추가하면됩니다.

nmap <leader>E :exec 'r!'.getline('.')<CR>

위에서 언급 한 줄을 실행하려면 %다음과 같이 ' '에 대한 이스케이프 문자를 추가하여 작성해야 합니다.

seq 0 10 | xargs printf "\%02x "

파일에서이 줄로 이동하고를 누릅니다 <leader>E. 제 경우에는 <leader>에 매핑 ,되므로,E

참고 URL : https://stackoverflow.com/questions/19883917/execute-current-line-in-bash-from-vim

반응형