我在一家PHP商店工作,我们都使用不同的编辑器,我们都必须在Windows上工作。我使用vim,但是店里的每个人都在抱怨,每当我编辑一个文件时,在底部有一个换行符。我四处搜索,发现这是vi & vim的记录行为…但我想知道是否有办法禁用这个功能。(这将是最好的,如果我可以禁用特定的文件扩展名)。
如果有人知道这事,那就太好了!
我在一家PHP商店工作,我们都使用不同的编辑器,我们都必须在Windows上工作。我使用vim,但是店里的每个人都在抱怨,每当我编辑一个文件时,在底部有一个换行符。我四处搜索,发现这是vi & vim的记录行为…但我想知道是否有办法禁用这个功能。(这将是最好的,如果我可以禁用特定的文件扩展名)。
如果有人知道这事,那就太好了!
当前回答
如果使用Git进行源代码控制,还有另一种方法。受到这里答案的启发,我编写了自己的筛选器,用于gitattributes文件。
要安装这个过滤器,将其保存为noeol_filter在你的$PATH的某处,使其可执行,并运行以下命令:
git config --global filter.noeol.clean noeol_filter
git config --global filter.noeol.smudge cat
要开始仅为自己使用过滤器,在$GIT_DIR/info/attributes中放入以下一行:
*.php filter=noeol
这将确保无论Vim做什么,都不会在.php文件的eof处提交任何换行符。
现在,脚本本身:
#!/usr/bin/python
# a filter that strips newline from last line of its stdin
# if the last line is empty, leave it as-is, to make the operation idempotent
# inspired by: https://stackoverflow.com/questions/1654021/how-can-i-delete-a-newline-if-it-is-the-last-character-in-a-file/1663283#1663283
import sys
if __name__ == '__main__':
try:
pline = sys.stdin.next()
except StopIteration:
# no input, nothing to do
sys.exit(0)
# spit out all but the last line
for line in sys.stdin:
sys.stdout.write(pline)
pline = line
# strip newline from last line before spitting it out
if len(pline) > 2 and pline.endswith("\r\n"):
sys.stdout.write(pline[:-2])
elif len(pline) > 1 and pline.endswith("\n"):
sys.stdout.write(pline[:-1])
else:
sys.stdout.write(pline)
其他回答
您是否可以使用一个特殊的命令来保存这些文件?
如果您执行:set binary,:w和:set nobinary,则如果文件开始时没有换行符,则写入文件时将不带换行符。
当然,这个命令序列可以放入用户定义的命令或映射中。
好吧,你在Windows上让事情变得复杂了;)
由于'binary'选项将重置'fileformat'选项(使用'binary'设置写入总是使用unix行结束符写入),让我们拿出大锤子并从外部完成它!
为BufWritePost事件定义一个自动命令(:help autocommand)怎么样?每次写入整个缓冲区后都会执行此自动命令。在这个自动命令中调用一个小的外部工具(php, perl或任何脚本),剥离刚刚写入的文件的最后换行符。
它看起来就像这样,会进入你的。vimrc文件:
autocmd! "Remove all autocmds (for current group), see below"
autocmd BufWritePost *.php !your-script <afile>
如果这是您第一次使用自动命令,请务必阅读关于自动命令的完整vim文档。有一些注意事项,例如,建议删除你的.vimrc中的所有autocmd,以防你的.vimrc可能被多次引用。
我发现这个vimscript插件对这种情况很有帮助。
Plugin 'vim-scripts/PreserveNoEOL'
或者在github上阅读更多
如果使用Git进行源代码控制,还有另一种方法。受到这里答案的启发,我编写了自己的筛选器,用于gitattributes文件。
要安装这个过滤器,将其保存为noeol_filter在你的$PATH的某处,使其可执行,并运行以下命令:
git config --global filter.noeol.clean noeol_filter
git config --global filter.noeol.smudge cat
要开始仅为自己使用过滤器,在$GIT_DIR/info/attributes中放入以下一行:
*.php filter=noeol
这将确保无论Vim做什么,都不会在.php文件的eof处提交任何换行符。
现在,脚本本身:
#!/usr/bin/python
# a filter that strips newline from last line of its stdin
# if the last line is empty, leave it as-is, to make the operation idempotent
# inspired by: https://stackoverflow.com/questions/1654021/how-can-i-delete-a-newline-if-it-is-the-last-character-in-a-file/1663283#1663283
import sys
if __name__ == '__main__':
try:
pline = sys.stdin.next()
except StopIteration:
# no input, nothing to do
sys.exit(0)
# spit out all but the last line
for line in sys.stdin:
sys.stdout.write(pline)
pline = line
# strip newline from last line before spitting it out
if len(pline) > 2 and pline.endswith("\r\n"):
sys.stdout.write(pline[:-2])
elif len(pline) > 1 and pline.endswith("\n"):
sys.stdout.write(pline[:-1])
else:
sys.stdout.write(pline)
在你的.vimrc中添加以下命令来打开行结束选项:
autocmd FileType php setlocal noeol binary fileformat=dos
但是,PHP本身将忽略最后一行结束符——这应该不是问题。我几乎可以肯定,在你的情况下,有其他东西添加了最后一个换行符,或者可能是与windows/unix的行结束类型(\n或\r\n等)混淆。
更新:
另一个解决方案可能是在你的.vimrc中添加这一行:
set fileformats+=dos