Изменение практики выхода и открытия редактора vi (vim)? - PullRequest
2 голосов
/ 15 января 2012

Одним из основных отличий между vi (vim) и emacs является то, что emacs спроектирован и должен запускаться время от времени без выхода, при этом, учитывая быстрое время загрузки vim, проще выйти и начать редактирование задач.,Я читал, что это стало культурной разницей между этими двумя пользователями редактора.

Я склонен думать, что постоянная работа редактора помогает повысить производительность, поскольку вы знаете, что что-то происходит, и вам не нужно начинать заново.Каковы лучшие приемы и плагины, которые вы нашли для запуска одного сеанса vim и выполнения всех ваших задач оттуда?

Например, я редактирую программы Python, затем завершаю работу, чтобы запустить appengine appcfg и вернуться назад.Иногда выход из текущего файла, чтобы открыть другой файл.Я еще не привык к понятию буферов и вкладок, а скорее запускаю vim в своих сеансах экрана, если я хочу редактировать несколько файлов.

Ответы [ 7 ]

7 голосов
/ 15 января 2012

То есть вы запускаете один файл Vim за сеанс экрана?Это звучит довольно плохой человек.Вам не нужны специальные плагины, чтобы легко использовать несколько файлов в Vim.Просто сделайте

:e /home/project/myfile.py

Я установил autochdir в моем .vimrc, который автоматически меняет текущий рабочий каталог на любой активный буфер.Поэтому, как только вы откроете этот файл, вы можете просто сделать

:e myfile2.py
:e myfile3.py

и т. Д.Кстати, открытие любых файлов в Vim может быть завершено с помощью вкладки, поэтому убедитесь, что вы делаете это.Как только у вас откроется куча буферов для переключения между ними, я просто делаю

:b myfile1.py

, который вы также можете использовать для завершения табуляции, просто наберите :b 1 и нажмите Tab, и он поймет, что вы хотите myfile1.py открыть, так что это очень быстро, если вы можете запомнить общее имя файла, и если есть более одного подобного совпадения, он даст вам список, который вы можете просмотреть.Для этого я бы также посоветовал взглянуть на настройки wildmode и wildmenu, чтобы увидеть, что вы предпочитаете, они дадут вам расширенные меню дополнения вкладок.Если в какой-то момент вы заблудитесь из-за того, какие буферы открыты и на что вы хотите посмотреть, вы можете просто сделать

:ls

, и он покажет вам все открыто.

Также запомните васможет запускать внешние команды, например, перед командой !

:!ls

.Надеюсь, что это поможет или, по крайней мере, заставит вас смотреть в правильном направлении.

5 голосов
/ 15 января 2012

Все, что говорили другие, плюс три:

  • С помощью set hidden вы можете открыть новый буфер вместо текущего, даже если он не сохранен. Вы можете открыть десятки таких буферов, не нужно закрывать Vim! См. :help windows или Vim вики .

  • Предположим, что Vim скомпилирован с правильным флагом (+clientserver), вы можете иметь один Vim, работающий в качестве "сервера" (в окне терминала A) и открывать все ваши файлы в этом единственном Vim (из терминала) окно B). Это делается в два этапа:

    1. $ vim --servername WHATEVER для запуска Vim
    2. $ vim --remote file.js чтобы открыть файл

    Ваш файл открывается в Vim в окне терминала A, и у вас все еще есть приглашение в окне терминала B.

  • Не трогайте вкладки. Они ужасно неправильно названы и совсем не работают как вкладки.

3 голосов
/ 15 января 2012

Вы можете даже перейти к оболочке, используя: sh, а затем вернуться к Vim, используя exit в оболочке. Для редактирования нескольких файлов в одном и том же Vim вы можете использовать: vsplit filename или: split filename (для вертикального и горизонтального разделения), а затем используйте клавиши со стрелками Esc + Ctrl + w + для перемещения между различными разделениями. Таким образом, вам не нужны вкладки. Особенно хорошо работает, если вы работаете с небольшими кусочками кода.

1 голос
/ 17 января 2012

Если я запускаю vim из консоли (что я делаю в Linux, потому что я использую исключительно ssh), то я часто использую CTRL-z для приостановки vim. Затем сделайте мою оболочку и fg , чтобы вернуться в vim.

Использование ctags в vim невероятно полезно - help tags для получения дополнительной информации.

Я использую довольно мощный плагин Perforce: http://www.vim.org/scripts/script.php?script_id=240. Поддержка diff поразительна, потому что вы можете циклически просматривать все открытые файлы или просматривать историю файлов и diff между двумя более старыми версиями. Попробуйте : PVDiff , : PFilelog и : POpened .

Я определяю множество макросов для таких вещей, как поиск и манипулирование буферными окнами. У меня есть несколько интересных макросов / функций, перечисленных здесь, которые помогают мне жить в vim.


Буфер обмена:

let mapleader=","
" put from clipboard
nmap ,p "*p
" yank to clipboard
nmap ,y "*y

Теги:

" jump to tag in other window
map t :call TagJumpOtherWindow()<cr>
function! TagJumpOtherWindow()
  let cw = expand("<cword>")
  winc p
  exec "tjump " . cw
  let @/ = cw
  normal z.
  winc p
endfunction

Царапины:

let mapleader=","
nmap ,x0 :e e:/work/scratch0.txt<CR>
nmap ,x1 :e e:/work/scratch1.txt<CR>
nmap ,x2 :e e:/work/scratch2.txt<CR>
nmap ,x3 :e e:/work/scratch3.txt<CR>
nmap ,x4 :e e:/work/scratch4.txt<CR>
nmap ,x5 :e e:/work/scratch5.txt<CR>
nmap ,x6 :e e:/work/scratch6.txt<CR>
nmap ,x7 :e e:/work/scratch7.txt<CR>
nmap ,x8 :e e:/work/scratch8.txt<CR>
nmap ,x9 :e e:/work/scratch9.txt<CR>

IDE:

function! GetMsdevFile(line)
  let mx = '^\s*\([a-zA-Z_/\.0-9:\- ]*\)'
  let line = matchstr( a:line, mx )
  let file = substitute( line, mx, '\1', '' )
  let file = substitute( line, '\\', '/', '' )
  return file
endfunction

function! GetMsdevLineNumber(line)
  let mx = '^\s*\([a-zA-Z_/\.0-9:\- ]*\)(\(\d\+\))'
  let line = matchstr( a:line, mx )
  let linenumber = substitute( line, mx, '\2', '' )
  return linenumber
endfunction

function! GetMsdevFile2(line)
  let file = expand("%:p:h") . "/" . GetMsdevFile(a:line)
  let file
  return file
endfunction

function! GetMsdevFile2(line)
  let file = expand("%:p:h") . "/../" . GetMsdevFile(a:line)
  let file
  return file
endfunction

function! GotoMsdevMake( thiswin, version )
  exec "cd ".$DIRECTORY."\\.."
  let l = getline(".")
  if a:version==0
      let file = GetMsdevFile(l)
      let linenumber = GetMsdevLineNumber(l)
  elseif a:version==1
      let file = GetMsdevFile2(l)
      let linenumber = GetMsdevLineNumber(l)
  else
      let file = GetMsdevFile3(l)
      let linenumber = GetMsdevLineNumber(l)
  endif
  if a:thiswin==1
    winc p
  endif
  exec "e +" . linenumber. " " . file
  exec "cd -"
endfunction

function! GetGCCFile(line)
  let mx = '^\([a-zA-Z_/\.0-9:\- ]*\):[0-9]\+: .*'
  let line = matchstr( a:line, mx )
  let file = substitute( line, mx, '\1', '' )
  let file = substitute( file, '\\', '/', '' )
  return file
endfunction

function! GetGCCLineNumber(line)
  let mx = '^\([a-zA-Z_/\.0-9:\- ]*\):\([0-9]\+\):.*'
  let line = matchstr( a:line, mx )
  let linenumber = substitute( line, mx, '\2', '' )
  return linenumber
endfunction


function! GotoGCCMake()
  exec "cd ".$DIRECTORY."\\.."
  let l = getline(".")
  let file = GetGCCFile(l)
  let linenumber = GetGCCLineNumber(l)
  winc p
  exec "e +" . linenumber. " " . file
  exec "cd -"
endfunction

function! MakeOut( filename )
  exec ":e " . a:filename
  call MakeBuffer()
  normal zz

endfunction

" use the current buffer into a Visual Studio build output buffer to jump to errors
function! MakeBuffer()
  normal! gg
  exec "/).*error\\|failed"
  nnoremap <buffer> <cr> :call GotoMsdevMake(1, 0)<cr>
  nnoremap <buffer>  :call GotoMsdevMake(1, 1)<cr>
  nnoremap <buffer> o :call GotoMsdevMake(1, 1)<cr>
  " nnoremap <buffer>  :call GotoMsdevMake(0, 0)<cr>
endfunction

" use the current buffer into a GCC build output buffer to jump to errors
function! MakeGCCErr()
  normal! gg
  exec "/: error:"
  nnoremap <buffer> <cr> :call GotoGCCMake()<cr>
  nnoremap <buffer>  :call GotoGCCMake()<cr>
  nnoremap <buffer> o :call GotoGCCMake()<cr>
endfunction

function! MakeGCCOut( filename )
  exec ":e " . a:filename
  call MakeGCCErr()
endfunction

nmap ,mr :call MakeOut( "e:/perforce/branch/obj/release/BuildLog.htm" )<cr>
nmap ,md :call MakeOut( "e:/perforce/branch/obj/debug/BuildLog.htm" )<cr>
nmap ,mm :call MakeBuffer()<CR>
nmap ,mq :call MakeGCCErr()<cr>
1 голос
/ 15 января 2012

Вот хороший видеоурок, который помогает понять, как и зачем использовать один сеанс Vim для управления всеми вашими изменениями:

http://www.derekwyatt.org/vim/vim-tutorial-videos/vim-intermediate-tutorial-videos/#onevim

1 голос
/ 15 января 2012

Просто используйте команду :! для запуска вещи в оболочке. Отлично сочетается с :cd и % расширением

bash> vim path/to/ex.c
...
:cd %:h. " move to path/ex/
:!gcc -o %:r % && %:r " compile ex.c into ex and run it

Вы также можете смешать его с :read, если хотите поместить вывод команды в текущий буфер:

:read !ls " read in the names of all the files in the current directory
0 голосов
/ 29 марта 2013

Я держу одно окно Vim открытым несколько дней подряд.разделенные окна действительно хорошо работают на больших экранах.Мне также нравятся вкладки;Я группирую свои сплиты для одного проекта на вкладке, но оставляю другие вкладки для своего дневного плана, моей vim wiki, заметок для заметок, когда меня прерывают.Я считаю, что вкладки проще в использовании, чем несколько окон.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...