Краткий ответ: ваш метод foo()
возвращается немедленно, а вызов $ajax()
выполняется асинхронно после возврата функции . Проблема заключается в том, как и где сохранить результаты, полученные при вызове async, после его возврата.
В этом потоке было задано несколько решений. Возможно, самый простой способ - передать объект методу foo()
и сохранить результаты в члене этого объекта после завершения асинхронного вызова.
function foo(result) {
$.ajax({
url: '...',
success: function(response) {
result.response = response; // Store the async result
}
});
}
var result = { response: null }; // Object to hold the async result
foo(result); // Returns before the async completes
Обратите внимание, что вызов foo()
] все равно не вернут ничего полезного. Однако результат асинхронного вызова теперь будет сохранен в result.response
.
Предупреждение: это нарушит ваше репо.
Это приведет к повреждению двоичных файлов, в том числе к
blockquote>svn
,.git
! Прочитайте комментарии перед использованием!
find . -type f -exec sed -i.orig 's/\t/ /g' {} +
Исходный файл сохраняется как
[filename].orig
.Недостатки:
- Будет заменять вкладки повсюду в файле.
- Пройдет много времени, если у вас есть дамп SQL на 5 ГБ в этом каталоге.
Используйте vim-way:
$ ex +'bufdo retab' -cxa **/*.*
globstar
(**
) для рекурсии, активируйте shopt -s globstar
. **/*.c
. Чтобы изменить tabstop, добавьте +'set ts=2'
.
Однако нижняя сторона состоит в том, что он может замените вкладки внутри строк .
Итак, для немного лучшего решения (с помощью подстановки) попробуйте:
$ ex -s +'bufdo %s/^\t\+/ /ge' -cxa **/*.*
Или с помощью редактора ex
+ expand
:
$ ex -s +'bufdo!%!expand -t2' -cxa **/*.*
Для конечных пробелов см.: Как удалить конечные пробелы для нескольких файлов?
Вы можете добавить следующие в .bash_profile
:
# Convert tabs to spaces.
# Usage: retab *.*
# See: https://stackoverflow.com/q/11094383/55075
retab() {
ex +'set ts=2' +'bufdo retab' -cxa $*
}
Загрузите и запустите следующий скрипт, чтобы рекурсивно преобразовать жесткие вкладки в мягкие вкладки в текстовые файлы.
Выполнить скрипт из папки, содержащей текстовые файлы.
#!/bin/bash
find . -type f -and -not -path './.git/*' -exec grep -Iq . {} \; -and -print | while read -r file; do {
echo "Converting... "$file"";
data=$(expand --initial -t 4 "$file");
rm "$file";
echo "$data" > "$file";
}; done;
Использовать обратную косую черту sed
.
В linux:
sed -i $'s/\t/-/g' *.txt
sed -i $'s/\t/ /g' *.txt
sed -i $'s/\t/ /g' *.txt
На mac:
sed -i '' $'s/\t/ /g' *.txt
Простая замена с помощью sed
в порядке, но не наилучшим возможным решением. Если между вкладками есть «лишние» пробелы, они все равно будут присутствовать после замены, поэтому поля будут оборваны. Вкладки, развернутые в середине строк, также будут работать неправильно. В bash
мы можем сказать вместо этого
find . -name '*.java' ! -type d -exec bash -c 'expand -t 4 "$0" > /tmp/e && mv /tmp/e "$0"' {} \;
применить expand
к каждому файлу Java в текущем дереве каталогов. Удалите / замените аргумент -name
, если вы настроите таргетинг на другие типы файлов. Как отмечается в одном из замечаний, будьте очень осторожны при удалении -name
или использовании слабого шаблона. Вы можете легко сбрасывать репозиторий и другие скрытые файлы без намерения. Вот почему исходный ответ включал это:
Вы всегда должны делать резервную копию дерева, прежде чем пытаться что-то вроде этого, если что-то пойдет не так.
blockquote>
Вы можете использовать find
с пакетом tabs-to-spaces
для этого.
Сначала установите tabs-to-spaces
npm install -g tabs-to-spaces
, затем запустите эта команда из корневого каталога вашего проекта;
find . -name '*' -exec t2s --spaces 2 {} \;
Это заменит каждый символ tab
на 2 spaces
в каждом файле.
Попробуйте инструмент командной строки expand
.
expand -i -t 4 input | sponge output
, где
-i
используется для расширения только ведущих вкладок на каждой строке -t 4
означает, что каждая вкладка будет преобразована в 4 символа пробелов (по умолчанию 8). sponge
moreutils
и позволяет избежать очистки входного файла . Наконец, вы можете использовать gexpand
в OSX, после установка coreutils
с Homebrew (brew install coreutils
).
Использование expand
, как предложено в других ответах, представляется наиболее логичным подходом только для этой задачи.
Тем не менее, это также можно сделать с Bash и Awk, если вы захотите сделать некоторые другие модификации вместе с ним.
Если вы используете Bash 4.0 или выше, shopt builtin globstar
может использоваться для рекурсивного поиска с помощью **
.
С GNU Awk версии 4.1 или выше могут быть сделаны sed как «inplace»:
shopt -s globstar
gawk -i inplace '{gsub("\t"," ")}1' **/*.ext
Если вы хотите установить количество пробелов на каждую вкладку:
gawk -i inplace -v n=4 'BEGIN{for(i=1;i<=n;i++) c=c" "}{gsub("\t",c)}1' **/*.ext
Мне нравится пример «найти» выше для рекурсивного приложения. Чтобы адаптировать его к нерекурсивному, только изменение файлов в текущем каталоге, которое соответствует шаблону, расширение оболочки оболочки может быть достаточным для небольших объемов файлов:
ls *.java | awk '{print "expand -t 4 ", $0, " > /tmp/e; mv /tmp/e ", $0}' | sh -v
Если вы хотите, чтобы он молчал после вы надеетесь, что он работает, просто отпустите -v
в команде sh
в конце.
Конечно, вы можете выбрать любой набор файлов в первой команде. Например, перечислите только определенный подкаталог (или каталоги) таким образом:
ls mod/*/*.php | awk '{print "expand -t 4 ", $0, " > /tmp/e; mv /tmp/e ", $0}' | sh
Или, в свою очередь, запустите find (1) с некоторой комбинацией параметров глубины и т. Д.:
find mod/ -name '*.php' -mindepth 1 -maxdepth 2 | awk '{print "expand -t 4 ", $0, " > /tmp/e; mv /tmp/e ", $0}' | sh
Преобразование вкладок в пространство только в файлах «.lua» [вкладки -> 2 пробела]
find . -iname "*.lua" -exec sed -i "s#\t# #g" '{}' \;
Как конвертировать вкладки в пробелы в каждом файле каталога (возможно, рекурсивно)?
blockquote>Обычно это не то, что вы хотите.
Вы хотите сделать это для png-изображений? PDF-файлы? Каталог .git? Ваш
Makefile
(для которого требуется вкладка )? Дамп SQL 5 ГБ?Теоретически вы могли бы передать множество опций исключения
find
или что-то еще, что вы используете; но это будет хрупким и будет разорваться, как только вы добавите другие двоичные файлы.То, что вы хотите, по крайней мере:
- Пропустить файлы по определенному размеру.
- Определите, является ли файл двоичным, проверяя наличие NULL-байта.
- Заменяйте вкладки только в start файла (
expand
этоsed
не делает.)Насколько я знаю, нет стандартной утилиты Unix, которая может это сделать, и это не очень легко сделать с оболочкой однострочный, поэтому необходим скрипт.
Некоторое время назад я создал небольшой скрипт под названием sanitize_files , который делает именно это. Он также фиксирует некоторые другие распространенные вещи, такие как замена
\r\n
на\n
, добавление трейлинга\n
и т. Д.Вы можете найти упрощенный скрипт без дополнительных функций и аргументы командной строки ниже, но я рекомендую вам использовать вышеупомянутый скрипт, поскольку он скорее получит исправления и другие обновления, чем этот пост.
Я также хотел бы отметить, в ответ на некоторые из другие ответы здесь, что использование shell globbing не является надежным способом сделать это, потому что рано или поздно вы получите больше файлов, чем будет вписываться в
ARG_MAX
(на современных Linux-системах это 128k, что может показаться много, но рано или поздно это не достаточно).
#!/usr/bin/env python # # http://code.arp242.net/sanitize_files # import os, re, sys def is_binary(data): return data.find(b'\000') >= 0 def should_ignore(path): keep = [ # VCS systems '.git/', '.hg/' '.svn/' 'CVS/', # These files have significant whitespace/tabs, and cannot be edited # safely # TODO: there are probably more of these files.. 'Makefile', 'BSDmakefile', 'GNUmakefile', 'Gemfile.lock' ] for k in keep: if '/%s' % k in path: return True return False def run(files): indent_find = b'\t' indent_replace = b' ' * indent_width for f in files: if should_ignore(f): print('Ignoring %s' % f) continue try: size = os.stat(f).st_size # Unresolvable symlink, just ignore those except FileNotFoundError as exc: print('%s is unresolvable, skipping (%s)' % (f, exc)) continue if size == 0: continue if size > 1024 ** 2: print("Skipping `%s' because it's over 1MiB" % f) continue try: data = open(f, 'rb').read() except (OSError, PermissionError) as exc: print("Error: Unable to read `%s': %s" % (f, exc)) continue if is_binary(data): print("Skipping `%s' because it looks binary" % f) continue data = data.split(b'\n') fixed_indent = False for i, line in enumerate(data): # Fix indentation repl_count = 0 while line.startswith(indent_find): fixed_indent = True repl_count += 1 line = line.replace(indent_find, b'', 1) if repl_count > 0: line = indent_replace * repl_count + line data = list(filter(lambda x: x is not None, data)) try: open(f, 'wb').write(b'\n'.join(data)) except (OSError, PermissionError) as exc: print("Error: Unable to write to `%s': %s" % (f, exc)) if __name__ == '__main__': allfiles = [] for root, dirs, files in os.walk(os.getcwd()): for f in files: p = '%s/%s' % (root, f) if do_add: allfiles.append(p) run(allfiles)
Чтобы преобразовать все файлы Java рекурсивно в каталог, чтобы использовать 4 пробела вместо закладки:
find . -type f -name *.java -exec bash -c 'expand -t 4 {} > /tmp/stuff;mv /tmp/stuff {}' \;
Я использовал astyle
для повторного ввода всего кода на C / C ++ после поиска смешанных вкладок и пробелов. У этого также есть варианты, чтобы заставить особый стиль фигурной скобки, если вы хотите.