Как уже упоминалось уже несколько людей, для Apple - лучшее место для запуска.
Одна полезная ссылка, о которой я еще не упоминал, - Практическое управление памятью . Вы найдете его в середине документов Apple, если прочитаете их, но это стоит прямой ссылки. Это блестящее резюме правил управления памятью с примерами и распространенными ошибками (в основном, какие другие ответы здесь пытаются объяснить, но не так).
ПРАКТИЧЕСКОЕ РУКОВОДСТВО: автоматически заполните Ctags при использовании Vim в Bash. Для кого-либо еще, кто использует Vim и Ctags, я записал небольшую функцию auto-completer для Bash. Добавьте следующее в свой ~/.bash_completion, файл (создайте его, если это не существует):
Спасибо переходит к stylishpants для его многих мер и улучшений.
_vim_ctags() {
local cur prev
COMPREPLY=()
cur="${COMP_WORDS[COMP_CWORD]}"
prev="${COMP_WORDS[COMP_CWORD-1]}"
case "${prev}" in
-t)
# Avoid the complaint message when no tags file exists
if [ ! -r ./tags ]
then
return
fi
# Escape slashes to avoid confusing awk
cur=${cur////\\/}
COMPREPLY=( $(compgen -W "`awk -vORS=" " "/^${cur}/ { print \\$1 }" tags`" ) )
;;
*)
_filedir_xspec
;;
esac
}
# Files matching this pattern are excluded
excludelist='*.@(o|O|so|SO|so.!(conf)|SO.!(CONF)|a|A|rpm|RPM|deb|DEB|gif|GIF|jp?(e)g|JP?(E)G|mp3|MP3|mp?(e)g|MP?(E)G|avi|AVI|asf|ASF|ogg|OGG|class|CLASS)'
complete -F _vim_ctags -f -X "${excludelist}" vi vim gvim rvim view rview rgvim rgview gview
После того как Вы перезапускаете свою сессию Bash (или создаете новую), можно ввести:
Код:
~$ vim -t MyC<tab key>
и это автоматически заполнит тег тем же путем, это делает для файлов и каталогов:
Код:
MyClass MyClassFactory
~$ vim -t MyC
Я нахожу это действительно полезным, когда я вскакиваю в быстрое исправление ошибки.
Заменить все
:%s/oldtext/newtext/igc
Дать, чтобы заменить все:)
Используйте правую кнопку мыши для переключения режима вставки в gVim со следующими настройками в ~ / .gvimrc:
"
"------------------------------------------------------------------
" toggle insert mode <--> 'normal mode with the <RightMouse>-key
"------------------------------------------------------------------
nnoremap <RightMouse> <Insert>
inoremap <RightMouse> <ESC>
"
I often want to highlight a particular word/function name, but don't want to search to the next instance of it yet:
map m* *#
Вот что-то не очевидное. Если у Вас есть много пользовательских плагинов / расширения в Вашем $HOME, и необходимо работать от su / sudo/... иногда, то это могло бы быть полезно.
В Вашем ~/.bashrc:
export VIMINIT=":so $HOME/.vimrc"
В Вашем ~/.vimrc:
if $HOME=='/root'
if $USER=='root'
if isdirectory('/home/your_typical_username')
let rtuser = 'your_typical_username'
elseif isdirectory('/home/your_other_username')
let rtuser = 'your_other_username'
endif
else
let rtuser = $USER
endif
let &runtimepath = substitute(&runtimepath, $HOME, '/home/'.rtuser, 'g')
endif
Это позволит Вашим локальным плагинам загружаться - безотносительно способа, которым Вы используете для изменения пользователя.
Вы также хотели бы вынимать *.swp файлы из своего текущего пути и в ~/vimtmp (это входит в .vimrc):
if ! isdirectory(expand('~/vimtmp'))
call mkdir(expand('~/vimtmp'))
endif
if isdirectory(expand('~/vimtmp'))
set directory=~/vimtmp
else
set directory=.,/var/tmp,/tmp
endif
Кроме того, некоторые отображения, которые я использую для создания редактирования легче - заставляют ctrl+s работать как Escape, и ctrl+h/l переключают вкладки:
inoremap <C-s> <ESC>
vnoremap <C-s> <ESC>
noremap <C-l> gt
noremap <C-h> gT
Я был уверен, что кто-то уже опубликовал бы это, но здесь идет.
Возьмите любую систему сборки, какую пожелаете; сделай, мвн, муравей, что угодно. В корне каталога проекта создайте файл команд, которые вы используете постоянно, например:
mvn install
mvn clean install
... и т. д.
Чтобы сделать сборку, наведите курсор на строку и введите !! sh. Т.е. отфильтруйте эту строку; запишите его в оболочку и замените его результатами.
Журнал сборки заменяет строку, готовую к прокрутке, поиску и т. Д.
Когда вы закончите просматривать журнал, введите u, чтобы отменить, и вы вернетесь к своему файлу команд.
Я использую Vim для всего. Когда я редактирую сообщение электронной почты, я широко использую:
gqap
(или gwap
)
, чтобы легко и правильно переформатировать по параграфам, даже с цитатой вводных символов. Для достижения этой функциональности я также добавляю:
-c 'set fo = tcrq' -c 'set tw = 76'
к команде для внешнего вызова редактора. Одним примечательным дополнением будет добавление « a » к параметру fo (formatoptions). Это автоматически переформатирует абзац при вводе и перемещении по содержимому, но может помешать или вызвать проблемы с ошибочным или нечетным форматированием, содержащимся в сообщении.
Чтобы сделать vim немного более похожим на редактор IDE:
Хотите IDE?
: make
запустит makefile в текущем каталоге, проанализируйте вывод компилятора, затем вы можете использовать : cn
и : cp
, чтобы пройти через ошибки компилятора, открывая каждый файл и ища нужный номер строки.
: syntax on
включает подсветку синтаксиса vim.
Ctrl-n в режиме вставки автоматически завершит вводимое вами слово на основе всех слов, находящихся в открытых буферах. Если совпадений несколько, он предоставит вам список возможных слов, которые вы можете циклически перебирать, используя ctrl-n и ctrl-p.
: setlocal autoread
Автоматически перезагружает текущий буфер ... особенно полезно при просмотре файлов журналов и почти выполняет функции "хвостовой" программы в unix из vim.
Проверка ошибок компиляции из vim. установите переменную makeprg в зависимости от языка, скажем, для perl
: setlocal makeprg = perl \ -c \%
Для PHP
установите makeprg = php \ -l \%
set errorformat =% m \ in \% f \ on \ line \% l
Выполнение команды ": make" запускает связанный makeprg и отображает ошибки / предупреждения компиляции в окне quickfix и может легко переходить к соответствующим номерам строк.
: sp%: h
- список каталогов / file-chooser, использующий каталог текущего файла
(относится как комментарий к совету rampion cd
, но У меня еще нет прав на комментирование)
========================================================== In normal mode ========================================================== gf ................ open file under cursor in same window --> see :h path Ctrl-w f .......... open file under cursor in new window Ctrl-w q .......... close current window Ctrl-w 6 .......... open alternate file --> see :h # gi ................ init insert mode in last insertion position '0 ................ place the cursor where it was when the file was last edited
Ни то, ни другое не является несгибаемым, но я считаю его чрезвычайно полезным.
Тривиальные привязки, но я просто не могу без них жить. Он включает перемещение в стиле hjkl в режиме вставки (с помощью клавиши ctrl). В обычном режиме: ctrl-k / j прокручивает половину экрана вверх / вниз, а ctrl-l / h переходит к следующему / предыдущему буферу. Отображения µ и ù специально предназначены для клавиатуры AZERTY и переходят к следующей / предыдущей ошибке make.
imap <c-j> <Down>
imap <c-k> <Up>
imap <c-h> <Left>
imap <c-l> <Right>
nmap <c-j> <c-d>
nmap <c-k> <c-u>
nmap <c-h> <c-left>
nmap <c-l> <c-right>
nmap ù :cp<RETURN>
nmap µ :cn<RETURN>
Небольшая функция, которую я написал для выделения функций, глобальных переменных, макросов, структур и определений типов. (Может быть медленным для очень больших файлов). Каждый тип выделяется по-разному (см. ": Help group-name", чтобы получить представление о текущих настройках вашей цветовой темы) Использование: сохраните файл с помощью ww (по умолчанию "\ ww"). Для этого вам нужны ctags.
nmap <Leader>ww :call SaveCtagsHighlight()<CR>
"Based on: http://stackoverflow.com/questions/736701/class-function-names-highlighting-in-vim
function SaveCtagsHighlight()
write
let extension = expand("%:e")
if extension!="c" && extension!="cpp" && extension!="h" && extension!="hpp"
return
endif
silent !ctags --fields=+KS *
redraw!
let list = taglist('.*')
for item in list
let kind = item.kind
if kind == 'member'
let kw = 'Identifier'
elseif kind == 'function'
let kw = 'Function'
elseif kind == 'macro'
let kw = 'Macro'
elseif kind == 'struct'
let kw = 'Structure'
elseif kind == 'typedef'
let kw = 'Typedef'
else
continue
endif
let name = item.name
if name != 'operator=' && name != 'operator ='
exec 'syntax keyword '.kw.' '.name
endif
endfor
echo expand("%")." written, tags updated"
endfunction
У меня есть привычка писать много кода и функций, и я не люблю писать для них прототипы. Итак, я создал некоторую функцию для создания списка прототипов в исходном файле в стиле C. Он бывает двух видов: один удаляет формальное имя параметра, а другой сохраняет его. Я просто обновляю весь список каждый раз, когда мне нужно обновить прототипы. Это позволяет избежать несинхронизации прототипов и определений функций. Также требуются ctags.
"Usage: in normal mode, where you want the prototypes to be pasted:
":call GenerateProptotypes()
function GeneratePrototypes()
execute "silent !ctags --fields=+KS ".expand("%")
redraw!
let list = taglist('.*')
let line = line(".")
for item in list
if item.kind == "function" && item.name != "main"
let name = item.name
let retType = item.cmd
let retType = substitute( retType, '^/\^\s*','','' )
let retType = substitute( retType, '\s*'.name.'.*', '', '' )
if has_key( item, 'signature' )
let sig = item.signature
let sig = substitute( sig, '\s*\w\+\s*,', ',', 'g')
let sig = substitute( sig, '\s*\w\+\(\s)\)', '\1', '' )
else
let sig = '()'
endif
let proto = retType . "\t" . name . sig . ';'
call append( line, proto )
let line = line + 1
endif
endfor
endfunction
function GeneratePrototypesFullSignature()
"execute "silent !ctags --fields=+KS ".expand("%")
let dir = expand("%:p:h");
execute "silent !ctags --fields=+KSi --extra=+q".dir."/* "
redraw!
let list = taglist('.*')
let line = line(".")
for item in list
if item.kind == "function" && item.name != "main"
let name = item.name
let retType = item.cmd
let retType = substitute( retType, '^/\^\s*','','' )
let retType = substitute( retType, '\s*'.name.'.*', '', '' )
if has_key( item, 'signature' )
let sig = item.signature
else
let sig = '(void)'
endif
let proto = retType . "\t" . name . sig . ';'
call append( line, proto )
let line = line + 1
endif
endfor
endfunction
Непосредственно перед копированием и вставкой в stackoverflow:
:retab 1
:% s/^I/ /g
:% s/^/ /
Теперь скопируйте и вставьте код.
В соответствии с просьбой в комментариях:
retab 1. Это устанавливает размер табуляции равным единице. Но он также просматривает код и добавляет дополнительные табуляции и пробелы, чтобы при форматировании не перемещался какой-либо фактический текст (т.е. текст после ratab выглядит так же).
% s / ^ I / / g: Обратите внимание на ^ I - результат нажатия на вкладку. Это ищет все вкладки и заменяет их одним пробелом. Так как мы только что сделали ретаб, это не должно привести к изменению форматирования, но поскольку вставка вкладок на веб-сайт происходит случайно, их хорошо удалить.
% s / ^ / /: Замените начало строки на четыре пробелы. Поскольку на самом деле вы не можете заменить начало строки чем-либо, он вставляет четыре пробела в начале строки (это необходимо для форматирования SO, чтобы выделить код).
Due to the latency and lack of colors (I love color schemes :) I don't like programming on remote machines in PuTTY. So I developed this trick to work around this problem. I use it on Windows.
You will need
Setting up remote machine
Configure rsync to make your working directory accessible. I use an SSH tunnel and only allow connections from the tunnel:
address = 127.0.0.1
hosts allow = 127.0.0.1
port = 40000
use chroot = false
[bledge_ce]
path = /home/xplasil/divine/bledge_ce
read only = false
Then start rsyncd: rsync --daemon --config=rsyncd.conf
Setting up local machine
Install rsync from Cygwin. Start Pageant and load your private key for the remote machine. If you're using SSH tunelling, start PuTTY to create the tunnel. Create a batch file push.bat in your working directory which will upload changed files to the remote machine using rsync:
rsync --blocking-io *.cc *.h SConstruct rsync://localhost:40001/bledge_ce
SConstruct is a build file for scons. Modify the list of files to suit your needs. Replace localhost with the name of remote machine if you don't use SSH tunelling.
Configuring Vim Теперь это легко. Мы будем использовать функцию быстрого исправления (: make и список ошибок), но компиляция будет выполняться на удаленной машине. Итак, нам нужно установить makeprg:
set makeprg=push\ &&\ plink\ -batch\ xplasil@anna.fi.muni.cz\ \"cd\ /home/xplasil/divine/bledge_ce\ &&\ scons\ -j\ 2\"
Это сначала запустит задачу push.bat для загрузки файлов, а затем выполнит команды на удаленном компьютере с использованием SSH ( Plink из набора PuTTY). Команда сначала меняет каталог на рабочий каталог, а затем запускает сборку (я использую scons).
Результаты сборки будут удобно отображаться в вашем локальном списке ошибок gVim.
При работе над проектом, где процесс сборки медленный, я всегда собираю в фоновом режиме и передаю вывод в файл под названием errors.err (что-то вроде сделайте отладку 2>&1 | tee errors.err
). Это позволяет мне продолжить редактирование или просмотр исходного кода во время сборки. Когда он будет готов (используя pynotify на GTK, чтобы сообщить мне, что он завершен), я могу посмотреть на результат в vim, используя quickfix. Начните с выдачи :cf[ile], который читает файл ошибки и переходит к первой ошибке. Лично мне нравится использовать cwindow для получения результата сборки в отдельном окне.
Не делайте этого. 8 символов пути слишком длинны для случайного сайта, а пользователи мерзнут. Любое требование, которое вы предъявляете к сложности пароля, лишит вас пользователей.
Если вы не являетесь банком, вам не следует навязывать какие-либо сложности паролей. Если пользователь хочет букву 'а' в качестве своего пароля, пусть идет на это. Когда он обнаруживает, что какая-то вредоносная сущность укорачивает urls в его имени (или что делает ваш сайт), он может справиться с этим и, возможно, извлечь хороший урок.
Важно помнить, что это не ваша проблема, и вы можете только разозлить людей, усилив сложность.
-121--3774738-Слишком прочный элемент отсутствует. Формат HTML «Sanitizing» является жестким . Любые углы, которые вы режете, чтобы обработать его более просто, скорее всего, приведет к эксплойтам прокрадывания. Даже сложный старый HTMLPurifier, с его лучшей репутацией, имел несколько способов прокрасть опасную разметку в прошлом!
Однако, если ваше решение для разметки текста способно выводить опасный HTML, то оно является дефицитным и должно быть заменено IMO. Если PHP уценка позволяет javascript:
URL через то это довольно прискорбный, основной недостаток, и я не думаю, что я бы поверил ему, чтобы получить что-то еще правильно.
Несколько полезных:
:set nu # displays lines
:44 # go to line 44
'. # go to last modification line
Мой любимый: Ctrl + n WORD COMPLETION!
gg=G
Исправляет отступы для всего файла. Мне не хватало моего надежного
в Eclipse, но я только что узнал, что vim отлично справляется с этим.
Вот некоторые из моих обязательных элементов:
cscope + ctags + vim, которые можно найти в Интернете.
Некоторые сокращения для быстрого запуска новых файлов кода, такие как:
ab cpph #include <iostream><CR>#include <string><CR>#include <cstdlib><CR>#include <cassert><CR>#include <vector><CR>#include <
stdexcept><CR>using namespace std;<CR>int main(int argc, char *argv[]) {
ab perlh #!/usr/bin/perl<CR>use strict;<CR>use warnings;<CR>
ab chdr #include <stdio.h><CR>#include <sys/types.h><CR>#include <unistd.h><CR>#include <stdlib.h><CR>#include <sys/stat.h><CR>
#include <sys/wait.h><CR>#include <string.h><CR>int main(int argc, char *argv[]) {
ab xhtmlhdr <?xml version="1.0" encoding="UTF-8"?><CR><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.o
rg/TR/xhtml1/DTD/xhtml1-strict.dtd"><CR><html xmlns="http://www.w3.org/1999/xhtml"><CR> <head><CR> <title></title><CR><link h
ref="style.css" rel="STYLESHEET" type="text/css"><CR></head>
Например, cpph вставит базовый каркас файла main.cc
. Также есть мое отображение функциональных клавиш:
map <F1> <Esc>:w<CR>:perl $e = `./error.pl`; my ($f,$l,@w) = split(":",$e); my $w=join(":",@w); $curwin->Cursor($l,0); VIM::Msg($w);<CR>
map <F2> :wincmd w<CR>
map <F3> :wincmd s<CR>
map <F4> :wincmd v<CR>
map <F5> :wincmd o<CR>
map <F6> :sball<CR>
map <F7> :wq<CR>
map <F8> :wincmd q<CR>
map <F9> :wincmd -<CR>
map <F10> :wincmd +<CR>
map <F11> :wincmd <<CR>
map <F12> :wincmd ><CR>
В этом случае мой F1 сопоставлен, чтобы навести курсор на следующую ошибку, которая должна быть исправлен для миграции исходного кода.
map _ ebi"^[ea"^[
Эта карта заставит _ заключить в кавычки строку
Сопоставления для выполнения движений на текущей строке экрана в режиме переноса. Некоторое время назад я обнаружил это в комментарии к совету Vim, и он оказался весьма удобным.
function! ScreenMovement(movement)
if &wrap
return "g" . a:movement
else
return a:movement
endif
endfunction
onoremap <silent> <expr> j ScreenMovement("j")
onoremap <silent> <expr> k ScreenMovement("k")
onoremap <silent> <expr> 0 ScreenMovement("0")
onoremap <silent> <expr> ^ ScreenMovement("^")
onoremap <silent> <expr> $ ScreenMovement("$")
nnoremap <silent> <expr> j ScreenMovement("j")
nnoremap <silent> <expr> k ScreenMovement("k")
nnoremap <silent> <expr> 0 ScreenMovement("0")
nnoremap <silent> <expr> ^ ScreenMovement("^")
nnoremap <silent> <expr> $ ScreenMovement("$")
для этого потока
Для префикса набора строк я использую один из двух разных подходов:
Один из подходов - это выбор блока (упомянутый sth). В общем, вы можете выбрать прямоугольную область с помощью ctrl-V с последующим перемещением курсора. Как только вы выделили прямоугольник, нажатие Shift-I вставит символы в левую часть прямоугольника или shift-A добавит их в правую сторону прямоугольника. Таким образом, вы можете использовать этот метод для создания прямоугольника, включающего крайний левый столбец строк, которые вы хотите префикс, нажмите shift-I, введите префикс, а затем нажмите escape.
Другой подход - использовать подстановку. (как упомянул Брайан Агнью). Подстановка Брайана повлияет на весь файл (% в команде означает «все строки»). Чтобы повлиять только на несколько строк, самый простой способ - нажать shift-V (который включает режим визуальной строки) в первой / последней строке, а затем перейти к последней / первой строке. Затем введите:
: s / ^ / ВАШ ПРЕФИКС /
^ - это регулярное выражение (в данном случае начало строки). Набрав это в режиме визуальной линии, вы увидите, что перед s автоматически вставляется '<,'>. Это означает, что диапазон подстановки будет визуальным выбором.
Дополнительный совет: если ваш префикс содержит косые черты, вы можете либо экранировать их с помощью обратной косой черты, либо использовать другой символ пунктуации в качестве разделителя в команде. Например, чтобы добавить комментарии к строкам C ++, я обычно пишу:
: s: ^: //:
Для добавления суффикса метод замены обычно проще, если все ваши строки не имеют точно одинаковой длины. Просто используйте $ для шаблона вместо ^, и ваша строка будет добавлена вместо префикса.
Если вы хотите добавить префикс и суффикс одновременно, вы можете сделать что-то вроде этого:
: s /. * / PREFIX & SUFFIX /
. * Соответствует всей строке. Символ & в замене возвращает совпадающий текст (всю строку), но теперь к нему будут добавлены ваш префикс и суффикс.
Кстати: при комментировании кода вы, вероятно, захотите раскомментировать его позже. Вы можете использовать visual-block (ctrl-V), чтобы выбрать косые черты, а затем нажать d, чтобы удалить их, или вы можете использовать подстановку (возможно, с визуальным выбором строки, сделанным с помощью shift-V), чтобы удалить ведущие косые черты, как это :
: s: // ::
s /.*/ ПРЕФИКС И СУФФИКС /. * соответствует всей строке. Символ & в замене возвращает совпадающий текст (всю строку), но теперь к нему будут добавлены ваш префикс и суффикс.
Кстати: при комментировании кода вы, вероятно, захотите раскомментировать его позже. Вы можете использовать visual-block (ctrl-V), чтобы выбрать косые черты, а затем нажать d, чтобы удалить их, или вы можете использовать подстановку (возможно, с визуальным выбором строки, сделанным с помощью shift-V), чтобы удалить ведущие косые черты, как это :
: s: // ::
s /.*/ ПРЕФИКС И СУФФИКС /. * соответствует всей строке. & В замене возвращает совпадающий текст (всю строку), но теперь к нему будут добавлены ваш префикс и суффикс.
Кстати: при комментировании кода вы, вероятно, захотите раскомментировать его позже. Вы можете использовать visual-block (ctrl-V), чтобы выбрать косые черты, а затем нажать d, чтобы удалить их, или вы можете использовать подстановку (возможно, с визуальным выбором строки, сделанным с помощью shift-V), чтобы удалить ведущие косые черты, как это :
: s: // ::
Моя использует макросы вместо поиска - иногда более эффективно комбинировать макрос с визуальным режимом.
Попробуйте использовать perltidy
для форматирования с помощью =
команды нормального режима
:set equalprg=perltidy
Я собирал их годами.
" Pasting in normal mode should append to the right of cursor
nmap <C-V> a<C-V><ESC>
" Saving
imap <C-S> <C-o>:up<CR>
nmap <C-S> :up<CR>
" Insert mode control delete
imap <C-Backspace> <C-W>
imap <C-Delete> <C-O>dw
nmap <Leader>o o<ESC>k
nmap <Leader>O O<ESC>j
" tired of my typo
nmap :W :w
Создайте функцию для выполнения текущего буфера, используя его shebang (если он установлен), и вызовите ее с помощью crtl-x.
map <C-X> :call CallInterpreter()<CR>
au BufEnter *
\ if match (getline(1) , '^\#!') == 0 |
\ execute("let b:interpreter = getline(1)[2:]") |
\ endif
fun! CallInterpreter()
if exists("b:interpreter")
exec("! ".b:interpreter." %")
endif
endfun