Vim-Autostart mit Vexplore und Terminal

Vim-Autostart mit Vexplore und Terminal

Ich möchte vim so einrichten, dass es sich größtenteils wie eine herkömmliche IDE verhält. Wenn ich den Befehl vim eingebe, öffnet sich das Programm folgendermaßen:

Vim-Fenster

Das Problem ist, dass es folgendermaßen geöffnet wird:

Vim-Demo

Ich möchte, dass das Terminal automatisch startet, aber im vorherigen Fenster. Ich habe versucht, die Dokumentation zu lesen, aber ich bin nicht gut genug informiert, wie man die Dokumentation liest und in Code umsetzt. Der Großteil des Codes in meinem vimrc ist kopiert und eingefügt und einige der Grundlagen kannte ich bereits. Ich möchte, dass es wie im ersten Bild automatisch startet.

Außerdem noch eine Frage, bei der ich mir nicht sicher bin, ob sie in vim möglich ist: Manchmal löscht der Puffer in NetRW den Verzeichnisbaum, wenn ich wegklicke, und dann erscheint ein leerer Puffer. Gibt es eine Möglichkeit, bestimmte Befehle zu deaktivieren, damit sie den Terminalpuffer und die Verzeichnisbaumliste nicht beeinträchtigen? Ein Beispiel: Wenn ich versuche, eine Datei zu öffnen, und der letzte Puffer der Terminalpuffer war, werde ich gefragt, ob ich den aktuellen Puffer (Terminal) speichern und die Datei öffnen möchte. Ich hätte es gerne intelligenter, wenn ich sie im Nicht-Terminalpuffer statt im Terminal öffnen würde. Im Grunde wird das Terminal komplett ignoriert, abgesehen von der Eingabe von Befehlen.

Hier ist meine vimrc, wahrscheinlich ein Durcheinander, da ich nichts anderes gemacht habe als kopieren und einfügen:

set mouse=a
set number
imap jj <Esc>
set autochdir
map <Tab> <C-W>W:cd %:p:h<CR>:<CR>
map <C-l> :q!<CR>
map <C-t> :term bash<CR>
" Specify a directory for plugins
" - For Neovim: ~/.local/share/nvim/plugged
" - Avoid using standard Vim directory names like 'plugin'
call plug#begin('~/.vim/plugged')

" Make sure you use single quotes

" Shorthand notation; fetches https://github.com/junegunn/vim-easy-align
Plug 'junegunn/vim-easy-align'

" Any valid git URL is allowed
Plug 'https://github.com/junegunn/vim-github-dashboard.git'

" Multiple Plug commands can be written in a single line using | separators
Plug 'SirVer/ultisnips' | Plug 'honza/vim-snippets'

" On-demand loading
Plug 'scrooloose/nerdtree', { 'on':  'NERDTreeToggle' }
Plug 'tpope/vim-fireplace', { 'for': 'clojure' }

" Using a non-master branch
Plug 'rdnetto/YCM-Generator', { 'branch': 'stable' }

" Using a tagged release; wildcard allowed (requires git 1.9.2 or above)
Plug 'fatih/vim-go', { 'tag': '*' }

" Plugin options
Plug 'nsf/gocode', { 'tag': 'v.20150303', 'rtp': 'vim' }

" Plugin outside ~/.vim/plugged with post-update hook
Plug 'junegunn/fzf', { 'dir': '~/.fzf', 'do': './install --all' }

" Unmanaged plugin (manually installed and updated)
Plug '~/my-prototype-plugin'

" Initialize plugin system
call plug#end()


function! NetrwOpenMultiTab(current_line,...) range
   " Get the number of lines.
   let n_lines =  a:lastline - a:firstline + 1

   " This is the command to be built up.
   let command = "normal "

   " Iterator.
   let i = 1

   " Virtually iterate over each line and build the command.
   while i < n_lines
      let command .= "tgT:" . ( a:firstline + i ) . "\<CR>:+tabmove\<CR>"
      let i += 1
   endwhile
   let command .= "tgT"

   " Restore the Explore tab position.
   if i != 1
      let command .= ":tabmove -" . ( n_lines - 1 ) . "\<CR>"
   endif

   " Restore the previous cursor line.
   let command .= ":" . a:current_line  . "\<CR>"

   " Check function arguments
   if a:0 > 0
      if a:1 > 0 && a:1 <= n_lines
         " The current tab is for the nth file.
         let command .= ( tabpagenr() + a:1 ) . "gt"
      else
         " The current tab is for the last selected file.
         let command .= (tabpagenr() + n_lines) . "gt"
      endif
   endif
   " The current tab is for the Explore tab by default.

   " Execute the custom command.
   execute command
endfunction

" Define mappings.
augroup NetrwOpenMultiTabGroup
   autocmd!
   autocmd Filetype netrw vnoremap <buffer> <silent> <expr> t ":call NetrwOpenMultiTab(" . line(".") . "," . "v:count)\<CR>"
   autocmd Filetype netrw vnoremap <buffer> <silent> <expr> T ":call NetrwOpenMultiTab(" . line(".") . "," . (( v:count == 0) ? '' : v:count) . ")\<CR>"
augroup END

" Toggle Vexplore with Ctrl-E
function! ToggleVExplorer()
  if exists("t:expl_buf_num")
      let expl_win_num = bufwinnr(t:expl_buf_num)
      if expl_win_num != -1
          let cur_win_nr = winnr()
          exec expl_win_num . 'wincmd w'
          close
          exec cur_win_nr . 'wincmd w'
          unlet t:expl_buf_num
      else
          unlet t:expl_buf_num
      endif
  else
      exec '1wincmd w'
      Vexplore
      let t:expl_buf_num = bufnr("%")
  endif
endfunction

" NeTRW Explorer Settings

let g:netrw_banner = 0
let g:netrw_liststyle = 3
let g:netrw_browse_split = 4
let g:netrw_altv = 1
let g:netrw_winsize = 15
augroup ProjectDrawer
  autocmd!
  autocmd VimEnter * :Vexplore
augroup END
map <silent> <C-n> :Vexplore<CR>

" Per default, netrw leaves unmodified buffers open. This autocommand
" deletes netrw's buffer once it's hidden (using ':q', for example)
autocmd FileType netrw setl bufhidden=delete
autocmd TabNew * call feedkeys(":Vexplore\<CR>", 'n')

" terminal split below
set splitbelow
autocmd VimEnter * :term bash

Antwort1

Verwenden Sie stattdessen diesen Autocmd:

autocmd VimEnter *
    \ Vexplore |
    \ execute "wincmd l" |
    \ rightbelow term bash

Dadurch wird die gesamte Sequenz einmal ausgeführt, wenn Sie Vim aufrufen. Ich verwende Zeilenfortsetzungen (Folgezeilen beginnen mit einem Backslash) und Balken, um mehrere Befehle auszuführen. Beachten Sie auch, dass autocmdEx-Befehle ausgeführt werden, sodass ein vorangehendes Befehle :nicht wirklich erforderlich ist.

Der erste Befehl öffnet wie erwartet das NERDTree-Fenster auf der linken Seite.

Zweitens wincmd lwird zum Fenster rechts verschoben (siehe :help :wincmd). Das ist der Schritt, der in Ihrem Versuch fehlt, was dazu führt, dass der nächste Schritt den NERDTree und nicht das Hauptfenster teilt. Der wincmdmuss innerhalb eines ausgeführt werden execute, da er sonst versucht, den |darauf folgenden zu interpretieren, was dann nicht mehr als Trennzeichen funktioniert.

Schließlich öffnet der letzte Befehl das Terminal, wobei ein explizites rightbelow(siehe :help :rightbelow) verwendet wird, um diesen Split unten zu öffnen. Das ist alles!

verwandte Informationen