Кажется, что вызывающая сторона не говорит Вам диапазоны, которые это хочет.
, Таким образом, Вы свободны к измененному конечные точки, пока Вы не получаете его приятно делимый Вашим количеством маркировки.
Позволяют нам определить "хороший". Я назвал бы хорошим, если маркировки выключены:
1. 2^n, for some integer n. eg. ..., .25, .5, 1, 2, 4, 8, 16, ...
2. 10^n, for some integer n. eg. ..., .01, .1, 1, 10, 100
3. n/5 == 0, for some positive integer n, eg, 5, 10, 15, 20, 25, ...
4. n/2 == 0, for some positive integer n, eg, 2, 4, 6, 8, 10, 12, 14, ...
Находят макс. и минута Вашего ряда данных. Давайте назовем эти точки:
min_point and max_point.
Теперь все, что необходимо сделать, является находкой, 3 значения:
- start_label, where start_label < min_point and start_label is an integer
- end_label, where end_label > max_point and end_label is an integer
- label_offset, where label_offset is "nice"
, которые соответствуют уравнению:
(end_label - start_label)/label_offset == label_count
существует, вероятно, много решений, поэтому просто выбирают то. Большую часть времени я держал пари, что можно установить
start_label to 0
, поэтому просто пробуют различное целое число
end_label
, пока смещение не "хорошо"
Создание параметра stab
в самом Vim не поможет будет проще, но я создал эту команду / функцию, которую вы можете добавить в свой .vimrc
(или в файл плагина, если вы суперорганизованы). Используйте : Stab
, и вам будет предложено указать уровень отступа и указать, следует ли использовать expandtab
. Если вы нажмете Enter, не задав новый уровень отступа, он просто напечатает текущие настройки.
" put all this in your .vimrc or a plugin file command! -nargs=* Stab call Stab() function! Stab() let l:tabstop = 1 * input('set shiftwidth=') if l:tabstop > 0 " do we want expandtab as well? let l:expandtab = confirm('set expandtab?', "&Yes\n&No\n&Cancel") if l:expandtab == 3 " abort? return endif let &l:sts = l:tabstop let &l:ts = l:tabstop let &l:sw = l:tabstop if l:expandtab == 1 setlocal expandtab else setlocal noexpandtab endif endif " show the selected options try echohl ModeMsg echon 'set tabstop=' echohl Question echon &l:ts echohl ModeMsg echon ' shiftwidth=' echohl Question echon &l:sw echohl ModeMsg echon ' sts=' echohl Question echon &l:sts . ' ' . (&l:et ? ' ' : 'no') echohl ModeMsg echon 'expandtab' finally echohl None endtry endfunction
Ваше понимание softtabstop
и expandtab
неверно - поэтому вариант stab
, который вы предлагаете, будет не очень полезен.
expandtab
предназначен для случаев, когда вы хотите использовать пробелы вместо табуляции для всего . Если вы установите expandtab
, то Vim игнорирует параметр softtabstop
и использует tabstop
и shiftwidth
, чтобы определить, сколько пробелов нужно вставить.
softtabstop
используется только тогда, когда вы хотите использовать сочетание табуляции и пробелов, позволяя делать отступ с точным контролем (2 или 4 пробела), сохраняя при этом ширину табуляции на более высоком уровне значение (обычно 8), чтобы текст отображался в других приложениях. Установка softtabstop = tabstop
ничего не дает, потому что Vim всегда будет использовать табуляцию для отступов.
Обновление: Как указано в kaizer.se , если вы используете expandtab
, тогда вам все равно нужно установить softtabstop
, если вы хотите, чтобы Vim возвращал несколько пробелов назад, как если бы они были табуляцией.
softtabstop = tabstop
ничего не дает, потому что Vim всегда будет использовать табуляцию для отступов.
Обновление: Как указано в kaizer.se , если вы используете expandtab
, тогда вам все равно нужно установить softtabstop
, если вы хотите, чтобы Vim возвращал несколько пробелов назад, как если бы они были табуляцией.
softtabstop = tabstop
ничего не дает, потому что Vim всегда будет использовать табуляции для отступа.
Обновление: Как указано в kaizer.se , если вы используете expandtab
, тогда вам все равно нужно установить softtabstop
, если вы хотите, чтобы Vim возвращал несколько пробелов назад, как если бы они были табуляцией.
Если установлено expandtab
, то (как указывает слишком много php), softtabstop
становится избыточным. Единственная причина, по которой вы можете установить shiftwidth
иначе, чем tabstop
, - это удовлетворить странную привычку; например, вы используете отступы с четырьмя пробелами, но предпочитаете tab для вставки восьми пробелов.
Если expandtab
не задано, все становится нечетким. Если вы хотите, чтобы ваш код в cat
и не-vim редакторах выглядел так же, как в vim, то для tabstop
всегда нужно устанавливать значение 8; в этом случае вы должны установить softtabstop
и shiftwidth
на свой предпочтительный уровень отступа. Если вы предпочитаете, чтобы каждая "физическая вкладка"
Это моя первая попытка написать VimScript, но вот что:
function! Stab(value)
let &shiftwidth = a:value
let &softtabstop = a:value
let &tabstop = a:value
endfunc
Если я помещу это в свой файл .vimrc, я могу вызвать его, запустив : call Stab (X )
, где X - желаемая ширина табуляции. На данный момент это подходящее решение, но если кто-нибудь может предложить способ облегчить вызов, я был бы признателен.
Я также создал функцию, которая быстро суммирует текущие настройки, которые я сопоставил с ctrl- Tab:
nmap <C-Tab> :call TabParams()<CR>
function! TabParams()
echo "tabstop: ".&tabstop
echo "shiftwidth: ".&shiftwidth
echo "softtabstop: ".&softtabstop
endfunc
Ну, я назначил награду в 100 баллов за этот ответ, и теперь я сам решил половину. Не уверен, что могу принять свой ответ ...
Вы так часто меняете настройки пустого пространства, что вам действительно нужна функция для управления этим? Если вы много возитесь с tabstop, а также устанавливаете expandtab, у вас, вероятно, со временем будет беспорядок, когда вы будете менять файлы с разными значениями, переданными в stab
. Сегодня я использую : call stab (4)
, завтра это : call stab (2)
, а на прошлой неделе это было : call stab (8)
. Похоже, даже если вы напишете его, вы скоро перестанете его использовать.
Если вы планируете всегда передавать одно и то же значение для stab, почему бы просто не отредактировать ваши глобальные настройки? В vim:
:e $MYVIMRC
и добавьте следующее:
set tabstop=4
set shiftwidth=4 "tabs are 4 spaces wide (default = 8)
set expandtab "Convert tabs to spaces
Вот как настраивается мой .vimrc.
Вы также можете в режиме редактирования использовать Ctrl-T для отступа и Ctrl-D для перехода на следующий уровень отступа, установленный ] shiftwidth
, независимо от настроек tabstop
, softtabstop
или expandtab
. Vim автоматически добавит / удалит пробелы или табуляторы, чтобы перейти в правый столбец.
Если вы используете эти команды для управления отступом вместо Tab / Backspace , у вас нет беспокоиться о том, чтобы все эти настройки вкладок совпадали друг с другом, и всегда добиваться правильного уровня отступа.