Используя метод в ответе, предоставленном Steve Moyer, я смог произвести следующее решение. Это - довольно неэлегантный взлом, я боюсь, и я чувствую, что должно быть более опрятное решение, но это работает и намного быстрее, чем простой подсчет всех слов в буфере каждый раз, когда строка состояния обновляется. Я должен отметить также, что это решение независимо от платформы и не предполагает, что система имеет 'туалет' или что-то подобное.
Мое решение периодически не обновляет буфер, но ответ, предоставленный Mikael Jansson, был бы в состоянии обеспечить эту функциональность. Я, на данный момент, не нашел экземпляр, где мое решение становится из синхронизации. Однако я только протестировал это кратко, поскольку точный живой подсчет слов не важен для моих потребностей. Шаблон, который я использую для соответствующих слов, также прост и предназначается для простых текстовых документов. Если у кого-либо есть лучшая идея для шаблона или каких-либо других предложений, не стесняйтесь отправлять ответ или редактировать это сообщение.
Мое решение:
"returns the count of how many words are in the entire file excluding the current line
"updates the buffer variable Global_Word_Count to reflect this
fu! OtherLineWordCount()
let data = []
"get lines above and below current line unless current line is first or last
if line(".") > 1
let data = getline(1, line(".")-1)
endif
if line(".") < line("$")
let data = data + getline(line(".")+1, "$")
endif
let count_words = 0
let pattern = "\\<\\(\\w\\|-\\|'\\)\\+\\>"
for str in data
let count_words = count_words + NumPatternsInString(str, pattern)
endfor
let b:Global_Word_Count = count_words
return count_words
endf
"returns the word count for the current line
"updates the buffer variable Current_Line_Number
"updates the buffer variable Current_Line_Word_Count
fu! CurrentLineWordCount()
if b:Current_Line_Number != line(".") "if the line number has changed then add old count
let b:Global_Word_Count = b:Global_Word_Count + b:Current_Line_Word_Count
endif
"calculate number of words on current line
let line = getline(".")
let pattern = "\\<\\(\\w\\|-\\|'\\)\\+\\>"
let count_words = NumPatternsInString(line, pattern)
let b:Current_Line_Word_Count = count_words "update buffer variable with current line count
if b:Current_Line_Number != line(".") "if the line number has changed then subtract current line count
let b:Global_Word_Count = b:Global_Word_Count - b:Current_Line_Word_Count
endif
let b:Current_Line_Number = line(".") "update buffer variable with current line number
return count_words
endf
"returns the word count for the entire file using variables defined in other procedures
"this is the function that is called repeatedly and controls the other word
"count functions.
fu! WordCount()
if exists("b:Global_Word_Count") == 0
let b:Global_Word_Count = 0
let b:Current_Line_Word_Count = 0
let b:Current_Line_Number = line(".")
call OtherLineWordCount()
endif
call CurrentLineWordCount()
return b:Global_Word_Count + b:Current_Line_Word_Count
endf
"returns the number of patterns found in a string
fu! NumPatternsInString(str, pat)
let i = 0
let num = -1
while i != -1
let num = num + 1
let i = matchend(a:str, a:pat, i)
endwhile
return num
endf
Это тогда добавляется к строке состояния:
:set statusline=wc:%{WordCount()}
я надеюсь, что это помогает любому ищущему живой подсчет слов в Vim. Хотя тот, который не всегда точен. Кроме того, конечно, g ctrl-g предоставит Вам подсчет слов Vim!
Memcached приходит на ум, как действительно легкое и эффективное решение.
Но вы также можете кэшировать содержимое в простых файлах. Файловая система обычно быстрая и без проблем обрабатывает блокировки чтения/записи. И нет необходимости в какой-нибудь причудливой библиотеке для работы с этим... функции filemtime, file_put_contents и file_get_contents - это все, что вам нужно.
Edit: Я добавлю ссылку на запись, которую я сделал несколько месяцев назад : Лучшее решение для кэширования. Это не совсем по теме, но может помочь вам в ваших исследованиях :)
.Кэширование на основе сеанса, вероятно, не лучшая идея. Это подходит только в ограниченных случаях, когда вам нужно кэшировать определенный результат для каждого пользователя (не для всех).
APC довольно широко развернут, поэтому, если у вас есть к нему доступ, я бы посмотрел на Zend_Cache с APC на внутренней стороне. Если APC недоступен, Zend_Cache с плоскими файлами на сервере будет достаточно для сайтов малого / среднего типа
Вы можете посмотреть кеширование в CakePHP . Я сомневаюсь, что вы сможете отделить его от работы с фреймами, но это должно помочь вам понять, как кэшировать динамический контент.
Большинство php-библиотек кэширования реализовано с помощью функций управления выходным буфером . Аналогично можно реализовать и собственное очень простое кэширование.
<?php
function callback($buffer)
{
// Code to store output in cache
}
if (/* Test cached copy is still valid */) {
/* Output cached copy to browser */
exit(0);
}
ob_start("callback");
?>
<html>...</html>
<?php
ob_end_flush();
?>
При желании можно опустить ob_end_flush()
, т.к. она сработает автоматически в конце вывода.
Интересно отметить, что эта структура может быть обернута вокруг единиц меньшего размера, чем страница. Например, вы упоминаете кэширование только навигационного меню. Для кэширования блока нужно немного больше логики, но принцип тот же
.