Это долго, и мне еще есть что добавить и улучшить. Оставьте записку, если я совершил ошибку или если вы обнаружите что-нибудь, что вам действительно помогло.
Начальная настройка
Я не собираюсь предполагать наличие большого опыта работы с vim. Я предполагаю, что вы работаете на Mac, как любой умный язычник. Сначала установите Homebrew.
Установите неовим. vim унаследовал. Да здравствует неовим.
brew update brew tap homebrew/versions brew install homebrew/versions/llvm36 brew tap neovim/homebrew-neovim brew install —-HEAD neovim pip install neovim
Установите vim-plug, простой менеджер подключаемых модулей для vim, не имеющий шаблонного кода и выполняющий асинхронные установки и обновления:
curl -fLo ~/.nvim/autoload/plug.vim --create-dirs \ https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim
neovim хранит все свои настройки в .nvimrc, который написан в скрипте vim. Его можно найти по адресу ~ / .nvimrc. Добавьте к нему это, чтобы вы могли начать свой список плагинов для установки:
call plug#begin() " We will put plugins here later call plug#end()
В этой статье вы будете настраивать neovim. Было бы полезно сослаться на my .nvimrc, который является полным и рабочим. Это будет полезно для поиска синтаксиса или множества полезных вещей, о которых я здесь не говорю.
Автозавершение кода + встроенные ошибки и предупреждения
Это во-первых, потому что это, возможно, самое важное. Objective-C не написан для краткости или легкого запоминания. Он предназначен для удобного чтения. Вы хотите YouCompleteMe.
Plug 'Valloric/YouCompleteMe' "code completion
Добавьте к вам ~ / .nvimrc, чтобы получить завершение семантического кода, аналогичное Xcode:
let g:ycm_semantic_triggers = { \ 'objc' : ['re!\@"\.*"\s', \ 're!\@\w+\.*\w*\s', \ 're!\@\(\w+\.*\w*\)\s', \ 're!\@\(\s*', \ 're!\@\[.*\]\s', \ 're!\@\[\s*', \ 're!\@\{.*\}\s', \ 're!\@\{\s*', \ "re!\@\’.*\’\s", \ '#ifdef ', \ 're!:\s*', \ 're!=\s*', \ 're!,\s*', ], \ }
Теперь вам нужно заполнить флаги компилятора clang, чтобы YouCompleteMe мог выполнять семантическое завершение кода, а также встроенные предупреждения и ошибки. Это не так сложно, как может показаться. По сути, просто скопируйте этот файл в корень вашего проекта. Затем создайте свой проект с помощью xcodebuild. Посмотрите на флаги, которые он использует для создания одного из ваших исходных файлов, и перенесите эти флаги в правильном формате в массив flags [] в этом файле .ycm_extra_conf.py. Вы можете увидеть пример команды xcodebuild ниже в этой статье.
Примечание: Эта ошибка в настоящее время является самым большим препятствием для полного завершения кода, подобного Xcode, в neovim с использованием YouCompleteMe. Я надеюсь отправить запрос на перенос, чтобы решить эту проблему, но пока вы можете использовать clang_complete вместо YouCompleteMe. clang_complete имеет меньше функций, чем YouCompleteMe, и это не будущее завершения кода, но так сложилось, что его текущая интеграция с UltiSnips делает его автозаполнение кода Objective-C более похожим на Xcode, чем YouCompleteMe прямо сейчас.
Строить
Установить vim-dispatch
Plug 'tpope/vim-dispatch' " Asynchronous build
Перезагрузите ~ / .nvimrc (или просто выйдите и перезапустите nvim), а затем запустите `: PlugInstall`. Надеюсь, вы тоже используете tmux. Почему? Потому что tmux потрясающий и избавляет от многих глупостей использования простой оболочки внутри графического интерфейса терминала:
Так что вперед и попробуйте:
brew install tmux
Затем в командной строке запустите tmux:
tmux attach || tmux new
Теперь, когда у вас есть vim-dispatch, вы можете заставить его запускать вашу команду xcodebuild в фоновой панели tmux, пока вы продолжаете код. Итак, вы cd в корневой каталог вашего проекта, открываете `nvim`, а затем устанавливаете переменную makeprg в вашу команду xcodebuild:
:set makeprg=xcodebuild\ -workspace\ LearningApp.xcworkspace\ -scheme\ Memories-iOS\ -configuration\ Debug
Если у вас есть .xcodeproj, а не .xcworkspace, используйте -project, а не -workspace. Если вы хотите указать симулятор, используйте -sdk iphonesimulator или укажите устройство с помощью -sdk iphoneos.
Чтобы сделать это автоматическим, у меня есть этот набор в моем .nvimrc:
if ( getcwd() == '/local/dev/memories_app') :set makeprg=xcodebuild\ -workspace\ LearningApp.xcworkspace\ -scheme\ Memories-iOS\ -configuration\ Debug endif
Итак, если я запустил nvim из корневого каталога моего проекта memory_app, он установит для меня переменную makeprg.
Теперь, когда эта переменная установлена, просто запустите `: Make`, и vim-dispatch сделает свое волшебство.
Перейти к декларации / определению
Это идет с YouCompleteMe. Чтобы перейти к определению метода, наведите курсор на: YcmCompleter GoToDefinition. Для перехода к объявлению: YcmCompleter GoToDeclaration. Это довольно просто. Работает очень хорошо. Я сопоставил их, чтобы ускорить:
nnoremap <leader>d :YcmCompleter GoToDefinition <cr> nnoremap <leader>s :YcmCompleter GoToDeclaration <cr>
Теперь я могу нажать ‹space› d, чтобы перейти к определению текущей функции, или, s, чтобы перейти к ее объявлению. Ваш ‹leader› ключ установлен в вашем ~ / .nvimrc.
.m / .h Переключение
Plug 'eraserhd/vim-ios' ".h <-> .m switching and project build
После установки этого плагина вы можете использовать: A для переключения между текущим открытым файлом .h или .m. Обратите внимание, что это работает, только если файлы .h и .m имеют одно и то же имя (например, MyClass.h соответствует MyClass.m). Хотя это так в 99% случаев, в Objective-C допустимо называть ваши .h и .m по-разному.
Панель быстрого поиска (Shift + Cmd + O)
Сначала установите ag, средство быстрого поиска текста в файлах, такое как grep или ack:
brew install ag
Добавьте этот плагин в свой .nvimrc:
Plug 'kien/ctrlp.vim' " quick search bar " Make ctrlp a lot faster in git repositories let g:ctrlp_user_command = ‘ag %s -i — nocolor — nogroup — hidden \ -g ""' let g:ctrlp_use_caching = 0 “ ag is so fast that caching isn’t necessary let g:ctrlp_max_files = 10000 let g:ctrlp_working_path_mode = 'r' " Always use the current working directory rather than the location of the current file let g:ctrlp_by_filename = 1 " Default to filename only search rather than searching the whole path. This is more like Xcode's Shift+Cmd+O
Теперь, когда вы хотите работать над проектом, перейдите в корневой каталог проекта. Запустите vim и просто нажмите ‹c-p›, чтобы открыть панель быстрого поиска. Введите компоненты пути и / или имя файла, чтобы найти файл, который вы хотите начать редактировать, и нажмите клавишу ВВОД, чтобы перейти к нему.
Если в быстром поиске ctrlp отображаются какие-либо файлы, которые для вас не важны, создайте ~ / .agignore и добавьте его к нему вместе с любыми шаблонами, которые вы хотите игнорировать в своих проектах:
.git* extern *.test
Текстовый поиск в рамках проекта
Вы установили ag ранее. Теперь вы будете использовать его для поиска по всему проекту. В вашем ~ / .nvimrc:
Plug 'rking/ag.vim' " ag support for searching file " Outside your plugin definitions: :command! -nargs=+ S :Ag! "<args>" :command! -nargs=+ Sm :Ag! --matlab --ignore=*Test* --ignore=_* "<args>" :command! -nargs=+ St :Ag! --matlab --ignore=*Test* --ignore=_* --ignore=*Tool* "<args>"
Теперь вы можете набрать `: S myString` для рекурсивного поиска« myString »в каждом файле в вашем текущем каталоге и во всех его подкаталогах. Эта вторая команда позволяет вам выполнять `: Sm myString` для поиска только внутри файлов .m, игнорируя любые файлы модульного тестирования и сгенерированные классы.
Наконец, для удобства вы можете добавить эти ключевые команды, чтобы легко переходить к следующему и предыдущему результатам в списке результатов поиска ag:
nnoremap <leader>j :cn<CR> nnoremap <leader>k :cp<CR>
С их помощью вы можете нажать Control-j, чтобы перейти к следующему результату, и Control-k, чтобы перейти к предыдущему результату.
Вы также можете добавить сочетание клавиш, чтобы легко скрывать и отображать списки быстрого исправления и местоположения:
" In your plugins Plug 'Valloric/ListToggle' " Toggle the display of the location and quickfix windows " Later in your .nvimrc: let g:lt_location_list_toggle_map = '<leader>l' let g:lt_quickfix_list_toggle_map = '<leader>q'
Фрагменты кода
Одна из самых больших проблем с размещением фрагментов кода в Xcode заключалась в том, что я понятия не имел, где они находятся в файловой системе, они не были синхронизированы с другими моими компьютерами, где я также использую Xcode, и я всегда чувствовал, что есть хороший шанс, что они исчезнет, если мне придется удалить и переустановить Xcode или если мне придется сбросить Xcode, очистив всю информацию о моем пользователе. В самом деле, мне никогда не удавалось долго хранить фрагмент Xcode.
Plug 'SirVer/ultisnips' "code snippets " UltiSnips " The below key bindings are compatible with YouCompletMe integration let g:UltiSnipsExpandTrigger="<c-j>" let g:UltiSnipsJumpForwardTrigger="<c-j>" let g:UltiSnipsJumpBackwardTrigger="<c-k>"
Теперь, когда вы редактируете файл, вы будете получать дополнения кода от YouCompleteMe, которые включают фрагменты кода UltiSnips в конце списка:
Выберите нужный вариант, нажмите ‹c-j›, и вы получите:
Обратите внимание: если вы только что установили neovim и настраиваете его впервые, ваши цвета с самого начала не будут выглядеть так красиво. В своих мыслях о выборе подходящего терминала для Mac я упоминаю, как настроить эти цветовые схемы.
Чтобы создать сниппет, откройте любой файл и выполните: UltiSnipsEdit. Откроется соответствующий файл ‹filetype› .snippets, который вы сможете отредактировать. В качестве примера в Objective-C вы можете добавить сниппет dispatch_once, добавив его в этот файл:
snippet dispatch_once static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ $1 }); endsnippet
Я сохраняю эти фрагменты синхронизированными между машинами, имея эту папку Ultisnips в моем Dropbox, а затем у меня есть символическая ссылка на нее, где Ultisnips ее ищет:
ln -s ~/Dropbox/config/Ultisnips ~/.nvim/Ultisnips
Завершение кронштейна
Когда вы пишете if (совершенно очевидно, что вы хотите, чтобы скобка заполнялась автоматически :), так же, как это делается в Xcode. Добавьте для этого этот плагин:
Plug 'Raimondi/delimitMate' " Automatically insert closing brackets
В Xcode также есть классная функция, в которой он пытается ретроспективно соединить скобки. Например, я начинаю с этого:
[NSFileManager defaultManager]<cursor here>
а потом продолжаю набирать:
[NSFileManager defaultManager] removeFileAtPath:MYPATH];
И Xcode достаточно хорош, чтобы поставить [в начале строки. Это не всегда работает в Xcode, но в vim у меня есть решение, которое может быть не таким автоматическим, но оно всегда работает:
Plug 'tpope/vim-surround' " Add, remove, and change surrounding characters in pairs
Теперь, когда вы находитесь в ситуации, описанной выше, вы можете нажать yssr, чтобы автоматически заключить эту строку в []. Узнайте больше о том, что стало возможным с vim-Surround с помощью `: h Surround`.
Выделить переменную под курсором
С помощью этого плагина вы можете выделить все случаи использования переменной, находящейся в данный момент под курсором, точно так же, как Xcode:
Plug 'qstrahl/vim-matchmaker' " Highlight the term under the cursor
Затем в нижней части ~ / .nvimrc:
" Underline words matched by Matchmaker function! ToggleMatchmaker() " Don’t show matches in non-code files if &ft =~ ‘objc\|objcpp\|python\|cpp’ Matchmaker else " Specifically, I want it disabled on help, mkd Matchmaker! endif endfun autocmd BufEnter * call ToggleMatchmaker() highlight Matchmaker guibg=NONE highlight Matchmaker gui=underline highlight Matchmaker ctermbg=NONE highlight Matchmaker cterm=underline
Теперь вы можете видеть, что переменная под курсором подчеркнута:
Автоматический отступ
С вашей установкой llvm36 на Hombrew, описанной выше, пришел форматировщик кода clang `clang-format`. Установите плагин vim, который будет использовать его для автоматического форматирования кода по мере его написания:
Plug 'Chiel92/vim-autoformat' " Auto-format code using existing formatters
Теперь, чтобы автоматически отформатировать текущий открытый файл, введите: Autoformat. Я настроил его на автоматическое форматирование при каждом сохранении файла:
" Autoformat 4 seconds after the user’s cursor stops moving in normal mode autocmd FileType objc,objcpp autocmd InsertLeave <buffer> :silent Autoformat
Автосохранение
Вам не нужно постоянно: w сохранять буфер. Итак, в вашем ~ / .nvimrc:
autocmd BufUnload,BufLeave,FocusLost,QuitPre,InsertLeave,TextChanged,CursorHold * silent! wall
Автоматическое сохранение / загрузка сеанса
У вас должна быть возможность выйти и войти в NeoVim и начать с того места, где вы остановились. Для этого в вашем ~ / .nvimrc:
Plug 'xolox/vim-session' " Save and restore vim state :PlugInstall
Теперь, когда он установлен, настройте его на автоматическое сохранение в текущий каталог и автоматическую загрузку:
" vim-session {{{ let g:session_directory = getcwd() " The session directory is always the current directory. This should allow save and restory on a per project basis let g:session_default_name = ".vim-session" let g:session_autoload = 'yes' let g:session_autosave = 'yes' let g:session_lock_enabled = 0 """ }}}
Что у вас есть сейчас
На данный момент я никогда не открываю Xcode для написания кода или сборки. Так получилось, что я не использую его для отладки, потому что Xcode не поддерживает ситуации, когда мне нужна отладка, поэтому я все равно использую командную строку. Это 95% того, что собирается делать программист. Единственный раз, когда я открываю Xcode, - это редактирование некоторого мусора Xcode, который предназначен только для графического интерфейса пользователя, например раскадровки, моделей Core Data и списков. Их просто проще редактировать в формате графического интерфейса пользователя. Когда Xcode достаточно здоров, чтобы открыть мою раскадровку и отредактировать ее, не обижая меня, тогда жизнь станет прекрасной.
СДЕЛАТЬ
Было бы действительно здорово, если бы кто-нибудь написал плагин neovim, который использует xcodeproj для автоматизации всех специфичных для проекта настроек для сборки, установки, запуска, тестирования, очистки, отладки и анализа.
Подсветка синтаксиса
Приведенный выше файл cocoa.vim, который вы установили, должен предоставить vim достаточно информации, чтобы правильно выделить различные аспекты кода: классы, типы, операторы и т. Д. Цвета, выбранные для каждой сущности, определяются вашей цветовой схемой.
TODO: выделение синтаксиса пользовательских символов.
TODO: Создайте красивую цветовую схему.
TODO: Возможно, лучше, чем cocoa.vim, который не выполняет автогенерацию, - это просто использовать easytags.
Анализировать
СДЕЛАТЬ
Запустить модульные тесты
TODO: См. Здесь.
Беги в симуляторе
ЗАДАЧА: используйте simctl.
Запуск на устройстве
TODO: Используйте ios-deploy.
Отладка
Рассмотрите возможность использования vim-lldb.
ЗАДАЧА: Для симулятора:
% lldb (lldb) process attach -n 'Name Of Your App' --waitfor <launch your app in the simulator> (lldb) continue
Консольное ведение журнала
TODO: Одно из решений см. Здесь.
Список оценок метода и прагмы
Установите плагин cocoa.vim:
Plug 'jgoulah/cocoa.vim' " method list, documentation
Теперь вы можете запустить: ListMethods, чтобы получить список всех прагматических меток и методов в текущем файле. Нажмите Enter в строке, чтобы перейти к этому методу:
TODO: Прямо сейчас я считаю, что cocoa.vim чрезвычайно неэффективен с точки зрения производительности, вероятно, из-за попыток подсветки синтаксиса.
Правильнее будет использовать `brew install ctags` с vim-easytags . На данный момент у него просто нет конфигурации для Objective-C, поэтому мне просто нужно выполнить это, и он должен работать очень хорошо.
Просмотр документации
Просмотр документации также обеспечивается плагином cocoa.vim. Нажмите K, чтобы открыть документацию по символу под курсором.
ТОДО: исправить плагин. Сейчас это работает некорректно.
Почему неовим?
Это здесь в виде сноски, потому что я думаю, что это наименее важно. На данный момент мне это кажется совершенно очевидным. Я использую neovim ~ 14 часов программирования каждый день (да, часто и по выходным) вот уже 6 месяцев. Я могу вспомнить, что за весь тот период времени он разбился ВСЕГО дважды. Это целых два раза. В обоих случаях я отправил отчет об ошибке против neovim, и был мгновенный ответ. В отличие от vim, neovim станет практически невозможным сбой даже с установленными мошенническими плагинами. О, что это было? Стон уродливого старого Xcode вон там, в углу? * тьфу *
Конечно, вам придется научиться, если вы новичок в vim. Ну и что. Ты стар и глупеешь. Измените это, изучая новые вещи, которые просто лучше. Нет абсолютно никаких сомнений в том, что я намного счастливее и продуктивнее в neovim, и я ежедневно использую его как первоклассную IDE для C ++, Python и Objective-C.
Почему не emacs? Я уверен, что emacs может делать все то же самое. Попробуйте, если он держит вашу лодку на плаву. Решение neovim сводилось к двум вещам: 1) модальные привязки клавиш neovim нравятся мне по сравнению с привязками клавиш emacs. 2) Сообщество и авторы проекта офигенно звездные. Они делают все правильно, и это превращается в звездную базу кода со звездными функциями.
Почему не vim? * ОБЪЕДИНЯЕТ ВОДУ ПО ВСЕЙ СТЕНЕ vim - это отвратительная куча дерьма, которую поддерживает гремлин. У него даже нет асинхронной модели плагина…. ?????!?!?!? ›!›!? !! ›! ››! N! IU! $ IUG (T Это 2015 год, черт возьми программа. neovim - это повсюду долбаная программа.